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'");
}
}
}