Skip to content

Commit 61a8a36

Browse files
Merge pull request #2567 from taozhi8833998/feat-or-and-expr-aggr-mysql
feat: support or and expr in aggr function args
2 parents aced536 + aa11ac0 commit 61a8a36

3 files changed

Lines changed: 10 additions & 3 deletions

File tree

pegjs/mariadb.pegjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3217,7 +3217,7 @@ aggr_func
32173217
/ aggr_fun_smma
32183218

32193219
aggr_fun_smma
3220-
= name:KW_SUM_MAX_MIN_AVG __ LPAREN __ e:expr __ RPAREN __ bc:over_partition? {
3220+
= name:KW_SUM_MAX_MIN_AVG __ LPAREN __ e:or_and_expr __ RPAREN __ bc:over_partition? {
32213221
return {
32223222
type: 'aggr_func',
32233223
name: name,

pegjs/mysql.pegjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3496,7 +3496,7 @@ aggr_func
34963496
/ aggr_fun_smma
34973497

34983498
aggr_fun_smma
3499-
= name:KW_SUM_MAX_MIN_AVG __ LPAREN __ e:expr __ RPAREN __ bc:over_partition? {
3499+
= name:KW_SUM_MAX_MIN_AVG __ LPAREN __ e:or_and_expr __ RPAREN __ bc:over_partition? {
35003500
return {
35013501
type: 'aggr_func',
35023502
name: name,

test/mysql-mariadb.spec.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1340,6 +1340,13 @@ describe('mysql', () => {
13401340
"SELECT * FROM `T1` EXCEPT SELECT * FROM `T2`"
13411341
]
13421342
},
1343+
{
1344+
title: 'or and expr in aggr_fun_smma',
1345+
sql: [
1346+
"SELECT SUM(a = 'a' AND b = 1) as foo FROM bar;",
1347+
"SELECT SUM(`a` = 'a' AND `b` = 1) AS `foo` FROM `bar`"
1348+
]
1349+
},
13431350
]
13441351
SQL_LIST.forEach(sqlInfo => {
13451352
const { title, sql } = sqlInfo
@@ -1356,7 +1363,7 @@ describe('mysql', () => {
13561363
expect(parser.astify.bind(parser, sql)).to.throw('Expected "!=", "#", "#-", "#>", "#>>", "%", "&", "&&", "*", "+", ",", "-", "--", "->", "->>", "/", "/*", "<", "<<", "<=", "<>", "<@", "=", ">", ">=", ">>", "?", "?&", "?|", "@>", "AND", "BETWEEN", "IN", "IS", "LIKE", "NOT", "ON", "OR", "OVER", "REGEXP", "RLIKE", "USING", "XOR", "^", "div", "mod", "|", "||", or [ \\t\\n\\r] but ")" found.')
13571364
expect(parser.astify.bind(parser, 'select convert("");')).to.throw('Expected "!=", "#", "#-", "#>", "#>>", "%", "&", "&&", "*", "+", ",", "-", "--", "->", "->>", "/", "/*", "<", "<<", "<=", "<>", "<@", "=", ">", ">=", ">>", "?", "?&", "?|", "@>", "AND", "BETWEEN", "COLLATE", "IN", "IS", "LIKE", "NOT", "OR", "REGEXP", "RLIKE", "USING", "XOR", "^", "div", "mod", "|", "||", or [ \\t\\n\\r] but ")" found.')
13581365
sql = 'SELECT AVG(Quantity,age) FROM table1;'
1359-
expect(parser.astify.bind(parser, sql)).to.throw('Expected "!=", "#", "#-", "#>", "#>>", "%", "&", "&&", "(", ")", "*", "+", "-", "--", "->", "->>", ".", "/", "/*", "<", "<<", "<=", "<>", "<@", "=", ">", ">=", ">>", "?", "?&", "?|", "@>", "BETWEEN", "COLLATE", "IN", "IS", "LIKE", "NOT", "REGEXP", "RLIKE", "XOR", "^", "div", "mod", "|", "||", [ \\t\\n\\r], [A-Za-z0-9_$\\x80-], or [A-Za-z0-9_:一-龥À-ſ] but "," found')
1366+
expect(parser.astify.bind(parser, sql)).to.throw('Expected "!=", "#", "#-", "#>", "#>>", "%", "&", "&&", "(", ")", "*", "+", "-", "--", "->", "->>", ".", "/", "/*", "<", "<<", "<=", "<>", "<@", "=", ">", ">=", ">>", "?", "?&", "?|", "@>", "AND", "BETWEEN", "COLLATE", "IN", "IS", "LIKE", "NOT", "OR", "REGEXP", "RLIKE", "XOR", "^", "div", "mod", "|", "||", [ \\t\\n\\r], [A-Za-z0-9_$\\x80-], or [A-Za-z0-9_:一-龥À-ſ] but "," found')
13601367
})
13611368

13621369
it('should join multiple table with comma', () => {

0 commit comments

Comments
 (0)