This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 9286b69f3bc Add useCache in QueryContext for sql federation parse
(#25150)
9286b69f3bc is described below
commit 9286b69f3bcd58474061a6c5db9862ff6039918e
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Apr 13 11:55:47 2023 +0800
Add useCache in QueryContext for sql federation parse (#25150)
---
.../apache/shardingsphere/infra/binder/QueryContext.java | 7 +++++++
.../core/statement/ShardingSpherePreparedStatement.java | 2 +-
.../sqlfederation/executor/FilterableTableScanExecutor.java | 9 +++++----
.../executor/TranslatableTableScanExecutor.java | 13 ++++++-------
.../query/binary/execute/MySQLComStmtExecuteExecutor.java | 3 ++-
.../frontend/postgresql/command/query/extended/Portal.java | 3 ++-
6 files changed, 23 insertions(+), 14 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/QueryContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/QueryContext.java
index ad7f74df4fe..d4965dcd834 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/QueryContext.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/QueryContext.java
@@ -43,16 +43,23 @@ public final class QueryContext {
private final HintValueContext hintValueContext;
+ private final boolean useCache;
+
public QueryContext(final SQLStatementContext<?> sqlStatementContext,
final String sql, final List<Object> params) {
this(sqlStatementContext, sql, params, new HintValueContext());
}
public QueryContext(final SQLStatementContext<?> sqlStatementContext,
final String sql, final List<Object> params, final HintValueContext
hintValueContext) {
+ this(sqlStatementContext, sql, params, hintValueContext, false);
+ }
+
+ public QueryContext(final SQLStatementContext<?> sqlStatementContext,
final String sql, final List<Object> params, final HintValueContext
hintValueContext, final boolean useCache) {
this.sqlStatementContext = sqlStatementContext;
this.sql = sql;
parameters = params;
databaseName = sqlStatementContext instanceof TableAvailable ?
((TableAvailable)
sqlStatementContext).getTablesContext().getDatabaseName().orElse(null) : null;
this.hintValueContext = hintValueContext;
+ this.useCache = useCache;
}
/**
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 ab92ccbcd69..15e4dd2f14b 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
@@ -599,7 +599,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
}
SQLParserRule sqlParserRule =
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
HintValueContext hintValueContext =
sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() :
SQLHintUtils.extractHint(sql);
- return new QueryContext(sqlStatementContext, sql, params,
hintValueContext);
+ return new QueryContext(sqlStatementContext, sql, params,
hintValueContext, true);
}
private MergedResult mergeQuery(final List<QueryResult> queryResults)
throws SQLException {
diff --git
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
index 57bada54494..7e9e4817a8c 100644
---
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
+++
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
@@ -57,6 +57,7 @@ import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.dr
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
import
org.apache.shardingsphere.infra.executor.sql.process.ExecuteProcessEngine;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.merge.MergeEngine;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -136,7 +137,7 @@ public final class FilterableTableScanExecutor implements
TableScanExecutor {
}
SqlString sqlString = createSQLString(table,
(FilterableScanNodeExecutorContext) scanContext,
SQLDialectFactory.getSQLDialect(databaseType));
SQLFederationExecutorContext federationContext =
executorContext.getFederationContext();
- QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType);
+ QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType,
federationContext.getQueryContext().isUseCache());
ShardingSphereDatabase database =
federationContext.getMetaData().getDatabase(databaseName);
// TODO need to get session context
ExecutionContext context = new
KernelProcessor().generateExecutionContext(queryContext, database,
globalRuleMetaData, executorContext.getProps(), new ConnectionContext());
@@ -274,14 +275,14 @@ public final class FilterableTableScanExecutor implements
TableScanExecutor {
return result;
}
- private QueryContext createQueryContext(final ShardingSphereMetaData
metaData, final SqlString sqlString, final DatabaseType databaseType) {
+ private QueryContext createQueryContext(final ShardingSphereMetaData
metaData, final SqlString sqlString, final DatabaseType databaseType, final
boolean useCache) {
String sql = sqlString.getSql().replace("\n", " ");
SQLStatement sqlStatement = new
SQLStatementParserEngine(databaseType.getType(),
optimizerContext.getSqlParserRule().getSqlStatementCache(),
optimizerContext.getSqlParserRule().getParseTreeCache(),
-
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql,
false);
+
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql,
useCache);
List<Object> params = getParameters(sqlString.getDynamicParameters());
SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(metaData, params, sqlStatement,
executorContext.getDatabaseName());
- return new QueryContext(sqlStatementContext, sql, params);
+ return new QueryContext(sqlStatementContext, sql, params, new
HintValueContext(), useCache);
}
private List<Object> getParameters(final List<Integer> paramIndexes) {
diff --git
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
index 5d603a3bd92..ee075ac60cd 100644
---
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
+++
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
@@ -61,6 +61,7 @@ import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.dr
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
import
org.apache.shardingsphere.infra.executor.sql.process.ExecuteProcessEngine;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.merge.MergeEngine;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -135,9 +136,8 @@ public final class TranslatableTableScanExecutor implements
TableScanExecutor {
return executeByScalarShardingSphereData(databaseName, schemaName,
table);
}
SqlString sqlString = createSQLString(table,
(TranslatableScanNodeExecutorContext) scanContext,
SQLDialectFactory.getSQLDialect(databaseType));
- // TODO replace sql parse with sql convert
SQLFederationExecutorContext federationContext =
executorContext.getFederationContext();
- QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType);
+ QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType,
federationContext.getQueryContext().isUseCache());
ShardingSphereDatabase database =
federationContext.getMetaData().getDatabase(databaseName);
ExecutionContext context = new
KernelProcessor().generateExecutionContext(queryContext, database,
globalRuleMetaData, executorContext.getProps(), new ConnectionContext());
if (federationContext.isPreview()) {
@@ -223,9 +223,8 @@ public final class TranslatableTableScanExecutor implements
TableScanExecutor {
return executeByShardingSphereData(databaseName, schemaName,
table);
}
SqlString sqlString = createSQLString(table,
(TranslatableScanNodeExecutorContext) scanContext,
SQLDialectFactory.getSQLDialect(databaseType));
- // TODO replace sql parse with sql convert
SQLFederationExecutorContext federationContext =
executorContext.getFederationContext();
- QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType);
+ QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType,
federationContext.getQueryContext().isUseCache());
ShardingSphereDatabase database =
federationContext.getMetaData().getDatabase(databaseName);
ExecutionContext context = new
KernelProcessor().generateExecutionContext(queryContext, database,
globalRuleMetaData, executorContext.getProps(), new ConnectionContext());
if (federationContext.isPreview()) {
@@ -393,14 +392,14 @@ public final class TranslatableTableScanExecutor
implements TableScanExecutor {
return result;
}
- private QueryContext createQueryContext(final ShardingSphereMetaData
metaData, final SqlString sqlString, final DatabaseType databaseType) {
+ private QueryContext createQueryContext(final ShardingSphereMetaData
metaData, final SqlString sqlString, final DatabaseType databaseType, final
boolean useCache) {
String sql = sqlString.getSql().replace("\n", " ");
SQLStatement sqlStatement = new
SQLStatementParserEngine(databaseType.getType(),
optimizerContext.getSqlParserRule().getSqlStatementCache(),
optimizerContext.getSqlParserRule().getParseTreeCache(),
-
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql,
false);
+
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql,
useCache);
List<Object> params = getParameters(sqlString.getDynamicParameters());
SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(metaData, params, sqlStatement,
executorContext.getDatabaseName());
- return new QueryContext(sqlStatementContext, sql, params);
+ return new QueryContext(sqlStatementContext, sql, params, new
HintValueContext(), useCache);
}
private List<Object> getParameters(final List<Integer> paramIndexes) {
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index 824a489c885..c47a98f66fc 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -32,6 +32,7 @@ import org.apache.shardingsphere.infra.binder.QueryContext;
import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
import
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
@@ -76,7 +77,7 @@ public final class MySQLComStmtExecuteExecutor implements
QueryCommandExecutor {
if (sqlStatementContext instanceof ParameterAware) {
((ParameterAware) sqlStatementContext).setUpParameters(params);
}
- QueryContext queryContext = new QueryContext(sqlStatementContext,
preparedStatement.getSql(), params);
+ QueryContext queryContext = new QueryContext(sqlStatementContext,
preparedStatement.getSql(), params, new HintValueContext(), true);
connectionSession.setQueryContext(queryContext);
proxyBackendHandler =
ProxyBackendHandlerFactory.newInstance(TypedSPILoader.getService(DatabaseType.class,
"MySQL"), queryContext, connectionSession, true);
ResponseHeader responseHeader = proxyBackendHandler.execute();
diff --git
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
index 0c4ac96902b..5b3e28f3c9f 100644
---
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
+++
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
@@ -35,6 +35,7 @@ import org.apache.shardingsphere.infra.binder.QueryContext;
import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.proxy.backend.connector.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
@@ -89,7 +90,7 @@ public final class Portal {
((ParameterAware) sqlStatementContext).setUpParameters(params);
}
DatabaseType protocolType =
ProxyContext.getInstance().getDatabase(databaseName).getProtocolType();
- QueryContext queryContext = new QueryContext(sqlStatementContext,
preparedStatement.getSql(), params);
+ QueryContext queryContext = new QueryContext(sqlStatementContext,
preparedStatement.getSql(), params, new HintValueContext(), true);
backendConnection.getConnectionSession().setQueryContext(queryContext);
proxyBackendHandler =
ProxyBackendHandlerFactory.newInstance(protocolType, queryContext,
backendConnection.getConnectionSession(), true);
}