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);

Reply via email to