Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
 into dev_bug_fixs_2130
  • Loading branch information
codefairy08 committed Apr 8, 2019
2 parents d2ab308 + 5935cf6 commit b1aae30
Show file tree
Hide file tree
Showing 27 changed files with 279 additions and 67 deletions.
Expand Up @@ -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;
Expand All @@ -47,17 +45,15 @@ public Optional<SetAssignmentsSegment> extract(final ParserRuleContext ancestorN
if (!setAssignmentsClauseNode.isPresent()) {
return Optional.absent();
}
Collection<ColumnSegment> columnSegments = new LinkedList<>();
Collection<CommonExpressionSegment> valueSegments = new LinkedList<>();
Collection<AssignmentSegment> assignmentSegments = new LinkedList<>();
assignmentExtractor = new AssignmentExtractor(getPlaceholderIndexes(ancestorNode));
for (ParserRuleContext each : ExtractorUtils.getAllDescendantNodes(ancestorNode, RuleName.ASSIGNMENT)) {
Optional<AssignmentSegment> 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<ParserRuleContext, Integer> getPlaceholderIndexes(final ParserRuleContext rootNode) {
Expand Down
Expand Up @@ -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<InsertDuplicateKeyColumnsSegment> extract(final ParserRuleContext ancestorNode) {
Optional<ParserRuleContext> onDuplicateKeyClauseNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.INSERT_ON_DUPLICATE_KEY_CLAUSE);
public Optional<OnDuplicateKeyColumnsSegment> extract(final ParserRuleContext ancestorNode) {
Optional<ParserRuleContext> 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<ColumnSegment> extractColumnSegments(final ParserRuleContext onDuplicateKeyClauseNode) {
Expand Down
Expand Up @@ -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"),

Expand Down
Expand Up @@ -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.
Expand Down Expand Up @@ -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<Integer> 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);
}
Expand Down
Expand Up @@ -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;
Expand All @@ -49,8 +49,8 @@ public final class EncryptSetAssignmentsFiller implements SQLSegmentFiller<SetAs
public void fill(final SetAssignmentsSegment sqlSegment, final SQLStatement sqlStatement, final EncryptRule encryptRule, final ShardingTableMetaData shardingTableMetaData) {
InsertStatement insertStatement = (InsertStatement) sqlStatement;
String tableName = insertStatement.getTables().getSingleTableName();
for (ColumnSegment each : sqlSegment.getColumns()) {
fillColumn(each, insertStatement, tableName);
for (AssignmentSegment each : sqlSegment.getAssignments()) {
fillColumn(each.getColumn(), insertStatement, tableName);
}
InsertValue insertValue = getInsertValue(sqlSegment, sqlStatement.getLogicSQL());
insertStatement.getInsertValues().getValues().add(insertValue);
Expand All @@ -68,8 +68,8 @@ private void fillColumn(final ColumnSegment sqlSegment, final InsertStatement in
private InsertValue getInsertValue(final SetAssignmentsSegment sqlSegment, final String sql) {
int parametersCount = 0;
List<SQLExpression> columnValues = new LinkedList<>();
for (CommonExpressionSegment each : sqlSegment.getValues()) {
Optional<SQLExpression> sqlExpression = each.convertToSQLExpression(sql);
for (AssignmentSegment each : sqlSegment.getAssignments()) {
Optional<SQLExpression> sqlExpression = each.getValue().convertToSQLExpression(sql);
if (sqlExpression.isPresent()) {
columnValues.add(sqlExpression.get());
if (sqlExpression.get() instanceof SQLPlaceholderExpression) {
Expand Down
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -122,6 +125,7 @@ private OrCondition filterCondition(final ShardingTableMetaData shardingTableMet
break;
}
}
Set<Integer> filledConditionStopIndexes = new HashSet<>();
for (AndConditionSegment each : orCondition.getAndConditions()) {
for (ConditionSegment condition : each.getConditions()) {
if (null == condition.getColumn()) {
Expand All @@ -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);
}
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -55,19 +56,19 @@ public final class SetAssignmentsFiller implements SQLSegmentFiller<SetAssignmen
public void fill(final SetAssignmentsSegment sqlSegment, final SQLStatement sqlStatement, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) {
InsertStatement insertStatement = (InsertStatement) sqlStatement;
String tableName = insertStatement.getTables().getSingleTableName();
for (ColumnSegment each : sqlSegment.getColumns()) {
fillColumn(each, insertStatement, tableName);
for (AssignmentSegment each : sqlSegment.getAssignments()) {
fillColumn(each.getColumn(), insertStatement, tableName);
}
int columnCount = getColumnCountExcludeAssistedQueryColumns(insertStatement, shardingRule, shardingTableMetaData);
if (sqlSegment.getValues().size() != columnCount) {
if (sqlSegment.getAssignments().size() != columnCount) {
throw new SQLParsingException("INSERT INTO column size mismatch value size.");
}
AndCondition andCondition = new AndCondition();
Iterator<Column> columns = insertStatement.getColumns().iterator();
int parametersCount = 0;
List<SQLExpression> 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++;
Expand Down
Expand Up @@ -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<InsertDuplicateKeyColumnsSegment, ShardingRule> {
public final class OnDuplicateKeyColumnsFiller implements SQLSegmentFiller<OnDuplicateKeyColumnsSegment, ShardingRule> {

@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()) {
Expand Down
Expand Up @@ -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;

Expand All @@ -36,7 +34,5 @@ public final class SetAssignmentsSegment implements SQLSegment {

private final int startIndex;

private final Collection<ColumnSegment> columns;

private final Collection<CommonExpressionSegment> values;
private final Collection<AssignmentSegment> assignments;
}
Expand Up @@ -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<ColumnSegment> columns;
}
Expand Up @@ -29,7 +29,7 @@
<extractor-rule id="insertColumns" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.insert.InsertColumnsExtractor" />
<extractor-rule id="insertValues" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.insert.InsertValuesExtractor" />
<extractor-rule id="setAssignments" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.SetAssignmentsExtractor" />
<extractor-rule id="insertDuplicateKeyColumns" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.insert.InsertDuplicateKeyColumnsExtractor" />
<extractor-rule id="onDuplicateKeyColumns" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.insert.OnDuplicateKeyColumnsExtractor" />
<extractor-rule id="selectClause" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.select.SelectClauseExtractor" />
<extractor-rule id="fromWhere" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.select.FromWhereExtractor" />
<extractor-rule id="updateSetWhere" extractor-class="org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.update.UpdateSetWhereExtractor" />
Expand Down
Expand Up @@ -20,7 +20,7 @@
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.common.TableSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.TableFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.InsertValuesSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.insert.InsertValuesFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.assignment.SetAssignmentsSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.SetAssignmentsFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.InsertDuplicateKeyColumnsSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.insert.InsertDuplicateKeyColumnsFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.OnDuplicateKeyColumnsSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.insert.OnDuplicateKeyColumnsFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.FromWhereSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.FromWhereFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.condition.SubqueryConditionSegment" filler-class="org.apache.shardingsphere.core.parse.antlr.filler.sharding.dml.select.SubqueryConditionFiller" />
</filler-rule-definition>
Expand Up @@ -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_
Expand All @@ -39,7 +39,7 @@ insertSelectClause
: columnNames? select
;

insertOnDuplicateKeyClause
onDuplicateKeyClause
: ON DUPLICATE KEY UPDATE assignment (COMMA_ assignment)*
;

Expand Down
Expand Up @@ -26,7 +26,7 @@
<sql-statement-rule context="createIndex" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.ddl.DDLStatement" extractor-rule-refs="tableName, indexName" />
<sql-statement-rule context="dropIndex" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.ddl.DDLStatement" extractor-rule-refs="tableName, indexName" />

<sql-statement-rule context="insert" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.InsertStatement" extractor-rule-refs="tableNames, insertColumns, insertValues, setAssignments, insertDuplicateKeyColumns"/>
<sql-statement-rule context="insert" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.InsertStatement" extractor-rule-refs="tableNames, insertColumns, insertValues, setAssignments, onDuplicateKeyColumns"/>
<sql-statement-rule context="update" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.DMLStatement" extractor-rule-refs="tableNames, updateWhere"/>
<sql-statement-rule context="delete" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.DMLStatement" extractor-rule-refs="tableNames, deleteFromWhere"/>
<sql-statement-rule context="select" sql-statement-class="org.apache.shardingsphere.core.parse.antlr.sql.statement.dml.SelectStatement"
Expand Down

0 comments on commit b1aae30

Please sign in to comment.