From b690640ca6872db15bb5d842bb1f11fefc675b65 Mon Sep 17 00:00:00 2001 From: joe-re Date: Sun, 16 Aug 2020 11:26:38 +0000 Subject: [PATCH] deal with subquery in where clause --- packages/sql-parser/base/fromClauseParser.js | 5 ++++- packages/sql-parser/base/parser.js | 5 ++++- packages/sql-parser/parser.pegjs | 1 + packages/sql-parser/test/subquery.test.js | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 packages/sql-parser/test/subquery.test.js diff --git a/packages/sql-parser/base/fromClauseParser.js b/packages/sql-parser/base/fromClauseParser.js index 26b8931d..34122fc8 100644 --- a/packages/sql-parser/base/fromClauseParser.js +++ b/packages/sql-parser/base/fromClauseParser.js @@ -5049,7 +5049,10 @@ function peg$parse(input, options) { s0 = peg$FAILED; } if (s0 === peg$FAILED) { - s0 = peg$parsevar_decl(); + s0 = peg$parseselect_stmt(); + if (s0 === peg$FAILED) { + s0 = peg$parsevar_decl(); + } } } } diff --git a/packages/sql-parser/base/parser.js b/packages/sql-parser/base/parser.js index 82d899ee..b02164b8 100644 --- a/packages/sql-parser/base/parser.js +++ b/packages/sql-parser/base/parser.js @@ -5049,7 +5049,10 @@ function peg$parse(input, options) { s0 = peg$FAILED; } if (s0 === peg$FAILED) { - s0 = peg$parsevar_decl(); + s0 = peg$parseselect_stmt(); + if (s0 === peg$FAILED) { + s0 = peg$parsevar_decl(); + } } } } diff --git a/packages/sql-parser/parser.pegjs b/packages/sql-parser/parser.pegjs index bf8fb813..396f6921 100644 --- a/packages/sql-parser/parser.pegjs +++ b/packages/sql-parser/parser.pegjs @@ -752,6 +752,7 @@ primary e.paren = true; return e; } + / select_stmt / var_decl column_ref diff --git a/packages/sql-parser/test/subquery.test.js b/packages/sql-parser/test/subquery.test.js new file mode 100644 index 00000000..2a4afff4 --- /dev/null +++ b/packages/sql-parser/test/subquery.test.js @@ -0,0 +1,16 @@ +const { parse } = require('../index') + +describe('Subquery in where clause', () => { + it('should success to parse', () => { + const sql = ` + SELECT * + FROM T1 + WHERE T1.num = (SELECT max(T2.num) from T2) + ` + const result = parse(sql) + expect(result).toBeDefined() + expect(result).toMatchObject({ type: 'select' }) + expect(result.where.expression.left).toMatchObject({ type: 'column_ref' }) + expect(result.where.expression.right).toMatchObject({ type: 'select' }) + }) +}) \ No newline at end of file