]> 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:02 +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 e67ffc37b7dec7707e3a01682a9966c269931a8c..5811bcd074c54e34d485188fa7b413774e1c7f24 100644 (file)
@@ -647,6 +647,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 a0cb8754928383f9df74e0c14a05a73295e0adeb..4290998912f1ba7ab4ba898b44dd872092a8418a 100644 (file)
@@ -3267,6 +3267,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 fefb4b4d422d3634d6d5aeb9bf87e66957e30fe8..cd3b940fd313b8fa8df819274b62e4c4936678d1 100644 (file)
@@ -794,6 +794,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;
 
 --