]> 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:31:32 +0000 (21:31 +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 2d66639a209a287184e20d59b6ee3cb29606322e..3780ed46afebfdfdcab1ce880c7f53a5d0a2dcd4 100644 (file)
@@ -648,6 +648,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 c6363ebeb24ca3c99c56afa719cc24771e1df5b6..8f70b1a343d240ac395669b4988c8949e868bce9 100644 (file)
@@ -3297,6 +3297,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 41d5524285a39fd3d24b0e59895088f1397f2ccc..7d10ddcef6c1a82d1d27d47fc365031db8506308 100644 (file)
@@ -815,6 +815,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;
 
 --