On Sat, Jun 21, 2025 at 1:29 PM jian he <jian.universal...@gmail.com> wrote:
>
> ( the following excerpted from create_type.sql)
>
> BEGIN;
> CREATE TYPE int42;
> -- Make dummy I/O routines using the existing internal support for int4, text
> CREATE FUNCTION int42_in(cstring)
>    RETURNS int42
>    AS 'int4in'
>    LANGUAGE internal STRICT IMMUTABLE;
> CREATE FUNCTION int42_out(int42)
>    RETURNS cstring
>    AS 'int4out'
>    LANGUAGE internal STRICT IMMUTABLE;
> CREATE TYPE int42 (
>    internallength = 4,
>    input = int42_in,
>    output = int42_out,
>    alignment = int4,
>    default = 42,
>    passedbyvalue
> );
> COMMIT;
>
>
> CREATE TABLE gtest1 (a int42 GENERATED ALWAYS AS ('1') VIRTUAL);
> CREATE TABLE gtest2 (a int42 GENERATED ALWAYS AS ('1'::int42) VIRTUAL);
> ERROR:  generation expression uses user-defined type
> LINE 1: CREATE TABLE gtest2 (a int42 GENERATED ALWAYS AS ('1'::int42...
>                                                           ^
> DETAIL:  Virtual generated columns that make use of user-defined types
> are not yet supported.
>
> Do we need error out for the first case?
>

I think these two cases both should error out.

If generated column expressions do not allow user-defined types or functions, it
makes sense to also disallow virtual generated columns from using user-defined
types.
Attached patch change CheckAttributeType to do the job.
related tests also added.

Note: Support for composite types in virtual generated columns is
currently partial.
for example:

CREATE TYPE double_int as (a int, b int);
--ok
CREATE TABLE gtest4 (
    a int,
    b double_int GENERATED ALWAYS AS ((a * 2, a * 3)) VIRTUAL
);
--not ok.
CREATE TABLE gtest4 (
  a int,
  b double_int GENERATED ALWAYS AS ((a * 2, a * 3)::double_int) VIRTUAL
);

Attachment: v1-0001-disallow-user-defined-type-for-virtual-generated-colum.no-cfbot
Description: Binary data

Reply via email to