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})"