explain_select_into_server_crash.patch
text/x-patch
Filename: explain_select_into_server_crash.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/tcop/utility.c | 14 | 3 |
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 8b73858..9286ce5 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1362,9 +1362,20 @@ UtilityContainsQuery(Node *parsetree)
switch (nodeTag(parsetree))
{
case T_ExplainStmt:
- Assert(IsA(((ExplainStmt *) parsetree)->query, Query));
- return (Query *) ((ExplainStmt *) parsetree)->query;
-
+ {
+ Query *qry;
+ Assert(IsA(((ExplainStmt *) parsetree)->query, Query));
+ qry = (Query *) ((ExplainStmt *) parsetree)->query;
+ /*
+ * Any SELECT..INTO clause get transformed to CreateTableAsStmt,
+ * and thats CMD_UTILITY stmt. So if CMD_UTILITY found for any
+ * ExplainStmt Query then call UtilityConainsQuery() again
+ * to fetch the proper contained query.
+ */
+ if (qry->commandType == CMD_UTILITY)
+ qry = UtilityContainsQuery(qry->utilityStmt);
+ return qry;
+ }
case T_CreateTableAsStmt:
/* might or might not contain a Query ... */
if (IsA(((CreateTableAsStmt *) parsetree)->query, Query))