From b2810d2d598cdaa9e6544997064f886e623d89d8 Mon Sep 17 00:00:00 2001 From: sockstack <85564748@qq.com> Date: Fri, 28 Aug 2020 22:59:26 +0800 Subject: [PATCH 1/3] fixed unit_of_time fixed unit_of_time --- src/sqlParser.jison | 48 +++++++++++++++++++++++++++++++++++++++++++++ src/stringify.js | 5 +++++ test/main.test.js | 12 ++++++++++++ 3 files changed, 65 insertions(+) diff --git a/src/sqlParser.jison b/src/sqlParser.jison index 7cff3e8..2c9d779 100644 --- a/src/sqlParser.jison +++ b/src/sqlParser.jison @@ -90,6 +90,30 @@ MODE return 'MODE' OJ return 'OJ' LIMIT return 'LIMIT' UNION return 'UNION' +SECOND return 'SECOND' +MINUTE return 'MINUTE' +HOUR return 'HOUR' +SECONDS return 'SECONDS' +MINUTES return 'MINUTES' +HOURS return 'HOURS' +YEAR return 'YEAR' +MICROSECOND return 'MICROSECOND' +DAY return 'DAY' +WEEK return 'WEEK' +MONTH return 'MONTH' +QUARTER return 'QUARTER' +SECOND_MICROSECOND return 'SECOND_MICROSECOND' +MINUTE_MICROSECOND return 'MINUTE_MICROSECOND' +MINUTE_SECOND return 'MINUTE_SECOND' +HOUR_MICROSECOND return 'HOUR_MICROSECOND' +HOUR_SECOND return 'HOUR_SECOND' +HOUR_MINUTE return 'HOUR_MINUTE' +DAY_MICROSECOND return 'DAY_MICROSECOND' +DAY_SECOND return 'DAY_SECOND' +DAY_MINUTE return 'DAY_MINUTE' +DAY_HOUR return 'DAY_HOUR' +YEAR_MONTH return 'YEAR_MONTH' +INTERVAL return 'INTERVAL' "," return ',' "=" return '=' @@ -426,6 +450,30 @@ expr | expr OR expr { $$ = { type: 'OrExpression', operator: $2, left: $1, right: $3 } } | expr AND expr { $$ = { type: 'AndExpression', operator: $2, left: $1, right: $3 } } | expr XOR expr { $$ = { type: 'XORExpression', left: $1, right: $3 } } + | INTERVAL expr SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr HOUR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr SECONDS { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MINUTES { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr HOURS { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr YEAR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr DAY { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr WEEK { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MONTH { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr QUARTER { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr SECOND_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MINUTE_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr MINUTE_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr HOUR_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr HOUR_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr HOUR_MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr DAY_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr DAY_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr DAY_MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr DAY_HOUR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr YEAR_MONTH { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr INTERVAL { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } ; expr_list : expr { $$ = { type: 'ExpressionList', value: [ $1 ] } } diff --git a/src/stringify.js b/src/stringify.js index 57ea74e..e3dfed8 100644 --- a/src/stringify.js +++ b/src/stringify.js @@ -551,3 +551,8 @@ Sql.prototype.travelSelectParenthesized = function(ast) { this.travel(ast.value); this.appendKeyword(')'); }; +Sql.prototype.travelIntervalExpression = function (ast) { + this.appendKeyword('interval'); + this.travel(ast.value); + this.appendKeyword(ast.unit); +}; \ No newline at end of file diff --git a/test/main.test.js b/test/main.test.js index 834d3f1..2fad9da 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -411,4 +411,16 @@ describe('select grammar support', function() { it('bugfix table alias2', function() { testParser('select a.* from a t1 join b t2 on t1.a = t2.a') }) + + it('bugfix unit_of_time1', function() { + testParser(` + SELECT a, b, DATE_SUB(NOW(),INTERVAL 1 YEAR) as time from t1 + `) + }) + + it('bugfix unit_of_time1', function() { + testParser(` + SELECT a, b from t1 where created_at >= DATE_SUB(NOW(),INTERVAL 1 MONTH) + `) + }) }); From 9b15f187492a2733cd7037c7927f395102f2c465 Mon Sep 17 00:00:00 2001 From: sockstack <85564748@qq.com> Date: Mon, 31 Aug 2020 19:34:03 +0800 Subject: [PATCH 2/3] optimized code for unit_of_time of mysql optimized code for unit_of_time of mysql --- src/sqlParser.jison | 70 ++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/src/sqlParser.jison b/src/sqlParser.jison index 2c9d779..d42be51 100644 --- a/src/sqlParser.jison +++ b/src/sqlParser.jison @@ -90,29 +90,29 @@ MODE return 'MODE' OJ return 'OJ' LIMIT return 'LIMIT' UNION return 'UNION' -SECOND return 'SECOND' -MINUTE return 'MINUTE' -HOUR return 'HOUR' -SECONDS return 'SECONDS' -MINUTES return 'MINUTES' -HOURS return 'HOURS' -YEAR return 'YEAR' -MICROSECOND return 'MICROSECOND' -DAY return 'DAY' -WEEK return 'WEEK' -MONTH return 'MONTH' -QUARTER return 'QUARTER' -SECOND_MICROSECOND return 'SECOND_MICROSECOND' -MINUTE_MICROSECOND return 'MINUTE_MICROSECOND' -MINUTE_SECOND return 'MINUTE_SECOND' -HOUR_MICROSECOND return 'HOUR_MICROSECOND' -HOUR_SECOND return 'HOUR_SECOND' -HOUR_MINUTE return 'HOUR_MINUTE' -DAY_MICROSECOND return 'DAY_MICROSECOND' -DAY_SECOND return 'DAY_SECOND' -DAY_MINUTE return 'DAY_MINUTE' -DAY_HOUR return 'DAY_HOUR' -YEAR_MONTH return 'YEAR_MONTH' +SECOND return 'IDENTIFIER' +MINUTE return 'IDENTIFIER' +HOUR return 'IDENTIFIER' +SECONDS return 'IDENTIFIER' +MINUTES return 'IDENTIFIER' +HOURS return 'IDENTIFIER' +YEAR return 'IDENTIFIER' +MICROSECOND return 'IDENTIFIER' +DAY return 'IDENTIFIER' +WEEK return 'IDENTIFIER' +MONTH return 'IDENTIFIER' +QUARTER return 'IDENTIFIER' +SECOND_MICROSECOND return 'IDENTIFIER' +MINUTE_MICROSECOND return 'IDENTIFIER' +MINUTE_SECOND return 'IDENTIFIER' +HOUR_MICROSECOND return 'IDENTIFIER' +HOUR_SECOND return 'IDENTIFIER' +HOUR_MINUTE return 'IDENTIFIER' +DAY_MICROSECOND return 'IDENTIFIER' +DAY_SECOND return 'IDENTIFIER' +DAY_MINUTE return 'IDENTIFIER' +DAY_HOUR return 'IDENTIFIER' +YEAR_MONTH return 'IDENTIFIER' INTERVAL return 'INTERVAL' "," return ',' @@ -450,29 +450,7 @@ expr | expr OR expr { $$ = { type: 'OrExpression', operator: $2, left: $1, right: $3 } } | expr AND expr { $$ = { type: 'AndExpression', operator: $2, left: $1, right: $3 } } | expr XOR expr { $$ = { type: 'XORExpression', left: $1, right: $3 } } - | INTERVAL expr SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr HOUR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr SECONDS { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MINUTES { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr HOURS { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr YEAR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr DAY { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr WEEK { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MONTH { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr QUARTER { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr SECOND_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MINUTE_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr MINUTE_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr HOUR_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr HOUR_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr HOUR_MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr DAY_MICROSECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr DAY_SECOND { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr DAY_MINUTE { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr DAY_HOUR { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } - | INTERVAL expr YEAR_MONTH { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } + | INTERVAL expr IDENTIFIER { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } | INTERVAL expr INTERVAL { $$ = { type: 'IntervalExpression', value: $2, unit: $3 } } ; expr_list From e1e5ed4df761321adcce3dd7174c6baf684a733e Mon Sep 17 00:00:00 2001 From: sockstack <44636592+sockstack@users.noreply.github.com> Date: Sat, 31 Jul 2021 09:40:01 +0800 Subject: [PATCH 3/3] Update main.test.js --- test/main.test.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/main.test.js b/test/main.test.js index ef65899..b5139e4 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -410,21 +410,20 @@ describe('select grammar support', function () { it('bugfix table alias2', function () { testParser('select a.* from a t1 join b t2 on t1.a = t2.a') - }) + }); it('bugfix unit_of_time1', function() { testParser(` SELECT a, b, DATE_SUB(NOW(),INTERVAL 1 YEAR) as time from t1 `) - }) + }); it('bugfix unit_of_time1', function() { testParser(` SELECT a, b from t1 where created_at >= DATE_SUB(NOW(),INTERVAL 1 MONTH) `) - }) - }); + it('place holder support', function() { testParser( "select sum(quota_value) value, busi_col2 as sh, ${a} as a, YEAR(now()) from der_quota_summary where table_ename = 'gshmyyszje_derivedidx' and cd = (select id from t1 where a = ${t1})"