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

duanzhengqiang 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 5f9093eb72f Optimize JDBC SQL hint. (#22901)
5f9093eb72f is described below

commit 5f9093eb72fd2aa115ba2d3e42272cdfad2eee20
Author: Zonglei Dong <[email protected]>
AuthorDate: Sat Dec 17 07:38:20 2022 +0800

    Optimize JDBC SQL hint. (#22901)
    
    * Optimize sql hint.
    
    * fixes variable name.
    
    * add SqlCommentParseEnabled condition for JDBC SQL hint parser.
---
 .../jdbc/core/statement/ShardingSpherePreparedStatement.java | 12 ++++++++----
 .../driver/jdbc/core/statement/ShardingSphereStatement.java  |  8 ++++++--
 2 files changed, 14 insertions(+), 6 deletions(-)

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 70b25ed07ae..ce208118d06 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
@@ -68,6 +68,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriv
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.raw.RawExecutionPrepareEngine;
 import org.apache.shardingsphere.infra.hint.HintManager;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.hint.SQLHintUtils;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
@@ -191,13 +193,13 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         this.connection = connection;
         metaDataContexts = 
connection.getContextManager().getMetaDataContexts();
         eventBusContext = 
connection.getContextManager().getInstanceContext().getEventBusContext();
-        this.sql = sql;
+        SQLParserRule sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+        this.sql = sqlParserRule.isSqlCommentParseEnabled() ? sql : 
SQLHintUtils.removeHint(sql);
         statements = new ArrayList<>();
         parameterSets = new ArrayList<>();
-        SQLParserRule sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(
                 
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType()));
-        sqlStatement = sqlParserEngine.parse(sql, true);
+        sqlStatement = sqlParserEngine.parse(this.sql, true);
         sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData(), 
sqlStatement, connection.getDatabaseName());
         parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
         statementOption = returnGeneratedKeys ? new StatementOption(true, 
columns) : new StatementOption(resultSetType, resultSetConcurrency, 
resultSetHoldability);
@@ -562,7 +564,9 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         if (sqlStatementContext instanceof ParameterAware) {
             ((ParameterAware) sqlStatementContext).setUpParameters(params);
         }
-        return new QueryContext(sqlStatementContext, sql, params);
+        SQLParserRule sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+        HintValueContext hintValueContext = 
sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() : 
SQLHintUtils.extractHint(sql);
+        return new QueryContext(sqlStatementContext, sql, params, 
hintValueContext);
     }
     
     private MergedResult mergeQuery(final List<QueryResult> queryResults) 
throws SQLException {
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 2d80e864700..f1a57aaa6db 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
@@ -65,6 +65,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.raw.RawExecutionPrepareEngine;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.hint.SQLHintUtils;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
@@ -503,12 +505,14 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         statements.clear();
     }
     
-    private QueryContext createQueryContext(final String sql) {
+    private QueryContext createQueryContext(final String originSQL) {
         SQLParserRule sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+        String sql = sqlParserRule.isSqlCommentParseEnabled() ? originSQL : 
SQLHintUtils.removeHint(originSQL);
         SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(
                 
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType())).parse(sql,
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData(), 
sqlStatement, connection.getDatabaseName());
-        return new QueryContext(sqlStatementContext, sql, 
Collections.emptyList());
+        HintValueContext hintValueContext = 
sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() : 
SQLHintUtils.extractHint(originSQL);
+        return new QueryContext(sqlStatementContext, sql, 
Collections.emptyList(), hintValueContext);
     }
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) throws SQLException {

Reply via email to