diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/SetAssignmentsExtractor.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/SetAssignmentsExtractor.java index a7e6ff7730655..1603ee1476230 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/SetAssignmentsExtractor.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/SetAssignmentsExtractor.java @@ -24,8 +24,6 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.SetAssignmentsSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CommonExpressionSegment; import java.util.Collection; import java.util.HashMap; @@ -47,17 +45,15 @@ public Optional extract(final ParserRuleContext ancestorN if (!setAssignmentsClauseNode.isPresent()) { return Optional.absent(); } - Collection columnSegments = new LinkedList<>(); - Collection valueSegments = new LinkedList<>(); + Collection assignmentSegments = new LinkedList<>(); assignmentExtractor = new AssignmentExtractor(getPlaceholderIndexes(ancestorNode)); for (ParserRuleContext each : ExtractorUtils.getAllDescendantNodes(ancestorNode, RuleName.ASSIGNMENT)) { Optional assignmentSegment = assignmentExtractor.extract(each); if (assignmentSegment.isPresent()) { - columnSegments.add(assignmentSegment.get().getColumn()); - valueSegments.add(assignmentSegment.get().getValue()); + assignmentSegments.add(assignmentSegment.get()); } } - return Optional.of(new SetAssignmentsSegment(setAssignmentsClauseNode.get().getStart().getStartIndex(), columnSegments, valueSegments)); + return Optional.of(new SetAssignmentsSegment(setAssignmentsClauseNode.get().getStart().getStartIndex(), assignmentSegments)); } private Map getPlaceholderIndexes(final ParserRuleContext rootNode) { diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/InsertDuplicateKeyColumnsExtractor.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/OnDuplicateKeyColumnsExtractor.java similarity index 82% rename from sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/InsertDuplicateKeyColumnsExtractor.java rename to sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/OnDuplicateKeyColumnsExtractor.java index 74b3d811c7b3a..6060f3cf08a40 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/InsertDuplicateKeyColumnsExtractor.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/impl/dml/insert/OnDuplicateKeyColumnsExtractor.java @@ -24,27 +24,27 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils; import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.InsertDuplicateKeyColumnsSegment; +import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.OnDuplicateKeyColumnsSegment; import java.util.Collection; import java.util.LinkedList; /** - * Insert duplicate key columns extractor. + * On duplicate key columns extractor. * * @author zhangliang */ -public final class InsertDuplicateKeyColumnsExtractor implements OptionalSQLSegmentExtractor { +public final class OnDuplicateKeyColumnsExtractor implements OptionalSQLSegmentExtractor { private final ColumnExtractor columnExtractor = new ColumnExtractor(); @Override - public Optional extract(final ParserRuleContext ancestorNode) { - Optional onDuplicateKeyClauseNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.INSERT_ON_DUPLICATE_KEY_CLAUSE); + public Optional extract(final ParserRuleContext ancestorNode) { + Optional onDuplicateKeyClauseNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.ON_DUPLICATE_KEY_CLAUSE); if (!onDuplicateKeyClauseNode.isPresent()) { return Optional.absent(); } - return Optional.of(new InsertDuplicateKeyColumnsSegment(extractColumnSegments(onDuplicateKeyClauseNode.get()))); + return Optional.of(new OnDuplicateKeyColumnsSegment(extractColumnSegments(onDuplicateKeyClauseNode.get()))); } private Collection extractColumnSegments(final ParserRuleContext onDuplicateKeyClauseNode) { diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/util/RuleName.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/util/RuleName.java index 862506ceaa798..22ac32fd82e65 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/util/RuleName.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/extractor/util/RuleName.java @@ -75,7 +75,7 @@ public enum RuleName { INSERT_VALUES_CLAUSE("InsertValuesClause"), - INSERT_ON_DUPLICATE_KEY_CLAUSE("InsertOnDuplicateKeyClause"), + ON_DUPLICATE_KEY_CLAUSE("OnDuplicateKeyClause"), SET_ASSIGNMENTS_CLAUSE("SetAssignmentsClause"), diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java index db302039f6d2a..530bc05c6331e 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptOrConditionFiller.java @@ -36,7 +36,9 @@ import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * Encrypt or condition filler. @@ -76,11 +78,17 @@ private void fillColumnTableMap(final SQLStatement sqlStatement, final ShardingT private OrCondition filterCondition(final ShardingTableMetaData shardingTableMetaData, final SQLStatement sqlStatement, final OrConditionSegment orCondition, final EncryptRule encryptRule) { OrCondition result = new OrCondition(); + Set filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { continue; } + if(filledConditionStopIndexes.contains(condition.getStopIndex())) { + continue; + }else { + filledConditionStopIndexes.add(condition.getStopIndex()); + } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, sqlStatement, condition)); fillEncryptCondition(column, condition, encryptRule, sqlStatement); } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptSetAssignmentsFiller.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptSetAssignmentsFiller.java index 1d8bd92c49f36..819e697d5ee88 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptSetAssignmentsFiller.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/encrypt/dml/EncryptSetAssignmentsFiller.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData; import org.apache.shardingsphere.core.parse.antlr.constant.QuoteCharacter; import org.apache.shardingsphere.core.parse.antlr.filler.SQLSegmentFiller; +import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.SetAssignmentsSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CommonExpressionSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.InsertStatement; import org.apache.shardingsphere.core.parse.lexer.token.DefaultKeyword; @@ -49,8 +49,8 @@ public final class EncryptSetAssignmentsFiller implements SQLSegmentFiller columnValues = new LinkedList<>(); - for (CommonExpressionSegment each : sqlSegment.getValues()) { - Optional sqlExpression = each.convertToSQLExpression(sql); + for (AssignmentSegment each : sqlSegment.getAssignments()) { + Optional sqlExpression = each.getValue().convertToSQLExpression(sql); if (sqlExpression.isPresent()) { columnValues.add(sqlExpression.get()); if (sqlExpression.get() instanceof SQLPlaceholderExpression) { diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java index 35a6aa8122d6f..ed2c9577d42e7 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/OrConditionFiller.java @@ -17,7 +17,14 @@ package org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml; -import com.google.common.base.Optional; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.shardingsphere.core.constant.ShardingOperator; import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData; import org.apache.shardingsphere.core.metadata.table.TableMetaData; @@ -39,11 +46,7 @@ import org.apache.shardingsphere.core.parse.parser.token.TableToken; import org.apache.shardingsphere.core.rule.ShardingRule; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import com.google.common.base.Optional; /** * Or condition filler. @@ -122,6 +125,7 @@ private OrCondition filterCondition(final ShardingTableMetaData shardingTableMet break; } } + Set filledConditionStopIndexes = new HashSet<>(); for (AndConditionSegment each : orCondition.getAndConditions()) { for (ConditionSegment condition : each.getConditions()) { if (null == condition.getColumn()) { @@ -130,6 +134,11 @@ private OrCondition filterCondition(final ShardingTableMetaData shardingTableMet if (condition.getExpression() instanceof ColumnSegment) { continue; } + if(filledConditionStopIndexes.contains(condition.getStopIndex())) { + continue; + }else { + filledConditionStopIndexes.add(condition.getStopIndex()); + } Column column = new Column(condition.getColumn().getName(), getTableName(shardingTableMetaData, shardingRule, sqlStatement, condition)); fillEncryptCondition(column, condition, shardingRule, sqlStatement); } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/SetAssignmentsFiller.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/SetAssignmentsFiller.java index 1d7275fa49d54..17e3b2a79f0b3 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/SetAssignmentsFiller.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/SetAssignmentsFiller.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData; import org.apache.shardingsphere.core.parse.antlr.constant.QuoteCharacter; import org.apache.shardingsphere.core.parse.antlr.filler.SQLSegmentFiller; +import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.AssignmentSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.SetAssignmentsSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CommonExpressionSegment; @@ -55,19 +56,19 @@ public final class SetAssignmentsFiller implements SQLSegmentFiller columns = insertStatement.getColumns().iterator(); int parametersCount = 0; List columnValues = new LinkedList<>(); - for (CommonExpressionSegment each : sqlSegment.getValues()) { - SQLExpression columnValue = getColumnValue(insertStatement, shardingRule, andCondition, columns.next(), each); + for (AssignmentSegment each : sqlSegment.getAssignments()) { + SQLExpression columnValue = getColumnValue(insertStatement, shardingRule, andCondition, columns.next(), each.getValue()); columnValues.add(columnValue); if (columnValue instanceof SQLPlaceholderExpression) { parametersCount++; diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/InsertDuplicateKeyColumnsFiller.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/OnDuplicateKeyColumnsFiller.java similarity index 88% rename from sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/InsertDuplicateKeyColumnsFiller.java rename to sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/OnDuplicateKeyColumnsFiller.java index c070e876c73b2..37ef7dc74f564 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/InsertDuplicateKeyColumnsFiller.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/filler/sharding/dml/insert/OnDuplicateKeyColumnsFiller.java @@ -20,21 +20,21 @@ import org.apache.shardingsphere.core.metadata.table.ShardingTableMetaData; import org.apache.shardingsphere.core.parse.antlr.filler.SQLSegmentFiller; import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.InsertDuplicateKeyColumnsSegment; +import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.OnDuplicateKeyColumnsSegment; import org.apache.shardingsphere.core.parse.antlr.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.lexer.token.Literals; import org.apache.shardingsphere.core.parse.parser.exception.SQLParsingException; import org.apache.shardingsphere.core.rule.ShardingRule; /** - * Insert duplicate key columns filler. + * On duplicate key columns filler. * * @author zhangliang */ -public final class InsertDuplicateKeyColumnsFiller implements SQLSegmentFiller { +public final class OnDuplicateKeyColumnsFiller implements SQLSegmentFiller { @Override - public void fill(final InsertDuplicateKeyColumnsSegment sqlSegment, + public void fill(final OnDuplicateKeyColumnsSegment sqlSegment, final SQLStatement sqlStatement, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) { String tableName = sqlStatement.getTables().getSingleTableName(); for (ColumnSegment each : sqlSegment.getColumns()) { diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/assignment/SetAssignmentsSegment.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/assignment/SetAssignmentsSegment.java index c050a0b5c7454..c1c68717bbe7a 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/assignment/SetAssignmentsSegment.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/assignment/SetAssignmentsSegment.java @@ -20,8 +20,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.parse.antlr.sql.segment.SQLSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment; -import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.expr.CommonExpressionSegment; import java.util.Collection; @@ -36,7 +34,5 @@ public final class SetAssignmentsSegment implements SQLSegment { private final int startIndex; - private final Collection columns; - - private final Collection values; + private final Collection assignments; } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/InsertDuplicateKeyColumnsSegment.java b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/OnDuplicateKeyColumnsSegment.java similarity index 90% rename from sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/InsertDuplicateKeyColumnsSegment.java rename to sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/OnDuplicateKeyColumnsSegment.java index 6f887dc32b50e..0106680b41670 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/InsertDuplicateKeyColumnsSegment.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/java/org/apache/shardingsphere/core/parse/antlr/sql/segment/dml/column/OnDuplicateKeyColumnsSegment.java @@ -24,13 +24,13 @@ import java.util.Collection; /** - * Insert duplicate key columns segment. + * On duplicate key columns segment. * * @author zhangliang */ @RequiredArgsConstructor @Getter -public final class InsertDuplicateKeyColumnsSegment implements SQLSegment { +public final class OnDuplicateKeyColumnsSegment implements SQLSegment { private final Collection columns; } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/common/extractor-rule-definition.xml b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/common/extractor-rule-definition.xml index 3b5dffe2ed103..04c6be0050bc8 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/common/extractor-rule-definition.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/common/extractor-rule-definition.xml @@ -29,7 +29,7 @@ - + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/sharding/common/filler-rule-definition.xml b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/sharding/common/filler-rule-definition.xml index d71abba4d4bb6..cfc915840349f 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/sharding/common/filler-rule-definition.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-common/src/main/resources/META-INF/parsing-rule-definition/sharding/common/filler-rule-definition.xml @@ -20,7 +20,7 @@ - + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 b/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 index 37ef9d2ee1b39..0e25e2224d3f9 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 +++ b/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 @@ -20,7 +20,7 @@ grammar DMLStatement; import Symbol, Keyword, Literals, BaseRule; insert - : INSERT insertSpecification_ INTO? tableName partitionNames_? (insertValuesClause | setAssignmentsClause | insertSelectClause) insertOnDuplicateKeyClause? + : INSERT insertSpecification_ INTO? tableName partitionNames_? (insertValuesClause | setAssignmentsClause | insertSelectClause) onDuplicateKeyClause? ; insertSpecification_ @@ -39,7 +39,7 @@ insertSelectClause : columnNames? select ; -insertOnDuplicateKeyClause +onDuplicateKeyClause : ON DUPLICATE KEY UPDATE assignment (COMMA_ assignment)* ; diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/resources/META-INF/parsing-rule-definition/sharding/mysql/sql-statement-rule-definition.xml b/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/resources/META-INF/parsing-rule-definition/sharding/mysql/sql-statement-rule-definition.xml index 15b801cfe90ef..7204a87a28348 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/resources/META-INF/parsing-rule-definition/sharding/mysql/sql-statement-rule-definition.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-mysql/src/main/resources/META-INF/parsing-rule-definition/sharding/mysql/sql-statement-rule-definition.xml @@ -26,7 +26,7 @@ - + actual, final ExpectedTokens expected) { + void assertEncryptColumnsToken(final Collection actual, final ExpectedTokens expected) { List encryptColumnTokens = getEncryptColumnTokens(actual); assertThat(assertMessage.getFullAssertMessage("Encrypt column tokens size error: "), encryptColumnTokens.size(), is(expected.getEncryptColumnTokens().size())); int count = 0; @@ -49,8 +52,13 @@ void assertIndexToken(final Collection actual, final ExpectedTokens ex } private void assertEncryptColumnToken(final EncryptColumnToken actual, final ExpectedEncryptColumnToken expected) { - assertThat(assertMessage.getFullAssertMessage("Encrypt column start index assertion error: "), actual.getStartIndex(), is(expected.getStartIndex())); - assertThat(assertMessage.getFullAssertMessage("Encrypt column stop index assertion error: "), actual.getStopIndex(), is(expected.getStopIndex())); + if(SQLCaseType.Placeholder == sqlCaseType){ + assertThat(assertMessage.getFullAssertMessage("Encrypt column start index for placeholder assertion error: "), actual.getStartIndex(), is(expected.getStartIndexForPlaceholder())); + assertThat(assertMessage.getFullAssertMessage("Encrypt column stop index for placeholder assertion error: "), actual.getStopIndex(), is(expected.getStopIndexForPlaceholder())); + }else { + assertThat(assertMessage.getFullAssertMessage("Encrypt column start index for literal assertion error: "), actual.getStartIndex(), is(expected.getStartIndexForLiteral())); + assertThat(assertMessage.getFullAssertMessage("Encrypt column stop index for literal assertion error: "), actual.getStopIndex(), is(expected.getStopIndexForLiteral())); + } assertNotNull(assertMessage.getFullAssertMessage("Encrypt column does not exist assertion error: "), expected.getColumn()); assertTrue(assertMessage.getFullAssertMessage("Missing encrypt column assertion error: "), actual.getColumn() != null); assertThat(assertMessage.getFullAssertMessage("Encrypt column name assertion error: "), actual.getColumn().getName(), is(expected.getColumn().getName())); diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/asserts/token/TokenAssert.java b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/asserts/token/TokenAssert.java index c9651596e8053..afd21e5ffaf31 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/asserts/token/TokenAssert.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/asserts/token/TokenAssert.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.core.parse.integrate.asserts.token; +import org.apache.shardingsphere.core.constant.DatabaseType; import org.apache.shardingsphere.core.parse.integrate.asserts.SQLStatementAssertMessage; import org.apache.shardingsphere.core.parse.integrate.jaxb.token.ExpectedTokens; import org.apache.shardingsphere.core.parse.parser.token.SQLToken; @@ -51,7 +52,11 @@ public final class TokenAssert { private final AggregationDistinctTokenAssert aggregationDistinctTokenAssert; - public TokenAssert(final SQLCaseType sqlCaseType, final SQLStatementAssertMessage assertMessage) { + private final EncryptColumnTokenAssert encryptColumnTokenAssert; + + private final DatabaseType databaseType; + + public TokenAssert(final SQLCaseType sqlCaseType, final SQLStatementAssertMessage assertMessage, final DatabaseType databaseType) { tableTokenAssert = new TableTokenAssert(assertMessage); schemaTokenAssert = new SchemaTokenAssert(assertMessage); indexTokenAssert = new IndexTokenAssert(assertMessage); @@ -62,6 +67,8 @@ public TokenAssert(final SQLCaseType sqlCaseType, final SQLStatementAssertMessag offsetTokenAssert = new OffsetTokenAssert(sqlCaseType, assertMessage); rowCountTokenAssert = new RowCountTokenAssert(sqlCaseType, assertMessage); aggregationDistinctTokenAssert = new AggregationDistinctTokenAssert(assertMessage); + encryptColumnTokenAssert = new EncryptColumnTokenAssert(sqlCaseType, assertMessage); + this.databaseType = databaseType; } /** @@ -81,5 +88,8 @@ public void assertTokens(final Collection actual, final ExpectedTokens offsetTokenAssert.assertOffsetToken(actual, expected); rowCountTokenAssert.assertRowCountToken(actual, expected); aggregationDistinctTokenAssert.assertAggregationDistinctTokens(actual, expected); + if(DatabaseType.MySQL == databaseType) { + encryptColumnTokenAssert.assertEncryptColumnsToken(actual, expected); + } } } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/engine/IntegrateSupportedSQLParsingTest.java b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/engine/IntegrateSupportedSQLParsingTest.java index 28b25aaa44d2c..0d5bb4ddaae90 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/engine/IntegrateSupportedSQLParsingTest.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/engine/IntegrateSupportedSQLParsingTest.java @@ -63,6 +63,6 @@ public void assertSupportedSQL() { return; } new SQLStatementAssert(new SQLParsingEngine( - databaseType, sql, getShardingRule(), getShardingTableMetaData(), new ParsingResultCache()).parse(false), sqlCaseId, sqlCaseType).assertSQLStatement(); + databaseType, sql, getShardingRule(), getShardingTableMetaData(), new ParsingResultCache()).parse(false), sqlCaseId, sqlCaseType, databaseType).assertSQLStatement(); } } diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/jaxb/token/ExpectedEncryptColumnToken.java b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/jaxb/token/ExpectedEncryptColumnToken.java index 887ebad9ca842..41cdcf4836034 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/jaxb/token/ExpectedEncryptColumnToken.java +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/java/org/apache/shardingsphere/core/parse/integrate/jaxb/token/ExpectedEncryptColumnToken.java @@ -29,11 +29,18 @@ @XmlAccessorType(XmlAccessType.FIELD) public final class ExpectedEncryptColumnToken { - @XmlAttribute(name = "start-index") - private int startIndex; + @XmlAttribute(name = "start-index-for-placeholder") + private int startIndexForPlaceholder; - @XmlAttribute(name = "stop-index") - private int stopIndex; + @XmlAttribute(name = "stop-index-for-placeholder") + private int stopIndexForPlaceholder; + + + @XmlAttribute(name = "start-index-for-literal") + private int startIndexForLiteral; + + @XmlAttribute(name = "stop-index-for-literal") + private int stopIndexForLiteral; private ExpectedColumn column; diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/delete.xml b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/delete.xml index 33d8c40edc5ae..28eb5dcc13c0c 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/delete.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/delete.xml @@ -23,6 +23,9 @@ + + + @@ -34,6 +37,13 @@ + + + + + + + @@ -42,7 +52,17 @@ + + + + + + + + + + @@ -51,7 +71,17 @@ + + + + + + + + + + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select.xml b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select.xml index c48810a4d735d..075c37a1f6fc2 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select.xml @@ -318,6 +318,9 @@ + + + @@ -334,6 +337,13 @@ + + + + + + + @@ -344,6 +354,9 @@ + + + @@ -360,6 +373,13 @@ + + + + + + + @@ -747,7 +767,17 @@ + + + + + + + + + + @@ -756,7 +786,17 @@ + + + + + + + + + + @@ -765,7 +805,17 @@ + + + + + + + + + + @@ -774,7 +824,17 @@ + + + + + + + + + + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_or.xml b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_or.xml index 333dd21d22d9b..ed2640a05d373 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_or.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_or.xml @@ -65,7 +65,17 @@ + + + + + + + + + + @@ -74,6 +84,9 @@ + + + @@ -90,6 +103,13 @@ + + + + + + + @@ -98,6 +118,9 @@ + + + @@ -133,6 +156,13 @@ + + + + + + + @@ -172,6 +202,9 @@ + + + @@ -191,5 +224,12 @@ + + + + + + + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_order_by.xml b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_order_by.xml index 6a0a3de65c50b..dfaafa5e0702e 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_order_by.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/select_order_by.xml @@ -43,11 +43,21 @@ o.order_id AS ORDER_BY_DERIVED_0 + + + + + + + + + + @@ -75,12 +85,22 @@ o.order_id AS ORDER_BY_DERIVED_0 + + + + + + + + + + diff --git a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/update.xml b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/update.xml index 473153d9904c6..cea6d59099ee7 100644 --- a/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/update.xml +++ b/sharding-core/sharding-core-parse/sharding-core-parse-test/src/test/resources/parser/update.xml @@ -23,6 +23,9 @@ + + + @@ -42,6 +45,9 @@ + + + @@ -80,6 +86,9 @@ + + + @@ -89,6 +98,9 @@ + + + @@ -108,6 +120,9 @@ + + + @@ -146,6 +161,9 @@ + + + @@ -165,6 +183,9 @@ + + + diff --git a/sharding-sql-test/src/main/resources/sql/dql/select.xml b/sharding-sql-test/src/main/resources/sql/dql/select.xml index dcd6b834556fe..4f9ff5008c9bb 100644 --- a/sharding-sql-test/src/main/resources/sql/dql/select.xml +++ b/sharding-sql-test/src/main/resources/sql/dql/select.xml @@ -58,8 +58,8 @@ - - + +