Skip to content

Commit

Permalink
Fix bug with parallel nested sql expressions (#8)
Browse files Browse the repository at this point in the history
* add regression test

* complexify test

* fix bug

* remove count in SqlContainer
  • Loading branch information
lucleray authored Sep 18, 2018
1 parent 8f3b4f8 commit 4343619
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
11 changes: 8 additions & 3 deletions sql.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ const sqlText = (count, chains, expressions) => {
text += chains[i + 1]
} else if (expression && expression._sql instanceof SqlContainer) {
// if expression is a sub `sql` template literal
const { text: _text, values: _values } = sqlText(
const { text: _text, values: _values, count: _count } = sqlText(
count,
expression._sql.chains,
expression._sql.expressions
)
count = _count
text += _text + chains[i + 1]
values.push(..._values)
} else {
Expand All @@ -28,11 +29,15 @@ const sqlText = (count, chains, expressions) => {
return {
_sql: new SqlContainer(chains, expressions),
text,
values
values,
count
}
}

const sql = (chains, ...expressions) => sqlText(1, chains, expressions)
const sql = (chains, ...expressions) => {
const { _sql, text, values } = sqlText(1, chains, expressions)
return { _sql, text, values }
}

class SqlContainer {
constructor(chains, expressions) {
Expand Down
17 changes: 17 additions & 0 deletions test/sql.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,23 @@ test('imbricated sql tags (2 levels)', () => {
expect(query.values[2]).toBe(expr2)
})

test('imbricated sql tags (parallel)', () => {
const [expr0, expr1, expr2, expr3, expr4] = ['i', 'like', 'sql', 'a', 'lot']
const query = sql`
level 0 ${expr0}
${sql`a ${expr1} ${expr2}`}
${sql`b ${expr3} ${expr4}`}
`

expect(trimSpaces(query.text)).toBe('level 0 $1 a $2 $3 b $4 $5')
expect(query.values).toHaveLength(5)
expect(query.values[0]).toBe(expr0)
expect(query.values[1]).toBe(expr1)
expect(query.values[2]).toBe(expr2)
expect(query.values[3]).toBe(expr3)
expect(query.values[4]).toBe(expr4)
})

test('json as query parameter', () => {
const jsonValue = { _sql: { some: 'data' }, item: 'value' }
const query = sql`select obj from movies where obj = ${jsonValue}`
Expand Down

0 comments on commit 4343619

Please sign in to comment.