diff --git a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp index 712f32ef3..7a7f99a17 100755 --- a/src/gausskernel/cbb/instruments/statement/instr_statement.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_statement.cpp @@ -2300,6 +2300,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; @@ -2319,7 +2330,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) || queryDesc->for_simplify_func) { diff --git a/src/gausskernel/runtime/executor/execMain.cpp b/src/gausskernel/runtime/executor/execMain.cpp index a685d6915..51406c2a9 100755 --- a/src/gausskernel/runtime/executor/execMain.cpp +++ b/src/gausskernel/runtime/executor/execMain.cpp @@ -467,7 +467,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;