diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index f767751c71..65d8ac65b1 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -233,6 +233,17 @@ ExecuteQuery(ParseState *pstate, cplan = GetCachedPlan(entry->plansource, paramLI, NULL, NULL); plan_list = cplan->stmt_list; + /* + * DO NOT add any logic that could possibly throw an error between + * GetCachedPlan and PortalDefineQuery, or you'll leak the plan refcount. + */ + PortalDefineQuery(portal, + NULL, + query_string, + entry->plansource->commandTag, + plan_list, + cplan); + /* * For CREATE TABLE ... AS EXECUTE, we must verify that the prepared * statement is one that produces tuples. Currently we insist that it be @@ -276,13 +287,6 @@ ExecuteQuery(ParseState *pstate, count = FETCH_ALL; } - PortalDefineQuery(portal, - NULL, - query_string, - entry->plansource->commandTag, - plan_list, - cplan); - /* * Run the portal as appropriate. */