From 277c8dbd1b30646a7a78cda272ae840dc9e24a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 5 Mar 2012 22:58:46 +0800 Subject: [PATCH] bug fixed for oracle sql parser --- .../mysql/visitor/MySqlSchemaStatVisitor.java | 21 ++- .../oracle/ast/clause/OracleParameter.java | 47 ++++++ .../oracle/ast/stmt/OracleBlockStatement.java | 8 +- .../ast/stmt/OracleCommitStatement.java | 17 +++ .../dialect/oracle/parser/OracleLexer.java | 1 + .../oracle/parser/OracleStatementParser.java | 16 ++- .../visitor/OracleASTVIsitorAdapter.java | 22 +++ .../oracle/visitor/OracleASTVisitor.java | 10 ++ .../oracle/visitor/OracleOutputVisitor.java | 37 ++++- .../visitor/OracleSchemaStatVisitor.java | 73 +++++++--- .../visitor/PGSchemaStatVisitor.java | 27 ++-- .../com/alibaba/druid/sql/parser/Token.java | 1 + .../druid/sql/visitor/SchemaStatVisitor.java | 134 +++++++++++------- .../bvt/sql/oracle/OracleBlockTest4.java | 16 +-- .../bvt/sql/oracle/OracleSelectTest31.java | 53 +++++++ 15 files changed, 363 insertions(+), 120 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleParameter.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest31.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 14989ec287..61ed01e03e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -1,6 +1,5 @@ package com.alibaba.druid.sql.dialect.mysql.visitor; -import java.util.HashMap; import java.util.Map; import com.alibaba.druid.sql.ast.SQLName; @@ -45,22 +44,22 @@ import com.alibaba.druid.stat.TableStat.Mode; public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlASTVisitor { public boolean visit(SQLSelectStatement x) { - aliasLocal.set(new HashMap()); - aliasLocal.get().put("DUAL", null); + setAliasMap(); + getAliasMap().put("DUAL", null); return true; } //DUAL public boolean visit(MySqlDeleteStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); setMode(x, Mode.Delete); - aliasLocal.set(new HashMap()); + setAliasMap(); if (x.getTableNames().size() == 1) { String ident = ((SQLIdentifierExpr) x.getTableNames().get(0)).getName(); - currentTableLocal.set(ident); + setCurrentTable(ident); } for (SQLName tableName : x.getTableNames()) { @@ -83,7 +82,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } public void endVisit(MySqlDeleteStatement x) { - aliasLocal.set(null); + setAliasMap(null); } @Override @@ -95,13 +94,13 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public boolean visit(MySqlInsertStatement x) { setMode(x, Mode.Insert); - aliasLocal.set(new HashMap()); + setAliasMap(); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); if (x.getTableName() instanceof SQLIdentifierExpr) { String ident = ((SQLIdentifierExpr) x.getTableName()).getName(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -111,7 +110,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } stat.incrementInsertCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleParameter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleParameter.java new file mode 100644 index 0000000000..6f05879131 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleParameter.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.clause; + +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleParameter extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + private SQLExpr name; + private SQLDataType dataType; + private SQLExpr defaultValue; + + public SQLExpr getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(SQLExpr deaultValue) { + this.defaultValue = deaultValue; + } + + public SQLExpr getName() { + return name; + } + + public void setName(SQLExpr name) { + this.name = name; + } + + public SQLDataType getDataType() { + return dataType; + } + + public void setDataType(SQLDataType dataType) { + this.dataType = dataType; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, dataType); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java index 31f66aba68..0941ce8d25 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java @@ -4,14 +4,14 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleBlockStatement extends OracleStatementImpl { private static final long serialVersionUID = 1L; - private List parameters = new ArrayList(); + private List parameters = new ArrayList(); private List statementList = new ArrayList(); @@ -32,11 +32,11 @@ public class OracleBlockStatement extends OracleStatementImpl { visitor.endVisit(this); } - public List getParameters() { + public List getParameters() { return parameters; } - public void setParameters(List parameters) { + public void setParameters(List parameters) { this.parameters = parameters; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java new file mode 100644 index 0000000000..7ea7022f2c --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCommitStatement.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleCommitStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 5c39e42cf5..bc7e9b3fe4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -136,6 +136,7 @@ public class OracleLexer extends Lexer { map.put("IF", Token.IF); map.put("ELSE", Token.ELSE); map.put("GOTO", Token.GOTO); + map.put("COMMIT", Token.COMMIT); DEFAULT_ORACLE_KEYWORDS = new Keywords(map); } 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 81779ac96c..38ad53338e 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 @@ -34,6 +34,7 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; @@ -51,6 +52,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; @@ -284,6 +286,13 @@ public class OracleStatementParser extends SQLStatementParser { continue; } + if (lexer.token() == Token.COMMIT) { + lexer.nextToken(); + OracleCommitStatement stmt = new OracleCommitStatement(); + statementList.add(stmt); + continue; + } + if (lexer.token() == Token.LTLT) { lexer.nextToken(); SQLName label = this.exprParser.name(); @@ -715,12 +724,15 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); for (;;) { - SQLColumnDefinition parameter = this.exprParser.parseColumn(); + OracleParameter parameter = new OracleParameter(); + parameter.setName(this.exprParser.name()); + parameter.setDataType(this.exprParser.parseDataType()); + block.getParameters().add(parameter); if (lexer.token() == Token.COLONEQ) { lexer.nextToken(); - parameter.setDefaultExpr(this.exprParser.expr()); + parameter.setDefaultValue(this.exprParser.expr()); } parameter.setParent(block); accept(Token.SEMI); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVIsitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVIsitorAdapter.java index f71ab3313a..4dc4ed88cb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVIsitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVIsitorAdapter.java @@ -17,6 +17,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -53,6 +54,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; @@ -1171,4 +1173,24 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora } + @Override + public boolean visit(OracleParameter x) { + return true; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + return true; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index e0e6dd4e47..ea52d767c5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.Vers import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -59,6 +60,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; @@ -515,4 +517,12 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleLabelStatement x); void endVisit(OracleLabelStatement x); + + boolean visit(OracleParameter x); + + void endVisit(OracleParameter x); + + boolean visit(OracleCommitStatement x); + + void endVisit(OracleCommitStatement x); } 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 12aaa6fedd..f4f948d39e 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 @@ -53,6 +53,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitio import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -93,6 +94,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; @@ -1195,7 +1197,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public boolean visit(OracleCursorExpr x) { print("CURSOR("); + incrementIndent(); + println(); x.getQuery().accept(this); + decrementIndent(); + println(); print(")"); return false; } @@ -1710,7 +1716,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS incrementIndent(); println(); - for (SQLColumnDefinition param : x.getParameters()) { + for (OracleParameter param : x.getParameters()) { param.accept(this); println(); } @@ -2445,4 +2451,33 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public void endVisit(OracleLabelStatement x) { } + + @Override + public boolean visit(OracleParameter x) { + x.getName().accept(this); + print(" "); + x.getDataType().accept(this); + + if (x.getDefaultValue() != null) { + print(" := "); + x.getDefaultValue().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + print("COMMIT"); + return false; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 7c5d4773e5..58a982dd88 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -1,6 +1,5 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; -import java.util.HashMap; import java.util.Map; import com.alibaba.druid.sql.ast.SQLExpr; @@ -35,6 +34,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -71,6 +71,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; @@ -142,7 +143,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } } - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (expr instanceof SQLName) { String ident; @@ -230,14 +231,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle accept(x.getFactoring()); accept(x.getQuery()); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); - currentTableLocal.set((String) x.getQuery().getAttribute("table")); + setCurrentTable((String) x.getQuery().getAttribute("table")); x.putAttribute("_old_local_", originalTable); accept(x.getOrderBy()); - currentTableLocal.set(originalTable); + setCurrentTable(originalTable); return false; } @@ -246,7 +247,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } public boolean visit(OracleUpdateStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); setMode(x, Mode.Update); SQLTableSource tableSource = x.getTableSource(); @@ -258,7 +259,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle if (tableExpr instanceof SQLIdentifierExpr) { String ident = tableExpr.toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -267,7 +268,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } stat.incrementUpdateCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); aliasMap.put(ident, ident); } else { tableSource.accept(this); @@ -280,7 +281,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } public void endVisit(OracleUpdateStatement x) { - aliasLocal.set(null); + clearAliasMap(); } public boolean visit(OracleDeleteStatement x) { @@ -288,7 +289,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } public void endVisit(OracleDeleteStatement x) { - aliasLocal.set(null); + clearAliasMap(); } public boolean visit(OracleSelectQueryBlock x) { @@ -749,7 +750,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(Entry x) { - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { String alias = null; if (x.getName() != null) { @@ -936,16 +937,16 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleMergeStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); setMode(x, Mode.Merge); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); x.getUsing().accept(this); String ident = x.getInto().toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -955,7 +956,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } stat.incrementMergeCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); @@ -978,7 +979,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleMergeStatement x) { - aliasLocal.set(null); + clearAliasMap(); } @Override @@ -1033,11 +1034,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(InsertIntoClause x) { - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); if (x.getTableName() instanceof SQLName) { String ident = ((SQLName) x.getTableName()).toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -1047,7 +1048,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } stat.incrementInsertCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); @@ -1074,7 +1075,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Insert); - aliasLocal.set(new HashMap()); + setAliasMap(); accept(x.getSubQuery()); @@ -1110,7 +1111,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(ConditionalInsertClauseItem x) { - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); SQLObject parent = x.getParent(); if (parent instanceof ConditionalInsertClause) { parent = parent.getParent(); @@ -1119,12 +1120,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle SQLSelect subQuery = ((OracleMultiInsertStatement) parent).getSubQuery(); if (subQuery != null) { String table = (String) subQuery.getAttribute("_table_"); - currentTableLocal.set(table); + setCurrentTable(table); } } x.getWhen().accept(this); x.getThen().accept(this); - currentTableLocal.set(originalTable); + setCurrentTable(originalTable); return false; } @@ -1385,6 +1386,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleForStatement x) { + x.getRange().setParent(x); + + x.getIndex().accept(this); + x.getRange().accept(this); + accept(x.getStatements()); + return false; } @@ -1513,4 +1520,24 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleLabelStatement x) { } + + @Override + public boolean visit(OracleParameter x) { + return false; + } + + @Override + public void endVisit(OracleParameter x) { + + } + + @Override + public boolean visit(OracleCommitStatement x) { + return true; + } + + @Override + public void endVisit(OracleCommitStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index 7456501d09..5f112276e0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -1,6 +1,5 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; -import java.util.HashMap; import java.util.Map; import com.alibaba.druid.sql.ast.SQLName; @@ -63,7 +62,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit @Override public boolean visit(PGWithQuery x) { - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { String alias = null; if (x.getName() != null) { @@ -129,7 +128,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit x.getWith().accept(this); } - aliasLocal.set(new HashMap()); + setAliasMap(); for (SQLName name : x.getUsing()) { String ident = name.toString(); @@ -141,7 +140,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit } stat.incrementSelectCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { aliasMap.put(ident, ident); } @@ -151,7 +150,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit setMode(x, Mode.Delete); String ident = ((SQLIdentifierExpr) x.getTableName()).getName(); - currentTableLocal.set(ident); + setCurrentTable(ident); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -185,7 +184,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit @Override public boolean visit(PGInsertStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); if (x.getWith() != null) { x.getWith().accept(this); @@ -194,11 +193,11 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit x.putAttribute("_original_use_mode", getMode()); setMode(x, Mode.Insert); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); if (x.getTableName() instanceof SQLName) { String ident = ((SQLName) x.getTableName()).toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -208,7 +207,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit } stat.incrementInsertCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); @@ -244,16 +243,16 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit @Override public boolean visit(PGUpdateStatement x) { - Map oldAliasMap = aliasLocal.get(); + Map oldAliasMap = getAliasMap(); - aliasLocal.set(new HashMap()); + setAliasMap(); if (x.getWith() != null) { x.getWith().accept(this); } String ident = x.getTableName().toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -262,13 +261,13 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit } stat.incrementUpdateCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); aliasMap.put(ident, ident); accept(x.getItems()); accept(x.getWhere()); - aliasLocal.set(oldAliasMap); + setAliasMap(oldAliasMap); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 80714f204d..a5737ca03f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -171,6 +171,7 @@ public enum Token { GRANT("GRANT"), LOOP("LOOP"), GOTO("GOTO"), + COMMIT("COMMIT"), // transact-sql TOP("TOP"), 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 08a6ef2cea..ba7946480d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -47,26 +47,52 @@ import com.alibaba.druid.stat.TableStat.Relationship; public class SchemaStatVisitor extends SQLASTVisitorAdapter { - protected final HashMap tableStats = new LinkedHashMap(); - protected final Set columns = new LinkedHashSet(); - protected final Set conditions = new LinkedHashSet(); - protected final Set relationships = new LinkedHashSet(); - protected final Set orderByColumns = new LinkedHashSet(); - protected final Set groupByColumns = new LinkedHashSet(); + protected final HashMap tableStats = new LinkedHashMap(); + protected final Set columns = new LinkedHashSet(); + protected final Set conditions = new LinkedHashSet(); + protected final Set relationships = new LinkedHashSet(); + protected final Set orderByColumns = new LinkedHashSet(); + protected final Set groupByColumns = new LinkedHashSet(); - protected final Map subQueryMap = new LinkedHashMap(); - protected final static ThreadLocal> aliasLocal = new ThreadLocal>(); - protected final static ThreadLocal currentTableLocal = new ThreadLocal(); + protected final Map subQueryMap = new LinkedHashMap(); - public final static String ATTR_TABLE = "_table_"; - public final static String ATTR_COLUMN = "_column_"; + protected Map aliasLocal = new HashMap(); - private Mode mode; + protected String currentTable; + + public final static String ATTR_TABLE = "_table_"; + public final static String ATTR_COLUMN = "_column_"; + + private Mode mode; + + public void setAliasMap() { + this.setAliasMap(new HashMap()); + } + + public void clearAliasMap() { + this.aliasLocal = null; + } + + public void setAliasMap(Map aliasMap) { + this.aliasLocal = aliasMap; + } + + public Map getAliasMap() { + return aliasLocal; + } + + public void setCurrentTable(String table) { + this.currentTable = table; + } + + public String getCurrentTable() { + return currentTable; + } protected Mode getMode() { return mode; } - + protected void setModeOrigin(SQLObject x) { Mode originalMode = (Mode) x.getAttribute("_original_use_mode"); mode = originalMode; @@ -92,7 +118,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLIdentifierExpr x) { - String currentTable = currentTableLocal.get(); + String currentTable = getCurrentTable(); if (subQueryMap.containsKey(currentTable)) { return false; @@ -222,7 +248,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected Column getColumn(SQLExpr expr) { - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap == null) { return null; } @@ -255,7 +281,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } String column = ((SQLIdentifierExpr) expr).getName(); - String table = currentTableLocal.get(); + String table = getCurrentTable(); if (table != null) { if (aliasMap.containsKey(table)) { table = aliasMap.get(table); @@ -279,13 +305,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLTruncateStatement x) { setMode(x, Mode.Insert); - aliasLocal.set(new HashMap()); + setAliasMap(); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); for (SQLName name : x.getTableNames()) { String ident = name.toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -295,7 +321,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } stat.incrementInsertCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { aliasMap.put(ident, ident); } @@ -308,13 +334,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropTableStatement x) { setMode(x, Mode.Insert); - aliasLocal.set(new HashMap()); + setAliasMap(); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); for (SQLName name : x.getTableNames()) { String ident = name.toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -324,7 +350,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } stat.incrementDropCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { aliasMap.put(ident, ident); } @@ -337,13 +363,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLInsertStatement x) { setMode(x, Mode.Insert); - aliasLocal.set(new HashMap()); + setAliasMap(); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); if (x.getTableName() instanceof SQLName) { String ident = ((SQLName) x.getTableName()).toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); TableStat stat = tableStats.get(ident); @@ -353,7 +379,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } stat.incrementInsertCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), ident); @@ -382,20 +408,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLSelectQueryBlock x) { setMode(x, Mode.Select); - + if (x.getFrom() instanceof SQLSubqueryTableSource) { x.getFrom().accept(this); return false; } - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); if (x.getFrom() instanceof SQLExprTableSource) { SQLExprTableSource tableSource = (SQLExprTableSource) x.getFrom(); if (tableSource.getExpr() instanceof SQLName) { String ident = tableSource.getExpr().toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); x.putAttribute(ATTR_TABLE, ident); if (x.getParent() instanceof SQLSelect) { x.getParent().putAttribute(ATTR_TABLE, ident); @@ -407,7 +433,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (x.getFrom() != null) { x.getFrom().accept(this); // 提前执行,获得aliasMap } - + if (x.getWhere() != null) { x.getWhere().setParent(x); } @@ -417,8 +443,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public void endVisit(SQLSelectQueryBlock x) { String originalTable = (String) x.getAttribute("_old_local_"); - x.putAttribute("table", currentTableLocal.get()); - currentTableLocal.set(originalTable); + x.putAttribute("table", getCurrentTable()); + setCurrentTable(originalTable); setModeOrigin(x); } @@ -447,7 +473,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } protected String aliasWrap(String name) { - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap.containsKey(name)) { return aliasMap.get(name); } @@ -491,7 +517,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLIdentifierExpr x) { - String currentTable = currentTableLocal.get(); + String currentTable = getCurrentTable(); if (subQueryMap.containsKey(currentTable)) { return false; @@ -517,7 +543,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLAllColumnExpr x) { - String currentTable = currentTableLocal.get(); + String currentTable = getCurrentTable(); if (subQueryMap.containsKey(currentTable)) { return false; @@ -542,12 +568,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLSelectStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); return true; } public void endVisit(SQLSelectStatement x) { - aliasLocal.set(null); + clearAliasMap(); } public boolean visit(SQLSubqueryTableSource x) { @@ -555,7 +581,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { SQLSelectQuery query = x.getSelect().getQuery(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); if (aliasMap != null) { if (x.getAlias() != null) { aliasMap.put(x.getAlias(), null); @@ -577,7 +603,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -632,14 +658,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { accept(x.getQuery()); - String originalTable = currentTableLocal.get(); + String originalTable = getCurrentTable(); - currentTableLocal.set((String) x.getQuery().getAttribute("table")); + setCurrentTable((String) x.getQuery().getAttribute("table")); x.putAttribute("_old_local_", originalTable); accept(x.getOrderBy()); - currentTableLocal.set(originalTable); + setCurrentTable(originalTable); return false; } @@ -655,10 +681,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLUpdateStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); String ident = x.getTableName().toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -667,7 +693,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } stat.incrementUpdateCount(); - Map aliasMap = aliasLocal.get(); + Map aliasMap = getAliasMap(); aliasMap.put(ident, ident); accept(x.getItems()); @@ -677,12 +703,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLDeleteStatement x) { - aliasLocal.set(new HashMap()); + setAliasMap(); setMode(x, Mode.Delete); String ident = x.getTableName().toString(); - currentTableLocal.set(ident); + setCurrentTable(ident); TableStat stat = tableStats.get(ident); if (stat == null) { @@ -717,11 +743,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public void endVisit(SQLDeleteStatement x) { - aliasLocal.set(null); + clearAliasMap(); } public void endVisit(SQLUpdateStatement x) { - aliasLocal.set(null); + clearAliasMap(); } public boolean visit(SQLCreateTableStatement x) { @@ -757,15 +783,15 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - + @Override public boolean visit(SQLCallStatement x) { return false; } - + @Override public void endVisit(SQLCommentStatement x) { - + } @Override diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest4.java index 6b90941938..8a36c9e244 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest4.java @@ -40,19 +40,13 @@ public class OracleBlockTest4 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); - Assert.assertEquals(7, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "job_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest31.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest31.java new file mode 100644 index 0000000000..83bc77b953 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest31.java @@ -0,0 +1,53 @@ +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 OracleSelectTest31 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT e1.last_name FROM employees e1" + // + " WHERE f(" + // + " CURSOR(SELECT e2.hire_date FROM employees e2" + // + " WHERE e1.employee_id = e2.manager_id)," + // + " e1.hire_date) = 1" + // + " ORDER BY last_name;"; // + + 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(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(4, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "last_name"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "hire_date"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "manager_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + + Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}