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
This commit is contained in:
Alvaro Herrera 2020-02-28 13:13:54 -03:00
parent 1933ae629e
commit db989184cd
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE

View File

@ -1155,7 +1155,16 @@ exec_simple_query(const char *query_string)
plantree_list = pg_plan_queries(querytree_list, plantree_list = pg_plan_queries(querytree_list,
CURSOR_OPT_PARALLEL_OK, NULL); 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) if (snapshot_set)
PopActiveSnapshot(); PopActiveSnapshot();