This is an automated email from the ASF dual-hosted git repository.

chengzhang 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 bd99347c129 Move multiple logic database check to QueryContext (#34174)
bd99347c129 is described below

commit bd99347c129842546cddbd2aa98c75dcccc55b68
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Dec 27 13:39:51 2024 +0800

    Move multiple logic database check to QueryContext (#34174)
    
    * Move multiple logic database check to QueryContext
    
    * fix unit test
    
    * fix unit test
    
    * fix unit test
    
    * fix pipeline error
---
 .../context/segment/table/TablesContext.java       |  2 --
 .../context/segment/table/TablesContextTest.java   | 19 ---------------
 .../executor/sql/process/ProcessEngineTest.java    |  2 --
 .../infra/session/query/QueryContext.java          | 28 +++++++++++++++-------
 .../proxy/backend/session/ConnectionSession.java   |  2 +-
 .../bind/OpenGaussComBatchBindExecutorTest.java    |  2 --
 6 files changed, 20 insertions(+), 35 deletions(-)

diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java
index b274f0d8eaa..d7804d9e06a 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.infra.binder.context.segment.table;
 
 import com.cedarsoftware.util.CaseInsensitiveSet;
-import com.google.common.base.Preconditions;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.ToString;
@@ -110,7 +109,6 @@ public final class TablesContext {
      * @return database name
      */
     public Optional<String> getDatabaseName() {
-        Preconditions.checkState(databaseNames.size() <= 1, "Can not support 
multiple different database.");
         return databaseNames.isEmpty() ? Optional.empty() : 
Optional.of(databaseNames.iterator().next());
     }
     
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java
index 20fd15c36b2..d0510d024d6 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java
@@ -33,7 +33,6 @@ import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 
@@ -99,24 +98,6 @@ class TablesContextTest {
         assertThat(tablesContext.getDatabaseName().get(), is("sharding_db_1"));
     }
     
-    @Test
-    void assertGetSchemaNameWithDifferentSchemaAndSameTable() {
-        SimpleTableSegment tableSegment1 = createTableSegment("table_1", 
"tbl_1", "sharding_db_1");
-        tableSegment1.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db_1")));
-        SimpleTableSegment tableSegment2 = createTableSegment("table_1", 
"tbl_1", "sharding_db_2");
-        tableSegment2.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db_2")));
-        assertThrows(IllegalStateException.class, () -> new 
TablesContext(Arrays.asList(tableSegment1, tableSegment2)).getDatabaseName());
-    }
-    
-    @Test
-    void assertGetSchemaNameWithDifferentSchemaAndDifferentTable() {
-        SimpleTableSegment tableSegment1 = createTableSegment("table_1", 
"tbl_1", "sharding_db_1");
-        tableSegment1.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db_1")));
-        SimpleTableSegment tableSegment2 = createTableSegment("table_2", 
"tbl_2", "sharding_db_2");
-        tableSegment2.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("sharding_db_2")));
-        assertThrows(IllegalStateException.class, () -> new 
TablesContext(Arrays.asList(tableSegment1, tableSegment2)).getDatabaseName());
-    }
-    
     @Test
     void assertGetSchemaName() {
         SimpleTableSegment tableSegment1 = createTableSegment("table_1", 
"tbl_1", "sharding_db_1");
diff --git 
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java
 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java
index 88450ae0fbd..79f01bd8481 100644
--- 
a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java
+++ 
b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java
@@ -39,7 +39,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 
 import java.util.Collections;
-import java.util.Optional;
 import java.util.UUID;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -62,7 +61,6 @@ class ProcessEngineTest {
     @Test
     void assertExecuteSQL() {
         ConnectionContext connectionContext = mock(ConnectionContext.class);
-        
when(connectionContext.getCurrentDatabaseName()).thenReturn(Optional.of("foo_db"));
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
         ExecutionGroupContext<? extends SQLExecutionUnit> 
executionGroupContext = mockExecutionGroupContext();
         new ProcessEngine().executeSQL(executionGroupContext,
diff --git 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
index cf092c7cd59..aee2d8fe593 100644
--- 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
+++ 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
@@ -17,17 +17,20 @@
 
 package org.apache.shardingsphere.infra.session.query;
 
+import com.google.common.base.Joiner;
 import lombok.Getter;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 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.dialect.exception.syntax.database.UnknownDatabaseException;
+import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -48,7 +51,7 @@ public final class QueryContext {
     
     private final ShardingSphereMetaData metaData;
     
-    private final String usedDatabaseName;
+    private final Collection<String> usedDatabaseNames;
     
     private final boolean useCache;
     
@@ -65,15 +68,20 @@ public final class QueryContext {
         this.hintValueContext = hintValueContext;
         this.connectionContext = connectionContext;
         this.metaData = metaData;
-        usedDatabaseName = 
findUsedDatabaseNameFromSQLStatement(sqlStatementContext, connectionContext);
+        usedDatabaseNames = getUsedDatabaseNames(sqlStatementContext, 
connectionContext);
         this.useCache = useCache;
     }
     
-    private String findUsedDatabaseNameFromSQLStatement(final 
SQLStatementContext sqlStatementContext, final ConnectionContext 
connectionContext) {
+    private Collection<String> getUsedDatabaseNames(final SQLStatementContext 
sqlStatementContext, final ConnectionContext connectionContext) {
         if (sqlStatementContext instanceof TableAvailable) {
-            return ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().orElse(connectionContext.getCurrentDatabaseName().orElse(null));
+            Collection<String> result = ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseNames();
+            return result.isEmpty() ? 
getCurrentDatabaseNames(connectionContext) : result;
         }
-        return connectionContext.getCurrentDatabaseName().orElse(null);
+        return getCurrentDatabaseNames(connectionContext);
+    }
+    
+    private Collection<String> getCurrentDatabaseNames(final ConnectionContext 
connectionContext) {
+        return connectionContext.getCurrentDatabaseName().isPresent() ? 
Collections.singleton(connectionContext.getCurrentDatabaseName().get()) : 
Collections.emptyList();
     }
     
     /**
@@ -82,8 +90,10 @@ public final class QueryContext {
      * @return used database
      */
     public ShardingSphereDatabase getUsedDatabase() {
-        ShardingSpherePreconditions.checkNotNull(usedDatabaseName, 
NoDatabaseSelectedException::new);
-        
ShardingSpherePreconditions.checkState(metaData.containsDatabase(usedDatabaseName),
 () -> new UnknownDatabaseException(usedDatabaseName));
-        return metaData.getDatabase(usedDatabaseName);
+        ShardingSpherePreconditions.checkState(usedDatabaseNames.size() <= 1,
+                () -> new UnsupportedSQLOperationException(String.format("Can 
not support multiple logic databases [%s]", Joiner.on(", 
").join(usedDatabaseNames))));
+        String databaseName = usedDatabaseNames.iterator().next();
+        
ShardingSpherePreconditions.checkState(metaData.containsDatabase(databaseName), 
() -> new UnknownDatabaseException(databaseName));
+        return metaData.getDatabase(databaseName);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
index 636c0ccdc8d..1ea99637676 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
@@ -119,7 +119,7 @@ public final class ConnectionSession {
      * @return used database name
      */
     public String getUsedDatabaseName() {
-        return null == queryContext ? currentDatabaseName : 
queryContext.getUsedDatabaseName();
+        return null == queryContext || 
queryContext.getUsedDatabaseNames().isEmpty() ? currentDatabaseName : 
queryContext.getUsedDatabaseNames().iterator().next();
     }
     
     /**
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 88f942dd632..ea5629c58c3 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
@@ -62,7 +62,6 @@ import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
@@ -124,7 +123,6 @@ class OpenGaussComBatchBindExecutorTest {
     
     private ConnectionContext mockConnectionContext() {
         ConnectionContext result = mock(ConnectionContext.class);
-        
when(result.getCurrentDatabaseName()).thenReturn(Optional.of("foo_db"));
         
when(result.getTransactionContext()).thenReturn(mock(TransactionConnectionContext.class));
         return result;
     }

Reply via email to