未验证 提交 28db7326 编写于 作者: L Liang Zhang 提交者: GitHub

Fixes #3230 (#3400)

* refactor EncryptInsertColumnsTokenGenerator.isGenerateSQLToken

* refactor GeneratedKeyForUseDefaultColumnsTokenGenerator => GeneratedKeyForUseDefaultInsertColumnsTokenGenerator

* rename EncryptInsertColumnsTokenGenerator to EncryptForUseDefaultInsertColumnsTokenGenerator

* remove useless code for EncryptInsertValuesTokenGenerator

* refactor EncryptInsertValuesTokenGenerator.encryptInsertValueToken()

* remove InsertValuesToken.addInsertValue()

* refactor EncryptInsertValuesTokenGenerator

* refactor EncryptInsertValuesTokenGenerator.encryptInsertValueToken to encryptToken

* refactor EncryptInsertValuesTokenGenerator.encryptInsertValueToken to encryptToken

* refactor EncryptInsertValuesTokenGenerator.generateNewSQLToken()

* Adjust INSERT VALUES's encrypt derived columns sequence same as INSERT/UPDATE SET encrypt enhancement

* add generic token

* refactor AssistQueryAndPlainInsertColumnsTokenGenerator

* refactor EncryptInsertValuesTokenGenerator
上级 6e82e672
......@@ -20,11 +20,12 @@ package org.apache.shardingsphere.core.preprocessor.statement.impl;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.preprocessor.segment.insert.InsertValueContext;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.segment.insert.InsertValueContext;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
......@@ -58,6 +59,15 @@ public final class InsertSQLStatementContext extends CommonSQLStatementContext {
return result;
}
/**
* Get column names for descending order.
*
* @return column names for descending order
*/
public Iterator<String> getDescendingColumnNames() {
return new LinkedList<>(columnNames).descendingIterator();
}
/**
* Get grouped parameters.
*
......
......@@ -35,6 +35,7 @@ import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
......@@ -58,10 +59,12 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
if (!encryptTable.isPresent()) {
return;
}
for (String each : ((InsertSQLStatementContext) sqlStatementContext).getColumnNames()) {
Optional<ShardingEncryptor> shardingEncryptor = encryptRule.findShardingEncryptor(tableName, each);
Iterator<String> descendingColumnNames = ((InsertSQLStatementContext) sqlStatementContext).getDescendingColumnNames();
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
Optional<ShardingEncryptor> shardingEncryptor = encryptRule.findShardingEncryptor(tableName, columnName);
if (shardingEncryptor.isPresent()) {
encryptInsertValues((GroupedParameterBuilder) parameterBuilder, (InsertSQLStatementContext) sqlStatementContext, shardingEncryptor.get(), tableName, each);
encryptInsertValues((GroupedParameterBuilder) parameterBuilder, (InsertSQLStatementContext) sqlStatementContext, shardingEncryptor.get(), tableName, columnName);
}
}
}
......@@ -73,9 +76,8 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
for (List<Object> each : sqlStatementContext.getGroupedParameters()) {
if (!each.isEmpty()) {
StandardParameterBuilder standardParameterBuilder = parameterBuilder.getParameterBuilders().get(count);
int parameterOffset = standardParameterBuilder.getAddedIndexAndParameters().isEmpty() ? each.size() : standardParameterBuilder.getAddedIndexAndParameters().keySet().iterator().next();
encryptInsertValue(shardingEncryptor, tableName, columnIndex,
parameterOffset, sqlStatementContext.getInsertValueContexts().get(count).getValue(columnIndex), standardParameterBuilder, encryptLogicColumnName);
encryptInsertValue(
shardingEncryptor, tableName, columnIndex, sqlStatementContext.getInsertValueContexts().get(count).getValue(columnIndex), standardParameterBuilder, encryptLogicColumnName);
}
count++;
}
......@@ -92,7 +94,7 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
return columnNames.indexOf(encryptLogicColumnName);
}
private void encryptInsertValue(final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex, final int parameterOffset,
private void encryptInsertValue(final ShardingEncryptor shardingEncryptor, final String tableName, final int columnIndex,
final Object originalValue, final StandardParameterBuilder parameterBuilder, final String encryptLogicColumnName) {
// FIXME: can process all part of insert value is ? or literal, can not process mix ? and literal
// For example: values (?, ?), (1, 1) can process
......@@ -108,10 +110,10 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
addedParameters.add(originalValue);
}
if (!addedParameters.isEmpty()) {
if (!parameterBuilder.getAddedIndexAndParameters().containsKey(parameterOffset)) {
parameterBuilder.getAddedIndexAndParameters().put(parameterOffset, new LinkedList<>());
if (!parameterBuilder.getAddedIndexAndParameters().containsKey(columnIndex + 1)) {
parameterBuilder.getAddedIndexAndParameters().put(columnIndex + 1, new LinkedList<>());
}
parameterBuilder.getAddedIndexAndParameters().get(parameterOffset).addAll(addedParameters);
parameterBuilder.getAddedIndexAndParameters().get(columnIndex + 1).addAll(addedParameters);
}
}
}
......@@ -22,7 +22,7 @@ import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.En
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.AssistQueryAndPlainInsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptAssignmentTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptInsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptForUseDefaultInsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptInsertValuesTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptPredicateColumnTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl.EncryptPredicateRightValueTokenGenerator;
......@@ -64,14 +64,14 @@ public final class EncryptTokenGenerateBuilder implements SQLTokenGeneratorBuild
private Collection<SQLTokenGenerator> buildSQLTokenGenerators() {
Collection<SQLTokenGenerator> result = new LinkedList<>();
result.add(new EncryptInsertColumnsTokenGenerator());
result.add(new EncryptProjectionTokenGenerator());
result.add(new EncryptAssignmentTokenGenerator());
result.add(new EncryptPredicateColumnTokenGenerator());
result.add(new EncryptPredicateRightValueTokenGenerator());
result.add(new EncryptInsertValuesTokenGenerator());
result.add(new EncryptForUseDefaultInsertColumnsTokenGenerator());
result.add(new InsertCipherNameTokenGenerator());
result.add(new AssistQueryAndPlainInsertColumnsTokenGenerator());
result.add(new EncryptInsertValuesTokenGenerator());
return result;
}
}
......@@ -20,15 +20,18 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.core.parse.sql.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.AssistQueryAndPlainInsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
......@@ -39,7 +42,7 @@ import java.util.List;
* @author zhangliang
*/
@Setter
public final class AssistQueryAndPlainInsertColumnsTokenGenerator implements OptionalSQLTokenGenerator, EncryptRuleAware {
public final class AssistQueryAndPlainInsertColumnsTokenGenerator implements CollectionSQLTokenGenerator, EncryptRuleAware {
private EncryptRule encryptRule;
......@@ -47,29 +50,32 @@ public final class AssistQueryAndPlainInsertColumnsTokenGenerator implements Opt
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class).isPresent()
&& !((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns()
&& !encryptRule.getAssistedQueryAndPlainColumns(sqlStatementContext.getTablesContext().getSingleTableName()).isEmpty();
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
}
@Override
public AssistQueryAndPlainInsertColumnsToken generateSQLToken(final SQLStatementContext sqlStatementContext) {
Optional<InsertColumnsSegment> sqlSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(sqlSegment.isPresent());
return new AssistQueryAndPlainInsertColumnsToken(
sqlSegment.get().getStopIndex(), getDerivedColumnNames((InsertSQLStatementContext) sqlStatementContext));
public Collection<InsertColumnsToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<InsertColumnsToken> result = new LinkedList<>();
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName());
Preconditions.checkState(encryptTable.isPresent());
for (ColumnSegment each : ((InsertStatement) sqlStatementContext.getSqlStatement()).getColumns()) {
List<String> columns = getColumns(encryptTable.get(), each);
if (!columns.isEmpty()) {
result.add(new InsertColumnsToken(each.getStopIndex() + 1, columns));
}
}
return result;
}
private List<String> getDerivedColumnNames(final InsertSQLStatementContext sqlStatementContext) {
private List<String> getColumns(final EncryptTable encryptTable, final ColumnSegment columnSegment) {
List<String> result = new LinkedList<>();
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
for (String each : sqlStatementContext.getColumnNames()) {
Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, each);
if (assistedQueryColumn.isPresent()) {
result.add(assistedQueryColumn.get());
}
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, each);
if (plainColumn.isPresent()) {
result.add(plainColumn.get());
}
Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(columnSegment.getName());
if (assistedQueryColumn.isPresent()) {
result.add(assistedQueryColumn.get());
}
Optional<String> plainColumn = encryptTable.findPlainColumn(columnSegment.getName());
if (plainColumn.isPresent()) {
result.add(plainColumn.get());
}
return result;
}
......
......@@ -20,31 +20,30 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
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.column.InsertColumnsSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
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.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* Insert columns token generator for encrypt.
* Use default insert columns token generator for encrypt.
*
* @author panjuan
* @author zhangliang
*/
@Setter
public final class EncryptInsertColumnsTokenGenerator implements OptionalSQLTokenGenerator, EncryptRuleAware, PreviousSQLTokensAware {
public final class EncryptForUseDefaultInsertColumnsTokenGenerator implements OptionalSQLTokenGenerator, EncryptRuleAware, PreviousSQLTokensAware {
private EncryptRule encryptRule;
......@@ -52,69 +51,76 @@ public final class EncryptInsertColumnsTokenGenerator implements OptionalSQLToke
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext instanceof InsertSQLStatementContext && ((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns();
return sqlStatementContext instanceof InsertSQLStatementContext && ((InsertStatement) sqlStatementContext.getSqlStatement()).useDefaultColumns()
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
}
@Override
public InsertColumnsToken generateSQLToken(final SQLStatementContext sqlStatementContext) {
public UseDefaultInsertColumnsToken generateSQLToken(final SQLStatementContext sqlStatementContext) {
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
Optional<InsertColumnsToken> previousSQLToken = findInsertColumnsToken();
Optional<UseDefaultInsertColumnsToken> previousSQLToken = findInsertColumnsToken();
if (previousSQLToken.isPresent()) {
processPreviousSQLToken(previousSQLToken.get(), tableName);
processPreviousSQLToken(previousSQLToken.get(), (InsertSQLStatementContext) sqlStatementContext, tableName);
return previousSQLToken.get();
}
return generateNewSQLToken((InsertSQLStatementContext) sqlStatementContext, tableName);
}
private Optional<InsertColumnsToken> findInsertColumnsToken() {
private Optional<UseDefaultInsertColumnsToken> findInsertColumnsToken() {
for (SQLToken each : previousSQLTokens) {
if (each instanceof InsertColumnsToken) {
return Optional.of((InsertColumnsToken) each);
if (each instanceof UseDefaultInsertColumnsToken) {
return Optional.of((UseDefaultInsertColumnsToken) each);
}
}
return Optional.absent();
}
private void processPreviousSQLToken(final InsertColumnsToken previousSQLToken, final String tableName) {
for (Entry<String, String> entry : encryptRule.getLogicAndCipherColumns(tableName).entrySet()) {
int encryptLogicColumnIndex = previousSQLToken.getColumns().indexOf(entry.getKey());
if (-1 != encryptLogicColumnIndex) {
previousSQLToken.getColumns().set(encryptLogicColumnIndex, entry.getValue());
}
}
private void processPreviousSQLToken(final UseDefaultInsertColumnsToken previousSQLToken, final InsertSQLStatementContext sqlStatementContext, final String tableName) {
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
if (encryptTable.isPresent()) {
previousSQLToken.getColumns().addAll(getEncryptDerivedColumnNames(encryptTable.get(), tableName));
}
Preconditions.checkState(encryptTable.isPresent());
List<String> columnNames = getColumnNames(sqlStatementContext, encryptTable.get(), previousSQLToken.getColumns());
previousSQLToken.getColumns().clear();
previousSQLToken.getColumns().addAll(columnNames);
}
private InsertColumnsToken generateNewSQLToken(final InsertSQLStatementContext sqlStatementContext, final String tableName) {
private UseDefaultInsertColumnsToken generateNewSQLToken(final InsertSQLStatementContext sqlStatementContext, final String tableName) {
Optional<InsertColumnsSegment> insertColumnsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(insertColumnsSegment.isPresent());
List<String> columnNames = new LinkedList<>();
Map<String, String> logicAndCipherColumns = encryptRule.getLogicAndCipherColumns(tableName);
for (String each : sqlStatementContext.getColumnNames()) {
columnNames.add(logicAndCipherColumns.containsKey(each) ? logicAndCipherColumns.get(each) : each);
}
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
if (encryptTable.isPresent()) {
columnNames.addAll(getEncryptDerivedColumnNames(encryptTable.get(), tableName));
}
return new InsertColumnsToken(insertColumnsSegment.get().getStopIndex(), columnNames);
Preconditions.checkState(encryptTable.isPresent());
return new UseDefaultInsertColumnsToken(insertColumnsSegment.get().getStopIndex(), getColumnNames(sqlStatementContext, encryptTable.get(), sqlStatementContext.getColumnNames()));
}
private List<String> getEncryptDerivedColumnNames(final EncryptTable encryptTable, final String tableName) {
List<String> result = new LinkedList<>();
for (String each : encryptTable.getLogicColumns()) {
Optional<String> assistedQueryColumn = encryptRule.findAssistedQueryColumn(tableName, each);
if (assistedQueryColumn.isPresent()) {
result.add(assistedQueryColumn.get());
}
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, each);
if (plainColumn.isPresent()) {
result.add(plainColumn.get());
private List<String> getColumnNames(final InsertSQLStatementContext sqlStatementContext, final EncryptTable encryptTable, final List<String> currentColumnNames) {
List<String> result = new LinkedList<>(currentColumnNames);
Iterator<String> descendingColumnNames = sqlStatementContext.getDescendingColumnNames();
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
if (encryptTable.findShardingEncryptor(columnName).isPresent()) {
int columnIndex = result.indexOf(columnName);
addPlainColumn(result, encryptTable, columnName, columnIndex);
addAssistedQueryColumn(result, encryptTable, columnName, columnIndex);
setCipherColumn(result, encryptTable, columnName, columnIndex);
}
}
return result;
}
private void addPlainColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
Optional<String> plainColumn = encryptTable.findPlainColumn(columnName);
if (plainColumn.isPresent()) {
columnNames.add(columnIndex + 1, plainColumn.get());
}
}
private void addAssistedQueryColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(columnName);
if (assistedQueryColumn.isPresent()) {
columnNames.add(columnIndex + 1, assistedQueryColumn.get());
}
}
private void setCipherColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
columnNames.set(columnIndex, encryptTable.getCipherColumn(columnName));
}
}
......@@ -18,13 +18,11 @@
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.impl;
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.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.LiteralExpressionSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
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;
......@@ -35,17 +33,17 @@ import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.En
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.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken.InsertValueToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
import org.apache.shardingsphere.core.rule.DataNode;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor;
import org.apache.shardingsphere.spi.encrypt.ShardingQueryAssistedEncryptor;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
......@@ -62,7 +60,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
@Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return sqlStatementContext.getSqlStatement() instanceof InsertStatement && !sqlStatementContext.getSqlStatement().findSQLSegments(InsertValuesSegment.class).isEmpty()
return sqlStatementContext instanceof InsertSQLStatementContext && !sqlStatementContext.getSqlStatement().findSQLSegments(InsertValuesSegment.class).isEmpty()
&& encryptRule.findEncryptTable(sqlStatementContext.getTablesContext().getSingleTableName()).isPresent();
}
......@@ -73,7 +71,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
processPreviousSQLToken((InsertSQLStatementContext) sqlStatementContext, (InsertValuesToken) insertValuesToken.get());
return (InsertValuesToken) insertValuesToken.get();
}
return generateNewSQLToken(sqlStatementContext);
return generateNewSQLToken((InsertSQLStatementContext) sqlStatementContext);
}
private Optional<SQLToken> findPreviousSQLToken(final Class<?> sqlToken) {
......@@ -89,18 +87,19 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
int count = 0;
for (InsertValueContext each : sqlStatementContext.getInsertValueContexts()) {
encryptInsertValueToken(insertValuesToken.getInsertValueTokens().get(count), tableName, sqlStatementContext, each);
encryptToken(insertValuesToken.getInsertValueTokens().get(count), tableName, sqlStatementContext, each);
count++;
}
}
private InsertValuesToken generateNewSQLToken(final SQLStatementContext sqlStatementContext) {
private InsertValuesToken generateNewSQLToken(final InsertSQLStatementContext sqlStatementContext) {
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
Collection<InsertValuesSegment> insertValuesSegments = sqlStatementContext.getSqlStatement().findSQLSegments(InsertValuesSegment.class);
InsertValuesToken result = new InsertValuesToken(getStartIndex(insertValuesSegments), getStopIndex(insertValuesSegments));
for (InsertValueContext each : ((InsertSQLStatementContext) sqlStatementContext).getInsertValueContexts()) {
InsertValueToken insertValueToken = result.addInsertValue(each.getValueExpressions(), Collections.<DataNode>emptyList());
encryptInsertValueToken(insertValueToken, tableName, (InsertSQLStatementContext) sqlStatementContext, each);
for (InsertValueContext each : sqlStatementContext.getInsertValueContexts()) {
InsertValueToken insertValueToken = new InsertValueToken(each.getValueExpressions(), Collections.<DataNode>emptyList());
encryptToken(insertValueToken, tableName, sqlStatementContext, each);
result.getInsertValueTokens().add(insertValueToken);
}
return result;
}
......@@ -121,39 +120,42 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
return result;
}
private void encryptInsertValueToken(final InsertValueToken insertValueToken,
final String tableName, final InsertSQLStatementContext sqlStatementContext, final InsertValueContext insertValueContext) {
Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
Preconditions.checkState(encryptTable.isPresent());
Optional<SQLToken> insertColumnsToken = findPreviousSQLToken(InsertColumnsToken.class);
for (String each : sqlStatementContext.getColumnNames()) {
Optional<ShardingEncryptor> encryptor = encryptRule.findShardingEncryptor(tableName, each);
if (!encryptor.isPresent()) {
continue;
}
int columnIndex = insertColumnsToken.isPresent()
? ((InsertColumnsToken) insertColumnsToken.get()).getColumns().indexOf(encryptRule.getCipherColumn(tableName, each)) : sqlStatementContext.getColumnNames().indexOf(each);
ExpressionSegment valueExpression = insertValueContext.getValueExpressions().get(columnIndex);
Object originalValue = insertValueContext.getValue(columnIndex);
if (valueExpression instanceof LiteralExpressionSegment) {
LiteralExpressionSegment encryptedLiteralExpressionSegment = new LiteralExpressionSegment(
valueExpression.getStartIndex(), valueExpression.getStopIndex(), encryptor.get().encrypt(originalValue));
insertValueToken.getValues().set(columnIndex, encryptedLiteralExpressionSegment);
}
if (encryptRule.findAssistedQueryColumn(tableName, each).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(((ShardingQueryAssistedEncryptor) encryptor.get()).queryAssistedEncrypt(null == originalValue ? null : originalValue.toString()))
: new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
insertValueToken.getValues().add(derivedExpressionSegment);
}
if (encryptRule.findPlainColumn(tableName, each).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(originalValue) : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
insertValueToken.getValues().add(derivedExpressionSegment);
private void encryptToken(final InsertValueToken insertValueToken, final String tableName, final InsertSQLStatementContext sqlStatementContext, final InsertValueContext insertValueContext) {
Optional<SQLToken> useDefaultInsertColumnsToken = findPreviousSQLToken(UseDefaultInsertColumnsToken.class);
Iterator<String> descendingColumnNames = sqlStatementContext.getDescendingColumnNames();
while (descendingColumnNames.hasNext()) {
String columnName = descendingColumnNames.next();
Optional<ShardingEncryptor> encryptor = encryptRule.findShardingEncryptor(tableName, columnName);
if (encryptor.isPresent()) {
int columnIndex = useDefaultInsertColumnsToken.isPresent()
? ((UseDefaultInsertColumnsToken) useDefaultInsertColumnsToken.get()).getColumns().indexOf(columnName) : sqlStatementContext.getColumnNames().indexOf(columnName);
Object originalValue = insertValueContext.getValue(columnIndex);
addPlainColumn(insertValueToken, columnIndex, tableName, columnName, insertValueContext, originalValue);
addAssistedQueryColumn(insertValueToken, encryptor.get(), columnIndex, tableName, columnName, insertValueContext, originalValue);
setCipherColumn(insertValueToken, encryptor.get(), columnIndex, insertValueContext.getValueExpressions().get(columnIndex), originalValue);
}
}
}
private void addPlainColumn(final InsertValueToken insertValueToken, final int columnIndex,
final String tableName, final String columnName, final InsertValueContext insertValueContext, final Object originalValue) {
if (encryptRule.findPlainColumn(tableName, columnName).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(originalValue) : new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
insertValueToken.getValues().add(columnIndex + 1, derivedExpressionSegment);
}
}
private void addAssistedQueryColumn(final InsertValueToken insertValueToken, final ShardingEncryptor encryptor, final int columnIndex,
final String tableName, final String columnName, final InsertValueContext insertValueContext, final Object originalValue) {
if (encryptRule.findAssistedQueryColumn(tableName, columnName).isPresent()) {
DerivedSimpleExpressionSegment derivedExpressionSegment = insertValueContext.getParameters().isEmpty()
? new DerivedLiteralExpressionSegment(((ShardingQueryAssistedEncryptor) encryptor).queryAssistedEncrypt(null == originalValue ? null : originalValue.toString()))
: new DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
insertValueToken.getValues().add(columnIndex + 1, derivedExpressionSegment);
}
}
private int getParameterIndexCount(final InsertValueToken insertValueToken) {
int result = 0;
for (ExpressionSegment each : insertValueToken.getValues()) {
......@@ -163,4 +165,11 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
}
return result;
}
private void setCipherColumn(final InsertValueToken insertValueToken, final ShardingEncryptor encryptor,
final int columnIndex, final ExpressionSegment valueExpression, final Object originalValue) {
if (valueExpression instanceof LiteralExpressionSegment) {
insertValueToken.getValues().set(columnIndex, new LiteralExpressionSegment(valueExpression.getStartIndex(), valueExpression.getStopIndex(), encryptor.encrypt(originalValue)));
}
}
}
......@@ -27,9 +27,9 @@ import org.apache.shardingsphere.core.parse.sql.statement.generic.WhereSegmentAv
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptColumnNameToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.aware.TableMetasAware;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
......@@ -57,17 +57,17 @@ public final class EncryptPredicateColumnTokenGenerator implements CollectionSQL
}
@Override
public Collection<EncryptColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
public Collection<SubstitutableColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Preconditions.checkState(((WhereSegmentAvailable) sqlStatementContext.getSqlStatement()).getWhere().isPresent());
Collection<EncryptColumnNameToken> result = new LinkedList<>();
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
for (AndPredicate each : ((WhereSegmentAvailable) sqlStatementContext.getSqlStatement()).getWhere().get().getAndPredicates()) {
result.addAll(sss(sqlStatementContext, each));
result.addAll(generateSQLTokens(sqlStatementContext, each));
}
return result;
}
private Collection<EncryptColumnNameToken> sss(final SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
Collection<EncryptColumnNameToken> result = new LinkedList<>();
private Collection<SubstitutableColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
for (PredicateSegment each : andPredicate.getPredicates()) {
Optional<EncryptTable> encryptTable = findEncryptTable(sqlStatementContext, each);
if (!encryptTable.isPresent() || !encryptTable.get().findShardingEncryptor(each.getColumn().getName()).isPresent()) {
......@@ -78,13 +78,13 @@ public final class EncryptPredicateColumnTokenGenerator implements CollectionSQL
if (!queryWithCipherColumn) {
Optional<String> plainColumn = encryptTable.get().findPlainColumn(each.getColumn().getName());
if (plainColumn.isPresent()) {
result.add(new EncryptColumnNameToken(startIndex, stopIndex, plainColumn.get()));
result.add(new SubstitutableColumnNameToken(startIndex, stopIndex, plainColumn.get()));
continue;
}
}
Optional<String> assistedQueryColumn = encryptTable.get().findAssistedQueryColumn(each.getColumn().getName());
EncryptColumnNameToken encryptColumnNameToken = assistedQueryColumn.isPresent() ? new EncryptColumnNameToken(startIndex, stopIndex, assistedQueryColumn.get())
: new EncryptColumnNameToken(startIndex, stopIndex, encryptTable.get().getCipherColumn(each.getColumn().getName()));
SubstitutableColumnNameToken encryptColumnNameToken = assistedQueryColumn.isPresent() ? new SubstitutableColumnNameToken(startIndex, stopIndex, assistedQueryColumn.get())
: new SubstitutableColumnNameToken(startIndex, stopIndex, encryptTable.get().getCipherColumn(each.getColumn().getName()));
result.add(encryptColumnNameToken);
}
return result;
......
......@@ -20,15 +20,15 @@ package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.i
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.ColumnSelectItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemsSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.preprocessor.statement.SQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.QueryWithCipherColumnAware;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.EncryptColumnNameToken;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.core.strategy.encrypt.EncryptTable;
......@@ -58,8 +58,8 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
}
@Override
public Collection<EncryptColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<EncryptColumnNameToken> result = new LinkedList<>();
public Collection<SubstitutableColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
Optional<SelectItemsSegment> selectItemsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(SelectItemsSegment.class);
Preconditions.checkState(selectItemsSegment.isPresent());
String tableName = sqlStatementContext.getTablesContext().getSingleTableName();
......@@ -79,10 +79,10 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
return selectItemSegment instanceof ColumnSelectItemSegment && encryptTable.getLogicColumns().contains(((ColumnSelectItemSegment) selectItemSegment).getName());
}
private EncryptColumnNameToken generateSQLToken(final ColumnSelectItemSegment segment, final String tableName) {
private SubstitutableColumnNameToken generateSQLToken(final ColumnSelectItemSegment segment, final String tableName) {
Optional<String> plainColumn = encryptRule.findPlainColumn(tableName, segment.getName());
String columnName = plainColumn.isPresent() && !queryWithCipherColumn ? plainColumn.get() : encryptRule.getCipherColumn(tableName, segment.getName());
return segment.getOwner().isPresent() ? new EncryptColumnNameToken(segment.getOwner().get().getStopIndex() + 2, segment.getStopIndex(), columnName)
: new EncryptColumnNameToken(segment.getStartIndex(), segment.getStopIndex(), columnName);
return segment.getOwner().isPresent() ? new SubstitutableColumnNameToken(segment.getOwner().get().getStopIndex() + 2, segment.getStopIndex(), columnName)
: new SubstitutableColumnNameToken(segment.getStartIndex(), segment.getStopIndex(), columnName);
}
}
......@@ -26,7 +26,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.column.ColumnSegment
import org.apache.shardingsphere.core.parse.sql.segment.dml.column.InsertColumnsSegment;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.generator.EncryptRuleAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo.InsertCipherNameToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.SubstitutableColumnNameToken;
import org.apache.shardingsphere.core.rule.EncryptRule;
import java.util.Collection;
......@@ -50,14 +50,14 @@ public final class InsertCipherNameTokenGenerator implements CollectionSQLTokenG
}
@Override
public Collection<InsertCipherNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
public Collection<SubstitutableColumnNameToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Optional<InsertColumnsSegment> sqlSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(sqlSegment.isPresent());
Map<String, String> logicAndCipherColumns = encryptRule.getLogicAndCipherColumns(sqlStatementContext.getTablesContext().getSingleTableName());
Collection<InsertCipherNameToken> result = new LinkedList<>();
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
for (ColumnSegment each : sqlSegment.get().getColumns()) {
if (logicAndCipherColumns.keySet().contains(each.getName())) {
result.add(new InsertCipherNameToken(each.getStartIndex(), each.getStopIndex(), logicAndCipherColumns.get(each.getName())));
result.add(new SubstitutableColumnNameToken(each.getStartIndex(), each.getStopIndex(), logicAndCipherColumns.get(each.getName())));
}
}
return result;
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Attachable;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import java.util.List;
/**
* Insert assisted query and plain assignments token.
*
* @author panjuan
* @author zhangiang
*/
public abstract class InsertAssistedQueryAndPlainAssignmentsToken extends SQLToken implements Attachable {
private final List<String> columnNames;
public InsertAssistedQueryAndPlainAssignmentsToken(final int startIndex, final List<String> columnNames) {
super(startIndex);
this.columnNames = columnNames;
}
@Override
public final String toString() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < columnNames.size(); i++) {
result.append(String.format(", %s = %s", columnNames.get(i), getAssignmentValue(i)));
}
return result.toString();
}
protected abstract String getAssignmentValue(int index);
}
/*
* 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.core.rewrite.feature.encrypt.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Substitutable;
/**
* Insert cipher assignment token.
*
* @author panjuan
* @author zhangliang
*/
public abstract class InsertCipherAssignmentToken extends SQLToken implements Substitutable {
@Getter
private final int stopIndex;
private final String cipherColumnName;
public InsertCipherAssignmentToken(final int startIndex, final int stopIndex, final String cipherColumnName) {
super(startIndex);
this.stopIndex = stopIndex;
this.cipherColumnName = cipherColumnName;
}
@Override
public final String toString() {
return String.format("%s = %s", cipherColumnName, getAssignmentValue());
}
protected abstract String getAssignmentValue();
}
/*
* 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.core.rewrite.feature.encrypt.token.pojo;
import lombok.Getter;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Substitutable;
/**
* Insert cipher name token.
*
* @author panjuan
*/
public final class InsertCipherNameToken extends SQLToken implements Substitutable {
@Getter
private final int stopIndex;
private final String columnName;
public InsertCipherNameToken(final int startIndex, final int stopIndex, final String columnName) {
super(startIndex);
this.stopIndex = stopIndex;
this.columnName = columnName;
}
@Override
public String toString() {
return 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.core.rewrite.feature.encrypt.token.pojo;
import java.util.List;
/**
* Insert assisted query and plain assignments token for literal.
*
* @author zhangliang
*/
public final class LiteralInsertAssistedQueryAndPlainAssignmentsToken extends InsertAssistedQueryAndPlainAssignmentsToken {
private final List<Object> assignmentValues;
public LiteralInsertAssistedQueryAndPlainAssignmentsToken(final int startIndex, final List<String> columnNames, final List<Object> assignmentValues) {
super(startIndex, columnNames);
this.assignmentValues = assignmentValues;
}
@Override
protected String getAssignmentValue(final int index) {
Object assignmentValue = assignmentValues.get(index);
return assignmentValue instanceof String ? String.format("'%s'", assignmentValue) : assignmentValue.toString();
}
}
/*
* 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.core.rewrite.feature.encrypt.token.pojo;
/**
* Insert cipher assignment token for literal.
*
* @author panjuan
* @author zhangliang
*/
public final class LiteralInsertCipherAssignmentToken extends InsertCipherAssignmentToken {
private final String cipherValue;
public LiteralInsertCipherAssignmentToken(final int startIndex, final int stopIndex, final String cipherColumnName, final String cipherValue) {
super(startIndex, stopIndex, cipherColumnName);
this.cipherValue = cipherValue;
}
@Override
protected String getAssignmentValue() {
return String.format("'%s'", cipherValue);
}
}
/*
* 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.core.rewrite.feature.encrypt.token.pojo;
import java.util.List;
/**
* Insert assisted query and plain assignments token for parameter marker.
*
* @author zhangliang
*/
public final class ParameterMarkerInsertAssistedQueryAndPlainAssignmentsToken extends InsertAssistedQueryAndPlainAssignmentsToken {
public ParameterMarkerInsertAssistedQueryAndPlainAssignmentsToken(final int startIndex, final List<String> columnNames) {
super(startIndex, columnNames);
}
@Override
protected String getAssignmentValue(final int index) {
return "?";
}
}
/*
* 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.core.rewrite.feature.encrypt.token.pojo;
/**
* Insert cipher assignment token for parameter marker.
*
* @author panjuan
* @author zhangliang
*/
public final class ParameterMarkerInsertCipherAssignmentToken extends InsertCipherAssignmentToken {
public ParameterMarkerInsertCipherAssignmentToken(final int startIndex, final int stopIndex, final String cipherColumnName) {
super(startIndex, stopIndex, cipherColumnName);
}
@Override
protected String getAssignmentValue() {
return "?";
}
}
......@@ -33,7 +33,7 @@ import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.i
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.RowCountTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.DistinctProjectionPrefixTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.keygen.GeneratedKeyAssignmentTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.keygen.GeneratedKeyForUseDefaultColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.keygen.GeneratedKeyForUseDefaultInsertColumnsTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.keygen.GeneratedKeyInsertColumnTokenGenerator;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl.keygen.GeneratedKeyInsertValuesTokenGenerator;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -79,7 +79,7 @@ public final class ShardingTokenGenerateBuilder implements SQLTokenGeneratorBuil
addSQLTokenGenerator(result, new OffsetTokenGenerator());
addSQLTokenGenerator(result, new RowCountTokenGenerator());
addSQLTokenGenerator(result, new GeneratedKeyInsertColumnTokenGenerator());
addSQLTokenGenerator(result, new GeneratedKeyForUseDefaultColumnsTokenGenerator());
addSQLTokenGenerator(result, new GeneratedKeyForUseDefaultInsertColumnsTokenGenerator());
addSQLTokenGenerator(result, new GeneratedKeyAssignmentTokenGenerator());
addSQLTokenGenerator(result, new InsertValuesTokenGenerator());
addSQLTokenGenerator(result, new GeneratedKeyInsertValuesTokenGenerator());
......
......@@ -18,15 +18,16 @@
package org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.impl;
import lombok.Setter;
import org.apache.shardingsphere.core.preprocessor.segment.insert.InsertValueContext;
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.segment.dml.expr.ExpressionSegment;
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.statement.SQLStatementContext;
import org.apache.shardingsphere.core.preprocessor.statement.impl.InsertSQLStatementContext;
import org.apache.shardingsphere.core.rewrite.feature.sharding.token.generator.SQLRouteResultAware;
import org.apache.shardingsphere.core.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertValuesToken.InsertValueToken;
import org.apache.shardingsphere.core.route.SQLRouteResult;
import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingCondition;
import org.apache.shardingsphere.core.rule.DataNode;
......@@ -61,7 +62,7 @@ public final class InsertValuesTokenGenerator implements OptionalSQLTokenGenerat
for (InsertValueContext each : ((InsertSQLStatementContext) sqlStatementContext).getInsertValueContexts()) {
List<ExpressionSegment> expressionSegments = each.getValueExpressions();
Collection<DataNode> dataNodes = null == shardingConditionIterator ? Collections.<DataNode>emptyList() : shardingConditionIterator.next().getDataNodes();
result.addInsertValue(expressionSegments, dataNodes);
result.getInsertValueTokens().add(new InsertValueToken(expressionSegments, dataNodes));
}
return result;
}
......
......@@ -23,19 +23,19 @@ 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.column.InsertColumnsSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.InsertColumnsToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
import org.apache.shardingsphere.core.route.router.sharding.keygen.GeneratedKey;
import java.util.ArrayList;
import java.util.List;
/**
* Generated key for use default columns token generator.
* Generated key for use default insert columns token generator.
*
* @author panjuan
* @author zhangliang
*/
public final class GeneratedKeyForUseDefaultColumnsTokenGenerator extends BaseGeneratedKeyTokenGenerator {
public final class GeneratedKeyForUseDefaultInsertColumnsTokenGenerator extends BaseGeneratedKeyTokenGenerator {
@Override
protected boolean isGenerateSQLToken(final InsertStatement insertStatement) {
......@@ -43,10 +43,10 @@ public final class GeneratedKeyForUseDefaultColumnsTokenGenerator extends BaseGe
}
@Override
protected InsertColumnsToken generateSQLToken(final SQLStatementContext sqlStatementContext, final GeneratedKey generatedKey) {
protected UseDefaultInsertColumnsToken generateSQLToken(final SQLStatementContext sqlStatementContext, final GeneratedKey generatedKey) {
Optional<InsertColumnsSegment> insertColumnsSegment = sqlStatementContext.getSqlStatement().findSQLSegment(InsertColumnsSegment.class);
Preconditions.checkState(insertColumnsSegment.isPresent());
return new InsertColumnsToken(insertColumnsSegment.get().getStopIndex(), getColumnNames((InsertSQLStatementContext) sqlStatementContext, generatedKey));
return new UseDefaultInsertColumnsToken(insertColumnsSegment.get().getStopIndex(), getColumnNames((InsertSQLStatementContext) sqlStatementContext, generatedKey));
}
private List<String> getColumnNames(final InsertSQLStatementContext sqlStatementContext, final GeneratedKey generatedKey) {
......
......@@ -18,7 +18,6 @@
package org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic;
import com.google.common.base.Joiner;
import lombok.Getter;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Attachable;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
......@@ -30,7 +29,6 @@ import java.util.List;
* @author panjuan
* @author zhangliang
*/
@Getter
public final class InsertColumnsToken extends SQLToken implements Attachable {
private final List<String> columns;
......@@ -42,9 +40,6 @@ public final class InsertColumnsToken extends SQLToken implements Attachable {
@Override
public String toString() {
if (columns.isEmpty()) {
return "";
}
return String.format("(%s)", Joiner.on(", ").join(columns));
return columns.isEmpty() ? "" : String.format(", %s", Joiner.on(", ").join(columns));
}
}
......@@ -53,19 +53,6 @@ public final class InsertValuesToken extends SQLToken implements Substitutable,
insertValueTokens = new LinkedList<>();
}
/**
* Add insert value.
*
* @param values values
* @param dataNodes data nodes
* @return Insert value token
*/
public InsertValueToken addInsertValue(final List<ExpressionSegment> values, final Collection<DataNode> dataNodes) {
InsertValueToken result = new InsertValueToken(values, dataNodes);
insertValueTokens.add(result);
return result;
}
@Override
public String toString(final RoutingUnit routingUnit, final Map<String, String> logicAndActualTables) {
StringBuilder result = new StringBuilder();
......@@ -96,12 +83,12 @@ public final class InsertValuesToken extends SQLToken implements Substitutable,
@RequiredArgsConstructor
@Getter
public final class InsertValueToken {
public static final class InsertValueToken {
private final List<ExpressionSegment> values;
private final Collection<DataNode> dataNodes;
@Override
public String toString() {
StringBuilder result = new StringBuilder();
......
......@@ -15,25 +15,25 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo;
package org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic;
import lombok.Getter;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Substitutable;
/**
* Column name token of encrypt.
* Substitutable column name token.
*
* @author panjuan
* @author zhangliang
*/
public final class EncryptColumnNameToken extends SQLToken implements Substitutable {
public final class SubstitutableColumnNameToken extends SQLToken implements Substitutable {
@Getter
private final int stopIndex;
private final String columnName;
public EncryptColumnNameToken(final int startIndex, final int stopIndex, final String columnName) {
public SubstitutableColumnNameToken(final int startIndex, final int stopIndex, final String columnName) {
super(startIndex);
this.stopIndex = stopIndex;
this.columnName = columnName;
......
......@@ -15,34 +15,33 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.rewrite.feature.encrypt.token.pojo;
package org.apache.shardingsphere.core.rewrite.sql.token.pojo.generic;
import com.google.common.base.Joiner;
import lombok.Getter;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.Attachable;
import org.apache.shardingsphere.core.rewrite.sql.token.pojo.SQLToken;
import java.util.List;
/**
* Assist query and plain insert columns token.
* Default insert columns token.
*
* @author panjuan
* @author zhangliang
*/
public final class AssistQueryAndPlainInsertColumnsToken extends SQLToken implements Attachable {
@Getter
public final class UseDefaultInsertColumnsToken extends SQLToken implements Attachable {
private final List<String> columns;
public AssistQueryAndPlainInsertColumnsToken(final int startIndex, final List<String> columns) {
public UseDefaultInsertColumnsToken(final int startIndex, final List<String> columns) {
super(startIndex);
this.columns = columns;
}
@Override
public String toString() {
if (columns.isEmpty()) {
return "";
}
return String.format(", %s", Joiner.on(", ").join(columns));
return columns.isEmpty() ? "" : String.format("(%s)", Joiner.on(", ").join(columns));
}
}
......@@ -19,52 +19,52 @@
<rewrite-assertions yaml-rule="yaml/encrypt/query-with-cipher.yaml">
<rewrite-assertion id="insert_values_with_columns_for_parameters">
<input sql="INSERT INTO t_account(account_id, certificate_number, password, amount, status) VALUES (?, ?, ?, ?, ?), (2, '222X', 'bbb', 2000, 'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', 4000, 'OK')" parameters="1, 111X, aaa, 1000, OK, 3, 333X, ccc, 3000, OK" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, assisted_query_password) VALUES (?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', 'assisted_query_bbb'), (?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', 'assisted_query_ddd')" parameters="1, encrypt_111X, encrypt_aaa, encrypt_1000, OK, assisted_query_111X, assisted_query_aaa, 3, encrypt_333X, encrypt_ccc, encrypt_3000, OK, assisted_query_333X, assisted_query_ccc" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, assisted_query_certificate_number, cipher_password, assisted_query_password, cipher_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'assisted_query_222X', 'encrypt_bbb', 'assisted_query_bbb', 'encrypt_2000', 'OK'), (?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', 'encrypt_ddd', 'assisted_query_ddd', 'encrypt_4000', 'OK')" parameters="1, encrypt_111X, assisted_query_111X, encrypt_aaa, assisted_query_aaa, encrypt_1000, OK, 3, encrypt_333X, assisted_query_333X, encrypt_ccc, assisted_query_ccc, encrypt_3000, OK" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_with_columns_for_literals">
<input sql="INSERT INTO t_account(account_id, certificate_number, password, amount, status) VALUES (1, '111X', 'aaa', 1000, 'OK'), (2, '222X', 'bbb', 2000, 'OK'), (3, '333X', 'ccc', 3000, 'OK'), (4, '444X', 'ddd', 4000, 'OK')" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, assisted_query_password) VALUES (1, 'encrypt_111X', 'encrypt_aaa', 'encrypt_1000', 'OK', 'assisted_query_111X', 'assisted_query_aaa'), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', 'assisted_query_bbb'), (3, 'encrypt_333X', 'encrypt_ccc', 'encrypt_3000', 'OK', 'assisted_query_333X', 'assisted_query_ccc'), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', 'assisted_query_ddd')" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, assisted_query_certificate_number, cipher_password, assisted_query_password, cipher_amount, status) VALUES (1, 'encrypt_111X', 'assisted_query_111X', 'encrypt_aaa', 'assisted_query_aaa', 'encrypt_1000', 'OK'), (2, 'encrypt_222X', 'assisted_query_222X', 'encrypt_bbb', 'assisted_query_bbb', 'encrypt_2000', 'OK'), (3, 'encrypt_333X', 'assisted_query_333X', 'encrypt_ccc', 'assisted_query_ccc', 'encrypt_3000', 'OK'), (4, 'encrypt_444X', 'assisted_query_444X', 'encrypt_ddd', 'assisted_query_ddd', 'encrypt_4000', 'OK')" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_with_columns_and_configuration_for_different_sequence_for_parameters">
<input sql="INSERT INTO t_account(password, certificate_number, account_id, amount, status) VALUES (?, ?, ?, ?, ?), ('bbb', '222X', 2, 2000, 'OK'), (?, ?, ?, ?, ?), ('ddd', '444X', 4, 4000, 'OK')" parameters="aaa, 111X, 1, 1000, OK, ccc, 333X, 3, 3000, OK" />
<output sql="INSERT INTO t_account(cipher_password, cipher_certificate_number, account_id, cipher_amount, status, assisted_query_password, assisted_query_certificate_number) VALUES (?, ?, ?, ?, ?, ?, ?), ('encrypt_bbb', 'encrypt_222X', 2, 'encrypt_2000', 'OK', 'assisted_query_bbb', 'assisted_query_222X'), (?, ?, ?, ?, ?, ?, ?), ('encrypt_ddd', 'encrypt_444X', 4, 'encrypt_4000', 'OK', 'assisted_query_ddd', 'assisted_query_444X')" parameters="encrypt_aaa, encrypt_111X, 1, encrypt_1000, OK, assisted_query_aaa, assisted_query_111X, encrypt_ccc, encrypt_333X, 3, encrypt_3000, OK, assisted_query_ccc, assisted_query_333X" />
<output sql="INSERT INTO t_account(cipher_password, assisted_query_password, cipher_certificate_number, assisted_query_certificate_number, account_id, cipher_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?), ('encrypt_bbb', 'assisted_query_bbb', 'encrypt_222X', 'assisted_query_222X', 2, 'encrypt_2000', 'OK'), (?, ?, ?, ?, ?, ?, ?), ('encrypt_ddd', 'assisted_query_ddd', 'encrypt_444X', 'assisted_query_444X', 4, 'encrypt_4000', 'OK')" parameters="encrypt_aaa, assisted_query_aaa, encrypt_111X, assisted_query_111X, 1, encrypt_1000, OK, encrypt_ccc, assisted_query_ccc, encrypt_333X, assisted_query_333X, 3, encrypt_3000, OK" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_with_columns_and_configuration_for_different_sequence_for_literals">
<input sql="INSERT INTO t_account(password, certificate_number, account_id, amount, status) VALUES ('aaa', '111X', 1, 1000, 'OK'), ('bbb', '222X', 2, 2000, 'OK'), ('ccc', '333X', 3, 3000, 'OK'), ('ddd', '444X', 4, 4000, 'OK')" />
<output sql="INSERT INTO t_account(cipher_password, cipher_certificate_number, account_id, cipher_amount, status, assisted_query_password, assisted_query_certificate_number) VALUES ('encrypt_aaa', 'encrypt_111X', 1, 'encrypt_1000', 'OK', 'assisted_query_aaa', 'assisted_query_111X'), ('encrypt_bbb', 'encrypt_222X', 2, 'encrypt_2000', 'OK', 'assisted_query_bbb', 'assisted_query_222X'), ('encrypt_ccc', 'encrypt_333X', 3, 'encrypt_3000', 'OK', 'assisted_query_ccc', 'assisted_query_333X'), ('encrypt_ddd', 'encrypt_444X', 4, 'encrypt_4000', 'OK', 'assisted_query_ddd', 'assisted_query_444X')" />
<output sql="INSERT INTO t_account(cipher_password, assisted_query_password, cipher_certificate_number, assisted_query_certificate_number, account_id, cipher_amount, status) VALUES ('encrypt_aaa', 'assisted_query_aaa', 'encrypt_111X', 'assisted_query_111X', 1, 'encrypt_1000', 'OK'), ('encrypt_bbb', 'assisted_query_bbb', 'encrypt_222X', 'assisted_query_222X', 2, 'encrypt_2000', 'OK'), ('encrypt_ccc', 'assisted_query_ccc', 'encrypt_333X', 'assisted_query_333X', 3, 'encrypt_3000', 'OK'), ('encrypt_ddd', 'assisted_query_ddd', 'encrypt_444X', 'assisted_query_444X', 4, 'encrypt_4000', 'OK')" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_with_columns_with_plain_for_parameters">
<input sql="INSERT INTO t_account_bak(account_id, certificate_number, password, amount, status) VALUES (?, ?, ?, ?, ?), (2, '222X', 'bbb', 2000, 'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', 4000, 'OK')" parameters="1, 111X, aaa, 1000, OK, 3, 333X, ccc, 3000, OK" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, plain_certificate_number, assisted_query_password, plain_password, plain_amount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', '222X', 'assisted_query_bbb', 'bbb', 2000), (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', '444X', 'assisted_query_ddd', 'ddd', 4000)" parameters="1, encrypt_111X, encrypt_aaa, encrypt_1000, OK, assisted_query_111X, 111X, assisted_query_aaa, aaa, 1000, 3, encrypt_333X, encrypt_ccc, encrypt_3000, OK, assisted_query_333X, 333X, assisted_query_ccc, ccc, 3000" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, assisted_query_certificate_number, plain_certificate_number, cipher_password, assisted_query_password, plain_password, cipher_amount, plain_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'assisted_query_222X', '222X', 'encrypt_bbb', 'assisted_query_bbb', 'bbb', 'encrypt_2000', 2000, 'OK'), (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', '444X', 'encrypt_ddd', 'assisted_query_ddd', 'ddd', 'encrypt_4000', 4000, 'OK')" parameters="1, encrypt_111X, assisted_query_111X, 111X, encrypt_aaa, assisted_query_aaa, aaa, encrypt_1000, 1000, OK, 3, encrypt_333X, assisted_query_333X, 333X, encrypt_ccc, assisted_query_ccc, ccc, encrypt_3000, 3000, OK" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_with_columns_with_plain_for_literals">
<input sql="INSERT INTO t_account_bak(account_id, certificate_number, password, amount, status) VALUES (1, '111X', 'aaa', 1000, 'OK'), (2, '222X', 'bbb', 2000, 'OK'), (3, '333X', 'ccc', 3000, 'OK'), (4, '444X', 'ddd', 4000, 'OK')" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, plain_certificate_number, assisted_query_password, plain_password, plain_amount) VALUES (1, 'encrypt_111X', 'encrypt_aaa', 'encrypt_1000', 'OK', 'assisted_query_111X', '111X', 'assisted_query_aaa', 'aaa', 1000), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', '222X', 'assisted_query_bbb', 'bbb', 2000), (3, 'encrypt_333X', 'encrypt_ccc', 'encrypt_3000', 'OK', 'assisted_query_333X', '333X', 'assisted_query_ccc', 'ccc', 3000), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', '444X', 'assisted_query_ddd', 'ddd', 4000)" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, assisted_query_certificate_number, plain_certificate_number, cipher_password, assisted_query_password, plain_password, cipher_amount, plain_amount, status) VALUES (1, 'encrypt_111X', 'assisted_query_111X', '111X', 'encrypt_aaa', 'assisted_query_aaa', 'aaa', 'encrypt_1000', 1000, 'OK'), (2, 'encrypt_222X', 'assisted_query_222X', '222X', 'encrypt_bbb', 'assisted_query_bbb', 'bbb', 'encrypt_2000', 2000, 'OK'), (3, 'encrypt_333X', 'assisted_query_333X', '333X', 'encrypt_ccc', 'assisted_query_ccc', 'ccc', 'encrypt_3000', 3000, 'OK'), (4, 'encrypt_444X', 'assisted_query_444X', '444X', 'encrypt_ddd', 'assisted_query_ddd', 'ddd', 'encrypt_4000', 4000, 'OK')" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_without_columns_for_parameters">
<input sql="INSERT INTO t_account VALUES (?, ?, ?, ?, ?), (2, '222X', 'bbb', 2000, 'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', 4000, 'OK')" parameters="1, 111X, aaa, 1000, OK, 3, 333X, ccc, 3000, OK" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, assisted_query_password) VALUES (?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', 'assisted_query_bbb'), (?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', 'assisted_query_ddd')" parameters="1, encrypt_111X, encrypt_aaa, encrypt_1000, OK, assisted_query_111X, assisted_query_aaa, 3, encrypt_333X, encrypt_ccc, encrypt_3000, OK, assisted_query_333X, assisted_query_ccc" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, assisted_query_certificate_number, cipher_password, assisted_query_password, cipher_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'assisted_query_222X', 'encrypt_bbb', 'assisted_query_bbb', 'encrypt_2000', 'OK'), (?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', 'encrypt_ddd', 'assisted_query_ddd', 'encrypt_4000', 'OK')" parameters="1, encrypt_111X, assisted_query_111X, encrypt_aaa, assisted_query_aaa, encrypt_1000, OK, 3, encrypt_333X, assisted_query_333X, encrypt_ccc, assisted_query_ccc, encrypt_3000, OK" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_without_columns_for_literals">
<input sql="INSERT INTO t_account VALUES (1, '111X', 'aaa', 1000, 'OK'), (2, '222X', 'bbb', 2000, 'OK'), (3, '333X', 'ccc', 3000, 'OK'), (4, '444X', 'ddd', 4000, 'OK')" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, assisted_query_password) VALUES (1, 'encrypt_111X', 'encrypt_aaa', 'encrypt_1000', 'OK', 'assisted_query_111X', 'assisted_query_aaa'), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', 'assisted_query_bbb'), (3, 'encrypt_333X', 'encrypt_ccc', 'encrypt_3000', 'OK', 'assisted_query_333X', 'assisted_query_ccc'), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', 'assisted_query_ddd')" />
<output sql="INSERT INTO t_account(account_id, cipher_certificate_number, assisted_query_certificate_number, cipher_password, assisted_query_password, cipher_amount, status) VALUES (1, 'encrypt_111X', 'assisted_query_111X', 'encrypt_aaa', 'assisted_query_aaa', 'encrypt_1000', 'OK'), (2, 'encrypt_222X', 'assisted_query_222X', 'encrypt_bbb', 'assisted_query_bbb', 'encrypt_2000', 'OK'), (3, 'encrypt_333X', 'assisted_query_333X', 'encrypt_ccc', 'assisted_query_ccc', 'encrypt_3000', 'OK'), (4, 'encrypt_444X', 'assisted_query_444X', 'encrypt_ddd', 'assisted_query_ddd', 'encrypt_4000', 'OK')" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_without_columns_with_plain_for_parameters">
<input sql="INSERT INTO t_account_bak VALUES (?, ?, ?, ?, ?), (2, '222X', 'bbb', 2000, 'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', 4000, 'OK')" parameters="1, 111X, aaa, 1000, OK, 3, 333X, ccc, 3000, OK" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, plain_certificate_number, assisted_query_password, plain_password, plain_amount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', '222X', 'assisted_query_bbb', 'bbb', 2000), (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', '444X', 'assisted_query_ddd', 'ddd', 4000)" parameters="1, encrypt_111X, encrypt_aaa, encrypt_1000, OK, assisted_query_111X, 111X, assisted_query_aaa, aaa, 1000, 3, encrypt_333X, encrypt_ccc, encrypt_3000, OK, assisted_query_333X, 333X, assisted_query_ccc, ccc, 3000" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, assisted_query_certificate_number, plain_certificate_number, cipher_password, assisted_query_password, plain_password, cipher_amount, plain_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (2, 'encrypt_222X', 'assisted_query_222X', '222X', 'encrypt_bbb', 'assisted_query_bbb', 'bbb', 'encrypt_2000', 2000, 'OK'), (?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', '444X', 'encrypt_ddd', 'assisted_query_ddd', 'ddd', 'encrypt_4000', 4000, 'OK')" parameters="1, encrypt_111X, assisted_query_111X, 111X, encrypt_aaa, assisted_query_aaa, aaa, encrypt_1000, 1000, OK, 3, encrypt_333X, assisted_query_333X, 333X, encrypt_ccc, assisted_query_ccc, ccc, encrypt_3000, 3000, OK" />
</rewrite-assertion>
<rewrite-assertion id="insert_values_without_columns_with_plain_for_literals">
<input sql="INSERT INTO t_account_bak VALUES (1, '111X', 'aaa', 1000, 'OK'), (2, '222X', 'bbb', 2000, 'OK'), (3, '333X', 'ccc', 3000, 'OK'), (4, '444X', 'ddd', 4000, 'OK')" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, cipher_password, cipher_amount, status, assisted_query_certificate_number, plain_certificate_number, assisted_query_password, plain_password, plain_amount) VALUES (1, 'encrypt_111X', 'encrypt_aaa', 'encrypt_1000', 'OK', 'assisted_query_111X', '111X', 'assisted_query_aaa', 'aaa', 1000), (2, 'encrypt_222X', 'encrypt_bbb', 'encrypt_2000', 'OK', 'assisted_query_222X', '222X', 'assisted_query_bbb', 'bbb', 2000), (3, 'encrypt_333X', 'encrypt_ccc', 'encrypt_3000', 'OK', 'assisted_query_333X', '333X', 'assisted_query_ccc', 'ccc', 3000), (4, 'encrypt_444X', 'encrypt_ddd', 'encrypt_4000', 'OK', 'assisted_query_444X', '444X', 'assisted_query_ddd', 'ddd', 4000)" />
<output sql="INSERT INTO t_account_bak(account_id, cipher_certificate_number, assisted_query_certificate_number, plain_certificate_number, cipher_password, assisted_query_password, plain_password, cipher_amount, plain_amount, status) VALUES (1, 'encrypt_111X', 'assisted_query_111X', '111X', 'encrypt_aaa', 'assisted_query_aaa', 'aaa', 'encrypt_1000', 1000, 'OK'), (2, 'encrypt_222X', 'assisted_query_222X', '222X', 'encrypt_bbb', 'assisted_query_bbb', 'bbb', 'encrypt_2000', 2000, 'OK'), (3, 'encrypt_333X', 'assisted_query_333X', '333X', 'encrypt_ccc', 'assisted_query_ccc', 'ccc', 'encrypt_3000', 3000, 'OK'), (4, 'encrypt_444X', 'assisted_query_444X', '444X', 'encrypt_ddd', 'assisted_query_ddd', 'ddd', 'encrypt_4000', 4000, 'OK')" />
</rewrite-assertion>
<rewrite-assertion id="insert_set_for_parameters" db-type="MySQL">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册