You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2023/04/27 07:40:16 UTC

[shardingsphere] branch master updated: Support MySQL SET session variable (#24124) (#25330)

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

wuweijie 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 b339bf6f8f2 Support MySQL SET session variable (#24124) (#25330)
b339bf6f8f2 is described below

commit b339bf6f8f2d059beee07e52f75fcc7d9880bfab
Author: Cong Hu <ia...@qq.com>
AuthorDate: Thu Apr 27 15:40:07 2023 +0800

    Support MySQL SET session variable (#24124) (#25330)
    
    * support MySQL SET session variable (#24124)
    
    * support MySQL SET session variable (#24124)
    
    * Complete test (#24124)
    
    * fix CheckStyle error (#24124)
    
    * Resolve suggestions in the review (#24124)
---
 .../handler/admin/executor/DefaultSessionVariableHandler.java |  6 +++++-
 .../backend/session/RequiredSessionVariableRecorder.java      |  8 +++++++-
 .../backend/session/RequiredSessionVariableRecorderTest.java  | 11 +++++++----
 .../handler/admin/MySQLDefaultSessionVariableHandler.java     |  5 +++++
 .../executor/DefaultMySQLSessionVariableHandlerTest.java      |  5 ++++-
 5 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultSessionVariableHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultSessionVariableHandler.java
index 4cd17e3e9fd..8b23c519ede 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultSessionVariableHandler.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultSessionVariableHandler.java
@@ -37,13 +37,17 @@ public abstract class DefaultSessionVariableHandler implements SessionVariableHa
     @Override
     public final void handle(final ConnectionSession connectionSession, final String variableName, final String assignValue) {
         if (TypedSPILoader.findService(ReplayedSessionVariablesProvider.class, databaseType).map(ReplayedSessionVariablesProvider::getVariables).orElseGet(Collections::emptySet)
-                .contains(variableName)) {
+                .contains(variableName) || isNeedHandle(variableName)) {
             connectionSession.getRequiredSessionVariableRecorder().setVariable(variableName, assignValue);
         } else {
             log.debug("Set statement {} = {} was discarded.", variableName, assignValue);
         }
     }
     
+    protected boolean isNeedHandle(final String variableName) {
+        return false;
+    }
+    
     @Override
     public final boolean isDefault() {
         return true;
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorder.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorder.java
index d56cba98137..3b863cc99e7 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorder.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorder.java
@@ -32,6 +32,8 @@ public final class RequiredSessionVariableRecorder {
     
     private static final String DEFAULT = "DEFAULT";
     
+    private static final String NULL = "NULL";
+    
     private final Map<String, String> sessionVariables = new ConcurrentHashMap<>();
     
     /**
@@ -114,7 +116,11 @@ public final class RequiredSessionVariableRecorder {
     private String aggregateToMySQLSetDefaultSQLs() {
         StringJoiner result = new StringJoiner(",", "SET ", "");
         for (String each : sessionVariables.keySet()) {
-            result.add(each + "=" + DEFAULT);
+            if (each.startsWith("@")) {
+                result.add(each + "=" + NULL);
+            } else {
+                result.add(each + "=" + DEFAULT);
+            }
         }
         return result.toString();
     }
diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorderTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorderTest.java
index 78183bf8cfd..1f15437b794 100644
--- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorderTest.java
+++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/RequiredSessionVariableRecorderTest.java
@@ -39,12 +39,15 @@ class RequiredSessionVariableRecorderTest {
         assertTrue(recorder.toResetSQLs(databaseType).isEmpty());
         recorder.setVariable("sql_mode", "default");
         recorder.setVariable("max_sort_length", "1024");
+        recorder.setVariable("@variable_name", "'variable_value'");
         assertFalse(recorder.isEmpty());
-        assertThat(recorder.toSetSQLs(databaseType), is(Collections.singletonList("SET sql_mode=default,max_sort_length=1024")));
-        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET sql_mode=DEFAULT,max_sort_length=DEFAULT")));
+        assertThat(recorder.toSetSQLs(databaseType), is(Collections.singletonList("SET sql_mode=default,@variable_name='variable_value',max_sort_length=1024")));
+        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET sql_mode=DEFAULT,@variable_name=NULL,max_sort_length=DEFAULT")));
+        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET sql_mode=DEFAULT,@variable_name=NULL,max_sort_length=DEFAULT")));
         recorder.removeVariablesWithDefaultValue();
-        assertThat(recorder.toSetSQLs(databaseType), is(Collections.singletonList("SET max_sort_length=1024")));
-        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET max_sort_length=DEFAULT")));
+        assertThat(recorder.toSetSQLs(databaseType), is(Collections.singletonList("SET @variable_name='variable_value',max_sort_length=1024")));
+        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET @variable_name=NULL,max_sort_length=DEFAULT")));
+        assertThat(recorder.toResetSQLs(databaseType), is(Collections.singletonList("SET @variable_name=NULL,max_sort_length=DEFAULT")));
     }
     
     @Test
diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLDefaultSessionVariableHandler.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLDefaultSessionVariableHandler.java
index 51ecc7ff4e5..49653638fc0 100644
--- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLDefaultSessionVariableHandler.java
+++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLDefaultSessionVariableHandler.java
@@ -27,4 +27,9 @@ public final class MySQLDefaultSessionVariableHandler extends DefaultSessionVari
     public MySQLDefaultSessionVariableHandler() {
         super("MySQL");
     }
+    
+    @Override
+    protected boolean isNeedHandle(final String variableName) {
+        return variableName.startsWith("@");
+    }
 }
diff --git a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/DefaultMySQLSessionVariableHandlerTest.java b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/DefaultMySQLSessionVariableHandlerTest.java
index c5b7c25ca65..1136bc9cbaa 100644
--- a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/DefaultMySQLSessionVariableHandlerTest.java
+++ b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/DefaultMySQLSessionVariableHandlerTest.java
@@ -52,8 +52,11 @@ class DefaultMySQLSessionVariableHandlerTest {
             ReplayedSessionVariablesProvider variablesProvider = mock(ReplayedSessionVariablesProvider.class);
             when(variablesProvider.getVariables()).thenReturn(Collections.singleton("sql_mode"));
             typedSPILoader.when(() -> TypedSPILoader.findService(ReplayedSessionVariablesProvider.class, "MySQL")).thenReturn(Optional.of(variablesProvider));
-            new MySQLDefaultSessionVariableHandler().handle(connectionSession, "sql_mode", "''");
+            final MySQLDefaultSessionVariableHandler defaultSessionVariableHandler = new MySQLDefaultSessionVariableHandler();
+            defaultSessionVariableHandler.handle(connectionSession, "sql_mode", "''");
             verify(connectionSession.getRequiredSessionVariableRecorder()).setVariable("sql_mode", "''");
+            defaultSessionVariableHandler.handle(connectionSession, "@variable_name", "'variable_value'");
+            verify(connectionSession.getRequiredSessionVariableRecorder()).setVariable("@variable_name", "'variable_value'");
         }
     }
 }