Subject: Proposal : Retain explainable statement location on ExplainStmt structure.

From: Anton Ratundalov <[email-masked]>
Date: Fri, 10 Jul 2026 15:35:19 +0300

Hi hackers

Let me propose to amend ExplainStmt structure with an new attribute 
explainable_loc of ParseLoc type

with the purpose of separating an EXPLAIN command ( together with it's 
options ) from the statement to be explained.

This, for example, will allow to execute EXPLAIN remotely with a 
different set of options.

Please, find code changes in the patch.

Best regards,

Anton Ratundalov,

Postgres Professional
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 0f4e8638c3d..c431fce7ac9 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -12758,6 +12758,7 @@ ExplainStmt:
 
 					n->query = $2;
 					n->options = NIL;
+					n->explainable_loc = @2;
 					$$ = (Node *) n;
 				}
 		| EXPLAIN analyze_keyword opt_verbose ExplainableStmt
@@ -12769,6 +12770,7 @@ ExplainStmt:
 					if ($3)
 						n->options = lappend(n->options,
 											 makeDefElem("verbose", NULL, @3));
+					n->explainable_loc = @4;
 					$$ = (Node *) n;
 				}
 		| EXPLAIN VERBOSE ExplainableStmt
@@ -12777,6 +12779,7 @@ ExplainStmt:
 
 					n->query = $3;
 					n->options = list_make1(makeDefElem("verbose", NULL, @2));
+					n->explainable_loc = @3;
 					$$ = (Node *) n;
 				}
 		| EXPLAIN '(' utility_option_list ')' ExplainableStmt
@@ -12785,6 +12788,7 @@ ExplainStmt:
 
 					n->query = $5;
 					n->options = $3;
+					n->explainable_loc = @5;
 					$$ = (Node *) n;
 				}
 		;
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index a92dbda0770..bad933d4f0e 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -4152,4 +4152,5 @@ typedef struct ExplainStmt
 	NodeTag		type;
 	Node	   *query;			/* the query (see comments above) */
 	List	   *options;		/* list of DefElem nodes */
+	ParseLoc   explainable_loc;
 } ExplainStmt;