diff --git a/src/backend/distributed/executor/adaptive_executor.c b/src/backend/distributed/executor/adaptive_executor.c index e912f418d6f..f24e5b30ac5 100644 --- a/src/backend/distributed/executor/adaptive_executor.c +++ b/src/backend/distributed/executor/adaptive_executor.c @@ -816,8 +816,11 @@ AdaptiveExecutor(CitusScanState *scanState) * be part of the same transaction. */ UseCoordinatedTransaction(); + + ParamListInfo boundParams = copyParamList(paramListInfo); + taskList = ExplainAnalyzeTaskList(taskList, defaultTupleDest, tupleDescriptor, - paramListInfo); + boundParams); /* * Multiple queries per task is not supported with local execution. See the Assert in diff --git a/src/backend/distributed/planner/multi_explain.c b/src/backend/distributed/planner/multi_explain.c index 4584e774024..6049fdcfafa 100644 --- a/src/backend/distributed/planner/multi_explain.c +++ b/src/backend/distributed/planner/multi_explain.c @@ -808,7 +808,11 @@ FetchRemoteExplainFromWorkers(Task *task, ExplainState *es, ParamListInfo params if (params) { - ExtractParametersFromParamList(params, ¶mTypes, ¶mValues, false); + /* force evaluation of bound params */ + params = copyParamList(params); + + ExtractParametersForRemoteExecution(params, ¶mTypes, + ¶mValues); } int sendStatus = SendRemoteCommandParams(connection, explainQuery->data, @@ -1595,6 +1599,7 @@ FetchPlanQueryForExplainAnalyze(const char *queryString, ParamListInfo params) ParameterResolutionSubquery(params)); } + appendStringInfoString(fetchQuery, "SELECT explain_analyze_output, execution_duration " "FROM worker_last_saved_explain_analyze()"); @@ -1618,6 +1623,12 @@ ParameterResolutionSubquery(ParamListInfo params) for (int paramIndex = 0; paramIndex < params->numParams; paramIndex++) { ParamExternData *param = ¶ms->params[paramIndex]; + + if (param->ptype == 0) + { + continue; + } + char *typeName = format_type_extended(param->ptype, -1, FORMAT_TYPE_FORCE_QUALIFY); diff --git a/src/test/regress/expected/multi_explain.out b/src/test/regress/expected/multi_explain.out index 17b67360774..bbc2e44ee1f 100644 --- a/src/test/regress/expected/multi_explain.out +++ b/src/test/regress/expected/multi_explain.out @@ -3225,6 +3225,19 @@ SET auto_explain.log_min_duration = 0; set auto_explain.log_analyze to true; -- the following should not be locally executed since explain analyze is on select * from test_ref_table; +CREATE TABLE test_auto_explain.test_params +( coll1 int8 NULL, + coll2 int4 NOT NULL); +SELECT create_distributed_table('test_auto_explain.test_params', 'coll1'); + +CREATE OR REPLACE PROCEDURE test_auto_explain.test_delete_from(p_coll2 int) +LANGUAGE plpgsql +AS $$ +BEGIN +DELETE FROM test_auto_explain.test_params +WHERE coll2 = p_coll2; +END;$$; +CALL test_auto_explain.test_delete_from(20240401); DROP SCHEMA test_auto_explain CASCADE; SET client_min_messages TO ERROR; DROP SCHEMA multi_explain CASCADE; diff --git a/src/test/regress/expected/multi_explain_0.out b/src/test/regress/expected/multi_explain_0.out index 9534cefb8c1..89b9c6ac89f 100644 --- a/src/test/regress/expected/multi_explain_0.out +++ b/src/test/regress/expected/multi_explain_0.out @@ -3214,6 +3214,19 @@ SET auto_explain.log_min_duration = 0; set auto_explain.log_analyze to true; -- the following should not be locally executed since explain analyze is on select * from test_ref_table; +CREATE TABLE test_auto_explain.test_params +( coll1 int8 NULL, + coll2 int4 NOT NULL); +SELECT create_distributed_table('test_auto_explain.test_params', 'coll1'); + +CREATE OR REPLACE PROCEDURE test_auto_explain.test_delete_from(p_coll2 int) +LANGUAGE plpgsql +AS $$ +BEGIN +DELETE FROM test_auto_explain.test_params +WHERE coll2 = p_coll2; +END;$$; +CALL test_auto_explain.test_delete_from(20240401); DROP SCHEMA test_auto_explain CASCADE; SET client_min_messages TO ERROR; DROP SCHEMA multi_explain CASCADE; diff --git a/src/test/regress/sql/multi_explain.sql b/src/test/regress/sql/multi_explain.sql index 7fa75c8be9b..6b430935a86 100644 --- a/src/test/regress/sql/multi_explain.sql +++ b/src/test/regress/sql/multi_explain.sql @@ -1168,6 +1168,22 @@ set auto_explain.log_analyze to true; -- the following should not be locally executed since explain analyze is on select * from test_ref_table; +CREATE TABLE test_auto_explain.test_params +( coll1 int8 NULL, + coll2 int4 NOT NULL); + +SELECT create_distributed_table('test_auto_explain.test_params', 'coll1'); + +CREATE OR REPLACE PROCEDURE test_auto_explain.test_delete_from(p_coll2 int) +LANGUAGE plpgsql +AS $$ +BEGIN +DELETE FROM test_auto_explain.test_params +WHERE coll2 = p_coll2; +END;$$; + +CALL test_auto_explain.test_delete_from(20240401); + DROP SCHEMA test_auto_explain CASCADE; SET client_min_messages TO ERROR;