This is an automated email from the ASF dual-hosted git repository.

chengzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new aa99ff660c6 Add insert select rewrite for encrypt (#32939)
aa99ff660c6 is described below

commit aa99ff660c6ad27cd9e7ae4f4ab9d7472ec47bef
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Sep 20 22:21:52 2024 +0800

    Add insert select rewrite for encrypt (#32939)
    
    * Add insert select rewrite for encrypt
    
    * Add insert select rewrite for encrypt
    
    * Add insert select rewrite for encrypt
    
    * Add insert select rewrite for encrypt
---
 .../context/EncryptSQLRewriteContextDecorator.java | 13 ++++-
 .../parameter/EncryptParameterRewriterBuilder.java |  2 +
 .../EncryptInsertPredicateParameterRewriter.java   | 61 ++++++++++++++++++++
 .../rewrite/token/EncryptTokenGenerateBuilder.java |  4 ++
 ...EncryptInsertPredicateColumnTokenGenerator.java | 62 ++++++++++++++++++++
 ...yptInsertPredicateRightValueTokenGenerator.java | 67 ++++++++++++++++++++++
 .../dataset/encrypt/insert_select_user_table.xml   | 60 +++++++++++++++++++
 .../test/resources/cases/dml/e2e-dml-insert.xml    |  4 ++
 .../query-with-cipher/dml/insert/insert-select.xml | 30 ++++++++++
 9 files changed, 301 insertions(+), 2 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
index 703255426f1..c93868e106f 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.encrypt.rewrite.token.EncryptTokenGenerateBuild
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -76,13 +77,21 @@ public final class EncryptSQLRewriteContextDecorator 
implements SQLRewriteContex
     
     private Collection<EncryptCondition> createEncryptConditions(final 
EncryptRule encryptRule, final SQLRewriteContext sqlRewriteContext) {
         SQLStatementContext sqlStatementContext = 
sqlRewriteContext.getSqlStatementContext();
+        if (sqlStatementContext instanceof InsertStatementContext && null != 
((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
+                && !((WhereAvailable) ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext()).getWhereSegments().isEmpty())
 {
+            return doCreateEncryptConditions(encryptRule, sqlRewriteContext, 
((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext());
+        }
+        return doCreateEncryptConditions(encryptRule, sqlRewriteContext, 
sqlStatementContext);
+    }
+    
+    private Collection<EncryptCondition> doCreateEncryptConditions(final 
EncryptRule encryptRule, final SQLRewriteContext sqlRewriteContext, final 
SQLStatementContext sqlStatementContext) {
         if (!(sqlStatementContext instanceof WhereAvailable)) {
             return Collections.emptyList();
         }
         Collection<WhereSegment> whereSegments = ((WhereAvailable) 
sqlStatementContext).getWhereSegments();
         Collection<ColumnSegment> columnSegments = ((WhereAvailable) 
sqlStatementContext).getColumnSegments();
-        return new EncryptConditionEngine(encryptRule, 
sqlRewriteContext.getDatabase().getSchemas())
-                .createEncryptConditions(whereSegments, columnSegments, 
sqlStatementContext, sqlRewriteContext.getDatabase().getName());
+        return new EncryptConditionEngine(encryptRule, 
sqlRewriteContext.getDatabase().getSchemas()).createEncryptConditions(whereSegments,
 columnSegments, sqlStatementContext,
+                sqlRewriteContext.getDatabase().getName());
     }
     
     private void rewriteParameters(final SQLRewriteContext sqlRewriteContext, 
final Collection<ParameterRewriter> parameterRewriters) {
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
index 9cafc0033d3..da9ad3e9eff 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/EncryptParameterRewriterBuilder.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptAssig
 import 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter;
 import 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptInsertValueParameterRewriter;
 import 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptPredicateParameterRewriter;
+import 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter.EncryptInsertPredicateParameterRewriter;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
@@ -59,6 +60,7 @@ public final class EncryptParameterRewriterBuilder implements 
ParameterRewriterB
         Collection<ParameterRewriter> result = new LinkedList<>();
         addParameterRewriter(result, new 
EncryptAssignmentParameterRewriter(encryptRule));
         addParameterRewriter(result, new 
EncryptPredicateParameterRewriter(encryptRule));
+        addParameterRewriter(result, new 
EncryptInsertPredicateParameterRewriter(encryptRule));
         addParameterRewriter(result, new 
EncryptInsertValueParameterRewriter(encryptRule));
         addParameterRewriter(result, new 
EncryptInsertOnDuplicateKeyUpdateValueParameterRewriter(encryptRule));
         return result;
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertPredicateParameterRewriter.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertPredicateParameterRewriter.java
new file mode 100644
index 00000000000..9c7ab57b811
--- /dev/null
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertPredicateParameterRewriter.java
@@ -0,0 +1,61 @@
+/*
+ * 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.encrypt.rewrite.parameter.rewriter;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
+import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptConditionsAware;
+import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
+import 
org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
+import 
org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewriter;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Insert predicate parameter rewriter for encrypt.
+ */
+@RequiredArgsConstructor
+@Setter
+public final class EncryptInsertPredicateParameterRewriter implements 
ParameterRewriter, EncryptConditionsAware, DatabaseNameAware {
+    
+    private final EncryptRule encryptRule;
+    
+    private Collection<EncryptCondition> encryptConditions;
+    
+    private String databaseName;
+    
+    @Override
+    public boolean isNeedRewrite(final SQLStatementContext 
sqlStatementContext) {
+        return sqlStatementContext instanceof InsertStatementContext && null 
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
+                && !((WhereAvailable) ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext()).getWhereSegments().isEmpty();
+    }
+    
+    @Override
+    public void rewrite(final ParameterBuilder paramBuilder, final 
SQLStatementContext sqlStatementContext, final List<Object> params) {
+        EncryptPredicateParameterRewriter rewriter = new 
EncryptPredicateParameterRewriter(encryptRule);
+        rewriter.setEncryptConditions(encryptConditions);
+        rewriter.setDatabaseName(databaseName);
+        rewriter.rewrite(paramBuilder, ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext(), 
params);
+    }
+}
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
index b948ce29b80..3ce4dff89aa 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java
@@ -31,6 +31,8 @@ import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptI
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertDerivedColumnsTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertOnUpdateTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.insert.EncryptInsertValuesTokenGenerator;
+import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptInsertPredicateColumnTokenGenerator;
+import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptInsertPredicateRightValueTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptPredicateColumnTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.predicate.EncryptPredicateRightValueTokenGenerator;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.generator.projection.EncryptInsertSelectProjectionTokenGenerator;
@@ -67,7 +69,9 @@ public final class EncryptTokenGenerateBuilder implements 
SQLTokenGeneratorBuild
         addSQLTokenGenerator(result, new 
EncryptInsertAssignmentTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptUpdateAssignmentTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptPredicateColumnTokenGenerator(encryptRule));
+        addSQLTokenGenerator(result, new 
EncryptInsertPredicateColumnTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptPredicateRightValueTokenGenerator(encryptRule));
+        addSQLTokenGenerator(result, new 
EncryptInsertPredicateRightValueTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptInsertValuesTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptInsertDefaultColumnsTokenGenerator(encryptRule));
         addSQLTokenGenerator(result, new 
EncryptInsertCipherNameTokenGenerator(encryptRule));
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java
new file mode 100644
index 00000000000..5ffa8f3b155
--- /dev/null
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * 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.encrypt.rewrite.token.generator.predicate;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.SchemaMetaDataAware;
+import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Insert predicate column token generator for encrypt.
+ */
+@HighFrequencyInvocation
+@RequiredArgsConstructor
+@Setter
+public final class EncryptInsertPredicateColumnTokenGenerator implements 
CollectionSQLTokenGenerator<SQLStatementContext>, SchemaMetaDataAware {
+    
+    private final EncryptRule encryptRule;
+    
+    private Map<String, ShardingSphereSchema> schemas;
+    
+    private ShardingSphereSchema defaultSchema;
+    
+    @Override
+    public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
+        return sqlStatementContext instanceof InsertStatementContext && null 
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
+                && !((WhereAvailable) ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext()).getWhereSegments().isEmpty();
+    }
+    
+    @Override
+    public Collection<SQLToken> generateSQLTokens(final SQLStatementContext 
sqlStatementContext) {
+        EncryptPredicateColumnTokenGenerator generator = new 
EncryptPredicateColumnTokenGenerator(encryptRule);
+        generator.setSchemas(schemas);
+        generator.setDefaultSchema(defaultSchema);
+        return generator.generateSQLTokens(((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext());
+    }
+}
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java
new file mode 100644
index 00000000000..293ac09c4d6
--- /dev/null
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java
@@ -0,0 +1,67 @@
+/*
+ * 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.encrypt.rewrite.token.generator.predicate;
+
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
+import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptConditionsAware;
+import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.ParametersAware;
+import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Insert predicate right value token generator for encrypt.
+ */
+@HighFrequencyInvocation
+@RequiredArgsConstructor
+@Setter
+public final class EncryptInsertPredicateRightValueTokenGenerator implements 
CollectionSQLTokenGenerator<SQLStatementContext>, ParametersAware, 
EncryptConditionsAware, DatabaseNameAware {
+    
+    private final EncryptRule encryptRule;
+    
+    private List<Object> parameters;
+    
+    private Collection<EncryptCondition> encryptConditions;
+    
+    private String databaseName;
+    
+    @Override
+    public boolean isGenerateSQLToken(final SQLStatementContext 
sqlStatementContext) {
+        return sqlStatementContext instanceof InsertStatementContext && null 
!= ((InsertStatementContext) sqlStatementContext).getInsertSelectContext()
+                && !((WhereAvailable) ((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext()).getWhereSegments().isEmpty();
+    }
+    
+    @Override
+    public Collection<SQLToken> generateSQLTokens(final SQLStatementContext 
sqlStatementContext) {
+        EncryptPredicateRightValueTokenGenerator generator = new 
EncryptPredicateRightValueTokenGenerator(encryptRule);
+        generator.setParameters(parameters);
+        generator.setEncryptConditions(encryptConditions);
+        generator.setDatabaseName(databaseName);
+        return generator.generateSQLTokens(((InsertStatementContext) 
sqlStatementContext).getInsertSelectContext().getSelectStatementContext());
+    }
+}
diff --git 
a/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml
 
b/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml
new file mode 100644
index 00000000000..f6b7dd5e98a
--- /dev/null
+++ 
b/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml
@@ -0,0 +1,60 @@
+<!--
+  ~ 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.
+  -->
+
+<dataset update-count="1">
+    <metadata data-nodes="encrypt.t_user">
+        <column name="user_id" type="numeric" />
+        <column name="user_name_cipher" type="varchar" />
+        <column name="user_name_like" type="varchar" />
+        <column name="password_cipher" type="varchar" />
+        <column name="email_cipher" type="varchar" />
+        <column name="user_telephone_cipher" type="varchar" />
+        <column name="user_telephone_like" type="varchar" />
+        <column name="creation_date" type="datetime" />
+    </metadata>
+    <row data-node="encrypt.t_user" values="10, sVq8Lmm+j6bZE5EKSilJEQ==, 
yi`mht`m, aQol0b6th65d0aXe+zFPsQ==, 
WM0fHOH91JNWnHTkiqBdyNmzk4uJ7CCz4mB1va9Ya1M=, kLjLJIMnfyHT2nA+viaoaQ==, 
01454589811, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="11, fQ7IzBxKVuNHtUF6h6WSBg==, 
mhth, wuhmEKgdgrWQYt+Ev0hgGA==, svATu3uWv9KfiloWJeWx3A==, 
0kDFxndQdzauFwL/wyCsNQ==, 01454589810, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="12, AQRWSlufQPog/b64YRhu6Q==, 
x`mhxt, x7A+2jq9B6DSOSFtSOibdA==, nHJv9e6NiClIuGHOjHLvCAq2ZLhWcqfQ8/EQnIqMx+g=, 
a/SzSJLapt5iBXvF2c9ycw==, 01454589811, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="13, 5NqS4YvpT+mHBFqZOZ3QDA==, 
yi`pmht, zi6b4xYRjjV+bBk2R4wB+w==, 
MLBZczLjriUXvg3aM5QPTxMJbLjNh8yeNrSNBek/VTw=, b6VVhG+F6ujG8IMUZJAIFg==, 
01454589814, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="14, qeIY9od3u1KwhjihzLQUTQ==, 
yitph, 51UmlLAC+tUvdOAj8CjWfQ==, JCmeNdPyrKO5BW5zvhAA+g==, 
f995xinpZdKMVU5J5/yv3w==, 01454589815, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="15, VbNUtguwtpeGhHGnPJ3aXg==, 
mha`, +3/5CVbqoKhg3sqznKTFFQ==, T+X+e3Q3+ZNIXXmg/80uxg==, 
GETj+S6DrO042E7NuBXLBQ==, 01454589814, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="16, U0/Ao/w1u7L5avR3fAH2Og==, 
x`mhiht, jFfFMYxv02DjaFRuAoCDGw==, 
RNW/KRq5HeL2YTfAdXSyARMJbLjNh8yeNrSNBek/VTw=, +lbvjJwO7VO4HUKc0Mw0NA==, 
01454589815, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="17, zb1sgBigoMi7JPSoY4bAVw==, 
yite`, VFIjocgjujJCJc6waWXqJA==, 1vF/ET3nBxt7T7vVfAndZQ==, 
wFvs5BH6OikgveBeTEBwsQ==, 01454589818, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="18, rJzNIrFEnx296kW+N1YmMw==, 
ttmdq, LaODSKGyR7vZ1IvmBOe9vA==, 5u4GIQkJsWRmnJHWaHNSjg==, 
uwqm2O1Lv2tNTraJX1ym7Q==, 01454589819, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="19, qHwpQ9kteL8VX6iTUhNdbQ==, 
yiptt`m, MyOShk4kjRnds7CZfU5NCw==, 
HmYCo7QBfJ2E0EvaGHBCOBMJbLjNh8yeNrSNBek/VTw=, YLNQuuUPMGA21nhKWPzzsg==, 
01454589818, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="20, qCCmvf7OWRxbVbtLb0az1g==, upl, 
fzdTMkzpBvgNYmKSQAp8Fg==, gOoP4Mf0P4ISOJp6A4sRmg==, l4xa4HwOfs/jusoJon9Wzw==, 
01454589801, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="21, IYJ1COaRQ0gSjWMC/UAeMg==, 
lpad, 1uEDMeYh2jstbOf6kx/cqw==, tikMAFiQ37u2VgWqUT38Eg==, 
rGpr30UXfczXjCjdvPN+BA==, 01454589800, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="22, 7wvZZ7NVHgk6m1vB/sTC1Q==, 
idqqx, OirN3gvz9uBnrq88nfa1wQ==, T7K/Uz1O2m+3xvB0+c4nGQ==, 
7+fCU+VbQZKgLJXZPTTegA==, 01454589801, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="23, SbVQWl8JbnxflCfGJ7KZdA==, 
i`ldt, hWVVYdkdTUTgm08haeq+tw==, Uk3ju6GteCD1qEHns5ZhKA==, 
DpnV86FZefwBRmIAVBh2gg==, 01454589804, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="24, fx7OfSAYqVpjNa7LoKhXvw==, 
x`ed, N2W9ijAXNkBxhkvJiIwp0A==, lAAGItVLmb1H69++1MDrIA==, 
QrE62wAb8B+2cEPcs4Lm1Q==, 01454589805, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="25, wH3/LdWShD9aCb8eCIm3Tg==, 
qptd, GDixtt6NzPOVv6H0dmov5g==, T1yfJSyVxumZUfkDnmUQxA==, 
iU+AsGczboCRfU+Zr7mcpw==, 01454589804, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="26, GgJQTndbxyBZ2tECS8SmqQ==, 
apti, gLgVFLFIyyKwdQCXaw78Ag==, O+JIn9XZ3yq6RnKElHuqlA==, 
kwYlbu9aF7ndvMTcj8QBSg==, 01454589805, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="27, lv8w8g32kuTXNvSUUypOig==, 
i`dl, 8i0YH2mn6kXSyvBjM5p+Yg==, gqRoJF5S66SvBalc2RCo1A==, 
2ob/3UYqRsZA5VdScnaWxQ==, 01454589808, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="28, P9YCbFvWCIhcS99KyKH2zA==, 
ipqe`m, PRrI4z4FrWwLvcHPx9g4og==, y8q31Jj4PFSyZHiLVIxKEQq2ZLhWcqfQ8/EQnIqMx+g=, 
kDF2za26uOerlNYWYHRT2Q==, 01454589809, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="29, 5wu9XvlJAVtjKijhxt6SQQ==, 
itmhd, O4pgkLgz34N+C4bIUOQVnA==, UH7ihg16J61Np/EYMQnXIA==, 
z2hbJQD4dRkVVITNxAac5Q==, 01454589808, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="30, i50fpEe3j0VOy/Hbfmr5Bg==, 兹卜, 
MyOShk4kjRnds7CZfU5NCw==, WM0fHOH91JNWnHTkiqBdyNmzk4uJ7CCz4mB1va9Ya1M=, 
uRbQGcAhuXmxdIzRsgiy8g==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="31, wLXX1Gs7zl0PkyJRMIxmCQ==, 兹付, 
fzdTMkzpBvgNYmKSQAp8Fg==, cq1LN85LmWHrEtS4gN/ac9mzk4uJ7CCz4mB1va9Ya1M=, 
jDL+p5OyKQXfQ4H8JpNKJQ==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="32, 5NNYIZCq4Dxab0uKWXt93A==, 兹咔, 
1uEDMeYh2jstbOf6kx/cqw==, rehTd++DbFy3qYqeDJUjRRMJbLjNh8yeNrSNBek/VTw=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="33, 8kgeyqYaHUMq6di5BVt3Ow==, 伴伌, 
OirN3gvz9uBnrq88nfa1wQ==, svATu3uWv9KfiloWJeWx3A==, 60fpnMdKCWeyKzxkdthn2Q==, 
09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="34, THN1NIcHrqnfvPKR92lAKw==, 伴侁, 
ZSU1lmpj8cugQHD59QxPhQ==, KtMacpLCtRTSl+VeCPYrPwq2ZLhWcqfQ8/EQnIqMx+g=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="35, R3tsv8yeGKXz7WXLYfjkPA==, 伈夸噥, 
31jh3gwg1fgDFnd6iYxU+Q==, ZsrMzd0mjJ9H3fxe4UNVfQsU49iKH47f2rb+/uKuo9M=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="36, M2hIFm7Z/s4zGd+rPD1USA==, 伈僘噭, 
bO/8ha1eS/H8/3DugjdOAQ==, PyO5yO0W8v5cpLPhqASTHA==, 60fpnMdKCWeyKzxkdthn2Q==, 
09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="37, aXS0VfnqHIAnOAtDjsF/9Q==, 伈嶱啴, 
bO/8ha1eS/H8/3DugjdOAQ==, fwyOxfHtLxNuSCFmghYiY0qMsgbpjg5UIo3xmJOLGu0=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="38, 59/68izQEdnwNSueX1lPAA==, 伈乄, 
ilD/Tk7DUG4+EuznS1bNLg==, 2emhAeiXPr0kHbFrhYlM1dmzk4uJ7CCz4mB1va9Ya1M=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="39, fn9LnNltUAOWO0F0iy0+Jw==, 伈妅, 
qe/WdUiSPP1RAsSSuejGJw==, zx2omwIbXHpEJeh8ta7HqQq2ZLhWcqfQ8/EQnIqMx+g=, 
60fpnMdKCWeyKzxkdthn2Q==, 09101401454, 2017-08-08" />
+    <row data-node="encrypt.t_user" values="40, fQ7IzBxKVuNHtUF6h6WSBg==, 
mhth, wuhmEKgdgrWQYt+Ev0hgGA==, svATu3uWv9KfiloWJeWx3A==, 
0kDFxndQdzauFwL/wyCsNQ==, 01454589810, 2017-08-08" />
+</dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml 
b/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml
index eff31f59f11..32338032a96 100644
--- a/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml
+++ b/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml
@@ -96,6 +96,10 @@
         <assertion parameters="999:int, 10:int, insertALL:String, 998:int, 
10:int, insertALL:String" 
expected-data-file="batch_insert_into_order_with_select.xml" />
     </test-case>
     
+    <test-case sql="INSERT INTO t_user (user_id, user_name, password, email, 
telephone, creation_date) SELECT ?, user_name, password, email, telephone, 
creation_date FROM t_user where user_name = ? and user_id = ?" 
scenario-types="encrypt" db-types="MySQL">
+        <assertion parameters="40:int, lisi:String, 11:int" 
expected-data-file="insert_select_user_table.xml" />
+    </test-case>
+    
     <test-case sql="INSERT INTO t_order_item VALUES (?, ?, 1, 1, 
'2017-08-08')" scenario-types="db,tbl,dbtbl_with_readwrite_splitting">
         <assertion parameters="1:int, 1:int" 
expected-data-file="insert_without_generate_key_column.xml" 
expected-generated-key-data-file="insert_without_generate_key_column_generated_key_data.xml"
 />
     </test-case>
diff --git 
a/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-select.xml
 
b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-select.xml
new file mode 100644
index 00000000000..62272153b8a
--- /dev/null
+++ 
b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-select.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<rewrite-assertions yaml-rule="scenario/encrypt/config/query-with-cipher.yaml">
+    <rewrite-assertion id="insert_select_account_bak_for_parameters" 
db-types="MySQL">
+        <input sql="INSERT INTO t_account_detail (account_id, 
certificate_number, password, amount, status) SELECT 40, certificate_number, 
password, amount, status FROM t_account WHERE certificate_number = ?" 
parameters="cert1" />
+        <output sql="INSERT INTO t_account_detail (account_id, 
cipher_certificate_number, assisted_query_certificate_number, 
like_query_certificate_number, cipher_password, assisted_query_password, 
like_query_password, cipher_amount, status) SELECT 40, 
cipher_certificate_number, assisted_query_certificate_number, 
like_query_certificate_number, cipher_password, assisted_query_password, 
like_query_password, cipher_amount, status FROM t_account WHERE 
assisted_query_certificate_number = ?" 
+                parameters="assisted_query_cert1" />
+    </rewrite-assertion>
+    
+    <rewrite-assertion id="insert_select_account_bak_for_literal" 
db-types="MySQL">
+        <input sql="INSERT INTO t_account_detail (account_id, 
certificate_number, password, amount, status) SELECT 40, certificate_number, 
password, amount, status FROM t_account WHERE certificate_number = 'cert1'" />
+        <output sql="INSERT INTO t_account_detail (account_id, 
cipher_certificate_number, assisted_query_certificate_number, 
like_query_certificate_number, cipher_password, assisted_query_password, 
like_query_password, cipher_amount, status) SELECT 40, 
cipher_certificate_number, assisted_query_certificate_number, 
like_query_certificate_number, cipher_password, assisted_query_password, 
like_query_password, cipher_amount, status FROM t_account WHERE 
assisted_query_certificate_number = 'ass [...]
+    </rewrite-assertion>
+</rewrite-assertions>

Reply via email to