aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2020-02-28 13:13:54 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2020-02-28 13:25:26 -0300
commitdb989184cda7f4aa1ff764cca96142029e7e093b (patch)
treedb5304a6d2fda33a4f0ea55686a7d69cc3a75fcd /src/backend/tcop/postgres.c
parent1933ae629e7b706c6c23673a381e778819db307d (diff)
downloadpostgresql-db989184cda7f4aa1ff764cca96142029e7e093b.tar.gz
postgresql-db989184cda7f4aa1ff764cca96142029e7e093b.zip
Add comments on avoid reuse of parse-time snapshot
Apparently, reusing the parse-time query snapshot for later steps (execution) is a frequently considered optimization ... but it doesn't work, for reasons discovered in thread [1]. Adding some comments about why it doesn't really work can relieve some future hackers from wasting time reimplementing it again. [1] https://postgr.es/m/flat/5075D8DF.6050500@fuzzy.cz Author: Michail Nikolaev Discussion: https://postgr.es/m/CANtu0ogp6cTvMJObXP8n=k+JtqxY1iT9UV5MbGCpjjPa5crCiw@mail.gmail.com
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 0a6f80963bd..23661ae15f5 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1155,7 +1155,16 @@ exec_simple_query(const char *query_string)
plantree_list = pg_plan_queries(querytree_list,
CURSOR_OPT_PARALLEL_OK, NULL);
- /* Done with the snapshot used for parsing/planning */
+ /*
+ * Done with the snapshot used for parsing/planning.
+ *
+ * While it looks promising to reuse the same snapshot for query
+ * execution (at least for simple protocol), unfortunately it causes
+ * execution to use a snapshot that has been acquired before locking
+ * any of the tables mentioned in the query. This creates user-
+ * visible anomalies, so refrain. Refer to
+ * https://postgr.es/m/flat/5075D8DF.6050500@fuzzy.cz for details.
+ */
if (snapshot_set)
PopActiveSnapshot();