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