diff --git a/src/sqlParser.jison b/src/sqlParser.jison index 4a8efbc..cba1ab1 100644 --- a/src/sqlParser.jison +++ b/src/sqlParser.jison @@ -91,6 +91,30 @@ MODE return 'MODE' OJ return 'OJ' LIMIT return 'LIMIT' UNION return 'UNION' +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 ',' "=" return '=' @@ -427,6 +451,8 @@ 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 IDENTIFIER { $$ = { 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 635e801..2335586 100644 --- a/src/stringify.js +++ b/src/stringify.js @@ -551,6 +551,12 @@ 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); +}; Sql.prototype.travelPlaceHolder = function (ast) { if (ast.left) { this.travel(ast.left); diff --git a/test/main.test.js b/test/main.test.js index 2ee9c1b..b5139e4 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -411,6 +411,19 @@ 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})"