From d3c48713227e85f97011aec98ff6241e6d0cf33f Mon Sep 17 00:00:00 2001
From: Ernesto Rodriguez Ortiz <ernesto.ortiz@tracktik.com>
Date: Thu, 26 Mar 2020 19:42:16 -0400
Subject: [PATCH] feat: add support for quoted alias

---
 src/sqlParser.jison |  3 +++
 test/main.test.js   | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/src/sqlParser.jison b/src/sqlParser.jison
index e3cb798..ee5b329 100644
--- a/src/sqlParser.jison
+++ b/src/sqlParser.jison
@@ -127,6 +127,7 @@ UNION                                                             return 'UNION'
 [a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*                  return 'IDENTIFIER'
 \.                                                                return 'DOT'
 ['"][a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*["']          return 'QUOTED_IDENTIFIER'
+[`].+[`]                                                          return 'QUOTED_IDENTIFIER'
 
 <<EOF>>                                                           return 'EOF'
 .                                                                 return 'INVALID'
@@ -279,6 +280,8 @@ selectExprAliasOpt
   : { $$ = {alias: null, hasAs: null} }
   | AS IDENTIFIER { $$ = {alias: $2, hasAs: true} }
   | IDENTIFIER { $$ = {alias: $1, hasAs: false} }
+  | AS QUOTED_IDENTIFIER { $$ = {alias: $2, hasAs: true} }
+  | QUOTED_IDENTIFIER { $$ = {alias: $1, hasAs: false} }
   ;
 
 string
diff --git a/test/main.test.js b/test/main.test.js
index 988c1cc..558d133 100644
--- a/test/main.test.js
+++ b/test/main.test.js
@@ -387,4 +387,14 @@ describe('select grammar support', function() {
       'select a from dual order by a desc limit 1, 1 union distinct select a from foo order by a limit 1'
     );
   });
+
+  it('support quoted alias', function() {
+    testParser('select a as `A-A` from b limit 2;');
+    testParser('select a as `A#A` from b limit 2;');
+    testParser('select a as `A?A` from b limit 2;');
+    testParser('select a as `A/B` from b limit 2;');
+    testParser('select a as `A.A` from b limit 2;');
+    testParser('select a as `A|A` from b limit 2;');
+    testParser('select a as `A A` from b limit 2;');
+  });
 });