From 1813b1499ae6b7ac1dc79f02c01c8429b19f64cd Mon Sep 17 00:00:00 2001 From: JiaqiYan Date: Wed, 8 Jan 2025 08:48:32 +0800 Subject: [PATCH 1/4] support deny user SQL bind and add test case --- .../infra/binder/engine/SQLBindEngine.java | 5 ++ .../dcl/DenyUserStatementBinder.java | 56 +++++++++++++++++++ .../engine/type/DCLStatementBindEngine.java | 53 ++++++++++++++++++ .../test/resources/cases/dcl/deny-user.xml | 28 ++++++++++ .../src/test/resources/sqls/dcl/deny-user.xml | 21 +++++++ 5 files changed, 163 insertions(+) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dcl/DenyUserStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java create mode 100644 test/it/binder/src/test/resources/cases/dcl/deny-user.xml create mode 100644 test/it/binder/src/test/resources/sqls/dcl/deny-user.xml diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java index 57dedf85d83b6..934cfc835d68c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory; import org.apache.shardingsphere.infra.binder.engine.type.DALStatementBindEngine; +import org.apache.shardingsphere.infra.binder.engine.type.DCLStatementBindEngine; import org.apache.shardingsphere.infra.binder.engine.type.DDLStatementBindEngine; import org.apache.shardingsphere.infra.binder.engine.type.DMLStatementBindEngine; import org.apache.shardingsphere.infra.hint.HintManager; @@ -28,6 +29,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; 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.dcl.DCLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement; @@ -71,6 +73,9 @@ private SQLStatement bindSQLStatement(final SQLStatement statement) { if (statement instanceof DALStatement) { return new DALStatementBindEngine(metaData, currentDatabaseName, hintValueContext).bind((DALStatement) statement); } + if (statement instanceof DCLStatement) { + return new DCLStatementBindEngine(metaData, currentDatabaseName, hintValueContext).bind((DCLStatement) statement); + } return statement; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dcl/DenyUserStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dcl/DenyUserStatementBinder.java new file mode 100644 index 0000000000000..7aebdd1bc2562 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dcl/DenyUserStatementBinder.java @@ -0,0 +1,56 @@ +/* + * 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.infra.binder.engine.statement.dcl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DenyUserStatement; + +/** + * Deny user statement binder. + */ +public final class DenyUserStatementBinder implements SQLStatementBinder { + + @Override + public DenyUserStatement bind(final DenyUserStatement sqlStatement, final SQLStatementBinderContext binderContext) { + DenyUserStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTable(SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts)); + sqlStatement.getColumns() + .forEach(each -> result.getColumns().add(ColumnSegmentBinder.bind(each, SegmentType.DEFINITION_COLUMNS, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DenyUserStatement copy(final DenyUserStatement sqlStatement) { + DenyUserStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setTable(sqlStatement.getTable()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java new file mode 100644 index 0000000000000..fffb22d12fa10 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java @@ -0,0 +1,53 @@ +/* + * 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.infra.binder.engine.type; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dcl.DenyUserStatementBinder; +import org.apache.shardingsphere.infra.hint.HintValueContext; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DenyUserStatement; + +/** + * DCL statement bind engine. + */ +@RequiredArgsConstructor +public final class DCLStatementBindEngine { + + private final ShardingSphereMetaData metaData; + + private final String currentDatabaseName; + + private final HintValueContext hintValueContext; + + /** + * Bind DCL statement. + * + * @param statement to be bound DCL statement + * @return bound DCL statement + */ + public DCLStatement bind(final DCLStatement statement) { + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, statement); + if (statement instanceof DenyUserStatement) { + return new DenyUserStatementBinder().bind((DenyUserStatement) statement, binderContext); + } + return statement; + } +} \ No newline at end of file diff --git a/test/it/binder/src/test/resources/cases/dcl/deny-user.xml b/test/it/binder/src/test/resources/cases/dcl/deny-user.xml new file mode 100644 index 0000000000000..2c15b8a5197c5 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dcl/deny-user.xml @@ -0,0 +1,28 @@ + + + + + + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml b/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml new file mode 100644 index 0000000000000..6d2d16c3dc028 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml @@ -0,0 +1,21 @@ + + + + + + From c39aa37461ac2cd4e98386291bff8c5818597661 Mon Sep 17 00:00:00 2001 From: JiaqiYan Date: Wed, 8 Jan 2025 08:53:38 +0800 Subject: [PATCH 2/4] update release note --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 8c96db616a877..6c471ad6817db 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -52,6 +52,7 @@ 1. Encrypt: Support insert statement rewrite use quote [#34259](https://github.com/apache/shardingsphere/pull/34259) 1. SQL Binder: Support optimize table sql bind and add test case - [#34242](https://github.com/apache/shardingsphere/pull/34242) 1. SQL Binder: Support show create table, show columns, show index statement bind - [#34271](https://github.com/apache/shardingsphere/pull/34271) +1. SQL Binder: Support deny user sql bind and add test case - [#34279](https://github.com/apache/shardingsphere/pull/34279) ### Bug Fixes From 8bba34fbe0e453836cea1e7b55f1bbceadcbecfd Mon Sep 17 00:00:00 2001 From: JiaqiYan Date: Wed, 8 Jan 2025 08:55:22 +0800 Subject: [PATCH 3/4] fix checkstyle --- .../infra/binder/engine/type/DCLStatementBindEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java index fffb22d12fa10..fa0d8f0aabe24 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DCLStatementBindEngine.java @@ -50,4 +50,4 @@ public DCLStatement bind(final DCLStatement statement) { } return statement; } -} \ No newline at end of file +} From fdaba067bccf4f816196fe8525523bbb404b33e3 Mon Sep 17 00:00:00 2001 From: Chakkk Date: Wed, 8 Jan 2025 09:37:55 +0800 Subject: [PATCH 4/4] format license --- .../src/test/resources/sqls/dcl/deny-user.xml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml b/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml index 6d2d16c3dc028..c741bc7144569 100644 --- a/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml +++ b/test/it/binder/src/test/resources/sqls/dcl/deny-user.xml @@ -1,20 +1,20 @@ - +