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 b717cc6250..482ccd3686 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 @@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -77,6 +78,10 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt this.setTableSource(new SQLExprTableSource(name)); } + public void setName(String name) { + this.setName(new SQLIdentifierExpr(name)); + } + public SQLExprTableSource getTableSource() { return tableSource; } 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 cfa9b4460a..f57f82e872 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 @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLReplaceable; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplaceable { @@ -78,6 +79,26 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace this.left = left; } + public void setLeft(String tableName) { + SQLExprTableSource tableSource; + if (tableName == null || tableName.length() == 0) { + tableSource = null; + } else { + tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + } + this.setLeft(tableSource); + } + + public void setRight(String tableName) { + SQLExprTableSource tableSource; + if (tableName == null || tableName.length() == 0) { + tableSource = null; + } else { + tableSource = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + } + this.setRight(tableSource); + } + public SQLTableSource getRight() { return this.right; } 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 66dda452c6..ad800f5a28 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,6 +162,16 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery this.from = from; } + public void setFrom(String tableName) { + SQLExprTableSource from; + if (tableName == null || tableName.length() == 0) { + from = null; + } else { + from = new SQLExprTableSource(new SQLIdentifierExpr(tableName)); + } + this.setFrom(from); + } + public boolean isParenthesized() { return parenthesized; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java new file mode 100644 index 0000000000..3a43d2e875 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/OracleToMySqlOutputVisitor.java @@ -0,0 +1,1006 @@ +/* + * 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.dialect.mysql.visitor; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.*; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +/** + * Created by wenshao on 16/07/2017. + */ +public class OracleToMySqlOutputVisitor extends MySqlOutputVisitor implements OracleASTVisitor { + public OracleToMySqlOutputVisitor(Appendable appender) { + super(appender); + } + + public OracleToMySqlOutputVisitor(Appendable appender, boolean parameterized) { + super(appender, parameterized); + } + + @Override + public void endVisit(OraclePLSQLCommitStatement astNode) { + + } + + @Override + public void endVisit(OracleAnalytic x) { + + } + + @Override + public void endVisit(OracleAnalyticWindowing x) { + + } + + @Override + public void endVisit(OracleDbLinkExpr x) { + + } + + @Override + public void endVisit(OracleDeleteStatement x) { + + } + + @Override + public void endVisit(OracleIntervalExpr x) { + + } + + @Override + public void endVisit(OracleOuterExpr x) { + + } + + @Override + public void endVisit(OracleSelectJoin x) { + + } + + @Override + public void endVisit(OracleSelectPivot x) { + + } + + @Override + public void endVisit(OracleSelectPivot.Item x) { + + } + + @Override + public void endVisit(OracleSelectRestriction.CheckOption x) { + + } + + @Override + public void endVisit(OracleSelectRestriction.ReadOnly x) { + + } + + @Override + public void endVisit(OracleSelectSubqueryTableSource x) { + + } + + @Override + public void endVisit(OracleSelectUnPivot x) { + + } + + @Override + public void endVisit(OracleUpdateStatement x) { + + } + + @Override + public boolean visit(OraclePLSQLCommitStatement astNode) { + return false; + } + + @Override + public boolean visit(OracleAnalytic x) { + return false; + } + + @Override + public boolean visit(OracleAnalyticWindowing x) { + return false; + } + + @Override + public boolean visit(OracleDbLinkExpr x) { + return false; + } + + @Override + public boolean visit(OracleDeleteStatement x) { + return false; + } + + @Override + public boolean visit(OracleIntervalExpr x) { + return false; + } + + @Override + public boolean visit(OracleOuterExpr x) { + return false; + } + + @Override + public boolean visit(OracleSelectJoin x) { + return false; + } + + @Override + public boolean visit(OracleSelectPivot x) { + return false; + } + + @Override + public boolean visit(OracleSelectPivot.Item x) { + return false; + } + + @Override + public boolean visit(OracleSelectRestriction.CheckOption x) { + return false; + } + + @Override + public boolean visit(OracleSelectRestriction.ReadOnly x) { + return false; + } + + @Override + public boolean visit(OracleSelectSubqueryTableSource x) { + return false; + } + + @Override + public boolean visit(OracleSelectUnPivot x) { + return false; + } + + @Override + public boolean visit(OracleUpdateStatement x) { + return false; + } + + @Override + public boolean visit(SampleClause x) { + return false; + } + + @Override + public void endVisit(SampleClause x) { + + } + + @Override + public boolean visit(OracleSelectTableReference x) { + return false; + } + + @Override + public void endVisit(OracleSelectTableReference x) { + + } + + @Override + public boolean visit(PartitionExtensionClause x) { + return false; + } + + @Override + public void endVisit(PartitionExtensionClause x) { + + } + + @Override + public boolean visit(OracleWithSubqueryEntry x) { + return false; + } + + @Override + public void endVisit(OracleWithSubqueryEntry x) { + + } + + @Override + public boolean visit(SearchClause x) { + return false; + } + + @Override + public void endVisit(SearchClause x) { + + } + + @Override + public boolean visit(CycleClause x) { + return false; + } + + @Override + public void endVisit(CycleClause x) { + + } + + @Override + public boolean visit(OracleBinaryFloatExpr x) { + return false; + } + + @Override + public void endVisit(OracleBinaryFloatExpr x) { + + } + + @Override + public boolean visit(OracleBinaryDoubleExpr x) { + return false; + } + + @Override + public void endVisit(OracleBinaryDoubleExpr x) { + + } + + @Override + public boolean visit(OracleCursorExpr x) { + return false; + } + + @Override + public void endVisit(OracleCursorExpr x) { + + } + + @Override + public boolean visit(OracleIsSetExpr x) { + return false; + } + + @Override + public void endVisit(OracleIsSetExpr x) { + + } + + @Override + public boolean visit(ModelClause.ReturnRowsClause x) { + return false; + } + + @Override + public void endVisit(ModelClause.ReturnRowsClause x) { + + } + + @Override + public boolean visit(ModelClause.MainModelClause x) { + return false; + } + + @Override + public void endVisit(ModelClause.MainModelClause x) { + + } + + @Override + public boolean visit(ModelClause.ModelColumnClause x) { + return false; + } + + @Override + public void endVisit(ModelClause.ModelColumnClause x) { + + } + + @Override + public boolean visit(ModelClause.QueryPartitionClause x) { + return false; + } + + @Override + public void endVisit(ModelClause.QueryPartitionClause x) { + + } + + @Override + public boolean visit(ModelClause.ModelColumn x) { + return false; + } + + @Override + public void endVisit(ModelClause.ModelColumn x) { + + } + + @Override + public boolean visit(ModelClause.ModelRulesClause x) { + return false; + } + + @Override + public void endVisit(ModelClause.ModelRulesClause x) { + + } + + @Override + public boolean visit(ModelClause.CellAssignmentItem x) { + return false; + } + + @Override + public void endVisit(ModelClause.CellAssignmentItem x) { + + } + + @Override + public boolean visit(ModelClause.CellAssignment x) { + return false; + } + + @Override + public void endVisit(ModelClause.CellAssignment x) { + + } + + @Override + public boolean visit(ModelClause x) { + return false; + } + + @Override + public void endVisit(ModelClause x) { + + } + + @Override + public boolean visit(OracleReturningClause x) { + return false; + } + + @Override + public void endVisit(OracleReturningClause x) { + + } + + @Override + public boolean visit(OracleInsertStatement x) { + return false; + } + + @Override + public void endVisit(OracleInsertStatement x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement.InsertIntoClause x) { + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement.InsertIntoClause x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement x) { + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement.ConditionalInsertClause x) { + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement.ConditionalInsertClause x) { + + } + + @Override + public boolean visit(OracleMultiInsertStatement.ConditionalInsertClauseItem x) { + return false; + } + + @Override + public void endVisit(OracleMultiInsertStatement.ConditionalInsertClauseItem x) { + + } + + @Override + public boolean visit(OracleSelectQueryBlock x) { + return false; + } + + @Override + public void endVisit(OracleSelectQueryBlock x) { + + } + + @Override + public boolean visit(OracleLockTableStatement x) { + return false; + } + + @Override + public void endVisit(OracleLockTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterSessionStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterSessionStatement x) { + + } + + @Override + public boolean visit(OracleExprStatement x) { + return false; + } + + @Override + public void endVisit(OracleExprStatement x) { + + } + + @Override + public boolean visit(OracleDatetimeExpr x) { + return false; + } + + @Override + public void endVisit(OracleDatetimeExpr x) { + + } + + @Override + public boolean visit(OracleSysdateExpr x) { + return false; + } + + @Override + public void endVisit(OracleSysdateExpr x) { + + } + + @Override + public boolean visit(OracleExceptionStatement x) { + return false; + } + + @Override + public void endVisit(OracleExceptionStatement x) { + + } + + @Override + public boolean visit(OracleExceptionStatement.Item x) { + return false; + } + + @Override + public void endVisit(OracleExceptionStatement.Item x) { + + } + + @Override + public boolean visit(OracleArgumentExpr x) { + return false; + } + + @Override + public void endVisit(OracleArgumentExpr x) { + + } + + @Override + public boolean visit(OracleSetTransactionStatement x) { + return false; + } + + @Override + public void endVisit(OracleSetTransactionStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + return false; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + return false; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(OracleRangeExpr x) { + return false; + } + + @Override + public void endVisit(OracleRangeExpr x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + return false; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement.Rebuild x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement.Rebuild x) { + + } + + @Override + public boolean visit(OracleStorageClause x) { + return false; + } + + @Override + public void endVisit(OracleStorageClause x) { + + } + + @Override + public boolean visit(OracleGotoStatement x) { + return false; + } + + @Override + public void endVisit(OracleGotoStatement x) { + + } + + @Override + public boolean visit(OracleLabelStatement x) { + return false; + } + + @Override + public void endVisit(OracleLabelStatement x) { + + } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + return false; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + return false; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleExitStatement x) { + return false; + } + + @Override + public void endVisit(OracleExitStatement x) { + + } + + @Override + public boolean visit(OracleContinueStatement x) { + return false; + } + + @Override + public void endVisit(OracleContinueStatement x) { + + } + + @Override + public boolean visit(OracleRaiseStatement x) { + return false; + } + + @Override + public void endVisit(OracleRaiseStatement x) { + + } + + @Override + public boolean visit(OracleCreateDatabaseDbLinkStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateDatabaseDbLinkStatement x) { + + } + + @Override + public boolean visit(OracleDropDbLinkStatement x) { + return false; + } + + @Override + public void endVisit(OracleDropDbLinkStatement x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalYear x) { + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalYear x) { + + } + + @Override + public boolean visit(OracleDataTypeIntervalDay x) { + return false; + } + + @Override + public void endVisit(OracleDataTypeIntervalDay x) { + + } + + @Override + public boolean visit(OracleUsingIndexClause x) { + return false; + } + + @Override + public void endVisit(OracleUsingIndexClause x) { + + } + + @Override + public boolean visit(OracleLobStorageClause x) { + return false; + } + + @Override + public void endVisit(OracleLobStorageClause x) { + + } + + @Override + public boolean visit(OracleUnique x) { + return false; + } + + @Override + public void endVisit(OracleUnique x) { + + } + + @Override + public boolean visit(OracleForeignKey x) { + return false; + } + + @Override + public void endVisit(OracleForeignKey x) { + + } + + @Override + public boolean visit(OracleCheck x) { + return false; + } + + @Override + public void endVisit(OracleCheck x) { + + } + + @Override + public boolean visit(OracleSupplementalIdKey x) { + return false; + } + + @Override + public void endVisit(OracleSupplementalIdKey x) { + + } + + @Override + public boolean visit(OracleSupplementalLogGrp x) { + return false; + } + + @Override + public void endVisit(OracleSupplementalLogGrp x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement.Organization x) { + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement.Organization x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement.OracleExternalRecordFormat x) { + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement.OracleExternalRecordFormat x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement.OIDIndex x) { + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement.OIDIndex x) { + + } + + @Override + public boolean visit(OracleCreatePackageStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreatePackageStatement x) { + + } + + @Override + public boolean visit(OracleExecuteImmediateStatement x) { + return false; + } + + @Override + public void endVisit(OracleExecuteImmediateStatement x) { + + } + + @Override + public boolean visit(OracleTreatExpr x) { + return false; + } + + @Override + public void endVisit(OracleTreatExpr x) { + + } +} 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 new file mode 100644 index 0000000000..50dd875657 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/transform/FromSubqueryResolver.java @@ -0,0 +1,101 @@ +/* + * 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.dialect.mysql.visitor.transform; + +import com.alibaba.druid.sql.SQLUtils; +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.visitor.OracleASTVisitorAdapter; +import oracle.sql.SQLName; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author wenshao[szujobs@hotmail.com] + */ +public class FromSubqueryResolver extends OracleASTVisitorAdapter { + private final List targetList; + private final String viewName; + + public FromSubqueryResolver(List targetList, String viewName) { + this.targetList = targetList; + this.viewName = viewName; + } + + public boolean visit(OracleSelectSubqueryTableSource x) { + return visit((SQLSubqueryTableSource) x); + } + + public boolean visit(SQLSubqueryTableSource x) { + String subViewName = generateSubViewName(); + + SQLObject parent = x.getParent(); + if(parent instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) parent; + queryBlock.setFrom(subViewName); + } else if(parent instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) parent; + if (join.getLeft() == x) { + join.setLeft(subViewName); + } else if (join.getRight() == x) { + join.setRight(subViewName); + } + } + + SQLCreateViewStatement stmt = new SQLCreateViewStatement(); + + stmt.setName(generateSubViewName()); + + + SQLSelect select = x.getSelect(); + stmt.setSubQuery(select); + + targetList.add(0, stmt); + + stmt.accept(new FromSubqueryResolver(targetList, viewName)); + + return false; + } + + private String generateSubViewName() { + return this.viewName + "_" + targetList.size(); + } + + public static List resolve(SQLCreateViewStatement stmt) { + List targetList = new ArrayList(); + targetList.add(stmt); + + String viewName = SQLUtils.normalize(stmt.getName().getSimpleName()); + + FromSubqueryResolver visitor = new FromSubqueryResolver(targetList, viewName); + stmt.accept(visitor); + + String dbType = stmt.getDbType(); + for (int i = 0; i < targetList.size() - 1; ++i) { + SQLCreateViewStatement targetStmt = (SQLCreateViewStatement) targetList.get(i); + targetStmt.setDbType(dbType); + targetStmt.setAfterSemi(true); + } + + + return targetList; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index a9fd28bd59..e786600577 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -156,6 +156,19 @@ public class OdpsExprParser extends SQLExprParser { return super.equalityRest(expr); } + public SQLExpr relationalRest(SQLExpr expr) { + if (identifierEquals("REGEXP")) { + lexer.nextToken(); + SQLExpr rightExp = equality(); + + rightExp = relationalRest(rightExp); + + return new SQLBinaryOpExpr(expr, SQLBinaryOperator.RegExp, rightExp, JdbcConstants.MYSQL); + } + + return super.relationalRest(expr); + } + @Override public OdpsSelectParser createSelectParser() { return new OdpsSelectParser(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index ddd4fd065f..86590980ca 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -76,6 +76,7 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen private SQLName of; private OIDIndex oidIndex; + private boolean monitoring; public OracleCreateTableStatement() { super (JdbcConstants.ORACLE); @@ -262,6 +263,14 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen this.oidIndex = oidIndex; } + public boolean isMonitoring() { + return monitoring; + } + + public void setMonitoring(boolean monitoring) { + this.monitoring = monitoring; + } + public boolean isCompressForOltp() { return compressForOltp; } 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 dbf984699c..9cfa59c5a2 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 @@ -17,6 +17,8 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.SQLUtils; 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.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -119,4 +121,24 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect return x; } + + public void setLeft(String tableName) { + SQLExprTableSource tableSource; + if (tableName == null || tableName.length() == 0) { + tableSource = null; + } else { + tableSource = new OracleSelectTableReference(new SQLIdentifierExpr(tableName)); + } + this.setLeft(tableSource); + } + + public void setRight(String tableName) { + SQLExprTableSource tableSource; + if (tableName == null || tableName.length() == 0) { + tableSource = null; + } else { + tableSource = new OracleSelectTableReference(new SQLIdentifierExpr(tableName)); + } + this.setRight(tableSource); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index 1d263b64c6..e88d67867d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -23,7 +23,9 @@ import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -161,4 +163,14 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { throw new UnsupportedOperationException("not support offset"); } } + + public void setFrom(String tableName) { + SQLExprTableSource from; + if (tableName == null || tableName.length() == 0) { + from = null; + } else { + from = new OracleSelectTableReference(new SQLIdentifierExpr(tableName)); + } + this.setFrom(from); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java index 2fdedcda5c..119489bb34 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -34,6 +35,10 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or } + public OracleSelectTableReference(SQLExpr expr) { + this.setExpr(expr); + } + public PartitionExtensionClause getPartition() { return partition; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java index 5bb050afea..1d8b3c616a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -150,6 +150,10 @@ public class OracleCreateTableParser extends SQLCreateTableParser { // OracleStorageClause storage = ((OracleExprParser) this.exprParser).parseStorage(); // stmt.setStorage(storage); // continue; + } else if (identifierEquals("MONITORING")) { + lexer.nextToken(); + stmt.setMonitoring(true); + continue; } else if (lexer.token() == Token.LOB) { OracleLobStorageClause lobStorage = ((OracleExprParser) this.exprParser).parseLobStorage(); stmt.setLobStorage(lobStorage); 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 be1416badd..d1ddd3fdef 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 @@ -2137,6 +2137,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print0(ucase ? "PRESERVE ROWS" : "preserve rows"); } + if (x.isMonitoring()) { + println(); + print0(ucase ? "MONITORING" : "monitoring"); + } + if (x.getPartitioning() != null) { println(); x.getPartitioning().accept(this); 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 b9e28d2b38..7a9b6f7842 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2009,12 +2009,15 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } protected void printCreateTable(SQLCreateTableStatement x) { - print0(ucase ? "CREATE TABLE " : "create table "); - if (SQLCreateTableStatement.Type.GLOBAL_TEMPORARY.equals(x.getType())) { + print0(ucase ? "CREATE " : "create "); + + final SQLCreateTableStatement.Type tableType = x.getType(); + if (SQLCreateTableStatement.Type.GLOBAL_TEMPORARY.equals(tableType)) { print0(ucase ? "GLOBAL TEMPORARY " : "global temporary "); - } else if (SQLCreateTableStatement.Type.LOCAL_TEMPORARY.equals(x.getType())) { + } else if (SQLCreateTableStatement.Type.LOCAL_TEMPORARY.equals(tableType)) { print0(ucase ? "LOCAL TEMPORARY " : "local temporary "); } + print0(ucase ? "TABLE " : "table "); printTableSourceExpr(x.getName()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLTransformVisitor.java similarity index 71% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java rename to src/main/java/com/alibaba/druid/sql/visitor/SQLTransformVisitor.java index 8977038225..cd1c369622 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLTransformVisitor.java @@ -1,26 +1,23 @@ -/* - * 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.dialect.mysql.visitor; - - -public class MySql2OracleOutputVisitor extends MySqlOutputVisitor { - - public MySql2OracleOutputVisitor(Appendable appender){ - super(appender); - } - - -} +/* + * 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.visitor; + +/** + * Created by wenshao on 16/07/2017. + */ +public interface SQLTransformVisitor extends SQLASTVisitor { + String getSrcDbType(); +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLParserTest.java deleted file mode 100644 index da9b21b76c..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLParserTest.java +++ /dev/null @@ -1,40 +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.mysql; - -import junit.framework.TestCase; - -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySql2OracleOutputVisitor; -import com.alibaba.druid.sql.parser.SQLSelectParser; - -public class SQLParserTest extends TestCase { - - public void test_select() throws Exception { - String sql = " SELECT COUNT(*) FROM close_plan WHERE 1=1 AND close_type = ? AND target_type = ? AND target_id = ? AND( mi_name=? ) AND end_time >= ? "; - SQLSelectParser parser = new MySqlSelectParser(sql); - SQLSelect select = parser.select(); - - StringBuilder out = new StringBuilder(); - MySql2OracleOutputVisitor visitor = new MySql2OracleOutputVisitor(out); - - select.accept(visitor); - - System.out.println(out); - } - -} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_0.java new file mode 100644 index 0000000000..51f3382cd2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_0.java @@ -0,0 +1,29 @@ +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_0 extends TestCase { + public void test_createView() throws Exception { + String sql = "CREATE OR REPLACE FORCE VIEW \"CMIS\".\"WFI_AGENT_LOGEND\" (\"INSTANCEID\", \"WFID\", \"WFSIGN\", \"NODEID\", \"NODESTARTTIME\", \"ORIGINALUSER\", \"REPLACER\", \"SYSID\", \"PK_VALUE\", \"APPL_TYPE\", \"WFI_END_ORG\", \"WFI_STATUS\") AS \n" + + " SELECT INSTANCEID,WFID,WFSIGN,NODEID,NODESTARTTIME,ORIGINALUSER,REPLACER,SYSID,PK_VALUE,APPL_TYPE,WFI_END_ORG,WFI_STATUS FROM (SELECT ROWID ROWIDTMP, AA.* FROM (SELECT A.INSTANCEID INSTANCEID,A.WFID WFID,A.WFSIGN WFSIGN,A.NODEID NODEID,A.NODESTARTTIME NODESTARTTIME,A.ORIGINALUSER ORIGINALUSER,A.REPLACER REPLACER,A.SYSID SYSID,B.PK_VALUE PK_VALUE,B.APPL_TYPE APPL_TYPE,B.WFI_END_ORG WFI_END_ORG,B.WFI_STATUS WFI_STATUS FROM WF_AGENT_LOG A, WFI_JOIN_HIS B WHERE A.INSTANCEID=B.INSTANCEID) AA) WHERE ROWIDTMP IN (SELECT ROWIDMAX FROM ( SELECT MAX(ROWID) ROWIDMAX,INSTANCEID FROM(SELECT A.INSTANCEID INSTANCEID FROM WF_AGENT_LOG A, WFI_JOIN_HIS B WHERE A.INSTANCEID=B.INSTANCEID) AA GROUP BY INSTANCEID ))\n" + + " WITH READ ONLY"; + + 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(5, targetList.size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_1.java new file mode 100644 index 0000000000..eb43026ea0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/transform/Trans_CreateView_1.java @@ -0,0 +1,39 @@ +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_1 extends TestCase { + public void test_createView() throws Exception { + String sql = " CREATE OR REPLACE FORCE VIEW \"CMIS\".\"LM_LOAN_MSGINFO\" (\"LOAN_NO\", \"OD_PRCP\", \"OD_DAYS\", \"OD_TNR\", \"ENTRYCS_DAYS\") AS \n" + + " select loan.loan_no as loan_no,coln.od_prcp,\n" + + "to_date((select cur_prcs_dt from s_ctrl),'YYYY-MM-DD')-to_date(loan.next_due_dt,'YYYY-MM-DD') as od_days,\n" + + "shd.od_tnr as od_tnr,\n" + + "to_date((select cur_prcs_dt from s_ctrl),'YYYY-MM-DD')-to_date(coln.entry_dt,'YYYY-MM-DD') as entrycs_days from lm_loan loan\n" + + "left join (select count(*) as od_tnr,loan_no\n" + + " from lm_pm_shd\n" + + " where ps_due_dt < (select cur_prcs_dt from s_ctrl)\n" + + " and setl_ind = 'N'\n" + + " and ps_od_ind = 'Y'\n" + + " and ps_perd_no <> 0 group by loan_no) shd on shd.loan_no=loan.loan_no\n" + + "left join cs_coln coln on loan.loan_no = coln.loan_no\n" + + "where loan.LOAN_OD_IND='Y' and loan.LOAN_STS='ACTV'"; + + 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(2, targetList.size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest26.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest26.java new file mode 100644 index 0000000000..045db53484 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsSelectTest26.java @@ -0,0 +1,100 @@ +/* + * 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.odps; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +public class OdpsSelectTest26 extends TestCase { + + public void test_select() throws Exception { + // 1095288847322 + String sql = "select count(distinct(trackid)) as total , process ,value5 as result\n" + + " from \n" + + " havanaapp.s_register_process_log where \n" + + " ds='20170706' and value6='MOBILE_TB' and value1 REGEXP '^00'\n" + + " and process in('preCheckMobile','VerifyScrollCheckcode','SendMobileCheckcode','VerifyMobile',\n" + + " 'VerifyMobileCheckCode','VerifyNick','VerifyPasswordFormat','register','CheckMobileConflict','VerifyEmail') \n" + + " group by process,value5";// + assertEquals("SELECT COUNT(DISTINCT trackid) AS total, process, value5 AS result\n" + + "FROM havanaapp.s_register_process_log\n" + + "WHERE ds = '20170706'\n" + + "\tAND value6 = 'MOBILE_TB'\n" + + "\tAND value1 REGEXP '^00'\n" + + "\tAND process IN (\n" + + "\t\t'preCheckMobile', \n" + + "\t\t'VerifyScrollCheckcode', \n" + + "\t\t'SendMobileCheckcode', \n" + + "\t\t'VerifyMobile', \n" + + "\t\t'VerifyMobileCheckCode', \n" + + "\t\t'VerifyNick', \n" + + "\t\t'VerifyPasswordFormat', \n" + + "\t\t'register', \n" + + "\t\t'CheckMobileConflict', \n" + + "\t\t'VerifyEmail'\n" + + "\t)\n" + + "GROUP BY process, \n" + + "\tvalue5", SQLUtils.formatOdps(sql)); + + assertEquals("select count(DISTINCT trackid) as total, process, value5 as result\n" + + "from havanaapp.s_register_process_log\n" + + "where ds = '20170706'\n" + + "\tand value6 = 'MOBILE_TB'\n" + + "\tand value1 regexp '^00'\n" + + "\tand process in (\n" + + "\t\t'preCheckMobile', \n" + + "\t\t'VerifyScrollCheckcode', \n" + + "\t\t'SendMobileCheckcode', \n" + + "\t\t'VerifyMobile', \n" + + "\t\t'VerifyMobileCheckCode', \n" + + "\t\t'VerifyNick', \n" + + "\t\t'VerifyPasswordFormat', \n" + + "\t\t'register', \n" + + "\t\t'CheckMobileConflict', \n" + + "\t\t'VerifyEmail'\n" + + "\t)\n" + + "group by process, \n" + + "\tvalue5", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(6, visitor.getColumns().size()); + assertEquals(3, visitor.getConditions().size()); + +// System.out.println(SQLUtils.formatOdps(sql)); + +// assertTrue(visitor.getColumns().contains(new Column("abc", "name"))); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest71.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest71.java new file mode 100644 index 0000000000..52c0cb10da --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest71.java @@ -0,0 +1,90 @@ +/* + * 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 OracleCreateTableTest71 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + " CREATE TABLE \"CMIS\".\"DR$IDX_FULL_BIZ_TABLE_NAME$N\" \n" + + " (\t\"NLT_DOCID\" NUMBER(38,0), \n" + + "\t\"NLT_MARK\" CHAR(1) NOT NULL ENABLE, \n" + + "\t PRIMARY KEY (\"NLT_DOCID\") ENABLE\n" + + " ) ORGANIZATION INDEX NOCOMPRESS PCTFREE 10 INITRANS 2 MAXTRANS 255 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" + + " PCTTHRESHOLD 50\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$N\" (\n" + + "\t\"NLT_DOCID\" NUMBER(38, 0),\n" + + "\t\"NLT_MARK\" CHAR(1) NOT NULL ENABLE,\n" + + "\tPRIMARY KEY (\"NLT_DOCID\") ENABLE\n" + + ")\n" + + "ORGANIZATION INDEX\n" + + "\tPCTFREE 10\n" + + "\tINITRANS 2\n" + + "\tMAXTRANS 255\n" + + "\tNOCOMPRESS\n" + + "\tLOGGING\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" + + "\tPCTTHRESHOLD 10\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/util/DropTables.java b/src/test/java/com/alibaba/druid/util/DropTables.java new file mode 100644 index 0000000000..aa0587c56f --- /dev/null +++ b/src/test/java/com/alibaba/druid/util/DropTables.java @@ -0,0 +1,10 @@ +package com.alibaba.druid.util; + +import junit.framework.TestCase; + +/** + * Created by wenshao on 16/07/2017. + */ +public class DropTables extends TestCase { + +}