diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-25 17:33:32 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-25 17:34:20 -0400 |
commit | d5aa7a9fe68b2017362421bd853faeb8199a472c (patch) | |
tree | 5c63477d104b2977d3ee4757bd10511c95151291 | |
parent | 2594ad74360c647edfd0645c4097d78ff83b4c3b (diff) | |
download | postgresql-d5aa7a9fe68b2017362421bd853faeb8199a472c.tar.gz postgresql-d5aa7a9fe68b2017362421bd853faeb8199a472c.zip |
Avoid unnecessary snapshot-acquisitions in BuildCachedPlan.
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.
-rw-r--r-- | src/backend/utils/cache/plancache.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 9cccc876f81..cfeb8245b8c 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -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; |