bug fixed for oracle sql parser

This commit is contained in:
温少
2012-02-28 18:37:05 +08:00
parent 4a0343f572
commit b7e4de2501
35 changed files with 1221 additions and 198 deletions
@@ -0,0 +1,41 @@
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 OracleAlterSessionTest extends OracleTest {
public void test_0() throws Exception {
String sql = "alter session set current_schema=retl";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees@remote")));
Assert.assertEquals(0, visitor.getTables().size());
Assert.assertEquals(0, visitor.getColumns().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id")));
}
}
@@ -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 OracleInsertTest4 extends OracleTest {
public void test_0() throws Exception {
String sql = "insert into \"OPS$ADMIN\".\"ORASTAT\""
+ //
" select /*+ rule */ :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, "
+ //
"ot.name c1, null c2, null c3, c.name c4, u.name c5, "
+ //
" h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, "
+ //
" h.minimum n6, h.maximum n7, h.avgcln n8, "
+ //
" decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, "
+ //
" null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 "
+ //
" from sys.user$ u, sys.obj$ ot, sys.col$ c, sys.hist_head$ h, histgrm$ hg "
+ //
" where :3 is null and u.name = :1 and ot.owner# = u.user# and "
+ //
" ot.name = :2 and ot.type# = 2 and c.obj# = ot.obj# and "
+ //
" (:4 is null or c.name = :4) and h.obj# = ot.obj# and h.intcol# = c.intcol# and "
+ //
" hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# union all select :5 statid, "
+ //
"'C' type, :6 version, bitand(h.spare2,7) flags, ot.name c1, op.subname c2, null c3, c.name c4, u.name c5, "
+ //
" h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, "
+ //
" h.minimum n6, h.maximum n7, h.avgcln n8, "
+ //
" decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, "
+ " h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.obj$ ot, sys.col$ c, sys.tabpart$ tp, sys.obj$ op, "
+ " sys.hist_head$ h, histgrm$ hg where u.name = :1 and ot.owner# = u.user# and "
+ " ot.name = :2 and ot.type# = 2 and c.obj# = ot.obj# and (:4 is null or c.name = :4) and "
+ " tp.bo# = ot.obj# and tp.obj# = op.obj# and ((:3 is null and :vc_cascade_parts is not null) " +
" or op.subname = :3) and h.obj# = op.obj# and h.intcol# = c.intcol# and " +
" hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# " +
"" +
" union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, " +
" op.name c1, op.subname c2, null c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and ((:3 is null and :vc_cascade_parts is not null) or op.subname = :3) and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and h.obj# = op.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, op.name c1, op.subname c2, os.subname c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.tabsubpart$ ts, sys.obj$ os, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and ts.pobj# = tp.obj# and ts.obj# = os.obj# and ((:3 is null and :vc_cascade_parts is not null) or (op.subname = :3 and (:vc_cascade_parts is not null -- cascade to subpart or os.subname is null)) -- matches partition itself or os.subname = :3) and -- matches subpartition h.obj# = os.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# order by c5,c1,c2,c3,c4,n10";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises")));
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(3, visitor.getColumns().size());
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,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 OracleSelectTest12 extends OracleTest {
public void test_0() throws Exception {
String sql = "select /*+ use_nl(b c) ordered */ count(*) " + //
" from (" + //
" select distinct parent_id parentId from BUSINESS_ORDER a1 " + //
" where SELLER_SEQ in ( ?) " + //
" and not (order_from = 'safepay' and status in ('buyer_create', 'closed')) " + //
" ) b, business_order c where ID = b.parentId"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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("BUSINESS_ORDER")));
Assert.assertEquals(3, 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,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 OracleSelectTest13 extends OracleTest {
public void test_0() throws Exception {
String sql = "select id, table_id, event_type, pk_data, transaction_id, ignore_node_cluster_id, gmt_create "
+ " from retl_data_search"
+ " where id>=50001 and id<52001 and GMT_CREATE between sysdate-2 and sysdate order by id"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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("BUSINESS_ORDER")));
Assert.assertEquals(3, 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,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 OracleSelectTest14 extends OracleTest {
public void test_0() throws Exception {
String sql = "select /* EXEC_FROM_DBMS_XPLAN */ case when upper(sql_text) like '%DBMS_XPLAN%' then 0 else 1 end case, SQL_ID, child_number"
+ " from v$sql where SQL_ID ='90jx354zd6jx5' and child_number =0"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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("BUSINESS_ORDER")));
Assert.assertEquals(3, 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,44 @@
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 OracleSelectTest15 extends OracleTest {
public void test_0() throws Exception {
String sql = "SELECT CURRENT_TIMESTAMP(6) AT TIME ZONE 'PST' FROM \"DUAL\" \"A1\""; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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("\"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,44 @@
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 OracleSelectTest16 extends OracleTest {
public void test_0() throws Exception {
String sql = "select privilege#,level from sysauth$ connect by grantee#=prior privilege# and privilege#>0 start with grantee#=:1 and privilege#>0"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
System.out.println(output(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("\"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")));
}
}
@@ -5,9 +5,13 @@ 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;
@@ -22,6 +26,8 @@ public class TestTransform extends OracleTest {
private String password;
private DruidDataSource dataSource;
private ExecutorService executor = Executors.newFixedThreadPool(10);
public void setUp() throws Exception {
jdbcUrl = "jdbc:oracle:thin:@10.20.149.18:1521:emdb";
user = "wardon";
@@ -32,26 +38,104 @@ public class TestTransform extends OracleTest {
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setMaxActive(50);
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxOpenPreparedStatements(100);
}
public void test_transform() throws Exception {
public void f_test_createIndex() throws Exception {
String sql = "CREATE INDEX i_db_day_sql_fulltext on db_day_sql_fulltext (sql_id)";
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute(sql);
conn.close();
}
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 f_test_transform() throws Exception {
Connection conn = dataSource.getConnection();
int count = 0;
{
String sql = "SELECT COUNT(*) FROM db_day_sql_fulltext WHERE SQL_PARSE_RESULT IS NULL";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
rs.next();
count = rs.getInt(1);
rs.close();
stmt.close();
}
System.out.println("COUNT : " + count);
String sql = "SELECT SNAP_DATE, DBNAME, SQL_ID, PIECE, SQL_TEXT" + //
" , COMMAND_TYPE, LAST_SNAP_DATE, DB_PK, SQL_PARSE_RESULT " + //
" FROM db_day_sql_fulltext " + //
" WHERE SQL_PARSE_RESULT IS NULL" + //
" ORDER BY sql_id, piece";
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
OracleStatement oracleStmt = stmt.unwrap(OracleStatement.class);
oracleStmt.setRowPrefetch(100);
ResultSet rs = stmt.executeQuery(sql);
Record r = null;
int i = 0;
while (rs.next()) {
r = new Record();
i++;
Date d1 = rs.getDate(1);
String s2 = rs.getString(2);
String sqlId = rs.getString(3);
if (sqlId.equals("018vcjmqxuguv")) {
continue;
}
if (sqlId.equals("0d69js78vuh8j")) {
continue;
}
if (sqlId.equals("0khp9aykj08vq")) {
continue;
}
if (sqlId.equals("0ns0zv7qaxzus")) {
continue;
}
if (sqlId.equals("0tg8ryp81gq1w")) {
continue;
}
if (sqlId.equals("0tvydgpa3jmkv")) {
continue;
}
r.setSnapshotDate(d1);
r.setDbName(s2);
r.setSqlId(sqlId);
@@ -61,82 +145,170 @@ public class TestTransform extends OracleTest {
r.setCommandType(rs.getInt(6));
r.setLastSnapshotDate(rs.getDate(7));
r.setDbPk(rs.getLong(8));
System.out.println(r.getSqlText());
// System.out.println(i + "(" + r.getDbName() + "/" + r.getSqlId() + ") : " + r.getSqlText());
schemaStat(r);
}
rs.close();
stmt.close();
conn.close();
}
public void schemaStat(Record r) {
public void schemaStat(final Record r) throws Exception {
executor.submit(new Runnable() {
public void run() {
try {
schemaStatInternal(r);
} catch (Exception e) {
// e.printStackTrace();
}
}
});
}
public void schemaStatInternal(Record r) throws Exception {
String sql = r.getSqlText();
if (sql.startsWith("/* MV_REFRESH (INS) */")) {
return;
}
if (sql.startsWith("/* MV_REFRESH (DEL) */")) {
return;
}
if (sql.startsWith("grant") || sql.startsWith("GRANT")) {
return;
}
if (sql.startsWith("SELECT /*+ Q1630000 NO_EXPAND ROWID(A1) */ A1.\"PRODUCT_ID\",A1.\"SUMMARY\"")) {
return;
}
if (sql.startsWith("declare") || sql.startsWith("DECLARE")) {
return;
}
if (sql.startsWith("alter table")) {
return;
}
if (sql.startsWith("SELECT /* OPT_DYN_SAMP */")) {
return;
}
if (sql.startsWith("COMMENT")) {
return;
}
if (sql.startsWith("create index")) {
return;
}
if (sql.startsWith("alter index")) {
return;
}
if (sql.startsWith("create table")) {
return;
}
if (sql.startsWith("CREATE")) {
return;
}
if (sql.startsWith("explain plan")) {
return;
}
if (sql.startsWith("ALTER TABLE")) {
return;
}
if (r.getSqlId().equals("09x7ytfdk63sp")) {
return;
}
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
Assert.assertEquals(1, statementList.size());
System.out.println(output(statementList));
// System.out.println(output(statementList));
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();
System.out.println();
System.out.println();
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 f_test_migrate() throws Exception {
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 db_pk = 40 and snap_date = trunc(sysdate) " + //
" ORDER BY sql_id, piece";
Connection conn = dataSource.getConnection();
// " WHERE db_pk = 40 and 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(r.getSqlText());
System.out.println((i++) + "/" + j + " : " + r.getSqlId());
System.out.println();
insert(r);
try {
setInfo(r);
} catch (Exception e) {
e.printStackTrace();
}
list.add(r);
if (list.size() > 100) {
insert(list);
list.clear();
}
}
r = new Record();
@@ -152,19 +324,46 @@ public class TestTransform extends OracleTest {
} else {
String part = rs.getString(5);
if (part != null) {
r.setSqlText(r.getSqlText() + part);
r.appendSqlText(part);
}
}
lastSqlId = sqlId;
}
insert(list);
rs.close();
stmt.close();
conn.close();
}
public void insert(Record r) throws Exception {
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());
// System.out.println(output(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)" + //
@@ -173,18 +372,21 @@ public class TestTransform extends OracleTest {
PreparedStatement stmt = conn.prepareStatement(sql);
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());
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.getSqlText());
stmt.execute();
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();
@@ -193,14 +395,23 @@ public class TestTransform extends OracleTest {
public static class Record {
private Date snapshotDate;
private String dbName;
private String sqlId;
private String sqlText;
private Integer piece;
private Integer commandType;
private Date lastSnapshotDate;
private Long dbPk;
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;
@@ -227,11 +438,15 @@ public class TestTransform extends OracleTest {
}
public String getSqlText() {
return sqlText;
return sqlText.toString();
}
public void setSqlText(String sqlText) {
this.sqlText = sqlText;
this.sqlText = new StringBuffer(sqlText);
}
public void appendSqlText(String sqlText) {
this.sqlText.append(sqlText);
}
public Integer getPiece() {