1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +03:00

Fix usage of "tableoid" in GENERATED expressions.

We consider this supported (though I've got my doubts that it's a
good idea, because tableoid is not immutable).  However, several
code paths failed to fill the field in soon enough, causing such
a GENERATED expression to see zero or the wrong value.  This
occurred when ALTER TABLE adds a new GENERATED column to a table
with existing rows, and during regular INSERT or UPDATE on a
foreign table with GENERATED columns.

Noted during investigation of a report from Vitaly Ustinov.
Back-patch to v12 where GENERATED came in.

Discussion: https://postgr.es/m/CAM_DEiWR2DPT6U4xb-Ehigozzd3n3G37ZB1+867zbsEVtYoJww@mail.gmail.com
This commit is contained in:
Tom Lane
2021-05-21 15:02:06 -04:00
parent 84f5c2908d
commit 2b0ee126bb
4 changed files with 38 additions and 17 deletions

View File

@ -5761,6 +5761,14 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode)
foreach(lc, dropped_attrs)
newslot->tts_isnull[lfirst_int(lc)] = true;
/*
* Constraints and GENERATED expressions might reference the
* tableoid column, so fill tts_tableOid with the desired
* value. (We must do this each time, because it gets
* overwritten with newrel's OID during storing.)
*/
newslot->tts_tableOid = RelationGetRelid(oldrel);
/*
* Process supplied expressions to replace selected columns.
*
@ -5804,11 +5812,6 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode)
&newslot->tts_isnull[ex->attnum - 1]);
}
/*
* Constraints might reference the tableoid column, so
* initialize t_tableOid before evaluating them.
*/
newslot->tts_tableOid = RelationGetRelid(oldrel);
insertslot = newslot;
}
else