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 28f32129db5 Add DatabaseSelectRequired (#35768) 28f32129db5 is described below commit 28f32129db5c801e73486517bbe55701b4b9288e Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sat Jun 21 01:09:57 2025 +0800 Add DatabaseSelectRequired (#35768) --- .../statement/dal/ShowCreateTableStatement.java | 3 ++- .../statement/dal/ShowTableStatusStatement.java | 3 ++- .../core/statement/dal/ShowTablesStatement.java | 3 ++- .../statement/required/DatabaseSelectRequired.java | 24 ++++++++++++++++++++++ .../data/DatabaseBackendHandlerFactory.java | 15 +++++++------- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java index 582d3025b0f..cc3690e14fb 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailable; import org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailable; +import org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequired; import java.util.Collection; import java.util.Collections; @@ -32,7 +33,7 @@ import java.util.Collections; */ @RequiredArgsConstructor @Getter -public final class ShowCreateTableStatement extends AbstractSQLStatement implements DALStatement, TableAvailable, TableInfoInResultSetAvailable { +public final class ShowCreateTableStatement extends AbstractSQLStatement implements DALStatement, TableAvailable, TableInfoInResultSetAvailable, DatabaseSelectRequired { private final SimpleTableSegment table; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java index a32ed54e2b0..bf5d6f234e1 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatab import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.ShowFilterSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailable; +import org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequired; import java.util.Optional; @@ -29,7 +30,7 @@ import java.util.Optional; * Show table status statement. */ @RequiredArgsConstructor -public final class ShowTableStatusStatement extends AbstractSQLStatement implements DALStatement, FromDatabaseAvailable { +public final class ShowTableStatusStatement extends AbstractSQLStatement implements DALStatement, FromDatabaseAvailable, DatabaseSelectRequired { private final FromDatabaseSegment fromDatabase; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java index 7f74447f845..8cdfea46b9d 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatab import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.ShowFilterSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailable; +import org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequired; import java.util.Optional; @@ -31,7 +32,7 @@ import java.util.Optional; */ @RequiredArgsConstructor @Getter -public final class ShowTablesStatement extends AbstractSQLStatement implements DALStatement, FromDatabaseAvailable { +public final class ShowTablesStatement extends AbstractSQLStatement implements DALStatement, FromDatabaseAvailable, DatabaseSelectRequired { private final FromDatabaseSegment fromDatabase; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequired.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequired.java new file mode 100644 index 00000000000..7c7c17f7f0c --- /dev/null +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequired.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.sql.parser.statement.core.statement.required; + +/** + * Database select required. + */ +public interface DatabaseSelectRequired { +} diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactory.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactory.java index de0e1e25f87..77a1d0cebb6 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactory.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactory.java @@ -28,11 +28,9 @@ import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.SetStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTableStatusStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTablesStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DoStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequired; /** * Database backend handler factory. @@ -57,14 +55,17 @@ public final class DatabaseBackendHandlerFactory { if (sqlStatement instanceof SetStatement && null == connectionSession.getUsedDatabaseName()) { return () -> new UpdateResponseHeader(sqlStatement); } - if (sqlStatement instanceof DALStatement && !isDatabaseRequiredDALStatement(sqlStatement) - || sqlStatement instanceof SelectStatement && !((SelectStatement) sqlStatement).getFrom().isPresent()) { + if (isNotDatabaseSelectRequiredDALStatement(sqlStatement) || isNotContainFromSelectStatement(sqlStatement)) { return new UnicastDatabaseBackendHandler(queryContext, connectionSession); } return DatabaseConnectorFactory.getInstance().newInstance(queryContext, connectionSession.getDatabaseConnectionManager(), preferPreparedStatement); } - private static boolean isDatabaseRequiredDALStatement(final SQLStatement sqlStatement) { - return sqlStatement instanceof ShowTablesStatement || sqlStatement instanceof ShowTableStatusStatement || sqlStatement instanceof ShowCreateTableStatement; + private static boolean isNotDatabaseSelectRequiredDALStatement(final SQLStatement sqlStatement) { + return sqlStatement instanceof DALStatement && !(sqlStatement instanceof DatabaseSelectRequired); + } + + private static boolean isNotContainFromSelectStatement(final SQLStatement sqlStatement) { + return sqlStatement instanceof SelectStatement && !((SelectStatement) sqlStatement).getFrom().isPresent(); } }