Skip to content

Commit f05813e

Browse files
committed
fix: rpc with empty args returning setof tables
1 parent 175e313 commit f05813e

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

src/lib/sql/functions.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ select
4545
nullif(rt.typrelid::int8, 0) as return_type_relation_id,
4646
f.proretset as is_set_returning_function,
4747
case
48-
when f.proretset and rt.typrelid != 0 then true
49-
else false
48+
when f.proretset and rt.typrelid != 0 and exists (
49+
select 1 from pg_class c
50+
where c.oid = rt.typrelid
51+
-- exclude custom types relation from what is considered a set of table
52+
and c.relkind in ('r', 'p', 'v', 'm', 'f')
53+
) then true
54+
else false
5055
end as returns_set_of_table,
5156
case
5257
when f.proretset and rt.typrelid != 0 then

src/server/templates/typescript.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -354,21 +354,21 @@ export type Database = {
354354
})()}${fns[0].is_set_returning_function && fns[0].returns_multiple_rows ? '[]' : ''}
355355
${
356356
// if the function return a set of a table and some definition take in parameter another table
357-
fns[0].returns_set_of_table &&
358-
fns.some((fnd) => fnd.args.length === 1 && fnd.args[0].table_name)
357+
fns[0].returns_set_of_table
359358
? `SetofOptions: {
360359
from: ${fns
361-
// if the function take a row as first parameter
362-
.filter(
363-
(fnd) =>
364-
fnd.args.length === 1 &&
365-
fnd.args[0].table_name &&
366-
typesById[fnd.args[0].type_id]
367-
)
368360
.map((fnd) => {
369-
const tableType = typesById[fnd.args[0].type_id]
370-
return JSON.stringify(tableType.format)
361+
if (fnd.args.length > 0 && fnd.args[0].table_name) {
362+
const tableType = typesById[fnd.args[0].type_id]
363+
return JSON.stringify(tableType.format)
364+
} else {
365+
// If the function can be called with scalars or without any arguments, then add a * matching everything
366+
return '"*"'
367+
}
371368
})
369+
// Dedup before join
370+
.filter((value, index, self) => self.indexOf(value) === index)
371+
.toSorted()
372372
.join(' | ')}
373373
to: ${JSON.stringify(fns[0].return_table_name)}
374374
isOneToOne: ${fns[0].returns_multiple_rows ? false : true}

test/server/typegen.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,11 @@ test('typegen: typescript', async () => {
458458
name: string | null
459459
status: Database["public"]["Enums"]["user_status"] | null
460460
}[]
461+
SetofOptions: {
462+
from: "*"
463+
to: "users"
464+
isOneToOne: false
465+
}
461466
}
462467
function_returning_table: {
463468
Args: Record<PropertyKey, never>
@@ -483,7 +488,7 @@ test('typegen: typescript', async () => {
483488
user_status: Database["public"]["Enums"]["user_status"] | null
484489
}
485490
SetofOptions: {
486-
from: "users" | "users_view"
491+
from: "*" | "users" | "users_view"
487492
to: "user_todos_summary_view"
488493
isOneToOne: true
489494
}
@@ -499,7 +504,7 @@ test('typegen: typescript', async () => {
499504
"user-id": number
500505
}[]
501506
SetofOptions: {
502-
from: "users" | "users_view"
507+
from: "*" | "users" | "users_view"
503508
to: "todos"
504509
isOneToOne: false
505510
}
@@ -514,7 +519,7 @@ test('typegen: typescript', async () => {
514519
"user-id": number
515520
}[]
516521
SetofOptions: {
517-
from: "users" | "todos"
522+
from: "todos" | "users"
518523
to: "todos"
519524
isOneToOne: false
520525
}
@@ -1185,6 +1190,11 @@ test('typegen w/ one-to-one relationships', async () => {
11851190
name: string | null
11861191
status: Database["public"]["Enums"]["user_status"] | null
11871192
}[]
1193+
SetofOptions: {
1194+
from: "*"
1195+
to: "users"
1196+
isOneToOne: false
1197+
}
11881198
}
11891199
function_returning_table: {
11901200
Args: Record<PropertyKey, never>
@@ -1210,7 +1220,7 @@ test('typegen w/ one-to-one relationships', async () => {
12101220
user_status: Database["public"]["Enums"]["user_status"] | null
12111221
}
12121222
SetofOptions: {
1213-
from: "users" | "users_view"
1223+
from: "*" | "users" | "users_view"
12141224
to: "user_todos_summary_view"
12151225
isOneToOne: true
12161226
}
@@ -1226,7 +1236,7 @@ test('typegen w/ one-to-one relationships', async () => {
12261236
"user-id": number
12271237
}[]
12281238
SetofOptions: {
1229-
from: "users" | "users_view"
1239+
from: "*" | "users" | "users_view"
12301240
to: "todos"
12311241
isOneToOne: false
12321242
}
@@ -1241,7 +1251,7 @@ test('typegen w/ one-to-one relationships', async () => {
12411251
"user-id": number
12421252
}[]
12431253
SetofOptions: {
1244-
from: "users" | "todos"
1254+
from: "todos" | "users"
12451255
to: "todos"
12461256
isOneToOne: false
12471257
}
@@ -1912,6 +1922,11 @@ test('typegen: typescript w/ one-to-one relationships', async () => {
19121922
name: string | null
19131923
status: Database["public"]["Enums"]["user_status"] | null
19141924
}[]
1925+
SetofOptions: {
1926+
from: "*"
1927+
to: "users"
1928+
isOneToOne: false
1929+
}
19151930
}
19161931
function_returning_table: {
19171932
Args: Record<PropertyKey, never>
@@ -1937,7 +1952,7 @@ test('typegen: typescript w/ one-to-one relationships', async () => {
19371952
user_status: Database["public"]["Enums"]["user_status"] | null
19381953
}
19391954
SetofOptions: {
1940-
from: "users" | "users_view"
1955+
from: "*" | "users" | "users_view"
19411956
to: "user_todos_summary_view"
19421957
isOneToOne: true
19431958
}
@@ -1953,7 +1968,7 @@ test('typegen: typescript w/ one-to-one relationships', async () => {
19531968
"user-id": number
19541969
}[]
19551970
SetofOptions: {
1956-
from: "users" | "users_view"
1971+
from: "*" | "users" | "users_view"
19571972
to: "todos"
19581973
isOneToOne: false
19591974
}
@@ -1968,7 +1983,7 @@ test('typegen: typescript w/ one-to-one relationships', async () => {
19681983
"user-id": number
19691984
}[]
19701985
SetofOptions: {
1971-
from: "users" | "todos"
1986+
from: "todos" | "users"
19721987
to: "todos"
19731988
isOneToOne: false
19741989
}

0 commit comments

Comments
 (0)