You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/04/13 03:55:55 UTC
[shardingsphere] branch master updated: Add useCache in QueryContext for sql federation parse (#25150)
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 <du...@apache.org>
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);
}