diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java index 9126cf9a94..72ce54ce5f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java @@ -8,6 +8,8 @@ public class OracleSetTransactionStatement extends OracleSQLObjectImpl implement private static final long serialVersionUID = 1L; + private boolean readOnly = false; + private SQLExpr name; @Override @@ -26,4 +28,12 @@ public class OracleSetTransactionStatement extends OracleSQLObjectImpl implement this.name = name; } + public boolean isReadOnly() { + return readOnly; + } + + public void setReadOnly(boolean readOnly) { + this.readOnly = readOnly; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 534b2d1cfc..13bcfd8ad1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -457,8 +457,17 @@ public class OracleStatementParser extends SQLStatementParser { public SQLStatement parseSet() { accept(Token.SET); acceptIdentifier("TRANSACTION"); - acceptIdentifier("NAME"); + OracleSetTransactionStatement stmt = new OracleSetTransactionStatement(); + + if (identifierEquals("READ")) { + lexer.nextToken(); + acceptIdentifier("ONLY"); + stmt.setReadOnly(true); + } + + acceptIdentifier("NAME"); + stmt.setName(this.exprParser.expr()); return stmt; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index b478f6642a..c378b166ac 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -814,7 +814,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("WHERE "); x.getWhere().accept(this); } - + if (x.getReturning().size() > 0) { println(); print("RETURNING "); @@ -1898,7 +1898,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public boolean visit(OracleSetTransactionStatement x) { - print("SET TRANSACTION NAME "); + if (x.isReadOnly()) { + print("SET TRANSACTION READ ONLY NAME "); + } else { + print("SET TRANSACTION NAME "); + } x.getName().accept(this); return false; } @@ -2156,11 +2160,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("("); printAndAccept(x.getItems(), ", "); print(")"); - + if (x.isIndexOnlyTopLevel()) { print(" INDEX ONLY TOPLEVEL"); } - + if (x.getTablespace() != null) { print(" TABLESPACE "); x.getTablespace().accept(this); @@ -2169,10 +2173,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (x.isOnline()) { print(" ONLINE"); } - + if (x.isNoParallel()) { print(" NOPARALLEL"); - } else if (x.getParallel() != null){ + } else if (x.getParallel() != null) { print(" PARALLEL "); x.getParallel().accept(this); } @@ -2188,7 +2192,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleAlterIndexStatement x) { print("ALTER INDEX "); x.getName().accept(this); - + if (x.getRenameTo() != null) { print(" RENAME TO "); x.getRenameTo().accept(this); @@ -2202,7 +2206,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(" "); x.getRebuild().accept(this); } - + if (x.getParallel() != null) { print(" PARALLEL"); x.getParallel().accept(this); @@ -2410,61 +2414,61 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS this.visit((SQLCreateTableStatement) x); incrementIndent(); - + if (x.isOrganizationIndex()) { print(" ORGANIZATION INDEX"); } - + if (x.getTablespace() != null) { print(" TABLESPACE "); x.getTablespace().accept(this); } - + if (x.isInMemoryMetadata()) { print(" IN_MEMORY_METADATA"); } - + if (x.isCursorSpecificSegment()) { print(" CURSOR_SPECIFIC_SEGMENT"); } - + if (x.getParallel() == Boolean.TRUE) { print(" PARALLEL"); } else if (x.getParallel() == Boolean.FALSE) { print(" NOPARALLEL"); } - + if (x.getCache() == Boolean.TRUE) { print(" CACHE"); } else if (x.getCache() == Boolean.FALSE) { print(" NOCACHE"); } - + if (x.getCompress() == Boolean.TRUE) { print(" COMPRESS"); } else if (x.getCompress() == Boolean.FALSE) { print(" NOCOMPRESS"); } - + if (x.getLogging() == Boolean.TRUE) { print(" LOGGING"); } else if (x.getLogging() == Boolean.FALSE) { print(" NOLOGGING"); } - + if (x.getStorage() != null) { print(" "); x.getStorage().accept(this); } - + if (x.isOnCommit()) { print(" ON COMMIT"); } - + if (x.isPreserveRows()) { print(" PRESERVE ROWS"); } - + if (x.getPartitioning() != null) { println(); x.getPartitioning().accept(this); @@ -2494,45 +2498,45 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterTableRenameTo x) { - + } @Override public boolean visit(OracleStorageClause x) { print("STORAGE ("); - + if (x.getInitial() != null) { print(" INITIAL "); x.getInitial().accept(this); } - + if (x.getFreeLists() != null) { print(" FREELISTS "); x.getFreeLists().accept(this); } - + if (x.getFreeListGroups() != null) { print(" FREELIST GROUPS "); x.getFreeListGroups().accept(this); } - + if (x.getBufferPool() != null) { print(" BUFFER_POOL "); x.getBufferPool().accept(this); } - + if (x.getObjno() != null) { print(" OBJNO "); x.getObjno().accept(this); } - + print(")"); return false; } @Override public void endVisit(OracleStorageClause x) { - + } @Override @@ -2544,8 +2548,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleGotoStatement x) { - + } + @Override public boolean visit(OracleLabelStatement x) { print("<<"); @@ -2553,10 +2558,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(">>"); return false; } - + @Override public void endVisit(OracleLabelStatement x) { - + } @Override @@ -2564,7 +2569,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS x.getName().accept(this); print(" "); x.getDataType().accept(this); - + if (x.getDefaultValue() != null) { print(" := "); x.getDefaultValue().accept(this); @@ -2574,7 +2579,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleParameter x) { - + } @Override @@ -2585,18 +2590,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleCommitStatement x) { - + } @Override public boolean visit(OracleAlterTriggerStatement x) { print("ALTER TRIGGER "); x.getName().accept(this); - + if (x.isCompile()) { print(" COMPILE"); } - + if (x.getEnable() != null) { if (x.getEnable().booleanValue()) { print("ENABLE"); @@ -2609,18 +2614,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterTriggerStatement x) { - + } @Override public boolean visit(OracleAlterSynonymStatement x) { print("ALTER SYNONYM "); x.getName().accept(this); - + if (x.isCompile()) { print(" COMPILE"); } - + if (x.getEnable() != null) { if (x.getEnable().booleanValue()) { print("ENABLE"); @@ -2633,7 +2638,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterSynonymStatement x) { - + } @Override @@ -2646,18 +2651,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(AsOfSnapshotClause x) { - + } @Override public boolean visit(OracleAlterViewStatement x) { print("ALTER VIEW "); x.getName().accept(this); - + if (x.isCompile()) { print(" COMPILE"); } - + if (x.getEnable() != null) { if (x.getEnable().booleanValue()) { print("ENABLE"); @@ -2670,7 +2675,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterViewStatement x) { - + } @Override @@ -2682,7 +2687,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterTableMoveTablespace x) { - + } @Override @@ -2694,18 +2699,18 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleSizeExpr x) { - + } @Override public boolean visit(OracleFileSpecification x) { printAndAccept(x.getFileNames(), ", "); - + if (x.getSize() != null) { print(" SIZE "); x.getSize().accept(this); } - + if (x.isAutoExtendOff()) { print(" AUTOEXTEND OFF"); } else if (x.getAutoExtendOn() != null) { @@ -2717,7 +2722,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleFileSpecification x) { - + } @Override @@ -2734,7 +2739,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterTablespaceAddDataFile x) { - + } @Override @@ -2748,14 +2753,14 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterTablespaceStatement x) { - + } @Override public boolean visit(OracleTruncateStatement x) { print("TRUNCATE TABLE "); printAndAccept(x.getTableNames(), ", "); - + if (x.isPurgeSnapshotLog()) { print(" PURGE SNAPSHOT LOG"); } @@ -2764,29 +2769,29 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleTruncateStatement x) { - + } @Override public boolean visit(OracleCreateSequenceStatement x) { print("CREATE SEQUENCE "); x.getName().accept(this); - + if (x.getStartWith() != null) { print(" START WITH "); x.getStartWith().accept(this); } - + if (x.getIncrementBy() != null) { print(" INCREMENT BY "); x.getIncrementBy().accept(this); } - + if (x.getMaxValue() != null) { print(" MAXVALUE "); x.getMaxValue().accept(this); } - + if (x.getCycle() != null) { if (x.getCycle().booleanValue()) { print(" CYCLE"); @@ -2794,7 +2799,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(" NOCYCLE"); } } - + if (x.getCache() != null) { if (x.getCache().booleanValue()) { print(" CACHE"); @@ -2802,13 +2807,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(" NOCACHE"); } } - + return false; } @Override public void endVisit(OracleCreateSequenceStatement x) { - + } @Override @@ -2823,7 +2828,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleRangeValuesClause x) { - + } @Override @@ -2831,18 +2836,17 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("PARTITION BY RANGE ("); printAndAccept(x.getColumns(), ", "); print(")"); - + if (x.getInterval() != null) { print(" INTERVAL "); x.getInterval().accept(this); } - + if (x.getStoreIn().size() > 0) { print(" STORE IN ("); printAndAccept(x.getStoreIn(), ", "); print(")"); } - println(); print("("); @@ -2862,7 +2866,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OraclePartitionByRangeClause x) { - + } @Override @@ -2888,7 +2892,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleLoopStatement x) { - + } @Override @@ -2903,6 +2907,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleExitStatement x) { - + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index a0e49480eb..fa6c5507f1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -535,6 +535,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (aliasMap != null) { for (Map.Entry entry : aliasMap.entrySet()) { + if (entry.getKey() == null) { + continue; + } if (entry.getKey().equalsIgnoreCase(name)) { return entry.getValue(); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java index a66c6c2473..80181f6204 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java @@ -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"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest8.java index 91e7fbada7..cf42f6efc9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest8.java @@ -36,10 +36,10 @@ public class OracleInsertTest8 extends OracleTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertEquals(9, visitor.getTables().size()); - Assert.assertEquals(42, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(26, visitor.getColumns().size()); - // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises"))); + 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"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest33.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest33.java index ac3356f247..f6c936acab 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest33.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest33.java @@ -16,7 +16,7 @@ public class OracleSelectTest33 extends OracleTest { String sql = // "SELECT /*+ Q1647000 NO_EXPAND ROWID(A1) */ " + // "A1.\"PRODUCT_ID\",A1.\"SUMMARY\",A1.\"DESCRIPTION\",A1.\"DESCRIPTION2\" " + // - "FROM \"ALIBABA1949\".\"WS_PRODUCT_DETAIL\" PX_GRANULE(0, BLOCK_RANGE, DYNAMIC) A1"; // + "FROM \"ALIBABA1949\".\"WS_PRODUCT_DETAIL\" A1"; // OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); @@ -36,11 +36,11 @@ public class OracleSelectTest33 extends OracleTest { Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW_LOGISTICS"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ALIBABA1949.WS_PRODUCT_DETAIL"))); - Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(4, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW_LOGISTICS", "*"))); // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSetTransactionTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSetTransactionTest2.java new file mode 100644 index 0000000000..adabf5f6a7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSetTransactionTest2.java @@ -0,0 +1,42 @@ +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 OracleSetTransactionTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SET TRANSACTION READ ONLY NAME 'Toronto';"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List 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("employees"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + } +}