From eb4162cf4a1050c873b429351dd0678fce1cc408 Mon Sep 17 00:00:00 2001 From: "hui.lv" Date: Wed, 16 Dec 2020 11:41:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0show=20variables=20like=20var?= =?UTF-8?q?=5Fstring=E8=AF=AD=E6=B3=95=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=AE=B0=E4=B8=8D=E6=B8=85=E5=8F=98=E9=87=8F=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E6=97=B6=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/parser/gram.y | 9 ++++++++- src/common/backend/utils/misc/guc.cpp | 16 ++++++++++++---- src/gausskernel/process/tcop/utility.cpp | 2 +- src/include/nodes/parsenodes.h | 1 + src/include/parser/kwlist.h | 1 + src/include/utils/guc.h | 2 +- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index 28b2df012..cc853cf5c 100755 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -697,7 +697,7 @@ static void ParseUpdateMultiSet(List *set_target_list, SelectStmt *stmt, core_yy UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLIMITED UNLISTEN UNLOCK UNLOGGED UNTIL UNUSABLE UPDATE USER USING - VACUUM VALID VALIDATE VALIDATION VALIDATOR VALUE_P VALUES VARCHAR VARCHAR2 VARIADIC VARRAY VARYING VCGROUP + VACUUM VALID VALIDATE VALIDATION VALIDATOR VALUE_P VALUES VARCHAR VARCHAR2 VARIABLES VARIADIC VARRAY VARYING VCGROUP VERBOSE VERIFY VERSION_P VIEW VOLATILE WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WORKLOAD WRAPPER WRITE @@ -2073,6 +2073,13 @@ VariableShowStmt: n->name = "session_authorization"; $$ = (Node *) n; } + | SHOW VARIABLES LIKE var_name + { + VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "all"; + n->likename = $4; + $$ =(Node *) n; + } | SHOW ALL { VariableShowStmt *n = makeNode(VariableShowStmt); diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp index 8b240dbfb..03a04000b 100644 --- a/src/common/backend/utils/misc/guc.cpp +++ b/src/common/backend/utils/misc/guc.cpp @@ -12278,7 +12278,7 @@ static void report_guc_option(struct config_generic* record); static void reapply_stacked_values(struct config_generic* variable, struct config_string* holder, GucStack* stack, const char* curvalue, GucContext curscontext, GucSource cursource); static void show_guc_config_option(const char* name, DestReceiver* dest); -static void show_all_guc_config(DestReceiver* dest); +static void show_all_guc_config(const char* likename, DestReceiver* dest); static char* _show_option(struct config_generic* record, bool use_units); static bool validate_option_array_item(const char* name, const char* value, bool skip_if_no_permissions); static void replace_config_value(char** optlines, char* name, char* value, config_type vartype); @@ -16898,10 +16898,10 @@ void EmitWarningsOnPlaceholders(const char* className) /* * SHOW command */ -void GetPGVariable(const char* name, DestReceiver* dest) +void GetPGVariable(const char* name, const char* likename, DestReceiver* dest) { if (guc_name_compare(name, "all") == 0) { - show_all_guc_config(dest); + show_all_guc_config(likename, dest); } else { show_guc_config_option(name, dest); } @@ -16960,7 +16960,7 @@ static void show_guc_config_option(const char* name, DestReceiver* dest) /* * SHOW ALL command */ -static void show_all_guc_config(DestReceiver* dest) +static void show_all_guc_config(const char* likename, DestReceiver* dest) { bool am_superuser = (GetUserId() == BOOTSTRAP_SUPERUSERID); int i; @@ -16968,6 +16968,7 @@ static void show_all_guc_config(DestReceiver* dest) TupleDesc tupdesc; Datum values[3]; bool isnull[3] = {false, false, false}; + char* ptr; /* need a tuple descriptor representing three TEXT columns */ tupdesc = CreateTemplateTupleDesc(3, false); @@ -16986,6 +16987,13 @@ static void show_all_guc_config(DestReceiver* dest) continue; } + if(NULL != likename) { + ptr = strstr((char*)conf->name, likename); + if (NULL == ptr) { + continue; + } + } + /* assign to the values array */ values[0] = PointerGetDatum(cstring_to_text(conf->name)); diff --git a/src/gausskernel/process/tcop/utility.cpp b/src/gausskernel/process/tcop/utility.cpp index 18c707dc7..1707631a7 100644 --- a/src/gausskernel/process/tcop/utility.cpp +++ b/src/gausskernel/process/tcop/utility.cpp @@ -4892,7 +4892,7 @@ void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamLi case T_VariableShowStmt: { VariableShowStmt* n = (VariableShowStmt*)parse_tree; - GetPGVariable(n->name, dest); + GetPGVariable(n->name, n->likename, dest); } break; case T_ShutdownStmt: { ShutdownStmt* n = (ShutdownStmt*)parse_tree; diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 3499cde47..a4632c712 100755 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1783,6 +1783,7 @@ typedef struct VariableSetStmt { typedef struct VariableShowStmt { NodeTag type; char* name; + char* likename; } VariableShowStmt; /* ---------------------- diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index d0b827cc8..e3ea2dc96 100755 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -547,6 +547,7 @@ PG_KEYWORD("value", VALUE_P, UNRESERVED_KEYWORD) PG_KEYWORD("values", VALUES, COL_NAME_KEYWORD) PG_KEYWORD("varchar", VARCHAR, COL_NAME_KEYWORD) PG_KEYWORD("varchar2", VARCHAR2, COL_NAME_KEYWORD) +PG_KEYWORD("variables", VARIABLES, UNRESERVED_KEYWORD) PG_KEYWORD("variadic", VARIADIC, RESERVED_KEYWORD) PG_KEYWORD("varying", VARYING, UNRESERVED_KEYWORD) PG_KEYWORD("vcgroup", VCGROUP, UNRESERVED_KEYWORD) diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index d99e9e4f8..2ef6bc46a 100755 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -251,7 +251,7 @@ extern void GetConfigOptionByNum(int varnum, const char** values, bool* noshow); extern int GetNumConfigOptions(void); extern void SetPGVariable(const char* name, List* args, bool is_local); -extern void GetPGVariable(const char* name, DestReceiver* dest); +extern void GetPGVariable(const char* name, const char* likename, DestReceiver* dest); extern TupleDesc GetPGVariableResultDesc(const char* name); #ifdef PGXC