From 3a3a8456f1badb49e173aeaa35211bf54bce0297 Mon Sep 17 00:00:00 2001 From: xueweizhang Date: Fri, 2 Aug 2024 17:03:18 +0800 Subject: [PATCH] [fix](session) fix select * from variables system table (#34529) after #23017, information_schema.session_variables and information_schema.global_variables had 2 new columns, but SchemaVariablesScanner just 2 columns. when select * from *_variables, will get 'no match column for this column' error Signed-off-by: nextdreamblue --- .../schema_variables_scanner.cpp | 37 +++++++++++++++---- .../doris/service/FrontendServiceImpl.java | 11 ++---- gensrc/thrift/FrontendService.thrift | 2 +- .../variable_p0/set_and_unset_variable.out | 6 +++ .../variable_p0/set_and_unset_variable.groovy | 4 ++ 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/be/src/exec/schema_scanner/schema_variables_scanner.cpp b/be/src/exec/schema_scanner/schema_variables_scanner.cpp index 5efcee07b76a17..7e81f335bec927 100644 --- a/be/src/exec/schema_scanner/schema_variables_scanner.cpp +++ b/be/src/exec/schema_scanner/schema_variables_scanner.cpp @@ -40,7 +40,8 @@ std::vector SchemaVariablesScanner::_s_vars_columns = // name, type, size {"VARIABLE_NAME", TYPE_VARCHAR, sizeof(StringRef), false}, {"VARIABLE_VALUE", TYPE_VARCHAR, sizeof(StringRef), false}, -}; + {"DEFAULT_VALUE", TYPE_VARCHAR, sizeof(StringRef), false}, + {"CHANGED", TYPE_VARCHAR, sizeof(StringRef), false}}; SchemaVariablesScanner::SchemaVariablesScanner(TVarType::type type) : SchemaScanner(_s_vars_columns, TSchemaTableType::SCH_VARIABLES), _type(type) {} @@ -91,26 +92,48 @@ Status SchemaVariablesScanner::_fill_block_impl(vectorized::Block* block) { std::vector datas(row_num); // variables names { - StringRef strs[row_num]; + std::vector strs(row_num); int idx = 0; for (auto& it : _var_result.variables) { - strs[idx] = StringRef(it.first.c_str(), it.first.size()); - datas[idx] = strs + idx; + strs[idx] = StringRef(it[0].c_str(), it[0].size()); + datas[idx] = strs.data() + idx; ++idx; } fill_dest_column_for_range(block, 0, datas); } // value { - StringRef strs[row_num]; + std::vector strs(row_num); int idx = 0; for (auto& it : _var_result.variables) { - strs[idx] = StringRef(it.second.c_str(), it.second.size()); - datas[idx] = strs + idx; + strs[idx] = StringRef(it[1].c_str(), it[1].size()); + datas[idx] = strs.data() + idx; ++idx; } fill_dest_column_for_range(block, 1, datas); } + // default value + { + std::vector strs(row_num); + int idx = 0; + for (auto& it : _var_result.variables) { + strs[idx] = StringRef(it[2].c_str(), it[2].size()); + datas[idx] = strs.data() + idx; + ++idx; + } + RETURN_IF_ERROR(fill_dest_column_for_range(block, 2, datas)); + } + // changed + { + std::vector strs(row_num); + int idx = 0; + for (auto& it : _var_result.variables) { + strs[idx] = StringRef(it[3].c_str(), it[3].size()); + datas[idx] = strs.data() + idx; + ++idx; + } + RETURN_IF_ERROR(fill_dest_column_for_range(block, 3, datas)); + } return Status::OK(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java index e67534d302b9c7..86755cf9ece1e5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java @@ -1038,18 +1038,15 @@ public TColumnDesc getColumnDesc(Column column) { @Override public TShowVariableResult showVariables(TShowVariableRequest params) throws TException { TShowVariableResult result = new TShowVariableResult(); - Map map = Maps.newHashMap(); - result.setVariables(map); + List> vars = Lists.newArrayList(); + result.setVariables(vars); // Find connect ConnectContext ctx = exeEnv.getScheduler().getContext((int) params.getThreadId()); if (ctx == null) { return result; } - List> rows = VariableMgr.dump(SetType.fromThrift(params.getVarType()), ctx.getSessionVariable(), - null); - for (List row : rows) { - map.put(row.get(0), row.get(1)); - } + vars = VariableMgr.dump(SetType.fromThrift(params.getVarType()), ctx.getSessionVariable(), null); + result.setVariables(vars); return result; } diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift index 3636a9acf7f1ef..6a6d243762791b 100644 --- a/gensrc/thrift/FrontendService.thrift +++ b/gensrc/thrift/FrontendService.thrift @@ -104,7 +104,7 @@ struct TShowVariableRequest { // Results of a call to describeTable() struct TShowVariableResult { - 1: required map variables + 1: required list> variables } // Valid table file formats diff --git a/regression-test/data/variable_p0/set_and_unset_variable.out b/regression-test/data/variable_p0/set_and_unset_variable.out index 5436bc1322f1ed..1651449cfc8126 100644 --- a/regression-test/data/variable_p0/set_and_unset_variable.out +++ b/regression-test/data/variable_p0/set_and_unset_variable.out @@ -104,6 +104,9 @@ experimental_enable_agg_state false false 0 -- !cmd -- show_hidden_columns false false 0 +-- !cmd -- +show_hidden_columns false false 0 + -- !cmd -- 0 @@ -125,3 +128,6 @@ experimental_enable_agg_state false false 0 -- !cmd -- show_hidden_columns false false 0 +-- !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 index 53e5bb79bd9509..b434b00630eb09 100644 --- a/regression-test/suites/variable_p0/set_and_unset_variable.groovy +++ b/regression-test/suites/variable_p0/set_and_unset_variable.groovy @@ -61,6 +61,8 @@ suite("set_and_unset_variable") { qt_cmd """show session variables like 'experimental_enable_agg_state'""" 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'""" @@ -69,4 +71,6 @@ suite("set_and_unset_variable") { 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 'show_hidden_columns'""" + + qt_cmd """select * from information_schema.global_variables where variable_name = 'show_hidden_columns'""" } \ No newline at end of file