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

xiaoyu 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 6309735  Support SELECT DATABASE() (#8539)
6309735 is described below

commit 6309735cd4ecc8f44fb4f8cbc9eb662b335c7cfa
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Dec 9 13:15:01 2020 +0800

    Support SELECT DATABASE() (#8539)
    
    * Update javadoc
    
    * Support SELECT DATABASE()
---
 .../sql/execute/engine/raw/RawExecutor.java        |  2 +-
 .../schema/SchemaBackendHandlerFactory.java        | 11 ++++
 .../impl/ShowCurrentDatabaseBackendHandler.java    | 62 ++++++++++++++++++++++
 .../schema/SchemaBackendHandlerFactoryTest.java    | 59 +++++++++-----------
 4 files changed, 98 insertions(+), 36 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/raw/RawExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/raw/RawExecutor.java
index 61ef3c3..1cb0cb6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/raw/RawExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/raw/RawExecutor.java
@@ -44,7 +44,7 @@ public final class RawExecutor {
      * Execute.
      *
      * @param executionGroups execution groups
-     * @param callback raw SQL execute callback
+     * @param callback raw SQL executor callback
      * @return execute results
      * @throws SQLException SQL exception
      */
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactory.java
index d04ce7f..a565eb8 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactory.java
@@ -20,10 +20,14 @@ package 
org.apache.shardingsphere.proxy.backend.text.metadata.schema;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowCurrentDatabaseBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowDatabasesBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowTablesBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.UseDatabaseBackendHandler;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
@@ -53,6 +57,13 @@ public final class SchemaBackendHandlerFactory {
         if (sqlStatement instanceof MySQLShowTablesStatement) {
             return Optional.of(new 
ShowTablesBackendHandler(backendConnection));
         }
+        if (sqlStatement instanceof SelectStatement) {
+            ProjectionSegment firstProjection = ((SelectStatement) 
sqlStatement).getProjections().getProjections().iterator().next();
+            if (firstProjection instanceof ExpressionProjectionSegment
+                    && 
ShowCurrentDatabaseBackendHandler.FUNCTION_NAME.equalsIgnoreCase(((ExpressionProjectionSegment)
 firstProjection).getText())) {
+                return Optional.of(new 
ShowCurrentDatabaseBackendHandler(backendConnection));
+            }
+        }
         return Optional.empty();
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/impl/ShowCurrentDatabaseBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/impl/ShowCurrentDatabaseBackendHandler.java
new file mode 100644
index 0000000..1c73791
--- /dev/null
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/impl/ShowCurrentDatabaseBackendHandler.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.proxy.backend.text.metadata.schema.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
+import 
org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
+import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.SchemaBackendHandler;
+import 
org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
+
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Show current database backend handler.
+ */
+@RequiredArgsConstructor
+public final class ShowCurrentDatabaseBackendHandler implements 
SchemaBackendHandler {
+    
+    public static final String FUNCTION_NAME = "DATABASE()";
+    
+    private final BackendConnection backendConnection;
+    
+    private MergedResult mergedResult;
+    
+    @Override
+    public ResponseHeader execute() {
+        mergedResult = new 
SingleLocalDataMergedResult(Collections.singleton(backendConnection.getSchemaName()));
+        return new QueryResponseHeader(Collections.singletonList(new 
QueryHeader(
+                "information_schema", "SCHEMATA", FUNCTION_NAME, 
FUNCTION_NAME, Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
+    }
+    
+    @Override
+    public boolean next() throws SQLException {
+        return mergedResult.next();
+    }
+    
+    @Override
+    public Collection<Object> getRowData() throws SQLException {
+        return Collections.singletonList(mergedResult.getValue(1, 
Object.class));
+    }
+}
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactoryTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactoryTest.java
index 65e23f5..eb13715 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactoryTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/schema/SchemaBackendHandlerFactoryTest.java
@@ -17,67 +17,56 @@
 
 package org.apache.shardingsphere.proxy.backend.text.metadata.schema;
 
-import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowCurrentDatabaseBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowDatabasesBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.ShowTablesBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.metadata.schema.impl.UseDatabaseBackendHandler;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
-import org.hamcrest.Matcher;
 import org.junit.Test;
 
-import java.lang.reflect.Field;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public final class SchemaBackendHandlerFactoryTest {
     
     @Test
-    public void 
assertShowTablesBackendHandlerReturnedWhenMySQLShowTablesStatement() {
-        MySQLShowTablesStatement mysqlShowTablesStatement = 
mock(MySQLShowTablesStatement.class);
-        BackendConnection backendConnection = mock(BackendConnection.class);
-        Optional<SchemaBackendHandler> schemaBackendHandler = 
SchemaBackendHandlerFactory.newInstance(mysqlShowTablesStatement, 
backendConnection);
-        assertTrue(schemaBackendHandler.isPresent());
-        assertThat(schemaBackendHandler.get(), 
instanceOf(ShowTablesBackendHandler.class));
-        ShowTablesBackendHandler showTablesBackendHandler = 
(ShowTablesBackendHandler) schemaBackendHandler.get();
-        assertFieldOfInstance(showTablesBackendHandler, "backendConnection", 
is(backendConnection));
+    public void assertUseDatabase() {
+        Optional<SchemaBackendHandler> actual = 
SchemaBackendHandlerFactory.newInstance(mock(MySQLUseStatement.class), 
mock(BackendConnection.class));
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), instanceOf(UseDatabaseBackendHandler.class));
     }
     
     @Test
-    public void assertUseDatabaseBackendHandlerReturnedWhenMySQLUseStatement() 
{
-        MySQLUseStatement mysqlUseStatement = mock(MySQLUseStatement.class);
-        BackendConnection backendConnection = mock(BackendConnection.class);
-        Optional<SchemaBackendHandler> schemaBackendHandler = 
SchemaBackendHandlerFactory.newInstance(mysqlUseStatement, backendConnection);
-        assertTrue(schemaBackendHandler.isPresent());
-        assertThat(schemaBackendHandler.get(), 
instanceOf(UseDatabaseBackendHandler.class));
-        UseDatabaseBackendHandler useDatabaseBackendHandler = 
(UseDatabaseBackendHandler) schemaBackendHandler.get();
-        assertFieldOfInstance(useDatabaseBackendHandler, "useStatement", 
is(mysqlUseStatement));
-        assertFieldOfInstance(useDatabaseBackendHandler, "backendConnection", 
is(backendConnection));
+    public void assertShowDatabases() {
+        Optional<SchemaBackendHandler> actual = 
SchemaBackendHandlerFactory.newInstance(mock(MySQLShowDatabasesStatement.class),
 mock(BackendConnection.class));
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), 
instanceOf(ShowDatabasesBackendHandler.class));
     }
     
     @Test
-    public void 
assertShowDatabasesBackendHandlerReturnedWhenMySQLShowDatabasesStatement() {
-        BackendConnection backendConnection = mock(BackendConnection.class);
-        Optional<SchemaBackendHandler> schemaBackendHandler = 
SchemaBackendHandlerFactory.newInstance(mock(MySQLShowDatabasesStatement.class),
 backendConnection);
-        assertTrue(schemaBackendHandler.isPresent());
-        assertThat(schemaBackendHandler.get(), 
instanceOf(ShowDatabasesBackendHandler.class));
-        ShowDatabasesBackendHandler showDatabasesBackendHandler = 
(ShowDatabasesBackendHandler) schemaBackendHandler.get();
-        assertFieldOfInstance(showDatabasesBackendHandler, 
"backendConnection", is(backendConnection));
+    public void assertShowCurrentDatabase() {
+        SelectStatement sqlStatement = mock(SelectStatement.class, 
RETURNS_DEEP_STUBS);
+        
when(sqlStatement.getProjections().getProjections().iterator().next()).thenReturn(new
 ExpressionProjectionSegment(0, 0, 
ShowCurrentDatabaseBackendHandler.FUNCTION_NAME));
+        Optional<SchemaBackendHandler> actual = 
SchemaBackendHandlerFactory.newInstance(sqlStatement, 
mock(BackendConnection.class));
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), 
instanceOf(ShowCurrentDatabaseBackendHandler.class));
     }
     
-    @SuppressWarnings("unchecked")
-    @SneakyThrows(ReflectiveOperationException.class)
-    private <S, T> void assertFieldOfInstance(final S classInstance, final 
String fieldName, final Matcher<T> matcher) {
-        Field field = classInstance.getClass().getDeclaredField(fieldName);
-        field.setAccessible(true);
-        T value = (T) field.get(classInstance);
-        assertThat(value, matcher);
+    @Test
+    public void assertShowTables() {
+        Optional<SchemaBackendHandler> actual = 
SchemaBackendHandlerFactory.newInstance(mock(MySQLShowTablesStatement.class), 
mock(BackendConnection.class));
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), instanceOf(ShowTablesBackendHandler.class));
     }
 }

Reply via email to