Copy raw_parse_tree before using it

Address citusdata/citus#922.

Fixes a segfault in PG's installcheck caused by our reuse of
raw_parse_tree when handling EXPLAIN EXECUTE.
pull/1000/head
Brian Cloutier 2016-10-27 17:18:53 +03:00 committed by Andres Freund
parent ebecd90a7e
commit 996f793d54
1 changed files with 4 additions and 1 deletions

View File

@ -313,6 +313,7 @@ multi_ProcessUtility(Node *parsetree,
ExecuteStmt *execstmt = (ExecuteStmt *) query->utilityStmt; ExecuteStmt *execstmt = (ExecuteStmt *) query->utilityStmt;
PreparedStatement *entry = FetchPreparedStatement(execstmt->name, true); PreparedStatement *entry = FetchPreparedStatement(execstmt->name, true);
CachedPlanSource *plansource = entry->plansource; CachedPlanSource *plansource = entry->plansource;
Node *parseTreeCopy;
Query *originalQuery; Query *originalQuery;
/* copied from ExplainExecuteQuery, will never trigger if you used PREPARE */ /* copied from ExplainExecuteQuery, will never trigger if you used PREPARE */
@ -322,7 +323,9 @@ multi_ProcessUtility(Node *parsetree,
" cached plans"))); " cached plans")));
} }
originalQuery = parse_analyze(plansource->raw_parse_tree, parseTreeCopy = copyObject(plansource->raw_parse_tree);
originalQuery = parse_analyze(parseTreeCopy,
plansource->query_string, plansource->query_string,
plansource->param_types, plansource->param_types,
plansource->num_params); plansource->num_params);