This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 be08bcea29d fix e2e exception caused by sql binder when sql statement
sql hint extract by sql util (#28431)
be08bcea29d is described below
commit be08bcea29d28b21ffc033acc3b7a07f7791a254
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Sep 14 09:42:31 2023 +0800
fix e2e exception caused by sql binder when sql statement sql hint extract
by sql util (#28431)
* fix e2e exception caused by sql binder when sql statement sql hint
extract by sql util
* fix unit test
---
.../shardingsphere/infra/binder/engine/SQLBindEngine.java | 12 ++++++++++--
.../jdbc/core/statement/ShardingSpherePreparedStatement.java | 2 +-
.../driver/jdbc/core/statement/ShardingSphereStatement.java | 6 +++---
.../executor/enumerable/EnumerableScanExecutor.java | 7 ++++---
.../proxy/backend/handler/ProxyBackendHandlerFactory.java | 10 +++++-----
.../backend/handler/distsql/rul/sql/PreviewExecutor.java | 2 +-
.../query/binary/prepare/MySQLComStmtPrepareExecutor.java | 2 +-
.../binary/prepare/MySQLComStmtPrepareExecutorTest.java | 4 ++++
.../query/extended/PostgreSQLBatchedStatementsExecutor.java | 8 ++++----
.../extended/describe/PostgreSQLComDescribeExecutor.java | 4 ++--
.../query/extended/parse/PostgreSQLComParseExecutor.java | 4 ++--
.../query/extended/parse/PostgreSQLComParseExecutorTest.java | 5 +++++
12 files changed, 42 insertions(+), 24 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
index ffb09f1a780..a42e3a4639b 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.binder.engine;
+import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory;
import
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementBinder;
@@ -44,15 +45,19 @@ import java.util.List;
/**
* SQL bind engine.
*/
+@RequiredArgsConstructor
public final class SQLBindEngine {
private final ShardingSphereMetaData metaData;
private final String defaultDatabaseName;
+ private final HintValueContext hintValueContext;
+
public SQLBindEngine(final ShardingSphereMetaData metaData, final String
defaultDatabaseName) {
this.metaData = metaData;
this.defaultDatabaseName = defaultDatabaseName;
+ this.hintValueContext = new HintValueContext();
}
/**
@@ -68,7 +73,7 @@ public final class SQLBindEngine {
}
private SQLStatement bind(final SQLStatement statement, final
ShardingSphereMetaData metaData, final String defaultDatabaseName) {
- if (containsDataSourceNameSQLHint(statement)) {
+ if (containsDataSourceNameSQLHint(hintValueContext, statement)) {
return statement;
}
if (statement instanceof DMLStatement) {
@@ -80,7 +85,10 @@ public final class SQLBindEngine {
return statement;
}
- private boolean containsDataSourceNameSQLHint(final SQLStatement
sqlStatement) {
+ private boolean containsDataSourceNameSQLHint(final HintValueContext
hintValueContext, final SQLStatement sqlStatement) {
+ if (hintValueContext.findHintDataSourceName().isPresent()) {
+ return true;
+ }
if (sqlStatement instanceof AbstractSQLStatement &&
!((AbstractSQLStatement) sqlStatement).getCommentSegments().isEmpty()) {
return SQLHintUtils.extractHint(((AbstractSQLStatement)
sqlStatement).getCommentSegments().iterator().next().getText()).flatMap(HintValueContext::findHintDataSourceName).isPresent();
}
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 8e691823da2..c2bba637901 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -199,7 +199,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
parameterSets = new ArrayList<>();
SQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(getDatabaseType(connection));
sqlStatement = sqlParserEngine.parse(this.sql, true);
- sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(),
connection.getDatabaseName()).bind(sqlStatement, Collections.emptyList());
+ sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(), connection.getDatabaseName(),
hintValueContext).bind(sqlStatement, Collections.emptyList());
databaseName =
sqlStatementContext.getTablesContext().getDatabaseName().orElse(connection.getDatabaseName());
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabase(databaseName);
parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 69189f1b6ea..fe78fd1d843 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.driver.jdbc.core.statement;
import com.google.common.base.Strings;
import lombok.AccessLevel;
import lombok.Getter;
-import
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
import org.apache.shardingsphere.driver.executor.DriverExecutor;
import org.apache.shardingsphere.driver.executor.batch.BatchStatementExecutor;
import org.apache.shardingsphere.driver.executor.callback.ExecuteCallback;
@@ -31,15 +30,16 @@ import
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConne
import
org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultSet;
import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
import
org.apache.shardingsphere.driver.jdbc.exception.syntax.EmptySQLException;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
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.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.connection.kernel.KernelProcessor;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
+import
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
import org.apache.shardingsphere.infra.executor.audit.SQLAuditEngine;
import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
import
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
@@ -486,8 +486,8 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
SQLParserRule sqlParserRule =
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
String sql = sqlParserRule.isSqlCommentParseEnabled() ? originSQL :
SQLHintUtils.removeHint(originSQL);
SQLStatement sqlStatement =
sqlParserRule.getSQLParserEngine(getDatabaseType()).parse(sql, false);
- SQLStatementContext sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(), databaseName).bind(sqlStatement,
Collections.emptyList());
HintValueContext hintValueContext =
sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() :
SQLHintUtils.extractHint(originSQL).orElseGet(HintValueContext::new);
+ SQLStatementContext sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(), databaseName,
hintValueContext).bind(sqlStatement, Collections.emptyList());
return new QueryContext(sqlStatementContext, sql,
Collections.emptyList(), hintValueContext);
}
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
index c6d74f29199..6eb80eff97d 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
@@ -29,6 +29,7 @@ import
org.apache.shardingsphere.infra.connection.kernel.KernelProcessor;
import
org.apache.shardingsphere.infra.database.core.metadata.database.system.SystemDatabase;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
+import
org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
import
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
import
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupReportContext;
@@ -58,7 +59,6 @@ import
org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import org.apache.shardingsphere.infra.session.query.QueryContext;
-import
org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sqlfederation.compiler.context.OptimizerContext;
import
org.apache.shardingsphere.sqlfederation.executor.SQLFederationExecutorContext;
@@ -283,8 +283,9 @@ public final class EnumerableScanExecutor {
optimizerContext.getSqlParserRule().getSqlStatementCache(),
optimizerContext.getSqlParserRule().getParseTreeCache(),
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql,
useCache);
List<Object> params = getParameters(sqlString.getParamIndexes());
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData,
executorContext.getDatabaseName()).bind(sqlStatement, params);
- return new QueryContext(sqlStatementContext, sql, params, new
HintValueContext(), useCache);
+ HintValueContext hintValueContext = new HintValueContext();
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData,
executorContext.getDatabaseName(), hintValueContext).bind(sqlStatement, params);
+ return new QueryContext(sqlStatementContext, sql, params,
hintValueContext, useCache);
}
private List<Object> getParameters(final int[] paramIndexes) {
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index 022b6c31b44..43d3d621120 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -26,19 +26,19 @@ import
org.apache.shardingsphere.distsql.parser.statement.DistSQLStatement;
import
org.apache.shardingsphere.distsql.parser.statement.ral.QueryableRALStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
import org.apache.shardingsphere.distsql.parser.statement.rul.RULStatement;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import
org.apache.shardingsphere.infra.exception.core.external.sql.type.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.executor.audit.SQLAuditEngine;
import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.session.query.QueryContext;
-import org.apache.shardingsphere.infra.state.cluster.ClusterState;
-import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import
org.apache.shardingsphere.infra.exception.core.external.sql.type.generic.UnsupportedSQLOperationException;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.state.cluster.ClusterState;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext;
@@ -110,7 +110,7 @@ public final class ProxyBackendHandlerFactory {
return new SkipBackendHandler(sqlStatement);
}
SQLStatementContext sqlStatementContext = sqlStatement instanceof
DistSQLStatement ? new DistSQLStatementContext((DistSQLStatement) sqlStatement)
- : new
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
connectionSession.getDefaultDatabaseName()).bind(sqlStatement,
+ : new
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
connectionSession.getDefaultDatabaseName(),
hintValueContext).bind(sqlStatement,
Collections.emptyList());
QueryContext queryContext = new QueryContext(sqlStatementContext, sql,
Collections.emptyList(), hintValueContext);
connectionSession.setQueryContext(queryContext);
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
index 7c6db81c6f5..9d41a7af701 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
@@ -95,8 +95,8 @@ public final class PreviewExecutor implements
ConnectionSessionRequiredRULExecut
String sql = sqlParserRule.isSqlCommentParseEnabled() ?
sqlStatement.getSql() : SQLHintUtils.removeHint(sqlStatement.getSql());
DatabaseType protocolType =
metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType();
SQLStatement previewedStatement =
sqlParserRule.getSQLParserEngine(protocolType.getTrunkDatabaseType().orElse(protocolType)).parse(sql,
false);
- SQLStatementContext sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(),
databaseName).bind(previewedStatement, Collections.emptyList());
HintValueContext hintValueContext =
sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() :
SQLHintUtils.extractHint(sqlStatement.getSql()).orElseGet(HintValueContext::new);
+ SQLStatementContext sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(), databaseName,
hintValueContext).bind(previewedStatement, Collections.emptyList());
QueryContext queryContext = new QueryContext(sqlStatementContext, sql,
Collections.emptyList(), hintValueContext);
connectionSession.setQueryContext(queryContext);
if (sqlStatementContext instanceof CursorAvailable &&
sqlStatementContext instanceof CursorDefinitionAware) {
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index 4184e3ad204..70ff9f74e08 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -81,7 +81,7 @@ public final class MySQLComStmtPrepareExecutor implements
CommandExecutor {
throw new UnsupportedPreparedStatementException();
}
SQLStatementContext sqlStatementContext = new
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
- connectionSession.getDefaultDatabaseName()).bind(sqlStatement,
Collections.emptyList());
+ connectionSession.getDefaultDatabaseName(),
packet.getHintValueContext()).bind(sqlStatement, Collections.emptyList());
int statementId =
MySQLStatementIdGenerator.getInstance().nextStatementId(connectionSession.getConnectionId());
MySQLServerPreparedStatement serverPreparedStatement = new
MySQLServerPreparedStatement(packet.getSQL(), sqlStatementContext,
packet.getHintValueContext(), new CopyOnWriteArrayList<>());
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
serverPreparedStatement);
diff --git
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
index 945165e6fd2..72d6ca2f4c6 100644
---
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
+++
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
import
org.apache.shardingsphere.infra.binder.context.statement.dml.UpdateStatementContext;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.exception.mysql.exception.UnsupportedPreparedStatementException;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -106,6 +107,7 @@ class MySQLComStmtPrepareExecutorTest {
void assertPrepareSelectStatement() {
String sql = "select name from foo_db.user where id = ?";
when(packet.getSQL()).thenReturn(sql);
+ when(packet.getHintValueContext()).thenReturn(new HintValueContext());
when(connectionSession.getConnectionId()).thenReturn(1);
MySQLStatementIdGenerator.getInstance().registerConnection(1);
ContextManager contextManager = mockContextManager();
@@ -128,6 +130,7 @@ class MySQLComStmtPrepareExecutorTest {
void assertPrepareInsertStatement() {
String sql = "insert into user (id, name, age) values (1, ?, ?), (?,
'bar', ?)";
when(packet.getSQL()).thenReturn(sql);
+ when(packet.getHintValueContext()).thenReturn(new HintValueContext());
int connectionId = 2;
when(connectionSession.getConnectionId()).thenReturn(connectionId);
when(connectionSession.getDefaultDatabaseName()).thenReturn("foo_db");
@@ -166,6 +169,7 @@ class MySQLComStmtPrepareExecutorTest {
void assertPrepareUpdateStatement() {
String sql = "update user set name = ?, age = ? where id = ?";
when(packet.getSQL()).thenReturn(sql);
+ when(packet.getHintValueContext()).thenReturn(new HintValueContext());
when(connectionSession.getConnectionId()).thenReturn(1);
when(connectionSession.getDefaultDatabaseName()).thenReturn("foo_db");
MySQLStatementIdGenerator.getInstance().registerConnection(1);
diff --git
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index e771a94df73..bff136ac995 100644
---
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -19,8 +19,8 @@ package
org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extend
import
org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.bind.PostgreSQLTypeUnspecifiedSQLParameter;
import org.apache.shardingsphere.infra.binder.context.aware.ParameterAware;
-import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.connection.kernel.KernelProcessor;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
@@ -96,7 +96,7 @@ public final class PostgreSQLBatchedStatementsExecutor {
ExecutionContext executionContext = null;
if (parameterSetsIterator.hasNext()) {
List<Object> firstGroupOfParam = parameterSetsIterator.next();
- sqlStatementContext = createSQLStatementContext(firstGroupOfParam);
+ sqlStatementContext = createSQLStatementContext(firstGroupOfParam,
preparedStatement.getHintValueContext());
executionContext =
createExecutionContext(createQueryContext(sqlStatementContext,
firstGroupOfParam, preparedStatement.getHintValueContext()));
for (ExecutionUnit each : executionContext.getExecutionUnits()) {
executionUnitParams.computeIfAbsent(each, unused -> new
LinkedList<>()).add(each.getSqlUnit().getParameters());
@@ -106,8 +106,8 @@ public final class PostgreSQLBatchedStatementsExecutor {
prepareForRestOfParametersSet(parameterSetsIterator,
sqlStatementContext, preparedStatement.getHintValueContext());
}
- private SQLStatementContext createSQLStatementContext(final List<Object>
params) {
- return new SQLBindEngine(metaDataContexts.getMetaData(),
connectionSession.getDatabaseName()).bind(preparedStatement.getSqlStatementContext().getSqlStatement(),
params);
+ private SQLStatementContext createSQLStatementContext(final List<Object>
params, final HintValueContext hintValueContext) {
+ return new SQLBindEngine(metaDataContexts.getMetaData(),
connectionSession.getDatabaseName(),
hintValueContext).bind(preparedStatement.getSqlStatementContext().getSqlStatement(),
params);
}
private void prepareForRestOfParametersSet(final Iterator<List<Object>>
paramSetsIterator, final SQLStatementContext sqlStatementContext, final
HintValueContext hintValueContext) {
diff --git
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
index 877dbb59b7b..c847dfec699 100644
---
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
+++
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
@@ -238,8 +238,8 @@ public final class PostgreSQLComDescribeExecutor implements
CommandExecutor {
private void tryDescribePreparedStatementByJDBC(final
PostgreSQLServerPreparedStatement logicPreparedStatement) throws SQLException {
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
String databaseName = connectionSession.getDatabaseName();
- SQLStatementContext sqlStatementContext =
- new SQLBindEngine(metaDataContexts.getMetaData(),
databaseName).bind(logicPreparedStatement.getSqlStatementContext().getSqlStatement(),
Collections.emptyList());
+ SQLStatementContext sqlStatementContext = new
SQLBindEngine(metaDataContexts.getMetaData(), databaseName,
logicPreparedStatement.getHintValueContext())
+
.bind(logicPreparedStatement.getSqlStatementContext().getSqlStatement(),
Collections.emptyList());
QueryContext queryContext = new QueryContext(sqlStatementContext,
logicPreparedStatement.getSql(), Collections.emptyList(),
logicPreparedStatement.getHintValueContext());
ShardingSphereDatabase database =
ProxyContext.getInstance().getDatabase(databaseName);
ExecutionContext executionContext = new
KernelProcessor().generateExecutionContext(
diff --git
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
index 82a912c6183..e580410f307 100644
---
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
+++
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
@@ -78,8 +78,8 @@ public final class PostgreSQLComParseExecutor implements
CommandExecutor {
}
List<PostgreSQLColumnType> paddedColumnTypes =
paddingColumnTypes(sqlStatement.getParameterCount(),
packet.readParameterTypes());
SQLStatementContext sqlStatementContext = sqlStatement instanceof
DistSQLStatement ? new DistSQLStatementContext((DistSQLStatement) sqlStatement)
- : new
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
connectionSession.getDefaultDatabaseName()).bind(sqlStatement,
- Collections.emptyList());
+ : new
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
connectionSession.getDefaultDatabaseName(), packet.getHintValueContext())
+ .bind(sqlStatement, Collections.emptyList());
PostgreSQLServerPreparedStatement serverPreparedStatement = new
PostgreSQLServerPreparedStatement(sql, sqlStatementContext,
packet.getHintValueContext(), paddedColumnTypes,
actualParameterMarkerIndexes);
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(packet.getStatementId(),
serverPreparedStatement);
diff --git
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
index c93955d7c3f..53d5084982f 100644
---
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
+++
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowDist
import
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
import
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -92,6 +93,7 @@ class PostgreSQLComParseExecutorTest {
final String statementId = "S_1";
when(parsePacket.getSQL()).thenReturn(expectedSQL);
when(parsePacket.getStatementId()).thenReturn(statementId);
+ when(parsePacket.getHintValueContext()).thenReturn(new
HintValueContext());
ContextManager contextManager = mockContextManager();
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
Collection<DatabasePacket> actualPackets = executor.execute();
@@ -112,6 +114,7 @@ class PostgreSQLComParseExecutorTest {
when(parsePacket.getSQL()).thenReturn(rawSQL);
when(parsePacket.getStatementId()).thenReturn(statementId);
when(parsePacket.readParameterTypes()).thenReturn(Collections.singletonList(PostgreSQLColumnType.INT4));
+ when(parsePacket.getHintValueContext()).thenReturn(new
HintValueContext());
when(connectionSession.getDefaultDatabaseName()).thenReturn("foo_db");
Plugins.getMemberAccessor().set(PostgreSQLComParseExecutor.class.getDeclaredField("connectionSession"),
executor, connectionSession);
ContextManager contextManager = mockContextManager();
@@ -132,6 +135,7 @@ class PostgreSQLComParseExecutorTest {
final String expectedSQL = "update t_test set name=? where id=?";
final String statementId = "S_2";
when(parsePacket.getSQL()).thenReturn(rawSQL);
+ when(parsePacket.getHintValueContext()).thenReturn(new
HintValueContext());
when(parsePacket.getStatementId()).thenReturn(statementId);
when(parsePacket.readParameterTypes()).thenReturn(Arrays.asList(PostgreSQLColumnType.JSON,
PostgreSQLColumnType.INT4));
Plugins.getMemberAccessor().set(PostgreSQLComParseExecutor.class.getDeclaredField("connectionSession"),
executor, connectionSession);
@@ -151,6 +155,7 @@ class PostgreSQLComParseExecutorTest {
final String statementId = "S_2";
when(parsePacket.getSQL()).thenReturn(rawSQL);
when(parsePacket.getStatementId()).thenReturn(statementId);
+ when(parsePacket.getHintValueContext()).thenReturn(new
HintValueContext());
Plugins.getMemberAccessor().set(PostgreSQLComParseExecutor.class.getDeclaredField("connectionSession"),
executor, connectionSession);
ContextManager contextManager = mockContextManager();
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);