Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions pegjs/sqlite.pegjs
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ column_order
order_by: o && o.toLowerCase(),
}
}

create_index_stmt
= a:KW_CREATE __
kw:(KW_UNIQUE)? __
Expand All @@ -436,7 +436,7 @@ create_index_stmt
}
}
}

view_with
= KW_WITH __ c:("CASCADED"i / "LOCAL"i) __ "CHECK"i __ "OPTION" {
return `with ${c.toLowerCase()} check option`
Expand Down Expand Up @@ -1709,6 +1709,7 @@ update_stmt
KW_SET __
l:set_list __
w:where_clause? __
r:returning_stmt? __
or:order_by_clause? __
lc:limit_clause? {
const dbObj = {}
Expand Down Expand Up @@ -1737,6 +1738,7 @@ update_stmt
table: t,
set: l,
where: w,
returning: r,
orderby: or,
limit: lc,
}
Expand All @@ -1748,6 +1750,7 @@ delete_stmt
t: table_ref_list? __
f:from_clause __
w:where_clause? __
r:returning_stmt? __
or:order_by_clause? __
l:limit_clause? {
if(f) f.forEach(tableInfo => {
Expand All @@ -1773,6 +1776,7 @@ delete_stmt
table: t,
from: f,
where: w,
returning: r,
orderby: or,
limit: l,
}
Expand All @@ -1796,6 +1800,15 @@ set_item
return { column: c, value: v, table: tbl && tbl[0], keyword: 'values' };
}

returning_stmt
= k:KW_RETURNING __ c:(column_clause / select_stmt) {
// => { type: 'returning'; columns: column_clause | select_stmt; }
return {
type: k && k.toLowerCase() || 'returning',
columns: c === '*' && [{ type: 'expr', expr: { type: 'column_ref', table: null, column: '*' }, as: null }] || c
}
}

insert_value_clause
= value_clause
/ select_stmt_nake
Expand All @@ -1814,7 +1827,8 @@ replace_insert_stmt
t:table_name __
p:insert_partition? __ LPAREN __ c:column_list __ RPAREN __
v:insert_value_clause __
odp:on_duplicate_update_stmt? {
odp:on_duplicate_update_stmt? __
r:returning_stmt? {
if (t) {
tableList.add(`insert::${t.db}::${t.table}`)
t.as = null
Expand All @@ -1840,6 +1854,7 @@ replace_insert_stmt
values: v,
partition: p,
on_duplicate_update: odp,
returning: r,
}
};
}
Expand Down Expand Up @@ -2695,6 +2710,7 @@ KW_INSERT = "INSERT"i !ident_start
KW_RECURSIVE= "RECURSIVE"i !ident_start
KW_REPLACE = "REPLACE"i !ident_start
KW_RENAME = "RENAME"i !ident_start
KW_RETURNING = "RETURNING"i !ident_start { return 'RETURNING' }
KW_IGNORE = "IGNORE"i !ident_start
KW_EXPLAIN = "EXPLAIN"i !ident_start
KW_PARTITION = "PARTITION"i !ident_start { return 'PARTITION' }
Expand Down
26 changes: 26 additions & 0 deletions test/sqlite.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,30 @@ describe('sqlite', () => {
);`
expect(getParsedSql(sql)).to.be.equal(`CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" ("MigrationId" TEXT NOT NULL CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY, "ProductVersion" TEXT NOT NULL)`)
})

it('should support INSERT ... RETURNING *', () => {
const sql = `INSERT INTO users (email) VALUES (?) RETURNING *`
expect(getParsedSql(sql)).to.be.equal(`INSERT INTO "users" (email) VALUES (?) RETURNING *`)
})
it('should support INSERT ... RETURNING specific columns', () => {
const sql = `INSERT INTO users (email) VALUES (?) RETURNING id, email as email_address`
expect(getParsedSql(sql)).to.be.equal(`INSERT INTO "users" (email) VALUES (?) RETURNING "id", "email" AS "email_address"`)
})
it('should support UPDATE ... RETURNING *', () => {
const sql = `UPDATE users SET email = ? RETURNING *`
expect(getParsedSql(sql)).to.be.equal(`UPDATE "users" SET "email" = ? RETURNING *`)
})
it('should support UPDATE ... RETURNING specific columns', () => {
const sql = `UPDATE users SET email = ? RETURNING id, email as email_address`
expect(getParsedSql(sql)).to.be.equal(`UPDATE "users" SET "email" = ? RETURNING "id", "email" AS "email_address"`)
})
it('should support DELETE ... RETURNING *', () => {
const sql = `DELETE FROM users WHERE last_login > ? RETURNING *`
expect(getParsedSql(sql)).to.be.equal(`DELETE FROM "users" WHERE "last_login" > ? RETURNING *`)
})
it('should support DELETE ... RETURNING *', () => {
const sql = `DELETE FROM users WHERE last_login > ? RETURNING id, email as email_address`
expect(getParsedSql(sql)).to.be.equal(`DELETE FROM "users" WHERE "last_login" > ? RETURNING "id", "email" AS "email_address"`)
})

})