From 8aac9b1f4db481f2096de461b286f42471a4ac7b Mon Sep 17 00:00:00 2001 From: wofanzheng <2399541971@qq.com> Date: Sat, 5 Apr 2025 11:07:31 +0800 Subject: [PATCH] =?UTF-8?q?simple=5Fquery=E5=9C=BA=E6=99=AFPBE=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../optimizer/commands/prepare.cpp | 6 ++++- src/gausskernel/process/tcop/postgres.cpp | 22 +++++++++++++++++++ src/include/commands/prepare.h | 2 +- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/gausskernel/optimizer/commands/prepare.cpp b/src/gausskernel/optimizer/commands/prepare.cpp index e1eb1d0a22..3c9aab92b2 100755 --- a/src/gausskernel/optimizer/commands/prepare.cpp +++ b/src/gausskernel/optimizer/commands/prepare.cpp @@ -363,7 +363,7 @@ void PrepareQuery(PrepareStmt* stmt, const char* queryString) * source is that of the original PREPARE. */ void ExecuteQuery(ExecuteStmt* stmt, IntoClause* intoClause, const char* queryString, ParamListInfo params, - DestReceiver* dest, char* completionTag) + DestReceiver* dest, char* completionTag, bool isFromPbeOpt) { PreparedStatement *entry = NULL; CachedPlan* cplan = NULL; @@ -452,6 +452,10 @@ void ExecuteQuery(ExecuteStmt* stmt, IntoClause* intoClause, const char* querySt /* Don't display the portal in pg_cursors, it is for internal use only */ portal->visible = false; + if (isFromPbeOpt && DestRemote == dest->mydest) { + SetRemoteDestReceiverParams(dest, portal); + } + /* Copy the plan's saved query string into the portal's memory */ query_string = MemoryContextStrdup(PortalGetHeapMemory(portal), entry->plansource->query_string); diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 07c01425e9..b08cfe2b5f 100755 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -2975,6 +2975,28 @@ static void exec_simple_query(const char* query_string, MessageType messageType, if (!u_sess->attr.attr_storage.phony_autocommit) { BeginTxnForAutoCommitOff(); } + + if (nodeTag(parsetree) == T_ExecuteStmt && + !IsA(FetchPreparedStatement(((ExecuteStmt*)parsetree)->name, true, true)->plansource->raw_parse_tree, + SelectStmt) && u_sess->attr.attr_sql.sql_compatibility != C_FORMAT ) { + PushActiveSnapshot(GetTransactionSnapshot()); + MemoryContext tmpcontext = AllocSetContextCreate(u_sess->top_portal_cxt, + "PBEBypassMemory", + ALLOCSET_SMALL_MINSIZE, + ALLOCSET_SMALL_INITSIZE, + ALLOCSET_SMALL_MAXSIZE); + (void) MemoryContextSwitchTo(tmpcontext); + DestReceiver* destRec = CreateDestReceiver(dest); + ExecuteQuery((ExecuteStmt *)parsetree, NULL, query_string, NULL, destRec, completionTag, true); + PopActiveSnapshot(); + finish_xact_command(); + EndCommand(completionTag, dest); + (*destRec->rDestroy)(destRec); + MemoryContextDelete(tmpcontext); + MemoryContextReset(OptimizerContext); + continue; + } + /* SQL bypass */ if (runOpfusionCheck && !IsRightRefState(plantree_list)) { (void)MemoryContextSwitchTo(oldcontext); diff --git a/src/include/commands/prepare.h b/src/include/commands/prepare.h index f703ef97f7..5d80713741 100644 --- a/src/include/commands/prepare.h +++ b/src/include/commands/prepare.h @@ -30,7 +30,7 @@ typedef struct DatanodeStatement { /* Utility statements PREPARE, EXECUTE, DEALLOCATE, EXPLAIN EXECUTE */ extern void PrepareQuery(PrepareStmt* stmt, const char* queryString); extern void ExecuteQuery(ExecuteStmt* stmt, IntoClause* intoClause, const char* queryString, ParamListInfo params, - DestReceiver* dest, char* completionTag); + DestReceiver* dest, char* completionTag, bool isFromPbeOpt = false); extern void DeallocateQuery(DeallocateStmt* stmt); extern void ExplainExecuteQuery( ExecuteStmt* execstmt, IntoClause* into, ExplainState* es, const char* queryString, ParamListInfo params); -- Gitee