explain_select_into_server_crash.patch

text/x-patch

Filename: explain_select_into_server_crash.patch
Type: text/x-patch
Part: 0
Message: Server crash while trying to fetch EXPLAIN query results with a cursor

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))