diff --git a/src/gausskernel/optimizer/commands/variable.cpp b/src/gausskernel/optimizer/commands/variable.cpp index 4172da848..62cfb3c5a 100755 --- a/src/gausskernel/optimizer/commands/variable.cpp +++ b/src/gausskernel/optimizer/commands/variable.cpp @@ -686,13 +686,13 @@ bool check_mix_replication_param(bool* newval, void** extra, GucSource source) /* * SET CLIENT_ENCODING */ -void (*check_client_encoding_hook)(void); bool check_client_encoding(char** newval, void** extra, GucSource source) { int encoding; const char* canonical_name = NULL; - if (check_client_encoding_hook) - check_client_encoding_hook(); + if (t_thrd.autonomous_cxt.check_client_encoding_hook) { + t_thrd.autonomous_cxt.check_client_encoding_hook(); + } /* Look up the encoding by name */ encoding = pg_valid_client_encoding(*newval); if (encoding < 0) { diff --git a/src/gausskernel/process/tcop/autonomous.cpp b/src/gausskernel/process/tcop/autonomous.cpp index 9702af14d..9e3c40e6b 100644 --- a/src/gausskernel/process/tcop/autonomous.cpp +++ b/src/gausskernel/process/tcop/autonomous.cpp @@ -706,7 +706,7 @@ void autonomous_worker_main(Datum main_arg) save_log_duration = u_sess->attr.attr_sql.log_duration; save_log_min_duration_statement = u_sess->attr.attr_storage.log_min_duration_statement; - check_client_encoding_hook = autonomous_check_client_encoding_hook; + t_thrd.autonomous_cxt.check_client_encoding_hook = autonomous_check_client_encoding_hook; u_sess->attr.attr_common.log_statement = LOGSTMT_NONE; u_sess->attr.attr_sql.log_duration = false; u_sess->attr.attr_storage.log_min_duration_statement = -1; @@ -717,7 +717,7 @@ void autonomous_worker_main(Datum main_arg) u_sess->attr.attr_common.log_statement = save_log_statement; u_sess->attr.attr_sql.log_duration = save_log_duration; u_sess->attr.attr_storage.log_min_duration_statement = save_log_min_duration_statement; - check_client_encoding_hook = NULL; + t_thrd.autonomous_cxt.check_client_encoding_hook = NULL; ReadyForQuery((CommandDest)t_thrd.postgres_cxt.whereToSendOutput); break; diff --git a/src/gausskernel/process/threadpool/knl_thread.cpp b/src/gausskernel/process/threadpool/knl_thread.cpp index 4282a39a7..23ea560aa 100755 --- a/src/gausskernel/process/threadpool/knl_thread.cpp +++ b/src/gausskernel/process/threadpool/knl_thread.cpp @@ -1389,6 +1389,7 @@ static void knl_t_autonomous_init(knl_t_autonomous_context* autonomous_cxt) autonomous_cxt->isnested = false; autonomous_cxt->handle = NULL; autonomous_cxt->sqlstmt = NULL; + autonomous_cxt->check_client_encoding_hook = NULL; } static void knl_t_mot_init(knl_t_mot_context* mot_cxt) diff --git a/src/include/commands/variable.h b/src/include/commands/variable.h index 8cb4b1a96..06e93e73f 100755 --- a/src/include/commands/variable.h +++ b/src/include/commands/variable.h @@ -28,7 +28,6 @@ extern bool check_transaction_deferrable(bool* newval, void** extra, GucSource s extern bool check_random_seed(double* newval, void** extra, GucSource source); extern void assign_random_seed(double newval, void* extra); extern const char* show_random_seed(void); -extern void (*check_client_encoding_hook)(void); extern bool check_client_encoding(char** newval, void** extra, GucSource source); extern void assign_client_encoding(const char* newval, void* extra); extern bool check_mix_replication_param(bool* newval, void** extra, GucSource source); diff --git a/src/include/knl/knl_thread.h b/src/include/knl/knl_thread.h index 39bb16df0..a1325f9be 100644 --- a/src/include/knl/knl_thread.h +++ b/src/include/knl/knl_thread.h @@ -2662,10 +2662,12 @@ typedef struct knl_t_heartbeat_context { /* autonomous_transaction */ struct PLpgSQL_expr; +typedef void (*check_client_encoding_hook_type)(void); typedef struct knl_t_autonomous_context { PLpgSQL_expr* sqlstmt; bool isnested; BackgroundWorkerHandle* handle; + check_client_encoding_hook_type check_client_encoding_hook; } knl_t_autonomous_context; /* MOT thread attributes */