]> granicus.if.org Git - postgresql/commitdiff
Avoid unnecessary snapshot-acquisitions in BuildCachedPlan.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 25 Sep 2011 21:33:32 +0000 (17:33 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 25 Sep 2011 21:34:20 +0000 (17:34 -0400)
I had copied-and-pasted a claim that we couldn't reach this point when
dealing with utility statements, but that was a leftover from when the
caller was required to supply a plan to start with.  We now will go
through here at least once when handling a utility statement, so it
seems worth a check to see whether a snapshot is actually needed.
(Note that analyze_requires_snapshot is quite a cheap test.)

Per suggestion from Yamamoto Takashi.  I don't think I believe that this
resolves his reported assertion failure; but it's worth changing anyway,
just to save a cycle or two.

src/backend/utils/cache/plancache.c

index 9cccc876f81d04c0e3314eefc40f93c550600521..cfeb8245b8c7fc12daa22e7c2ddcbd2a249bb40a 100644 (file)
@@ -54,6 +54,7 @@
 #include "nodes/nodeFuncs.h"
 #include "optimizer/planmain.h"
 #include "optimizer/prep.h"
+#include "parser/analyze.h"
 #include "parser/parsetree.h"
 #include "storage/lmgr.h"
 #include "tcop/pquery.h"
@@ -756,14 +757,12 @@ BuildCachedPlan(CachedPlanSource *plansource, List *qlist,
        PushOverrideSearchPath(plansource->search_path);
 
        /*
-        * If a snapshot is already set (the normal case), we can just use
-        * that for parsing/planning.  But if it isn't, install one.  Note: no
-        * point in checking whether parse analysis requires a snapshot;
-        * utility commands don't have invalidatable plans, so we'd not get
-        * here for such a command.
+        * If a snapshot is already set (the normal case), we can just use that
+        * for planning.  But if it isn't, and we need one, install one.
         */
        snapshot_set = false;
-       if (!ActiveSnapshotSet())
+       if (!ActiveSnapshotSet() &&
+               analyze_requires_snapshot(plansource->raw_parse_tree))
        {
                PushActiveSnapshot(GetTransactionSnapshot());
                snapshot_set = true;