improved sql parser.

This commit is contained in:
wenshao
2017-06-10 21:16:44 +08:00
parent f1532e9555
commit d66a4e2097
33 changed files with 419 additions and 253 deletions
@@ -50,13 +50,14 @@ public class MySqlSelectTest_40 extends MysqlTest {
{
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("/*0abcde*/SELECT MAX(id)\n" +
Assert.assertEquals("/*0abcde*/\n" +
"SELECT MAX(id)\n" +
"FROM base_request_log", //
output);
}
{
String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("/*0abcde*/select max(id)\n" +
Assert.assertEquals("/*0abcde*/\nselect max(id)\n" +
"from base_request_log", //
output);
}
@@ -50,13 +50,14 @@ public class MySqlSelectTest_41 extends MysqlTest {
{
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("/*0abcde*/SELECT MAX(id)\n" +
Assert.assertEquals("/*0abcde*/\nSELECT MAX(id)\n" +
"FROM base_request_log", //
output);
}
{
String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("/*0abcde*/select max(id)\n" +
Assert.assertEquals("/*0abcde*/\n" +
"select max(id)\n" +
"from base_request_log", //
output);
}
@@ -9,9 +9,8 @@ import junit.framework.TestCase;
public class OdpsFormatCommentTest28 extends TestCase {
public void test_drop_function() throws Exception {
String sql = "SELECT pageid, adid FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;";
Assert.assertEquals("SELECT pageid"
+ "\n\t, adid"
+ "\nFROM pageAds"
+ "\n\tLATERAL VIEW EXPLODE(adid_list) adTable AS adid;", SQLUtils.formatOdps(sql));
Assert.assertEquals("SELECT pageid, adid\n" +
"FROM pageAds\n" +
"\tLATERAL VIEW EXPLODE(adid_list) adTable AS adid;", SQLUtils.formatOdps(sql));
}
}
@@ -18,22 +18,18 @@ public class OdpsFormatCommentTest4 extends TestCase {
+ "\nselect f0, f1, f2" //
+ "\nwhere name rlike 'kk';"
;//
Assert.assertEquals("FROM (" //
+ "\n\tSELECT *"//
+ "\n\tFROM xxx"//
+ "\n) a" //
+ "\n-- comment_0"//
+ "\nINSERT OVERWRITE TABLE b PARTITION (ds='20150711')"//
+ "\nSELECT f0"//
+ "\n\t, f1"//
+ "\n\t, f2"//
+ "\nWHERE name RLIKE 'xxxx'" //
+ "\n-- comment_1"//
+ "\nINSERT OVERWRITE TABLE c PARTITION (ds='20150711')"//
+ "\nSELECT f0"//
+ "\n\t, f1"//
+ "\n\t, f2"//
+ "\nWHERE name RLIKE 'kk';", SQLUtils.formatOdps(sql));
Assert.assertEquals("FROM (\n" +
"\tSELECT *\n" +
"\tFROM xxx\n" +
") a\n" +
"-- comment_0\n" +
"INSERT OVERWRITE TABLE b PARTITION (ds='20150711')\n" +
"SELECT f0, f1, f2\n" +
"WHERE name RLIKE 'xxxx'\n" +
"-- comment_1\n" +
"INSERT OVERWRITE TABLE c PARTITION (ds='20150711')\n" +
"SELECT f0, f1, f2\n" +
"WHERE name RLIKE 'kk';", SQLUtils.formatOdps(sql));
}
}
@@ -10,8 +10,7 @@ public class OdpsInsertTest3 extends TestCase {
public void test_for_insert_select_limit() throws Exception {
String sql = "insert overwrite table ff partition (c='c',d='d') select /*+mapjoin(tt)*/ id,name from tt";
assertEquals("INSERT OVERWRITE TABLE ff PARTITION (c='c', d='d')\n" +
"SELECT /*+mapjoin(tt)*/ id\n" +
"\t, name\n" +
"SELECT /*+mapjoin(tt)*/ id, name\n" +
"FROM tt", SQLUtils.formatOdps(sql));
}
}
@@ -13,12 +13,8 @@ public class OdpsMultiInsertTest2 extends TestCase {
"select shop_name, customer_id, total_price;\n";
Assert.assertEquals("FROM sale_detail\n" +
"INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2010', region='china')\n" +
"SELECT shop_name\n" +
"\t, customer_id\n" +
"\t, total_price\n" +
"SELECT shop_name, customer_id, total_price\n" +
"INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2011', region='china')\n" +
"SELECT shop_name\n" +
"\t, customer_id\n" +
"\t, total_price;", SQLUtils.formatOdps(sql));
"SELECT shop_name, customer_id, total_price;", SQLUtils.formatOdps(sql));
}
}
@@ -33,16 +33,14 @@ public class OdpsSelectTest10 extends TestCase {
String sql = "select /* + mapjoin(a) */ "
+ " a.name, b.fals"
+ " from abc a join abc1 b on a.name = b.fals;";//
Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.name"
+ "\n\t, b.fals"
+ "\nFROM abc a"
+ "\nJOIN abc1 b"
+ "\nON a.name = b.fals;", SQLUtils.formatOdps(sql));
Assert.assertEquals("select /*+ mapjoin(a) */ a.name"
+ "\n\t, b.fals"
+ "\nfrom abc a"
+ "\njoin abc1 b"
+ "\non a.name = b.fals;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
assertEquals("SELECT /*+ mapjoin(a) */ a.name, b.fals\n" +
"FROM abc a\n" +
"JOIN abc1 b\n" +
"ON a.name = b.fals;", SQLUtils.formatOdps(sql));
assertEquals("select /*+ mapjoin(a) */ a.name, b.fals\n" +
"from abc a\n" +
"join abc1 b\n" +
"on a.name = b.fals;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
SQLStatement stmt = statementList.get(0);
@@ -31,12 +31,10 @@ public class OdpsSelectTest12 extends TestCase {
public void test_select() throws Exception {
String sql = "select name, sp from abc lateral view explode(split(concat(',','1','2','3'),',')) t as sp;";//
Assert.assertEquals("SELECT name"
+ "\n\t, sp"
+ "\nFROM abc"
+ "\n\tLATERAL VIEW EXPLODE(SPLIT(concat(',', '1', '2', '3'), ',')) t AS sp;", SQLUtils.formatOdps(sql));
Assert.assertEquals("select name"
+ "\n\t, sp"
Assert.assertEquals("SELECT name, sp\n" +
"FROM abc\n" +
"\tLATERAL VIEW EXPLODE(SPLIT(concat(',', '1', '2', '3'), ',')) t AS sp;", SQLUtils.formatOdps(sql));
Assert.assertEquals("select name, sp"
+ "\nfrom abc"
+ "\n\tlateral view explode(split(concat(',', '1', '2', '3'), ',')) t as sp;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
@@ -42,17 +42,14 @@ public class OdpsSelectTest17 extends TestCase {
") top )\n" +
"ORDER BY cnt DESC\n" +
"LIMIT 800";//
assertEquals("SELECT prov\n" +
"\t, name\n" +
"\t, cnt\n" +
assertEquals("SELECT prov, name, cnt\n" +
"FROM mock_app.adl_mock_v_fct\n" +
"WHERE ds = 20160920\n" +
"\tAND name != 'none'\n" +
"\tAND prov IN (\n" +
"\t\tSELECT prov\n" +
"\t\tFROM (\n" +
"\t\t\tSELECT prov\n" +
"\t\t\t\t, SUM(cnt) AS cnt\n" +
"\t\t\tSELECT prov, SUM(cnt) AS cnt\n" +
"\t\t\tFROM mock_app.adl_mock_v_fct\n" +
"\t\t\tWHERE ds = 20160920\n" +
"\t\t\tGROUP BY prov\n" +
@@ -62,17 +59,14 @@ public class OdpsSelectTest17 extends TestCase {
"\t)\n" +
"ORDER BY cnt DESC\n" +
"LIMIT 800", SQLUtils.formatOdps(sql));
assertEquals("select prov\n" +
"\t, name\n" +
"\t, cnt\n" +
assertEquals("select prov, name, cnt\n" +
"from mock_app.adl_mock_v_fct\n" +
"where ds = 20160920\n" +
"\tand name != 'none'\n" +
"\tand prov in (\n" +
"\t\tselect prov\n" +
"\t\tfrom (\n" +
"\t\t\tselect prov\n" +
"\t\t\t\t, sum(cnt) as cnt\n" +
"\t\t\tselect prov, sum(cnt) as cnt\n" +
"\t\t\tfrom mock_app.adl_mock_v_fct\n" +
"\t\t\twhere ds = 20160920\n" +
"\t\t\tgroup by prov\n" +
@@ -28,18 +28,14 @@ public class OdpsSelectTest18 extends TestCase {
public void test_select() throws Exception {
String sql = "select a, b, c from tableA where a in ( select a from tableB limit 10 )";//
assertEquals("SELECT a\n" +
"\t, b\n" +
"\t, c\n" +
assertEquals("SELECT a, b, c\n" +
"FROM tableA\n" +
"WHERE a IN (\n" +
"\tSELECT a\n" +
"\tFROM tableB\n" +
"\tLIMIT 10\n" +
")", SQLUtils.formatOdps(sql));
assertEquals("select a\n" +
"\t, b\n" +
"\t, c\n" +
assertEquals("select a, b, c\n" +
"from tableA\n" +
"where a in (\n" +
"\tselect a\n" +
@@ -25,17 +25,11 @@ public class OdpsSelectTest2 extends TestCase {
public void test_distribute_by() throws Exception {
String sql = "SELECT user_id,user_flag,cat1_id,wireless_client_type,alipay_num,last_buy_time,md5,my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d',md5) AS datax_pt FROM mytable_001 WHERE ds='20150819' DISTRIBUTE BY cast (datax_pt as BIGINT) SORT BY md5,user_id,user_flag,cat1_id,wireless_client_type";//
Assert.assertEquals("SELECT user_id"
+ "\n\t, user_flag"
+ "\n\t, cat1_id"
+ "\n\t, wireless_client_type"
+ "\n\t, alipay_num"
+ "\n\t, last_buy_time"
+ "\n\t, md5"
+ "\n\t, my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d', md5) AS datax_pt"
+ "\nFROM mytable_001"
+ "\nWHERE ds = '20150819'"
+ "\nDISTRIBUTE BY CAST(datax_pt AS BIGINT) SORT BY md5, user_id, user_flag, cat1_id, wireless_client_type", SQLUtils.formatOdps(sql));
Assert.assertEquals("SELECT user_id, user_flag, cat1_id, wireless_client_type, alipay_num\n" +
"\t, last_buy_time, md5, my_udf_001('t_datax_odps2ots_resource_tcif_dmp_user_topup_d', md5) AS datax_pt\n" +
"FROM mytable_001\n" +
"WHERE ds = '20150819'\n" +
"DISTRIBUTE BY CAST(datax_pt AS BIGINT) SORT BY md5, user_id, user_flag, cat1_id, wireless_client_type", SQLUtils.formatOdps(sql));
}
@@ -30,13 +30,11 @@ public class OdpsSelectTest_mapjoin extends TestCase {
+ "\nb.total_price"
+ "\nfrom shop a join sale_detail b"
+ "\non a.shop_name = b.shop_name and b.ds = '20150101';";
Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.shop_name"
+ "\n\t, b.customer_id"
+ "\n\t, b.total_price"
+ "\nFROM shop a"
+ "\nJOIN sale_detail b"
+ "\nON a.shop_name = b.shop_name"
+ "\n\tAND b.ds = '20150101';", SQLUtils.formatOdps(sql));
Assert.assertEquals("SELECT /*+ mapjoin(a) */ a.shop_name, b.customer_id, b.total_price\n" +
"FROM shop a\n" +
"JOIN sale_detail b\n" +
"ON a.shop_name = b.shop_name\n" +
"\tAND b.ds = '20150101';", SQLUtils.formatOdps(sql));
}
@@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows extends TestCase {
public void test_select() throws Exception {
String sql = "SELECT sum(c) over(order by ds rows 9999 preceding) s, ds FROM t1";//
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS 9999 PRECEDING) AS s\n" +
"\t, ds\n" +
assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS 9999 PRECEDING) AS s, ds\n" +
"FROM t1", SQLUtils.formatOdps(sql));
Assert.assertEquals("select sum(c) over (order by ds rows 9999 preceding) as s\n" +
"\t, ds\n" +
Assert.assertEquals("select sum(c) over (order by ds rows 9999 preceding) as s, ds\n" +
"from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -33,20 +33,12 @@ public class OdpsSelectTest_over_rows_1 extends TestCase {
" RANGE BETWEEN 365 PRECEDING AND 365 FOLLOWING) department_total\n" +
" from employee\n" +
" order by department_id, hire_date;";//
Assert.assertEquals("SELECT last_name\n" +
"\t, first_name\n" +
"\t, department_id\n" +
"\t, hire_date\n" +
"\t, salary\n" +
Assert.assertEquals("SELECT last_name, first_name, department_id, hire_date, salary\n" +
"\t, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date RANGE BETWEEN 365 PRECEDING AND 365 FOLLOWING) AS department_total\n" +
"FROM employee\n" +
"ORDER BY department_id, \n" +
"\thire_date;", SQLUtils.formatOdps(sql));
Assert.assertEquals("select last_name\n" +
"\t, first_name\n" +
"\t, department_id\n" +
"\t, hire_date\n" +
"\t, salary\n" +
Assert.assertEquals("select last_name, first_name, department_id, hire_date, salary\n" +
"\t, sum(salary) over (partition by department_id order by hire_date range between 365 preceding and 365 following) as department_total\n" +
"from employee\n" +
"order by department_id, \n" +
@@ -34,21 +34,13 @@ public class OdpsSelectTest_over_rows_2 extends TestCase {
" from employee\n" +
" order by department_id, hire_date;\n" +
"";//
Assert.assertEquals("SELECT last_name\n" +
"\t, first_name\n" +
"\t, department_id\n" +
"\t, hire_date\n" +
"\t, salary\n" +
assertEquals("SELECT last_name, first_name, department_id, hire_date, salary\n" +
"\t, SUM(salary) OVER (PARTITION BY department_id ORDER BY last_name, \n" +
"\t\tfirst_name RANGE 90 PRECEDING) AS department_total\n" +
"FROM employee\n" +
"ORDER BY department_id, \n" +
"\thire_date;", SQLUtils.formatOdps(sql));
Assert.assertEquals("select last_name\n" +
"\t, first_name\n" +
"\t, department_id\n" +
"\t, hire_date\n" +
"\t, salary\n" +
Assert.assertEquals("select last_name, first_name, department_id, hire_date, salary\n" +
"\t, sum(salary) over (partition by department_id order by last_name, \n" +
"\t\tfirst_name range 90 preceding) as department_total\n" +
"from employee\n" +
@@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_3 extends TestCase {
public void test_select() throws Exception {
String sql = "SELECT sum(c) over(order by ds rows current row) s, ds FROM t1";//
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS CURRENT ROW) AS s\n" +
"\t, ds\n" +
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS CURRENT ROW) AS s, ds\n" +
"FROM t1", SQLUtils.formatOdps(sql));
Assert.assertEquals("select sum(c) over (order by ds rows current row) as s\n" +
"\t, ds\n" +
Assert.assertEquals("select sum(c) over (order by ds rows current row) as s, ds\n" +
"from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_4 extends TestCase {
public void test_select() throws Exception {
String sql = "SELECT sum(c) over(order by ds rows UNBOUNDED PRECEDING) s, ds FROM t1";//
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED PRECEDING) AS s\n" +
"\t, ds\n" +
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED PRECEDING) AS s, ds\n" +
"FROM t1", SQLUtils.formatOdps(sql));
Assert.assertEquals("select sum(c) over (order by ds rows unbounded preceding) as s\n" +
"\t, ds\n" +
Assert.assertEquals("select sum(c) over (order by ds rows unbounded preceding) as s, ds\n" +
"from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -28,11 +28,9 @@ public class OdpsSelectTest_over_rows_5 extends TestCase {
public void test_select() throws Exception {
String sql = "SELECT sum(c) over(order by ds rows UNBOUNDED following) s, ds FROM t1";//
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED FOLLOWING) AS s\n" +
"\t, ds\n" +
Assert.assertEquals("SELECT SUM(c) OVER (ORDER BY ds ROWS UNBOUNDED FOLLOWING) AS s, ds\n" +
"FROM t1", SQLUtils.formatOdps(sql));
Assert.assertEquals("select sum(c) over (order by ds rows unbounded following) as s\n" +
"\t, ds\n" +
Assert.assertEquals("select sum(c) over (order by ds rows unbounded following) as s, ds\n" +
"from t1", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
@@ -33,28 +33,23 @@ public class OracleSubqueryFactoringTest extends TestCase {
+ "avg_cost AS (SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs)\n"
+ "SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name;";
String expected = "WITH\n" //
+ "\tdept_costs\n" //
+ "\tAS\n" //
+ "\t(\n"//
+ "\t\tSELECT department_name, SUM(salary) AS dept_total\n" //
+ "\t\tFROM employees e, departments d\n"//
+ "\t\tWHERE e.department_id = d.department_id\n" //
+ "\t\tGROUP BY department_name\n" //
+ "\t), \n" //
+ "\tavg_cost\n" //
+ "\tAS\n"//
+ "\t(\n" //
+ "\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" //
+ "\t\tFROM dept_costs\n" //
+ "\t)\n" //
+ "SELECT *\n" //
+ "FROM dept_costs\n" //
+ "WHERE dept_total > (\n" //
+ "\tSELECT avg\n" //
+ "\tFROM avg_cost\n" //
+ ")\n" //
+ "ORDER BY department_name;";
String expected = "WITH dept_costs AS (\n" +
"\t\tSELECT department_name, SUM(salary) AS dept_total\n" +
"\t\tFROM employees e, departments d\n" +
"\t\tWHERE e.department_id = d.department_id\n" +
"\t\tGROUP BY department_name\n" +
"\t), \n" +
"\tavg_cost AS (\n" +
"\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" +
"\t\tFROM dept_costs\n" +
"\t)\n" +
"SELECT *\n" +
"FROM dept_costs\n" +
"WHERE dept_total > (\n" +
"\tSELECT avg\n" +
"\tFROM avg_cost\n" +
")\n" +
"ORDER BY department_name;";
OracleStatementParser parser = new OracleStatementParser(sql);
SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0);
@@ -38,22 +38,22 @@ public class OracleSubqueryFactoringTest2 extends TestCase {
+ "SELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, salary, job_id\n"
+ "FROM org_chart\n" + "ORDER BY order1;\n";
String expected = "WITH\n"
+ "\torg_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id)\n"
+ "\tAS\n"
+ "\t(\n"
+ "\t\tSELECT employee_id, last_name, manager_id, 0 AS reportLevel, salary\n"
+ "\t\t\t, job_id\n"
+ "\t\tFROM employees\n"
+ "\t\tWHERE manager_id IS NULL\n"
+ "\t\tUNION ALL\n"
+ "\t\tSELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel + 1 AS reportLevel, e.salary\n"
+ "\t\t\t, e.job_id\n" + "\t\tFROM org_chart r, employees e\n"
+ "\t\tWHERE r.eid = e.manager_id\n" + "\t)\n"
+ "\tSEARCH DEPTH FIRST BY emp_last SET order1\n"
+ "\tCYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\n"
+ "SELECT lpad(' ', 2 * reportLevel) || emp_last AS emp_name, eid, mgr_id, salary, job_id\n"
+ "FROM org_chart\n" + "ORDER BY order1;";
String expected = "WITH org_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id) AS (\n" +
"\t\tSELECT employee_id, last_name, manager_id, 0 AS reportLevel, salary\n" +
"\t\t\t, job_id\n" +
"\t\tFROM employees\n" +
"\t\tWHERE manager_id IS NULL\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel + 1 AS reportLevel, e.salary\n" +
"\t\t\t, e.job_id\n" +
"\t\tFROM org_chart r, employees e\n" +
"\t\tWHERE r.eid = e.manager_id\n" +
"\t)\n" +
"\tSEARCH DEPTH FIRST BY emp_last SET order1\n" +
"\tCYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\n" +
"SELECT lpad(' ', 2 * reportLevel) || emp_last AS emp_name, eid, mgr_id, salary, job_id\n" +
"FROM org_chart\n" +
"ORDER BY order1;";
OracleStatementParser parser = new OracleStatementParser(sql);
SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0);
@@ -95,12 +95,16 @@ public class Oracle_pl_exception_0 extends OracleTest {
"\ttemp VARCHAR2(30);\n" +
"BEGIN\n" +
"\ttemp := t_column;\n" +
"\t-- For error message if next SELECT fails\n" +
"\t-- Fails if table t_name does not have column t_column:\n" +
"\tSELECT COLUMN_NAME\n" +
"\tINTO temp\n" +
"\tFROM USER_TAB_COLS\n" +
"\tWHERE TABLE_NAME = UPPER(t_name)\n" +
"\t\tAND COLUMN_NAME = UPPER(t_column);\n" +
"\ttemp := t_name;\n" +
"\t-- For error message if next SELECT fails\n" +
"\t-- Fails if there is no table named t_name:\n" +
"\tSELECT OBJECT_NAME\n" +
"\tINTO temp\n" +
"\tFROM USER_OBJECTS\n" +
@@ -124,12 +128,16 @@ public class Oracle_pl_exception_0 extends OracleTest {
"\ttemp VARCHAR2(30);\n" +
"begin\n" +
"\ttemp := t_column;\n" +
"\t-- For error message if next SELECT fails\n" +
"\t-- Fails if table t_name does not have column t_column:\n" +
"\tselect COLUMN_NAME\n" +
"\tinto temp\n" +
"\tfrom USER_TAB_COLS\n" +
"\twhere TABLE_NAME = UPPER(t_name)\n" +
"\t\tand COLUMN_NAME = UPPER(t_column);\n" +
"\ttemp := t_name;\n" +
"\t-- For error message if next SELECT fails\n" +
"\t-- Fails if there is no table named t_name:\n" +
"\tselect OBJECT_NAME\n" +
"\tinto temp\n" +
"\tfrom USER_OBJECTS\n" +
@@ -56,10 +56,7 @@ public class OracleSelectTest38 extends OracleTest {
String result = SQLUtils.toOracleString(stmt);
Assert.assertEquals("SELECT *\n" +
"FROM (\n" +
"\tWITH\n" +
"\t\tvw_kreis_statics_t\n" +
"\t\tAS\n" +
"\t\t(\n" +
"\tWITH vw_kreis_statics_t AS (\n" +
"\t\t\tSELECT substr(xzqh, 1, 6) AS xzqh, swrslx, SUM(swrs_count) AS acd_totle\n" +
"\t\t\tFROM (\n" +
"\t\t\t\tSELECT xzqh, sglx\n" +
@@ -106,10 +103,7 @@ public class OracleSelectTest38 extends OracleTest {
String result = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("select *\n" +
"from (\n" +
"\twith\n" +
"\t\tvw_kreis_statics_t\n" +
"\t\tas\n" +
"\t\t(\n" +
"\twith vw_kreis_statics_t as (\n" +
"\t\t\tselect substr(xzqh, 1, 6) as xzqh, swrslx, sum(swrs_count) as acd_totle\n" +
"\t\t\tfrom (\n" +
"\t\t\t\tselect xzqh, sglx\n" +
@@ -0,0 +1,113 @@
/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.bvt.sql.oracle.select;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import org.junit.Assert;
import java.util.List;
public class OracleSelectTest63_with_recursive extends OracleTest {
public void test_0() throws Exception {
String sql = //
"WITH t1(id, parent_id) AS (\n" +
" -- Anchor member.\n" +
" SELECT id,\n" +
" parent_id\n" +
" FROM tab1\n" +
" WHERE parent_id IS NULL\n" +
" UNION ALL\n" +
" -- Recursive member.\n" +
" SELECT t2.id,\n" +
" t2.parent_id\n" +
" FROM tab1 t2, t1\n" +
" WHERE t2.parent_id = t1.id\n" +
")\n" +
"SEARCH BREADTH FIRST BY id SET order1\n" +
"SELECT id,\n" +
" parent_id\n" +
"FROM t1\n" +
"ORDER BY order1;"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
stmt.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("relationships : " + visitor.getRelationships());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(2, visitor.getColumns().size());
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("WITH t1 (id, parent_id) AS (\n" +
"\t\t-- Anchor member.\n" +
"\t\tSELECT id, parent_id\n" +
"\t\tFROM tab1\n" +
"\t\tWHERE parent_id IS NULL\n" +
"\t\tUNION ALL\n" +
"\t\t-- Recursive member.\n" +
"\t\tSELECT t2.id, t2.parent_id\n" +
"\t\tFROM tab1 t2, t1\n" +
"\t\tWHERE t2.parent_id = t1.id\n" +
"\t)\n" +
"\tSEARCH BREADTH FIRST BY id SET order1\n" +
"SELECT id, parent_id\n" +
"FROM t1\n" +
"ORDER BY order1;", text);
}
{
String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("with t1 (id, parent_id) as (\n" +
"\t\t-- Anchor member.\n" +
"\t\tselect id, parent_id\n" +
"\t\tfrom tab1\n" +
"\t\twhere parent_id is null\n" +
"\t\tunion all\n" +
"\t\t-- Recursive member.\n" +
"\t\tselect t2.id, t2.parent_id\n" +
"\t\tfrom tab1 t2, t1\n" +
"\t\twhere t2.parent_id = t1.id\n" +
"\t)\n" +
"\tsearch BREADTH first by id set order1\n" +
"select id, parent_id\n" +
"from t1\n" +
"order by order1;", text);
}
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,114 @@
/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.bvt.sql.oracle.select;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import org.junit.Assert;
import java.util.List;
public class OracleSelectTest64_with_recursive extends OracleTest {
public void test_0() throws Exception {
String sql = //
"WITH t1(id, parent_id, lvl) AS (\n" +
" -- Anchor member.\n" +
" SELECT id,\n" +
" parent_id,\n" +
" 1 AS lvl\n" +
" FROM tab1\n" +
" WHERE parent_id IS NULL\n" +
" UNION ALL\n" +
" -- Recursive member.\n" +
" SELECT t2.id,\n" +
" t2.parent_id,\n" +
" lvl+1\n" +
" FROM tab1 t2, t1\n" +
" WHERE t2.parent_id = t1.id\n" +
")\n" +
"SEARCH DEPTH FIRST BY id SET order1\n" +
"SELECT id,\n" +
" parent_id,\n" +
" RPAD('.', (lvl-1)*2, '.') || id AS tree,\n" +
" lvl\n" +
"FROM t1\n" +
"ORDER BY order1;"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
stmt.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("relationships : " + visitor.getRelationships());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(2, visitor.getColumns().size());
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("WITH t1 (id, parent_id, lvl) AS (\n" +
"\t\t-- Anchor member.\n" +
"\t\tSELECT id, parent_id, 1 AS lvl\n" +
"\t\tFROM tab1\n" +
"\t\tWHERE parent_id IS NULL\n" +
"\t\tUNION ALL\n" +
"\t\t-- Recursive member.\n" +
"\t\tSELECT t2.id, t2.parent_id, lvl + 1\n" +
"\t\tFROM tab1 t2, t1\n" +
"\t\tWHERE t2.parent_id = t1.id\n" +
"\t)\n" +
"\tSEARCH DEPTH FIRST BY id SET order1\n" +
"SELECT id, parent_id, RPAD('.', (lvl - 1) * 2, '.') || id AS tree, lvl\n" +
"FROM t1\n" +
"ORDER BY order1;", text);
}
{
String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("with t1 (id, parent_id, lvl) as (\n" +
"\t\t-- Anchor member.\n" +
"\t\tselect id, parent_id, 1 as lvl\n" +
"\t\tfrom tab1\n" +
"\t\twhere parent_id is null\n" +
"\t\tunion all\n" +
"\t\t-- Recursive member.\n" +
"\t\tselect t2.id, t2.parent_id, lvl + 1\n" +
"\t\tfrom tab1 t2, t1\n" +
"\t\twhere t2.parent_id = t1.id\n" +
"\t)\n" +
"\tsearch DEPTH first by id set order1\n" +
"select id, parent_id, RPAD('.', (lvl - 1) * 2, '.') || id as tree, lvl\n" +
"from t1\n" +
"order by order1;", text);
}
}
}
@@ -37,25 +37,20 @@ public class SQLServerSelectTest6 extends TestCase {
"FROM DirReps " + //
"ORDER BY ManagerID;";
String expect = "WITH" +
"\n\tDirReps (ManagerID, DirectReports)" +
"\n\tAS" +
"\n\t(" +
"\n\t\tSELECT ManagerID, COUNT(*)" +
"\n\t\tFROM HumanResources.Employee e" +
"\n\t\tWHERE ManagerID IS NOT NULL" +
"\n\t\tGROUP BY ManagerID" +
"\n\t)" +
"\nSELECT ManagerID, DirectReports" +
"\nFROM DirReps" +
"\nORDER BY ManagerID;";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
String text = TestUtils.outputSqlServer(stmt);
Assert.assertEquals(expect, text);
assertEquals("WITH DirReps (ManagerID, DirectReports) AS (\n" +
"\t\tSELECT ManagerID, COUNT(*)\n" +
"\t\tFROM HumanResources.Employee e\n" +
"\t\tWHERE ManagerID IS NOT NULL\n" +
"\t\tGROUP BY ManagerID\n" +
"\t)\n" +
"SELECT ManagerID, DirectReports\n" +
"FROM DirReps\n" +
"ORDER BY ManagerID;", text);
// System.out.println(text);
}
@@ -68,10 +68,7 @@ public class SQLServerSelectTest7 extends TestCase {
String text = TestUtils.outputSqlServer(stmt);
assertEquals("WITH\n" +
"\tmenu_view\n" +
"\tAS\n" +
"\t(\n" +
assertEquals("WITH menu_view AS (\n" +
"\t\tSELECT t.*, 1 AS level\n" +
"\t\tFROM sec_portal_menu t\n" +
"\t\tWHERE t.parent_id = ?\n" +