spinlud / sequelize-typescript-generator

70 stars 25 forks source link

Postgres tables are not escaped properly #24

Closed vjpr closed 2 years ago

vjpr commented 3 years ago

I am using the chinook database that uses table names starting with uppercase letters.

They need to be escaped when cast as an object identifier here:

  1. sequelize-typescript-generator/build/dialects/DialectPostgres.js:152
  2. sequelize-typescript-generator/build/dialects/DialectPostgres.js:260
Executing (default): SELECT
                CASE WHEN (seq.sequence_name IS NOT NULL) THEN TRUE ELSE FALSE END AS is_sequence,
                EXISTS( -- primary key
                   SELECT
                    x.indisprimary
                   FROM pg_attribute a
                    LEFT OUTER JOIN pg_index x
                        ON a.attnum = ANY (x.indkey) AND a.attrelid = x.indrelid
-                    WHERE a.attrelid = 'public.Artist'::regclass AND a.attnum > 0
+                    WHERE a.attrelid = 'public."Artist"'::regclass AND a.attnum > 0
                        AND c.ordinal_position = a.attnum AND x.indisprimary IS TRUE
                ) AS is_primary,
                c.*,
                pgd.description
            FROM information_schema.columns c
            INNER JOIN pg_catalog.pg_statio_all_tables as st
                ON c.table_schema = st.schemaname AND c.table_name = st.relname
            LEFT OUTER JOIN pg_catalog.pg_description pgd
                ON pgd.objoid = st.relid AND pgd.objsubid = c.ordinal_position
            LEFT OUTER JOIN ( -- Sequences (auto increment) metadata
                SELECT seqclass.relname AS sequence_name,
                       pn.nspname       AS schema_name,
                       depclass.relname AS table_name,
                       attrib.attname   AS column_name
                FROM pg_class AS seqclass
                         JOIN pg_sequence AS seq
                              ON (seq.seqrelid = seqclass.relfilenode)
                         JOIN pg_depend AS dep
                              ON (seq.seqrelid = dep.objid)
                         JOIN pg_class AS depclass
                              ON (dep.refobjid = depclass.relfilenode)
                         JOIN pg_attribute AS attrib
                              ON (attrib.attnum = dep.refobjsubid AND attrib.attrelid = dep.refobjid)
                         JOIN pg_namespace pn
                              ON seqclass.relnamespace = pn.oid
                WHERE pn.nspname = 'public' AND depclass.relname = 'Artist'
            ) seq
                 ON c.table_schema = seq.schema_name AND c.table_name = seq.table_name AND
                    c.column_name = seq.column_name
            WHERE c.table_schema = 'public' AND c.table_name = 'Artist'
            ORDER BY c.ordinal_position;
DatabaseError [SequelizeDatabaseError]: relation "public.artist" does not exist
    at Query.formatError (/xxx/node_modules/.pnpm/sequelize@6.6.2_pg@8.6.0/node_modules/sequelize/lib/dialects/postgres/query.js:386:16)
    at Query.run (/xxx/node_modules/.pnpm/sequelize@6.6.2_pg@8.6.0/node_modules/sequelize/lib/dialects/postgres/query.js:87:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at /xxx/node_modules/.pnpm/sequelize@6.6.2_pg@8.6.0/node_modules/sequelize/lib/sequelize.js:619:16
    at DialectPostgres.fetchColumnsMetadata (/xxx/node_modules/.pnpm/sequelize-typescript-generator@5.0.1_pg@8.6.0+reflect-metadata@0.1.13/node_modules/sequelize-typescript-generator/build/dialects/DialectPostgres.js:186:25)
    at DialectPostgres.buildTablesMetadata (/xxx/node_modules/.pnpm/sequelize-typescript-generator@5.0.1_pg@8.6.0+reflect-metadata@0.1.13/node_modules/sequelize-typescript-generator/build/dialects/Dialect.js:48:41)
    at ModelBuilder.build (/xxx/node_modules/.pnpm/sequelize-typescript-generator@5.0.1_pg@8.6.0+reflect-metadata@0.1.13/node_modules/sequelize-typescript-generator/build/builders/ModelBuilder.js:208:32)
    at generateEntities (/xxx/xxx/groups/typescript-orm-benchmarks/packages/orm/sequelize-typescript/src/scripts/generate-entities.ts:44:5)
    at Object.cli (/xxx/xxx/groups/typescript-orm-benchmarks/packages/orm/sequelize-typescript/src/scripts/generate-entities.ts:12:3) {
spinlud commented 3 years ago

Hi again! Thank you, please feel free to open a PR on the matter 😎

HussainMehdi commented 2 years ago

@spinlud I have raised PR for this fix. Kindly review and merge

spinlud commented 2 years ago

Merged! Thank you