Fix newly introduced issue in EXPLAIN for Materialize nodes
authorDavid Rowley <drowley@postgresql.org>
Fri, 5 Jul 2024 04:56:16 +0000 (16:56 +1200)
committerDavid Rowley <drowley@postgresql.org>
Fri, 5 Jul 2024 04:56:16 +0000 (16:56 +1200)
The code added in 1eff8279d was lacking a check to see if the tuplestore
had been created.  In nodeMaterial.c this is done by ExecMaterial() rather
than by ExecInitMaterial(), so the tuplestore won't be created unless
the node has been executed at least once, as demonstrated by Alexander
in his report.

Here we skip showing any of the new EXPLAIN ANALYZE information when the
Materialize node has not been executed.

Reported-by: Alexander Lakhin
Discussion: https://postgr.es/m/fe7fc8fb-86e5-ecb0-3cb2-dd2c9a6c482f@gmail.com

src/backend/commands/explain.c

index 1b5ab5038981e5481369f0b6f7e7c9b43227eaaa..1e80fd8b68c4c104bb7d54a5f623452485e57634 100644 (file)
@@ -3333,14 +3333,17 @@ show_hash_info(HashState *hashstate, ExplainState *es)
 static void
 show_material_info(MaterialState *mstate, ExplainState *es)
 {
-       Tuplestorestate *tupstore;
+       Tuplestorestate *tupstore = mstate->tuplestorestate;
        const char *storageType;
        int64           spaceUsedKB;
 
-       if (!es->analyze)
+       /*
+        * Nothing to show if ANALYZE option wasn't used or if execution didn't
+        * get as far as creating the tuplestore.
+        */
+       if (!es->analyze || tupstore == NULL)
                return;
 
-       tupstore = mstate->tuplestorestate;
        storageType = tuplestore_storage_type_name(tupstore);
        spaceUsedKB = BYTES_TO_KILOBYTES(tuplestore_space_used(tupstore));