Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit93765bd

Browse files
committed
Fix table rewrites that include a column without a default.
Inc2fe139 I made ATRewriteTable() use tuple slots. UnfortunatelyI did not notice that columns can be added in a rewrite that do nothave a default, when another column is added/altered requiring one.Initialize columns to NULL again, and add tests.Bug: #16038Reported-By: anonymousAuthor: Andres FreundDiscussion:https://postgr.es/m/16038-5c974541f2bf6749@postgresql.orgBackpatch: 12, where the bug was introduced inc2fe139
1 parent50518ec commit93765bd

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

‎src/backend/commands/tablecmds.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4890,6 +4890,16 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode)
48904890
table_slot_callbacks(oldrel));
48914891
newslot = MakeSingleTupleTableSlot(newTupDesc,
48924892
table_slot_callbacks(newrel));
4893+
4894+
/*
4895+
* Set all columns in the new slot to NULL initially, to ensure
4896+
* columns added as part of the rewrite are initialized to
4897+
* NULL. That is necessary as tab->newvals will not contain an
4898+
* expression for columns with a NULL default, e.g. when adding a
4899+
* column without a default together with a column with a default
4900+
* requiring an actual rewrite.
4901+
*/
4902+
ExecStoreAllNullTuple(newslot);
48934903
}
48944904
else
48954905
{

‎src/test/regress/expected/alter_table.out

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2436,6 +2436,53 @@ select * from at_view_2;
24362436
drop view at_view_2;
24372437
drop view at_view_1;
24382438
drop table at_base_table;
2439+
-- check adding a column not iself requiring a rewrite, together with
2440+
-- a column requiring a default (bug #16038)
2441+
-- ensure that rewrites aren't silently optimized away, removing the
2442+
-- value of the test
2443+
CREATE OR REPLACE FUNCTION evtrig_rewrite_log() RETURNS event_trigger
2444+
LANGUAGE plpgsql AS $$
2445+
BEGIN
2446+
RAISE WARNING 'rewriting table %',
2447+
pg_event_trigger_table_rewrite_oid()::regclass;
2448+
END;
2449+
$$;
2450+
CREATE EVENT TRIGGER evtrig_rewrite_log ON table_rewrite
2451+
EXECUTE PROCEDURE evtrig_rewrite_log();
2452+
CREATE TABLE rewrite_test(col text);
2453+
INSERT INTO rewrite_test VALUES ('something');
2454+
INSERT INTO rewrite_test VALUES (NULL);
2455+
-- empty[12] doesn't need rewrite, but notempty[12]_rewrite will force one
2456+
ALTER TABLE rewrite_test
2457+
ADD COLUMN empty1 text,
2458+
ADD COLUMN notempty1_rewrite serial;
2459+
WARNING: rewriting table rewrite_test
2460+
ALTER TABLE rewrite_test
2461+
ADD COLUMN notempty2_rewrite serial,
2462+
ADD COLUMN empty2 text;
2463+
WARNING: rewriting table rewrite_test
2464+
-- also check that fast defaults cause no problem, first without rewrite
2465+
ALTER TABLE rewrite_test
2466+
ADD COLUMN empty3 text,
2467+
ADD COLUMN notempty3_norewrite int default 42;
2468+
ALTER TABLE rewrite_test
2469+
ADD COLUMN notempty4_norewrite int default 42,
2470+
ADD COLUMN empty4 text;
2471+
-- then with rewrite
2472+
ALTER TABLE rewrite_test
2473+
ADD COLUMN empty5 text,
2474+
ADD COLUMN notempty5_norewrite int default 42,
2475+
ADD COLUMN notempty5_rewrite serial;
2476+
WARNING: rewriting table rewrite_test
2477+
ALTER TABLE rewrite_test
2478+
ADD COLUMN notempty6_rewrite serial,
2479+
ADD COLUMN empty6 text,
2480+
ADD COLUMN notempty6_norewrite int default 42;
2481+
WARNING: rewriting table rewrite_test
2482+
-- cleanup
2483+
drop event trigger evtrig_rewrite_log;
2484+
drop function evtrig_rewrite_log();
2485+
DROP TABLE rewrite_test;
24392486
--
24402487
-- lock levels
24412488
--

‎src/test/regress/sql/alter_table.sql

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,54 @@ drop view at_view_2;
15501550
dropview at_view_1;
15511551
droptable at_base_table;
15521552

1553+
-- check adding a column not iself requiring a rewrite, together with
1554+
-- a column requiring a default (bug #16038)
1555+
1556+
-- ensure that rewrites aren't silently optimized away, removing the
1557+
-- value of the test
1558+
CREATE OR REPLACEFUNCTIONevtrig_rewrite_log() RETURNS event_trigger
1559+
LANGUAGE plpgsqlAS $$
1560+
BEGIN
1561+
RAISE WARNING'rewriting table %',
1562+
pg_event_trigger_table_rewrite_oid()::regclass;
1563+
END;
1564+
$$;
1565+
CREATE EVENT TRIGGER evtrig_rewrite_logON table_rewrite
1566+
EXECUTE PROCEDURE evtrig_rewrite_log();
1567+
1568+
CREATETABLErewrite_test(coltext);
1569+
INSERT INTO rewrite_testVALUES ('something');
1570+
INSERT INTO rewrite_testVALUES (NULL);
1571+
1572+
-- empty[12] doesn't need rewrite, but notempty[12]_rewrite will force one
1573+
ALTERTABLE rewrite_test
1574+
ADD COLUMN empty1text,
1575+
ADD COLUMN notempty1_rewriteserial;
1576+
ALTERTABLE rewrite_test
1577+
ADD COLUMN notempty2_rewriteserial,
1578+
ADD COLUMN empty2text;
1579+
-- also check that fast defaults cause no problem, first without rewrite
1580+
ALTERTABLE rewrite_test
1581+
ADD COLUMN empty3text,
1582+
ADD COLUMN notempty3_norewriteint default42;
1583+
ALTERTABLE rewrite_test
1584+
ADD COLUMN notempty4_norewriteint default42,
1585+
ADD COLUMN empty4text;
1586+
-- then with rewrite
1587+
ALTERTABLE rewrite_test
1588+
ADD COLUMN empty5text,
1589+
ADD COLUMN notempty5_norewriteint default42,
1590+
ADD COLUMN notempty5_rewriteserial;
1591+
ALTERTABLE rewrite_test
1592+
ADD COLUMN notempty6_rewriteserial,
1593+
ADD COLUMN empty6text,
1594+
ADD COLUMN notempty6_norewriteint default42;
1595+
1596+
-- cleanup
1597+
drop event trigger evtrig_rewrite_log;
1598+
dropfunction evtrig_rewrite_log();
1599+
DROPTABLE rewrite_test;
1600+
15531601
--
15541602
-- lock levels
15551603
--

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp