bug fixed for sql parser

This commit is contained in:
温少
2012-03-07 14:39:34 +08:00
37 changed files with 1855 additions and 69 deletions
@@ -52,7 +52,7 @@ public class OracleBlockTest2 extends OracleTest {
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wl_ship_order")));
Assert.assertEquals(4, visitor.getColumns().size());
Assert.assertEquals(4, visitor.getConditions().size());
Assert.assertEquals(3, visitor.getConditions().size());
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("wl_ship_order", "id")));
}
@@ -0,0 +1,59 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleBlockTest5 extends OracleTest {
public void test_0() throws Exception {
String sql = "declare l_cnt number; "
+ //
"begin l_cnt := 0;"
+ //
" for c1 in (select id || '' id" +//
" from escrow_trade" + //
" where out_order_id in" + //
" (select out_order_id from tab_ipay_out_order_ids)" + //
" ) " + //
" loop" + //
" update ipay_contract" + //
" set is_chargeback = 'N'" + //
" where out_ref = c1.id and is_chargeback <> 'N'; l_cnt := l_cnt + 1; if (mod(l_cnt, 200) = 0) then commit; end if; dbms_application_info.set_client_info(l_cnt || ' rows updated!'); end loop; commit; exception when others then raise;"
+ " rollback; " + //
"end;;";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(3, visitor.getTables().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("escrow_trade")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tab_ipay_out_order_ids")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ipay_contract")));
Assert.assertEquals(7, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id")));
}
}
@@ -0,0 +1,69 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleBlockTest6 extends OracleTest {
public void test_0() throws Exception {
String sql = "declare" + //
" l_line varchar2(32767);" + //
" l_done number;" + //
" l_buffer varchar2(32767) := '';" + //
" l_lengthbuffer number := 0;" + //
" l_lengthline number := 0; " + //
"begin" + //
" loop" + //
" dbms_output.get_line( l_line, l_done );" + //
" if (l_buffer is null) then" + //
" l_lengthbuffer := 0;" + //
" else" + //
" l_lengthbuffer := length(l_buffer);" + //
" end if;" + //
" if (l_line is null) then" + //
" l_lengthline := 0;" + //
" else" + //
" l_lengthline := length(l_line);" + //
" end if;" + //
" exit when l_lengthbuffer + l_lengthline > :maxbytes " + //
" OR l_lengthbuffer + l_lengthline > 32767 OR l_done = 1;" + //
" l_buffer := l_buffer || l_line || chr(10);" + //
" end loop;" + //
" :done := l_done;" + //
" :buffer := l_buffer;" + //
" :line := l_line; " + //
"end;";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(0, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("escrow_trade")));
Assert.assertEquals(0, visitor.getColumns().size());
Assert.assertEquals(0, visitor.getConditions().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id")));
}
}
@@ -0,0 +1,49 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleCreateSequenceTest extends OracleTest {
public void test_0() throws Exception {
String sql = //
"CREATE SEQUENCE customers_seq" + //
" START WITH 1000" + //
" INCREMENT BY 1" + //
" NOCACHE" + //
" NOCYCLE;";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(0, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0")));
Assert.assertEquals(0, visitor.getColumns().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode")));
}
}
@@ -0,0 +1,47 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleCreateTableTest10 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"create global temporary table sys.ora_temp_1_ds_16247 on commit preserve rows cache noparallel " + //
"as " + //
"select /*+ no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring */\"OBJ#\",\"INTCOL#\",\"SAVTIME\",\"FLAGS\",\"NULL_CNT\",\"MINIMUM\",\"MAXIMUM\",\"DISTCNT\",\"DENSITY\",\"LOWVAL\",\"HIVAL\",\"AVGCLN\",\"SAMPLE_DISTCNT\",\"SAMPLE_SIZE\",\"TIMESTAMP#\",\"SPARE1\",\"SPARE2\",\"SPARE3\",\"SPARE4\",\"SPARE5\",\"SPARE6\",SYS_EXTRACT_UTC(\"SAVTIME\") SYS_DS_ALIAS_22 from \"SYS\".\"WRI$_OPTSTAT_HISTHEAD_HISTORY\" sample ( 5.8764601401) t where 1 = 2";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(2, visitor.getTables().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.ora_temp_1_ds_16247")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY")));
Assert.assertEquals(21, visitor.getColumns().size());
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY", "OBJ#")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode")));
}
}
@@ -0,0 +1,83 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleCreateTableTest11 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"create table zfj_en_click(" + //
"P_M CHAR(6), KEYWORD VARCHAR2(256), " + //
"REGION_NAME VARCHAR2(100), " + //
"COUNTRY_ACCORD_NAME VARCHAR2(256), " + //
"P_NAME VARCHAR2(256), " + //
"P_VALUE VARCHAR2(256), " + //
"CLICK_CNT NUMBER" + //
") " + //
"partition by range (p_m) " + //
"(" + //
"partition part_201108 values less than('201109')," + //
"partition part_201109 values less than('201110')," + //
"partition part_201110 values less than('201111'), " + //
"partition part_201111 values less than('201112'), " + //
"partition part_201112 values less than('201201'), " + //
"partition part_201201 values less than('201202'), " + //
"partition part_201202 values less than('201203'), " + //
"partition part_201203 values less than('201204'), " + //
"partition part_201204 values less than('201205'), " + //
"partition part_201205 values less than('201206'), " + //
"partition part_201206 values less than('201207'), " + //
"partition part_201207 values less than('201208'), " + //
"partition part_201208 values less than('201209'), " + //
"partition part_201209 values less than('201210'), " + //
"partition part_201210 values less than('201211'), " + //
"partition part_201211 values less than('201212'), " + //
"partition part_201212 values less than('201301'), " + //
"partition part_201301 values less than('201302'), " + //
"partition part_201302 values less than('201303'), " + //
"partition part_201303 values less than('201304'), " + //
"partition part_201304 values less than('201305'), " + //
"partition part_201305 values less than('201306'), " + //
"partition part_201306 values less than('201307') " + //
") ";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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.assertTrue(visitor.getTables().containsKey(new TableStat.Name("zfj_en_click")));
Assert.assertEquals(7, visitor.getColumns().size());
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "P_M")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "KEYWORD")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "REGION_NAME")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "COUNTRY_ACCORD_NAME")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "P_NAME")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "P_VALUE")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("zfj_en_click", "CLICK_CNT")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode")));
}
}
@@ -0,0 +1,46 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleDeleteTest extends OracleTest {
public void test_0() throws Exception {
String sql = "delete from BILLING_LOG_MONITOR log where log.guid in (" + //
"'wb_xinmin.zhao_test121','wb_xinmin.zhao_test122'" + //
",'wb_xinmin.zhao_test123','wb_xinmin.zhao_test124'" + ")";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(1, visitor.getColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("BILLING_LOG_MONITOR")));
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
//
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("BILLING_LOG_MONITOR", "guid")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct")));
}
}
@@ -0,0 +1,45 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleExplainTest3 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"explain plan for select 'enaliint'||m.login_id from vaccount v, company c, member m where m.company_id = c.id and v.id = c.id and v.status = 'enabled' and (v.service_type = 'cgs' or v.service_type = 'tp' or v.service_type = 'hkgs' or v.service_type = 'twgs') and m.company_id > 0 and m.status = 'enabled' and m.gmt_create > c.gmt_modified";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(0, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("\"DUAL\"")));
Assert.assertEquals(0, visitor.getColumns().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode")));
}
}
@@ -0,0 +1,50 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleInsertTest8 extends OracleTest {
public void test_0() throws Exception {
String sql = "insert into AV_INFO_NEW (ID, GMT_CREATE, GMT_MODIFIED, COMPANY_ID, COMPANY_NAME_CN, COMPANY_NAME_EN, COMPANY_COUNTRY, "
+ " COMPANY_PROVINCE, COMPANY_CITY, COMPANY_ADDR_CN, COMPANY_ADDR_EN, MEMBER_SEX, MEMBER_CN_NAME, MEMBER_FIRST_NAME, MEMBER_LAST_NAME,"
+ " MEMBER_PHONE_COUNTRY, MEMBER_PHONE_AREA, MEMBER_PHONE_NUMBER, MEMBER_JOB_TITLE_CN, MEMBER_JOB_TITLE_EN, MEMBER_DEPT_EN, "
+ " MEMBER_DEPT_CN, LINK_EMAIL, STATUS, AV_PROVIDER, AV_ORIGIN)"
+ " values (1000236058, sysdate, sysdate, 1300904670, '��������5''TW'"
+ ", 'Yunnan', 'sadf', '4r7V', 'fdgtg', 'M', '�����info_name4', 'Fnameinfo_name4'"
+ ", '33', '4444', '6666', '���fgsgsdfg', 'fggtgth', '�������������', null, 'zeus'" + ")";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(26, visitor.getColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("AV_INFO_NEW")));
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
//
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct")));
}
}
@@ -0,0 +1,48 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleInsertTest9 extends OracleTest {
public void test_0() throws Exception {
String sql = "INSERT INTO \"ZFJ_EN_CLICK\" \"A1\" (" + //
"\"P_M\",\"KEYWORD\",\"REGION_NAME\"," + //
"\"COUNTRY_ACCORD_NAME\",\"P_NAME\",\"P_VALUE\",\"CLICK_CNT\"" + //
") " + "SELECT \"A2\".\"P_M\",\"A2\".\"KEYWORD\",\"A2\".\"REGION_NAME\"" + //
" ,\"A2\".\"COUNTRY_NAME\",\"A2\".\"P_NAME\",\"A2\".\"P_VALUE\",\"A2\".\"CLICK_CNT\" " + //
"FROM \"ZFJ_EN_CLICK_201202\"@! \"A2\"";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(14, visitor.getColumns().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ZFJ_EN_CLICK_201202@!")));
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ZFJ_EN_CLICK", "P_M")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct")));
}
}
@@ -0,0 +1,45 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleSelectTest32 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"select * from ESCROW_LOGISTICS t -- where received_status <>'not_received ' and received_status <>'received' "; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW_LOGISTICS")));
Assert.assertEquals(1, visitor.getColumns().size());
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,47 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleSelectTest33 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"SELECT /*+ Q1647000 NO_EXPAND ROWID(A1) */ " + //
"A1.\"PRODUCT_ID\",A1.\"SUMMARY\",A1.\"DESCRIPTION\",A1.\"DESCRIPTION2\" " + //
"FROM \"ALIBABA1949\".\"WS_PRODUCT_DETAIL\" A1"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ALIBABA1949.WS_PRODUCT_DETAIL")));
Assert.assertEquals(4, visitor.getColumns().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,59 @@
package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import junit.framework.Assert;
import com.alibaba.druid.sql.OracleTest;
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 com.alibaba.druid.stat.TableStat;
public class OracleSelectTest34 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"select t.logistics_no, t.event_date, t.country, t.province" + //
" , t.city,t.address, t.area_code,t.received_status " + //
"from wl_tracking t " + //
"where t.logistics_no in ( " + //
" select el.logistics_no " + //
" from escrow_logistics el" + //
" where rownum <= 20" + //
" and el.gmt_send between to_date ('2011-9-1', 'yyyy-mm-dd') " + //
" and to_date ('2011-11-30 23:59:59','yyyy-mm-dd hh24:mi:ss')" + //
" and el.received_status = 'received'" + //
" and el.goods_direction = 'send_goods'" + //
" and el.country = 'US'" + //
" and el.logistics_company in ('Hongkong Post Air Mail','Hongkong Post Air Parcel','China Post Air Mail','China Post Air Parcel')" +
" and el.recv_status_desc is null) and t.event_date is not null order by t.logistics_no, t.event_date"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.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(2, visitor.getTables().size());
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("wl_tracking")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("escrow_logistics")));
Assert.assertEquals(15, visitor.getColumns().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,346 @@
package com.alibaba.druid.sql;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import junit.framework.Assert;
import oracle.jdbc.OracleStatement;
import com.alibaba.druid.pool.DruidDataSource;
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 com.alibaba.fastjson.JSON;
public class TestMigrate extends OracleTest {
private String jdbcUrl;
private String user;
private String password;
private DruidDataSource dataSource;
public void setUp() throws Exception {
jdbcUrl = "jdbc:oracle:thin:@10.20.149.18:1521:emdb";
user = "wardon";
password = "wardon";
dataSource = new DruidDataSource();
dataSource.setInitialSize(1);
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setMaxActive(50);
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxOpenPreparedStatements(100);
}
private int updateCount = 0;
public void updateRecord(String sqlId, String result) throws Exception {
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("UPDATE db_day_sql_fulltext SET SQL_PARSE_RESULT = ? WHERE sql_id = ?");
stmt.setString(1, result);
stmt.setString(2, sqlId);
int updateCount = stmt.executeUpdate();
if (updateCount < 1) {
throw new Exception();
}
stmt.close();
conn.close();
System.out.println((this.updateCount++) + " : " + sqlId);
}
public void schemaStatInternal(Record r) throws Exception {
String sql = r.getSqlText();
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
Assert.assertEquals(1, statementList.size());
// print(statementList);
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.accept(visitor);
StringBuffer buf = new StringBuffer();
buf.append("Tables : " + visitor.getTables().toString());
buf.append("\nColumns : " + visitor.getColumns().toString());
buf.append("\nCoditions : " + visitor.getConditions().toString());
buf.append("\nrelationships " + visitor.getRelationships().toString());
System.out.println(buf.toString());
System.out.println();
System.out.println();
System.out.println();
updateRecord(r.getSqlId(), buf.toString());
}
public void clearResult() throws Exception {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute("DELETE FROM db_day_sql_fulltext");
stmt.close();
conn.close();
}
public void test_migrate() throws Exception {
Connection conn = dataSource.getConnection();
int count = 0;
{
String sql = "SELECT COUNT(*) FROM db_day_sqltext";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
rs.next();
count = rs.getInt(1);
rs.close();
stmt.close();
}
System.out.println("COUNT : " + count);
clearResult();
String sql = "SELECT SNAP_DATE, DBNAME, SQL_ID, PIECE, SQL_TEXT" + //
" , COMMAND_TYPE, LAST_SNAP_DATE, DB_PK, SQL_PARSE_RESULT " + //
" FROM db_day_sqltext " + //
" WHERE snap_date = trunc(sysdate) " + //
" ORDER BY db_pk, sql_id, piece";
Statement stmt = conn.createStatement();
OracleStatement oracleStmt = stmt.unwrap(OracleStatement.class);
oracleStmt.setRowPrefetch(1000);
ResultSet rs = stmt.executeQuery(sql);
List<Record> list = new ArrayList<Record>();
Record r = null;
String lastSqlId = null;
int i = 0;
int j = 0;
while (rs.next()) {
j++;
Date d1 = rs.getDate(1);
String s2 = rs.getString(2);
String sqlId = rs.getString(3);
if (lastSqlId == null || !lastSqlId.equals(sqlId)) {
if (r != null) {
System.out.println((i++) + "/" + j + " : " + r.getSqlId());
System.out.println();
try {
setInfo(r);
} catch (Throwable e) {
e.printStackTrace();
}
list.add(r);
if (list.size() > 100) {
insert(list);
list.clear();
}
}
r = new Record();
r.setSnapshotDate(d1);
r.setDbName(s2);
r.setSqlId(sqlId);
r.setPiece(rs.getInt(4));
r.setSqlText(rs.getString(5));
r.setCommandType(rs.getInt(6));
r.setLastSnapshotDate(rs.getDate(7));
r.setDbPk(rs.getLong(8));
} else {
String part = rs.getString(5);
if (part == null) {
continue;
}
if (part != null) {
r.appendSqlText(part);
}
}
lastSqlId = sqlId;
}
insert(list);
rs.close();
stmt.close();
conn.close();
}
public void setInfo(Record r) {
OracleStatementParser parser = new OracleStatementParser(r.getSqlText());
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
Assert.assertEquals(1, statementList.size());
// print(statementList);
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.accept(visitor);
StringBuffer buf = new StringBuffer();
buf.append("Tables : " + visitor.getTables().toString());
buf.append("\nColumns : " + visitor.getColumns().toString());
buf.append("\nCoditions : " + visitor.getConditions().toString());
buf.append("\nrelationships " + visitor.getRelationships().toString());
r.setResult(buf.toString());
}
public void insert(List<Record> list) throws Exception {
if (list.size() == 0) {
return;
}
String sql = "INSERT INTO db_day_sql_fulltext " + //
"(SNAP_DATE, DBNAME, SQL_ID, PIECE, SQL_TEXT" + //
", COMMAND_TYPE, LAST_SNAP_DATE, DB_PK, SQL_PARSE_RESULT)" + //
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
for (Record r : list) {
stmt.setDate(1, r.getSnapshotDate());
stmt.setString(2, r.getDbName());
stmt.setString(3, r.getSqlId());
stmt.setInt(4, r.getPiece());
stmt.setString(5, r.getSqlText());
stmt.setInt(6, r.getCommandType());
stmt.setDate(7, r.getLastSnapshotDate());
stmt.setLong(8, r.getDbPk());
stmt.setString(9, r.getResult());
stmt.addBatch();
}
stmt.executeBatch();
stmt.close();
conn.close();
}
public static class Record {
private Date snapshotDate;
private String dbName;
private String sqlId;
private StringBuffer sqlText = new StringBuffer();
private Integer piece;
private Integer commandType;
private Date lastSnapshotDate;
private Long dbPk;
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Date getSnapshotDate() {
return snapshotDate;
}
public void setSnapshotDate(Date snapshotDate) {
this.snapshotDate = snapshotDate;
}
public String getDbName() {
return dbName;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public String getSqlId() {
return sqlId;
}
public void setSqlId(String sqlId) {
this.sqlId = sqlId;
}
public String getSqlText() {
return sqlText.toString();
}
public void setSqlText(String sqlText) {
if (sqlText == null) {
sqlText = "";
}
this.sqlText = new StringBuffer(sqlText);
}
public void appendSqlText(String sqlText) {
this.sqlText.append(sqlText);
}
public Integer getPiece() {
return piece;
}
public void setPiece(Integer piece) {
this.piece = piece;
}
public Integer getCommandType() {
return commandType;
}
public void setCommandType(Integer commandType) {
this.commandType = commandType;
}
public Date getLastSnapshotDate() {
return lastSnapshotDate;
}
public void setLastSnapshotDate(Date lastSnapshotDate) {
this.lastSnapshotDate = lastSnapshotDate;
}
public Long getDbPk() {
return dbPk;
}
public void setDbPk(Long dbPk) {
this.dbPk = dbPk;
}
public String toString() {
return JSON.toJSONString(this);
}
}
}
@@ -76,7 +76,7 @@ public class TestTransform extends OracleTest {
System.out.println((this.updateCount++) + " : " + sqlId);
}
public void f_test_transform() throws Exception {
public void test_transform() throws Exception {
Connection conn = dataSource.getConnection();
@@ -131,7 +131,7 @@ public class TestTransform extends OracleTest {
try {
schemaStatInternal(r);
} catch (Throwable e) {
// e.printStackTrace();
// e.printStackTrace();
}
}
rs.close();
@@ -147,7 +147,7 @@ public class TestTransform extends OracleTest {
try {
schemaStatInternal(r);
} catch (Exception e) {
e.printStackTrace();
// e.printStackTrace();
}
}
});
@@ -155,6 +155,13 @@ public class TestTransform extends OracleTest {
public void schemaStatInternal(Record r) throws Exception {
String sql = r.getSqlText();
sql = sql.replaceAll("5'HK'", "5''HK'");
sql = sql.replaceAll("5'TW'", "5''TW'");
sql = sql.replaceAll("5'CN'", "5''CN'");
sql = sql.replaceAll("\\Qnull, 'zeus')\\E", "', null, 'zeus')");
sql = sql.replaceAll("\\Q--+use_hash(v c m)\\E", "");
sql = sql.replaceAll("\\Q--+ordered use_hash(v c m)\\E", "");
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
@@ -191,7 +198,7 @@ public class TestTransform extends OracleTest {
conn.close();
}
public void test_migrate() throws Exception {
public void f_test_migrate() throws Exception {
Connection conn = dataSource.getConnection();
int count = 0;
@@ -390,6 +397,9 @@ public class TestTransform extends OracleTest {
}
public void setSqlText(String sqlText) {
if (sqlText == null) {
sqlText = "";
}
this.sqlText = new StringBuffer(sqlText);
}