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 2025/07/05 13:10:54 UTC
(shardingsphere) branch master updated: Revert "Add DatabaseType into SQLStatement (#35896)" (#35898)
This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 e047c6e789d Revert "Add DatabaseType into SQLStatement (#35896)" (#35898)
e047c6e789d is described below
commit e047c6e789dee08937064eedc8f1803c9e549d99
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Jul 5 21:10:49 2025 +0800
Revert "Add DatabaseType into SQLStatement (#35896)" (#35898)
This reverts commit 4a45ebe36ce4742a2ccb2f863240dbafbe0be320.
---
.../checker/ShardingRouteCacheableCheckerTest.java | 4 +-
.../standard/assertion/ShardingRouteAssert.java | 2 +-
.../binder/context/SQLStatementContextFactory.java | 18 +++++----
.../type/dal/ExplainStatementContext.java | 4 +-
.../infra/binder/engine/SQLBindEngine.java | 37 ++++++++----------
.../statement/SQLStatementContextFactoryTest.java | 45 +++++++++-------------
.../type/dal/ExplainStatementContextTest.java | 4 +-
.../statement/ShardingSpherePreparedStatement.java | 2 +-
.../core/statement/ShardingSphereStatement.java | 2 +-
.../metadata/generator/PipelineDDLDecorator.java | 21 +++++-----
.../implementor/EnumerableScanImplementor.java | 2 +-
.../sql/parser/api/SQLStatementVisitorEngine.java | 5 +--
.../statement/core/statement/SQLStatement.java | 5 ---
.../handler/ProxyBackendHandlerFactory.java | 2 +-
.../handler/distsql/rul/PreviewExecutor.java | 3 +-
.../handler/admin/MySQLAdminExecutorCreator.java | 16 ++++----
.../executor/MySQLSetVariableAdminExecutor.java | 2 +-
.../executor/UnicastResourceShowExecutor.java | 6 ++-
.../prepare/MySQLComStmtPrepareExecutor.java | 2 +-
.../fieldlist/MySQLComFieldListPacketExecutor.java | 2 +-
.../text/query/MySQLMultiStatementsHandler.java | 2 +-
.../bind/OpenGaussComBatchBindExecutorTest.java | 1 +
.../PostgreSQLBatchedStatementsExecutor.java | 4 +-
.../describe/PostgreSQLComDescribeExecutor.java | 2 +-
.../extended/parse/PostgreSQLComParseExecutor.java | 2 +-
.../PostgreSQLBatchedStatementsExecutorTest.java | 1 -
.../test/it/sql/binder/SQLBinderIT.java | 3 +-
.../test/it/rewrite/engine/SQLRewriterIT.java | 12 +++---
28 files changed, 102 insertions(+), 109 deletions(-)
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
index 2bd9948d445..9e13514a8f9 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
@@ -21,6 +21,7 @@ import org.apache.groovy.util.Maps;
import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
@@ -150,7 +151,8 @@ class ShardingRouteCacheableCheckerTest {
private QueryContext createQueryContext(final ShardingSphereDatabase database, final String sql, final List<Object> params) {
SQLStatementContext sqlStatementContext = new SQLBindEngine(
- new ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), mock()), DATABASE_NAME, new HintValueContext()).bind(parse(sql), params);
+ new ShardingSphereMetaData(Collections.singleton(database), mock(ResourceMetaData.class), mock(RuleMetaData.class), mock(ConfigurationProperties.class)),
+ DATABASE_NAME, new HintValueContext()).bind(databaseType, parse(sql), params);
return new QueryContext(sqlStatementContext, sql, params, new HintValueContext(), mockConnectionContext(), mock(ShardingSphereMetaData.class));
}
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
index a8ca6b21a18..2074274a67b 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
@@ -87,7 +87,7 @@ public final class ShardingRouteAssert {
RuleMetaData ruleMetaData = new RuleMetaData(Arrays.asList(shardingRule, broadcastRule, singleRule, timestampServiceRule));
ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", databaseType, mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), ruleMetaData, buildSchemas());
ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), mock());
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, "foo_db", new HintValueContext()).bind(sqlParserEngine.parse(sql, false), params);
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, "foo_db", new HintValueContext()).bind(databaseType, sqlParserEngine.parse(sql, false), params);
ConnectionContext connectionContext = new ConnectionContext(Collections::emptySet);
connectionContext.setCurrentDatabaseName("foo_db");
QueryContext queryContext = new QueryContext(sqlStatementContext, sql, params, new HintValueContext(), connectionContext, metaData);
diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
index 98bbc64117c..7b89596e7a0 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
@@ -64,30 +64,32 @@ public final class SQLStatementContextFactory {
* Create SQL statement context.
*
* @param metaData metadata
+ * @param databaseType database type
* @param sqlStatement SQL statement
* @param params SQL parameters
* @param currentDatabaseName current database name
* @return SQL statement context
*/
- public static SQLStatementContext newInstance(final ShardingSphereMetaData metaData, final SQLStatement sqlStatement, final List<Object> params, final String currentDatabaseName) {
+ public static SQLStatementContext newInstance(final ShardingSphereMetaData metaData,
+ final DatabaseType databaseType, final SQLStatement sqlStatement, final List<Object> params, final String currentDatabaseName) {
if (sqlStatement.getAttributes().findAttribute(TableSQLStatementAttribute.class).isPresent()
- && DatabaseTypedSPILoader.findService(DialectCommonSQLStatementContextWarpProvider.class, sqlStatement.getDatabaseType())
+ && DatabaseTypedSPILoader.findService(DialectCommonSQLStatementContextWarpProvider.class, databaseType)
.map(optional -> optional.getNeedToWarpSQLStatementTypes().contains(sqlStatement.getClass())).orElse(false)) {
- return new CommonSQLStatementContext(sqlStatement.getDatabaseType(), sqlStatement);
+ return new CommonSQLStatementContext(databaseType, sqlStatement);
}
if (sqlStatement instanceof DMLStatement) {
- return getDMLStatementContext(metaData, sqlStatement.getDatabaseType(), (DMLStatement) sqlStatement, params, currentDatabaseName);
+ return getDMLStatementContext(metaData, databaseType, (DMLStatement) sqlStatement, params, currentDatabaseName);
}
if (sqlStatement instanceof DDLStatement) {
- return getDDLStatementContext(metaData, sqlStatement.getDatabaseType(), (DDLStatement) sqlStatement, params, currentDatabaseName);
+ return getDDLStatementContext(metaData, databaseType, (DDLStatement) sqlStatement, params, currentDatabaseName);
}
if (sqlStatement instanceof DCLStatement) {
- return getDCLStatementContext(sqlStatement.getDatabaseType(), (DCLStatement) sqlStatement);
+ return getDCLStatementContext(databaseType, (DCLStatement) sqlStatement);
}
if (sqlStatement instanceof DALStatement) {
- return getDALStatementContext(metaData, sqlStatement.getDatabaseType(), (DALStatement) sqlStatement, params, currentDatabaseName);
+ return getDALStatementContext(metaData, databaseType, (DALStatement) sqlStatement, params, currentDatabaseName);
}
- return new CommonSQLStatementContext(sqlStatement.getDatabaseType(), sqlStatement);
+ return new CommonSQLStatementContext(databaseType, sqlStatement);
}
private static SQLStatementContext getDMLStatementContext(final ShardingSphereMetaData metaData, final DatabaseType databaseType,
diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
index c8349244e0c..0d7f98e0eb2 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
@@ -18,9 +18,9 @@
package org.apache.shardingsphere.infra.binder.context.statement.type.dal;
import lombok.Getter;
-import org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
@@ -48,6 +48,6 @@ public final class ExplainStatementContext implements SQLStatementContext {
this.databaseType = databaseType;
this.sqlStatement = sqlStatement;
tablesContext = new TablesContext(sqlStatement.getAttributes().findAttribute(TableSQLStatementAttribute.class).map(TableSQLStatementAttribute::getTables).orElse(Collections.emptyList()));
- explainableSQLStatementContext = SQLStatementContextFactory.newInstance(metaData, sqlStatement.getExplainableSQLStatement(), params, currentDatabaseName);
+ explainableSQLStatementContext = SQLStatementContextFactory.newInstance(metaData, databaseType, sqlStatement.getExplainableSQLStatement(), params, currentDatabaseName);
}
}
diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
index 51c45a2068d..2dc07641e84 100644
--- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
+++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.type.DALStatementBindEngine
import org.apache.shardingsphere.infra.binder.engine.type.DDLStatementBindEngine;
import org.apache.shardingsphere.infra.binder.engine.type.DMLStatementBindEngine;
import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.hint.HintManager;
import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -51,41 +52,35 @@ public final class SQLBindEngine {
/**
* Bind SQL statement.
*
+ * @param databaseType database type
* @param sqlStatement SQL statement
* @param params parameters
* @return SQL statement context
*/
- public SQLStatementContext bind(final SQLStatement sqlStatement, final List<Object> params) {
- SQLStatement boundSQLStatement = isNeedBind() ? bind(sqlStatement) : sqlStatement;
- return SQLStatementContextFactory.newInstance(metaData, boundSQLStatement, params, currentDatabaseName);
+ public SQLStatementContext bind(final DatabaseType databaseType, final SQLStatement sqlStatement, final List<Object> params) {
+ SQLStatement boundSQLStatement = isNeedBind() ? bind(databaseType, sqlStatement) : sqlStatement;
+ return SQLStatementContextFactory.newInstance(metaData, databaseType, boundSQLStatement, params, currentDatabaseName);
}
- private SQLStatement bind(final SQLStatement sqlStatement) {
- SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, sqlStatement.getDatabaseType(), sqlStatement);
- Optional<DialectSQLBindEngine> dialectSQLBindEngine = DatabaseTypedSPILoader.findService(DialectSQLBindEngine.class, sqlStatement.getDatabaseType());
+ private SQLStatement bind(final DatabaseType databaseType, final SQLStatement statement) {
+ SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, databaseType, statement);
+ Optional<DialectSQLBindEngine> dialectSQLBindEngine = DatabaseTypedSPILoader.findService(DialectSQLBindEngine.class, databaseType);
if (dialectSQLBindEngine.isPresent()) {
- Optional<SQLStatement> boundSQLStatement = dialectSQLBindEngine.get().bind(sqlStatement, binderContext);
+ Optional<SQLStatement> boundSQLStatement = dialectSQLBindEngine.get().bind(statement, binderContext);
if (boundSQLStatement.isPresent()) {
- boundSQLStatement.get().setDatabaseType(sqlStatement.getDatabaseType());
return boundSQLStatement.get();
}
}
- if (sqlStatement instanceof DMLStatement) {
- SQLStatement result = new DMLStatementBindEngine().bind((DMLStatement) sqlStatement, binderContext);
- result.setDatabaseType(sqlStatement.getDatabaseType());
- return result;
+ if (statement instanceof DMLStatement) {
+ return new DMLStatementBindEngine().bind((DMLStatement) statement, binderContext);
}
- if (sqlStatement instanceof DDLStatement) {
- SQLStatement result = new DDLStatementBindEngine().bind((DDLStatement) sqlStatement, binderContext);
- result.setDatabaseType(sqlStatement.getDatabaseType());
- return result;
+ if (statement instanceof DDLStatement) {
+ return new DDLStatementBindEngine().bind((DDLStatement) statement, binderContext);
}
- if (sqlStatement instanceof DALStatement) {
- SQLStatement result = new DALStatementBindEngine().bind((DALStatement) sqlStatement, binderContext);
- result.setDatabaseType(sqlStatement.getDatabaseType());
- return result;
+ if (statement instanceof DALStatement) {
+ return new DALStatementBindEngine().bind((DALStatement) statement, binderContext);
}
- return sqlStatement;
+ return statement;
}
private boolean isNeedBind() {
diff --git a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
index a545d1ac7cd..74412be991f 100644
--- a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
+++ b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
@@ -60,63 +60,54 @@ class SQLStatementContextFactoryTest {
@Test
void assertSQLStatementContextCreatedWhenSQLStatementInstanceOfSelectStatement() {
- SelectStatement sqlStatement = new SelectStatement();
- sqlStatement.setLimit(new LimitSegment(0, 10, null, null));
- sqlStatement.setProjections(new ProjectionsSegment(0, 0));
- sqlStatement.setDatabaseType(databaseType);
- SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
+ SelectStatement selectStatement = new SelectStatement();
+ selectStatement.setLimit(new LimitSegment(0, 10, null, null));
+ selectStatement.setProjections(projectionsSegment);
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, selectStatement, Collections.emptyList());
assertThat(sqlStatementContext, instanceOf(SelectStatementContext.class));
}
@Test
void assertSQLStatementContextCreatedWhenSQLStatementInstance() {
- InsertStatement sqlStatement = new InsertStatement();
- sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("tbl"))));
- sqlStatement.setDatabaseType(databaseType);
- SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ InsertStatement insertStatement = new InsertStatement();
+ insertStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("tbl"))));
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, insertStatement, Collections.emptyList());
assertThat(sqlStatementContext, instanceOf(InsertStatementContext.class));
}
@Test
void assertSQLStatementContextCreatedWhenSQLStatementNotInstanceOfSelectStatementAndInsertStatement() {
- AlterDatabaseStatement sqlStatement = mock(AlterDatabaseStatement.class);
- when(sqlStatement.getDatabaseType()).thenReturn(databaseType);
- when(sqlStatement.getAttributes()).thenReturn(new SQLStatementAttributes());
- SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ AlterDatabaseStatement alterDatabaseStatement = mock(AlterDatabaseStatement.class);
+ when(alterDatabaseStatement.getAttributes()).thenReturn(new SQLStatementAttributes());
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, alterDatabaseStatement, Collections.emptyList());
assertThat(sqlStatementContext, instanceOf(CommonSQLStatementContext.class));
}
@Test
void assertNewInstanceForCursorStatement() {
- SelectStatement sqlStatement = new SelectStatement();
- sqlStatement.setProjections(new ProjectionsSegment(0, 0));
- CursorStatement cursorStatement = new CursorStatement(null, sqlStatement);
- cursorStatement.setDatabaseType(databaseType);
- SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(cursorStatement, Collections.emptyList());
+ SelectStatement selectStatement = new SelectStatement();
+ selectStatement.setProjections(new ProjectionsSegment(0, 0));
+ CursorStatement cursorStatement = new CursorStatement(null, selectStatement);
+ SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, cursorStatement, Collections.emptyList());
assertThat(actual, instanceOf(CursorStatementContext.class));
}
@Test
void assertNewInstanceForCloseStatement() {
- CloseStatement sqlStatement = new CloseStatement(null, false);
- sqlStatement.setDatabaseType(databaseType);
- SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, new CloseStatement(null, false), Collections.emptyList());
assertThat(actual, instanceOf(CursorHeldSQLStatementContext.class));
}
@Test
void assertNewInstanceForMoveStatement() {
- MoveStatement sqlStatement = new MoveStatement(null, null);
- sqlStatement.setDatabaseType(databaseType);
- SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, new MoveStatement(null, null), Collections.emptyList());
assertThat(actual, instanceOf(CursorHeldSQLStatementContext.class));
}
@Test
void assertNewInstanceForFetchStatement() {
- FetchStatement sqlStatement = new FetchStatement(null, null);
- sqlStatement.setDatabaseType(databaseType);
- SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext actual = new SQLBindEngine(mockMetaData(), "foo_db", new HintValueContext()).bind(databaseType, new FetchStatement(null, null), Collections.emptyList());
assertThat(actual, instanceOf(CursorHeldSQLStatementContext.class));
}
diff --git a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContextTest.java b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContextTest.java
index 8e8174be922..81527e1dca2 100644
--- a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContextTest.java
+++ b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContextTest.java
@@ -17,8 +17,8 @@
package org.apache.shardingsphere.infra.binder.context.statement.type.dal;
-import org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -54,7 +54,7 @@ class ExplainStatementContextTest {
@BeforeEach
void setUp() {
- when(SQLStatementContextFactory.newInstance(metaData, explainableSQLStatement, Collections.emptyList(), "foo_db")).thenReturn(explainableSQLStatementContext);
+ when(SQLStatementContextFactory.newInstance(metaData, databaseType, explainableSQLStatement, Collections.emptyList(), "foo_db")).thenReturn(explainableSQLStatementContext);
}
@Test
diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index e942201feb3..20a110608bf 100644
--- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -140,7 +140,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
hintValueContext = SQLHintUtils.extractHint(originSQL);
DatabaseType databaseType = metaData.getDatabase(connection.getCurrentDatabaseName()).getProtocolType();
SQLStatement sqlStatement = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(databaseType).parse(sql, true);
- sqlStatementContext = new SQLBindEngine(metaData, connection.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList());
+ sqlStatementContext = new SQLBindEngine(metaData, connection.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
String usedDatabaseName = sqlStatementContext.getTablesContext().getDatabaseName().orElse(connection.getCurrentDatabaseName());
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabaseName(connection.getCurrentDatabaseName());
usedDatabase = metaData.getDatabase(usedDatabaseName);
diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 1586d769da1..974b9bf2243 100644
--- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -257,7 +257,7 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
String sql = SQLHintUtils.removeHint(originSQL);
DatabaseType databaseType = metaData.getDatabase(usedDatabaseName).getProtocolType();
SQLStatement sqlStatement = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(databaseType).parse(sql, false);
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, connection.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, connection.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
return new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext, connection.getDatabaseConnectionManager().getConnectionContext(), metaData);
}
diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
index f3d21a95dec..ee146c1148a 100644
--- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
+++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java
@@ -72,16 +72,16 @@ public final class PipelineDDLDecorator {
if (Strings.isNullOrEmpty(sql)) {
return Optional.empty();
}
- String result = decorateActualSQL(targetDatabaseName, targetTableName, parserEngine, sql.trim());
+ String result = decorateActualSQL(targetDatabaseName, targetTableName, parserEngine, databaseType, sql.trim());
// TODO remove it after set search_path is supported.
if ("openGauss".equals(databaseType.getType())) {
- return decorateOpenGauss(targetDatabaseName, schemaName, result, parserEngine);
+ return decorateOpenGauss(targetDatabaseName, schemaName, result, parserEngine, databaseType);
}
return Optional.of(result);
}
- private String decorateActualSQL(final String databaseName, final String targetTableName, final SQLParserEngine parserEngine, final String sql) {
- SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql);
+ private String decorateActualSQL(final String databaseName, final String targetTableName, final SQLParserEngine parserEngine, final DatabaseType databaseType, final String sql) {
+ SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, databaseType, sql);
Map<SQLSegment, String> replaceMap = new TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex));
if (sqlStatementContext.getSqlStatement() instanceof CreateTableStatement) {
appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext);
@@ -101,8 +101,8 @@ public final class PipelineDDLDecorator {
return doDecorateActualTable(replaceMap, sql);
}
- private SQLStatementContext parseSQL(final String currentDatabaseName, final SQLParserEngine parserEngine, final String sql) {
- return new SQLBindEngine(metaData, currentDatabaseName, new HintValueContext()).bind(parserEngine.parse(sql, true), Collections.emptyList());
+ private SQLStatementContext parseSQL(final String currentDatabaseName, final SQLParserEngine parserEngine, final DatabaseType databaseType, final String sql) {
+ return new SQLBindEngine(metaData, currentDatabaseName, new HintValueContext()).bind(databaseType, parserEngine.parse(sql, true), Collections.emptyList());
}
private void appendFromIndexAndConstraint(final Map<SQLSegment, String> replaceMap, final String targetTableName, final SQLStatementContext sqlStatementContext) {
@@ -146,15 +146,16 @@ public final class PipelineDDLDecorator {
}
// TODO remove it after set search_path is supported.
- private Optional<String> decorateOpenGauss(final String databaseName, final String schemaName, final String queryContext, final SQLParserEngine parserEngine) {
+ private Optional<String> decorateOpenGauss(final String databaseName, final String schemaName, final String queryContext,
+ final SQLParserEngine parserEngine, final DatabaseType databaseType) {
if (queryContext.toLowerCase().startsWith(SET_SEARCH_PATH_PREFIX)) {
return Optional.empty();
}
- return Optional.of(replaceTableNameWithPrefix(queryContext, schemaName, databaseName, parserEngine));
+ return Optional.of(replaceTableNameWithPrefix(queryContext, schemaName, databaseName, parserEngine, databaseType));
}
- private String replaceTableNameWithPrefix(final String sql, final String schemaName, final String databaseName, final SQLParserEngine parserEngine) {
- SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql);
+ private String replaceTableNameWithPrefix(final String sql, final String schemaName, final String databaseName, final SQLParserEngine parserEngine, final DatabaseType databaseType) {
+ SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, databaseType, sql);
if (sqlStatementContext.getSqlStatement() instanceof CreateTableStatement || sqlStatementContext.getSqlStatement() instanceof CreateIndexStatement
|| sqlStatementContext.getSqlStatement() instanceof AlterTableStatement || sqlStatementContext.getSqlStatement() instanceof CommentStatement) {
if (sqlStatementContext.getTablesContext().getSimpleTables().isEmpty()) {
diff --git a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
index c4ebdae7a95..8adaffd414e 100644
--- a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
+++ b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
@@ -203,7 +203,7 @@ public final class EnumerableScanImplementor implements ScanImplementor {
SQLStatement sqlStatement = compilerContext.getSqlParserRule().getSQLParserEngine(databaseType).parse(sql, useCache);
List<Object> params = getParameters(sqlString.getParamIndexes());
HintValueContext hintValueContext = new HintValueContext();
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, executorContext.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, params);
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, executorContext.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, params);
return new QueryContext(sqlStatementContext, sql, params, hintValueContext, queryContext.getConnectionContext(), metaData, useCache);
}
diff --git a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLStatementVisitorEngine.java b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLStatementVisitorEngine.java
index 0baf60cdd58..d5cc24170a5 100644
--- a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLStatementVisitorEngine.java
+++ b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLStatementVisitorEngine.java
@@ -48,10 +48,9 @@ public final class SQLStatementVisitorEngine {
*/
public SQLStatement visit(final ParseASTNode parseASTNode) {
SQLStatementVisitor visitor = SQLStatementVisitorFactory.newInstance(databaseType, SQLVisitorRule.valueOf(parseASTNode.getRootNode().getClass()));
- SQLStatement result = (SQLStatement) parseASTNode.getRootNode().accept(visitor);
+ ASTNode result = parseASTNode.getRootNode().accept(visitor);
appendSQLComments(parseASTNode, result);
- result.setDatabaseType(databaseType);
- return result;
+ return (SQLStatement) result;
}
private <T> void appendSQLComments(final ParseASTNode parseASTNode, final T visitResult) {
diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatement.java
index 37d70b29554..58e6d5374c7 100644
--- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatement.java
+++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatement.java
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.sql.parser.statement.core.statement;
import com.cedarsoftware.util.CaseInsensitiveSet;
import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.CommentSegment;
import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
@@ -34,7 +32,6 @@ import java.util.LinkedList;
* SQL statement.
*/
@Getter
-@Setter
public class SQLStatement implements ASTNode {
private final Collection<Integer> uniqueParameterIndexes = new LinkedHashSet<>();
@@ -45,8 +42,6 @@ public class SQLStatement implements ASTNode {
private final Collection<CommentSegment> comments = new LinkedList<>();
- private DatabaseType databaseType;
-
/**
* Get count of parameters.
*
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 3642aa6a8cd..585ff772e7d 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
@@ -93,7 +93,7 @@ public final class ProxyBackendHandlerFactory {
SQLStatementContext sqlStatementContext = sqlStatement instanceof DistSQLStatement
? new DistSQLStatementContext((DistSQLStatement) sqlStatement)
: new SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
- connectionSession.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList());
+ connectionSession.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
QueryContext queryContext = new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext, connectionSession.getConnectionContext(),
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData());
connectionSession.setQueryContext(queryContext);
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
index 84858410c6c..3ea7354ba85 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/PreviewExecutor.java
@@ -92,7 +92,8 @@ public final class PreviewExecutor implements DistSQLQueryExecutor<PreviewStatem
HintValueContext hintValueContext = connectionContext.getQueryContext().getHintValueContext();
hintValueContext.setSkipMetadataValidate(true);
String currentDatabaseName = connectionContext.getQueryContext().getConnectionContext().getCurrentDatabaseName().orElse(null);
- SQLStatementContext toBePreviewedStatementContext = new SQLBindEngine(metaData, currentDatabaseName, hintValueContext).bind(toBePreviewedStatement, Collections.emptyList());
+ SQLStatementContext toBePreviewedStatementContext = new SQLBindEngine(
+ metaData, currentDatabaseName, hintValueContext).bind(database.getProtocolType(), toBePreviewedStatement, Collections.emptyList());
QueryContext queryContext = new QueryContext(
toBePreviewedStatementContext, toBePreviewedSQL, Collections.emptyList(), hintValueContext, connectionContext.getQueryContext().getConnectionContext(), metaData);
if (toBePreviewedStatementContext.getSqlStatement().getAttributes().findAttribute(CursorSQLStatementAttribute.class).isPresent()
diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
index 9a622250b81..b88fb5c65b9 100644
--- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
+++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.proxy.backend.mysql.handler.admin;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutorCreator;
@@ -114,7 +115,7 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre
private Optional<DatabaseAdminExecutor> createExecutorForSelectStatement(final SelectStatementContext selectStatementContext, final String sql,
final String databaseName, final List<Object> parameters) {
if (!selectStatementContext.getSqlStatement().getFrom().isPresent()) {
- return findAdminExecutorForSelectWithoutFrom(selectStatementContext.getSqlStatement(), sql, databaseName);
+ return findAdminExecutorForSelectWithoutFrom(selectStatementContext.getDatabaseType(), selectStatementContext.getSqlStatement(), sql, databaseName);
}
if (INFORMATION_SCHEMA.equalsIgnoreCase(databaseName) && !ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete()) {
return MySQLInformationSchemaExecutorFactory.newInstance(selectStatementContext, sql, parameters);
@@ -131,12 +132,13 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre
return Optional.empty();
}
- private Optional<DatabaseAdminExecutor> findAdminExecutorForSelectWithoutFrom(final SelectStatement selectStatement, final String sql, final String databaseName) {
+ private Optional<DatabaseAdminExecutor> findAdminExecutorForSelectWithoutFrom(final DatabaseType databaseType,
+ final SelectStatement selectStatement, final String sql, final String databaseName) {
Optional<DatabaseAdminExecutor> result = MySQLSystemVariableQueryExecutor.tryGetSystemVariableQueryExecutor(selectStatement);
- return result.isPresent() ? result : getSelectFunctionOrVariableExecutor(selectStatement, sql, databaseName);
+ return result.isPresent() ? result : getSelectFunctionOrVariableExecutor(databaseType, selectStatement, sql, databaseName);
}
- private Optional<DatabaseAdminExecutor> getSelectFunctionOrVariableExecutor(final SelectStatement selectStatement, final String sql, final String databaseName) {
+ private Optional<DatabaseAdminExecutor> getSelectFunctionOrVariableExecutor(final DatabaseType databaseType, final SelectStatement selectStatement, final String sql, final String databaseName) {
if (isShowSpecialFunction(selectStatement, ShowConnectionIdExecutor.FUNCTION_NAME)) {
return Optional.of(new ShowConnectionIdExecutor(selectStatement));
}
@@ -149,7 +151,7 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre
if (isShowSpecialFunction(selectStatement, ShowCurrentDatabaseExecutor.FUNCTION_NAME)) {
return Optional.of(new ShowCurrentDatabaseExecutor());
}
- return mockExecutor(databaseName, selectStatement, sql);
+ return mockExecutor(databaseName, databaseType, selectStatement, sql);
}
private boolean isShowSpecialFunction(final SelectStatement sqlStatement, final String functionName) {
@@ -158,12 +160,12 @@ public final class MySQLAdminExecutorCreator implements DatabaseAdminExecutorCre
return !segmentIterator.hasNext() && firstProjection instanceof ExpressionProjectionSegment && functionName.equalsIgnoreCase(((ExpressionProjectionSegment) firstProjection).getText());
}
- private Optional<DatabaseAdminExecutor> mockExecutor(final String databaseName, final SelectStatement sqlStatement, final String sql) {
+ private Optional<DatabaseAdminExecutor> mockExecutor(final String databaseName, final DatabaseType databaseType, final SelectStatement sqlStatement, final String sql) {
if (hasNoResource()) {
return Optional.of(new NoResourceShowExecutor(sqlStatement));
}
boolean isUseSchema = null != databaseName || sqlStatement.getFrom().isPresent();
- return isUseSchema ? Optional.empty() : Optional.of(new UnicastResourceShowExecutor(sqlStatement, sql));
+ return isUseSchema ? Optional.empty() : Optional.of(new UnicastResourceShowExecutor(databaseType, sqlStatement, sql));
}
private boolean hasNoResource() {
diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetVariableAdminExecutor.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetVariableAdminExecutor.java
index 7a089820296..18079e0dee4 100644
--- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetVariableAdminExecutor.java
+++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetVariableAdminExecutor.java
@@ -92,7 +92,7 @@ public final class MySQLSetVariableAdminExecutor implements DatabaseAdminExecuto
SQLParserRule sqlParserRule = metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(databaseType).parse(sql, false);
SQLStatementContext sqlStatementContext = new SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
- connectionSession.getCurrentDatabaseName(), new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ connectionSession.getCurrentDatabaseName(), new HintValueContext()).bind(databaseType, sqlStatement, Collections.emptyList());
DatabaseBackendHandler databaseBackendHandler = DatabaseConnectorFactory.getInstance().newInstance(
new QueryContext(sqlStatementContext, sql, Collections.emptyList(), new HintValueContext(), connectionSession.getConnectionContext(), metaDataContexts.getMetaData()),
connectionSession.getDatabaseConnectionManager(), false);
diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
index 625d5617c3e..892a4d01a20 100644
--- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
+++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
@@ -21,6 +21,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
@@ -63,6 +64,8 @@ public final class UnicastResourceShowExecutor implements DatabaseAdminQueryExec
private final DatabaseConnectorFactory databaseConnectorFactory = DatabaseConnectorFactory.getInstance();
+ private final DatabaseType databaseType;
+
private final SelectStatement sqlStatement;
private final String sql;
@@ -83,7 +86,8 @@ public final class UnicastResourceShowExecutor implements DatabaseAdminQueryExec
try {
connectionSession.setCurrentDatabaseName(databaseName);
ShardingSphereMetaData metaData = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, connectionSession.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(
+ metaData, connectionSession.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
databaseConnector = databaseConnectorFactory.newInstance(new QueryContext(
sqlStatementContext, sql, Collections.emptyList(), hintValueContext, connectionSession.getConnectionContext(), metaData), connectionSession.getDatabaseConnectionManager(), false);
responseHeader = databaseConnector.execute();
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 d29f3b4327b..52212bce36a 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
@@ -83,7 +83,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(databaseType).parse(packet.getSQL(), true);
ShardingSpherePreconditions.checkState(MySQLComStmtPrepareChecker.isAllowedStatement(sqlStatement), UnsupportedPreparedStatementException::new);
SQLStatementContext sqlStatementContext = new SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
- connectionSession.getCurrentDatabaseName(), packet.getHintValueContext()).bind(sqlStatement, Collections.emptyList());
+ connectionSession.getCurrentDatabaseName(), packet.getHintValueContext()).bind(databaseType, 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/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
index 50846b8c92b..1eeaeb33639 100644
--- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
+++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
@@ -71,7 +71,7 @@ public final class MySQLComFieldListPacketExecutor implements CommandExecutor {
SQLParserRule sqlParserRule = metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(databaseType).parse(sql, false);
HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
- SQLStatementContext sqlStatementContext = new SQLBindEngine(metaDataContexts.getMetaData(), currentDatabaseName, hintValueContext).bind(sqlStatement, Collections.emptyList());
+ SQLStatementContext sqlStatementContext = new SQLBindEngine(metaDataContexts.getMetaData(), currentDatabaseName, hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
ProxyDatabaseConnectionManager databaseConnectionManager = connectionSession.getDatabaseConnectionManager();
QueryContext queryContext = new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext, connectionSession.getConnectionContext(), metaDataContexts.getMetaData());
databaseConnector = DatabaseConnectorFactory.getInstance().newInstance(queryContext, databaseConnectionManager, false);
diff --git a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index 30da47949bb..a242cea89f9 100644
--- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -126,7 +126,7 @@ public final class MySQLMultiStatementsHandler implements ProxyBackendHandler {
private QueryContext createQueryContext(final String sql, final SQLStatement sqlStatement) {
HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
SQLStatementContext sqlStatementContext = new SQLBindEngine(
- metaDataContexts.getMetaData(), connectionSession.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList());
+ metaDataContexts.getMetaData(), connectionSession.getCurrentDatabaseName(), hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
return new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext, connectionSession.getConnectionContext(), metaDataContexts.getMetaData());
}
diff --git a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
index a918cd67c5e..462f53f05ea 100644
--- a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
+++ b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
@@ -86,6 +86,7 @@ class OpenGaussComBatchBindExecutorTest {
String sql = "insert into bmsql (id) values (?)";
SQLStatement sqlStatement = parserEngine.parse(sql, false);
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
+ when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
ConnectionSession connectionSession = mockConnectionSession();
PostgreSQLServerPreparedStatement serverPreparedStatement = new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, new HintValueContext(), Collections.emptyList(),
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 58018f21f86..25d7cf13676 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
@@ -107,8 +107,8 @@ public final class PostgreSQLBatchedStatementsExecutor {
}
private SQLStatementContext createSQLStatementContext(final List<Object> params, final HintValueContext hintValueContext) {
- return new SQLBindEngine(
- metaDataContexts.getMetaData(), connectionSession.getCurrentDatabaseName(), hintValueContext).bind(preparedStatement.getSqlStatementContext().getSqlStatement(), params);
+ return new SQLBindEngine(metaDataContexts.getMetaData(), connectionSession.getCurrentDatabaseName(), hintValueContext).bind(
+ preparedStatement.getSqlStatementContext().getDatabaseType(), 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 028b7310de7..734b089f632 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,7 +238,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
private void tryDescribePreparedStatementByJDBC(final PostgreSQLServerPreparedStatement logicPreparedStatement) throws SQLException {
ShardingSphereMetaData metaData = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, connectionSession.getCurrentDatabaseName(), logicPreparedStatement.getHintValueContext())
- .bind(logicPreparedStatement.getSqlStatementContext().getSqlStatement(), Collections.emptyList());
+ .bind(logicPreparedStatement.getSqlStatementContext().getDatabaseType(), logicPreparedStatement.getSqlStatementContext().getSqlStatement(), Collections.emptyList());
QueryContext queryContext = new QueryContext(sqlStatementContext, logicPreparedStatement.getSql(), Collections.emptyList(), logicPreparedStatement.getHintValueContext(),
connectionSession.getConnectionContext(), metaData);
ExecutionContext executionContext =
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 9a44c4989bf..5060af2aea6 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
@@ -80,7 +80,7 @@ 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(metaData, connectionSession.getCurrentDatabaseName(), packet.getHintValueContext()).bind(sqlStatement, Collections.emptyList());
+ : new SQLBindEngine(metaData, connectionSession.getCurrentDatabaseName(), packet.getHintValueContext()).bind(databaseType, 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/PostgreSQLBatchedStatementsExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
index 06ca0931cab..4d691f863ed 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
@@ -119,7 +119,6 @@ class PostgreSQLBatchedStatementsExecutorTest {
private InsertStatementContext mockInsertStatementContext() {
InsertStatement insertStatement = new InsertStatement();
insertStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t"))));
- insertStatement.setDatabaseType(databaseType);
InsertStatementContext result = mock(InsertStatementContext.class);
when(result.getDatabaseType()).thenReturn(databaseType);
when(result.getSqlStatement()).thenReturn(insertStatement);
diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
index 0398c272dd5..8bbf8854d0a 100644
--- a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
+++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
@@ -83,7 +83,8 @@ public abstract class SQLBinderIT {
private SQLStatement bindSQLStatement(final String databaseType, final String sql, final List<Object> parameters) {
HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
SQLStatement sqlStatement = new SQLStatementVisitorEngine(databaseType).visit(new SQLParserEngine(databaseType, new CacheOption(128, 1024L)).parse(sql, false));
- return new SQLBindEngine(mockMetaData(TypedSPILoader.getService(DatabaseType.class, databaseType)), "foo_db_1", hintValueContext).bind(sqlStatement, parameters).getSqlStatement();
+ return new SQLBindEngine(mockMetaData(TypedSPILoader.getService(DatabaseType.class, databaseType)), "foo_db_1", hintValueContext)
+ .bind(TypedSPILoader.getService(DatabaseType.class, databaseType), sqlStatement, parameters).getSqlStatement();
}
private ShardingSphereMetaData mockMetaData(final DatabaseType databaseType) {
diff --git a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
index 52d9cafce47..342e129d4fb 100644
--- a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
+++ b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
@@ -112,7 +112,7 @@ public abstract class SQLRewriterIT {
RuleMetaData globalRuleMetaData = new RuleMetaData(GlobalRulesBuilder.buildRules(Collections.emptyList(), Collections.emptyList(), new ConfigurationProperties(new Properties())));
ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singleton(database), mock(), globalRuleMetaData, mock());
HintValueContext hintValueContext = SQLHintUtils.extractHint(testParams.getInputSQL());
- SQLStatementContext sqlStatementContext = bind(testParams, metaData, databaseName, hintValueContext, sqlStatement, sqlParserEngine);
+ SQLStatementContext sqlStatementContext = bind(testParams, metaData, databaseName, hintValueContext, databaseType, sqlStatement, sqlParserEngine);
ConnectionContext connectionContext = createConnectionContext(database.getName());
QueryContext queryContext = new QueryContext(sqlStatementContext, sql, testParams.getInputParameters(), hintValueContext, connectionContext, metaData);
ConfigurationProperties props = new ConfigurationProperties(rootConfig.getProps());
@@ -138,20 +138,20 @@ public abstract class SQLRewriterIT {
}
private SQLStatementContext bind(final SQLRewriteEngineTestParameters testParams, final ShardingSphereMetaData metaData, final String databaseName,
- final HintValueContext hintValueContext, final SQLStatement sqlStatement, final SQLParserEngine sqlParserEngine) {
- SQLStatementContext result = new SQLBindEngine(metaData, databaseName, hintValueContext).bind(sqlStatement, Collections.emptyList());
+ final HintValueContext hintValueContext, final DatabaseType databaseType, final SQLStatement sqlStatement, final SQLParserEngine sqlParserEngine) {
+ SQLStatementContext result = new SQLBindEngine(metaData, databaseName, hintValueContext).bind(databaseType, sqlStatement, Collections.emptyList());
if (result instanceof ParameterAware) {
((ParameterAware) result).setUpParameters(testParams.getInputParameters());
}
if (result instanceof CursorHeldSQLStatementContext) {
- ((CursorHeldSQLStatementContext) result).setCursorStatementContext(createCursorDefinition(databaseName, metaData, sqlParserEngine));
+ ((CursorHeldSQLStatementContext) result).setCursorStatementContext(createCursorDefinition(databaseName, metaData, databaseType, sqlParserEngine));
}
return result;
}
- private CursorStatementContext createCursorDefinition(final String schemaName, final ShardingSphereMetaData metaData, final SQLParserEngine sqlParserEngine) {
+ private CursorStatementContext createCursorDefinition(final String schemaName, final ShardingSphereMetaData metaData, final DatabaseType databaseType, final SQLParserEngine sqlParserEngine) {
SQLStatement sqlStatement = sqlParserEngine.parse("CURSOR t_account_cursor FOR SELECT * FROM t_account WHERE account_id = 100", false);
- return (CursorStatementContext) new SQLBindEngine(metaData, schemaName, new HintValueContext()).bind(sqlStatement, Collections.emptyList());
+ return (CursorStatementContext) new SQLBindEngine(metaData, schemaName, new HintValueContext()).bind(databaseType, sqlStatement, Collections.emptyList());
}
private ConnectionContext createConnectionContext(final String databaseName) {