diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/extractor/util/RuleName.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/extractor/util/RuleName.java index 1c5c5a804587c2315555911d70c36f21111e7424..70c0deb1e250c86118937788f78d948359b2eb37 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/extractor/util/RuleName.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/extractor/util/RuleName.java @@ -185,6 +185,8 @@ public enum RuleName { CREATE_INDEX("CreateIndex"), + ALTER_INDEX("AlterIndex"), + DROP_INDEX("DropIndex"), SET_TRANSACTION("SetTransaction"), diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/ParseTreeVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/ParseTreeVisitorFactory.java index 68330a7bd3f5d25536fcbf28cf457357b102f7ac..fe3a650af4759d233d3ea4bebaa2889fd8248739 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/ParseTreeVisitorFactory.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/ParseTreeVisitorFactory.java @@ -47,7 +47,7 @@ public final class ParseTreeVisitorFactory { SQL_VISITOR_RULES.put("DMLVisitor", Lists.newArrayList(RuleName.SELECT.getName(), RuleName.DELETE.getName(), RuleName.UPDATE.getName(), RuleName.INSERT.getName(), RuleName.REPLACE.getName())); SQL_VISITOR_RULES.put("DDLVisitor", Lists.newArrayList(RuleName.CREATE_TABLE.getName(), RuleName.ALTER_TABLE.getName(), - RuleName.DROP_TABLE.getName(), RuleName.TRUNCATE_TABLE.getName(), RuleName.CREATE_INDEX.getName(), RuleName.DROP_INDEX.getName())); + RuleName.DROP_TABLE.getName(), RuleName.TRUNCATE_TABLE.getName(), RuleName.CREATE_INDEX.getName(), RuleName.ALTER_INDEX.getName(), RuleName.DROP_INDEX.getName())); SQL_VISITOR_RULES.put("TCLVisitor", Lists.newArrayList(RuleName.SET_TRANSACTION.getName(), RuleName.BEGIN_TRANSACTION.getName(), RuleName.SET_AUTOCOMMIT.getName(), RuleName.COMMIT.getName(), RuleName.ROLLBACK.getName(), RuleName.SAVE_POINT.getName())); SQL_VISITOR_RULES.put("DCLVisitor", Lists.newArrayList(RuleName.GRANT.getName(), RuleName.REVOKE.getName(), RuleName.CREATE_USER.getName(), diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java index a1c04f23e4b79e3fe50ad64a3b38921c3458fe6b..5a48fe964749bf80f49c986f1c03ce09858856f7 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/visitor/impl/OracleDDLVisitor.java @@ -17,8 +17,49 @@ package org.apache.shardingsphere.sql.parser.visitor.impl; +import com.google.common.base.Optional; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AddColumnSpecificationContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDefinitionClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterIndexContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterTableContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnDefinitionContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnOrVirtualDefinitionContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDefinitionClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateIndexContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropColumnClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropColumnSpecificationContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropIndexContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropTableContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.InlineConstraintContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyColumnSpecificationContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OperateColumnClauseContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.RelationalPropertyContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TruncateTableContext; +import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.VirtualColumnDefinitionContext; +import org.apache.shardingsphere.sql.parser.sql.ASTNode; +import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.AddColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.ColumnPositionSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment; +import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropIndexStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.sql.statement.ddl.TruncateStatement; +import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue; +import org.apache.shardingsphere.sql.parser.sql.value.identifier.IdentifierValue; import org.apache.shardingsphere.sql.parser.visitor.OracleVisitor; +import java.util.Collection; +import java.util.LinkedList; + /** * Oracle DDL visitor. * @@ -26,221 +67,234 @@ import org.apache.shardingsphere.sql.parser.visitor.OracleVisitor; */ public final class OracleDDLVisitor extends OracleVisitor { -// @Override -// public ASTNode visitCreateTable(final CreateTableContext ctx) { -// CreateTableStatement result = new CreateTableStatement(); -// TableSegment table = (TableSegment) visit(ctx.tableName()); -// result.getTables().add(table); -// result.getAllSQLSegments().add(table); -// if (null != ctx.createDefinitionClause()) { -// CreateTableStatement createDefinition = (CreateTableStatement) visit(ctx.createDefinitionClause()); -// result.getColumnDefinitions().addAll(createDefinition.getColumnDefinitions()); -// for (SQLSegment each : createDefinition.getAllSQLSegments()) { -// result.getAllSQLSegments().add(each); -// if (each instanceof TableSegment) { -// result.getTables().add((TableSegment) each); -// } -// } -// } -// return result; -// } -// -// @Override -// public ASTNode visitCreateDefinitionClause(final CreateDefinitionClauseContext ctx) { -// CreateTableStatement result = new CreateTableStatement(); -// for (CreateDefinitionContext each : ctx.createDefinition()) { -// ColumnDefinitionContext columnDefinition = each.columnDefinition(); -// if (null != columnDefinition) { -// result.getColumnDefinitions().add((ColumnDefinitionSegment) visit(columnDefinition)); -// result.getAllSQLSegments().addAll(getTableSegments(columnDefinition)); -// } -// if (null != each.tableConstraint() && null != each.tableConstraint().tableConstraintOption().tableName()) { -// result.getAllSQLSegments().add((TableSegment) visit(each.tableConstraint().tableConstraintOption().tableName())); -// } -// } -// if (result.getColumnDefinitions().isEmpty()) { -// result.getAllSQLSegments().addAll(result.getColumnDefinitions()); -// } -// return result; -// } -// -// @Override -// public ASTNode visitAlterTable(final AlterTableContext ctx) { -// AlterTableStatement result = new AlterTableStatement(); -// TableSegment table = (TableSegment) visit(ctx.tableNameClause()); -// result.getTables().add(table); -// result.getAllSQLSegments().add(table); -// if (null != ctx.alterDefinitionClause()) { -// AlterTableStatement alterDefinition = (AlterTableStatement) visit(ctx.alterDefinitionClause()); -// result.getAddedColumnDefinitions().addAll(alterDefinition.getAddedColumnDefinitions()); -// result.getChangedPositionColumns().addAll(alterDefinition.getChangedPositionColumns()); -// result.getDroppedColumnNames().addAll(alterDefinition.getDroppedColumnNames()); -// for (SQLSegment each : alterDefinition.getAllSQLSegments()) { -// result.getAllSQLSegments().add(each); -// if (each instanceof TableSegment) { -// result.getTables().add((TableSegment) each); -// } -// } -// } -// return result; -// } -// -// @SuppressWarnings("unchecked") -// @Override -// public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) { -// final AlterTableStatement result = new AlterTableStatement(); -// if (null != ctx.alterTableActions()) { -// for (AlterTableActionContext each : ctx.alterTableActions().alterTableAction()) { -// AddColumnSpecificationContext addColumnSpecification = each.addColumnSpecification(); -// if (null != addColumnSpecification) { -// CollectionValue addColumnDefinitions = (CollectionValue) visit(addColumnSpecification); -// for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) { -// result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition()); -// Optional columnPositionSegment = addColumnDefinition.getColumnPosition(); -// // TODO refactor SQLStatement -// // CHECKSTYLE:OFF -// if (columnPositionSegment.isPresent()) { -// result.getChangedPositionColumns().add(columnPositionSegment.get()); -// } -// // CHECKSTYLE:ON -// } -// result.getAllSQLSegments().addAll(getTableSegments(addColumnSpecification.columnDefinition())); -// } -// AddConstraintSpecificationContext addConstraintSpecification = each.addConstraintSpecification(); -// TableConstraintOptionContext tableConstraintOption = null == addConstraintSpecification || null == addConstraintSpecification.tableConstraint() -// ? null : addConstraintSpecification.tableConstraint().tableConstraintOption(); -// if (null != tableConstraintOption && null != tableConstraintOption.tableName()) { -// result.getAllSQLSegments().add((TableSegment) visit(tableConstraintOption.tableName())); -// } -// ModifyColumnSpecificationContext modifyColumnSpecification = each.modifyColumnSpecification(); -// if (null != modifyColumnSpecification) { -// Optional columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition(); -// // TODO refactor SQLStatement -// // CHECKSTYLE:OFF -// if (columnPositionSegment.isPresent()) { -// result.getChangedPositionColumns().add(columnPositionSegment.get()); -// } -// // CHECKSTYLE:ON -// } -// DropColumnSpecificationContext dropColumnSpecification = each.dropColumnSpecification(); -// if (null != dropColumnSpecification) { -// result.getDroppedColumnNames().add(((DropColumnDefinitionSegment) visit(dropColumnSpecification)).getColumnName()); -// } -// } -// } -// if (result.getAddedColumnDefinitions().isEmpty()) { -// result.getAllSQLSegments().addAll(result.getAddedColumnDefinitions()); -// } -// if (result.getChangedPositionColumns().isEmpty()) { -// result.getAllSQLSegments().addAll(result.getChangedPositionColumns()); -// } -// return result; -// } -// -// @Override -// public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) { -// CollectionValue result = new CollectionValue<>(); -// ColumnDefinitionContext columnDefinition = ctx.columnDefinition(); -// if (null != columnDefinition) { -// AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment( -// ctx.columnDefinition().getStart().getStartIndex(), columnDefinition.getStop().getStopIndex(), (ColumnDefinitionSegment) visit(columnDefinition)); -// result.getValue().add(addColumnDefinition); -// } -// return result; -// } -// -// @Override -// public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) { -// ColumnSegment column = (ColumnSegment) visit(ctx.columnName()); -// IdentifierValue dataType = (IdentifierValue) visit(ctx.dataType().dataTypeName()); -// boolean isPrimaryKey = containsPrimaryKey(ctx); -// return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getIdentifier().getValue(), dataType.getValue(), isPrimaryKey); -// } -// -// private boolean containsPrimaryKey(final ColumnDefinitionContext ctx) { -// for (ColumnConstraintContext each : ctx.columnConstraint()) { -// if (null != each.columnConstraintOption() && null != each.columnConstraintOption().primaryKey()) { -// return true; -// } -// } -// return false; -// } -// -// @Override -// public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) { -// // TODO visit column definition, need to change g4 for modifyColumn -// return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null); -// } -// -// @Override -// public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) { -// return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), -// ((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue()); -// } -// -// @Override -// public ASTNode visitRenameColumnSpecification(final RenameColumnSpecificationContext ctx) { -// return new RenameColumnSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), -// ((ColumnSegment) visit(ctx.columnName(0))).getIdentifier().getValue(), ((ColumnSegment) visit(ctx.columnName(1))).getIdentifier().getValue()); -// } -// -// private Collection getTableSegments(final ColumnDefinitionContext columnDefinition) { -// Collection result = new LinkedList<>(); -// for (ColumnConstraintContext each : columnDefinition.columnConstraint()) { -// if (null != each.columnConstraintOption().tableName()) { -// result.add((TableSegment) visit(each.columnConstraintOption().tableName())); -// } -// } -// return result; -// } -// -// @SuppressWarnings("unchecked") -// @Override -// public ASTNode visitDropTable(final DropTableContext ctx) { -// DropTableStatement result = new DropTableStatement(); -// CollectionValue tables = (CollectionValue) visit(ctx.tableNames()); -// result.getTables().addAll(tables.getValue()); -// result.getAllSQLSegments().addAll(tables.getValue()); -// return result; -// } -// -// @SuppressWarnings("unchecked") -// @Override -// public ASTNode visitTruncateTable(final TruncateTableContext ctx) { -// TruncateStatement result = new TruncateStatement(); -// CollectionValue tables = (CollectionValue) visit(ctx.tableNamesClause()); -// result.getTables().addAll(tables.getValue()); -// result.getAllSQLSegments().addAll(tables.getValue()); -// return result; -// } -// -// @Override -// public ASTNode visitCreateIndex(final CreateIndexContext ctx) { -// CreateIndexStatement result = new CreateIndexStatement(); -// TableSegment table = (TableSegment) visit(ctx.tableName()); -// result.setTable(table); -// result.getAllSQLSegments().add(table); -// return result; -// } -// -// @Override -// public ASTNode visitDropIndex(final DropIndexContext ctx) { -// return new DropIndexStatement(); -// } -// -// @Override -// public ASTNode visitTableNameClause(final TableNameClauseContext ctx) { -// return visit(ctx.tableName()); -// } -// -// @Override -// public ASTNode visitTableNamesClause(final TableNamesClauseContext ctx) { -// Collection tableSegments = new LinkedList<>(); -// for (int i = 0; i < ctx.tableNameClause().size(); i++) { -// tableSegments.add((TableSegment) visit(ctx.tableNameClause(i))); -// } -// CollectionValue result = new CollectionValue<>(); -// result.getValue().addAll(tableSegments); -// return result; -// } + @Override + public ASTNode visitCreateTable(final CreateTableContext ctx) { + CreateTableStatement result = new CreateTableStatement(); + TableSegment table = (TableSegment) visit(ctx.tableName()); + result.getTables().add(table); + result.getAllSQLSegments().add(table); + if (null != ctx.createDefinitionClause()) { + CreateTableStatement createDefinition = (CreateTableStatement) visit(ctx.createDefinitionClause()); + result.getColumnDefinitions().addAll(createDefinition.getColumnDefinitions()); + for (SQLSegment each : createDefinition.getAllSQLSegments()) { + result.getAllSQLSegments().add(each); + if (each instanceof TableSegment) { + result.getTables().add((TableSegment) each); + } + } + } + return result; + } + + @Override + public ASTNode visitCreateDefinitionClause(final CreateDefinitionClauseContext ctx) { + CreateTableStatement result = new CreateTableStatement(); + for (RelationalPropertyContext each : ctx.relationalProperties().relationalProperty()) { + ColumnDefinitionContext columnDefinition = each.columnDefinition(); + if (null != columnDefinition) { + result.getColumnDefinitions().add((ColumnDefinitionSegment) visit(columnDefinition)); + Collection tableSegments = getTableSegments(columnDefinition); + result.getTables().addAll(tableSegments); + result.getAllSQLSegments().addAll(tableSegments); + } + if (null != each.outOfLineConstraint() && null != each.outOfLineConstraint().referencesClause() && null != each.outOfLineConstraint().referencesClause().tableName()) { + TableSegment tableSegment = (TableSegment) visit(each.outOfLineConstraint().referencesClause().tableName()); + result.getTables().add(tableSegment); + result.getAllSQLSegments().add(tableSegment); + } + if (null != each.outOfLineRefConstraint() && null != each.outOfLineRefConstraint().referencesClause() && null != each.outOfLineRefConstraint().referencesClause().tableName()) { + TableSegment tableSegment = (TableSegment) visit(each.outOfLineRefConstraint().referencesClause().tableName()); + result.getTables().add(tableSegment); + result.getAllSQLSegments().add(tableSegment); + } + } + if (result.getColumnDefinitions().isEmpty()) { + result.getAllSQLSegments().addAll(result.getColumnDefinitions()); + } + return result; + } + + @Override + public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) { + ColumnSegment column = (ColumnSegment) visit(ctx.columnName()); + IdentifierValue dataType = (IdentifierValue) visit(ctx.dataType().dataTypeName()); + boolean isPrimaryKey = containsPrimaryKey(ctx); + return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getIdentifier().getValue(), dataType.getValue(), isPrimaryKey); + } + + private boolean containsPrimaryKey(final ColumnDefinitionContext ctx) { + for (InlineConstraintContext each : ctx.inlineConstraint()) { + if (null != each.primaryKey()) { + return true; + } + } + return false; + } + + private Collection getTableSegments(final ColumnDefinitionContext columnDefinition) { + Collection result = new LinkedList<>(); + for (InlineConstraintContext each : columnDefinition.inlineConstraint()) { + if (null != each.referencesClause()) { + result.add((TableSegment) visit(each.referencesClause().tableName())); + } + } + if (null != columnDefinition.inlineRefConstraint()) { + result.add((TableSegment) visit(columnDefinition.inlineRefConstraint().tableName())); + } + return result; + } + + private Collection getTableSegments(final VirtualColumnDefinitionContext virtualColumnDefinition) { + Collection result = new LinkedList<>(); + for (InlineConstraintContext each : virtualColumnDefinition.inlineConstraint()) { + if (null != each.referencesClause()) { + result.add((TableSegment) visit(each.referencesClause().tableName())); + } + } + return result; + } + + @Override + public ASTNode visitAlterTable(final AlterTableContext ctx) { + AlterTableStatement result = new AlterTableStatement(); + TableSegment table = (TableSegment) visit(ctx.tableName()); + result.getTables().add(table); + result.getAllSQLSegments().add(table); + if (null != ctx.alterDefinitionClause()) { + AlterTableStatement alterDefinition = (AlterTableStatement) visit(ctx.alterDefinitionClause()); + result.getAddedColumnDefinitions().addAll(alterDefinition.getAddedColumnDefinitions()); + result.getChangedPositionColumns().addAll(alterDefinition.getChangedPositionColumns()); + result.getDroppedColumnNames().addAll(alterDefinition.getDroppedColumnNames()); + for (SQLSegment each : alterDefinition.getAllSQLSegments()) { + result.getAllSQLSegments().add(each); + if (each instanceof TableSegment) { + result.getTables().add((TableSegment) each); + } + } + } + return result; + } + + @SuppressWarnings("unchecked") + @Override + public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) { + final AlterTableStatement result = new AlterTableStatement(); + if (null != ctx.columnClauses()) { + for (OperateColumnClauseContext each : ctx.columnClauses().operateColumnClause()) { + AddColumnSpecificationContext addColumnSpecification = each.addColumnSpecification(); + if (null != addColumnSpecification) { + CollectionValue addColumnDefinitions = (CollectionValue) visit(addColumnSpecification); + for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) { + result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition()); + Optional columnPositionSegment = addColumnDefinition.getColumnPosition(); + // TODO refactor SQLStatement + // CHECKSTYLE:OFF + if (columnPositionSegment.isPresent()) { + result.getChangedPositionColumns().add(columnPositionSegment.get()); + } + // CHECKSTYLE:ON + } + for (ColumnOrVirtualDefinitionContext columnOrVirtualDefinition : addColumnSpecification.columnOrVirtualDefinitions().columnOrVirtualDefinition()) { + // TODO refactor SQLStatement + // CHECKSTYLE:OFF + if (null != columnOrVirtualDefinition.columnDefinition()) { + result.getAllSQLSegments().addAll(getTableSegments(columnOrVirtualDefinition.columnDefinition())); + } + if (null != columnOrVirtualDefinition.virtualColumnDefinition()) { + result.getAllSQLSegments().addAll(getTableSegments(columnOrVirtualDefinition.virtualColumnDefinition())); + } + // CHECKSTYLE:ON + } + } + ModifyColumnSpecificationContext modifyColumnSpecification = each.modifyColumnSpecification(); + if (null != modifyColumnSpecification) { + Optional columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition(); + // TODO refactor SQLStatement + // CHECKSTYLE:OFF + if (columnPositionSegment.isPresent()) { + result.getChangedPositionColumns().add(columnPositionSegment.get()); + } + // CHECKSTYLE:ON + } + DropColumnClauseContext dropColumnClause = each.dropColumnClause(); + if (null != dropColumnClause) { + result.getDroppedColumnNames().add(((DropColumnDefinitionSegment) visit(dropColumnClause)).getColumnName()); + } + } + } + if (result.getAddedColumnDefinitions().isEmpty()) { + result.getAllSQLSegments().addAll(result.getAddedColumnDefinitions()); + } + if (result.getChangedPositionColumns().isEmpty()) { + result.getAllSQLSegments().addAll(result.getChangedPositionColumns()); + } + return result; + } + + @Override + public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) { + CollectionValue result = new CollectionValue<>(); + for (ColumnOrVirtualDefinitionContext each : ctx.columnOrVirtualDefinitions().columnOrVirtualDefinition()) { + if (null != each.columnDefinition()) { + AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment( + each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(), (ColumnDefinitionSegment) visit(each.columnDefinition())); + result.getValue().add(addColumnDefinition); + } + } + return result; + } + + @Override + public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) { + // TODO visit column definition, need to change g4 for modifyColumn + return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null); + } + + @Override + public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) { + // TODO can drop multiple columns + return new DropColumnDefinitionSegment( + ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ((ColumnSegment) visit(ctx.columnOrColumnList().columnName(0))).getIdentifier().getValue()); + } + + @SuppressWarnings("unchecked") + @Override + public ASTNode visitDropTable(final DropTableContext ctx) { + DropTableStatement result = new DropTableStatement(); + TableSegment table = (TableSegment) visit(ctx.tableName()); + result.getTables().add(table); + result.getAllSQLSegments().add(table); + return result; + } + + @SuppressWarnings("unchecked") + @Override + public ASTNode visitTruncateTable(final TruncateTableContext ctx) { + TruncateStatement result = new TruncateStatement(); + TableSegment table = (TableSegment) visit(ctx.tableName()); + result.getTables().add(table); + result.getAllSQLSegments().add(table); + return result; + } + + @Override + public ASTNode visitCreateIndex(final CreateIndexContext ctx) { + CreateIndexStatement result = new CreateIndexStatement(); + if (null != ctx.createIndexDefinitionClause_().tableIndexClause_()) { + TableSegment table = (TableSegment) visit(ctx.createIndexDefinitionClause_().tableIndexClause_().tableName()); + result.setTable(table); + result.getAllSQLSegments().add(table); + } + return result; + } + + @Override + public ASTNode visitAlterIndex(final AlterIndexContext ctx) { + return new AlterIndexStatement(); + } + + @Override + public ASTNode visitDropIndex(final DropIndexContext ctx) { + return new DropIndexStatement(); + } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/engine/VisitorParameterizedParsingTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/engine/VisitorParameterizedParsingTest.java index 2e2a519b631129c432edbc2c88f781b43cfdcf48..fdf440511f7fd5435bbd6ffeb16907d529718df4 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/engine/VisitorParameterizedParsingTest.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/test/java/org/apache/shardingsphere/sql/parser/integrate/engine/VisitorParameterizedParsingTest.java @@ -98,8 +98,8 @@ public final class VisitorParameterizedParsingTest { if (isPassedSqlCase(sqlCaseId)) { continue; } -// if (!"MySQL".contains(databaseType) && !"PostgreSQL".contains(databaseType) && !"Oracle".contains(databaseType)) { - if (!"MySQL".contains(databaseType) && !"PostgreSQL".contains(databaseType)) { + if (!"MySQL".contains(databaseType) && !"PostgreSQL".contains(databaseType) && !"Oracle".contains(databaseType)) { +// if (!"MySQL".contains(databaseType) && !"PostgreSQL".contains(databaseType)) { continue; } try { @@ -131,8 +131,22 @@ public final class VisitorParameterizedParsingTest { sqlCases.add("show_index_with_indexes_with_table_and_database"); sqlCases.add("show_index_with_database_back_quotes"); sqlCases.add("show_index_with_table_back_quotes"); + // TODO cannot support insert all + sqlCases.add("insert_all_with_all_placeholders"); + // TODO cannot parse create index behind pk in create table statement + sqlCases.add("create_table_with_create_index"); + // TODO cannot parse using index behind pk in create table statement + sqlCases.add("create_table_with_exist_index"); // On the one hand, visitor parser can not give the right stop index for any sql with alias, on the other hand, the old parser can not handle all sql cases correctly. sqlCases.add("select_with_expression"); + sqlCases.add("select_pagination_with_row_number"); + sqlCases.add("select_pagination_with_row_number_and_diff_group_by_and_order_by"); + sqlCases.add("select_pagination_with_row_number_and_diff_group_by_and_order_by"); + sqlCases.add("select_pagination_with_row_number_and_group_by_and_order_by"); + sqlCases.add("select_pagination_with_row_number_for_greater_than"); + sqlCases.add("select_pagination_with_row_number_for_greater_than_and_equal"); + sqlCases.add("alter_table_add_foreign_key"); + sqlCases.add("alter_table_add_primary_foreign_key"); return sqlCases.contains(sqlCaseId); }