From 3d2a64bfec555015eeda2d47be00b7f2e1ac457b Mon Sep 17 00:00:00 2001 From: muyulinzhong Date: Mon, 18 Sep 2023 19:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E3=80=90=E4=BD=BF?= =?UTF-8?q?=E7=94=A8alter=20system=E6=96=B9=E5=BC=8F=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8F=82=E6=95=B0num=5Finternal=5Flock=5Fpartitions=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E9=87=8D=E5=90=AF=E6=95=B0=E6=8D=AE=E5=BA=93=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E3=80=91=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/utils/misc/guc/guc_storage.cpp | 23 +++++++++++++++---- src/gausskernel/optimizer/commands/copy.cpp | 14 ++++++++++- .../access/transam/multi_redo_settings.cpp | 4 ++-- .../storage/replication/logical/logical.cpp | 9 ++++++++ src/include/commands/copy.h | 2 +- src/include/replication/logical.h | 2 +- 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/common/backend/utils/misc/guc/guc_storage.cpp b/src/common/backend/utils/misc/guc/guc_storage.cpp index 2e2519a87..4c78a8ece 100755 --- a/src/common/backend/utils/misc/guc/guc_storage.cpp +++ b/src/common/backend/utils/misc/guc/guc_storage.cpp @@ -4816,7 +4816,7 @@ void InitializeNumLwLockPartitions(void) /* set default values */ SetLWLockPartDefaultNum(); /* Do str copy and remove space. */ - char* attr = TrimStr(g_instance.attr.attr_storage.num_internal_lock_partitions_str); + char* attr = TrimStrQuote(g_instance.attr.attr_storage.num_internal_lock_partitions_str, true); if (attr == NULL || attr[0] == '\0') { /* use default values */ return; } @@ -6125,11 +6125,24 @@ static void assign_ss_log_backup_file_count(int newval, void *extra) static bool check_logical_decode_options_default(char** newval, void** extra, GucSource source) { - if (!LogicalDecodeParseOptionsDefault(*newval, extra)) { - GUC_check_errdetail("invalid parameter setting for loglical_decode_options_default"); - return false; + /*Check argument whether coming frmo SYATEM ALTER SET*/ + char* temp = *newval; + int len = strlen(temp); + char ch = (len > 0) ? temp[len-1] : '\0'; + if(QuoteCheckOut(temp)) { + temp[len - 1] = '\0'; + temp++; + } + if (!LogicalDecodeParseOptionsDefault(temp, extra)) { + GUC_check_errdetail("invalid parameter setting for loglical_decode_options_default"); + if(len != 0) { + (*newval)[len - 1] = ch; + } + return false; + } + if(len != 0) { + (*newval)[len - 1] = ch; } - return true; } diff --git a/src/gausskernel/optimizer/commands/copy.cpp b/src/gausskernel/optimizer/commands/copy.cpp index d6f64b3ba..5c7026e53 100644 --- a/src/gausskernel/optimizer/commands/copy.cpp +++ b/src/gausskernel/optimizer/commands/copy.cpp @@ -8714,7 +8714,7 @@ bool StrToInt32(const char* s, int *val) return true; } -char* TrimStr(const char* str) +char* TrimStrQuote(const char* str, bool isQuote) { if (str == NULL) { return NULL; @@ -8742,12 +8742,24 @@ char* TrimStr(const char* str) } len = end - begin + 1; + + if (isQuote && len>=2 && *begin == '"' && *end == '"') { + begin++; + end--; + len = end - begin + 1; + } + rc = memmove_s(cpyStr, strlen(cpyStr), begin, len); securec_check(rc, "\0", "\0"); cpyStr[len] = '\0'; return cpyStr; } +char* TrimStr(const char* str) +{ + return TrimStrQuote(str, false); +} + /* Deserialize the LOCATION options into locations list. * the multi-locations should be separated by '|' */ diff --git a/src/gausskernel/storage/access/transam/multi_redo_settings.cpp b/src/gausskernel/storage/access/transam/multi_redo_settings.cpp index 6ed92595e..b2f03bf28 100644 --- a/src/gausskernel/storage/access/transam/multi_redo_settings.cpp +++ b/src/gausskernel/storage/access/transam/multi_redo_settings.cpp @@ -29,7 +29,7 @@ #include "postgres.h" #include "knl/knl_variable.h" #include "utils/guc.h" - +#include "commands/copy.h" #include "access/multi_redo_settings.h" #include "access/multi_redo_api.h" #include "threadpool/threadpool_controler.h" @@ -133,7 +133,7 @@ static uint32 GetCPUCount() void ParseBindCpuInfo(RedoCpuBindControl *control) { - char* attr = TrimStr(g_instance.attr.attr_storage.redo_bind_cpu_attr); + char* attr = TrimStrQuote(g_instance.attr.attr_storage.redo_bind_cpu_attr, true); if (attr == NULL) { return; } diff --git a/src/gausskernel/storage/replication/logical/logical.cpp b/src/gausskernel/storage/replication/logical/logical.cpp index e025143cb..ea6ecf772 100644 --- a/src/gausskernel/storage/replication/logical/logical.cpp +++ b/src/gausskernel/storage/replication/logical/logical.cpp @@ -85,6 +85,15 @@ static void parallel_change_cb_wrapper(ParallelReorderBuffer *cache, ReorderBuff static void LoadOutputPlugin(OutputPluginCallbacks *callbacks, const char *plugin); static void LoadOutputPlugin(ParallelOutputPluginCallbacks *callbacks, const char *plugin); +/* Checkout aurgments whether coming from ALTER SYSTEM SET*/ +bool QuoteCheckOut(char* newval) +{ + int len = strlen(newval); + if(len >= 2 && newval[0] == '"' && newval[0] == newval[len - 1]) + return true; + return false; +} + /* * Make sure the current settings & environment are capable of doing logical * decoding. diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index 727404127..b664e5016 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -448,8 +448,8 @@ extern int GetDecimalFromHex(char hex); extern char* limit_printout_length(const char* str); extern bool StrToInt32(const char* s, int *val); +extern char* TrimStrQuote(const char* str, bool isQuote); extern char* TrimStr(const char* str); - extern void UHeapAddToBulkInsertSelect(CopyFromBulk bulk, Tuple tup, bool needCopy); extern void HeapAddToBulkInsertSelect(CopyFromBulk bulk, Tuple tup, bool needCopy); diff --git a/src/include/replication/logical.h b/src/include/replication/logical.h index b8baace4b..fb09647b0 100644 --- a/src/include/replication/logical.h +++ b/src/include/replication/logical.h @@ -306,7 +306,7 @@ typedef struct DecodeOptionsDefault { extern LogicalDispatcher g_Logicaldispatcher[]; extern bool firstCreateDispatcher; - +extern bool QuoteCheckOut(char* newval); extern void CheckLogicalDecodingRequirements(Oid databaseId); extern void ParallelReorderBufferQueueChange(ParallelReorderBuffer *rb, logicalLog *change, int slotId); extern void ParallelReorderBufferForget(ParallelReorderBuffer *rb, int slotId, ParallelReorderBufferTXN *txn);