未验证 提交 09c4c50a 编写于 作者: L Liang Zhang 提交者: GitHub

Parse constraint for ALTER TABLE (#4508)

* add AlterTableStatement.addedConstraintDefinitions

* adjust rule seq for mysql ddl

* refactor AlterTableStatement.addedColumnDefinitions' type from ColumnDefinitionSegment to AddColumnDefinitionSegment

* refactor AddColumnDefinitionSegment.columnDefinition to columnDefinitions

* add AlterDefinitionSegment

* add AlterTableStatement.addConstraintDefinitions

* refactor alter table for add constraint of MySQLDDLVisitor

* refactor alter table for add constraint of MySQLDDLVisitor

* refactor alter table for modify column of MySQLDDLVisitor

* refactor alter table for drop column of MySQLDDLVisitor

* refactor alter table of Oracle

* refactor alter table of SQLServer

* refactor alter table of PostgreSQL

* refactor alter table of SQL92

* for checkstyle

* fix new test cases
上级 7b0a34d8
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.sql.segment.ddl;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
/**
* Alter definition segment.
*/
public interface AlterDefinitionSegment extends SQLSegment {
}
......@@ -21,23 +21,25 @@ import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.ColumnPositionSegment;
import java.util.Collection;
/**
* Add column definition segment.
*/
@RequiredArgsConstructor
@Getter
@Setter
public final class AddColumnDefinitionSegment implements SQLSegment {
public final class AddColumnDefinitionSegment implements AlterDefinitionSegment {
private final int startIndex;
private final int stopIndex;
private final ColumnDefinitionSegment columnDefinition;
private final Collection<ColumnDefinitionSegment> columnDefinitions;
private ColumnPositionSegment columnPosition;
......
......@@ -20,7 +20,8 @@ package org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import java.util.Collection;
......@@ -30,11 +31,11 @@ import java.util.Collection;
@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
public final class DropColumnDefinitionSegment implements SQLSegment {
public final class DropColumnDefinitionSegment implements AlterDefinitionSegment {
private final int startIndex;
private final int stopIndex;
private final Collection<String> columnNames;
private final Collection<ColumnSegment> columns;
}
......@@ -21,7 +21,7 @@ import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.ColumnPositionSegment;
......@@ -31,7 +31,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.Colu
@RequiredArgsConstructor
@Getter
@Setter
public final class ModifyColumnDefinitionSegment implements SQLSegment {
public final class ModifyColumnDefinitionSegment implements AlterDefinitionSegment {
private final int startIndex;
......
......@@ -21,6 +21,7 @@ import com.google.common.base.Optional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
......@@ -34,7 +35,7 @@ import java.util.LinkedList;
@RequiredArgsConstructor
@Getter
@Setter
public final class ConstraintDefinitionSegment implements CreateDefinitionSegment {
public final class ConstraintDefinitionSegment implements CreateDefinitionSegment, AlterDefinitionSegment {
private final int startIndex;
......
......@@ -18,8 +18,11 @@
package org.apache.shardingsphere.sql.parser.sql.statement.ddl;
import lombok.Getter;
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.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.generic.TableSegmentsAvailable;
......@@ -35,9 +38,13 @@ public final class AlterTableStatement extends DDLStatement implements TableSegm
private final Collection<TableSegment> tables = new LinkedList<>();
private final Collection<ColumnDefinitionSegment> addedColumnDefinitions = new LinkedList<>();
private final Collection<AddColumnDefinitionSegment> addColumnDefinitions = new LinkedList<>();
private final Collection<ColumnPositionSegment> changedPositionColumns = new TreeSet<>();
private final Collection<ConstraintDefinitionSegment> addConstraintDefinitions = new LinkedList<>();
private final Collection<ModifyColumnDefinitionSegment> modifyColumnDefinitions = new LinkedList<>();
private final Collection<String> droppedColumnNames = new LinkedList<>();
private final Collection<DropColumnDefinitionSegment> dropColumnDefinitions = new LinkedList<>();
private final Collection<ColumnPositionSegment> changedPositionColumns = new TreeSet<>();
}
......@@ -23,14 +23,6 @@ createTable
: CREATE createTableSpecification_? TABLE tableNotExistClause_ tableName (createDefinitionClause | createLikeClause)
;
createIndex
: CREATE createIndexSpecification_ INDEX indexName indexType_? ON tableName keyParts_ indexOption_?
(
ALGORITHM EQ_? (DEFAULT | INPLACE | COPY)
| LOCK EQ_? (DEFAULT | NONE | SHARED | EXCLUSIVE)
)*
;
alterTable
: ALTER TABLE tableName alterDefinitionClause?
;
......@@ -48,6 +40,14 @@ truncateTable
: TRUNCATE TABLE? tableName
;
createIndex
: CREATE createIndexSpecification_ INDEX indexName indexType_? ON tableName keyParts_ indexOption_?
(
ALGORITHM EQ_? (DEFAULT | INPLACE | COPY)
| LOCK EQ_? (DEFAULT | NONE | SHARED | EXCLUSIVE)
)*
;
createDatabase
: CREATE (DATABASE | SCHEMA) (IF NOT EXISTS)? schemaName createDatabaseSpecification_*
;
......@@ -347,6 +347,7 @@ alterSpecification
| ALTER COLUMN? columnName (SET DEFAULT literals | DROP DEFAULT)
| ALTER INDEX indexName (VISIBLE | INVISIBLE)
| changeColumnSpecification
| modifyColumnSpecification
| DEFAULT? characterSet_ collateClause_?
| CONVERT TO characterSet_ collateClause_?
| (DISABLE | ENABLE) KEYS
......@@ -357,8 +358,7 @@ alterSpecification
| DROP FOREIGN KEY ignoredIdentifier_
| FORCE
| LOCK EQ_? (DEFAULT | NONE | SHARED | EXCLUSIVE)
| modifyColumnSpecification
// TODO hongjun investigate ORDER BY col_name [, col_name] ...
// TODO investigate ORDER BY col_name [, col_name] ...
| ORDER BY columnNames
| renameColumnSpecification
| renameIndexSpecification
......@@ -431,6 +431,10 @@ changeColumnSpecification
: CHANGE COLUMN? columnName columnDefinition firstOrAfterColumn?
;
modifyColumnSpecification
: MODIFY COLUMN? columnDefinition firstOrAfterColumn?
;
dropColumnSpecification
: DROP COLUMN? columnName
;
......@@ -443,10 +447,6 @@ dropPrimaryKeySpecification
: DROP primaryKey
;
modifyColumnSpecification
: MODIFY COLUMN? columnDefinition firstOrAfterColumn?
;
renameColumnSpecification
: RENAME COLUMN columnName TO columnName
;
......
......@@ -17,13 +17,10 @@
package org.apache.shardingsphere.sql.parser.visitor.impl;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.base.Preconditions;
import org.antlr.v4.runtime.Token;
import org.apache.shardingsphere.sql.parser.api.visitor.DDLVisitor;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AddColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AddConstraintSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterDefinitionClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableContext;
......@@ -49,7 +46,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameC
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StorageOptionContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TruncateTableContext;
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.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.AddColumnDefinitionSegment;
......@@ -76,7 +73,6 @@ import org.apache.shardingsphere.sql.parser.visitor.MySQLVisitor;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* DDL visitor for MySQL.
......@@ -130,94 +126,82 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
return visit(ctx.tableName());
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement result = new AlterTableStatement();
TableSegment table = (TableSegment) visit(ctx.tableName());
result.getTables().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);
for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
if (each instanceof AddColumnDefinitionSegment) {
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
for (ColumnDefinitionSegment columnDefinition : ((AddColumnDefinitionSegment) each).getColumnDefinitions()) {
result.getTables().addAll(columnDefinition.getReferencedTables());
}
} else if (each instanceof ModifyColumnDefinitionSegment) {
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
result.getTables().addAll(((ModifyColumnDefinitionSegment) each).getColumnDefinition().getReferencedTables());
} else if (each instanceof DropColumnDefinitionSegment) {
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
} else if (each instanceof ConstraintDefinitionSegment) {
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
// CHECKSTYLE:OFF
if (((ConstraintDefinitionSegment) each).getReferencedTable().isPresent()) {
// CHECKSTYLE:ON
result.getTables().add(((ConstraintDefinitionSegment) each).getReferencedTable().get());
}
}
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
final AlterTableStatement result = new AlterTableStatement();
CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
for (AlterSpecificationContext each : ctx.alterSpecification()) {
AddColumnSpecificationContext addColumnSpecification = each.addColumnSpecification();
if (null != addColumnSpecification) {
CollectionValue<AddColumnDefinitionSegment> addColumnDefinitions = (CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification);
for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) {
result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition());
Optional<ColumnPositionSegment> columnPositionSegment = addColumnDefinition.getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
}
result.getAllSQLSegments().addAll(getTableSegments(addColumnSpecification.columnDefinition()));
if (null != each.addColumnSpecification()) {
result.getValue().add((AddColumnDefinitionSegment) visit(each.addColumnSpecification()));
}
AddConstraintSpecificationContext addConstraintSpecification = each.addConstraintSpecification();
ForeignKeyOptionContext foreignKeyOption = null == addConstraintSpecification ? null : addConstraintSpecification.constraintDefinition().foreignKeyOption();
if (null != foreignKeyOption) {
result.getAllSQLSegments().add((TableSegment) visit(foreignKeyOption));
if (null != each.addConstraintSpecification()) {
result.getValue().add((ConstraintDefinitionSegment) visit(each.addConstraintSpecification().constraintDefinition()));
}
ChangeColumnSpecificationContext changeColumnSpecification = each.changeColumnSpecification();
if (null != changeColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(changeColumnSpecification)).getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
if (null != each.changeColumnSpecification()) {
ModifyColumnDefinitionSegment modifyColumnDefinition = new ModifyColumnDefinitionSegment(
each.changeColumnSpecification().getStart().getStartIndex(), each.changeColumnSpecification().getStop().getStopIndex(),
(ColumnDefinitionSegment) visit(each.changeColumnSpecification().columnDefinition()));
if (null != each.changeColumnSpecification().firstOrAfterColumn()) {
modifyColumnDefinition.setColumnPosition((ColumnPositionSegment) visit(each.changeColumnSpecification().firstOrAfterColumn()));
}
result.getAllSQLSegments().addAll(getTableSegments(changeColumnSpecification.columnDefinition()));
result.getValue().add(modifyColumnDefinition);
}
DropColumnSpecificationContext dropColumnSpecification = each.dropColumnSpecification();
if (null != dropColumnSpecification) {
result.getDroppedColumnNames().addAll(((DropColumnDefinitionSegment) visit(dropColumnSpecification)).getColumnNames());
}
ModifyColumnSpecificationContext modifyColumnSpecification = each.modifyColumnSpecification();
if (null != modifyColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
if (null != each.modifyColumnSpecification()) {
ModifyColumnDefinitionSegment modifyColumnDefinition = new ModifyColumnDefinitionSegment(
each.modifyColumnSpecification().getStart().getStartIndex(), each.modifyColumnSpecification().getStop().getStopIndex(),
(ColumnDefinitionSegment) visit(each.modifyColumnSpecification().columnDefinition()));
if (null != each.modifyColumnSpecification().firstOrAfterColumn()) {
modifyColumnDefinition.setColumnPosition((ColumnPositionSegment) visit(each.modifyColumnSpecification().firstOrAfterColumn()));
}
result.getAllSQLSegments().addAll(getTableSegments(modifyColumnSpecification.columnDefinition()));
result.getValue().add(modifyColumnDefinition);
}
if (null != each.dropColumnSpecification()) {
result.getValue().add((DropColumnDefinitionSegment) visit(each.dropColumnSpecification()));
}
}
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<AddColumnDefinitionSegment> result = new CollectionValue<>();
List<AddColumnDefinitionSegment> addColumnDefinitions = Lists.transform(ctx.columnDefinition(), new Function<ColumnDefinitionContext, AddColumnDefinitionSegment>() {
@Override
public AddColumnDefinitionSegment apply(final ColumnDefinitionContext columnDefinition) {
return new AddColumnDefinitionSegment(columnDefinition.getStart().getStartIndex(), columnDefinition.getStop().getStopIndex(), (ColumnDefinitionSegment) visit(columnDefinition));
}
});
if (null == ctx.firstOrAfterColumn()) {
result.getValue().addAll(addColumnDefinitions);
} else {
AddColumnDefinitionSegment addColumnDefinition = addColumnDefinitions.get(0);
addColumnDefinition.setColumnPosition(getColumnPositionSegment(addColumnDefinition.getColumnDefinition(), (ColumnPositionSegment) visit(ctx.firstOrAfterColumn())));
result.getValue().add(addColumnDefinition);
Collection<ColumnDefinitionSegment> columnDefinitions = new LinkedList<>();
for (ColumnDefinitionContext each : ctx.columnDefinition()) {
columnDefinitions.add((ColumnDefinitionSegment) visit(each));
}
AddColumnDefinitionSegment result = new AddColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinitions);
if (null != ctx.firstOrAfterColumn()) {
Preconditions.checkState(1 == columnDefinitions.size());
result.setColumnPosition(getColumnPositionSegment(columnDefinitions.iterator().next(), (ColumnPositionSegment) visit(ctx.firstOrAfterColumn())));
}
return result;
}
......@@ -287,8 +271,7 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
@Override
public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
return new DropColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList(((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue()));
return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList((ColumnSegment) visit(ctx.columnName())));
}
@Override
......@@ -329,31 +312,13 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
@Override
public ASTNode visitFirstOrAfterColumn(final FirstOrAfterColumnContext ctx) {
return null == ctx.columnName() ? new ColumnFirstPositionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null)
: new ColumnAfterPositionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null, ((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue());
}
private Collection<TableSegment> getTableSegments(final List<ColumnDefinitionContext> columnDefinitions) {
Collection<TableSegment> result = new LinkedList<>();
for (ColumnDefinitionContext each : columnDefinitions) {
result.addAll(getTableSegments(each));
}
return result;
}
private Collection<TableSegment> getTableSegments(final ColumnDefinitionContext columnDefinition) {
Collection<TableSegment> result = new LinkedList<>();
for (StorageOptionContext each : columnDefinition.storageOption()) {
if (null != each.dataTypeGenericOption() && null != each.dataTypeGenericOption().referenceDefinition()) {
result.add((TableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
}
}
for (GeneratedOptionContext each : columnDefinition.generatedOption()) {
if (null != each.dataTypeGenericOption() && null != each.dataTypeGenericOption().referenceDefinition()) {
result.add((TableSegment) visit(each.dataTypeGenericOption().referenceDefinition()));
}
String columnName = null;
if (null != ctx.columnName()) {
columnName = ((ColumnSegment) visit(ctx.columnName())).getQualifiedName();
}
return result;
return null == ctx.columnName() ? new ColumnFirstPositionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnName)
: new ColumnAfterPositionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnName, ((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue());
}
private ColumnPositionSegment getColumnPositionSegment(final ColumnDefinitionSegment columnDefinition, final ColumnPositionSegment columnPosition) {
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sql.parser.visitor.impl;
import com.google.common.base.Optional;
import org.apache.shardingsphere.sql.parser.api.visitor.DDLVisitor;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AddColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDefinitionClauseContext;
......@@ -29,26 +28,24 @@ import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Column
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.ModifyColPropertiesContext;
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.OutOfLineConstraintContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OutOfLineRefConstraintContext;
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.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
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.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
......@@ -64,6 +61,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
import org.apache.shardingsphere.sql.parser.visitor.OracleVisitor;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
/**
......@@ -139,29 +137,6 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
return false;
}
private Collection<TableSegment> getTableSegments(final ColumnDefinitionContext columnDefinition) {
Collection<TableSegment> 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<TableSegment> getTableSegments(final VirtualColumnDefinitionContext virtualColumnDefinition) {
Collection<TableSegment> result = new LinkedList<>();
for (InlineConstraintContext each : virtualColumnDefinition.inlineConstraint()) {
if (null != each.referencesClause()) {
result.add((TableSegment) visit(each.referencesClause().tableName()));
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitOutOfLineConstraint(final OutOfLineConstraintContext ctx) {
......@@ -184,20 +159,35 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement result = new AlterTableStatement();
TableSegment table = (TableSegment) visit(ctx.tableName());
result.getTables().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);
for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
if (each instanceof AddColumnDefinitionSegment) {
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
for (ColumnDefinitionSegment columnDefinition : ((AddColumnDefinitionSegment) each).getColumnDefinitions()) {
result.getTables().addAll(columnDefinition.getReferencedTables());
}
} else if (each instanceof ModifyColumnDefinitionSegment) {
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
// CHECKSTYLE:OFF
if (null != ((ModifyColumnDefinitionSegment) each).getColumnDefinition()) {
// CHECKSTYLE:ON
result.getTables().addAll(((ModifyColumnDefinitionSegment) each).getColumnDefinition().getReferencedTables());
}
} else if (each instanceof DropColumnDefinitionSegment) {
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
} else if (each instanceof ConstraintDefinitionSegment) {
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
// CHECKSTYLE:OFF
if (((ConstraintDefinitionSegment) each).getReferencedTable().isPresent()) {
// CHECKSTYLE:ON
result.getTables().add(((ConstraintDefinitionSegment) each).getReferencedTable().get());
}
}
}
}
......@@ -207,85 +197,62 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
final AlterTableStatement result = new AlterTableStatement();
CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
if (null != ctx.columnClauses()) {
for (OperateColumnClauseContext each : ctx.columnClauses().operateColumnClause()) {
AddColumnSpecificationContext addColumnSpecification = each.addColumnSpecification();
if (null != addColumnSpecification) {
CollectionValue<AddColumnDefinitionSegment> addColumnDefinitions = (CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification);
for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) {
result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition());
Optional<ColumnPositionSegment> 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
}
if (null != each.addColumnSpecification()) {
result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(each.addColumnSpecification())).getValue());
}
ModifyColumnSpecificationContext modifyColumnSpecification = each.modifyColumnSpecification();
if (null != modifyColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition();
// TODO refactor SQLStatement
// CHECKSTYLE:OFF
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
// CHECKSTYLE:ON
if (null != each.modifyColumnSpecification()) {
result.getValue().add((ModifyColumnDefinitionSegment) visit(each.modifyColumnSpecification()));
}
DropColumnClauseContext dropColumnClause = each.dropColumnClause();
if (null != dropColumnClause) {
result.getDroppedColumnNames().addAll(((DropColumnDefinitionSegment) visit(dropColumnClause)).getColumnNames());
if (null != each.dropColumnClause()) {
result.getValue().add((DropColumnDefinitionSegment) visit(each.dropColumnClause()));
}
}
}
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<AddColumnDefinitionSegment> 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()));
each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(),
Collections.singletonList((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);
// TODO handle no columnDefinition and multiple columnDefinitions
ColumnDefinitionSegment columnDefinition = null;
for (ModifyColPropertiesContext each : ctx.modifyColProperties()) {
columnDefinition = (ColumnDefinitionSegment) visit(each);
}
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
@Override
public ASTNode visitModifyColProperties(final ModifyColPropertiesContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
// TODO visit pk and reference table
return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getQualifiedName(), dataType.getValue(), false);
}
@Override
public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
Collection<String> columnNames = new LinkedList<>();
Collection<ColumnSegment> columns = new LinkedList<>();
for (ColumnNameContext each : ctx.columnOrColumnList().columnName()) {
columnNames.add(((ColumnSegment) visit(each)).getIdentifier().getValue());
columns.add((ColumnSegment) visit(each));
}
return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnNames);
return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
}
@SuppressWarnings("unchecked")
......
......@@ -17,10 +17,8 @@
package org.apache.shardingsphere.sql.parser.visitor.impl;
import com.google.common.base.Optional;
import org.apache.shardingsphere.sql.parser.api.visitor.DDLVisitor;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AddColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AddConstraintSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AlterDefinitionClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AlterTableActionContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AlterTableContext;
......@@ -38,19 +36,17 @@ import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.In
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ModifyColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.RenameColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableConstraintContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableConstraintOptionContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableNameClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableNamesClauseContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TruncateTableContext;
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.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
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.alter.RenameColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.ColumnPositionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
......@@ -112,19 +108,35 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement result = new AlterTableStatement();
result.getTables().add((TableSegment) visit(ctx.tableNameClause()));
TableSegment table = (TableSegment) visit(ctx.tableNameClause().tableName());
result.getTables().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);
for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
if (each instanceof AddColumnDefinitionSegment) {
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
for (ColumnDefinitionSegment columnDefinition : ((AddColumnDefinitionSegment) each).getColumnDefinitions()) {
result.getTables().addAll(columnDefinition.getReferencedTables());
}
} else if (each instanceof ModifyColumnDefinitionSegment) {
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
// CHECKSTYLE:OFF
if (null != ((ModifyColumnDefinitionSegment) each).getColumnDefinition()) {
// CHECKSTYLE:ON
result.getTables().addAll(((ModifyColumnDefinitionSegment) each).getColumnDefinition().getReferencedTables());
}
} else if (each instanceof DropColumnDefinitionSegment) {
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
} else if (each instanceof ConstraintDefinitionSegment) {
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
// CHECKSTYLE:OFF
if (((ConstraintDefinitionSegment) each).getReferencedTable().isPresent()) {
// CHECKSTYLE:ON
result.getTables().add(((ConstraintDefinitionSegment) each).getReferencedTable().get());
}
}
}
}
......@@ -134,52 +146,25 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
final AlterTableStatement result = new AlterTableStatement();
CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
if (null != ctx.alterTableActions()) {
for (AlterTableActionContext each : ctx.alterTableActions().alterTableAction()) {
AddColumnSpecificationContext addColumnSpecification = each.addColumnSpecification();
if (null != addColumnSpecification) {
CollectionValue<AddColumnDefinitionSegment> addColumnDefinitions = (CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification);
for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) {
result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition());
Optional<ColumnPositionSegment> columnPositionSegment = addColumnDefinition.getColumnPosition();
// TODO refactor SQLStatement
// CHECKSTYLE:OFF
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
// CHECKSTYLE:ON
}
result.getAllSQLSegments().addAll(getTableSegments(addColumnSpecification.columnDefinition()));
result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification)).getValue());
}
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()));
if (null != each.addConstraintSpecification() && null != each.addConstraintSpecification().tableConstraint()) {
result.getValue().add((ConstraintDefinitionSegment) visit(each.addConstraintSpecification().tableConstraint()));
}
ModifyColumnSpecificationContext modifyColumnSpecification = each.modifyColumnSpecification();
if (null != modifyColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition();
// TODO refactor SQLStatement
// CHECKSTYLE:OFF
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
// CHECKSTYLE:ON
if (null != each.modifyColumnSpecification()) {
result.getValue().add((ModifyColumnDefinitionSegment) visit(each.modifyColumnSpecification()));
}
DropColumnSpecificationContext dropColumnSpecification = each.dropColumnSpecification();
if (null != dropColumnSpecification) {
result.getDroppedColumnNames().addAll(((DropColumnDefinitionSegment) visit(dropColumnSpecification)).getColumnNames());
if (null != each.dropColumnSpecification()) {
result.getValue().add((DropColumnDefinitionSegment) visit(each.dropColumnSpecification()));
}
}
}
if (result.getAddedColumnDefinitions().isEmpty()) {
result.getAllSQLSegments().addAll(result.getAddedColumnDefinitions());
}
if (result.getChangedPositionColumns().isEmpty()) {
result.getAllSQLSegments().addAll(result.getChangedPositionColumns());
}
return result;
}
......@@ -189,7 +174,7 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
ColumnDefinitionContext columnDefinition = ctx.columnDefinition();
if (null != columnDefinition) {
AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
ctx.columnDefinition().getStart().getStartIndex(), columnDefinition.getStop().getStopIndex(), (ColumnDefinitionSegment) visit(columnDefinition));
ctx.columnDefinition().getStart().getStartIndex(), columnDefinition.getStop().getStopIndex(), Collections.singletonList((ColumnDefinitionSegment) visit(columnDefinition)));
result.getValue().add(addColumnDefinition);
}
return result;
......@@ -234,14 +219,17 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
@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);
// TODO visit pk and table ref
ColumnSegment column = (ColumnSegment) visit(ctx.modifyColumn().columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getQualifiedName(), dataType.getValue(), false);
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
@Override
public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
return new DropColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList(((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue()));
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList((ColumnSegment) visit(ctx.columnName())));
}
@Override
......@@ -250,16 +238,6 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
((ColumnSegment) visit(ctx.columnName(0))).getIdentifier().getValue(), ((ColumnSegment) visit(ctx.columnName(1))).getIdentifier().getValue());
}
private Collection<TableSegment> getTableSegments(final ColumnDefinitionContext columnDefinition) {
Collection<TableSegment> 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) {
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sql.parser.visitor.impl;
import com.google.common.base.Optional;
import org.apache.shardingsphere.sql.parser.api.visitor.DDLVisitor;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.AddColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.AlterDefinitionClauseContext;
......@@ -32,13 +31,12 @@ import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.DropCol
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.DropTableContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.ModifyColumnSpecificationContext;
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.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
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.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
......@@ -131,19 +129,31 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement result = new AlterTableStatement();
result.getTables().add((TableSegment) visit(ctx.tableName()));
TableSegment table = (TableSegment) visit(ctx.tableName());
result.getTables().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);
for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
if (each instanceof AddColumnDefinitionSegment) {
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
for (ColumnDefinitionSegment columnDefinition : ((AddColumnDefinitionSegment) each).getColumnDefinitions()) {
result.getTables().addAll(columnDefinition.getReferencedTables());
}
} else if (each instanceof ModifyColumnDefinitionSegment) {
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
result.getTables().addAll(((ModifyColumnDefinitionSegment) each).getColumnDefinition().getReferencedTables());
} else if (each instanceof DropColumnDefinitionSegment) {
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
} else if (each instanceof ConstraintDefinitionSegment) {
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
// CHECKSTYLE:OFF
if (((ConstraintDefinitionSegment) each).getReferencedTable().isPresent()) {
// CHECKSTYLE:ON
result.getTables().add(((ConstraintDefinitionSegment) each).getReferencedTable().get());
}
}
}
}
......@@ -153,33 +163,15 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
final AlterTableStatement result = new AlterTableStatement();
AddColumnSpecificationContext addColumnSpecification = ctx.addColumnSpecification();
if (null != addColumnSpecification) {
CollectionValue<AddColumnDefinitionSegment> addColumnDefinitions = (CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification);
for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) {
result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition());
Optional<ColumnPositionSegment> columnPositionSegment = addColumnDefinition.getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
}
CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
if (null != ctx.addColumnSpecification()) {
result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.addColumnSpecification())).getValue());
}
ModifyColumnSpecificationContext modifyColumnSpecification = ctx.modifyColumnSpecification();
if (null != modifyColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
if (null != ctx.modifyColumnSpecification()) {
result.getValue().add((ModifyColumnDefinitionSegment) visit(ctx.modifyColumnSpecification()));
}
if (null != ctx.dropColumnSpecification()) {
result.getDroppedColumnNames().addAll(((DropColumnDefinitionSegment) visit(ctx.dropColumnSpecification())).getColumnNames());
}
if (result.getAddedColumnDefinitions().isEmpty()) {
result.getAllSQLSegments().addAll(result.getAddedColumnDefinitions());
}
if (result.getChangedPositionColumns().isEmpty()) {
result.getAllSQLSegments().addAll(result.getChangedPositionColumns());
result.getValue().add((DropColumnDefinitionSegment) visit(ctx.dropColumnSpecification()));
}
return result;
}
......@@ -188,23 +180,24 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) {
CollectionValue<AddColumnDefinitionSegment> result = new CollectionValue<>();
AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
ctx.columnDefinition().getStart().getStartIndex(), ctx.columnDefinition().getStop().getStopIndex(), (ColumnDefinitionSegment) visit(ctx.columnDefinition()));
ctx.columnDefinition().getStart().getStartIndex(), ctx.columnDefinition().getStop().getStopIndex(),
Collections.singletonList((ColumnDefinitionSegment) visit(ctx.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);
// TODO visit pk and table ref
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ColumnDefinitionSegment) visit(ctx.columnDefinition()));
}
@Override
public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
return new DropColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList(((ColumnSegment) visit(ctx.columnName())).getIdentifier().getValue()));
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), Collections.singletonList((ColumnSegment) visit(ctx.columnName())));
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitDropTable(final DropTableContext ctx) {
......
......@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sql.parser.visitor.impl;
import com.google.common.base.Optional;
import org.apache.shardingsphere.sql.parser.api.visitor.DDLVisitor;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AddColumnSpecificationContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterColumnAddOptionContext;
......@@ -39,13 +38,12 @@ import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Mod
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableConstraintContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TruncateTableContext;
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.AlterDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.CreateDefinitionSegment;
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.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
......@@ -62,6 +60,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
import org.apache.shardingsphere.sql.parser.visitor.SQLServerVisitor;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
/**
......@@ -163,19 +162,35 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
return result;
}
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterTable(final AlterTableContext ctx) {
AlterTableStatement result = new AlterTableStatement();
result.getTables().add((TableSegment) visit(ctx.tableName()));
TableSegment table = (TableSegment) visit(ctx.tableName());
result.getTables().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);
for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
if (each instanceof AddColumnDefinitionSegment) {
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
for (ColumnDefinitionSegment columnDefinition : ((AddColumnDefinitionSegment) each).getColumnDefinitions()) {
result.getTables().addAll(columnDefinition.getReferencedTables());
}
} else if (each instanceof ModifyColumnDefinitionSegment) {
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
// CHECKSTYLE:OFF
if (null != ((ModifyColumnDefinitionSegment) each).getColumnDefinition()) {
// CHECKSTYLE:ON
result.getTables().addAll(((ModifyColumnDefinitionSegment) each).getColumnDefinition().getReferencedTables());
}
} else if (each instanceof DropColumnDefinitionSegment) {
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
} else if (each instanceof ConstraintDefinitionSegment) {
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
// CHECKSTYLE:OFF
if (((ConstraintDefinitionSegment) each).getReferencedTable().isPresent()) {
// CHECKSTYLE:ON
result.getTables().add(((ConstraintDefinitionSegment) each).getReferencedTable().get());
}
}
}
}
......@@ -185,33 +200,15 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
@SuppressWarnings("unchecked")
@Override
public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
final AlterTableStatement result = new AlterTableStatement();
AddColumnSpecificationContext addColumnSpecification = ctx.addColumnSpecification();
if (null != addColumnSpecification) {
CollectionValue<AddColumnDefinitionSegment> addColumnDefinitions = (CollectionValue<AddColumnDefinitionSegment>) visit(addColumnSpecification);
for (AddColumnDefinitionSegment addColumnDefinition : addColumnDefinitions.getValue()) {
result.getAddedColumnDefinitions().add(addColumnDefinition.getColumnDefinition());
Optional<ColumnPositionSegment> columnPositionSegment = addColumnDefinition.getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
}
CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
if (null != ctx.addColumnSpecification()) {
result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.addColumnSpecification())).getValue());
}
ModifyColumnSpecificationContext modifyColumnSpecification = ctx.modifyColumnSpecification();
if (null != modifyColumnSpecification) {
Optional<ColumnPositionSegment> columnPositionSegment = ((ModifyColumnDefinitionSegment) visit(modifyColumnSpecification)).getColumnPosition();
if (columnPositionSegment.isPresent()) {
result.getChangedPositionColumns().add(columnPositionSegment.get());
}
if (null != ctx.modifyColumnSpecification()) {
result.getValue().add((ModifyColumnDefinitionSegment) visit(ctx.modifyColumnSpecification()));
}
if (null != ctx.alterDrop() && null != ctx.alterDrop().dropColumnSpecification()) {
result.getDroppedColumnNames().addAll(((DropColumnDefinitionSegment) visit(ctx.alterDrop().dropColumnSpecification())).getColumnNames());
}
if (result.getAddedColumnDefinitions().isEmpty()) {
result.getAllSQLSegments().addAll(result.getAddedColumnDefinitions());
}
if (result.getChangedPositionColumns().isEmpty()) {
result.getAllSQLSegments().addAll(result.getChangedPositionColumns());
result.getValue().add((DropColumnDefinitionSegment) visit(ctx.alterDrop().dropColumnSpecification()));
}
return result;
}
......@@ -223,7 +220,8 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
for (AlterColumnAddOptionContext each : ctx.alterColumnAddOptions().alterColumnAddOption()) {
if (null != each.columnDefinition()) {
AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(), (ColumnDefinitionSegment) visit(each.columnDefinition()));
each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(),
Collections.singletonList((ColumnDefinitionSegment) visit(each.columnDefinition())));
result.getValue().add(addColumnDefinition);
}
}
......@@ -233,17 +231,20 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
@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);
// TODO visit pk and table ref
ColumnSegment column = (ColumnSegment) visit(ctx.alterColumnOperation().columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column.getQualifiedName(), dataType.getValue(), false);
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
@Override
public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
Collection<String> columnNames = new LinkedList<>();
Collection<ColumnSegment> columns = new LinkedList<>();
for (ColumnNameContext each : ctx.columnName()) {
columnNames.add(((ColumnSegment) visit(each)).getIdentifier().getValue());
columns.add((ColumnSegment) visit(each));
}
return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnNames);
return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
}
@SuppressWarnings("unchecked")
......
......@@ -46,12 +46,12 @@ public final class ColumnPositionAssert {
assertThat(assertContext.getText("Column change position name assertion error: "), actual.getColumnName(), is(expected.getColumn().getName()));
// TODO assert start index and stop index
if (actual instanceof ColumnAfterPositionSegment) {
assertNotNull(assertContext.getText("Assignments should existed."), expected.getAfterColumn());
assertNotNull(assertContext.getText("Assignments should exist."), expected.getAfterColumn());
assertThat(assertContext.getText("Column change position after name assertion error: "),
((ColumnAfterPositionSegment) actual).getAfterColumnName(), is(expected.getAfterColumn().getName()));
// TODO assert start index and stop index
} else {
assertNull(assertContext.getText("Assignments should not existed."), expected.getAfterColumn());
assertNull(assertContext.getText("Assignments should not exist."), expected.getAfterColumn());
}
}
}
......@@ -44,7 +44,7 @@ public final class OnDuplicateKeyColumnsAssert {
* @param expected expected on duplicate key columns
*/
public static void assertIs(final SQLCaseAssertContext assertContext, final OnDuplicateKeyColumnsSegment actual, final ExpectedOnDuplicateKeyColumns expected) {
assertNotNull(assertContext.getText("On duplicate key columns should existed."), expected);
assertNotNull(assertContext.getText("On duplicate key columns should exist."), expected);
// TODO assert start index and stop index
assertThat(assertContext.getText("On duplicate key columns size assertion error: "), actual.getColumns().size(), is(expected.getAssignments().size()));
int count = 0;
......
......@@ -44,7 +44,7 @@ public final class SetClauseAssert {
* @param expected expected set clause
*/
public static void assertIs(final SQLCaseAssertContext assertContext, final SetAssignmentSegment actual, final ExpectedSetClause expected) {
assertNotNull(assertContext.getText("Assignments should existed."), expected);
assertNotNull(assertContext.getText("Assignments should exist."), expected);
assertThat(assertContext.getText("Assignments size assertion error: "), actual.getAssignments().size(), is(expected.getAssignments().size()));
int count = 0;
for (AssignmentSegment each : actual.getAssignments()) {
......
......@@ -20,15 +20,30 @@ package org.apache.shardingsphere.sql.parser.integrate.asserts.statement.ddl.imp
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.integrate.asserts.SQLCaseAssertContext;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.column.ColumnAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.definition.ColumnDefinitionAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.definition.ColumnPositionAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.definition.ConstraintDefinitionAssert;
import org.apache.shardingsphere.sql.parser.integrate.asserts.segment.table.TableAssert;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedAddColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedModifyColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.statement.ddl.AlterTableStatementTestCase;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.ColumnDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.ColumnPositionSegment;
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.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
/**
......@@ -47,7 +62,8 @@ public final class AlterTableStatementAssert {
public static void assertIs(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertTable(assertContext, actual, expected);
assertAddColumnDefinitions(assertContext, actual, expected);
assertChangeColumnPositions(assertContext, actual, expected);
assertAddConstraintDefinitions(assertContext, actual, expected);
assertModifyColumnDefinitions(assertContext, actual, expected);
assertDropColumns(assertContext, actual, expected);
}
......@@ -57,30 +73,68 @@ public final class AlterTableStatementAssert {
}
private static void assertAddColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertThat(assertContext.getText("Added column definitions size assertion error: "), actual.getAddedColumnDefinitions().size(), is(expected.getAddColumns().size()));
assertThat(assertContext.getText("Add column definitions size assertion error: "), actual.getAddColumnDefinitions().size(), is(expected.getAddColumns().size()));
int count = 0;
for (AddColumnDefinitionSegment each : actual.getAddColumnDefinitions()) {
ExpectedAddColumnDefinition expectedAddColumnDefinition = expected.getAddColumns().get(count);
assertColumnDefinitions(assertContext, each.getColumnDefinitions(), expectedAddColumnDefinition.getColumnDefinitions());
if (each.getColumnPosition().isPresent()) {
assertNotNull(assertContext.getText("Column position should exist."), expectedAddColumnDefinition.getColumnPosition());
ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedAddColumnDefinition.getColumnPosition());
} else {
assertNull(assertContext.getText("Column position should not exist."), expectedAddColumnDefinition.getColumnPosition());
}
count++;
}
}
private static void assertColumnDefinitions(final SQLCaseAssertContext assertContext, final Collection<ColumnDefinitionSegment> actual, final List<ExpectedColumnDefinition> expected) {
int count = 0;
for (ColumnDefinitionSegment each : actual) {
ColumnDefinitionAssert.assertIs(assertContext, each, expected.get(count));
count++;
}
}
private static void assertAddConstraintDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
int count = 0;
for (ColumnDefinitionSegment each : actual.getAddedColumnDefinitions()) {
ColumnDefinitionAssert.assertIs(assertContext, each, expected.getAddColumns().get(count));
for (ConstraintDefinitionSegment each : actual.getAddConstraintDefinitions()) {
ConstraintDefinitionAssert.assertIs(assertContext, each, expected.getAddConstraints().get(count));
count++;
}
}
private static void assertChangeColumnPositions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertThat(assertContext.getText("Changed column positions size assertion error: "), actual.getChangedPositionColumns().size(), is(expected.getPositionChangedColumns().size()));
private static void assertModifyColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertThat(assertContext.getText("Modify column definitions size assertion error: "), actual.getModifyColumnDefinitions().size(), is(expected.getModifyColumns().size()));
int count = 0;
for (ColumnPositionSegment each : actual.getChangedPositionColumns()) {
ColumnPositionAssert.assertIs(assertContext, each, expected.getPositionChangedColumns().get(count));
for (ModifyColumnDefinitionSegment each : actual.getModifyColumnDefinitions()) {
ExpectedModifyColumnDefinition expectedModifyColumnDefinition = expected.getModifyColumns().get(count);
ColumnDefinitionAssert.assertIs(assertContext, each.getColumnDefinition(), expectedModifyColumnDefinition.getColumnDefinition());
if (each.getColumnPosition().isPresent()) {
assertNotNull(assertContext.getText("Column position should exist."), expectedModifyColumnDefinition.getColumnPosition());
ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedModifyColumnDefinition.getColumnPosition());
} else {
assertNull(assertContext.getText("Column position should not exist."), expectedModifyColumnDefinition.getColumnPosition());
}
count++;
}
}
private static void assertDropColumns(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertThat(assertContext.getText("Drop columns size assertion error: "), actual.getDroppedColumnNames().size(), is(expected.getDropColumns().size()));
Collection<ColumnSegment> actualDropColumns = getDropColumns(actual);
assertThat(assertContext.getText("Drop columns size assertion error: "), actualDropColumns.size(), is(expected.getDropColumns().size()));
int count = 0;
for (String each : actual.getDroppedColumnNames()) {
assertThat(assertContext.getText("Drop column name assertion error: "), each, is(expected.getDropColumns().get(count).getName()));
// TODO assert column
for (ColumnSegment each : actualDropColumns) {
ColumnAssert.assertIs(assertContext, each, expected.getDropColumns().get(count));
count++;
}
}
private static Collection<ColumnSegment> getDropColumns(final AlterTableStatement actual) {
Collection<ColumnSegment> result = new LinkedList<>();
for (DropColumnDefinitionSegment each : actual.getDropColumnDefinitions()) {
result.addAll(each.getColumns());
}
return result;
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.AbstractExpectedSQLSegment;
import javax.xml.bind.annotation.XmlElement;
import java.util.LinkedList;
import java.util.List;
/**
* Expected add column definition.
*/
@Getter
@Setter
public final class ExpectedAddColumnDefinition extends AbstractExpectedSQLSegment {
@XmlElement(name = "column-definition")
private final List<ExpectedColumnDefinition> columnDefinitions = new LinkedList<>();
@XmlElement(name = "column-position")
private ExpectedColumnPosition columnPosition;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.AbstractExpectedSQLSegment;
import javax.xml.bind.annotation.XmlElement;
/**
* Expected modify column definition.
*/
@Getter
@Setter
public final class ExpectedModifyColumnDefinition extends AbstractExpectedSQLSegment {
@XmlElement(name = "column-definition")
private ExpectedColumnDefinition columnDefinition;
@XmlElement(name = "column-position")
private ExpectedColumnPosition columnPosition;
}
......@@ -20,8 +20,9 @@ package org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.statement.ddl
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.column.ExpectedColumn;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedColumnPosition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedAddColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedConstraintDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.definition.ExpectedModifyColumnDefinition;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.segment.impl.table.ExpectedTable;
import org.apache.shardingsphere.sql.parser.integrate.jaxb.domain.statement.SQLParserTestCase;
......@@ -40,10 +41,13 @@ public final class AlterTableStatementTestCase extends SQLParserTestCase {
private final List<ExpectedTable> tables = new LinkedList<>();
@XmlElement(name = "add-column")
private final List<ExpectedColumnDefinition> addColumns = new LinkedList<>();
private final List<ExpectedAddColumnDefinition> addColumns = new LinkedList<>();
@XmlElement(name = "position-changed-column")
private final List<ExpectedColumnPosition> positionChangedColumns = new LinkedList<>();
@XmlElement(name = "add-constraint")
private final List<ExpectedConstraintDefinition> addConstraints = new LinkedList<>();
@XmlElement(name = "modify-column")
private final List<ExpectedModifyColumnDefinition> modifyColumns = new LinkedList<>();
@XmlElement(name = "drop-column")
private final List<ExpectedColumn> dropColumns = new LinkedList<>();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册