diff options
author | Andres Freund <andres@anarazel.de> | 2019-10-09 22:00:50 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2019-10-09 22:00:50 -0700 |
commit | 93765bd956bea26206043de8cbb0ae4b67e4df15 (patch) | |
tree | 41aad2f3c03176d3f43c78e65b4a0c2dcee01b45 /src/backend/commands/tablecmds.c | |
parent | 50518ec296aea3af3e00c43c2ccef74c96cb5762 (diff) | |
download | postgresql-93765bd956bea26206043de8cbb0ae4b67e4df15.tar.gz postgresql-93765bd956bea26206043de8cbb0ae4b67e4df15.zip |
Fix table rewrites that include a column without a default.
In c2fe139c201c I made ATRewriteTable() use tuple slots. Unfortunately
I did not notice that columns can be added in a rewrite that do not
have a default, when another column is added/altered requiring one.
Initialize columns to NULL again, and add tests.
Bug: #16038
Reported-By: anonymous
Author: Andres Freund
Discussion: https://postgr.es/m/16038-5c974541f2bf6749@postgresql.org
Backpatch: 12, where the bug was introduced in c2fe139c201c
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 05593f33162..ba8f4459f3d 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -4890,6 +4890,16 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) table_slot_callbacks(oldrel)); newslot = MakeSingleTupleTableSlot(newTupDesc, table_slot_callbacks(newrel)); + + /* + * Set all columns in the new slot to NULL initially, to ensure + * columns added as part of the rewrite are initialized to + * NULL. That is necessary as tab->newvals will not contain an + * expression for columns with a NULL default, e.g. when adding a + * column without a default together with a column with a default + * requiring an actual rewrite. + */ + ExecStoreAllNullTuple(newslot); } else { |