diff --git a/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java b/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java index 78c193334b092f962dd388d68e00630302540395..64a5f4b757f8ccd68a958ac1d6a57f0adbe35588 100644 --- a/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java +++ b/sharding-core/sharding-core-entry/src/main/java/org/apache/shardingsphere/core/BaseShardingEngine.java @@ -24,8 +24,10 @@ import org.apache.shardingsphere.core.constant.properties.ShardingProperties; import org.apache.shardingsphere.core.constant.properties.ShardingPropertiesConstant; import org.apache.shardingsphere.core.metadata.ShardingMetaData; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.rewriter.EncryptSQLRewriter; -import org.apache.shardingsphere.core.rewrite.rewriter.ShardingSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ShardingParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.ShardingSQLRewriter; import org.apache.shardingsphere.core.route.RouteUnit; import org.apache.shardingsphere.core.route.SQLLogger; import org.apache.shardingsphere.core.route.SQLRouteResult; @@ -34,7 +36,9 @@ import org.apache.shardingsphere.core.route.hook.SPIRoutingHook; import org.apache.shardingsphere.core.route.type.RoutingUnit; import org.apache.shardingsphere.core.rule.ShardingRule; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -102,10 +106,11 @@ public abstract class BaseShardingEngine { } private Collection rewriteAndConvert(final List parameters, final SQLRouteResult sqlRouteResult) { - SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, sqlRouteResult.getSqlStatement(), parameters); + SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, sqlRouteResult.getSqlStatement(), parameters, sqlRouteResult.getRoutingResult().isSingleRouting()); + ShardingParameterRewriter shardingParameterRewriter = new ShardingParameterRewriter(databaseType, sqlRouteResult); ShardingSQLRewriter shardingSQLRewriter = new ShardingSQLRewriter(shardingRule, databaseType, sqlRouteResult, sqlRouteResult.getOptimizeResult()); EncryptSQLRewriter encryptSQLRewriter = new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), sqlRouteResult.getSqlStatement(), sqlRouteResult.getOptimizeResult()); - rewriteEngine.init(shardingSQLRewriter, encryptSQLRewriter); + rewriteEngine.init(Collections.singletonList(shardingParameterRewriter), Arrays.asList(shardingSQLRewriter, encryptSQLRewriter)); Collection result = new LinkedHashSet<>(); for (RoutingUnit each : sqlRouteResult.getRoutingResult().getRoutingUnits()) { result.add(new RouteUnit(each.getDataSourceName(), rewriteEngine.generateSQL(each))); diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java index 0d6dc21d65fdc03ff9d820bad5ea9bc45ca176e6..7a2c3548b9f3045c194e8002168643a11b8e3c60 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/SQLRewriteEngine.java @@ -19,11 +19,12 @@ package org.apache.shardingsphere.core.rewrite; import com.google.common.base.Optional; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; -import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; +import org.apache.shardingsphere.core.parse.sql.token.SQLToken; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; -import org.apache.shardingsphere.core.rewrite.rewriter.BaseSQLRewriter; -import org.apache.shardingsphere.core.rewrite.rewriter.SQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.BaseSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.core.rewrite.token.BaseTokenGenerateEngine; import org.apache.shardingsphere.core.rewrite.token.EncryptTokenGenerateEngine; import org.apache.shardingsphere.core.rewrite.token.MasterSlaveTokenGenerateEngine; @@ -36,6 +37,7 @@ import org.apache.shardingsphere.core.rule.BindingTableRule; import org.apache.shardingsphere.core.rule.EncryptRule; import org.apache.shardingsphere.core.rule.ShardingRule; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; @@ -62,10 +64,10 @@ public final class SQLRewriteEngine { private final BaseSQLRewriter baseSQLRewriter; - public SQLRewriteEngine(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List parameters) { + public SQLRewriteEngine(final ShardingRule shardingRule, final SQLStatement sqlStatement, final List parameters, final boolean isSingleRoute) { baseRule = shardingRule; this.sqlStatement = sqlStatement; - sqlTokens = createSQLTokens(shardingRule, sqlStatement); + sqlTokens = createSQLTokens(shardingRule, sqlStatement, isSingleRoute); sqlBuilder = new SQLBuilder(); parameterBuilder = new ParameterBuilder(parameters); baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens); @@ -74,7 +76,7 @@ public final class SQLRewriteEngine { public SQLRewriteEngine(final EncryptRule encryptRule, final SQLStatement sqlStatement, final List parameters) { baseRule = encryptRule; this.sqlStatement = sqlStatement; - sqlTokens = createSQLTokens(encryptRule, sqlStatement); + sqlTokens = createSQLTokens(encryptRule, sqlStatement, true); sqlBuilder = new SQLBuilder(); parameterBuilder = new ParameterBuilder(parameters); baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens); @@ -83,23 +85,23 @@ public final class SQLRewriteEngine { public SQLRewriteEngine(final SQLStatement sqlStatement) { baseRule = null; this.sqlStatement = sqlStatement; - sqlTokens = createSQLTokens(null, sqlStatement); + sqlTokens = createSQLTokens(null, sqlStatement, true); sqlBuilder = new SQLBuilder(); parameterBuilder = new ParameterBuilder(Collections.emptyList()); baseSQLRewriter = new BaseSQLRewriter(sqlStatement, sqlTokens); } - private List createSQLTokens(final BaseRule baseRule, final SQLStatement sqlStatement) { - List result = new LinkedList<>(); - result.addAll(new BaseTokenGenerateEngine().generateSQLTokens(sqlStatement, baseRule)); + private List createSQLTokens(final BaseRule baseRule, final SQLStatement sqlStatement, final boolean isSingleRoute) { + List result = new LinkedList<>(sqlStatement.getSQLTokens()); + result.addAll(new BaseTokenGenerateEngine().generateSQLTokens(sqlStatement, baseRule, isSingleRoute)); if (baseRule instanceof ShardingRule) { ShardingRule shardingRule = (ShardingRule) baseRule; - result.addAll(new ShardingTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule)); - result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule.getEncryptRule())); + result.addAll(new ShardingTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule, isSingleRoute)); + result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, shardingRule.getEncryptRule(), isSingleRoute)); } else if (baseRule instanceof EncryptRule) { - result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, (EncryptRule) baseRule)); + result.addAll(new EncryptTokenGenerateEngine().generateSQLTokens(sqlStatement, (EncryptRule) baseRule, isSingleRoute)); } else { - result.addAll(new MasterSlaveTokenGenerateEngine().generateSQLTokens(sqlStatement, null)); + result.addAll(new MasterSlaveTokenGenerateEngine().generateSQLTokens(sqlStatement, null, isSingleRoute)); } Collections.sort(result); return result; @@ -108,9 +110,13 @@ public final class SQLRewriteEngine { /** * Initialize SQL rewrite engine. * + * @param parameterRewriters parameter rewriters * @param sqlRewriters SQL rewriters */ - public void init(final SQLRewriter... sqlRewriters) { + public void init(final Collection parameterRewriters, final Collection sqlRewriters) { + for (ParameterRewriter each : parameterRewriters) { + each.rewrite(parameterBuilder); + } if (sqlTokens.isEmpty()) { baseSQLRewriter.appendWholeSQL(sqlBuilder); return; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java index a9262d0e590f73f534f66e1a864ababc9b92d8c2..0b1992e9a6dc58ff3cf9d8068300fc99cacd3e99 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/builder/ParameterBuilder.java @@ -40,13 +40,16 @@ public final class ParameterBuilder { private final List originalParameters; - private final Map assistedIndexAndParametersForUpdate; + private final Map addedIndexAndParameters; + + private final Map replacedIndexAndParameters; private final List insertParameterUnits; public ParameterBuilder(final List parameters) { originalParameters = new LinkedList<>(parameters); - assistedIndexAndParametersForUpdate = new HashMap<>(); + addedIndexAndParameters = new HashMap<>(); + replacedIndexAndParameters = new HashMap<>(); insertParameterUnits = new LinkedList<>(); } @@ -122,9 +125,12 @@ public final class ParameterBuilder { private List getRevisedParameters() { List result = new LinkedList<>(originalParameters); - for (Entry entry : assistedIndexAndParametersForUpdate.entrySet()) { + for (Entry entry : addedIndexAndParameters.entrySet()) { result.add(entry.getKey(), entry.getValue()); } + for (Entry entry : replacedIndexAndParameters.entrySet()) { + result.set(entry.getKey(), entry.getValue()); + } return result; } } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ParameterRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ParameterRewriter.java new file mode 100644 index 0000000000000000000000000000000000000000..a21711d569c58ece72d4bf708e571625c06b8103 --- /dev/null +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ParameterRewriter.java @@ -0,0 +1,35 @@ +/* + * 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.rewriter.parameter; + +import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; + +/** + * Parameter rewriter. + * + * @author zhangliang + */ +public interface ParameterRewriter { + + /** + * Rewrite. + * + * @param parameterBuilder parameter builder + */ + void rewrite(ParameterBuilder parameterBuilder); +} diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java new file mode 100644 index 0000000000000000000000000000000000000000..1451e39a488578193d16f7ebba89f3d91c44723c --- /dev/null +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/parameter/ShardingParameterRewriter.java @@ -0,0 +1,49 @@ +/* + * 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.rewriter.parameter; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement; +import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; +import org.apache.shardingsphere.core.route.SQLRouteResult; + +/** + * Parameter rewriter for sharding. + * + * @author zhangliang + */ +@RequiredArgsConstructor +public final class ShardingParameterRewriter implements ParameterRewriter { + + private final DatabaseType databaseType; + + private final SQLRouteResult sqlRouteResult; + + @Override + public void rewrite(final ParameterBuilder parameterBuilder) { + if (sqlRouteResult.getSqlStatement() instanceof SelectStatement && null != sqlRouteResult.getLimit()) { + rewriteLimit((SelectStatement) sqlRouteResult.getSqlStatement(), parameterBuilder); + } + } + + private void rewriteLimit(final SelectStatement selectStatement, final ParameterBuilder parameterBuilder) { + boolean isNeedFetchAll = (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) && !selectStatement.isSameGroupByAndOrderByItems(); + parameterBuilder.getReplacedIndexAndParameters().putAll(sqlRouteResult.getLimit().getRevisedIndexAndParameters(isNeedFetchAll, databaseType.name())); + } +} diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/BaseSQLRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/BaseSQLRewriter.java similarity index 96% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/BaseSQLRewriter.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/BaseSQLRewriter.java index 14c04cb5068aea45d83b719eebef846342787186..d60c67424b36fe9fd7ca402bf4d47524f97b40b2 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/BaseSQLRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/BaseSQLRewriter.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.rewriter; +package org.apache.shardingsphere.core.rewrite.rewriter.sql; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; -import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.Substitutable; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertColumnsToken; +import org.apache.shardingsphere.core.parse.sql.token.SQLToken; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; import org.apache.shardingsphere.core.rewrite.placeholder.InsertColumnsPlaceholder; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertColumnsToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.Substitutable; import java.util.List; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/EncryptSQLRewriter.java similarity index 96% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriter.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/EncryptSQLRewriter.java index 11fc6620158f972e3615e626df9c19f43f18ea9c..4a6499824cbb01754471105f054a33892fc5fd87 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/EncryptSQLRewriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.rewriter; +package org.apache.shardingsphere.core.rewrite.rewriter.sql; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -29,11 +29,7 @@ import org.apache.shardingsphere.core.parse.sql.segment.dml.expr.simple.Paramete import org.apache.shardingsphere.core.parse.sql.segment.dml.predicate.PredicateSegment; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement; -import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertAssistedColumnsToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddAssistedColumnsToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetEncryptValueToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertValuesToken; +import org.apache.shardingsphere.core.parse.sql.token.SQLToken; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; import org.apache.shardingsphere.core.rewrite.placeholder.InsertAssistedColumnsPlaceholder; @@ -46,6 +42,10 @@ import org.apache.shardingsphere.core.rewrite.placeholder.UpdateEncryptAssistedI import org.apache.shardingsphere.core.rewrite.placeholder.UpdateEncryptItemPlaceholder; import org.apache.shardingsphere.core.rewrite.placeholder.WhereEncryptColumnPlaceholder; import org.apache.shardingsphere.core.rewrite.token.pojo.EncryptColumnToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertAssistedColumnsToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddAssistedColumnsToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetEncryptValueToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertValuesToken; import org.apache.shardingsphere.core.rule.ColumnNode; import org.apache.shardingsphere.core.strategy.encrypt.ShardingEncryptorEngine; import org.apache.shardingsphere.spi.encrypt.ShardingEncryptor; @@ -140,8 +140,8 @@ public final class EncryptSQLRewriter implements SQLRewriter { sqlBuilder.appendPlaceholder(new InsertSetEncryptValuePlaceholder(insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(insertSetEncryptValueToken.getColumnName()))); } - private void appendInsertSetAddItemsPlaceholder(final SQLBuilder sqlBuilder, - final InsertSetAddAssistedColumnsToken insertSetAddAssistedColumnsToken, final InsertOptimizeResult insertOptimizeResult) { + private void appendInsertSetAddItemsPlaceholder( + final SQLBuilder sqlBuilder, final InsertSetAddAssistedColumnsToken insertSetAddAssistedColumnsToken, final InsertOptimizeResult insertOptimizeResult) { List columnValues = new LinkedList<>(); for (String each : insertSetAddAssistedColumnsToken.getColumnNames()) { columnValues.add(insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(each)); @@ -215,7 +215,7 @@ public final class EncryptSQLRewriter implements SQLRewriter { return getUpdateEncryptItemPlaceholder(encryptColumnToken, encryptColumnValues); } List> encryptAssistedColumnValues = encryptorEngine.getEncryptAssistedColumnValues(columnNode, Collections.>singletonList(originalColumnValue)); - parameterBuilder.getAssistedIndexAndParametersForUpdate().putAll(getIndexAndParameters(encryptColumnToken, encryptAssistedColumnValues)); + parameterBuilder.getAddedIndexAndParameters().putAll(getIndexAndParameters(encryptColumnToken, encryptAssistedColumnValues)); return getUpdateEncryptAssistedItemPlaceholder(encryptColumnToken, encryptColumnValues, encryptAssistedColumnValues); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/SQLRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/SQLRewriter.java similarity index 95% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/SQLRewriter.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/SQLRewriter.java index 5c860ce16718de81f025990c6d9f25c6789d3b99..a672cac949fc5c8f4af7a11a731e777ac4754248 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/SQLRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/SQLRewriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.rewriter; +package org.apache.shardingsphere.core.rewrite.rewriter.sql; import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriter.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/ShardingSQLRewriter.java similarity index 96% rename from sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriter.java rename to sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/ShardingSQLRewriter.java index 27d11fcba9b04ffe4accdc61d8134277bc958187..6906b0560cd7fc89611d5c409916f00968d749d4 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriter.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/rewriter/sql/ShardingSQLRewriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.rewrite.rewriter; +package org.apache.shardingsphere.core.rewrite.rewriter.sql; import com.google.common.base.Optional; import com.google.common.base.Strings; @@ -25,8 +25,7 @@ import org.apache.shardingsphere.core.optimize.result.insert.InsertOptimizeResul import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.OrderByItemSegment; import org.apache.shardingsphere.core.parse.sql.segment.dml.order.item.TextOrderByItemSegment; import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement; -import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; -import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddGeneratedKeyToken; +import org.apache.shardingsphere.core.parse.sql.token.SQLToken; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; import org.apache.shardingsphere.core.rewrite.placeholder.AggregationDistinctPlaceholder; @@ -42,6 +41,7 @@ import org.apache.shardingsphere.core.rewrite.placeholder.TablePlaceholder; import org.apache.shardingsphere.core.rewrite.token.pojo.AggregationDistinctToken; import org.apache.shardingsphere.core.rewrite.token.pojo.IndexToken; import org.apache.shardingsphere.core.rewrite.token.pojo.InsertGeneratedKeyToken; +import org.apache.shardingsphere.core.rewrite.token.pojo.InsertSetAddGeneratedKeyToken; import org.apache.shardingsphere.core.rewrite.token.pojo.OffsetToken; import org.apache.shardingsphere.core.rewrite.token.pojo.OrderByToken; import org.apache.shardingsphere.core.rewrite.token.pojo.RowCountToken; @@ -186,7 +186,8 @@ public final class ShardingSQLRewriter implements SQLRewriter { sqlBuilder.appendPlaceholder(new InsertGeneratedKeyPlaceholder(insertGeneratedKeyToken.getColumn(), insertGeneratedKeyToken.isToAddCloseParenthesis())); } - private void appendInsertSetAddGeneratedKeyPlaceholder(final SQLBuilder sqlBuilder, final InsertSetAddGeneratedKeyToken insertSetAddGeneratedKeyToken, final InsertOptimizeResult insertOptimizeResult) { + private void appendInsertSetAddGeneratedKeyPlaceholder( + final SQLBuilder sqlBuilder, final InsertSetAddGeneratedKeyToken insertSetAddGeneratedKeyToken, final InsertOptimizeResult insertOptimizeResult) { String columnName = insertSetAddGeneratedKeyToken.getColumnName(); sqlBuilder.appendPlaceholder(new InsertSetAddGeneratedKeyPlaceholder(columnName, insertOptimizeResult.getUnits().get(0).getColumnSQLExpression(columnName))); } diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java index 36b3a4e74eacb1055bed0394241ae0a5b0a8555a..fcd562506ae676ff0a52b1f9ccbb9636f9987b9c 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/SQLTokenGenerateEngine.java @@ -21,6 +21,7 @@ import com.google.common.base.Optional; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.token.pojo.SQLToken; import org.apache.shardingsphere.core.rewrite.token.generator.CollectionSQLTokenGenerator; +import org.apache.shardingsphere.core.rewrite.token.generator.IgnoreForSingleRoute; import org.apache.shardingsphere.core.rewrite.token.generator.OptionalSQLTokenGenerator; import org.apache.shardingsphere.core.rewrite.token.generator.SQLTokenGenerator; import org.apache.shardingsphere.core.rule.BaseRule; @@ -43,12 +44,16 @@ public abstract class SQLTokenGenerateEngine { * * @param sqlStatement SQL statement * @param rule rule + * @param isSingleRoute is single route * @return SQL tokens */ @SuppressWarnings("unchecked") - public final List generateSQLTokens(final SQLStatement sqlStatement, final T rule) { + public final List generateSQLTokens(final SQLStatement sqlStatement, final T rule, final boolean isSingleRoute) { List result = new LinkedList<>(); for (SQLTokenGenerator each : getSQLTokenGenerators()) { + if (isSingleRoute && each instanceof IgnoreForSingleRoute) { + continue; + } if (each instanceof OptionalSQLTokenGenerator) { Optional sqlToken = ((OptionalSQLTokenGenerator) each).generateSQLToken(sqlStatement, rule); if (sqlToken.isPresent()) { diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IgnoreForSingleRoute.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IgnoreForSingleRoute.java new file mode 100644 index 0000000000000000000000000000000000000000..db7f93cd0b7b1cd61444aa20873d8a3c524a94a9 --- /dev/null +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/IgnoreForSingleRoute.java @@ -0,0 +1,26 @@ +/* + * 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.token.generator; + +/** + * Ignore for single route. + * + * @author zhangliang + */ +public interface IgnoreForSingleRoute { +} diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java index 2bd3faffc6393f35092224638a158da43892c330..05afdb8e64ee0af20de00cdcd97e3cd98ea30b49 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/OffsetTokenGenerator.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.core.rule.ShardingRule; * * @author panjuan */ -public final class OffsetTokenGenerator implements OptionalSQLTokenGenerator { +public final class OffsetTokenGenerator implements OptionalSQLTokenGenerator, IgnoreForSingleRoute { @Override public Optional generateSQLToken(final SQLStatement sqlStatement, final ShardingRule shardingRule) { diff --git a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java index ff1e41a451db0ff35bb55903ea7b87aa7dc3fbe2..1e8266df5d89a1859b2f754bc61227aa5c452c1f 100644 --- a/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java +++ b/sharding-core/sharding-core-rewrite/src/main/java/org/apache/shardingsphere/core/rewrite/token/generator/RowCountTokenGenerator.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.core.rule.ShardingRule; * * @author panjuan */ -public final class RowCountTokenGenerator implements OptionalSQLTokenGenerator { +public final class RowCountTokenGenerator implements OptionalSQLTokenGenerator, IgnoreForSingleRoute { @Override public Optional generateSQLToken(final SQLStatement sqlStatement, final ShardingRule shardingRule) { diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriterTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriterTest.java index a754b23aeac7c1f918a8c891bfee1c72c203525e..22c56d2fed4ba520bbe600138dc02a503f7741f7 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriterTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/EncryptSQLRewriterTest.java @@ -28,6 +28,9 @@ import org.apache.shardingsphere.core.optimize.result.OptimizeResult; import org.apache.shardingsphere.core.parse.entry.EncryptSQLParseEntry; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.core.route.SQLUnit; import org.apache.shardingsphere.core.rule.EncryptRule; import org.junit.Before; @@ -185,7 +188,8 @@ public final class EncryptSQLRewriterTest { SQLStatement sqlStatement = encryptSQLParseEngine.parse(sql, false); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(encryptRule, sqlStatement, parameters); OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(encryptRule, sqlStatement, parameters).optimize(); - sqlRewriteEngine.init(new EncryptSQLRewriter(encryptRule.getEncryptorEngine(), sqlStatement, optimizeResult)); + sqlRewriteEngine.init( + Collections.emptyList(), Collections.singletonList(new EncryptSQLRewriter(encryptRule.getEncryptorEngine(), sqlStatement, optimizeResult))); return sqlRewriteEngine.generateSQL(); } } diff --git a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriterTest.java b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriterTest.java index fd890f78c16daefe88a3ba3911b0358aab4c0d49..1a2de470c30bbf0b67123e2bd8cb513334de60ce 100644 --- a/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriterTest.java +++ b/sharding-core/sharding-core-rewrite/src/test/java/org/apache/shardingsphere/core/rewrite/rewriter/ShardingSQLRewriterTest.java @@ -59,6 +59,10 @@ import org.apache.shardingsphere.core.parse.sql.statement.dml.UpdateStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder; import org.apache.shardingsphere.core.rewrite.builder.SQLBuilder; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ShardingParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.ShardingSQLRewriter; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.limit.Limit; import org.apache.shardingsphere.core.route.limit.LimitValue; @@ -549,10 +553,10 @@ public final class ShardingSQLRewriterTest { routeResult = new SQLRouteResult(selectStatement); routeResult.setRoutingResult(new RoutingResult()); selectStatement.setLogicSQL("SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?"); - SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters); - rewriteEngine.init( - new ShardingSQLRewriter(shardingRule, DatabaseType.MySQL, routeResult, null), - new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult())); + SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters, routeResult.getRoutingResult().isSingleRouting()); + rewriteEngine.init(Collections.singletonList(new ShardingParameterRewriter(DatabaseType.MySQL, routeResult)), + Arrays.asList(new ShardingSQLRewriter(shardingRule, DatabaseType.MySQL, routeResult, null), + new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()))); RoutingUnit routingUnit = new RoutingUnit("db0"); routingUnit.getTableUnits().add(new TableUnit("table_x", "table_x")); assertThat(rewriteEngine.generateSQL(routingUnit).getSql(), is("SELECT table_x.id, x.name FROM table_x x, table_y y WHERE table_x.id=? AND x.name=?")); @@ -917,10 +921,10 @@ public final class ShardingSQLRewriterTest { } private SQLRewriteEngine createSQLRewriteEngine(final DatabaseType databaseType, final List parameters) { - SQLRewriteEngine result = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters); - result.init( - new ShardingSQLRewriter(shardingRule, databaseType, routeResult, routeResult.getOptimizeResult()), - new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult())); + SQLRewriteEngine result = new SQLRewriteEngine(shardingRule, routeResult.getSqlStatement(), parameters, routeResult.getRoutingResult().isSingleRouting()); + result.init(Collections.singletonList(new ShardingParameterRewriter(DatabaseType.MySQL, routeResult)), + Arrays.asList(new ShardingSQLRewriter(shardingRule, databaseType, routeResult, routeResult.getOptimizeResult()), + new EncryptSQLRewriter(shardingRule.getEncryptRule().getEncryptorEngine(), routeResult.getSqlStatement(), routeResult.getOptimizeResult()))); return result; } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/PreparedStatementRoutingEngine.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/PreparedStatementRoutingEngine.java index 1e966d94174d3b65f0b7f53eb89d41d5aa491826..9c576d31b25452f3150e724085b46683529d8fd7 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/PreparedStatementRoutingEngine.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/PreparedStatementRoutingEngine.java @@ -63,6 +63,6 @@ public final class PreparedStatementRoutingEngine { if (null == sqlStatement) { sqlStatement = shardingRouter.parse(logicSQL, true); } - return masterSlaveRouter.route(shardingRouter.route(logicSQL, parameters, sqlStatement)); + return masterSlaveRouter.route(shardingRouter.route(sqlStatement, parameters)); } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/StatementRoutingEngine.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/StatementRoutingEngine.java index c052e4430bfb53bac47f1c9284b51a6f181e9582..032906bf337d4318709c60396cce48c2ce5c99d9 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/StatementRoutingEngine.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/StatementRoutingEngine.java @@ -54,6 +54,6 @@ public final class StatementRoutingEngine { */ public SQLRouteResult route(final String logicSQL) { SQLStatement sqlStatement = shardingRouter.parse(logicSQL, false); - return masterSlaveRouter.route(shardingRouter.route(logicSQL, Collections.emptyList(), sqlStatement)); + return masterSlaveRouter.route(shardingRouter.route(sqlStatement, Collections.emptyList())); } } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java index 9b22bc0a226dee5fde2abb06105a9e6131234896..b6c4ac14aa8c275c135f45a1e0ec11bb57e5dec9 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/limit/Limit.java @@ -23,7 +23,9 @@ import lombok.ToString; import org.apache.shardingsphere.core.parse.exception.SQLParsingException; import org.apache.shardingsphere.core.util.NumberUtil; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Limit object. @@ -60,18 +62,11 @@ public final class Limit { } /** - * Fill parameters for rewrite limit. + * Fill parameters. * - * @param parameters parameters - * @param isFetchAll is fetch all data or not - * @param databaseType database type + * @param parameters SQL parameters */ - public void processParameters(final List parameters, final boolean isFetchAll, final String databaseType) { - fill(parameters); - rewrite(parameters, isFetchAll, databaseType); - } - - private void fill(final List parameters) { + public void fillParameters(final List parameters) { int offset = 0; if (null != this.offset) { offset = -1 == this.offset.getIndex() ? getOffsetValue() : NumberUtil.roundHalfUp(parameters.get(this.offset.getIndex())); @@ -87,7 +82,15 @@ public final class Limit { } } - private void rewrite(final List parameters, final boolean isFetchAll, final String databaseType) { + /** + * Revise parameters. + * + * @param isFetchAll is fetch all data or not + * @param databaseType database type + * @return revised indexes and parameters + */ + public Map getRevisedIndexAndParameters(final boolean isFetchAll, final String databaseType) { + Map result = new HashMap<>(2, 1); int rewriteOffset = 0; int rewriteRowCount; if (isFetchAll) { @@ -98,11 +101,12 @@ public final class Limit { rewriteRowCount = rowCount.getValue(); } if (null != offset && offset.getIndex() > -1) { - parameters.set(offset.getIndex(), rewriteOffset); + result.put(offset.getIndex(), rewriteOffset); } if (null != rowCount && rowCount.getIndex() > -1) { - parameters.set(rowCount.getIndex(), rewriteRowCount); + result.put(rowCount.getIndex(), rewriteRowCount); } + return result; } /** diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/DatabaseHintSQLRouter.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/DatabaseHintSQLRouter.java index c3c1790183228ee805f0ab3f2427a9deba4c544c..6051d50722fd2ac5e20c489b462f18891002f640 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/DatabaseHintSQLRouter.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/DatabaseHintSQLRouter.java @@ -51,7 +51,7 @@ public final class DatabaseHintSQLRouter implements ShardingRouter { @Override // TODO insert SQL need parse gen key - public SQLRouteResult route(final String logicSQL, final List parameters, final SQLStatement sqlStatement) { + public SQLRouteResult route(final SQLStatement sqlStatement, final List parameters) { SQLRouteResult result = new SQLRouteResult(sqlStatement); RoutingResult routingResult = new DatabaseHintRoutingEngine( shardingRule.getShardingDataSourceNames().getDataSourceNames(), (HintShardingStrategy) shardingRule.getDefaultDatabaseShardingStrategy()).route(); diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ParsingSQLRouter.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ParsingSQLRouter.java index 37aa0fc96c9da61b6ff47fb0480f13ebbb82556a..10951d383e79ad5670f31697ed825acf68f39ca5 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ParsingSQLRouter.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ParsingSQLRouter.java @@ -91,7 +91,7 @@ public final class ParsingSQLRouter implements ShardingRouter { } @Override - public SQLRouteResult route(final String logicSQL, final List parameters, final SQLStatement sqlStatement) { + public SQLRouteResult route(final SQLStatement sqlStatement, final List parameters) { Optional generatedKey = sqlStatement instanceof InsertStatement ? GeneratedKey.getGenerateKey(shardingRule, parameters, (InsertStatement) sqlStatement) : Optional.absent(); SQLRouteResult result = new SQLRouteResult(sqlStatement, generatedKey.orNull()); @@ -109,7 +109,7 @@ public final class ParsingSQLRouter implements ShardingRouter { } RoutingResult routingResult = RoutingEngineFactory.newInstance(shardingRule, shardingMetaData.getDataSource(), sqlStatement, optimizeResult).route(); if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getLimit() && !routingResult.isSingleRouting()) { - result.setLimit(getProcessedLimit(parameters, (SelectStatement) sqlStatement)); + result.setLimit(createLimit((SelectStatement) sqlStatement, parameters)); } if (needMerge) { Preconditions.checkState(1 == routingResult.getRoutingUnits().size(), "Must have one sharding with subquery."); @@ -189,10 +189,9 @@ public final class ParsingSQLRouter implements ShardingRouter { } } - private Limit getProcessedLimit(final List parameters, final SelectStatement selectStatement) { - boolean isNeedFetchAll = (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) && !selectStatement.isSameGroupByAndOrderByItems(); + private Limit createLimit(final SelectStatement selectStatement, final List parameters) { Limit result = createLimit(selectStatement.getLimit()); - result.processParameters(parameters, isNeedFetchAll, databaseType.name()); + result.fillParameters(parameters); return result; } diff --git a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ShardingRouter.java b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ShardingRouter.java index 96b5c6556d9fc3d839630c2baed131f356922769..9114891ec2a2d8ec3b45e106e5f94e71f6d1e320 100644 --- a/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ShardingRouter.java +++ b/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/sharding/ShardingRouter.java @@ -41,10 +41,9 @@ public interface ShardingRouter { /** * Route SQL. * - * @param logicSQL logic SQL * @param sqlStatement SQL statement * @param parameters parameters * @return parse result */ - SQLRouteResult route(String logicSQL, List parameters, SQLStatement sqlStatement); + SQLRouteResult route(SQLStatement sqlStatement, List parameters); } diff --git a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/core/route/router/DatabaseHintSQLRouterTest.java b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/core/route/router/DatabaseHintSQLRouterTest.java index 2cf29dfe0eb27e00c78b792180fa00b9b75ea3ce..470aab1a20450c32b36cc39acacd344f53d45280 100644 --- a/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/core/route/router/DatabaseHintSQLRouterTest.java +++ b/sharding-core/sharding-core-route/src/test/java/org/apache/shardingsphere/core/route/router/DatabaseHintSQLRouterTest.java @@ -66,6 +66,8 @@ public final class DatabaseHintSQLRouterTest { @Test public void assertRoute() { hintManager.addDatabaseShardingValue("", 1); - assertNotNull(databaseHintSQLRouter.route("select t from tbl t", Collections.emptyList(), new DQLStatement())); + DQLStatement dqlStatement = new DQLStatement(); + dqlStatement.setLogicSQL("select t from tbl t"); + assertNotNull(databaseHintSQLRouter.route(dqlStatement, Collections.emptyList())); } } diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java index 44387bd665acc8ed71a7c784fb8cdbbefb7d6ff7..ee275261e5cdf11b466a766989336008416d9eba 100644 --- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java +++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java @@ -23,7 +23,9 @@ import org.apache.shardingsphere.core.optimize.OptimizeEngineFactory; import org.apache.shardingsphere.core.optimize.result.OptimizeResult; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.rewriter.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.core.route.SQLUnit; import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractShardingPreparedStatementAdapter; import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.EncryptConnection; @@ -35,6 +37,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; /** @@ -149,7 +152,8 @@ public final class EncryptPreparedStatement extends AbstractShardingPreparedStat SQLStatement sqlStatement = connection.getParseEngine().parse(sql, true); SQLRewriteEngine encryptSQLRewriteEngine = new SQLRewriteEngine(connection.getEncryptRule(), sqlStatement, getParameters()); OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(connection.getEncryptRule(), sqlStatement, getParameters()).optimize(); - encryptSQLRewriteEngine.init(new EncryptSQLRewriter(connection.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult)); + encryptSQLRewriteEngine.init(Collections.emptyList(), + Collections.singletonList(new EncryptSQLRewriter(connection.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult))); return encryptSQLRewriteEngine.generateSQL(); } diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptStatement.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptStatement.java index 121786e7b5c4baf742750a215491e601aabec360..9192ae61d6b20ea93fbe1ba9772c8800f01d3dc0 100644 --- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptStatement.java +++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptStatement.java @@ -22,7 +22,9 @@ import org.apache.shardingsphere.core.optimize.OptimizeEngineFactory; import org.apache.shardingsphere.core.optimize.result.OptimizeResult; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.rewriter.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.EncryptConnection; import org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset.EncryptResultSet; import org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationStatement; @@ -81,7 +83,8 @@ public final class EncryptStatement extends AbstractUnsupportedOperationStatemen SQLStatement sqlStatement = connection.getParseEngine().parse(sql, false); SQLRewriteEngine encryptSQLRewriteEngine = new SQLRewriteEngine(connection.getEncryptRule(), sqlStatement, Collections.emptyList()); OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(connection.getEncryptRule(), sqlStatement, Collections.emptyList()).optimize(); - encryptSQLRewriteEngine.init(new EncryptSQLRewriter(connection.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult)); + encryptSQLRewriteEngine.init(Collections.emptyList(), + Collections.singletonList(new EncryptSQLRewriter(connection.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult))); return encryptSQLRewriteEngine.generateSQL().getSql(); } diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java index 8b19e28be9f8872c6d034b81bd430dff54bb4efa..6497a55c1239e8e60027acc6dc9dce2b29daf8a7 100644 --- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java @@ -25,7 +25,9 @@ import org.apache.shardingsphere.core.optimize.OptimizeEngineFactory; import org.apache.shardingsphere.core.optimize.result.OptimizeResult; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.rewriter.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.core.route.RouteUnit; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.SQLUnit; @@ -40,6 +42,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; +import java.util.Collections; import java.util.List; /** @@ -77,7 +80,7 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp private SQLRouteResult doMasterSlaveRoute(final String sql) { SQLStatement sqlStatement = ((MasterSlaveSchema) logicSchema).getParseEngine().parse(sql, true); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(sqlStatement); - sqlRewriteEngine.init(); + sqlRewriteEngine.init(Collections.emptyList(), Collections.emptyList()); String rewriteSQL = sqlRewriteEngine.generateSQL().getSql(); SQLRouteResult result = new SQLRouteResult(sqlStatement); for (String each : new MasterSlaveRouter(((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), ((MasterSlaveSchema) logicSchema).getParseEngine(), @@ -92,7 +95,8 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp SQLStatement sqlStatement = encryptSchema.getEncryptSQLParseEntry().parse(sql, true); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(encryptSchema.getEncryptRule(), sqlStatement, parameters); OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(encryptSchema.getEncryptRule(), sqlStatement, parameters).optimize(); - sqlRewriteEngine.init(new EncryptSQLRewriter(encryptSchema.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult)); + sqlRewriteEngine.init(Collections.emptyList(), + Collections.singletonList(new EncryptSQLRewriter(encryptSchema.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult))); SQLRouteResult result = new SQLRouteResult(sqlStatement); result.getRouteUnits().add(new RouteUnit(logicSchema.getDataSources().keySet().iterator().next(), new SQLUnit(sqlRewriteEngine.generateSQL().getSql(), parameters))); return result; diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java index d6cd5bbbd3832893d19edf34692a3610b73507c5..8c978dd7eb02f35434c9eaf43c15f88b8bd6f26f 100644 --- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java +++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java @@ -25,7 +25,9 @@ import org.apache.shardingsphere.core.optimize.OptimizeEngineFactory; import org.apache.shardingsphere.core.optimize.result.OptimizeResult; import org.apache.shardingsphere.core.parse.sql.statement.SQLStatement; import org.apache.shardingsphere.core.rewrite.SQLRewriteEngine; -import org.apache.shardingsphere.core.rewrite.rewriter.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.parameter.ParameterRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.EncryptSQLRewriter; +import org.apache.shardingsphere.core.rewrite.rewriter.sql.SQLRewriter; import org.apache.shardingsphere.core.route.RouteUnit; import org.apache.shardingsphere.core.route.SQLRouteResult; import org.apache.shardingsphere.core.route.SQLUnit; @@ -78,7 +80,7 @@ public final class StatementExecutorWrapper implements JDBCExecutorWrapper { private SQLRouteResult doMasterSlaveRoute(final String sql) { SQLStatement sqlStatement = ((MasterSlaveSchema) logicSchema).getParseEngine().parse(sql, false); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(sqlStatement); - sqlRewriteEngine.init(); + sqlRewriteEngine.init(Collections.emptyList(), Collections.emptyList()); String rewriteSQL = sqlRewriteEngine.generateSQL().getSql(); SQLRouteResult result = new SQLRouteResult(sqlStatement); for (String each : new MasterSlaveRouter(((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), ((MasterSlaveSchema) logicSchema).getParseEngine(), @@ -93,7 +95,8 @@ public final class StatementExecutorWrapper implements JDBCExecutorWrapper { SQLStatement sqlStatement = encryptSchema.getEncryptSQLParseEntry().parse(sql, false); SQLRewriteEngine sqlRewriteEngine = new SQLRewriteEngine(encryptSchema.getEncryptRule(), sqlStatement, Collections.emptyList()); OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(encryptSchema.getEncryptRule(), sqlStatement, new LinkedList<>()).optimize(); - sqlRewriteEngine.init(new EncryptSQLRewriter(encryptSchema.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult)); + sqlRewriteEngine.init(Collections.emptyList(), + Collections.singletonList(new EncryptSQLRewriter(encryptSchema.getEncryptRule().getEncryptorEngine(), sqlStatement, optimizeResult))); SQLRouteResult result = new SQLRouteResult(sqlStatement); result.getRouteUnits().add(new RouteUnit(logicSchema.getDataSources().keySet().iterator().next(), new SQLUnit(sqlRewriteEngine.generateSQL().getSql(), Collections.emptyList()))); return result;