OSDN Git Service

Fix EXPLAIN ANALYZE bug noted by Wiebe Cazemier: although we were
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Oct 2005 16:43:33 +0000 (16:43 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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 d470990..0848063 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 5420da4..7932f83 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,