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:
@ -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
|
||||
|
Reference in New Issue
Block a user