From a64782dd54882242bc1e91ac4c1b5965f8fc1081 Mon Sep 17 00:00:00 2001 From: Scott Gress Date: Sun, 25 Jan 2026 21:09:17 -0500 Subject: [PATCH] Refactor union stmt for CTEs to include values --- pegjs/sqlite.pegjs | 8 +++++++- test/sqlite.spec.js | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pegjs/sqlite.pegjs b/pegjs/sqlite.pegjs index 6026ffca..26537dc7 100644 --- a/pegjs/sqlite.pegjs +++ b/pegjs/sqlite.pegjs @@ -266,8 +266,14 @@ set_op return s ? `union ${s.toLowerCase()}` : 'union' } +select_core + = select_stmt + / v:value_clause { + return { type: 'values', values: v.values } + } + union_stmt - = head:select_stmt tail:(__ set_op __ select_stmt)* __ ob: order_by_clause? __ l:limit_clause? { + = head:select_core tail:(__ set_op __ select_core)* __ ob: order_by_clause? __ l:limit_clause? { let cur = head for (let i = 0; i < tail.length; i++) { cur._next = tail[i][3] diff --git a/test/sqlite.spec.js b/test/sqlite.spec.js index 5f8c11c3..1e5e0a10 100644 --- a/test/sqlite.spec.js +++ b/test/sqlite.spec.js @@ -300,4 +300,13 @@ describe('sqlite', () => { expect(getParsedSql(sql)).to.be.equal(sql) }); }); + it('should support CTE with VALUES', () => { + const sql = `WITH RECURSIVE cnt(x) AS ( + VALUES(1) + UNION ALL + SELECT x+1 FROM cnt WHERE x < 10 +) +SELECT x FROM cnt;` + expect(getParsedSql(sql)).to.be.equal(`WITH RECURSIVE "cnt"("x") AS ((1)) SELECT "x" FROM "cnt"`) + }) })