Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UnsupportedResultException: The result contains the unsupported data type regclass #544

Open
LukasMurdock opened this issue Aug 14, 2024 · 4 comments

Comments

@LukasMurdock
Copy link

Seemingly after drizzle-kit version 0.22.8 running drizzle-kit push results in UnsupportedResultException: The result contains the unsupported data type regclass

Using sst ion with Postgres and drizzle aws-data-api.

@KyloJorgensen
Copy link

KyloJorgensen commented Aug 14, 2024

I get this error when I update past when using the AWS RDS DATA API.

"drizzle-orm": "~0.30.10",
"drizzle-kit": "~0.21.4",

@LukasMurdock
Copy link
Author

LukasMurdock commented Aug 22, 2024

fwiw seems the issue is this SQL query:

`SELECT a.attrelid::regclass::text, a.attname, is_nullable, a.attndims as array_dimensions
        , CASE WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[])
             AND EXISTS (
                SELECT FROM pg_attrdef ad
                WHERE  ad.adrelid = a.attrelid
                AND    ad.adnum   = a.attnum
                AND    pg_get_expr(ad.adbin, ad.adrelid)
                     = 'nextval('''
                    || (pg_get_serial_sequence (a.attrelid::regclass::text
                                             , a.attname))::regclass
                    || '''::regclass)'
                )
           THEN CASE a.atttypid
                   WHEN 'int'::regtype  THEN 'serial'
                   WHEN 'int8'::regtype THEN 'bigserial'
                   WHEN 'int2'::regtype THEN 'smallserial'
                END
           ELSE format_type(a.atttypid, a.atttypmod)
           END AS data_type, INFORMATION_SCHEMA.COLUMNS.table_name, ns.nspname as type_schema,
           pg_get_serial_sequence('"${tableSchema}"."${tableName}"', a.attname)::regclass as seq_name, INFORMATION_SCHEMA.COLUMNS.column_name,
           INFORMATION_SCHEMA.COLUMNS.column_default, INFORMATION_SCHEMA.COLUMNS.data_type as additional_dt,
           INFORMATION_SCHEMA.COLUMNS.udt_name as enum_name,
           INFORMATION_SCHEMA.COLUMNS.is_generated, generation_expression,
           INFORMATION_SCHEMA.COLUMNS.is_identity,INFORMATION_SCHEMA.COLUMNS.identity_generation,
           INFORMATION_SCHEMA.COLUMNS.identity_start, INFORMATION_SCHEMA.COLUMNS.identity_increment,
           INFORMATION_SCHEMA.COLUMNS.identity_maximum, INFORMATION_SCHEMA.COLUMNS.identity_minimum,
           INFORMATION_SCHEMA.COLUMNS.identity_cycle
   FROM  pg_attribute  a
   JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname
   JOIN pg_type t ON t.oid = a.atttypid LEFT JOIN pg_namespace ns ON ns.oid = t.typnamespace
   WHERE  a.attrelid = '"${tableSchema}"."${tableName}"'::regclass and INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}' and INFORMATION_SCHEMA.COLUMNS.table_schema = '${tableSchema}'
   AND    a.attnum > 0
   AND    NOT a.attisdropped
   ORDER  BY a.attnum;`

Able to pass by changing it to

`SELECT a.attname,
       INFORMATION_SCHEMA.COLUMNS.is_nullable,
       a.attndims as array_dimensions,
       CASE
         WHEN t.typname = 'int4' AND EXISTS (
           SELECT 1 FROM pg_attrdef ad
           WHERE  ad.adrelid = a.attrelid
           AND    ad.adnum   = a.attnum
           AND    pg_get_expr(ad.adbin, ad.adrelid) LIKE 'nextval%'
         ) THEN 'serial'
         WHEN t.typname = 'int8' AND EXISTS (
           SELECT 1 FROM pg_attrdef ad
           WHERE  ad.adrelid = a.attrelid
           AND    ad.adnum   = a.attnum
           AND    pg_get_expr(ad.adbin, ad.adrelid) LIKE 'nextval%'
         ) THEN 'bigserial'
         WHEN t.typname = 'int2' AND EXISTS (
           SELECT 1 FROM pg_attrdef ad
           WHERE  ad.adrelid = a.attrelid
           AND    ad.adnum   = a.attnum
           AND    pg_get_expr(ad.adbin, ad.adrelid) LIKE 'nextval%'
         ) THEN 'smallserial'
         ELSE format_type(a.atttypid, a.atttypmod)
       END AS data_type,
       INFORMATION_SCHEMA.COLUMNS.table_name,
       ns.nspname as type_schema,
       INFORMATION_SCHEMA.COLUMNS.column_name,
       INFORMATION_SCHEMA.COLUMNS.column_default,
       INFORMATION_SCHEMA.COLUMNS.data_type as additional_dt,
       INFORMATION_SCHEMA.COLUMNS.udt_name as enum_name,
       INFORMATION_SCHEMA.COLUMNS.is_generated,
       INFORMATION_SCHEMA.COLUMNS.generation_expression,
       INFORMATION_SCHEMA.COLUMNS.is_identity,
       INFORMATION_SCHEMA.COLUMNS.identity_generation,
       INFORMATION_SCHEMA.COLUMNS.identity_start,
       INFORMATION_SCHEMA.COLUMNS.identity_increment,
       INFORMATION_SCHEMA.COLUMNS.identity_maximum,
       INFORMATION_SCHEMA.COLUMNS.identity_minimum,
       INFORMATION_SCHEMA.COLUMNS.identity_cycle
FROM pg_attribute a
JOIN INFORMATION_SCHEMA.COLUMNS
  ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname
JOIN pg_type t ON t.oid = a.atttypid
LEFT JOIN pg_namespace ns ON ns.oid = t.typnamespace
WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = '${tableName}' AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${tableSchema}'))
  AND INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}'
  AND INFORMATION_SCHEMA.COLUMNS.table_schema = '${tableSchema}'
  AND a.attnum > 0
  AND NOT a.attisdropped
ORDER BY a.attnum;`

edit: didn’t realize drizzle-kit is open source now, above refers to this query https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-kit/src/serializer/pgSerializer.ts#L723

@LukasMurdock
Copy link
Author

Might be as simple as

pg_get_serial_sequence('"${tableSchema}"."${tableName}"', a.attname)::regclass as seq_name, INFORMATION_SCHEMA.COLUMNS.column_name,
pg_get_serial_sequence('"${tableSchema}"."${tableName}"', a.attname) as seq_name, INFORMATION_SCHEMA.COLUMNS.column_name,

on

https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-kit/src/serializer/pgSerializer.ts#L743

Not sure if there are consequences to this or if this is valid.

@the-simian
Copy link

This issue may be in the wrong place, I opened an issue here: drizzle-team/drizzle-orm#2982

I also did some testing and I'm pretty sure the breaking change was introduced on

drizzle-kit: v0.23.0
drizzle-orm: v0.32.0

around July 10th.

You can downgrade to

drizzle-kit: v0.22.8
drizzle-orm: v0.31.2

which is the next-highest 'named-release' until this is resolved

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants