From c5879c30fbd5f25063cc16478987d0ba78f5fb18 Mon Sep 17 00:00:00 2001 From: shenzheng4 Date: Thu, 14 Nov 2024 16:41:28 +0800 Subject: [PATCH] fix query plan record when qual cause --- .../cbb/instruments/statement/instr_statement.cpp | 13 ++++++++++++- src/gausskernel/runtime/executor/execMain.cpp | 11 ++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp index 6479ac1e2..144e394d3 100755 --- a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp @@ -2288,6 +2288,17 @@ bool instr_stmt_need_track_plan() void instr_stmt_exec_report_query_plan(QueryDesc *queryDesc) { + if ((!IS_UNIQUE_SQL_TRACK_ALL && u_sess->unique_sql_cxt.parent_unique_sql_id != 0) || + u_sess->attr.attr_sql.under_explain) { + return; + } + + /* In procedure, record query plan directly */ + if (IS_UNIQUE_SQL_TRACK_ALL && u_sess->unique_sql_cxt.parent_unique_sql_id != 0) { + instr_stmt_report_query_plan(queryDesc); + return; + } + if (instr_stmt_level_fullsql_open()) { instr_stmt_report_query_plan(queryDesc); return; @@ -2307,7 +2318,7 @@ void instr_stmt_exec_report_query_plan(QueryDesc *queryDesc) void instr_stmt_report_query_plan(QueryDesc *queryDesc) { StatementStatContext *ssctx = (StatementStatContext *)u_sess->statement_cxt.curStatementMetrics; - if (queryDesc == NULL || ssctx == NULL || ssctx->level > STMT_TRACK_L2 + if (queryDesc == NULL || queryDesc->planstate == NULL || ssctx == NULL || ssctx->level > STMT_TRACK_L2 || (ssctx->plan_size != 0 && !u_sess->unique_sql_cxt.is_open_cursor) || (u_sess->statement_cxt.executer_run_level > 1 && !IS_UNIQUE_SQL_TRACK_ALL)) { return; diff --git a/src/gausskernel/runtime/executor/execMain.cpp b/src/gausskernel/runtime/executor/execMain.cpp index 3f8e652e5..1583d3b90 100755 --- a/src/gausskernel/runtime/executor/execMain.cpp +++ b/src/gausskernel/runtime/executor/execMain.cpp @@ -466,7 +466,16 @@ void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, long count) int instrument_option = 0; bool has_track_operator = false; char* old_stmt_name = u_sess->pcache_cxt.cur_stmt_name; - u_sess->statement_cxt.root_query_plan = queryDesc; + + /* + * For normal query, ExecutorRun will be called several times, we only record the first queryDesc, + * otherwise root_query_plan will be overwritten, + * and root_query_plan->planstate will be NULL, + * which may cause incorrect query_plan in statement_history + */ + if (u_sess->statement_cxt.executer_run_level == 0) { + u_sess->statement_cxt.root_query_plan = queryDesc; + } u_sess->statement_cxt.executer_run_level++; if (u_sess->SPI_cxt._connected >= 0) { u_sess->pcache_cxt.cur_stmt_name = NULL;