提交 0ae7bd32 编写于 作者: P panjuan 提交者: Liang Zhang

Fix bug 3303 (#3305)

* add note for bug

* modify note for bug

* fix bug of insert multiple values with parameters
上级 25fa06a9
......@@ -20,17 +20,16 @@ package org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.InsertValuesSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.segment.insert.InsertValueContext;
import org.apache.shardingsphere.core.preprocessor.segment.insert.expression.DerivedLiteralExpressionSegment;
import org.apache.shardingsphere.core.preprocessor.segment.insert.expression.DerivedParameterMarkerExpressionSegment;
import org.apache.shardingsphere.core.preprocessor.segment.insert.expression.DerivedSimpleExpressionSegment;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.parse.sql.segment.dml.assignment.InsertValuesSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.ParametersAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken.InsertValueToken;
......@@ -45,9 +44,7 @@ import java.util.List;
* @author panjuan
*/
@Setter
public final class GeneratedKeyInsertValuesTokenGenerator extends BaseGeneratedKeyTokenGenerator implements OptionalSQLTokenGenerator, ParametersAware, PreviousSQLTokensAware {
private List<Object> parameters;
public final class GeneratedKeyInsertValuesTokenGenerator extends BaseGeneratedKeyTokenGenerator implements OptionalSQLTokenGenerator, PreviousSQLTokensAware {
private List<SQLToken> previousSQLTokens;
......@@ -64,7 +61,7 @@ public final class GeneratedKeyInsertValuesTokenGenerator extends BaseGeneratedK
int count = 0;
for (InsertValueContext each : ((InsertSQLStatementContext) sqlStatementContext).getInsertValueContexts()) {
InsertValueToken insertValueToken = result.get().getInsertValueTokens().get(count);
DerivedSimpleExpressionSegment expressionSegment = parameters.isEmpty()
DerivedSimpleExpressionSegment expressionSegment = isToAddDerivedLiteralExpression((InsertSQLStatementContext) sqlStatementContext, count)
? new DerivedLiteralExpressionSegment(generatedValues.next()) : new DerivedParameterMarkerExpressionSegment(each.getParametersCount());
insertValueToken.getValues().add(expressionSegment);
count++;
......@@ -80,4 +77,8 @@ public final class GeneratedKeyInsertValuesTokenGenerator extends BaseGeneratedK
}
return Optional.absent();
}
private boolean isToAddDerivedLiteralExpression(final InsertSQLStatementContext insertSQLStatementContext, final int insertValueCount) {
return insertSQLStatementContext.getGroupedParameters().get(insertValueCount).isEmpty();
}
}
......@@ -69,11 +69,10 @@
<output sql="INSERT INTO t_account_1 (account_id, amount, status) VALUES (101, 1000, 'OK'), (103, 3000, 'OK'), (105, 5000, 'OK')" />
</rewrite-assertion>
<!-- FIXME -->
<!--<rewrite-assertion id="insert_multiple_values_with_columns_without_id_for_parameters">-->
<!--<input sql="INSERT INTO t_account (amount, status) VALUES (?, ?), (1000, 'OK')" parameters="1000, OK" />-->
<!--<output sql="INSERT INTO t_account_1 (amount, status, account_id) VALUES (?, ?, ?), (1000, 'OK', ?)" parameters="1000, OK, 1, 1" />-->
<!--</rewrite-assertion>-->
<rewrite-assertion id="insert_multiple_values_with_columns_without_id_for_parameters">
<input sql="INSERT INTO t_account (amount, status) VALUES (?, ?), (1000, 'OK')" parameters="1000, OK" />
<output sql="INSERT INTO t_account_1 (amount, status, account_id) VALUES (?, ?, ?), (1000, 'OK', 1)" parameters="1000, OK, 1" />
</rewrite-assertion>
<rewrite-assertion id="insert_multiple_values_with_columns_without_id_for_literals">
<input sql="INSERT INTO t_account (amount, status) VALUES (1000, 'OK'), (1000, 'OK')" />
......@@ -92,11 +91,10 @@
<output sql="INSERT INTO t_account_1 VALUES (101, 1000, 'OK')" />
</rewrite-assertion>
<!-- FIXME -->
<!--<rewrite-assertion id="insert_multiple_values_without_columns_without_id_for_parameters" db-type="MySQL">-->
<!--<input sql="INSERT INTO t_account VALUES (?, ?), (1000, 'OK')" parameters="1000, OK" />-->
<!--<output sql="INSERT INTO t_account_1(amount, status, account_id) VALUES (?, ?, ?), (1000, 'OK', ?)" parameters="1000, OK, 1, 1" />-->
<!--</rewrite-assertion>-->
<rewrite-assertion id="insert_multiple_values_without_columns_without_id_for_parameters" db-type="MySQL">
<input sql="INSERT INTO t_account VALUES (?, ?), (1000, 'OK')" parameters="1000, OK" />
<output sql="INSERT INTO t_account_1(amount, status, account_id) VALUES (?, ?, ?), (1000, 'OK', 1)" parameters="1000, OK, 1" />
</rewrite-assertion>
<rewrite-assertion id="insert_multiple_values_without_columns_without_id_for_literals" db-type="MySQL">
<input sql="INSERT INTO t_account VALUES (1000, 'OK'), (1000, 'OK')" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册