]> 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:33:39 +0000 (21:33 +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 21b7544350e9e040eb38109cc1edac96d90ccbd4..b8643efee91fd4c24520998b54d0a7e85b6d7e88 100644 (file)
@@ -689,6 +689,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 bde3f248a752da071a1f08d3835c458673531ff0..1d2d832ce2b206424aaf9e2896242df8578cc368 100644 (file)
@@ -3136,6 +3136,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 df1edb4d31acc385ae6d0d4d9f8d4997da2da07c..ea54f290bde8502b0cc60b73d2b9bc786a9c8796 100644 (file)
@@ -766,6 +766,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;
 
 --