]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Don't allow composite type to be member of itself via multirange
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 23 Apr 2026 18:28:11 +0000 (21:28 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 23 Apr 2026 18:28:11 +0000 (21:28 +0300)
CheckAttributeType() checks that a composite type is not made a member
of itself with ALTER TABLE ADD COLUMN or ALTER TYPE ADD ATTRIBUTE,
even indirectly via a domain, array, another composite type or a range
type. But it missed checking for multiranges. That was a simple
oversight when multiranges were added.

Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://www.postgresql.org/message-id/93ce56cd-02a6-4db1-8224-c8999372facc@iki.fi
Backpatch-through: 14

src/backend/catalog/heap.c
src/test/regress/expected/multirangetypes.out
src/test/regress/sql/multirangetypes.sql

index ae6b7cda3ddfed440e666d0231288d1f0b36423c..a19e63c3a591d24326de8cdac65ece0ede7de40a 100644 (file)
@@ -654,6 +654,16 @@ CheckAttributeType(const char *attname,
                                                   containing_rowtypes,
                                                   flags);
        }
+       else if (att_typtype == TYPTYPE_MULTIRANGE)
+       {
+               /*
+                * If it's a multirange, recurse to check its plain range type.
+                */
+               CheckAttributeType(attname, get_multirange_range(atttypid),
+                                                  InvalidOid,  /* range types are not collatable */
+                                                  containing_rowtypes,
+                                                  flags);
+       }
        else if (OidIsValid((att_typelem = get_element_type(atttypid))))
        {
                /*
index f5e7df8df4308ef403c11be29435900faadc51db..5fcfec49c69a1157971f394e6e8e63459b499409 100644 (file)
@@ -3418,6 +3418,9 @@ select *, row_to_json(upper(t)) as u from
  {["(5,6)","(7,8)")} | {"a":7,"b":8}
 (2 rows)
 
+-- this must be rejected to avoid self-inclusion issues:
+alter type two_ints add attribute c two_ints_multirange;
+ERROR:  composite type two_ints cannot be made a member of itself
 drop type two_ints cascade;
 NOTICE:  drop cascades to type two_ints_range
 --
index 112334b03ebbe1c19a9be2966eb87df4c6431299..763fc07a875b6ceea66c952e5ecbe64f1259edbf 100644 (file)
@@ -837,6 +837,9 @@ select *, row_to_json(upper(t)) as u from
   (values (two_ints_multirange(two_ints_range(row(1,2), row(3,4)))),
           (two_ints_multirange(two_ints_range(row(5,6), row(7,8))))) v(t);
 
+-- this must be rejected to avoid self-inclusion issues:
+alter type two_ints add attribute c two_ints_multirange;
+
 drop type two_ints cascade;
 
 --