Fix EXPLAIN ANALYZE bug noted by Wiebe Cazemier: although we were
authorTom Lane
Fri, 21 Oct 2005 16:43:33 +0000 (16:43 +0000)
committerTom Lane
Fri, 21 Oct 2005 16:43:33 +0000 (16:43 +0000)
properly advancing the CommandCounter between multiple sub-queries
generated by rules, we forgot to update the snapshot being used, so
that the successive sub-queries didn't actually see each others'
results.  This is still not *exactly* like the semantics of normal
execution of the same queries, in that we don't take new transaction
snapshots and hence don't see changes from concurrently committed
commands, but I think that's OK and probably even preferable for
EXPLAIN ANALYZE.

src/backend/commands/explain.c
src/backend/commands/prepare.c

index d470990e942773f89ee8f5cb9e5b0d6ff337b601..08480631fec5062434bf8edd36d53a7b3a03e6b5 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994-5, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.138 2005/10/15 02:49:15 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.139 2005/10/21 16:43:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -196,6 +196,15 @@ ExplainOneQuery(Query *query, ExplainStmt *stmt, TupOutputState *tstate)
    /* plan the query */
    plan = planner(query, isCursor, cursorOptions, NULL);
 
+   /*
+    * Update snapshot command ID to ensure this query sees results of any
+    * previously executed queries.  (It's a bit cheesy to modify
+    * ActiveSnapshot without making a copy, but for the limited ways in
+    * which EXPLAIN can be invoked, I think it's OK, because the active
+    * snapshot shouldn't be shared with anything else anyway.)
+    */
+   ActiveSnapshot->curcid = GetCurrentCommandId();
+
    /* Create a QueryDesc requesting no output */
    queryDesc = CreateQueryDesc(query, plan,
                                ActiveSnapshot, InvalidSnapshot,
index 5420da4a6265d0f8f8ee5765c5130d7d13840cc1..7932f838fee93c13d8cb5e428219a68b1bdf2b76 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 2002-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.41 2005/10/15 02:49:15 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.42 2005/10/21 16:43:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -605,6 +605,15 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate)
                query->into = execstmt->into;
            }
 
+           /*
+            * Update snapshot command ID to ensure this query sees results of
+            * any previously executed queries.  (It's a bit cheesy to modify
+            * ActiveSnapshot without making a copy, but for the limited ways
+            * in which EXPLAIN can be invoked, I think it's OK, because the
+            * active snapshot shouldn't be shared with anything else anyway.)
+            */
+           ActiveSnapshot->curcid = GetCurrentCommandId();
+
            /* Create a QueryDesc requesting no output */
            qdesc = CreateQueryDesc(query, plan,
                                    ActiveSnapshot, InvalidSnapshot,