未验证 提交 f8d4ad02 编写于 作者: J JingShang Lu 提交者: GitHub

ref 4671 (#4789)

* fix mysql ColumnDefinitionSegment,change type of dataType from String to DataTypeSegment

* Filter out some tests for h2

* go back

* fix

* change attr name of DataTypeLength from firstNumber secondNumber to precision scale

* revert testcase

* revert testcase
Co-authored-by: Nlujingshang1 <lujingshang1@jd.com>
Co-authored-by: NTernence <lujingshang@126.com>
上级 2239180a
......@@ -108,7 +108,7 @@ unreservedWord
| SUBJECT | ISSUER | OLD | RANDOM | RETAIN | MAX_USER_CONNECTIONS | MAX_CONNECTIONS_PER_HOUR | MAX_UPDATES_PER_HOUR
| MAX_QUERIES_PER_HOUR | REUSE | OPTIONAL | HISTORY | NEVER | EXPIRE | TYPE | CONTEXT | CODE | CHANNEL | SOURCE
| IO_THREAD | SQL_THREAD | SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS | MASTER_LOG_FILE | MASTER_LOG_POS | RELAY_LOG_FILE
| RELAY_LOG_POS | SQL_AFTER_MTS_GAPS | UNTIL | DEFAULT_AUTH | PLUGIN_DIR | STOP
| RELAY_LOG_POS | SQL_AFTER_MTS_GAPS | UNTIL | DEFAULT_AUTH | PLUGIN_DIR | STOP | SIGNED
;
variable
......@@ -494,7 +494,7 @@ orderByItem
;
dataType
: dataTypeName dataTypeLength? characterSet_? collateClause_? UNSIGNED? ZEROFILL? | dataTypeName LP_ STRING_ (COMMA_ STRING_)* RP_ characterSet_? collateClause_?
: dataTypeName dataTypeLength? characterSet_? collateClause_? (UNSIGNED | SIGNED)? ZEROFILL? | dataTypeName collectionOptions characterSet_? collateClause_?
;
dataTypeName
......@@ -508,6 +508,10 @@ dataTypeLength
: LP_ NUMBER_ (COMMA_ NUMBER_)? RP_
;
collectionOptions
: LP_ STRING_ (COMMA_ STRING_)* RP_
;
characterSet_
: (CHARACTER | CHAR) SET EQ_? ignoredIdentifier_
;
......
......@@ -219,6 +219,10 @@ UNSIGNED
: U N S I G N E D
;
SIGNED
: S I G N E D
;
UPGRADE
: U P G R A D E
;
......
......@@ -23,6 +23,8 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DataTypeLengthContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DataTypeContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AggregationFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.BitValueLiteralsContext;
......@@ -92,6 +94,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateLeftBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
......@@ -109,6 +113,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.parametermarker.ParameterM
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* MySQL visitor.
......@@ -584,6 +589,35 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
}
}
@Override
public final ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment dataTypeSegment = new DataTypeSegment();
dataTypeSegment.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
dataTypeSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeSegment.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
dataTypeSegment.setDataLength(dataTypeLengthSegment);
}
return dataTypeSegment;
}
@Override
public final ASTNode visitDataTypeLength(final DataTypeLengthContext ctx) {
DataTypeLengthSegment dataTypeLengthSegment = new DataTypeLengthSegment();
dataTypeLengthSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeLengthSegment.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
if (numbers.size() == 1) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
}
if (numbers.size() == 2) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
dataTypeLengthSegment.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return dataTypeLengthSegment;
}
@Override
public final ASTNode visitOrderByClause(final OrderByClauseContext ctx) {
Collection<OrderByItemSegment> items = new LinkedList<>();
......
......@@ -65,6 +65,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.position.Colu
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.ddl.constraint.DropPrimaryKeySegment;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateDatabaseStatement;
......@@ -78,7 +79,6 @@ import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropViewStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.RenameTableStatement;
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.keyword.KeywordValue;
import java.util.Collection;
import java.util.Collections;
......@@ -225,10 +225,10 @@ public final class MySQLDDLVisitor extends MySQLVisitor implements DDLVisitor {
@Override
public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataTypeSegment = (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = isPrimaryKey(ctx);
ColumnDefinitionSegment result = new ColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), isPrimaryKey);
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey);
result.getReferencedTables().addAll(getReferencedTables(ctx));
return result;
}
......
......@@ -24,6 +24,7 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AggregationFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitValueLiteralsContext;
......@@ -83,6 +84,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateLeftBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
......@@ -100,6 +103,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.parametermarker.ParameterM
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Oracle visitor.
......@@ -499,4 +503,34 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
}
return new ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
}
@Override
public final ASTNode visitDataType(final OracleStatementParser.DataTypeContext ctx) {
DataTypeSegment dataTypeSegment = new DataTypeSegment();
dataTypeSegment.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
dataTypeSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeSegment.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
dataTypeSegment.setDataLength(dataTypeLengthSegment);
}
return dataTypeSegment;
}
@Override
public final ASTNode visitDataTypeLength(final OracleStatementParser.DataTypeLengthContext ctx) {
DataTypeLengthSegment dataTypeLengthSegment = new DataTypeLengthSegment();
dataTypeLengthSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeLengthSegment.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
if (numbers.size() == 1) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
}
if (numbers.size() == 2) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
dataTypeLengthSegment.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return dataTypeLengthSegment;
}
}
......@@ -49,6 +49,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropCol
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.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
......@@ -58,7 +59,6 @@ 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.keyword.KeywordValue;
import java.util.Collection;
import java.util.Collections;
......@@ -106,10 +106,10 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
@Override
public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = isPrimaryKey(ctx);
ColumnDefinitionSegment result = new ColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), isPrimaryKey);
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey);
for (InlineConstraintContext each : ctx.inlineConstraint()) {
if (null != each.referencesClause()) {
result.getReferencedTables().add((SimpleTableSegment) visit(each.referencesClause().tableName()));
......@@ -219,9 +219,9 @@ public final class OracleDDLVisitor extends OracleVisitor implements DDLVisitor
@Override
public ASTNode visitModifyColProperties(final ModifyColPropertiesContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
// TODO visit pk and reference table
return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), false);
return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false);
}
@Override
......
......@@ -24,6 +24,7 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AggregationFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.BitValueLiteralsContext;
......@@ -85,6 +86,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateLeftBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
......@@ -102,6 +105,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.parametermarker.ParameterM
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* PostgreSQL visitor.
......@@ -532,4 +536,33 @@ public abstract class PostgreSQLVisitor extends PostgreSQLStatementBaseVisitor<A
}
return new ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
}
@Override
public final ASTNode visitDataType(final PostgreSQLStatementParser.DataTypeContext ctx) {
DataTypeSegment dataTypeSegment = new DataTypeSegment();
dataTypeSegment.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
dataTypeSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeSegment.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
dataTypeSegment.setDataLength(dataTypeLengthSegment);
}
return dataTypeSegment;
}
@Override
public final ASTNode visitDataTypeLength(final PostgreSQLStatementParser.DataTypeLengthContext ctx) {
DataTypeLengthSegment dataTypeLengthSegment = new DataTypeLengthSegment();
dataTypeLengthSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeLengthSegment.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
if (numbers.size() == 1) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
}
if (numbers.size() == 2) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
dataTypeLengthSegment.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return dataTypeLengthSegment;
}
}
......@@ -52,6 +52,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.RenameC
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;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateIndexStatement;
......@@ -60,7 +61,6 @@ 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.keyword.KeywordValue;
import java.util.Collection;
import java.util.Collections;
......@@ -162,10 +162,10 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
@Override
public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = isPrimaryKey(ctx);
ColumnDefinitionSegment result = new ColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), isPrimaryKey);
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey);
for (ColumnConstraintContext each : ctx.columnConstraint()) {
if (null != each.columnConstraintOption().tableName()) {
result.getReferencedTables().add((SimpleTableSegment) visit(each.columnConstraintOption().tableName()));
......@@ -200,8 +200,8 @@ public final class PostgreSQLDDLVisitor extends PostgreSQLVisitor implements DDL
public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) {
// 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, dataType.getValue(), false);
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false);
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
......
......@@ -24,6 +24,8 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.DataTypeContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.DataTypeLengthContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.AggregationFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.BitValueLiteralsContext;
......@@ -79,6 +81,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateLeftBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
......@@ -96,6 +100,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.parametermarker.ParameterM
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* SQL92 visitor.
......@@ -481,4 +486,33 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
return new IndexOrderByItemSegment(ctx.numberLiterals().getStart().getStartIndex(), ctx.numberLiterals().getStop().getStopIndex(),
SQLUtil.getExactlyNumber(ctx.numberLiterals().getText(), 10).intValue(), orderDirection);
}
@Override
public final ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment dataTypeSegment = new DataTypeSegment();
dataTypeSegment.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
dataTypeSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeSegment.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
dataTypeSegment.setDataLength(dataTypeLengthSegment);
}
return dataTypeSegment;
}
@Override
public final ASTNode visitDataTypeLength(final DataTypeLengthContext ctx) {
DataTypeLengthSegment dataTypeLengthSegment = new DataTypeLengthSegment();
dataTypeLengthSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeLengthSegment.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
if (numbers.size() == 1) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
}
if (numbers.size() == 2) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
dataTypeLengthSegment.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return dataTypeLengthSegment;
}
}
......@@ -39,12 +39,12 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.DropCol
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.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.CreateTableStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.DropTableStatement;
import org.apache.shardingsphere.sql.parser.sql.value.collection.CollectionValue;
import org.apache.shardingsphere.sql.parser.sql.value.keyword.KeywordValue;
import org.apache.shardingsphere.sql.parser.sql92.visitor.SQL92Visitor;
import java.util.Collections;
......@@ -88,10 +88,10 @@ public final class SQL92DDLVisitor extends SQL92Visitor implements DDLVisitor {
@Override
public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = isPrimaryKey(ctx);
ColumnDefinitionSegment result = new ColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), isPrimaryKey);
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey);
for (DataTypeOptionContext each : ctx.dataTypeOption()) {
if (null != each.referenceDefinition()) {
result.getReferencedTables().add((SimpleTableSegment) visit(each.referenceDefinition().tableName()));
......
......@@ -23,6 +23,8 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementBaseVisitor;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DataTypeContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DataTypeLengthContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AggregationFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.BitExprContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.BitValueLiteralsContext;
......@@ -83,6 +85,8 @@ import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.Pred
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateLeftBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightBracketValue;
import org.apache.shardingsphere.sql.parser.sql.segment.dml.predicate.value.PredicateRightValue;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeLengthSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.OwnerSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.TableNameSegment;
......@@ -100,6 +104,7 @@ import org.apache.shardingsphere.sql.parser.sql.value.parametermarker.ParameterM
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* SQLServer visitor.
......@@ -495,4 +500,33 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
}
return new ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
}
@Override
public final ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment dataTypeSegment = new DataTypeSegment();
dataTypeSegment.setDataTypeName(((KeywordValue) visit(ctx.dataTypeName())).getValue());
dataTypeSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeSegment.setStopIndex(ctx.stop.getStopIndex());
if (null != ctx.dataTypeLength()) {
DataTypeLengthSegment dataTypeLengthSegment = (DataTypeLengthSegment) visit(ctx.dataTypeLength());
dataTypeSegment.setDataLength(dataTypeLengthSegment);
}
return dataTypeSegment;
}
@Override
public final ASTNode visitDataTypeLength(final DataTypeLengthContext ctx) {
DataTypeLengthSegment dataTypeLengthSegment = new DataTypeLengthSegment();
dataTypeLengthSegment.setStartIndex(ctx.start.getStartIndex());
dataTypeLengthSegment.setStopIndex(ctx.stop.getStartIndex());
List<TerminalNode> numbers = ctx.NUMBER_();
if (numbers.size() == 1) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
}
if (numbers.size() == 2) {
dataTypeLengthSegment.setPrecision(Integer.parseInt(numbers.get(0).getText()));
dataTypeLengthSegment.setScale(Integer.parseInt(numbers.get(1).getText()));
}
return dataTypeLengthSegment;
}
}
......@@ -47,6 +47,7 @@ import org.apache.shardingsphere.sql.parser.sql.segment.ddl.column.alter.ModifyC
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;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterIndexStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.ddl.AlterTableStatement;
......@@ -56,7 +57,6 @@ 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.keyword.KeywordValue;
import org.apache.shardingsphere.sql.parser.sqlserver.visitor.SQLServerVisitor;
import java.util.Collection;
......@@ -102,10 +102,10 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
@Override
public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
KeywordValue dataType = (KeywordValue) visit(ctx.dataType().dataTypeName());
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
boolean isPrimaryKey = isPrimaryKey(ctx);
ColumnDefinitionSegment result = new ColumnDefinitionSegment(
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType.getValue(), isPrimaryKey);
ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey);
for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
if (null != columnConstraint.columnForeignKeyConstraint()) {
......@@ -211,8 +211,8 @@ public final class SQLServerDDLVisitor extends SQLServerVisitor implements DDLVi
public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) {
// 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, dataType.getValue(), false);
DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false);
return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
}
......
......@@ -21,6 +21,7 @@ import lombok.Getter;
import lombok.Setter;
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.DataTypeSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.table.SimpleTableSegment;
import java.util.Collection;
import java.util.LinkedList;
......@@ -38,13 +39,13 @@ public final class ColumnDefinitionSegment implements CreateDefinitionSegment {
private ColumnSegment columnName;
private String dataType;
private DataTypeSegment dataType;
private boolean primaryKey;
private final Collection<SimpleTableSegment> referencedTables = new LinkedList<>();
public ColumnDefinitionSegment(final int startIndex, final int stopIndex, final ColumnSegment columnName, final String dataType, final boolean primaryKey) {
public ColumnDefinitionSegment(final int startIndex, final int stopIndex, final ColumnSegment columnName, final DataTypeSegment dataType, final boolean primaryKey) {
this.startIndex = startIndex;
this.stopIndex = stopIndex;
this.columnName = columnName;
......
/*
* 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.generic;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
import java.util.Optional;
@Getter
@Setter
public final class DataTypeLengthSegment implements SQLSegment {
private int startIndex;
private int stopIndex;
private int precision;
private int scale;
/**
* get secondNumber.
* @return Optional.
*/
public Optional<Integer> getScale() {
return Optional.ofNullable(scale);
}
}
/*
* 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.generic;
import lombok.Getter;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
@Getter
@Setter
public final class DataTypeSegment implements SQLSegment {
private int startIndex;
private int stopIndex;
private String dataTypeName;
private DataTypeLengthSegment dataLength;
}
......@@ -42,7 +42,7 @@ public final class ColumnDefinitionAssert {
*/
public static void assertIs(final SQLCaseAssertContext assertContext, final ColumnDefinitionSegment actual, final ExpectedColumnDefinition expected) {
assertThat(assertContext.getText("Column definition name assertion error: "), actual.getColumnName().getIdentifier().getValue(), is(expected.getColumn().getName()));
assertThat(assertContext.getText("Column definition data type assertion error: "), actual.getDataType(), is(expected.getType()));
assertThat(assertContext.getText("Column definition data type assertion error: "), actual.getDataType().getDataTypeName(), is(expected.getType()));
assertThat(assertContext.getText("Column definition primary key assertion error: "), actual.isPrimaryKey(), is(expected.isPrimaryKey()));
TableAssert.assertIs(assertContext, actual.getReferencedTables(), expected.getReferencedTables());
assertThat(assertContext.getText("Column definition start index assertion error: "), actual.getStartIndex(), is(expected.getStartIndex()));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册