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 358987bdd47 Add SQLStatementAttribute (#35771)
358987bdd47 is described below
commit 358987bdd47bd7ae129d237362060c70c8922e9c
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jun 21 12:29:11 2025 +0800
Add SQLStatementAttribute (#35771)
* Add SQLStatementAttribute
* Add SQLStatementAttribute
---
.../statement/core/statement/SQLStatement.java | 10 ++++
...tabaseSelectRequiredSQLStatementAttribute.java} | 6 +--
.../SQLStatementAttribute.java} | 6 +--
.../attribute/SQLStatementAttributes.java | 62 ++++++++++++++++++++++
.../statement/dal/ShowCreateTableStatement.java | 11 ++--
.../statement/dal/ShowTableStatusStatement.java | 10 +++-
.../core/statement/dal/ShowTablesStatement.java | 10 +++-
.../data/DatabaseBackendHandlerFactory.java | 4 +-
.../data/DatabaseBackendHandlerFactoryTest.java | 2 +-
9 files changed, 105 insertions(+), 16 deletions(-)
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 5458cd04891..6f04a4a5346 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
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.sql.parser.statement.core.statement;
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;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
import java.util.Collection;
@@ -62,4 +63,13 @@ public interface SQLStatement extends ASTNode {
* @return comment segments
*/
Collection<CommentSegment> getComments();
+
+ /**
+ * Get SQL statement attributes.
+ *
+ * @return SQL statement attributes
+ */
+ default SQLStatementAttributes getAttributes() {
+ return new SQLStatementAttributes();
+ }
}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/DatabaseSelectRequiredSQLStatementAttribute.java
similarity index 83%
copy from
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
copy to
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/DatabaseSelectRequiredSQLStatementAttribute.java
index 64e40b45d7d..641f3aa2a61 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/DatabaseSelectRequiredSQLStatementAttribute.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.statement.core.statement.required;
+package
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute;
/**
- * Database select required SQL statement.
+ * Database select required SQL statement attribute.
*/
-public interface DatabaseSelectRequiredSQLStatement {
+public final class DatabaseSelectRequiredSQLStatementAttribute implements
SQLStatementAttribute {
}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttribute.java
similarity index 88%
rename from
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
rename to
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttribute.java
index 64e40b45d7d..5f61c1c1406 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/required/DatabaseSelectRequiredSQLStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttribute.java
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.statement.core.statement.required;
+package
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute;
/**
- * Database select required SQL statement.
+ * SQL statement attribute.
*/
-public interface DatabaseSelectRequiredSQLStatement {
+public interface SQLStatementAttribute {
}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttributes.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttributes.java
new file mode 100644
index 00000000000..509b7055dba
--- /dev/null
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/SQLStatementAttributes.java
@@ -0,0 +1,62 @@
+/*
+ * 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.attribute;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+
+/**
+ * SQL statement attribute.
+ */
+public final class SQLStatementAttributes {
+
+ private final Collection<SQLStatementAttribute> attributes;
+
+ public SQLStatementAttributes(final SQLStatementAttribute... attributes) {
+ this.attributes = Arrays.asList(attributes);
+ }
+
+ /**
+ * Find SQL statement attribute.
+ *
+ * @param attributeClass SQL statement attribute class
+ * @param <T> type of SQL statement attribute
+ * @return found SQL statement attribute
+ */
+ @SuppressWarnings("unchecked")
+ public <T extends SQLStatementAttribute> Optional<T> findAttribute(final
Class<T> attributeClass) {
+ for (SQLStatementAttribute each : attributes) {
+ if (attributeClass.isAssignableFrom(each.getClass())) {
+ return Optional.of((T) each);
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Get SQL statement attribute.
+ *
+ * @param attributeClass SQL statement attribute class
+ * @param <T> type of SQL statement attribute
+ * @return got SQL statement attribute
+ */
+ public <T extends SQLStatementAttribute> T getAttribute(final Class<T>
attributeClass) {
+ return findAttribute(attributeClass).orElseThrow(() -> new
IllegalStateException(String.format("Can not find SQL statement attribute: %s",
attributeClass)));
+ }
+}
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 7f96998d860..b125a19d6e6 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
@@ -21,9 +21,10 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.DatabaseSelectRequiredSQLStatementAttribute;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailableSQLStatement;
-import
org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequiredSQLStatement;
import java.util.Collection;
import java.util.Collections;
@@ -37,8 +38,7 @@ public final class ShowCreateTableStatement extends
AbstractSQLStatement
implements
DALStatement,
TableAvailableSQLStatement,
- TableInfoInResultSetAvailableSQLStatement,
- DatabaseSelectRequiredSQLStatement {
+ TableInfoInResultSetAvailableSQLStatement {
private final SimpleTableSegment table;
@@ -51,4 +51,9 @@ public final class ShowCreateTableStatement extends
AbstractSQLStatement
public int getTableNameResultSetIndex() {
return 2;
}
+
+ @Override
+ public SQLStatementAttributes getAttributes() {
+ return new SQLStatementAttributes(new
DatabaseSelectRequiredSQLStatementAttribute());
+ }
}
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 1cb10e071ef..218cfda4476 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
@@ -21,8 +21,9 @@ import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
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.attribute.DatabaseSelectRequiredSQLStatementAttribute;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
-import
org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequiredSQLStatement;
import java.util.Optional;
@@ -30,7 +31,7 @@ import java.util.Optional;
* Show table status statement.
*/
@RequiredArgsConstructor
-public final class ShowTableStatusStatement extends AbstractSQLStatement
implements DALStatement, FromDatabaseAvailableSQLStatement,
DatabaseSelectRequiredSQLStatement {
+public final class ShowTableStatusStatement extends AbstractSQLStatement
implements DALStatement, FromDatabaseAvailableSQLStatement {
private final FromDatabaseSegment fromDatabase;
@@ -49,4 +50,9 @@ public final class ShowTableStatusStatement extends
AbstractSQLStatement impleme
public Optional<ShowFilterSegment> getFilter() {
return Optional.ofNullable(filter);
}
+
+ @Override
+ public SQLStatementAttributes getAttributes() {
+ return new SQLStatementAttributes(new
DatabaseSelectRequiredSQLStatementAttribute());
+ }
}
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 80d87af03a7..b83629f7442 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
@@ -22,8 +22,9 @@ import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
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.attribute.DatabaseSelectRequiredSQLStatementAttribute;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
-import
org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequiredSQLStatement;
import java.util.Optional;
@@ -32,7 +33,7 @@ import java.util.Optional;
*/
@RequiredArgsConstructor
@Getter
-public final class ShowTablesStatement extends AbstractSQLStatement implements
DALStatement, FromDatabaseAvailableSQLStatement,
DatabaseSelectRequiredSQLStatement {
+public final class ShowTablesStatement extends AbstractSQLStatement implements
DALStatement, FromDatabaseAvailableSQLStatement {
private final FromDatabaseSegment fromDatabase;
@@ -53,4 +54,9 @@ public final class ShowTablesStatement extends
AbstractSQLStatement implements D
public Optional<ShowFilterSegment> getFilter() {
return Optional.ofNullable(filter);
}
+
+ @Override
+ public SQLStatementAttributes getAttributes() {
+ return new SQLStatementAttributes(new
DatabaseSelectRequiredSQLStatementAttribute());
+ }
}
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 26588de385c..e9effd5607e 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
@@ -26,11 +26,11 @@ import
org.apache.shardingsphere.proxy.backend.handler.data.impl.UnicastDatabase
import
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
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.attribute.DatabaseSelectRequiredSQLStatementAttribute;
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.dml.DoStatement;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
-import
org.apache.shardingsphere.sql.parser.statement.core.statement.required.DatabaseSelectRequiredSQLStatement;
/**
* Database backend handler factory.
@@ -62,7 +62,7 @@ public final class DatabaseBackendHandlerFactory {
}
private static boolean isNotDatabaseSelectRequiredDALStatement(final
SQLStatement sqlStatement) {
- return sqlStatement instanceof DALStatement && !(sqlStatement
instanceof DatabaseSelectRequiredSQLStatement);
+ return sqlStatement instanceof DALStatement &&
!sqlStatement.getAttributes().findAttribute(DatabaseSelectRequiredSQLStatementAttribute.class).isPresent();
}
private static boolean isNotContainFromSelectStatement(final SQLStatement
sqlStatement) {
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactoryTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactoryTest.java
index ad49656885c..455b5a3d67c 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactoryTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseBackendHandlerFactoryTest.java
@@ -59,7 +59,7 @@ class DatabaseBackendHandlerFactoryTest {
void assertNewInstanceReturnedUnicastDatabaseBackendHandlerWithDAL() {
String sql = "DESC tbl";
SQLStatementContext sqlStatementContext =
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
-
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DALStatement.class));
+
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DALStatement.class,
RETURNS_DEEP_STUBS));
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
DatabaseBackendHandler actual =
DatabaseBackendHandlerFactory.newInstance(
new QueryContext(sqlStatementContext, sql,
Collections.emptyList(), new HintValueContext(), mockConnectionContext(),
mock(ShardingSphereMetaData.class)),