Re: BUG #18984: Empty prepared statement from psql \parse triggers assert in PortalRunMulti
От | Tom Lane |
---|---|
Тема | Re: BUG #18984: Empty prepared statement from psql \parse triggers assert in PortalRunMulti |
Дата | |
Msg-id | 792012.1752530750@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: BUG #18984: Empty prepared statement from psql \parse triggers assert in PortalRunMulti (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-bugs |
I wrote: > The attached quick draft (needs attention to comments) results in > regression=# \parse s > regression=# execute s; > EXECUTE > which matches the behavior of pre-v12 servers. Another way that's perhaps a bit less magical is to make ExecuteQuery substitute the right thing, as attached. I'm not entirely sure whether this leaves any other code paths that can reach that Assert; but on the other hand, if there are any, CMDTAG_EXECUTE is probably wrong for them. BTW, the reason why EXPLAIN EXECUTE isn't at risk is that it's going to return CMDTAG_EXPLAIN. regards, tom lane diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 34b6410d6a2..6ecc24fdba8 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -159,6 +159,7 @@ ExecuteQuery(ParseState *pstate, EState *estate = NULL; Portal portal; char *query_string; + CommandTag commandTag; int eflags; long count; @@ -196,6 +197,15 @@ ExecuteQuery(ParseState *pstate, cplan = GetCachedPlan(entry->plansource, paramLI, NULL, NULL); plan_list = cplan->stmt_list; + /* + * Normally the PlanSource will have a usable commandTag, but if it has an + * empty statement list, then not so much. Substitute EXECUTE to avoid + * failing because we have no commandTag to report to the client. + */ + commandTag = entry->plansource->commandTag; + if (commandTag == CMDTAG_UNKNOWN) + commandTag = CMDTAG_EXECUTE; + /* * DO NOT add any logic that could possibly throw an error between * GetCachedPlan and PortalDefineQuery, or you'll leak the plan refcount. @@ -203,7 +213,7 @@ ExecuteQuery(ParseState *pstate, PortalDefineQuery(portal, NULL, query_string, - entry->plansource->commandTag, + commandTag, plan_list, cplan);
В списке pgsql-bugs по дате отправления: