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 {