Skip to content

Commit 822fb21

Browse files
committed
Add support for dynamic columns with returning - fixes porsager#317
1 parent 6a631b7 commit 822fb21

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

src/types.js

+19-17
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,28 @@ function values(first, rest, parameters, types, transform) {
110110
return valuesBuilder(multi ? first : [first], parameters, types, transform, columns)
111111
}
112112

113+
function select(first, rest, parameters, types, transform) {
114+
typeof first === 'string' && (first = [first].concat(rest))
115+
if (Array.isArray(first))
116+
return first.map(x => escapeIdentifier(transform.column.to ? transform.column.to(x) : x)).join(',')
117+
118+
let value
119+
const columns = rest.length ? rest.flat() : Object.keys(first)
120+
return columns.map(x => {
121+
value = first[x]
122+
return (
123+
value instanceof Query ? value.strings[0] :
124+
value instanceof Identifier ? value.value :
125+
handleValue(value, parameters, types)
126+
) + ' as ' + escapeIdentifier(transform.column.to ? transform.column.to(x) : x)
127+
}).join(',')
128+
}
129+
113130
const builders = Object.entries({
114131
values,
115132
in: values,
133+
select,
134+
returning: select,
116135

117136
update(first, rest, parameters, types, transform) {
118137
return (rest.length ? rest.flat() : Object.keys(first)).map(x =>
@@ -121,23 +140,6 @@ const builders = Object.entries({
121140
)
122141
},
123142

124-
select(first, rest, parameters, types, transform) {
125-
typeof first === 'string' && (first = [first].concat(rest))
126-
if (Array.isArray(first))
127-
return first.map(x => escapeIdentifier(transform.column.to ? transform.column.to(x) : x)).join(',')
128-
129-
let value
130-
const columns = rest.length ? rest.flat() : Object.keys(first)
131-
return columns.map(x => {
132-
value = first[x]
133-
return (
134-
value instanceof Query ? value.strings[0] :
135-
value instanceof Identifier ? value.value :
136-
handleValue(value, parameters, types)
137-
) + ' as ' + escapeIdentifier(transform.column.to ? transform.column.to(x) : x)
138-
}).join(',')
139-
},
140-
141143
insert(first, rest, parameters, types, transform) {
142144
const columns = rest.length ? rest.flat() : Object.keys(Array.isArray(first) ? first[0] : first)
143145
return '(' + columns.map(x =>

tests/index.js

+9
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,15 @@ t('dynamic select array', async() => {
961961
return ['yay', (await sql`select ${ sql(['a', 'b']) } from test`)[0].b, await sql`drop table test`]
962962
})
963963

964+
t('dynamic returning array', async() => {
965+
await sql`create table test (a int, b text)`
966+
return [
967+
'yay',
968+
(await sql`insert into test (a, b) values (42, 'yay') returning ${ sql(['a', 'b']) }`)[0].b,
969+
await sql`drop table test`
970+
]
971+
})
972+
964973
t('dynamic select args', async() => {
965974
await sql`create table test (a int, b text)`
966975
await sql`insert into test (a, b) values (42, 'yay')`

0 commit comments

Comments
 (0)