diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index f955d03796..de06ba04ca 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -185,6 +185,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } public void configFromPropety(Properties properties) { + { + String property = properties.getProperty("druid.name"); + if (property != null) { + this.setName(property); + } + } { String property = properties.getProperty("druid.url"); if (property != null) { diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java index 659d40b344..676a0695b5 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java @@ -96,7 +96,7 @@ public class MySqlExceptionSorter implements ExceptionSorter { Throwable cause = e.getCause(); for (int i = 0; i < 5 && cause != null; ++i) { - if (cause instanceof SocketTimeoutException || cause instanceof IOException) { + if (cause instanceof SocketTimeoutException) { return true; } diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 62c6cbd024..66d0a3a5a9 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -443,7 +443,7 @@ public class PagerUtils { countSelectQuery.setFrom(fromSubquery); SQLSelect countSelect = new SQLSelect(countSelectQuery); - SQLSelectStatement countStmt = new SQLSelectStatement(countSelect); + SQLSelectStatement countStmt = new SQLSelectStatement(countSelect, dbType); return SQLUtils.toSQLString(countStmt, dbType); } diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index f8461ea7f0..fafe4a2871 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -301,7 +301,7 @@ public class SQLUtils { if (j != 0) { visitor.println(); } - visitor.print(comment); + visitor.printComment(comment); } } @@ -317,7 +317,8 @@ public class SQLUtils { List comments = stmt.getBeforeCommentsDirect(); if (comments != null){ for(String comment : comments) { - visitor.println(comment); + visitor.printComment(comment); + visitor.println(); } } } @@ -331,7 +332,7 @@ public class SQLUtils { if (j != 0) { visitor.println(); } - visitor.print(comment); + visitor.printComment(comment); } } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java b/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java index cead4efd85..5259be4807 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.ast; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -50,10 +52,18 @@ public class SQLLimit extends SQLObjectImpl { this.rowCount = rowCount; } + public void setRowCount(int rowCount) { + this.setRowCount(new SQLIntegerExpr(rowCount)); + } + public SQLExpr getOffset() { return offset; } + public void setOffset(int offset) { + this.setOffset(new SQLIntegerExpr(offset)); + } + public void setOffset(SQLExpr offset) { if (offset != null) { offset.setParent(this); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index 85ee174eee..5eb73c3c06 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -53,6 +53,19 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements SQLReplaceable, Seri setLeft(left); setRight(right); this.operator = operator; + + if (dbType == null) { + if (left instanceof SQLBinaryOpExpr) { + dbType = ((SQLBinaryOpExpr) left).dbType; + } + } + + if (dbType == null) { + if (right instanceof SQLBinaryOpExpr) { + dbType = ((SQLBinaryOpExpr) right).dbType; + } + } + this.dbType = dbType; } @@ -392,4 +405,16 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements SQLReplaceable, Seri return false; } + + public SQLExpr other(SQLExpr x) { + if (x == left) { + return right; + } + + if (x == right) { + return left; + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java index 995a63c371..497675ebb7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java @@ -19,6 +19,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLReplaceable; @@ -185,4 +186,28 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, } return false; } + + public boolean match(String owner, String function) { + if (function == null) { + return false; + } + + if (!SQLUtils.nameEquals(function, methodName)) { + return false; + } + + if (owner == null && this.owner == null) { + return true; + } + + if (owner == null || this.owner == null) { + return false; + } + + if (this.owner instanceof SQLIdentifierExpr) { + return SQLUtils.nameEquals(((SQLIdentifierExpr) this.owner).name, owner); + } + + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java index 482ccd3686..261b3b9627 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; @@ -58,6 +59,20 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt super(dbType); } + public String computeName() { + if (tableSource == null) { + return null; + } + + SQLExpr expr = tableSource.getExpr(); + if (expr instanceof SQLName) { + String name = ((SQLName) expr).getSimpleName(); + return SQLUtils.normalize(name); + } + + return null; + } + public boolean isOrReplace() { return orReplace; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index c1922fb75c..6eaf1fbc94 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -79,22 +79,22 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace this.left = left; } - public void setLeft(String tableName) { + public void setLeft(String tableName, String alias) { SQLExprTableSource tableSource; if (tableName == null || tableName.length() == 0) { tableSource = null; } else { - tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName), alias); } this.setLeft(tableSource); } - public void setRight(String tableName) { + public void setRight(String tableName, String alias) { SQLExprTableSource tableSource; if (tableName == null || tableName.length() == 0) { tableSource = null; } else { - tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName), alias); } this.setRight(tableSource); } @@ -228,4 +228,41 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace cloneTo(x); return x; } + + public void reverse() { + SQLTableSource temp = left; + left = right; + right = temp; + + if (left instanceof SQLJoinTableSource) { + ((SQLJoinTableSource) left).reverse(); + } + + if (right instanceof SQLJoinTableSource) { + ((SQLJoinTableSource) right).reverse(); + } + } + + /** + * a inner_join (b inner_join c) -> a inner_join b innre_join c + */ + public void rearrangement() { + if (right instanceof SQLJoinTableSource) { + SQLJoinTableSource rightJoin = (SQLJoinTableSource) right; + + SQLTableSource a = left; + SQLTableSource b = rightJoin.getLeft(); + SQLTableSource c = rightJoin.getRight(); + SQLExpr on_ab = condition; + SQLExpr on_bc = rightJoin.condition; + + setLeft(rightJoin); + rightJoin.setLeft(a); + rightJoin.setRight(b); + rightJoin.setCondition(on_ab); + + setRight(c); + setCondition(on_bc); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index ad800f5a28..a3987ab66b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -162,12 +162,12 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery this.from = from; } - public void setFrom(String tableName) { + public void setFrom(String tableName, String alias) { SQLExprTableSource from; if (tableName == null || tableName.length() == 0) { from = null; } else { - from = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + from = new SQLExprTableSource(new SQLIdentifierExpr(tableName), alias); } this.setFrom(from); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index b80af123f6..014b7fbba4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -250,45 +250,51 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV printSelectList(x.getSelectList()); - if (x.getInto() != null) { + SQLExprTableSource into = x.getInto(); + if (into != null) { println(); print0(ucase ? "INTO " : "into "); - x.getInto().accept(this); + into.accept(this); } - if (x.getFrom() != null) { + SQLTableSource form = x.getFrom(); + if (form != null) { println(); print0(ucase ? "FROM " : "from "); - x.getFrom().accept(this); + form.accept(this); } - if (x.getWhere() != null) { + SQLExpr where = x.getWhere(); + if (where != null) { println(); print0(ucase ? "WHERE " : "where "); - x.getWhere().setParent(x); - x.getWhere().accept(this); + where.accept(this); } printHierarchical(x); - if (x.getGroupBy() != null) { + SQLSelectGroupByClause groupBy = x.getGroupBy(); + if (groupBy != null) { println(); - x.getGroupBy().accept(this); + groupBy.accept(this); } - if (x.getOrderBy() != null) { + SQLOrderBy orderBy = x.getOrderBy(); + if (orderBy != null) { println(); - x.getOrderBy().accept(this); + orderBy.accept(this); } - if (x.getLimit() != null) { + SQLLimit limit = x.getLimit(); + if (limit != null) { println(); - x.getLimit().accept(this); + limit.accept(this); } - if (x.getProcedureName() != null) { + SQLName procedureName = x.getProcedureName(); + if (procedureName != null) { print0(ucase ? " PROCEDURE " : " procedure "); - x.getProcedureName().accept(this); + procedureName.accept(this); if (!x.getProcedureArgumentList().isEmpty()) { print('('); printAndAccept(x.getProcedureArgumentList(), ", "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/FromSubqueryResolver.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/FromSubqueryResolver.java index 50dd875657..fa5750f44f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/FromSubqueryResolver.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/FromSubqueryResolver.java @@ -16,17 +16,21 @@ package com.alibaba.druid.sql.dialect.mysql.visitor.transform; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; import oracle.sql.SQLName; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * @author wenshao[szujobs@hotmail.com] @@ -34,6 +38,9 @@ import java.util.List; public class FromSubqueryResolver extends OracleASTVisitorAdapter { private final List targetList; private final String viewName; + private final Map mappings = new LinkedHashMap(); + + private int viewNameSeed = 1; public FromSubqueryResolver(List targetList, String viewName) { this.targetList = targetList; @@ -50,13 +57,13 @@ public class FromSubqueryResolver extends OracleASTVisitorAdapter { SQLObject parent = x.getParent(); if(parent instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) parent; - queryBlock.setFrom(subViewName); + queryBlock.setFrom(subViewName, x.getAlias()); } else if(parent instanceof SQLJoinTableSource) { SQLJoinTableSource join = (SQLJoinTableSource) parent; if (join.getLeft() == x) { - join.setLeft(subViewName); + join.setLeft(subViewName, x.getAlias()); } else if (join.getRight() == x) { - join.setRight(subViewName); + join.setRight(subViewName, x.getAlias()); } } @@ -64,7 +71,6 @@ public class FromSubqueryResolver extends OracleASTVisitorAdapter { stmt.setName(generateSubViewName()); - SQLSelect select = x.getSelect(); stmt.setSubQuery(select); @@ -75,6 +81,23 @@ public class FromSubqueryResolver extends OracleASTVisitorAdapter { return false; } + public boolean visit(SQLExprTableSource x) { + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; + String ident = identifierExpr.getName(); + String mappingIdent = mappings.get(ident); + if (mappingIdent != null) { + identifierExpr.setName(mappingIdent); + } + } + return false; + } + + public boolean visit(OracleSelectTableReference x) { + return visit((SQLExprTableSource) x); + } + private String generateSubViewName() { return this.viewName + "_" + targetList.size(); } @@ -86,6 +109,28 @@ public class FromSubqueryResolver extends OracleASTVisitorAdapter { String viewName = SQLUtils.normalize(stmt.getName().getSimpleName()); FromSubqueryResolver visitor = new FromSubqueryResolver(targetList, viewName); + + SQLWithSubqueryClause withSubqueryClause = stmt.getSubQuery().getWithSubQuery(); + if (withSubqueryClause != null) { + stmt.getSubQuery().setWithSubQuery(null); + + for (SQLWithSubqueryClause.Entry entry : withSubqueryClause.getEntries()) { + String entryName = entry.getName().getName(); + + SQLCreateViewStatement entryStmt = new SQLCreateViewStatement(); + entryStmt.setDbType(stmt.getDbType()); + + String entryViewName = visitor.generateSubViewName(); + entryStmt.setName(entryViewName); + entryStmt.setSubQuery(entry.getSubQuery()); + + visitor.targetList.add(0, entryStmt); + visitor.mappings.put(entryName, entryViewName); + + entryStmt.accept(visitor); + } + } + stmt.accept(visitor); String dbType = stmt.getDbType(); @@ -95,7 +140,6 @@ public class FromSubqueryResolver extends OracleASTVisitorAdapter { targetStmt.setAfterSemi(true); } - return targetList; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index 6c226253bd..a578c1daf0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -456,22 +456,23 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis printSelectList(x.getSelectList()); - if (x.getFrom() != null) { + SQLTableSource from = x.getFrom(); + if (from != null) { println(); print0(ucase ? "FROM " : "from "); - x.getFrom().accept(this); + from.accept(this); } - if (x.getWhere() != null) { + SQLExpr where = x.getWhere(); + if (where != null) { println(); print0(ucase ? "WHERE " : "where "); - if (x.getWhere().hasBeforeComment() && isPrettyFormat()) { + if (where.hasBeforeComment() && isPrettyFormat()) { printlnComments(x.getWhere().getBeforeCommentsDirect()); } - x.getWhere().setParent(x); - x.getWhere().accept(this); - if (x.getWhere().hasAfterComment() && isPrettyFormat()) { + where.accept(this); + if (where.hasAfterComment() && isPrettyFormat()) { print(' '); printlnComment(x.getWhere().getAfterCommentsDirect()); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectJoin.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectJoin.java index 9cfa59c5a2..0bf7e49f32 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectJoin.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectJoin.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -35,6 +36,9 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect } + public OracleSelectJoin(SQLTableSource left, JoinType joinType, SQLTableSource right, SQLExpr condition){ + super (left, joinType, right, condition); + } public OracleSelectPivotBase getPivot() { return pivot; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index b441816fbc..8a09d9d206 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -241,6 +241,8 @@ public class OracleExprParser extends SQLExprParser { } accept(Token.RPAREN); +// } else if (lexer.token() == Token.RPAREN) { +// return charType; } else if (restrict) { accept(Token.LPAREN); } @@ -1218,6 +1220,12 @@ public class OracleExprParser extends SQLExprParser { continue; } + if (lexer.token() == Token.CACHE) { + lexer.nextToken(); + clause.setCache(true); + continue; + } + if (lexer.token() == Token.KEEP_DUPLICATES) { lexer.nextToken(); clause.setKeepDuplicate(true); 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 dbad76c252..ecbc23465a 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 @@ -142,7 +142,7 @@ public class OracleStatementParser extends SQLStatementParser { } if (lexer.token() == Token.WITH) { - SQLSelectStatement stmt = new SQLSelectStatement(this.createSQLSelectParser().select()); + SQLSelectStatement stmt = new SQLSelectStatement(this.createSQLSelectParser().select(), dbType); stmt.setParent(parent); statementList.add(stmt); continue; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index fcfb17410b..8dccdf244d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -118,42 +118,42 @@ public class SQLExprParser extends SQLParser { if (token == Token.CARET) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BitwiseXor, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BitwiseXor, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.SUBGT) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGt, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGt, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.SUBGTGT) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGtGt, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGtGt, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.POUNDGT) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGt, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGt, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.POUNDGTGT) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGtGt, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGtGt, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.QUESQUES) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesQues, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesQues, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.QUESBAR) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesBar, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesBar, rightExp, dbType); expr = bitXorRest(expr); } else if (token == Token.QUESAMP) { lexer.nextToken(); SQLExpr rightExp = primary(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesAmp, rightExp, getDbType()); + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesAmp, rightExp, dbType); expr = bitXorRest(expr); } @@ -462,7 +462,7 @@ public class SQLExprParser extends SQLParser { SQLCastExpr cast = new SQLCastExpr(); cast.setExpr(expr()); accept(Token.AS); - cast.setDataType(parseDataType()); + cast.setDataType(parseDataType(false)); accept(Token.RPAREN); sqlExpr = cast; @@ -1798,8 +1798,8 @@ public class SQLExprParser extends SQLParser { } public SQLDataType parseDataType(boolean restrict) { - - if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) { + Token token = lexer.token(); + if (token == Token.DEFAULT || token == Token.NOT || token == Token.NULL) { return null; } diff --git a/src/main/java/com/alibaba/druid/sql/repository/Schema.java b/src/main/java/com/alibaba/druid/sql/repository/Schema.java new file mode 100644 index 0000000000..f1e8819bab --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/repository/Schema.java @@ -0,0 +1,372 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.repository; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.statement.*; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; + +/** + * Created by wenshao on 21/07/2017. + */ +public class Schema { + private String name; + + protected final Map objects = new ConcurrentSkipListMap(); + + private final Map functions = new ConcurrentSkipListMap(); + + private final Schema.SchemaVisitor visitor = new Schema.SchemaVisitor(); + + private SchemaRepository repository; + + public Schema(SchemaRepository repository) { + this.repository = repository; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + + public SchemaObject findTable(String tableName) { + String lowerName = tableName.toLowerCase(); + SchemaObject object = objects.get(lowerName); + + if (object != null && object.getType() == SchemaObjectType.Table) { + return object; + } + + return null; + } + + public SchemaObject findTableOrView(String tableName) { + String lowerName = tableName.toLowerCase(); + SchemaObject object = objects.get(lowerName); + + if (object == null) { + return null; + } + + SchemaObjectType type = object.getType(); + if (type == SchemaObjectType.Table || type == SchemaObjectType.View) { + return object; + } + + return null; + } + + public SchemaObject findFunction(String functionName) { + String lowerName = functionName.toLowerCase(); + return functions.get(lowerName); + } + + public void acceptDDL(String ddl, String dbType) { + List stmtList = SQLUtils.parseStatements(ddl, dbType); + for (SQLStatement stmt : stmtList) { + accept(stmt); + } + } + + public void accept(SQLStatement stmt) { + stmt.accept(visitor); + } + + public boolean isSequence(String name) { + SchemaObject object = objects.get(name); + return object != null + && object.getType() == SchemaObjectType.Sequence; + } + + public class SchemaVisitor extends OracleASTVisitorAdapter { + + public boolean visit(SQLDropSequenceStatement x) { + String name = x.getName().getSimpleName(); + objects.remove(name); + return false; + } + + public boolean visit(SQLCreateSequenceStatement x) { + String name = x.getName().getSimpleName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Sequence); + + objects.put(name.toLowerCase(), object); + return false; + } + + public boolean visit(OracleCreateTableStatement x) { + visit((SQLCreateTableStatement) x); + return false; + } + + public boolean visit(SQLCreateTableStatement x) { + String name = x.computeName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Table, x); + + String name_lower = name.toLowerCase(); + if (objects.containsKey(name_lower)) { + return false; + } + objects.put(name_lower, object); + + return false; + } + + public boolean visit(SQLCreateViewStatement x) { + String name = x.computeName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.View, x); + + String name_lower = name.toLowerCase(); + if (objects.containsKey(name_lower)) { + return false; + } + objects.put(name_lower, object); + + return false; + } + + public boolean visit(SQLCreateIndexStatement x) { + String name = x.getName().getSimpleName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Index); + + objects.put(name.toLowerCase(), object); + + return false; + } + + public boolean visit(SQLCreateFunctionStatement x) { + String name = x.getName().getSimpleName(); + SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Function, x); + + functions.put(name.toLowerCase(), object); + + return false; + } + } + + public SchemaObject findTable(SQLTableSource tableSource, String alias) { + if (tableSource instanceof SQLExprTableSource) { + if (alias.equalsIgnoreCase(tableSource.computeAlias())) { + SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; + + SchemaObject tableObject = exprTableSource.getSchemaObject(); + if (tableObject != null) { + return tableObject; + } + + SQLExpr expr = exprTableSource.getExpr(); + if (expr instanceof SQLIdentifierExpr) { + String tableName = ((SQLIdentifierExpr) expr).getName(); + + tableObject = findTable(tableName); + if (tableObject != null) { + exprTableSource.setSchemaObject(tableObject); + } + return tableObject; + } + + if (expr instanceof SQLPropertyExpr) { + String tableName = ((SQLPropertyExpr) expr).getName(); + + tableObject = findTable(tableName); + if (tableObject != null) { + exprTableSource.setSchemaObject(tableObject); + } + return tableObject; + } + } + return null; + } + + if (tableSource instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) tableSource; + SQLTableSource left = join.getLeft(); + + SchemaObject tableObject = findTable(left, alias); + if (tableObject != null) { + return tableObject; + } + + SQLTableSource right = join.getRight(); + tableObject = findTable(right, alias); + return tableObject; + } + + return null; + } + + public SQLColumnDefinition findColumn(SQLTableSource tableSource, SQLSelectItem selectItem) { + if (selectItem == null) { + return null; + } + + return findColumn(tableSource, selectItem.getExpr()); + } + + public SQLColumnDefinition findColumn(SQLTableSource tableSource, SQLExpr expr) { + SchemaObject object = findTable(tableSource, expr); + if (object != null) { + if (expr instanceof SQLAggregateExpr) { + SQLAggregateExpr aggregateExpr = (SQLAggregateExpr) expr; + String function = aggregateExpr.getMethodName(); + if ("min".equalsIgnoreCase(function) + || "max".equalsIgnoreCase(function)) { + SQLExpr arg = aggregateExpr.getArguments().get(0); + expr = arg; + } + } + + if (expr instanceof SQLName) { + return object.findColumn(((SQLName) expr).getSimpleName()); + } + } + + return null; + } + + public SchemaObject findTable(SQLTableSource tableSource, SQLSelectItem selectItem) { + if (selectItem == null) { + return null; + } + + return findTable(tableSource, selectItem.getExpr()); + } + + public SchemaObject findTable(SQLTableSource tableSource, SQLExpr expr) { + if (expr instanceof SQLAggregateExpr) { + SQLAggregateExpr aggregateExpr = (SQLAggregateExpr) expr; + String function = aggregateExpr.getMethodName(); + if ("min".equalsIgnoreCase(function) + || "max".equalsIgnoreCase(function)) { + SQLExpr arg = aggregateExpr.getArguments().get(0); + return findTable(tableSource, arg); + } + } + + if (expr instanceof SQLPropertyExpr) { + String ownerName = ((SQLPropertyExpr) expr).getOwnernName(); + return findTable(tableSource, ownerName); + } + + if (expr instanceof SQLAllColumnExpr || expr instanceof SQLIdentifierExpr) { + if (tableSource instanceof SQLExprTableSource) { + return findTable(tableSource, tableSource.computeAlias()); + } + + if (tableSource instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) tableSource; + + SchemaObject table = findTable(join.getLeft(), expr); + if (table == null) { + table = findTable(join.getRight(), expr); + } + return table; + } + return null; + } + + return null; + } + + public Map getTables(SQLTableSource x) { + Map tables = new LinkedHashMap(); + computeTables(x, tables); + return tables; + } + + protected void computeTables(SQLTableSource x, Map tables) { + if (x == null) { + return; + } + + if (x instanceof SQLExprTableSource) { + SQLExprTableSource exprTableSource = (SQLExprTableSource) x; + + SQLExpr expr = exprTableSource.getExpr(); + if (expr instanceof SQLIdentifierExpr) { + String tableName = ((SQLIdentifierExpr) expr).getName(); + + SchemaObject table = exprTableSource.getSchemaObject(); + if (table == null) { + table = findTable(tableName); + + if (table != null) { + exprTableSource.setSchemaObject(table); + } + } + + if (table != null) { + tables.put(tableName, table); + + String alias = x.getAlias(); + if (alias != null && !alias.equalsIgnoreCase(tableName)) { + tables.put(alias, table); + } + } + } + + return; + } + + if (x instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) x; + computeTables(join.getLeft(), tables); + computeTables(join.getRight(), tables); + } + } + + public int getTableCount() { + int count = 0; + for (SchemaObject object : this.objects.values()) { + if (object.getType() == SchemaObjectType.Table) { + count++; + } + } + return count; + } + + public Map getObjects() { + return this.objects; + } + + public int getViewCount() { + int count = 0; + for (SchemaObject object : this.objects.values()) { + if (object.getType() == SchemaObjectType.View) { + count++; + } + } + return count; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index 85ed6428ee..71d7bec974 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -36,300 +37,150 @@ import java.util.concurrent.ConcurrentSkipListMap; * Created by wenshao on 03/06/2017. */ public class SchemaRepository { - private String name; + private Schema defaultSchema; - private final Map objects = new ConcurrentSkipListMap(); + private Map schemas = new LinkedHashMap(); - private final Map functions = new ConcurrentSkipListMap(); - - private final SchemaVisitor visitor = new SchemaVisitor(); - - public String getName() { - return name; + public String getDefaultSchemaName() { + return getDefaultSchema().getName(); } - public void setName(String name) { - this.name = name; + public void setDefaultSchema(String name) { + if (name == null) { + defaultSchema = null; + return; + } + + String normalizedName = SQLUtils.normalize(name) + .toLowerCase(); + + Schema defaultSchema = schemas.get(normalizedName); + if (defaultSchema != null) { + this.defaultSchema = defaultSchema; + return; + } + + if (defaultSchema == null) { + if (this.defaultSchema != null + && this.defaultSchema.getName() == null) { + this.defaultSchema.setName(name); + + schemas.put(normalizedName, this.defaultSchema); + return; + } + + defaultSchema = new Schema(this); + defaultSchema.setName(name); + schemas.put(normalizedName, defaultSchema); + this.defaultSchema = defaultSchema; + } + } + + public Schema findSchema(String schema) { + if (schema == null) { + return null; + } + + return schemas.get( + SQLUtils.normalize(schema) + .toLowerCase()); + } + + public Schema getDefaultSchema() { + if (defaultSchema == null) { + defaultSchema = new Schema(this); + } + + return defaultSchema; + } + + public void setDefaultSchema(Schema schema) { + this.defaultSchema = schema; } public SchemaObject findTable(String tableName) { - String lowerName = tableName.toLowerCase(); - SchemaObject object = objects.get(lowerName); + return getDefaultSchema().findTable(tableName); + } - if (object != null && object.getType() == SchemaObjectType.Table) { + public SchemaObject findTableOrView(String tableName) { + return findTableOrView(tableName, true); + } + + public SchemaObject findTableOrView(String tableName, boolean onlyCurrent) { + Schema schema = getDefaultSchema(); + + SchemaObject object = schema.findTableOrView(tableName); + if (object != null) { return object; } + for (Schema s : this.schemas.values()) { + if (s == schema) { + continue; + } + + object = schema.findTableOrView(tableName); + if (object != null) { + return object; + } + } + return null; } + public Collection getSchemas() { + return schemas.values(); + } + public SchemaObject findFunction(String functionName) { - String lowerName = functionName.toLowerCase(); - return functions.get(lowerName); + return getDefaultSchema().findFunction(functionName); } public void acceptDDL(String ddl, String dbType) { - List stmtList = SQLUtils.parseStatements(ddl, dbType); - for (SQLStatement stmt : stmtList) { - accept(stmt); - } + getDefaultSchema().acceptDDL(ddl, dbType); } public void accept(SQLStatement stmt) { - stmt.accept(visitor); + getDefaultSchema().accept(stmt); } public boolean isSequence(String name) { - SchemaObject object = objects.get(name); - return object != null - && object.getType() == SchemaObjectType.Sequence; - } - - public class SchemaVisitor extends OracleASTVisitorAdapter { - - public boolean visit(SQLDropSequenceStatement x) { - String name = x.getName().getSimpleName(); - objects.remove(name); - return false; - } - - public boolean visit(SQLCreateSequenceStatement x) { - String name = x.getName().getSimpleName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Sequence); - - objects.put(name.toLowerCase(), object); - return false; - } - - public boolean visit(OracleCreateTableStatement x) { - visit((SQLCreateTableStatement) x); - return false; - } - - public boolean visit(SQLCreateTableStatement x) { - String name = x.computeName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Table, x); - - String name_lower = name.toLowerCase(); - if (objects.containsKey(name_lower)) { - return false; - } - objects.put(name_lower, object); - - return false; - } - - public boolean visit(SQLCreateIndexStatement x) { - String name = x.getName().getSimpleName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Index); - - objects.put(name.toLowerCase(), object); - - return false; - } - - public boolean visit(SQLCreateFunctionStatement x) { - String name = x.getName().getSimpleName(); - SchemaObject object = new SchemaObjectImpl(name, SchemaObjectType.Function, x); - - functions.put(name.toLowerCase(), object); - - return false; - } + return getDefaultSchema().isSequence(name); } public SchemaObject findTable(SQLTableSource tableSource, String alias) { - if (tableSource instanceof SQLExprTableSource) { - if (alias.equalsIgnoreCase(tableSource.computeAlias())) { - SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource; - - SchemaObject tableObject = exprTableSource.getSchemaObject(); - if (tableObject != null) { - return tableObject; - } - - SQLExpr expr = exprTableSource.getExpr(); - if (expr instanceof SQLIdentifierExpr) { - String tableName = ((SQLIdentifierExpr) expr).getName(); - - tableObject = findTable(tableName); - if (tableObject != null) { - exprTableSource.setSchemaObject(tableObject); - } - return tableObject; - } - - if (expr instanceof SQLPropertyExpr) { - String tableName = ((SQLPropertyExpr) expr).getName(); - - tableObject = findTable(tableName); - if (tableObject != null) { - exprTableSource.setSchemaObject(tableObject); - } - return tableObject; - } - } - return null; - } - - if (tableSource instanceof SQLJoinTableSource) { - SQLJoinTableSource join = (SQLJoinTableSource) tableSource; - SQLTableSource left = join.getLeft(); - - SchemaObject tableObject = findTable(left, alias); - if (tableObject != null) { - return tableObject; - } - - SQLTableSource right = join.getRight(); - tableObject = findTable(right, alias); - return tableObject; - } - - return null; + return getDefaultSchema().findTable(tableSource, alias); } public SQLColumnDefinition findColumn(SQLTableSource tableSource, SQLSelectItem selectItem) { - if (selectItem == null) { - return null; - } - - return findColumn(tableSource, selectItem.getExpr()); + return getDefaultSchema().findColumn(tableSource, selectItem); } public SQLColumnDefinition findColumn(SQLTableSource tableSource, SQLExpr expr) { - SchemaObject object = findTable(tableSource, expr); - if (object != null) { - if (expr instanceof SQLAggregateExpr) { - SQLAggregateExpr aggregateExpr = (SQLAggregateExpr) expr; - String function = aggregateExpr.getMethodName(); - if ("min".equalsIgnoreCase(function) - || "max".equalsIgnoreCase(function)) { - SQLExpr arg = aggregateExpr.getArguments().get(0); - expr = arg; - } - } - - if (expr instanceof SQLName) { - return object.findColumn(((SQLName) expr).getSimpleName()); - } - } - - return null; + return getDefaultSchema().findColumn(tableSource, expr); } public SchemaObject findTable(SQLTableSource tableSource, SQLSelectItem selectItem) { - if (selectItem == null) { - return null; - } - - return findTable(tableSource, selectItem.getExpr()); + return getDefaultSchema().findTable(tableSource, selectItem); } public SchemaObject findTable(SQLTableSource tableSource, SQLExpr expr) { - if (expr instanceof SQLAggregateExpr) { - SQLAggregateExpr aggregateExpr = (SQLAggregateExpr) expr; - String function = aggregateExpr.getMethodName(); - if ("min".equalsIgnoreCase(function) - || "max".equalsIgnoreCase(function)) { - SQLExpr arg = aggregateExpr.getArguments().get(0); - return findTable(tableSource, arg); - } - } - - if (expr instanceof SQLPropertyExpr) { - String ownerName = ((SQLPropertyExpr) expr).getOwnernName(); - return findTable(tableSource, ownerName); - } - - if (expr instanceof SQLAllColumnExpr || expr instanceof SQLIdentifierExpr) { - if (tableSource instanceof SQLExprTableSource) { - return findTable(tableSource, tableSource.computeAlias()); - } - - if (tableSource instanceof SQLJoinTableSource) { - SQLJoinTableSource join = (SQLJoinTableSource) tableSource; - - SchemaObject table = findTable(join.getLeft(), expr); - if (table == null) { - table = findTable(join.getRight(), expr); - } - return table; - } - return null; - } - - return null; + return getDefaultSchema().findTable(tableSource, expr); } public Map getTables(SQLTableSource x) { - Map tables = new LinkedHashMap(); - computeTables(x, tables); - return tables; - } - - private void computeTables(SQLTableSource x, Map tables) { - if (x == null) { - return; - } - - if (x instanceof SQLExprTableSource) { - SQLExprTableSource exprTableSource = (SQLExprTableSource) x; - - SQLExpr expr = exprTableSource.getExpr(); - if (expr instanceof SQLIdentifierExpr) { - String tableName = ((SQLIdentifierExpr) expr).getName(); - - SchemaObject table = exprTableSource.getSchemaObject(); - if (table == null) { - table = findTable(tableName); - - if (table != null) { - exprTableSource.setSchemaObject(table); - } - } - - if (table != null) { - tables.put(tableName, table); - - String alias = x.getAlias(); - if (alias != null && !alias.equalsIgnoreCase(tableName)) { - tables.put(alias, table); - } - } - } - - return; - } - - if (x instanceof SQLJoinTableSource) { - SQLJoinTableSource join = (SQLJoinTableSource) x; - computeTables(join.getLeft(), tables); - computeTables(join.getRight(), tables); - } + return getDefaultSchema().getTables(x); } public int getTableCount() { - int count = 0; - for (SchemaObject object : this.objects.values()) { - if (object.getType() == SchemaObjectType.Table) { - count++; - } - } - return count; + return getDefaultSchema().getTableCount(); } public Map getObjects() { - return this.objects; + return getDefaultSchema().getObjects(); } public int getViewCount() { - int count = 0; - for (SchemaObject object : this.objects.values()) { - if (object.getType() == SchemaObjectType.View) { - count++; - } - } - return count; + return getDefaultSchema().getViewCount(); } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java index f571bb0723..d427a1aad0 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -134,7 +134,9 @@ public final class ExportParameterVisitorUtils { } public static void exportParameter(final List parameters, SQLBinaryOpExpr x) { - if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr && x.getOperator().isRelational()) { + if (x.getLeft() instanceof SQLLiteralExpr + && x.getRight() instanceof SQLLiteralExpr + && x.getOperator().isRelational()) { return; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 7a9b6f7842..7923d190d5 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -697,15 +697,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return false; } - if (x.getText() == null) { + printChars(x.getText()); + + return false; + } + + protected void printChars(String text) { + if (text == null) { print0(ucase ? "NULL" : "null"); } else { print('\''); - print0(x.getText().replaceAll("'", "''")); + print0(text.replaceAll("'", "''")); print('\''); } - - return false; } public boolean visit(SQLDataType x) { @@ -884,39 +888,49 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (this.parameterized) { List targetList = x.getTargetList(); - boolean changed = true; - if (targetList.size() == 1 && targetList.get(0) instanceof SQLVariantRefExpr) { - changed = false; - } - - x.getExpr().accept(this); - - if (x.isNot()) { - print(isUppCase() ? " NOT IN (?)" : " not in (?)"); - } else { - print(isUppCase() ? " IN (?)" : " in (?)"); - } - - if (changed) { - incrementReplaceCunt(); - if(this instanceof ExportParameterVisitor || this.parameters != null) { - if (parameterizedMergeInList) { - List subList = new ArrayList(x.getTargetList().size()); - for (SQLExpr target : x.getTargetList()) { - ExportParameterVisitorUtils.exportParameter(subList, target); - } - if (subList != null) { - parameters.add(subList); - } - } else { - for (SQLExpr target : x.getTargetList()) { - ExportParameterVisitorUtils.exportParameter(this.parameters, target); - } - } + boolean allLiteral = true; + for (SQLExpr item : targetList) { + if (!(item instanceof SQLLiteralExpr || item instanceof SQLVariantRefExpr)) { + allLiteral = false; + break; } } - return false; + if (allLiteral) { + boolean changed = true; + if (targetList.size() == 1 && targetList.get(0) instanceof SQLVariantRefExpr) { + changed = false; + } + + x.getExpr().accept(this); + + if (x.isNot()) { + print(isUppCase() ? " NOT IN (?)" : " not in (?)"); + } else { + print(isUppCase() ? " IN (?)" : " in (?)"); + } + + if (changed) { + incrementReplaceCunt(); + if (this instanceof ExportParameterVisitor || this.parameters != null) { + if (parameterizedMergeInList) { + List subList = new ArrayList(x.getTargetList().size()); + for (SQLExpr target : x.getTargetList()) { + ExportParameterVisitorUtils.exportParameter(subList, target); + } + if (subList != null) { + parameters.add(subList); + } + } else { + for (SQLExpr target : x.getTargetList()) { + ExportParameterVisitorUtils.exportParameter(this.parameters, target); + } + } + } + } + + return false; + } } x.getExpr().accept(this); @@ -962,19 +976,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLIntegerExpr x) { int val = x.getNumber().intValue(); - if (val == 1 - && JdbcConstants.ORACLE.equals(dbType)) { - SQLObject parent = x.getParent(); - if (parent instanceof SQLBinaryOpExpr) { - SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) parent; - SQLExpr left = binaryOpExpr.getLeft(); - SQLBinaryOperator op = binaryOpExpr.getOperator(); - if (left instanceof SQLIdentifierExpr - && op == SQLBinaryOperator.Equality) { - String name = ((SQLIdentifierExpr) left).getName(); - if ("rownum".equals(name)) { - print(1); - return false; + SQLObject parent = x.getParent(); + + if (val == 1) { + if (JdbcConstants.ORACLE.equals(dbType)) { + if (parent instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) parent; + SQLExpr left = binaryOpExpr.getLeft(); + SQLBinaryOperator op = binaryOpExpr.getOperator(); + if (left instanceof SQLIdentifierExpr + && op == SQLBinaryOperator.Equality) { + String name = ((SQLIdentifierExpr) left).getName(); + if ("rownum".equals(name)) { + print(1); + return false; + } } } } @@ -1015,14 +1031,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet SQLExpr param = x.getParameters().get(i); if (parameterized) { - if (JdbcUtils.ORACLE.equalsIgnoreCase(dbType)) { - if (size == 2 && i == 1 && param instanceof SQLCharExpr) { + if (size == 2 && i == 1 && param instanceof SQLCharExpr) { + if (JdbcUtils.ORACLE.equals(dbType)) { if ("TO_CHAR".equalsIgnoreCase(function) || "TO_DATE".equalsIgnoreCase(function)) { - param.putAttribute(ParameterizedOutputVisitorUtils.ATTR_PARAMS_SKIP, true); + printChars(((SQLCharExpr) param).getText()); + continue; + } + } else if (JdbcConstants.MYSQL.equals(dbType)) { + if ("DATE_FORMAT".equalsIgnoreCase(function)) { + printChars(((SQLCharExpr) param).getText()); + continue; } } } + } if (param instanceof SQLBinaryOpExpr) { @@ -3427,16 +3450,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (i != 0 && comment.startsWith("--")) { println(); } - print0(comment); + + printComment(comment); } } } + public void printComment(String comment) { + if (comment.startsWith("--") && comment.length() > 2 && comment.charAt(2) != ' ') { + print0("-- "); + print0(comment.substring(2)); + } else { + print0(comment); + } + } + protected void printlnComments(List comments) { if (comments != null) { for (int i = 0; i < comments.size(); ++i) { String comment = comments.get(i); - print0(comment); + printComment(comment); println(); } } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 6c080c1c67..ab9650f8ed 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -34,14 +34,7 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Enumeration; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; +import java.util.*; /** * @author wenshao [szujobs@hotmail.com] @@ -629,6 +622,10 @@ public final class JdbcUtils implements JdbcConstants { } } + public static void execute(Connection conn, String sql) throws SQLException { + execute(conn, sql, Collections.emptyList()); + } + public static void execute(Connection conn, String sql, List parameters) throws SQLException { PreparedStatement stmt = null; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlError_test_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlError_test_3.java index fee8aa11e7..7a9e7d8562 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlError_test_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlError_test_3.java @@ -39,6 +39,6 @@ public class MySqlError_test_3 extends MysqlTest { Assert.assertNotNull(error); // error.printStackTrace(); - Assert.assertEquals("syntax error, error in :'us = LIMIT ?, ?',expect QUES, actual QUES LIMIT", error.getMessage()); + Assert.assertEquals("syntax error, error in :'us = LIMIT ?, ?',expect QUES, actual QUES pos 248, line 1, column 247, token QUES", error.getMessage()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_44.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_44.java new file mode 100644 index 0000000000..c5dadaadd9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_44.java @@ -0,0 +1,61 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_44 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "select 1 from a where c1 in (date_format(date_add(curdate(), INTERVAL -7 DAY), '%Y%m%d'))"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("SELECT ?\n" + + "FROM a\n" + + "WHERE c1 IN (date_format(date_add(curdate(), INTERVAL ? DAY), '%Y%m%d'))", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[1,-7]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT 1\n" + + "FROM a\n" + + "WHERE c1 IN (date_format(date_add(curdate(), INTERVAL -7 DAY), '%Y%m%d'))", rsql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_2.java new file mode 100644 index 0000000000..89ad6039d6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_2.java @@ -0,0 +1,86 @@ +package com.alibaba.druid.bvt.sql.mysql.transform; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.transform.FromSubqueryResolver; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by wenshao on 16/07/2017. + */ +public class Trans_CreateView_2 extends TestCase { + public void test_createView() throws Exception { + String sql = "CREATE OR REPLACE VIEW \"AUTH\".\"HR_DEPTEMP_VIEW\" (\n" + + "\t\"MY_PK\", \n" + + "\t\"FK_EMP\", \n" + + "\t\"FK_DEPT\", \n" + + "\t\"FK_DUTY\", \n" + + "\t\"DUTYLEVEL\", \n" + + "\t\"LEADER\", \n" + + "\t\"DEPT\", \n" + + "\t\"STORENO\", \n" + + "\t\"AREA\", \n" + + "\t\"TYPE\"\n" + + ")\n" + + "AS\n" + + "WITH struct AS (\n" + + "\t\tSELECT d.code AS dept, s.code AS storeno, a.code AS area, 'S' AS type\n" + + "\t\tFROM (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'A'\n" + + "\t\t) a, (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'S'\n" + + "\t\t) s, (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'D'\n" + + "\t\t) d\n" + + "\t\tWHERE d.sjcode = s.code\n" + + "\t\t\tAND s.sjcode = a.code\n" + + "\t\tUNION\n" + + "\t\tSELECT d.code AS dept, NULL AS storeno, a.code AS area, 'A' AS type\n" + + "\t\tFROM (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'A'\n" + + "\t\t) a, (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'D'\n" + + "\t\t) d\n" + + "\t\tWHERE d.sjcode = a.code\n" + + "\t\tUNION\n" + + "\t\tSELECT d.code AS dept, NULL AS storeno, g.code AS area, 'G' AS type\n" + + "\t\tFROM (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'G'\n" + + "\t\t) g, (\n" + + "\t\t\tSELECT code, name, sjcode\n" + + "\t\t\tFROM hr_structure\n" + + "\t\t\tWHERE type = 'D'\n" + + "\t\t) d\n" + + "\t\tWHERE d.sjcode = g.code\n" + + "\t)\n" + + "SELECT \"MY_PK\", \"FK_EMP\", \"FK_DEPT\", \"FK_DUTY\", \"DUTYLEVEL\"\n" + + "\t, \"LEADER\", \"DEPT\", \"STORENO\", \"AREA\", \"TYPE\"\n" + + "FROM hr_deptemp t1, struct t2\n" + + "WHERE t1.FK_DEPT = t2.dept"; + + List stmtList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + assertEquals(1, stmtList.size()); + + SQLStatement stmt = stmtList.get(0); + List targetList = FromSubqueryResolver.resolve((SQLCreateViewStatement) stmt); + String targetSql = SQLUtils.toSQLString(targetList, JdbcConstants.ORACLE); + assertEquals(9, targetList.size()); + System.out.println(targetSql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest12.java index ad78274349..7f3736ea24 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest12.java @@ -10,7 +10,7 @@ public class OdpsFormatCommentTest12 extends TestCase { public void test_column_comment() throws Exception { String sql = "select * from t --abc"; Assert.assertEquals("SELECT *" // - + "\nFROM t --abc", SQLUtils.formatOdps(sql)); + + "\nFROM t -- abc", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest14.java index c999d2cf8b..b0b724ed9a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest14.java @@ -22,13 +22,13 @@ public class OdpsFormatCommentTest14 extends TestCase { Assert.assertEquals("SELECT *" + "\nFROM (" + "\n\tSELECT 1" - + "\n\tFROM t1 --c_0" + + "\n\tFROM t1 -- c_0" + "\n\tUNION ALL" - + "\n\t--c_1" + + "\n\t-- c_1" + "\n\tSELECT 2" - + "\n\tFROM t2 --c_2" + + "\n\tFROM t2 -- c_2" + "\n\tUNION ALL" - + "\n\t--c_3" + + "\n\t-- c_3" + "\n\tSELECT 3" + "\n\tFROM t3" + "\n) xx", SQLUtils.formatOdps(sql)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest17.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest17.java index 950461457e..b1d541a72f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest17.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest17.java @@ -9,7 +9,7 @@ import junit.framework.TestCase; public class OdpsFormatCommentTest17 extends TestCase { public void test_column_comment() throws Exception { String sql = "set xxx=aaa;--ssss"; - Assert.assertEquals("SET xxx = aaa;--ssss", SQLUtils.formatOdps(sql)); + Assert.assertEquals("SET xxx = aaa;-- ssss", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest19.java index dd5158ba31..efaf714c45 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest19.java @@ -10,7 +10,7 @@ public class OdpsFormatCommentTest19 extends TestCase { public void test_column_comment() throws Exception { String sql = "set xxx=aaa;--ssss" + "\nset yyy=123;"; - Assert.assertEquals("SET xxx = aaa;--ssss" + Assert.assertEquals("SET xxx = aaa;-- ssss" + "\nSET yyy = 123;", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java index d91ef9ddee..f6a717fc2c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest2.java @@ -14,10 +14,10 @@ public class OdpsFormatCommentTest2 extends TestCase { + "\n--[Update ]"// + "\nset odps.sql.mapper.split.size=2048;"// + "\nselect * from dual;"; - Assert.assertEquals("--[Subject -]" - + "\n--[Author -高铁/035139]" - + "\n--[Created -2015-06-10 13:19:18]" - + "\n--[Update ]" + Assert.assertEquals("-- [Subject -]" + + "\n-- [Author -高铁/035139]" + + "\n-- [Created -2015-06-10 13:19:18]" + + "\n-- [Update ]" + "\nSET odps.sql.mapper.split.size = 2048;" + "\n" // + "\nSELECT *" diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest29.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest29.java index ca61a5c7d1..de19f79f7a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest29.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest29.java @@ -12,9 +12,9 @@ public class OdpsFormatCommentTest29 extends TestCase { + "\ncol string, --测试2" + "\ncol2 string --测试3" + "\n)"; - Assert.assertEquals("CREATE TABLE xxxx001 ( --测试" - + "\n\tcol STRING, --测试2" - + "\n\tcol2 STRING --测试3" + Assert.assertEquals("CREATE TABLE xxxx001 ( -- 测试" + + "\n\tcol STRING, -- 测试2" + + "\n\tcol2 STRING -- 测试3" + "\n)", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java index c1fd5893d0..6f6f77fb66 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java @@ -14,7 +14,7 @@ public class OdpsFormatCommentTest30 extends TestCase { + "\n asdasd STRING," + "\n asasd STRING" + "\n);"; - Assert.assertEquals("--啊实打实大啊实打实大" + Assert.assertEquals("-- 啊实打实大啊实打实大" + "\nCREATE TABLE xxx (" + "\n\taa STRING," + "\n\tasdasd STRING," diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java index bad8a77e6e..17dc4934fd 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java @@ -12,7 +12,7 @@ public class OdpsFormatCommentTest7 extends TestCase { + "\nselect * from table1;" // + "\nselect * from table2;;" ;// - Assert.assertEquals("--这里是注释" + Assert.assertEquals("-- 这里是注释" + "\nSELECT *" + "\nFROM table1;" + "\n" diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java index 4c523eabcd..dd79f17ada 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java @@ -16,22 +16,22 @@ public class OdpsFormatCommentTest8 extends TestCase { Assert.assertEquals("SELECT *" + "\nFROM table1;" + "\n" - + "\n--comment1 goes here" + + "\n-- comment1 goes here" + "\nSELECT *" + "\nFROM table2;" + "\n" + "\nSELECT *" - + "\nFROM table3;--comment2 goes here", SQLUtils.formatOdps(sql)); + + "\nFROM table3;-- comment2 goes here", SQLUtils.formatOdps(sql)); Assert.assertEquals("select *" + "\nfrom table1;" + "\n" - + "\n--comment1 goes here" + + "\n-- comment1 goes here" + "\nselect *" + "\nfrom table2;" + "\n" + "\nselect *" - + "\nfrom table3;--comment2 goes here", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + "\nfrom table3;-- comment2 goes here", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest29.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest29.java index 6c9214eb08..fd82fc869d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest29.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest29.java @@ -32,13 +32,13 @@ public class OdpsSelectTest29 extends TestCase { "--hhhhh\n" + "FROM emp e\n" + "LEFT OUTER JOIN emp_datahub";// - assertEquals("--aaaaa\n" + - "SELECT * --hhhhh\n" + + assertEquals("-- aaaaa\n" + + "SELECT * -- hhhhh\n" + "FROM emp e\n" + "LEFT OUTER JOIN emp_datahub", SQLUtils.formatOdps(sql)); - assertEquals("--aaaaa\n" + - "select * --hhhhh\n" + + assertEquals("-- aaaaa\n" + + "select * -- hhhhh\n" + "from emp e\n" + "left outer join emp_datahub", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest20.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest20.java index dfaabb1ea1..87be719e22 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest20.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest20.java @@ -51,7 +51,7 @@ public class OracleAlterTableTest20 extends OracleTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals("ALTER TABLE sales" // - + "\n\tADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DIABLE;", // + + "\n\tADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DISABLE;", // SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); Assert.assertEquals(1, visitor.getTables().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest22.java index cb5f5b95e8..0eef645a54 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/alter/OracleAlterTableTest22.java @@ -52,7 +52,7 @@ public class OracleAlterTableTest22 extends OracleTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals("ALTER TABLE employees" // - + "\n\tADD CONSTRAINT check_comp CHECK (salary + commission_pct * salary <= 5000) DIABLE;", // + + "\n\tADD CONSTRAINT check_comp CHECK (salary + commission_pct * salary <= 5000) DISABLE;", // SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); Assert.assertEquals(1, visitor.getTables().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest73.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest73.java deleted file mode 100644 index 47b85154cb..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest73.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 1999-2017 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.bvt.sql.oracle.create; - -import com.alibaba.druid.sql.OracleTest; -import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.util.JdbcConstants; - -import java.util.List; - -public class OracleCreateTableTest73 extends OracleTest { - - public void test_types() throws Exception { - String sql = // - "CREATE TABLE \"RDB\".\"RDB_DATA_HIST\" \n" + - " (\t\"TABLE_ID\" NUMBER, \n" + - "\t\"EVENT_TYPE\" VARCHAR2(1), \n" + - "\t\"PK_DATA\" VARCHAR2(64), \n" + - "\t\"TRANSACTION_ID\" NUMBER, \n" + - "\t\"IGNORE_NODE_CLUSTER_ID\" VARCHAR2(32), \n" + - "\t\"GMT_CREATE\" DATE, \n" + - "\t\"ID\" NUMBER\n" + - " ) PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING \n" + - " STORAGE(\n" + - " BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" \n" + - " PARTITION BY RANGE (\"GMT_CREATE\") \n" + - " (PARTITION \"AUTO_P_2012_06_01\" VALUES LESS THAN (TO_DATE(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_07_01\" VALUES LESS THAN (TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_08_01\" VALUES LESS THAN (TO_DATE(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_09_01\" VALUES LESS THAN (TO_DATE(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_10_01\" VALUES LESS THAN (TO_DATE(' 2012-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_11_01\" VALUES LESS THAN (TO_DATE(' 2012-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2012_12_01\" VALUES LESS THAN (TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2013_01_01\" VALUES LESS THAN (TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2013_02_01\" VALUES LESS THAN (TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" + - " PARTITION \"AUTO_P_2013_03_01\" VALUES LESS THAN (TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" + - " PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" + - " TABLESPACE \"BISYNC1M\" NOCOM"; - - List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); - SQLStatement stmt = statementList.get(0); - print(statementList); - - assertEquals(1, statementList.size()); -// - assertEquals("CREATE GLOBAL TEMPORARY TABLE \"RETL\".\"REFFERAL_MEMBER\" (\n" + - "\t\"ID\" NUMBER NOT NULL ENABLE,\n" + - "\t\"GMT_CREATE\" DATE NOT NULL ENABLE,\n" + - "\t\"GMT_MODIFIED\" DATE NOT NULL ENABLE,\n" + - "\t\"FROM_NAME\" VARCHAR2(128) NOT NULL ENABLE,\n" + - "\t\"FROM_EMAIL\" VARCHAR2(128) NOT NULL ENABLE,\n" + - "\t\"TO_NAME\" VARCHAR2(128),\n" + - "\t\"TO_EMAIL\" VARCHAR2(128) NOT NULL ENABLE,\n" + - "\t\"MESSAGE\" VARCHAR2(512),\n" + - "\t\"GMT_JOIN_MEMBER\" DATE,\n" + - "\t\"SOURCE_CODE\" VARCHAR2(32) NOT NULL ENABLE,\n" + - "\t\"IS_FROM_MEMBER\" CHAR(1) NOT NULL ENABLE,\n" + - "\t\"IS_JOIN\" CHAR(1) NOT NULL ENABLE\n" + - ")\n" + - "ON COMMIT DELETE ROWS",// - SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); -// -// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); -// stmt.accept(visitor); -// -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); -// System.out.println("coditions : " + visitor.getConditions()); -// System.out.println("relationships : " + visitor.getRelationships()); -// System.out.println("orderBy : " + visitor.getOrderByColumns()); -// -// assertEquals(1, visitor.getTables().size()); -// -// assertEquals(3, visitor.getColumns().size()); -// -// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); - } -} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest75.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest75.java new file mode 100644 index 0000000000..585c83c65b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest75.java @@ -0,0 +1,138 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest75 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE \"CMIS\".\"DR$IDX_FULL_BIZ_TABLE_NAME$R\" \n" + + " (\t\"ROW_NO\" NUMBER(3,0), \n" + + "\t\"DATA\" BLOB, \n" + + "\t CONSTRAINT \"DRC$IDX_FULL_BIZ_TABLE_NAME$R\" PRIMARY KEY (\"ROW_NO\")\n" + + " USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 \n" + + " STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + + " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" + + " BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n" + + " TABLESPACE \"CMISTBS\" ENABLE\n" + + " ) SEGMENT CREATION IMMEDIATE \n" + + " PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + + " NOCOMPRESS LOGGING\n" + + " STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + + " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" + + " BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n" + + " TABLESPACE \"CMISTBS\" \n" + + " LOB (\"DATA\") STORE AS BASICFILE (\n" + + " TABLESPACE \"CMISTBS\" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION \n" + + " CACHE \n" + + " STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + + " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" + + " BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) \n" + + " MONITORING "; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE \"CMIS\".\"DR$IDX_FULL_BIZ_TABLE_NAME$R\" (\n" + + "\t\"ROW_NO\" NUMBER(3, 0),\n" + + "\t\"DATA\" BLOB,\n" + + "\tCONSTRAINT \"DRC$IDX_FULL_BIZ_TABLE_NAME$R\" PRIMARY KEY (\"ROW_NO\")\n" + + "\t\tUSING INDEX\n" + + "\t\tPCTFREE 10\n" + + "\t\tINITRANS 2\n" + + "\t\tMAXTRANS 255\n" + + "\t\tTABLESPACE \"CMISTBS\"\n" + + "\t\tSTORAGE (\n" + + "\t\t\tINITIAL 65536\n" + + "\t\t\tNEXT 1048576\n" + + "\t\t\tMINEXTENTS 1\n" + + "\t\t\tMAXEXTENTS 2147483645\n" + + "\t\t\tPCTINCREASE 0\n" + + "\t\t\tFREELISTS 1\n" + + "\t\t\tFREELIST GROUPS 1\n" + + "\t\t\tBUFFER_POOL DEFAULT\n" + + "\t\t\tFLASH_CACHE DEFAULT\n" + + "\t\t\tCELL_FLASH_CACHE DEFAULT\n" + + "\t\t)\n" + + "\t\tENABLE\n" + + ")\n" + + "PCTFREE 10\n" + + "PCTUSED 40\n" + + "INITRANS 1\n" + + "MAXTRANS 255\n" + + "NOCOMPRESS\n" + + "LOGGING\n" + + "TABLESPACE \"CMISTBS\"\n" + + "STORAGE (\n" + + "\tINITIAL 65536\n" + + "\tNEXT 1048576\n" + + "\tMINEXTENTS 1\n" + + "\tMAXEXTENTS 2147483645\n" + + "\tPCTINCREASE 0\n" + + "\tFREELISTS 1\n" + + "\tFREELIST GROUPS 1\n" + + "\tBUFFER_POOL DEFAULT\n" + + "\tFLASH_CACHE DEFAULT\n" + + "\tCELL_FLASH_CACHE DEFAULT\n" + + ")\n" + + "LOB (\"DATA\") STORE AS BASICFILE (\n" + + "\tTABLESPACE \"CMISTBS\"\n" + + "\tSTORAGE (\n" + + "\t\tINITIAL 65536\n" + + "\t\tNEXT 1048576\n" + + "\t\tMINEXTENTS 1\n" + + "\t\tMAXEXTENTS 2147483645\n" + + "\t\tPCTINCREASE 0\n" + + "\t\tFREELISTS 1\n" + + "\t\tFREELIST GROUPS 1\n" + + "\t\tBUFFER_POOL DEFAULT\n" + + "\t\tFLASH_CACHE DEFAULT\n" + + "\t\tCELL_FLASH_CACHE DEFAULT\n" + + "\t)\n" + + "\tENABLE STORAGE IN ROW\n" + + "\tCHUNK 8192\n" + + "\tCACHE\n" + + "\tRETENTION\n" + + ")\n" + + "MONITORING",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); +// stmt.accept(visitor); +// +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("relationships : " + visitor.getRelationships()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); +// +// assertEquals(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest8.java index 3b6066cc51..2cfec5a52a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest8.java @@ -46,7 +46,7 @@ public class OracleCreateViewTest8 extends OracleTest { "\temp_id, \n" + "\tlast_name, \n" + "\temail UNIQUE, \n" + - "\tCONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DIABLE NOVALIDATE\n" + + "\tCONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DISABLE NOVALIDATE\n" + ")\n" + "AS\n" + "SELECT employee_id, last_name, email\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest70.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest70.java new file mode 100644 index 0000000000..6af3530733 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest70.java @@ -0,0 +1,78 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest70 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT CAST(a.nsrdzdah AS char)\n" + + "FROM DJ_NSRXX_DZB a\n" + + "\tINNER JOIN DJ_NSRXX b ON a.nsrdzdah = b.nsrdzdah\n" + + "\tINNER JOIN DM_SWJG c ON b.nsr_swjg_dm = c.swjg_dm\n" + + "WHERE (a.nsrsbh_old = ?\n" + + "\t\tOR a.nsrsbh_new = ?)\n" + + "\tAND b.nsrzt_dm <= ?\n" + + "\tAND c.JBDM LIKE ?\n" + + "\tAND rownum = 1"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(3, visitor.getTables().size()); + + assertEquals(8, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT CAST(a.nsrdzdah AS char)\n" + + "FROM DJ_NSRXX_DZB a\n" + + "INNER JOIN DJ_NSRXX b ON a.nsrdzdah = b.nsrdzdah \n" + + "\tINNER JOIN DM_SWJG c ON b.nsr_swjg_dm = c.swjg_dm \n" + + "WHERE (a.nsrsbh_old = ?\n" + + "\t\tOR a.nsrsbh_new = ?)\n" + + "\tAND b.nsrzt_dm <= ?\n" + + "\tAND c.JBDM LIKE ?\n" + + "\tAND rownum = 1", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}