Skip to content

Commit 4343619

Browse files
authored
Fix bug with parallel nested sql expressions (#8)
* add regression test * complexify test * fix bug * remove count in SqlContainer
1 parent 8f3b4f8 commit 4343619

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

sql.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ const sqlText = (count, chains, expressions) => {
1010
text += chains[i + 1]
1111
} else if (expression && expression._sql instanceof SqlContainer) {
1212
// if expression is a sub `sql` template literal
13-
const { text: _text, values: _values } = sqlText(
13+
const { text: _text, values: _values, count: _count } = sqlText(
1414
count,
1515
expression._sql.chains,
1616
expression._sql.expressions
1717
)
18+
count = _count
1819
text += _text + chains[i + 1]
1920
values.push(..._values)
2021
} else {
@@ -28,11 +29,15 @@ const sqlText = (count, chains, expressions) => {
2829
return {
2930
_sql: new SqlContainer(chains, expressions),
3031
text,
31-
values
32+
values,
33+
count
3234
}
3335
}
3436

35-
const sql = (chains, ...expressions) => sqlText(1, chains, expressions)
37+
const sql = (chains, ...expressions) => {
38+
const { _sql, text, values } = sqlText(1, chains, expressions)
39+
return { _sql, text, values }
40+
}
3641

3742
class SqlContainer {
3843
constructor(chains, expressions) {

test/sql.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,23 @@ test('imbricated sql tags (2 levels)', () => {
7777
expect(query.values[2]).toBe(expr2)
7878
})
7979

80+
test('imbricated sql tags (parallel)', () => {
81+
const [expr0, expr1, expr2, expr3, expr4] = ['i', 'like', 'sql', 'a', 'lot']
82+
const query = sql`
83+
level 0 ${expr0}
84+
${sql`a ${expr1} ${expr2}`}
85+
${sql`b ${expr3} ${expr4}`}
86+
`
87+
88+
expect(trimSpaces(query.text)).toBe('level 0 $1 a $2 $3 b $4 $5')
89+
expect(query.values).toHaveLength(5)
90+
expect(query.values[0]).toBe(expr0)
91+
expect(query.values[1]).toBe(expr1)
92+
expect(query.values[2]).toBe(expr2)
93+
expect(query.values[3]).toBe(expr3)
94+
expect(query.values[4]).toBe(expr4)
95+
})
96+
8097
test('json as query parameter', () => {
8198
const jsonValue = { _sql: { some: 'data' }, item: 'value' }
8299
const query = sql`select obj from movies where obj = ${jsonValue}`

0 commit comments

Comments
 (0)