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 6b473a91ec9 Refactor SQLParserRule.getSQLParserEngine() (#29442) 6b473a91ec9 is described below commit 6b473a91ec96446ff9e60a582abee572c66d278c Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Mon Dec 18 23:37:37 2023 +0800 Refactor SQLParserRule.getSQLParserEngine() (#29442) --- .../statement/ShardingSpherePreparedStatement.java | 7 +--- .../core/statement/ShardingSphereStatement.java | 7 +--- .../core/preparer/PipelineJobPreparer.java | 13 -------- .../migration/preparer/MigrationJobPreparer.java | 38 +++++++++++----------- .../shardingsphere/parser/rule/SQLParserRule.java | 2 +- .../handler/distsql/rul/sql/PreviewExecutor.java | 4 +-- .../prepare/MySQLComStmtPrepareExecutor.java | 3 +- .../extended/parse/PostgreSQLComParseExecutor.java | 4 +-- 8 files changed, 25 insertions(+), 53 deletions(-) diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java index 76e90de5383..c7c4a31da9f 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 @@ -199,7 +199,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState this.sql = sqlParserRule.isSqlCommentParseEnabled() ? sql : SQLHintUtils.removeHint(sql); statements = new ArrayList<>(); parameterSets = new ArrayList<>(); - SQLParserEngine sqlParserEngine = sqlParserRule.getSQLParserEngine(getDatabaseType(connection)); + SQLParserEngine sqlParserEngine = sqlParserRule.getSQLParserEngine(metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType()); sqlStatement = sqlParserEngine.parse(this.sql, true); sqlStatementContext = new SQLBindEngine(metaDataContexts.getMetaData(), connection.getDatabaseName(), hintValueContext).bind(sqlStatement, Collections.emptyList()); databaseName = sqlStatementContext.getTablesContext().getDatabaseName().orElse(connection.getDatabaseName()); @@ -216,11 +216,6 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState statementManager = new StatementManager(); } - private DatabaseType getDatabaseType(final ShardingSphereConnection connection) { - DatabaseType protocolType = metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType(); - return protocolType.getTrunkDatabaseType().orElse(protocolType); - } - private boolean isStatementsCacheable(final RuleMetaData databaseRuleMetaData) { return databaseRuleMetaData.findRules(StorageConnectorReusableRule.class).size() == databaseRuleMetaData.getRules().size() && !HintManager.isInstantiated(); } diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java index 69ed878ca26..96cbd88b066 100644 --- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java +++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java @@ -523,16 +523,11 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter { SQLParserRule sqlParserRule = metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class); String sql = sqlParserRule.isSqlCommentParseEnabled() ? originSQL : SQLHintUtils.removeHint(originSQL); HintValueContext hintValueContext = sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() : SQLHintUtils.extractHint(originSQL).orElseGet(HintValueContext::new); - SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(getDatabaseType()).parse(sql, false); + SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType()).parse(sql, false); SQLStatementContext sqlStatementContext = new SQLBindEngine(metaDataContexts.getMetaData(), databaseName, hintValueContext).bind(sqlStatement, Collections.emptyList()); return new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext); } - private DatabaseType getDatabaseType() { - DatabaseType protocolType = metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType(); - return protocolType.getTrunkDatabaseType().orElse(protocolType); - } - private Collection<ExecutionContext> createExecutionContext(final QueryContext queryContext) throws SQLException { clearStatements(); RuleMetaData globalRuleMetaData = metaDataContexts.getMetaData().getGlobalRuleMetaData(); diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/PipelineJobPreparer.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/PipelineJobPreparer.java index dc2475fdaec..6c688a4ce5c 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/PipelineJobPreparer.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/PipelineJobPreparer.java @@ -38,10 +38,7 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; -import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSourceConfigurationSwapper; -import org.apache.shardingsphere.parser.rule.SQLParserRule; import javax.sql.DataSource; import java.sql.SQLException; @@ -66,16 +63,6 @@ public final class PipelineJobPreparer { return DatabaseTypedSPILoader.findService(IncrementalDumperCreator.class, databaseType).map(IncrementalDumperCreator::isSupportIncrementalDump).orElse(false); } - /** - * Get SQL parser engine. - * - * @param metaData meta data - * @return SQL parser engine - */ - public SQLParserEngine getSQLParserEngine(final ShardingSphereMetaData metaData) { - return metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(databaseType); - } - /** * Prepare target tables. * diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 299f9d35b68..23a7f0786e2 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -20,42 +20,42 @@ package org.apache.shardingsphere.data.pipeline.scenario.migration.preparer; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.data.pipeline.api.PipelineDataSourceConfiguration; import org.apache.shardingsphere.data.pipeline.api.type.StandardPipelineDataSourceConfiguration; -import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.PipelineJobDataSourcePreparer; -import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.option.DialectPipelineJobDataSourcePrepareOption; -import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.CreateTableConfiguration; -import org.apache.shardingsphere.data.pipeline.core.importer.ImporterConfiguration; import org.apache.shardingsphere.data.pipeline.core.context.PipelineContextManager; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceWrapper; -import org.apache.shardingsphere.data.pipeline.core.execute.ExecuteEngine; -import org.apache.shardingsphere.data.pipeline.core.ingest.channel.PipelineChannelCreator; -import org.apache.shardingsphere.data.pipeline.core.job.JobStatus; -import org.apache.shardingsphere.data.pipeline.core.job.progress.JobItemIncrementalTasksProgress; -import org.apache.shardingsphere.data.pipeline.core.job.progress.JobOffsetInfo; -import org.apache.shardingsphere.data.pipeline.core.job.progress.TransmissionJobItemProgress; -import org.apache.shardingsphere.data.pipeline.core.job.progress.listener.PipelineJobProgressListener; -import org.apache.shardingsphere.data.pipeline.core.metadata.loader.PipelineTableMetaDataLoader; -import org.apache.shardingsphere.data.pipeline.core.spi.ingest.dumper.IncrementalDumperCreator; -import org.apache.shardingsphere.data.pipeline.core.task.progress.IncrementalTaskProgress; import org.apache.shardingsphere.data.pipeline.core.exception.job.PrepareJobWithGetBinlogPositionException; +import org.apache.shardingsphere.data.pipeline.core.execute.ExecuteEngine; import org.apache.shardingsphere.data.pipeline.core.importer.Importer; +import org.apache.shardingsphere.data.pipeline.core.importer.ImporterConfiguration; import org.apache.shardingsphere.data.pipeline.core.importer.SingleChannelConsumerImporter; import org.apache.shardingsphere.data.pipeline.core.importer.sink.PipelineSink; import org.apache.shardingsphere.data.pipeline.core.ingest.channel.PipelineChannel; +import org.apache.shardingsphere.data.pipeline.core.ingest.channel.PipelineChannelCreator; import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.Dumper; import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.context.IncrementalDumperContext; import org.apache.shardingsphere.data.pipeline.core.ingest.dumper.context.InventoryDumperContext; +import org.apache.shardingsphere.data.pipeline.core.job.JobStatus; import org.apache.shardingsphere.data.pipeline.core.job.PipelineJobRegistry; -import org.apache.shardingsphere.data.pipeline.core.job.id.PipelineJobIdUtils; import org.apache.shardingsphere.data.pipeline.core.job.api.PipelineAPIFactory; +import org.apache.shardingsphere.data.pipeline.core.job.id.PipelineJobIdUtils; +import org.apache.shardingsphere.data.pipeline.core.job.progress.JobItemIncrementalTasksProgress; +import org.apache.shardingsphere.data.pipeline.core.job.progress.JobOffsetInfo; +import org.apache.shardingsphere.data.pipeline.core.job.progress.TransmissionJobItemProgress; +import org.apache.shardingsphere.data.pipeline.core.job.progress.listener.PipelineJobProgressListener; import org.apache.shardingsphere.data.pipeline.core.job.service.PipelineJobItemManager; -import org.apache.shardingsphere.data.pipeline.core.preparer.inventory.InventoryTaskSplitter; +import org.apache.shardingsphere.data.pipeline.core.metadata.loader.PipelineTableMetaDataLoader; import org.apache.shardingsphere.data.pipeline.core.preparer.PipelineJobPreparer; +import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.PipelineJobDataSourcePreparer; +import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.option.DialectPipelineJobDataSourcePrepareOption; +import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.CreateTableConfiguration; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetSchemasParameter; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetTablesParameter; +import org.apache.shardingsphere.data.pipeline.core.preparer.inventory.InventoryTaskSplitter; +import org.apache.shardingsphere.data.pipeline.core.spi.ingest.dumper.IncrementalDumperCreator; import org.apache.shardingsphere.data.pipeline.core.task.IncrementalTask; import org.apache.shardingsphere.data.pipeline.core.task.PipelineTask; import org.apache.shardingsphere.data.pipeline.core.task.PipelineTaskUtils; +import org.apache.shardingsphere.data.pipeline.core.task.progress.IncrementalTaskProgress; import org.apache.shardingsphere.data.pipeline.scenario.migration.MigrationJobType; import org.apache.shardingsphere.data.pipeline.scenario.migration.config.MigrationJobConfiguration; import org.apache.shardingsphere.data.pipeline.scenario.migration.config.MigrationTaskConfiguration; @@ -70,6 +70,7 @@ import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.parser.rule.SQLParserRule; import java.sql.SQLException; import java.util.Collection; @@ -174,9 +175,8 @@ public final class MigrationJobPreparer { PrepareTargetSchemasParameter prepareTargetSchemasParam = new PrepareTargetSchemasParameter(targetDatabaseType, createTableConfigs, dataSourceManager); new PipelineJobDataSourcePreparer(DatabaseTypedSPILoader.getService(DialectPipelineJobDataSourcePrepareOption.class, targetDatabaseType)).prepareTargetSchemas(prepareTargetSchemasParam); ShardingSphereMetaData metaData = PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobConfig.getJobId())).getContextManager().getMetaDataContexts().getMetaData(); - SQLParserEngine sqlParserEngine = new PipelineJobPreparer( - metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType().getTrunkDatabaseType().orElse(metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType())) - .getSQLParserEngine(metaData); + SQLParserEngine sqlParserEngine = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class) + .getSQLParserEngine(metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType()); new PipelineJobPreparer(targetDatabaseType).prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine)); } diff --git a/kernel/sql-parser/core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java b/kernel/sql-parser/core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java index d9b16552854..cd135f9e211 100644 --- a/kernel/sql-parser/core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java +++ b/kernel/sql-parser/core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java @@ -58,7 +58,7 @@ public final class SQLParserRule implements GlobalRule { */ public SQLParserEngine getSQLParserEngine(final DatabaseType databaseType) { return "Standard".equals(engineType) - ? new ShardingSphereSQLParserEngine(databaseType, sqlStatementCache, parseTreeCache, sqlCommentParseEnabled) + ? new ShardingSphereSQLParserEngine(databaseType.getTrunkDatabaseType().orElse(databaseType), sqlStatementCache, parseTreeCache, sqlCommentParseEnabled) : new SimpleSQLParserEngine(); } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java index e32dd16515b..397f2b9cd3b 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java @@ -93,10 +93,8 @@ public final class PreviewExecutor implements ConnectionSessionRequiredRULExecut RuleMetaData globalRuleMetaData = metaDataContexts.getMetaData().getGlobalRuleMetaData(); SQLParserRule sqlParserRule = globalRuleMetaData.getSingleRule(SQLParserRule.class); String sql = sqlParserRule.isSqlCommentParseEnabled() ? sqlStatement.getSql() : SQLHintUtils.removeHint(sqlStatement.getSql()); - DatabaseType protocolType = metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType(); HintValueContext hintValueContext = sqlParserRule.isSqlCommentParseEnabled() ? new HintValueContext() : SQLHintUtils.extractHint(sqlStatement.getSql()).orElseGet(HintValueContext::new); - DatabaseType databaseType = protocolType.getTrunkDatabaseType().orElse(protocolType); - SQLStatement previewedStatement = sqlParserRule.getSQLParserEngine(databaseType).parse(sql, false); + SQLStatement previewedStatement = sqlParserRule.getSQLParserEngine(metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType()).parse(sql, false); SQLStatementContext sqlStatementContext = new SQLBindEngine(metaDataContexts.getMetaData(), databaseName, hintValueContext).bind(previewedStatement, Collections.emptyList()); QueryContext queryContext = new QueryContext(sqlStatementContext, sql, Collections.emptyList(), hintValueContext); connectionSession.setQueryContext(queryContext); 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 ee174ed6857..57d32332ccd 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 @@ -79,8 +79,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor { failedIfContainsMultiStatements(); MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); SQLParserRule sqlParserRule = metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class); - DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL"); - SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(databaseType).parse(packet.getSQL(), true); + SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(TypedSPILoader.getService(DatabaseType.class, "MySQL")).parse(packet.getSQL(), true); if (!MySQLComStmtPrepareChecker.isAllowedStatement(sqlStatement)) { throw new UnsupportedPreparedStatementException(); } 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 a03a3e9a3a8..54fbb8a0c74 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 @@ -25,7 +25,6 @@ import org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.ext import org.apache.shardingsphere.distsql.statement.DistSQLStatement; 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.parser.SQLParserEngine; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.parser.rule.SQLParserRule; @@ -89,8 +88,7 @@ public final class PostgreSQLComParseExecutor implements CommandExecutor { private SQLParserEngine createShardingSphereSQLParserEngine(final String databaseName) { MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); SQLParserRule sqlParserRule = metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class); - DatabaseType protocolType = metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType(); - return sqlParserRule.getSQLParserEngine(protocolType.getTrunkDatabaseType().orElse(protocolType)); + return sqlParserRule.getSQLParserEngine(metaDataContexts.getMetaData().getDatabase(databaseName).getProtocolType()); } private String escape(final SQLStatement sqlStatement, final String sql) {