Skip to content

Commit 3438a1d

Browse files
committed
feat(types): add includeArrayTypes param
By default `/types` doesn't return array types like `int8[]`, `text[]`, etc. This flag lets it include array types to help the typegen associate type OIDs with type names.
1 parent 396d5dc commit 3438a1d

File tree

3 files changed

+23
-13
lines changed

3 files changed

+23
-13
lines changed

src/lib/PostgresMetaTypes.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,35 @@ export default class PostgresMetaTypes {
1111
}
1212

1313
async list({
14+
includeArrayTypes = false,
1415
includeSystemSchemas = false,
1516
limit,
1617
offset,
1718
}: {
19+
includeArrayTypes?: boolean
1820
includeSystemSchemas?: boolean
1921
limit?: number
2022
offset?: number
2123
} = {}): Promise<PostgresMetaResult<PostgresType[]>> {
2224
let sql = typesSql
25+
if (!includeArrayTypes) {
26+
sql += ` and not exists (
27+
select
28+
from
29+
pg_type el
30+
where
31+
el.oid = t.typelem
32+
and el.typarray = t.oid
33+
)`
34+
}
2335
if (!includeSystemSchemas) {
24-
sql = `${sql} AND NOT (n.nspname IN (${DEFAULT_SYSTEM_SCHEMAS.map(literal).join(',')}))`
36+
sql += ` and n.nspname not in (${DEFAULT_SYSTEM_SCHEMAS.map(literal).join(',')})`
2537
}
2638
if (limit) {
27-
sql = `${sql} LIMIT ${limit}`
39+
sql += ` limit ${limit}`
2840
}
2941
if (offset) {
30-
sql = `${sql} OFFSET ${offset}`
42+
sql += ` offset ${offset}`
3143
}
3244
return await this.query(sql)
3345
}

src/lib/sql/types.sql

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,3 @@ WHERE
3131
c.oid = t.typrelid
3232
)
3333
)
34-
AND NOT EXISTS (
35-
SELECT
36-
1
37-
FROM
38-
pg_type el
39-
WHERE
40-
el.oid = t.typelem
41-
AND el.typarray = t.oid
42-
)

src/server/routes/types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,25 @@ export default async (fastify: FastifyInstance) => {
77
fastify.get<{
88
Headers: { pg: string }
99
Querystring: {
10+
include_array_types?: string
1011
include_system_schemas?: string
1112
limit?: number
1213
offset?: number
1314
}
1415
}>('/', async (request, reply) => {
1516
const connectionString = request.headers.pg
17+
const includeArrayTypes = request.query.include_array_types === 'true'
1618
const includeSystemSchemas = request.query.include_system_schemas === 'true'
1719
const limit = request.query.limit
1820
const offset = request.query.offset
1921

2022
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
21-
const { data, error } = await pgMeta.types.list({ includeSystemSchemas, limit, offset })
23+
const { data, error } = await pgMeta.types.list({
24+
includeArrayTypes,
25+
includeSystemSchemas,
26+
limit,
27+
offset,
28+
})
2229
await pgMeta.end()
2330
if (error) {
2431
request.log.error({ error, request: extractRequestForLogging(request) })

0 commit comments

Comments
 (0)