]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Need to do CommandCounterIncrement after StoreAttrMissingVal.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2025 15:13:01 +0000 (11:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Apr 2025 15:13:01 +0000 (11:13 -0400)
Without this, an additional change to the same pg_attribute row
within the same command will fail.  This is possible at least with
ALTER TABLE ADD COLUMN on a multiple-inheritance-pathway structure.
(Another potential hazard is that immediately-following operations
might not see the missingval.)

Introduced by 95f650674, which split the former coding that
used a single pg_attribute update to change both atthasdef and
atthasmissing/attmissingval into two updates, but missed that
this should entail two CommandCounterIncrements as well.  Like
that fix, back-patch through v13.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Author: Tender Wang <tndrwang@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/025a3ffa-5eff-4a88-97fb-8f583b015965@gmail.com
Backpatch-through: 13

src/backend/commands/tablecmds.c
src/test/regress/expected/inherit.out
src/test/regress/sql/inherit.sql

index 450dfe0c6bffdb88d8848c91690206f311a6db96..58e4a7ec9fac42b9b4f27c188152b3ace52f7b2e 100644 (file)
@@ -7146,6 +7146,8 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
                                if (!missingIsNull)
                                {
                                        StoreAttrMissingVal(rel, attribute.attnum, missingval);
+                                       /* Make the additional catalog change visible */
+                                       CommandCounterIncrement();
                                        has_missing = true;
                                }
                                FreeExecutorState(estate);
index 9eb60e37e70813c1da8d9979549b56b6f396cf42..efe7a1b8e11190f88e0ca564b301204bb23ea32d 100644 (file)
@@ -1093,17 +1093,30 @@ CREATE TABLE inhta ();
 CREATE TABLE inhtb () INHERITS (inhta);
 CREATE TABLE inhtc () INHERITS (inhtb);
 CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc);
-ALTER TABLE inhta ADD COLUMN i int;
+ALTER TABLE inhta ADD COLUMN i int, ADD COLUMN j bigint DEFAULT 1;
 NOTICE:  merging definition of column "i" for child "inhtd"
 NOTICE:  merging definition of column "i" for child "inhtd"
+NOTICE:  merging definition of column "j" for child "inhtd"
+NOTICE:  merging definition of column "j" for child "inhtd"
 \d+ inhta
                                    Table "public.inhta"
  Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
 --------+---------+-----------+----------+---------+---------+--------------+-------------
  i      | integer |           |          |         | plain   |              | 
+ j      | bigint  |           |          | 1       | plain   |              | 
 Child tables: inhtb,
               inhtd
 
+\d+ inhtd
+                                   Table "public.inhtd"
+ Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
+--------+---------+-----------+----------+---------+---------+--------------+-------------
+ i      | integer |           |          |         | plain   |              | 
+ j      | bigint  |           |          | 1       | plain   |              | 
+Inherits: inhta,
+          inhtb,
+          inhtc
+
 DROP TABLE inhta, inhtb, inhtc, inhtd;
 -- Test for renaming in diamond inheritance
 CREATE TABLE inht2 (x int) INHERITS (inht1);
index eb0d512122e482d2ecdde54a578e890c007bcefe..50e7b9c93e951c09bb5c0f171073b774db6b7bd4 100644 (file)
@@ -377,8 +377,9 @@ CREATE TABLE inhta ();
 CREATE TABLE inhtb () INHERITS (inhta);
 CREATE TABLE inhtc () INHERITS (inhtb);
 CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc);
-ALTER TABLE inhta ADD COLUMN i int;
+ALTER TABLE inhta ADD COLUMN i int, ADD COLUMN j bigint DEFAULT 1;
 \d+ inhta
+\d+ inhtd
 DROP TABLE inhta, inhtb, inhtc, inhtd;
 
 -- Test for renaming in diamond inheritance