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

lide pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d7d166355a [feature](cmd) add UNSET_VARIABLE statement to  set back 
variables (#27552)
3d7d166355a is described below

commit 3d7d166355ae54a8ebb7bcfc7bf9c850b637cd57
Author: Yulei-Yang <yulei.yang0...@gmail.com>
AuthorDate: Mon Nov 27 20:30:04 2023 +0800

    [feature](cmd) add UNSET_VARIABLE statement to  set back variables (#27552)
---
 fe/fe-core/src/main/cup/sql_parser.cup             |  22 ++-
 .../apache/doris/analysis/UnsetVariableStmt.java   |  97 +++++++++++++
 .../java/org/apache/doris/qe/StmtExecutor.java     |  28 ++++
 .../main/java/org/apache/doris/qe/VariableMgr.java |  29 ++++
 fe/fe-core/src/main/jflex/sql_scanner.flex         |   2 +
 .../data/variable_p0/set_and_unset_variable.out    | 157 +++++++++++++++++++++
 .../variable_p0/set_and_unset_variable.groovy      |  84 +++++++++++
 7 files changed, 418 insertions(+), 1 deletion(-)

diff --git a/fe/fe-core/src/main/cup/sql_parser.cup 
b/fe/fe-core/src/main/cup/sql_parser.cup
index 1cdedf23952..b47880fe92d 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -631,6 +631,7 @@ terminal String
     KW_UNION,
     KW_UNIQUE,
     KW_UNLOCK,
+    KW_UNSET,
     KW_UNSIGNED,
     KW_UPDATE,
     KW_USE,
@@ -639,6 +640,7 @@ terminal String
     KW_VALUE,
     KW_VALUES,
     KW_VARCHAR,
+    KW_VARIABLE,
     KW_VARIABLES,
     KW_VERBOSE,
     KW_VERSION,
@@ -683,7 +685,7 @@ nonterminal List<StatementBase> stmts;
 nonterminal StatementBase stmt, show_stmt, show_param, help_stmt, load_stmt,
     create_routine_load_stmt, pause_routine_load_stmt, 
resume_routine_load_stmt, stop_routine_load_stmt,
     show_routine_load_stmt, show_routine_load_task_stmt, 
show_create_routine_load_stmt, show_create_load_stmt, 
show_create_reporitory_stmt,
-    describe_stmt, alter_stmt,
+    describe_stmt, alter_stmt, unset_var_stmt,
     create_job_stmt,pause_job_stmt,resume_job_stmt,stop_job_stmt,show_job_stmt,
     use_stmt, kill_stmt, drop_stmt, recover_stmt, grant_stmt, revoke_stmt, 
create_stmt, set_stmt, sync_stmt, cancel_stmt, cancel_param, delete_stmt,
     switch_stmt, transaction_stmt, unsupported_stmt, export_stmt, admin_stmt, 
truncate_stmt,
@@ -1109,6 +1111,8 @@ stmt ::=
     {: RESULT = use; :}
     | set_stmt:set
     {: RESULT = set; :}
+    | unset_var_stmt:stmt
+    {: RESULT = stmt; :}
     | kill_stmt:kill
     {: RESULT = kill; :}
     | kill_analysis_job_stmt: k
@@ -4935,6 +4939,18 @@ set_stmt ::=
     :}
     ;
 
+// Unset variable statement
+unset_var_stmt ::=
+    KW_UNSET opt_var_type:type KW_VARIABLE variable_name:variable
+    {:
+        RESULT = new UnsetVariableStmt(type, variable);
+    :}
+    | KW_UNSET opt_var_type:type KW_VARIABLE KW_ALL
+    {:
+        RESULT = new UnsetVariableStmt(type, true);
+    :}
+    ;
+
 user_property_list ::=
     user_property:property
     {:
@@ -7701,6 +7717,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_USER:id
     {: RESULT = id; :}
+    | KW_VARIABLE:id
+    {: RESULT = id; :}
     | KW_VARIABLES:id
     {: RESULT = id; :}
     | KW_VALUE:id
@@ -7807,6 +7825,8 @@ keyword ::=
     {: RESULT = id; :}
     | KW_CRON:id
     {: RESULT = id; :}
+    | KW_UNSET:id
+    {: RESULT = id; :}
     ;
 
 // Identifier that contain keyword
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/UnsetVariableStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/UnsetVariableStmt.java
new file mode 100644
index 00000000000..1f456eb5b7a
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/UnsetVariableStmt.java
@@ -0,0 +1,97 @@
+// 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.doris.analysis;
+
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.UserException;
+
+import com.amazonaws.util.StringUtils;
+
+// Unset variables statement
+public class UnsetVariableStmt extends StatementBase {
+    private SetType setType;
+
+    // variables to restore
+    private String variable = null;
+
+    private boolean applyToAll = false;
+
+    public UnsetVariableStmt(SetType setType, String varName) {
+        this.setType = setType;
+        this.variable = varName;
+    }
+
+    public UnsetVariableStmt(SetType setType, boolean applyToAll) {
+        this.setType = setType;
+        this.applyToAll = applyToAll;
+    }
+
+    public SetType getSetType() {
+        return setType;
+    }
+
+    public String getVariable() {
+        return variable;
+    }
+
+    public boolean isApplyToAll() {
+        return applyToAll;
+    }
+
+    // change type global to session avoid to write in non-master node.
+    public void modifySetVarsForExecute() {
+        if (setType == SetType.GLOBAL) {
+            setType = SetType.SESSION;
+        }
+    }
+
+    @Override
+    public void analyze(Analyzer analyzer) throws UserException {
+        if (StringUtils.isNullOrEmpty(variable) && !applyToAll) {
+            throw new AnalysisException("You should specific the unset 
variable.");
+        }
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("UNSET ");
+        sb.append(setType).append(" VARIABLE ");
+        if (!StringUtils.isNullOrEmpty(variable)) {
+            sb.append(variable).append(" ");
+        } else if (applyToAll) {
+            sb.append("ALL");
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return toSql();
+    }
+
+    @Override
+    public RedirectStatus getRedirectStatus() {
+        if (setType == SetType.GLOBAL) {
+            return RedirectStatus.FORWARD_WITH_SYNC;
+        }
+
+        return RedirectStatus.NO_FORWARD;
+    }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 9398a476876..8340e3b13e5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -57,6 +57,7 @@ import org.apache.doris.analysis.SelectStmt;
 import org.apache.doris.analysis.SetOperationStmt;
 import org.apache.doris.analysis.SetStmt;
 import org.apache.doris.analysis.SetVar;
+import org.apache.doris.analysis.SetVar.SetVarType;
 import org.apache.doris.analysis.ShowStmt;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.analysis.SqlParser;
@@ -72,6 +73,7 @@ import org.apache.doris.analysis.TransactionRollbackStmt;
 import org.apache.doris.analysis.TransactionStmt;
 import org.apache.doris.analysis.UnifiedLoadStmt;
 import org.apache.doris.analysis.UnlockTablesStmt;
+import org.apache.doris.analysis.UnsetVariableStmt;
 import org.apache.doris.analysis.UnsupportedStmt;
 import org.apache.doris.analysis.UpdateStmt;
 import org.apache.doris.analysis.UseStmt;
@@ -735,6 +737,8 @@ public class StmtExecutor {
                 handleQueryWithRetry(queryId);
             } else if (parsedStmt instanceof SetStmt) {
                 handleSetStmt();
+            } else if (parsedStmt instanceof UnsetVariableStmt) {
+                handleUnsetVariableStmt();
             } else if (parsedStmt instanceof SwitchStmt) {
                 handleSwitchStmt();
             } else if (parsedStmt instanceof UseStmt) {
@@ -1271,6 +1275,30 @@ public class StmtExecutor {
         context.getState().setOk();
     }
 
+    // Process unset variable statement.
+    private void handleUnsetVariableStmt() {
+        try {
+            UnsetVariableStmt unsetStmt = (UnsetVariableStmt) parsedStmt;
+            if (unsetStmt.isApplyToAll()) {
+                
VariableMgr.setAllVarsToDefaultValue(context.getSessionVariable(), 
unsetStmt.getSetType());
+            } else {
+                String defaultValue = 
VariableMgr.getDefaultValue(unsetStmt.getVariable());
+                if (defaultValue == null) {
+                    
ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_SYSTEM_VARIABLE, 
unsetStmt.getVariable());
+                }
+                SetVar var = new SetVar(unsetStmt.getSetType(), 
unsetStmt.getVariable(),
+                        new StringLiteral(defaultValue), 
SetVarType.SET_SESSION_VAR);
+                VariableMgr.setVar(context.getSessionVariable(), var);
+            }
+        } catch (DdlException e) {
+            LOG.warn("", e);
+            // Return error message to client.
+            context.getState().setError(ErrorCode.ERR_LOCAL_VARIABLE, 
e.getMessage());
+            return;
+        }
+        context.getState().setOk();
+    }
+
     // send values from cache.
     // return true if the meta fields has been sent, otherwise, return false.
     // the meta fields must be sent right before the first batch of data(or 
eos flag).
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
index 917a80ac5a9..58e3646937a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
@@ -20,6 +20,8 @@ package org.apache.doris.qe;
 import org.apache.doris.analysis.LiteralExpr;
 import org.apache.doris.analysis.SetType;
 import org.apache.doris.analysis.SetVar;
+import org.apache.doris.analysis.SetVar.SetVarType;
+import org.apache.doris.analysis.StringLiteral;
 import org.apache.doris.analysis.VariableExpr;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.Type;
@@ -648,6 +650,33 @@ public class VariableMgr {
         return ImmutableMap.copyOf(result);
     }
 
+    public static void setAllVarsToDefaultValue(SessionVariable 
sessionVariable, SetType setType)
+            throws DdlException {
+        for (Map.Entry<String, VarContext> entry : 
ctxByDisplayVarName.entrySet()) {
+            VarContext varCtx = entry.getValue();
+
+            SetType newSetType = null;
+            // some variables are GLOBAL only or SESSION only
+            if ((varCtx.getFlag() & GLOBAL) != 0) {
+                newSetType = SetType.GLOBAL;
+            } else if ((varCtx.getFlag() & SESSION_ONLY) != 0) {
+                newSetType = SetType.SESSION;
+            }
+
+            SetVar setVar = new SetVar(newSetType != null ? newSetType : 
setType, entry.getKey(),
+                    new StringLiteral(varCtx.defaultValue), 
SetVarType.SET_SESSION_VAR);
+            //skip read only variables
+            if ((varCtx.getFlag() & READ_ONLY) == 0) {
+                setVar(sessionVariable, setVar);
+            }
+        }
+    }
+
+    public static String getDefaultValue(String key) {
+        VarContext varContext = ctxByDisplayVarName.get(key);
+        return varContext == null ? null : varContext.defaultValue;
+    }
+
     // Dump all fields. Used for `show variables`
     public static List<List<String>> dump(SetType type, SessionVariable 
sessionVar, PatternMatcher matcher) {
         List<List<String>> rows = Lists.newArrayList();
diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex 
b/fe/fe-core/src/main/jflex/sql_scanner.flex
index 3bb65206470..23fb26ef478 100644
--- a/fe/fe-core/src/main/jflex/sql_scanner.flex
+++ b/fe/fe-core/src/main/jflex/sql_scanner.flex
@@ -514,6 +514,8 @@ import org.apache.doris.qe.SqlModeHelper;
         keywordMap.put("expired", new Integer(SqlParserSymbols.KW_EXPIRED));
         keywordMap.put("cron", new Integer(SqlParserSymbols.KW_CRON));
         keywordMap.put("convert_light_schema_change_process", new 
Integer(SqlParserSymbols.KW_CONVERT_LSC));
+        keywordMap.put("unset", new Integer(SqlParserSymbols.KW_UNSET));
+        keywordMap.put("variable", new Integer(SqlParserSymbols.KW_VARIABLE));
    }
     
   // map from token id to token description
diff --git a/regression-test/data/variable_p0/set_and_unset_variable.out 
b/regression-test/data/variable_p0/set_and_unset_variable.out
new file mode 100644
index 00000000000..6069e583a03
--- /dev/null
+++ b/regression-test/data/variable_p0/set_and_unset_variable.out
@@ -0,0 +1,157 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !cmd --
+0
+
+-- !cmd --
+wait_timeout   1000    28800   1
+
+-- !cmd --
+0
+
+-- !cmd --
+wait_timeout   28800   28800   0
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    BLOOM_FILTER    8       1
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    BLOOM_FILTER    8       1
+
+-- !cmd --
+runtime_filter_type    BLOOM_FILTER    8       1
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+0
+
+-- !cmd --
+experimental_enable_agg_state  true    -       -
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+experimental_enable_agg_state  true    -       -
+
+-- !cmd --
+experimental_enable_agg_state  true    -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+deprecated_enable_local_exchange       false   -       -
+
+-- !cmd --
+deprecated_enable_local_exchange       true    -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+deprecated_enable_local_exchange       true    -       -
+
+-- !cmd --
+deprecated_enable_local_exchange       true    -       -
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+deprecated_enable_local_exchange       true    -       -
+
+-- !cmd --
+show_hidden_columns    false   false   0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+0
+
+-- !cmd --
+runtime_filter_type    IN_OR_BLOOM_FILTER      8       1
+
+-- !cmd --
+experimental_enable_agg_state  false   -       -
+
+-- !cmd --
+deprecated_enable_local_exchange       true    -       -
+
+-- !cmd --
+show_hidden_columns    false   false   0
+
diff --git a/regression-test/suites/variable_p0/set_and_unset_variable.groovy 
b/regression-test/suites/variable_p0/set_and_unset_variable.groovy
new file mode 100644
index 00000000000..18fae2a8c2f
--- /dev/null
+++ b/regression-test/suites/variable_p0/set_and_unset_variable.groovy
@@ -0,0 +1,84 @@
+// 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.
+
+suite("set_and_unset_variable") {
+
+    qt_cmd """set wait_timeout = 1000"""
+    qt_cmd """show variables like 'wait_timeout'"""
+    qt_cmd """UNSET VARIABLE wait_timeout"""
+    qt_cmd """show variables like 'wait_timeout'"""
+
+    qt_cmd """set runtime_filter_type='BLOOM_FILTER'"""
+    qt_cmd """show session variables like 'runtime_filter_type'"""
+    qt_cmd """show global variables like 'runtime_filter_type'"""
+    qt_cmd """UNSET VARIABLE runtime_filter_type"""
+    qt_cmd """show session variables like 'runtime_filter_type'"""
+    qt_cmd """show global variables like 'runtime_filter_type'"""
+
+    qt_cmd """set global runtime_filter_type='BLOOM_FILTER'"""
+    qt_cmd """show session variables like 'runtime_filter_type'"""
+    qt_cmd """show global variables like 'runtime_filter_type'"""
+    qt_cmd """UNSET global VARIABLE runtime_filter_type"""
+    qt_cmd """show session variables like 'runtime_filter_type'"""
+    qt_cmd """show global variables like 'runtime_filter_type'"""
+
+    // test variables with experimental_ prefix in session scope
+    qt_cmd """set experimental_enable_agg_state='true'"""
+    qt_cmd """show session variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show global variables like 'experimental_enable_agg_state'"""
+    qt_cmd """UNSET VARIABLE experimental_enable_agg_state"""
+    qt_cmd """show session variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show global variables like 'experimental_enable_agg_state'"""
+
+    // test variables with experimental_ prefix in global scope
+    qt_cmd """set global experimental_enable_agg_state='true'"""
+    qt_cmd """show session variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show global variables like 'experimental_enable_agg_state'"""
+    qt_cmd """UNSET global VARIABLE experimental_enable_agg_state"""
+    qt_cmd """show session variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show global variables like 'experimental_enable_agg_state'"""
+
+    // test variables with deprecated_ prefix
+    qt_cmd """set deprecated_enable_local_exchange = false"""
+    qt_cmd """show session variables like 'deprecated_enable_local_exchange'"""
+    qt_cmd """show global variables like 'deprecated_enable_local_exchange'"""
+    qt_cmd """UNSET global VARIABLE deprecated_enable_local_exchange"""
+    qt_cmd """show session variables like 'deprecated_enable_local_exchange'"""
+    qt_cmd """show global variables like 'deprecated_enable_local_exchange'"""
+
+    // test UNSET VARIABLE ALL
+    qt_cmd """set runtime_filter_type='BLOOM_FILTER'"""
+    qt_cmd """set experimental_enable_agg_state='true'"""
+    qt_cmd """set deprecated_enable_local_exchange = false"""
+    qt_cmd """set show_hidden_columns=true"""
+    qt_cmd """UNSET VARIABLE ALL"""
+    qt_cmd """show session variables like 'runtime_filter_type'"""
+    qt_cmd """show session variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show session variables like 'deprecated_enable_local_exchange'"""
+    qt_cmd """show session variables like 'show_hidden_columns'"""
+
+    // test UNSET GLOBAL VARIABLE ALL
+    qt_cmd """set global runtime_filter_type='BLOOM_FILTER'"""
+    qt_cmd """set global experimental_enable_agg_state='true'"""
+    qt_cmd """set global deprecated_enable_local_exchange = false"""
+    qt_cmd """set show_hidden_columns=true"""
+    qt_cmd """UNSET global VARIABLE ALL"""
+    qt_cmd """show global variables like 'runtime_filter_type'"""
+    qt_cmd """show global variables like 'experimental_enable_agg_state'"""
+    qt_cmd """show global variables like 'deprecated_enable_local_exchange'"""
+    qt_cmd """show global variables like 'show_hidden_columns'"""
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to