From a1babf84fde311041e691e61920b99eeaea6bbbb Mon Sep 17 00:00:00 2001 From: LiBinfeng <1204975323@qq.com> Date: Wed, 30 Oct 2024 16:14:23 +0800 Subject: [PATCH] [Feat](Nereids) support unset command --- .../org/apache/doris/nereids/DorisParser.g4 | 12 +- .../nereids/parser/LogicalPlanBuilder.java | 26 ++ .../doris/nereids/trees/plans/PlanType.java | 2 + .../UnsetDefaultStorageVaultCommand.java | 70 ++++++ .../plans/commands/UnsetVariableCommand.java | 160 +++++++++++++ .../trees/plans/visitor/CommandVisitor.java | 11 + .../ddl/unset_commands/unset_command.out | 163 +++++++++++++ .../ddl/unset_commands/unset_command.groovy | 226 ++++++++++++++++++ 8 files changed, 666 insertions(+), 4 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetDefaultStorageVaultCommand.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetVariableCommand.java create mode 100644 regression-test/data/nereids_p0/ddl/unset_commands/unset_command.out create mode 100644 regression-test/suites/nereids_p0/ddl/unset_commands/unset_command.groovy diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 80da53a51bde33..46a58f84c85747 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -54,12 +54,13 @@ statementBase | constraintStatement #constraintStatementAlias | supportedDropStatement #supportedDropStatementAlias | supportedSetStatement #supportedSetStatementAlias + | supportedUnsetVariableStatement #supportedUnsetVariableStatementAlias + | supportedUnsetDefaultStorageVaultStatement #supportedUnsetDefaultStorageVaultStatementAlias | unsupportedStatement #unsupported ; unsupportedStatement - : unsupoortedUnsetStatement - | unsupportedUseStatement + : unsupportedUseStatement | unsupportedDmlStatement | unsupportedKillStatement | unsupportedDescribeStatement @@ -839,9 +840,12 @@ isolationLevel : ISOLATION LEVEL ((READ UNCOMMITTED) | (READ COMMITTED) | (REPEATABLE READ) | (SERIALIZABLE)) ; -unsupoortedUnsetStatement +supportedUnsetVariableStatement : UNSET (GLOBAL | SESSION | LOCAL)? VARIABLE (ALL | identifier) - | UNSET DEFAULT STORAGE VAULT + ; + +supportedUnsetDefaultStorageVaultStatement + : UNSET DEFAULT STORAGE VAULT ; unsupportedUseStatement diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index a15966ed55f3be..bd39d2e010c47e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -205,6 +205,8 @@ import org.apache.doris.nereids.DorisParser.StructLiteralContext; import org.apache.doris.nereids.DorisParser.SubqueryContext; import org.apache.doris.nereids.DorisParser.SubqueryExpressionContext; +import org.apache.doris.nereids.DorisParser.SupportedUnsetDefaultStorageVaultStatementContext; +import org.apache.doris.nereids.DorisParser.SupportedUnsetVariableStatementContext; import org.apache.doris.nereids.DorisParser.SystemVariableContext; import org.apache.doris.nereids.DorisParser.TableAliasContext; import org.apache.doris.nereids.DorisParser.TableNameContext; @@ -421,6 +423,8 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; +import org.apache.doris.nereids.trees.plans.commands.UnsetDefaultStorageVaultCommand; +import org.apache.doris.nereids.trees.plans.commands.UnsetVariableCommand; import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand; import org.apache.doris.nereids.trees.plans.commands.UpdateCommand; import org.apache.doris.nereids.trees.plans.commands.info.AlterMTMVInfo; @@ -3823,6 +3827,28 @@ public Object visitUnsupported(UnsupportedContext ctx) { return UnsupportedCommand.INSTANCE; } + @Override + public LogicalPlan visitSupportedUnsetVariableStatement(SupportedUnsetVariableStatementContext ctx) { + SetType type = SetType.DEFAULT; + if (ctx.GLOBAL() != null) { + type = SetType.GLOBAL; + } else if (ctx.LOCAL() != null || ctx.SESSION() != null) { + type = SetType.SESSION; + } + if (ctx.ALL() != null) { + return new UnsetVariableCommand(type, true); + } else if (ctx.identifier() != null) { + return new UnsetVariableCommand(type, ctx.identifier().getText()); + } + throw new AnalysisException("Should add 'ALL' or variable name"); + } + + @Override + public LogicalPlan visitSupportedUnsetDefaultStorageVaultStatement( + SupportedUnsetDefaultStorageVaultStatementContext ctx) { + return new UnsetDefaultStorageVaultCommand(); + } + @Override public LogicalPlan visitCreateTableLike(CreateTableLikeContext ctx) { List nameParts = visitMultipartIdentifier(ctx.name); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java index 988ca381304f8e..0dfa4ae396a901 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java @@ -163,6 +163,8 @@ public enum PlanType { ALTER_VIEW_COMMAND, ALTER_STORAGE_VAULT, DROP_CATALOG_RECYCLE_BIN_COMMAND, + UNSET_VARIABLE_COMMAND, + UNSET_DEFAULT_STORAGE_VAULT_COMMAND, UNSUPPORTED_COMMAND, CREATE_TABLE_LIKE_COMMAND, SET_OPTIONS_COMMAND, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetDefaultStorageVaultCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetDefaultStorageVaultCommand.java new file mode 100644 index 00000000000000..80f2bdaf20ff35 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetDefaultStorageVaultCommand.java @@ -0,0 +1,70 @@ +// 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.nereids.trees.plans.commands; + +import org.apache.doris.catalog.Env; +import org.apache.doris.cloud.catalog.CloudEnv; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.FeConstants; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +/** + * Unset Default Storage Vault Command + */ +public class UnsetDefaultStorageVaultCommand extends Command implements ForwardWithSync { + public UnsetDefaultStorageVaultCommand() { + super(PlanType.UNSET_DEFAULT_STORAGE_VAULT_COMMAND); + } + + public String toSql() { + final String stmt = "UNSET DEFAULT STORAGE VAULT"; + return stmt; + } + + @Override + public void run(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (Config.isNotCloudMode()) { + throw new AnalysisException("Storage Vault is only supported for cloud mode"); + } + if (!FeConstants.runningUnitTest) { + // In legacy cloud mode, some s3 back-ended storage does need to use storage vault. + if (!((CloudEnv) Env.getCurrentEnv()).getEnableStorageVault()) { + throw new AnalysisException("Your cloud instance doesn't support storage vault"); + } + } + + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "ADMIN"); + } + + ctx.getEnv().getStorageVaultMgr().unsetDefaultStorageVault(); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitUnsetDefaultStorageVaultCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetVariableCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetVariableCommand.java new file mode 100644 index 00000000000000..2f9aa3822ea759 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UnsetVariableCommand.java @@ -0,0 +1,160 @@ +// 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.nereids.trees.plans.commands; + +import org.apache.doris.analysis.RedirectStatus; +import org.apache.doris.analysis.SetType; +import org.apache.doris.analysis.SetVar; +import org.apache.doris.analysis.StringLiteral; +import org.apache.doris.catalog.Env; +import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.DdlException; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.UserException; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; +import org.apache.doris.qe.VariableMgr; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * UnSetVarOp + */ +public class UnsetVariableCommand extends Command implements Forward { + private static final Logger LOG = LogManager.getLogger(StmtExecutor.class); + + private SetType setType; + + // variables to restore + private String variable = null; + + private boolean applyToAll = false; + + public UnsetVariableCommand(SetType setType, String varName) { + super(PlanType.UNSET_VARIABLE_COMMAND); + this.setType = setType; + this.variable = varName; + } + + public UnsetVariableCommand(SetType setType, boolean applyToAll) { + super(PlanType.UNSET_VARIABLE_COMMAND); + this.setType = setType; + this.applyToAll = applyToAll; + } + + public SetType getSetType() { + return setType; + } + + public String getVariable() { + return variable; + } + + public boolean isApplyToAll() { + return applyToAll; + } + + private void validate() throws UserException { + if (StringUtils.isEmpty(variable) && !applyToAll) { + throw new AnalysisException("You should specific the unset variable."); + } + + if (setType == SetType.GLOBAL) { + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, + "ADMIN"); + } + } + } + + /** + * return sql expression of this command + * @return string of this command + */ + public String toSql() { + StringBuilder sb = new StringBuilder(); + + sb.append("UNSET "); + sb.append(setType).append(" VARIABLE "); + if (!StringUtils.isEmpty(variable)) { + sb.append(variable).append(" "); + } else if (applyToAll) { + sb.append("ALL"); + } + return sb.toString(); + } + + @Override + public RedirectStatus toRedirectStatus() { + if (setType == SetType.GLOBAL) { + return RedirectStatus.FORWARD_WITH_SYNC; + } + + return RedirectStatus.NO_FORWARD; + } + + @Override + public void afterForwardToMaster(ConnectContext context) throws Exception { + if (isApplyToAll()) { + VariableMgr.setAllVarsToDefaultValue(context.getSessionVariable(), SetType.SESSION); + } else { + String defaultValue = VariableMgr.getDefaultValue(getVariable()); + if (defaultValue == null) { + ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_SYSTEM_VARIABLE, getVariable()); + } + SetVar var = new SetVar(SetType.SESSION, getVariable(), + new StringLiteral(defaultValue), SetVar.SetVarType.SET_SESSION_VAR); + VariableMgr.setVar(context.getSessionVariable(), var); + } + } + + @Override + public void run(ConnectContext ctx, StmtExecutor executor) throws Exception { + validate(); + try { + if (isApplyToAll()) { + VariableMgr.setAllVarsToDefaultValue(ctx.getSessionVariable(), getSetType()); + } else { + String defaultValue = VariableMgr.getDefaultValue(getVariable()); + if (defaultValue == null) { + ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_SYSTEM_VARIABLE, getVariable()); + } + SetVar var = new SetVar(getSetType(), getVariable(), + new StringLiteral(defaultValue), SetVar.SetVarType.SET_SESSION_VAR); + VariableMgr.setVar(ctx.getSessionVariable(), var); + } + } catch (DdlException e) { + LOG.warn("", e); + // Return error message to client. + ctx.getState().setError(ErrorCode.ERR_LOCAL_VARIABLE, e.getMessage() + toSql()); + return; + } + ctx.getState().setOk(); + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitUnsetVariableCommand(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index 03e2853ffa0d12..814596bca31a91 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -52,6 +52,8 @@ import org.apache.doris.nereids.trees.plans.commands.ShowCreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.ShowCreateProcedureCommand; import org.apache.doris.nereids.trees.plans.commands.ShowProcedureStatusCommand; +import org.apache.doris.nereids.trees.plans.commands.UnsetDefaultStorageVaultCommand; +import org.apache.doris.nereids.trees.plans.commands.UnsetVariableCommand; import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand; import org.apache.doris.nereids.trees.plans.commands.UpdateCommand; import org.apache.doris.nereids.trees.plans.commands.insert.BatchInsertIntoTableCommand; @@ -198,6 +200,15 @@ default R visitUnsupportedCommand(UnsupportedCommand unsupportedCommand, C conte return visitCommand(unsupportedCommand, context); } + default R visitUnsetVariableCommand(UnsetVariableCommand unsetVariableCommand, C context) { + return visitCommand(unsetVariableCommand, context); + } + + default R visitUnsetDefaultStorageVaultCommand(UnsetDefaultStorageVaultCommand unsetDefaultStorageVaultCommand, + C context) { + return visitCommand(unsetDefaultStorageVaultCommand, context); + } + default R visitCreateTableLikeCommand(CreateTableLikeCommand createTableLikeCommand, C context) { return visitCommand(createTableLikeCommand, context); } diff --git a/regression-test/data/nereids_p0/ddl/unset_commands/unset_command.out b/regression-test/data/nereids_p0/ddl/unset_commands/unset_command.out new file mode 100644 index 00000000000000..73dd8eb22c1084 --- /dev/null +++ b/regression-test/data/nereids_p0/ddl/unset_commands/unset_command.out @@ -0,0 +1,163 @@ +-- 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 -- +wait_timeout 28800 28800 0 + +-- !cmd -- +0 + +-- !cmd -- +runtime_filter_type BLOOM_FILTER IN_OR_BLOOM_FILTER,MIN_MAX 1 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +0 + +-- !cmd -- +runtime_filter_type BLOOM_FILTER IN_OR_BLOOM_FILTER,MIN_MAX 1 + +-- !cmd -- +runtime_filter_type BLOOM_FILTER IN_OR_BLOOM_FILTER,MIN_MAX 1 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +0 + +-- !cmd -- +experimental_enable_agg_state true false 1 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +0 + +-- !cmd -- +experimental_enable_agg_state true false 1 + +-- !cmd -- +experimental_enable_agg_state true false 1 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +0 + +-- !cmd -- +deprecated_enable_local_exchange false true 1 + +-- !cmd -- +deprecated_enable_local_exchange true true 0 + +-- !cmd -- +deprecated_enable_local_exchange true true 0 + +-- !cmd -- +deprecated_enable_local_exchange true true 0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +deprecated_enable_local_exchange true true 0 + +-- !cmd -- +show_hidden_columns false false 0 + +-- !cmd -- +show_hidden_columns false false 0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +0 + +-- !cmd -- +runtime_filter_type IN_OR_BLOOM_FILTER,MIN_MAX IN_OR_BLOOM_FILTER,MIN_MAX 0 + +-- !cmd -- +experimental_enable_agg_state false false 0 + +-- !cmd -- +deprecated_enable_local_exchange true true 0 + +-- !cmd -- +show_hidden_columns false false 0 + +-- !cmd -- +show_hidden_columns false false 0 + +-- !cmd -- +read_only true true 0 + +-- !cmd -- +0 + +-- !cmd -- +read_only true true 0 + +-- !cmd -- +read_only true true 0 + +-- !cmd -- +super_read_only true true 0 + +-- !cmd -- +0 + +-- !cmd -- +super_read_only true true 0 + +-- !cmd -- +super_read_only true true 0 + diff --git a/regression-test/suites/nereids_p0/ddl/unset_commands/unset_command.groovy b/regression-test/suites/nereids_p0/ddl/unset_commands/unset_command.groovy new file mode 100644 index 00000000000000..d34e40776dc800 --- /dev/null +++ b/regression-test/suites/nereids_p0/ddl/unset_commands/unset_command.groovy @@ -0,0 +1,226 @@ +// 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("unset_command") { + sql "set enable_nereids_planner=true" + sql "set enable_fallback_to_original_planner=false" + + profile("sql_unset_1") { + run { + sql """ + -- sql_unset_1 + UNSET VARIABLE ALL""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + profile("sql_unset_2") { + run { + sql """ + -- sql_unset_2 + UNSET global VARIABLE ALL""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + + qt_cmd """set wait_timeout = 1000""" + qt_cmd """show variables like 'wait_timeout'""" + + profile("sql_unset_3") { + run { + sql """ + -- sql_unset_3 + UNSET VARIABLE wait_timeout""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + profile("sql_unset_4") { + run { + sql """ + -- sql_unset_4 + UNSET VARIABLE runtime_filter_type""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + profile("sql_unset_5") { + run { + sql """ + -- sql_unset_5 + UNSET global VARIABLE runtime_filter_type""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + profile("sql_unset_6") { + run { + sql """ + -- sql_unset_6 + UNSET VARIABLE experimental_enable_agg_state""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + profile("sql_unset_7") { + run { + sql """ + -- sql_unset_7 + UNSET global VARIABLE experimental_enable_agg_state""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + profile("sql_unset_8") { + run { + sql """ + -- sql_unset_8 + UNSET global VARIABLE deprecated_enable_local_exchange""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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""" + profile("sql_unset_9") { + run { + sql """ + -- sql_unset_9 + UNSET VARIABLE ALL""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + + qt_cmd """select * from information_schema.session_variables where variable_name = '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""" + profile("sql_unset_10") { + run { + sql """ + -- sql_unset_10 + UNSET global VARIABLE ALL""" + } + + check { profileString, exception -> + log.info(profileString) + assertTrue(profileString.contains("- Is Nereids: Yes")) + } + } + 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'""" + + qt_cmd """select * from information_schema.global_variables where variable_name = 'show_hidden_columns'""" + + // test read_only + qt_cmd """show variables like 'read_only'""" + test { + sql "set read_only=true" + exception "should be set with SET GLOBAL" + } + qt_cmd "set global read_only=true" + qt_cmd """show global variables like 'read_only'""" + qt_cmd """show variables like 'read_only'""" + sql "set global read_only=false" + + // test super_read_only + qt_cmd """show variables like 'super_read_only'""" + test { + sql "set super_read_only=true" + exception "should be set with SET GLOBAL" + } + qt_cmd "set global super_read_only=true" + qt_cmd """show global variables like 'super_read_only'""" + qt_cmd """show variables like 'super_read_only'""" + sql "set global super_read_only=false" +}