aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2023-01-15 14:06:46 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2023-01-15 14:06:46 -0500
commita8b88c26f7061689ef1aea1b8fd234fed8e1fc9e (patch)
tree2f2a3a679c40aa750531d30affaeaadfdc2b2d14 /src/backend/executor
parent547e60b8317e3c351900c650988327b73cf7ae33 (diff)
downloadpostgresql-a8b88c26f7061689ef1aea1b8fd234fed8e1fc9e.tar.gz
postgresql-a8b88c26f7061689ef1aea1b8fd234fed8e1fc9e.zip
Make new GENERATED-expressions code more bulletproof.
In commit 8bf6ec3ba I assumed that no code path could reach ExecGetExtraUpdatedCols without having gone through ExecInitStoredGenerated. That turns out not to be the case in logical replication: if there's an ON UPDATE trigger on the target table, trigger.c will call this code before anybody has set up its generated columns. Having seen that, I don't have a lot of faith in there not being other such paths. ExecGetExtraUpdatedCols can call ExecInitStoredGenerated for itself, as long as we are willing to assume that it is only called in CMD_UPDATE operations, which on the whole seems like a safer leap of faith. Per report from Vitaly Davydov. Discussion: https://postgr.es/m/d259d69652b8c2ff50e14cda3c236c7f@postgrespro.ru
Diffstat (limited to 'src/backend/executor')
-rw-r--r--src/backend/executor/execUtils.c6
-rw-r--r--src/backend/executor/nodeModifyTable.c2
2 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 9705460ebda..cad3a7f9ada 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -52,6 +52,7 @@
#include "access/transam.h"
#include "executor/executor.h"
#include "executor/execPartition.h"
+#include "executor/nodeModifyTable.h"
#include "jit/jit.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
@@ -1332,8 +1333,9 @@ ExecGetExtraUpdatedCols(ResultRelInfo *relinfo, EState *estate)
{
ListCell *lc;
- /* Assert that ExecInitStoredGenerated has been called. */
- Assert(relinfo->ri_GeneratedExprs != NULL);
+ /* In some code paths we can reach here before initializing the info */
+ if (relinfo->ri_GeneratedExprs == NULL)
+ ExecInitStoredGenerated(relinfo, estate, CMD_UPDATE);
foreach(lc, estate->es_resultrelinfo_extra)
{
ResultRelInfoExtra *rextra = (ResultRelInfoExtra *) lfirst(lc);
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index d92bbd1c845..07805542466 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -260,7 +260,7 @@ ExecCheckTIDVisible(EState *estate,
* (Currently, ri_extraUpdatedCols is consulted only in UPDATE, but we might
* as well fill it for INSERT too.)
*/
-static void
+void
ExecInitStoredGenerated(ResultRelInfo *resultRelInfo,
EState *estate,
CmdType cmdtype)