Index: cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java =================================================================== --- cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java (revision 1442678) +++ cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java (working copy) @@ -55,7 +55,7 @@ import org.apache.hadoop.hive.ql.exec.HadoopJobExecHelper; import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.exec.Utilities.StreamPrinter; -import org.apache.hadoop.hive.ql.parse.ParseDriver; +import org.apache.hadoop.hive.ql.parse.HiveParser; import org.apache.hadoop.hive.ql.parse.VariableSubstitution; import org.apache.hadoop.hive.ql.processors.CommandProcessor; import org.apache.hadoop.hive.ql.processors.CommandProcessorFactory; @@ -536,7 +536,7 @@ } // We add Hive keywords, including lower-cased versions - for (String s : ParseDriver.getKeywords()) { + for (String s : HiveParser.getKeywords()) { sc.addCandidateString(s); sc.addCandidateString(s.toLowerCase()); } Index: ql/src/test/results/clientnegative/show_tables_bad1.q.out =================================================================== --- ql/src/test/results/clientnegative/show_tables_bad1.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/show_tables_bad1.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 1:16 mismatched input '' expecting set null in Identifier for show statement +FAILED: ParseException line 1:12 extraneous input 'JOIN' expecting EOF near '' Index: ql/src/test/results/clientnegative/archive_partspec3.q.out =================================================================== --- ql/src/test/results/clientnegative/archive_partspec3.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/archive_partspec3.q.out (working copy) @@ -23,5 +23,5 @@ POSTHOOK: Output: default@srcpart_archived@ds=2008-04-08/hr=12 POSTHOOK: Lineage: srcpart_archived PARTITION(ds=2008-04-08,hr=12).key SIMPLE [(srcpart)srcpart.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: srcpart_archived PARTITION(ds=2008-04-08,hr=12).value SIMPLE [(srcpart)srcpart.FieldSchema(name:value, type:string, comment:default), ] -FAILED: ParseException line 3:48 missing Identifier at ')' near '' +FAILED: ParseException line 3:48 cannot recognize input near ')' '' '' in archive statement Index: ql/src/test/results/clientnegative/invalid_create_tbl2.q.out =================================================================== --- ql/src/test/results/clientnegative/invalid_create_tbl2.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/invalid_create_tbl2.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 1:7 Failed to recognize predicate 'tabl'. Failed rule: 'kwRole' in create role +FAILED: ParseException line 1:7 cannot recognize input near 'create' 'tabl' 'tmp_zshao_22' in ddl statement Index: ql/src/test/results/clientnegative/select_udtf_alias.q.out =================================================================== --- ql/src/test/results/clientnegative/select_udtf_alias.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/select_udtf_alias.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 3:49 mismatched input 'LIMIT' expecting FROM near ')' in from clause +FAILED: ParseException line 3:49 missing FROM at 'LIMIT' near ')' in table name Index: ql/src/test/results/clientnegative/show_tables_bad2.q.out =================================================================== --- ql/src/test/results/clientnegative/show_tables_bad2.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/show_tables_bad2.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 1:29 mismatched input '' expecting set null in Identifier for show statement +FAILED: ParseException line 1:32 extraneous input 'b' expecting EOF near '' Index: ql/src/test/results/clientnegative/invalid_tbl_name.q.out =================================================================== --- ql/src/test/results/clientnegative/invalid_tbl_name.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/invalid_tbl_name.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 1:13 cannot recognize input near 'invalid' '-' 'name' in table name +FAILED: ParseException line 1:20 cannot recognize input near 'invalid' '-' 'name' in table name Index: ql/src/test/results/clientnegative/lateral_view_join.q.out =================================================================== --- ql/src/test/results/clientnegative/lateral_view_join.q.out (revision 1442678) +++ ql/src/test/results/clientnegative/lateral_view_join.q.out (working copy) @@ -1,2 +1,2 @@ -FAILED: ParseException line 1:59 extraneous input 'AS' expecting Identifier near 'myTable' in lateral view +FAILED: ParseException line 1:62 missing AS at 'myTable' near '' Index: ql/src/test/results/clientpositive/nonreserved_keywords_input37.q.out =================================================================== --- ql/src/test/results/clientpositive/nonreserved_keywords_input37.q.out (revision 0) +++ ql/src/test/results/clientpositive/nonreserved_keywords_input37.q.out (working copy) @@ -0,0 +1,35 @@ +PREHOOK: query: CREATE TABLE table(string string) STORED AS TEXTFILE +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE table(string string) STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@table +PREHOOK: query: LOAD DATA LOCAL INPATH '../data/files/docurl.txt' INTO TABLE table +PREHOOK: type: LOAD +PREHOOK: Output: default@table +POSTHOOK: query: LOAD DATA LOCAL INPATH '../data/files/docurl.txt' INTO TABLE table +POSTHOOK: type: LOAD +POSTHOOK: Output: default@table +PREHOOK: query: SELECT table, count(1) +FROM +( + FROM table + MAP table.string +#### A masked pattern was here #### +) subq +GROUP BY table +PREHOOK: type: QUERY +PREHOOK: Input: default@table +#### A masked pattern was here #### +POSTHOOK: query: SELECT table, count(1) +FROM +( + FROM table + MAP table.string +#### A masked pattern was here #### +) subq +GROUP BY table +POSTHOOK: type: QUERY +POSTHOOK: Input: default@table +#### A masked pattern was here #### +1uauniajqtunlsvadmxhlxvngxpqjuzbpzvdiwmzphmbaicduzkgxgtdeiunduosu.html 4 +4uzsbtwvdypfitqfqdjosynqp.html 4 Index: ql/src/test/results/clientpositive/nonreserved_keywords_insert_into1.q.out =================================================================== --- ql/src/test/results/clientpositive/nonreserved_keywords_insert_into1.q.out (revision 0) +++ ql/src/test/results/clientpositive/nonreserved_keywords_insert_into1.q.out (working copy) @@ -0,0 +1,333 @@ +PREHOOK: query: DROP TABLE insert +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE insert +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE insert (from INT, as STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE insert (from INT, as STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@insert +PREHOOK: query: EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_INSERT_INTO (TOK_TAB (TOK_TABNAME insert))) (TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF)) (TOK_LIMIT 100))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + Stage-2 depends on stages: Stage-0 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: key + type: string + expr: value + type: string + outputColumnNames: _col0, _col1 + Limit + Reduce Output Operator + sort order: + tag: -1 + value expressions: + expr: _col0 + type: string + expr: _col1 + type: string + Reduce Operator Tree: + Extract + Limit + Select Operator + expressions: + expr: UDFToInteger(_col0) + type: int + expr: _col1 + type: string + outputColumnNames: _col0, _col1 + File Output Operator + compressed: false + GlobalTableId: 1 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-0 + Move Operator + tables: + replace: false + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-2 + Stats-Aggr Operator + + +PREHOOK: query: INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@insert +POSTHOOK: query: INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@insert +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +PREHOOK: query: SELECT SUM(HASH(hash)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (hash) FROM insert +) t +PREHOOK: type: QUERY +PREHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: query: SELECT SUM(HASH(hash)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (hash) FROM insert +) t +POSTHOOK: type: QUERY +POSTHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +10226524244 +PREHOOK: query: EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +POSTHOOK: type: QUERY +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_INSERT_INTO (TOK_TAB (TOK_TABNAME insert))) (TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF)) (TOK_LIMIT 100))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + Stage-2 depends on stages: Stage-0 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: key + type: string + expr: value + type: string + outputColumnNames: _col0, _col1 + Limit + Reduce Output Operator + sort order: + tag: -1 + value expressions: + expr: _col0 + type: string + expr: _col1 + type: string + Reduce Operator Tree: + Extract + Limit + Select Operator + expressions: + expr: UDFToInteger(_col0) + type: int + expr: _col1 + type: string + outputColumnNames: _col0, _col1 + File Output Operator + compressed: false + GlobalTableId: 1 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-0 + Move Operator + tables: + replace: false + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-2 + Stats-Aggr Operator + + +PREHOOK: query: INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@insert +POSTHOOK: query: INSERT INTO TABLE insert SELECT * FROM src LIMIT 100 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@insert +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +PREHOOK: query: SELECT SUM(HASH(sum)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (sum) FROM insert +) t +PREHOOK: type: QUERY +PREHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: query: SELECT SUM(HASH(sum)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (sum) FROM insert +) t +POSTHOOK: type: QUERY +POSTHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +20453048488 +PREHOOK: query: SELECT COUNT(*) FROM insert +PREHOOK: type: QUERY +PREHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: query: SELECT COUNT(*) FROM insert +POSTHOOK: type: QUERY +POSTHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +200 +PREHOOK: query: EXPLAIN INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10 +POSTHOOK: type: QUERY +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_TAB (TOK_TABNAME insert))) (TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF)) (TOK_LIMIT 10))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + Stage-2 depends on stages: Stage-0 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: key + type: string + expr: value + type: string + outputColumnNames: _col0, _col1 + Limit + Reduce Output Operator + sort order: + tag: -1 + value expressions: + expr: _col0 + type: string + expr: _col1 + type: string + Reduce Operator Tree: + Extract + Limit + Select Operator + expressions: + expr: UDFToInteger(_col0) + type: int + expr: _col1 + type: string + outputColumnNames: _col0, _col1 + File Output Operator + compressed: false + GlobalTableId: 1 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-0 + Move Operator + tables: + replace: true + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: default.insert + + Stage: Stage-2 + Stats-Aggr Operator + + +PREHOOK: query: INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@insert +POSTHOOK: query: INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@insert +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +PREHOOK: query: SELECT SUM(HASH(add)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (add) FROM insert +) t +PREHOOK: type: QUERY +PREHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: query: SELECT SUM(HASH(add)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (add) FROM insert +) t +POSTHOOK: type: QUERY +POSTHOOK: Input: default@insert +#### A masked pattern was here #### +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +-826625916 +PREHOOK: query: DROP TABLE insert +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@insert +PREHOOK: Output: default@insert +POSTHOOK: query: DROP TABLE insert +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@insert +POSTHOOK: Output: default@insert +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.as SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: insert.from EXPRESSION [(src)src.FieldSchema(name:key, type:string, comment:default), ] Index: ql/src/test/results/compiler/errors/wrong_distinct2.q.out =================================================================== --- ql/src/test/results/compiler/errors/wrong_distinct2.q.out (revision 1442678) +++ ql/src/test/results/compiler/errors/wrong_distinct2.q.out (working copy) @@ -1 +1 @@ -Parse Error: line 2:45 cannot recognize input near 'DISTINCT' 'substr' '(' in select expression +Parse Error: line 2:60 missing EOF at '(' near 'substr' Index: ql/src/test/results/compiler/errors/missing_overwrite.q.out =================================================================== --- ql/src/test/results/compiler/errors/missing_overwrite.q.out (revision 1442678) +++ ql/src/test/results/compiler/errors/missing_overwrite.q.out (working copy) @@ -1 +1 @@ -Parse Error: line 2:0 cannot recognize input near 'INSERT' 'TABLE' 'dest1' in insert clause +Parse Error: line 2:7 cannot recognize input near 'INSERT' 'TABLE' 'dest1' in table source Index: ql/src/test/queries/clientnegative/show_tables_bad1.q =================================================================== --- ql/src/test/queries/clientnegative/show_tables_bad1.q (revision 1442678) +++ ql/src/test/queries/clientnegative/show_tables_bad1.q (working copy) @@ -1 +1 @@ -SHOW TABLES LIKE; +SHOW TABLES JOIN; Index: ql/src/test/queries/clientnegative/show_tables_bad2.q =================================================================== --- ql/src/test/queries/clientnegative/show_tables_bad2.q (revision 1442678) +++ ql/src/test/queries/clientnegative/show_tables_bad2.q (working copy) @@ -1 +1 @@ -SHOW TABLES FROM default LIKE; +SHOW TABLES FROM default LIKE a b; Index: ql/src/test/queries/clientpositive/nonreserved_keywords_insert_into1.q =================================================================== --- ql/src/test/queries/clientpositive/nonreserved_keywords_insert_into1.q (revision 0) +++ ql/src/test/queries/clientpositive/nonreserved_keywords_insert_into1.q (working copy) @@ -0,0 +1,26 @@ +DROP TABLE insert; + +CREATE TABLE insert (from INT, as STRING); + +EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100; +INSERT INTO TABLE insert SELECT * FROM src LIMIT 100; +SELECT SUM(HASH(hash)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (hash) FROM insert +) t; + +EXPLAIN INSERT INTO TABLE insert SELECT * FROM src LIMIT 100; +INSERT INTO TABLE insert SELECT * FROM src LIMIT 100; +SELECT SUM(HASH(sum)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (sum) FROM insert +) t; + +SELECT COUNT(*) FROM insert; + +EXPLAIN INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10; +INSERT OVERWRITE TABLE insert SELECT * FROM src LIMIT 10; +SELECT SUM(HASH(add)) FROM ( + SELECT TRANSFORM(*) USING 'tr \t _' AS (add) FROM insert +) t; + + +DROP TABLE insert; Index: ql/src/test/queries/clientpositive/nonreserved_keywords_input37.q =================================================================== --- ql/src/test/queries/clientpositive/nonreserved_keywords_input37.q (revision 0) +++ ql/src/test/queries/clientpositive/nonreserved_keywords_input37.q (working copy) @@ -0,0 +1,12 @@ +CREATE TABLE table(string string) STORED AS TEXTFILE; + +LOAD DATA LOCAL INPATH '../data/files/docurl.txt' INTO TABLE table; + +SELECT table, count(1) +FROM +( + FROM table + MAP table.string + USING 'java -cp ../build/ql/test/classes org.apache.hadoop.hive.scripts.extracturl' AS (table, count) +) subq +GROUP BY table; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g (working copy) @@ -0,0 +1,221 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +parser grammar FromClauseParser; + +options +{ +output=AST; +ASTLabelType=CommonTree; +backtrack=false; +k=3; +} + +@members { + @Override + public Object recoverFromMismatchedSet(IntStream input, + RecognitionException re, BitSet follow) throws RecognitionException { + throw re; + } + @Override + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) { + gParent.errors.add(new ParseError(gParent, e, tokenNames)); + } +} + +@rulecatch { +catch (RecognitionException e) { + throw e; +} +} + +//----------------------------------------------------------------------------------- + +tableAllColumns + : STAR + -> ^(TOK_ALLCOLREF) + | tableName DOT STAR + -> ^(TOK_ALLCOLREF tableName) + ; + +// (table|column) +tableOrColumn +@init { gParent.msgs.push("table or column identifier"); } +@after { gParent.msgs.pop(); } + : + identifier -> ^(TOK_TABLE_OR_COL identifier) + ; + +expressionList +@init { gParent.msgs.push("expression list"); } +@after { gParent.msgs.pop(); } + : + expression (COMMA expression)* -> ^(TOK_EXPLIST expression+) + ; + +aliasList +@init { gParent.msgs.push("alias list"); } +@after { gParent.msgs.pop(); } + : + identifier (COMMA identifier)* -> ^(TOK_ALIASLIST identifier+) + ; + +//----------------------- Rules for parsing fromClause ------------------------------ +// from [col1, col2, col3] table1, [col4, col5] table2 +fromClause +@init { gParent.msgs.push("from clause"); } +@after { gParent.msgs.pop(); } + : + KW_FROM joinSource -> ^(TOK_FROM joinSource) + ; + +joinSource +@init { gParent.msgs.push("join source"); } +@after { gParent.msgs.pop(); } + : fromSource ( joinToken^ fromSource (KW_ON! expression)? )* + | uniqueJoinToken^ uniqueJoinSource (COMMA! uniqueJoinSource)+ + ; + +uniqueJoinSource +@init { gParent.msgs.push("join source"); } +@after { gParent.msgs.pop(); } + : KW_PRESERVE? fromSource uniqueJoinExpr + ; + +uniqueJoinExpr +@init { gParent.msgs.push("unique join expression list"); } +@after { gParent.msgs.pop(); } + : LPAREN e1+=expression (COMMA e1+=expression)* RPAREN + -> ^(TOK_EXPLIST $e1*) + ; + +uniqueJoinToken +@init { gParent.msgs.push("unique join"); } +@after { gParent.msgs.pop(); } + : KW_UNIQUEJOIN -> TOK_UNIQUEJOIN; + +joinToken +@init { gParent.msgs.push("join type specifier"); } +@after { gParent.msgs.pop(); } + : + KW_JOIN -> TOK_JOIN + | KW_INNER KW_JOIN -> TOK_JOIN + | KW_CROSS KW_JOIN -> TOK_CROSSJOIN + | KW_LEFT KW_OUTER KW_JOIN -> TOK_LEFTOUTERJOIN + | KW_RIGHT KW_OUTER KW_JOIN -> TOK_RIGHTOUTERJOIN + | KW_FULL KW_OUTER KW_JOIN -> TOK_FULLOUTERJOIN + | KW_LEFT KW_SEMI KW_JOIN -> TOK_LEFTSEMIJOIN + ; + +lateralView +@init {gParent.msgs.push("lateral view"); } +@after {gParent.msgs.pop(); } + : + KW_LATERAL KW_VIEW function tableAlias KW_AS identifier (COMMA identifier)* -> ^(TOK_LATERAL_VIEW ^(TOK_SELECT ^(TOK_SELEXPR function identifier+ tableAlias))) + ; + +tableAlias +@init {gParent.msgs.push("table alias"); } +@after {gParent.msgs.pop(); } + : + identifier -> ^(TOK_TABALIAS identifier) + ; + +fromSource +@init { gParent.msgs.push("from source"); } +@after { gParent.msgs.pop(); } + : + (tableSource | subQuerySource) (lateralView^)* + ; + +tableBucketSample +@init { gParent.msgs.push("table bucket sample specification"); } +@after { gParent.msgs.pop(); } + : + KW_TABLESAMPLE LPAREN KW_BUCKET (numerator=Number) KW_OUT KW_OF (denominator=Number) (KW_ON expr+=expression (COMMA expr+=expression)*)? RPAREN -> ^(TOK_TABLEBUCKETSAMPLE $numerator $denominator $expr*) + ; + +splitSample +@init { gParent.msgs.push("table split sample specification"); } +@after { gParent.msgs.pop(); } + : + KW_TABLESAMPLE LPAREN (numerator=Number) (percent=KW_PERCENT|KW_ROWS) RPAREN + -> {percent != null}? ^(TOK_TABLESPLITSAMPLE TOK_PERCENT $numerator) + -> ^(TOK_TABLESPLITSAMPLE TOK_ROWCOUNT $numerator) + | + KW_TABLESAMPLE LPAREN (numerator=ByteLengthLiteral) RPAREN + -> ^(TOK_TABLESPLITSAMPLE TOK_LENGTH $numerator) + ; + +tableSample +@init { gParent.msgs.push("table sample specification"); } +@after { gParent.msgs.pop(); } + : + tableBucketSample | + splitSample + ; + +tableSource +@init { gParent.msgs.push("table source"); } +@after { gParent.msgs.pop(); } + : tabname=tableName (ts=tableSample)? (alias=identifier)? + -> ^(TOK_TABREF $tabname $ts? $alias?) + ; + +tableName +@init { gParent.msgs.push("table name"); } +@after { gParent.msgs.pop(); } + : + db=identifier DOT tab=identifier + -> ^(TOK_TABNAME $db $tab) + | + tab=identifier + -> ^(TOK_TABNAME $tab) + ; + +viewName +@init { gParent.msgs.push("view name"); } +@after { gParent.msgs.pop(); } + : + (db=identifier DOT)? view=identifier + -> ^(TOK_TABNAME $db? $view) + ; + +subQuerySource +@init { gParent.msgs.push("subquery source"); } +@after { gParent.msgs.pop(); } + : + LPAREN queryStatementExpression RPAREN identifier -> ^(TOK_SUBQUERY queryStatementExpression identifier) + ; + +//----------------------- Rules for parsing whereClause ----------------------------- +// where a=b and ... +whereClause +@init { gParent.msgs.push("where clause"); } +@after { gParent.msgs.pop(); } + : + KW_WHERE searchCondition -> ^(TOK_WHERE searchCondition) + ; + +searchCondition +@init { gParent.msgs.push("search condition"); } +@after { gParent.msgs.pop(); } + : + expression + ; + +//----------------------------------------------------------------------------------- Index: ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g (working copy) @@ -0,0 +1,505 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +parser grammar IdentifiersParser; + +options +{ +output=AST; +ASTLabelType=CommonTree; +backtrack=false; +k=3; +} + +@members { + @Override + public Object recoverFromMismatchedSet(IntStream input, + RecognitionException re, BitSet follow) throws RecognitionException { + throw re; + } + @Override + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) { + gParent.errors.add(new ParseError(gParent, e, tokenNames)); + } +} + +@rulecatch { +catch (RecognitionException e) { + throw e; +} +} + +//----------------------------------------------------------------------------------- + +// group by a,b +groupByClause +@init { gParent.msgs.push("group by clause"); } +@after { gParent.msgs.pop(); } + : + KW_GROUP KW_BY + groupByExpression + ( COMMA groupByExpression )* + ((rollup=KW_WITH KW_ROLLUP) | (cube=KW_WITH KW_CUBE)) ? + (sets=KW_GROUPING KW_SETS + LPAREN groupingSetExpression ( COMMA groupingSetExpression)* RPAREN ) ? + -> {rollup != null}? ^(TOK_ROLLUP_GROUPBY groupByExpression+) + -> {cube != null}? ^(TOK_CUBE_GROUPBY groupByExpression+) + -> {sets != null}? ^(TOK_GROUPING_SETS groupByExpression+ groupingSetExpression+) + -> ^(TOK_GROUPBY groupByExpression+) + ; + +groupingSetExpression +@init {gParent.msgs.push("grouping set expression"); } +@after {gParent.msgs.pop(); } + : + groupByExpression + -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression) + | + LPAREN + groupByExpression (COMMA groupByExpression)* + RPAREN + -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression+) + | + LPAREN + RPAREN + -> ^(TOK_GROUPING_SETS_EXPRESSION) + ; + + +groupByExpression +@init { gParent.msgs.push("group by expression"); } +@after { gParent.msgs.pop(); } + : + expression + ; + +havingClause +@init { gParent.msgs.push("having clause"); } +@after { gParent.msgs.pop(); } + : + KW_HAVING havingCondition -> ^(TOK_HAVING havingCondition) + ; + +havingCondition +@init { gParent.msgs.push("having condition"); } +@after { gParent.msgs.pop(); } + : + expression + ; + +// order by a,b +orderByClause +@init { gParent.msgs.push("order by clause"); } +@after { gParent.msgs.pop(); } + : + KW_ORDER KW_BY + LPAREN columnRefOrder + ( COMMA columnRefOrder)* RPAREN -> ^(TOK_ORDERBY columnRefOrder+) + | + KW_ORDER KW_BY + columnRefOrder + ( COMMA columnRefOrder)* -> ^(TOK_ORDERBY columnRefOrder+) + ; + +clusterByClause +@init { gParent.msgs.push("cluster by clause"); } +@after { gParent.msgs.pop(); } + : + KW_CLUSTER KW_BY + LPAREN expression (COMMA expression)* RPAREN -> ^(TOK_CLUSTERBY expression+) + | + KW_CLUSTER KW_BY + expression + ( COMMA expression )* -> ^(TOK_CLUSTERBY expression+) + ; + +distributeByClause +@init { gParent.msgs.push("distribute by clause"); } +@after { gParent.msgs.pop(); } + : + KW_DISTRIBUTE KW_BY + LPAREN expression (COMMA expression)* RPAREN -> ^(TOK_DISTRIBUTEBY expression+) + | + KW_DISTRIBUTE KW_BY + expression (COMMA expression)* -> ^(TOK_DISTRIBUTEBY expression+) + ; + +sortByClause +@init { gParent.msgs.push("sort by clause"); } +@after { gParent.msgs.pop(); } + : + KW_SORT KW_BY + LPAREN columnRefOrder + ( COMMA columnRefOrder)* RPAREN -> ^(TOK_SORTBY columnRefOrder+) + | + KW_SORT KW_BY + columnRefOrder + ( COMMA columnRefOrder)* -> ^(TOK_SORTBY columnRefOrder+) + ; + +// fun(par1, par2, par3) +function +@init { gParent.msgs.push("function specification"); } +@after { gParent.msgs.pop(); } + : + functionName + LPAREN + ( + (star=STAR) + | (dist=KW_DISTINCT)? (expression (COMMA expression)*)? + ) + RPAREN -> {$star != null}? ^(TOK_FUNCTIONSTAR functionName) + -> {$dist == null}? ^(TOK_FUNCTION functionName (expression+)?) + -> ^(TOK_FUNCTIONDI functionName (expression+)?) + ; + +functionName +@init { gParent.msgs.push("function name"); } +@after { gParent.msgs.pop(); } + : // Keyword IF is also a function name + KW_IF | KW_ARRAY | KW_MAP | KW_STRUCT | KW_UNIONTYPE | identifier + ; + +castExpression +@init { gParent.msgs.push("cast expression"); } +@after { gParent.msgs.pop(); } + : + KW_CAST + LPAREN + expression + KW_AS + primitiveType + RPAREN -> ^(TOK_FUNCTION primitiveType expression) + ; + +caseExpression +@init { gParent.msgs.push("case expression"); } +@after { gParent.msgs.pop(); } + : + KW_CASE expression + (KW_WHEN expression KW_THEN expression)+ + (KW_ELSE expression)? + KW_END -> ^(TOK_FUNCTION KW_CASE expression*) + ; + +whenExpression +@init { gParent.msgs.push("case expression"); } +@after { gParent.msgs.pop(); } + : + KW_CASE + ( KW_WHEN expression KW_THEN expression)+ + (KW_ELSE expression)? + KW_END -> ^(TOK_FUNCTION KW_WHEN expression*) + ; + +constant +@init { gParent.msgs.push("constant"); } +@after { gParent.msgs.pop(); } + : + Number + | StringLiteral + | stringLiteralSequence + | BigintLiteral + | SmallintLiteral + | TinyintLiteral + | charSetStringLiteral + | booleanValue + ; + +stringLiteralSequence + : + StringLiteral StringLiteral+ -> ^(TOK_STRINGLITERALSEQUENCE StringLiteral StringLiteral+) + ; + +charSetStringLiteral +@init { gParent.msgs.push("character string literal"); } +@after { gParent.msgs.pop(); } + : + csName=CharSetName csLiteral=CharSetLiteral -> ^(TOK_CHARSETLITERAL $csName $csLiteral) + ; + +expression +@init { gParent.msgs.push("expression specification"); } +@after { gParent.msgs.pop(); } + : + precedenceOrExpression + ; + +atomExpression + : + KW_NULL -> TOK_NULL + | constant + | function + | castExpression + | caseExpression + | whenExpression + | tableOrColumn + | LPAREN! expression RPAREN! + ; + + +precedenceFieldExpression + : + atomExpression ((LSQUARE^ expression RSQUARE!) | (DOT^ identifier))* + ; + +precedenceUnaryOperator + : + PLUS | MINUS | TILDE + ; + +nullCondition + : + KW_NULL -> ^(TOK_ISNULL) + | KW_NOT KW_NULL -> ^(TOK_ISNOTNULL) + ; + +precedenceUnaryPrefixExpression + : + (precedenceUnaryOperator^)* precedenceFieldExpression + ; + +precedenceUnarySuffixExpression + : precedenceUnaryPrefixExpression (a=KW_IS nullCondition)? + -> {$a != null}? ^(TOK_FUNCTION nullCondition precedenceUnaryPrefixExpression) + -> precedenceUnaryPrefixExpression + ; + + +precedenceBitwiseXorOperator + : + BITWISEXOR + ; + +precedenceBitwiseXorExpression + : + precedenceUnarySuffixExpression (precedenceBitwiseXorOperator^ precedenceUnarySuffixExpression)* + ; + + +precedenceStarOperator + : + STAR | DIVIDE | MOD | DIV + ; + +precedenceStarExpression + : + precedenceBitwiseXorExpression (precedenceStarOperator^ precedenceBitwiseXorExpression)* + ; + + +precedencePlusOperator + : + PLUS | MINUS + ; + +precedencePlusExpression + : + precedenceStarExpression (precedencePlusOperator^ precedenceStarExpression)* + ; + + +precedenceAmpersandOperator + : + AMPERSAND + ; + +precedenceAmpersandExpression + : + precedencePlusExpression (precedenceAmpersandOperator^ precedencePlusExpression)* + ; + + +precedenceBitwiseOrOperator + : + BITWISEOR + ; + +precedenceBitwiseOrExpression + : + precedenceAmpersandExpression (precedenceBitwiseOrOperator^ precedenceAmpersandExpression)* + ; + + +// Equal operators supporting NOT prefix +precedenceEqualNegatableOperator + : + KW_LIKE | KW_RLIKE | KW_REGEXP + ; + +precedenceEqualOperator + : + precedenceEqualNegatableOperator | EQUAL | EQUAL_NS | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN + ; + +precedenceEqualExpression + : + (left=precedenceBitwiseOrExpression -> $left) + ( + (KW_NOT precedenceEqualNegatableOperator notExpr=precedenceBitwiseOrExpression) + -> ^(KW_NOT ^(precedenceEqualNegatableOperator $precedenceEqualExpression $notExpr)) + | (precedenceEqualOperator equalExpr=precedenceBitwiseOrExpression) + -> ^(precedenceEqualOperator $precedenceEqualExpression $equalExpr) + | (KW_NOT KW_IN expressions) + -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions)) + | (KW_IN expressions) + -> ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions) + | ( KW_NOT KW_BETWEEN (min=precedenceBitwiseOrExpression) KW_AND (max=precedenceBitwiseOrExpression) ) + -> ^(TOK_FUNCTION Identifier["between"] KW_TRUE $left $min $max) + | ( KW_BETWEEN (min=precedenceBitwiseOrExpression) KW_AND (max=precedenceBitwiseOrExpression) ) + -> ^(TOK_FUNCTION Identifier["between"] KW_FALSE $left $min $max) + )* + ; + +expressions + : + LPAREN expression (COMMA expression)* RPAREN -> expression* + ; + +precedenceNotOperator + : + KW_NOT + ; + +precedenceNotExpression + : + (precedenceNotOperator^)* precedenceEqualExpression + ; + + +precedenceAndOperator + : + KW_AND + ; + +precedenceAndExpression + : + precedenceNotExpression (precedenceAndOperator^ precedenceNotExpression)* + ; + + +precedenceOrOperator + : + KW_OR + ; + +precedenceOrExpression + : + precedenceAndExpression (precedenceOrOperator^ precedenceAndExpression)* + ; + + +booleanValue + : + KW_TRUE^ | KW_FALSE^ + ; + +tableOrPartition + : + tableName partitionSpec? -> ^(TOK_TAB tableName partitionSpec?) + ; + +partitionSpec + : + KW_PARTITION + LPAREN partitionVal (COMMA partitionVal )* RPAREN -> ^(TOK_PARTSPEC partitionVal +) + ; + +partitionVal + : + identifier (EQUAL constant)? -> ^(TOK_PARTVAL identifier constant?) + ; + +dropPartitionSpec + : + KW_PARTITION + LPAREN dropPartitionVal (COMMA dropPartitionVal )* RPAREN -> ^(TOK_PARTSPEC dropPartitionVal +) + ; + +dropPartitionVal + : + identifier dropPartitionOperator constant -> ^(TOK_PARTVAL identifier dropPartitionOperator constant) + ; + +dropPartitionOperator + : + EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN + ; + +sysFuncNames + : + KW_AND + | KW_OR + | KW_NOT + | KW_LIKE + | KW_IF + | KW_CASE + | KW_WHEN + | KW_TINYINT + | KW_SMALLINT + | KW_INT + | KW_BIGINT + | KW_FLOAT + | KW_DOUBLE + | KW_BOOLEAN + | KW_STRING + | KW_BINARY + | KW_URL + | KW_ARRAY + | KW_MAP + | KW_STRUCT + | KW_UNIONTYPE + | EQUAL + | EQUAL_NS + | NOTEQUAL + | LESSTHANOREQUALTO + | LESSTHAN + | GREATERTHANOREQUALTO + | GREATERTHAN + | DIVIDE + | PLUS + | MINUS + | STAR + | MOD + | DIV + | AMPERSAND + | TILDE + | BITWISEOR + | BITWISEXOR + | KW_RLIKE + | KW_REGEXP + | KW_IN + | KW_BETWEEN + ; + +descFuncNames + : + sysFuncNames + | StringLiteral + | identifier + ; + +identifier + : + Identifier + | nonReserved -> Identifier[$nonReserved.text] + ; + +nonReserved + : + KW_TRUE | KW_FALSE | KW_ALL | KW_AND | KW_OR | KW_NOT | KW_LIKE | KW_EXISTS | KW_ASC | KW_DESC | KW_ORDER | KW_GROUP | KW_BY | KW_FROM | KW_AS | KW_DISTINCT | KW_INSERT | KW_OVERWRITE | KW_OUTER | KW_PRESERVE | KW_LEFT | KW_RIGHT | KW_FULL | KW_PARTITION | KW_PARTITIONS | KW_TABLE | KW_TABLES | KW_COLUMNS | KW_INDEX | KW_INDEXES | KW_REBUILD | KW_FUNCTIONS | KW_SHOW | KW_MSCK | KW_REPAIR | KW_DIRECTORY | KW_LOCAL | KW_USING | KW_CLUSTER | KW_DISTRIBUTE | KW_SORT | KW_UNION | KW_LOAD | KW_EXPORT | KW_IMPORT | KW_DATA | KW_INPATH | KW_IS | KW_NULL | KW_CREATE | KW_EXTERNAL | KW_ALTER | KW_CHANGE | KW_COLUMN | KW_FIRST | KW_AFTER | KW_DESCRIBE | KW_DROP | KW_RENAME | KW_IGNORE | KW_PROTECTION | KW_TO | KW_COMMENT | KW_BOOLEAN | KW_TINYINT | KW_SMALLINT | KW_INT | KW_BIGINT | KW_FLOAT | KW_DOUBLE | KW_DATE | KW_DATETIME | KW_TIMESTAMP | KW_DECIMAL | KW_STRING | KW_ARRAY | KW_STRUCT | KW_UNIONTYPE | KW_PARTITIONED | KW_CLUSTERED | KW_SORTED | KW_INTO | KW_BUCKETS | KW_ROW | KW_ROWS | KW_FORMAT | KW_DELIMITED | KW_FIELDS | KW_TERMINATED | KW_ESCAPED | KW_COLLECTION | KW_ITEMS | KW_KEYS | KW_KEY_TYPE | KW_LINES | KW_STORED | KW_FILEFORMAT | KW_SEQUENCEFILE | KW_TEXTFILE | KW_RCFILE | KW_INPUTFORMAT | KW_OUTPUTFORMAT | KW_INPUTDRIVER | KW_OUTPUTDRIVER | KW_OFFLINE | KW_ENABLE | KW_DISABLE | KW_READONLY | KW_NO_DROP | KW_LOCATION | KW_BUCKET | KW_OUT | KW_OF | KW_PERCENT | KW_ADD | KW_REPLACE | KW_RLIKE | KW_REGEXP | KW_TEMPORARY | KW_EXPLAIN | KW_DEPENDENCY | KW_SERDE | KW_WITH | KW_DEFERRED | KW_SERDEPROPERTIES | KW_DBPROPERTIES | KW_LIMIT | KW_SET | KW_UNSET | KW_TBLPROPERTIES | KW_IDXPROPERTIES | KW_VALUE_TYPE | KW_ELEM_TYPE | KW_MAPJOIN | KW_STREAMTABLE | KW_HOLD_DDLTIME | KW_CLUSTERSTATUS | KW_UTC | KW_UTCTIMESTAMP | KW_LONG | KW_DELETE | KW_PLUS | KW_MINUS | KW_FETCH | KW_INTERSECT | KW_VIEW | KW_IN | KW_DATABASES | KW_MATERIALIZED | KW_SCHEMA | KW_SCHEMAS | KW_GRANT | KW_REVOKE | KW_SSL | KW_UNDO | KW_LOCK | KW_LOCKS | KW_UNLOCK | KW_SHARED | KW_EXCLUSIVE | KW_PROCEDURE | KW_UNSIGNED | KW_WHILE | KW_READ | KW_READS | KW_PURGE | KW_RANGE | KW_ANALYZE | KW_BEFORE | KW_BETWEEN | KW_BOTH | KW_BINARY | KW_CONTINUE | KW_CURSOR | KW_TRIGGER | KW_RECORDREADER | KW_RECORDWRITER | KW_SEMI | KW_LATERAL | KW_TOUCH | KW_ARCHIVE | KW_UNARCHIVE | KW_COMPUTE | KW_STATISTICS | KW_USE | KW_OPTION | KW_CONCATENATE | KW_SHOW_DATABASE | KW_UPDATE | KW_RESTRICT | KW_CASCADE | KW_SKEWED | KW_ROLLUP | KW_CUBE | KW_DIRECTORIES | KW_FOR | KW_GROUPING | KW_SETS | KW_TRUNCATE | KW_NOSCAN | KW_USER | KW_ROLE | KW_INNER | KW_URL + ; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g (working copy) @@ -0,0 +1,1866 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +parser grammar HiveParser; + +options +{ +tokenVocab=HiveLexer; +output=AST; +ASTLabelType=CommonTree; +backtrack=false; +k=3; +} +import SelectClauseParser, FromClauseParser, IdentifiersParser; + +tokens { +TOK_INSERT; +TOK_QUERY; +TOK_SELECT; +TOK_SELECTDI; +TOK_SELEXPR; +TOK_FROM; +TOK_TAB; +TOK_PARTSPEC; +TOK_PARTVAL; +TOK_DIR; +TOK_LOCAL_DIR; +TOK_TABREF; +TOK_SUBQUERY; +TOK_INSERT_INTO; +TOK_DESTINATION; +TOK_ALLCOLREF; +TOK_TABLE_OR_COL; +TOK_FUNCTION; +TOK_FUNCTIONDI; +TOK_FUNCTIONSTAR; +TOK_WHERE; +TOK_OP_EQ; +TOK_OP_NE; +TOK_OP_LE; +TOK_OP_LT; +TOK_OP_GE; +TOK_OP_GT; +TOK_OP_DIV; +TOK_OP_ADD; +TOK_OP_SUB; +TOK_OP_MUL; +TOK_OP_MOD; +TOK_OP_BITAND; +TOK_OP_BITNOT; +TOK_OP_BITOR; +TOK_OP_BITXOR; +TOK_OP_AND; +TOK_OP_OR; +TOK_OP_NOT; +TOK_OP_LIKE; +TOK_TRUE; +TOK_FALSE; +TOK_TRANSFORM; +TOK_SERDE; +TOK_SERDENAME; +TOK_SERDEPROPS; +TOK_EXPLIST; +TOK_ALIASLIST; +TOK_GROUPBY; +TOK_ROLLUP_GROUPBY; +TOK_CUBE_GROUPBY; +TOK_GROUPING_SETS; +TOK_GROUPING_SETS_EXPRESSION; +TOK_HAVING; +TOK_ORDERBY; +TOK_CLUSTERBY; +TOK_DISTRIBUTEBY; +TOK_SORTBY; +TOK_UNION; +TOK_JOIN; +TOK_LEFTOUTERJOIN; +TOK_RIGHTOUTERJOIN; +TOK_FULLOUTERJOIN; +TOK_UNIQUEJOIN; +TOK_CROSSJOIN; +TOK_LOAD; +TOK_EXPORT; +TOK_IMPORT; +TOK_NULL; +TOK_ISNULL; +TOK_ISNOTNULL; +TOK_TINYINT; +TOK_SMALLINT; +TOK_INT; +TOK_BIGINT; +TOK_BOOLEAN; +TOK_FLOAT; +TOK_DOUBLE; +TOK_DATE; +TOK_DATETIME; +TOK_TIMESTAMP; +TOK_STRING; +TOK_BINARY; +TOK_DECIMAL; +TOK_LIST; +TOK_STRUCT; +TOK_MAP; +TOK_UNIONTYPE; +TOK_COLTYPELIST; +TOK_CREATEDATABASE; +TOK_CREATETABLE; +TOK_TRUNCATETABLE; +TOK_CREATEINDEX; +TOK_CREATEINDEX_INDEXTBLNAME; +TOK_DEFERRED_REBUILDINDEX; +TOK_DROPINDEX; +TOK_DROPTABLE_PROPERTIES; +TOK_LIKETABLE; +TOK_DESCTABLE; +TOK_DESCFUNCTION; +TOK_ALTERTABLE_PARTITION; +TOK_ALTERTABLE_RENAME; +TOK_ALTERTABLE_ADDCOLS; +TOK_ALTERTABLE_RENAMECOL; +TOK_ALTERTABLE_RENAMEPART; +TOK_ALTERTABLE_REPLACECOLS; +TOK_ALTERTABLE_ADDPARTS; +TOK_ALTERTABLE_DROPPARTS; +TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE; +TOK_ALTERTABLE_TOUCH; +TOK_ALTERTABLE_ARCHIVE; +TOK_ALTERTABLE_UNARCHIVE; +TOK_ALTERTABLE_SERDEPROPERTIES; +TOK_ALTERTABLE_SERIALIZER; +TOK_TABLE_PARTITION; +TOK_ALTERTABLE_FILEFORMAT; +TOK_ALTERTABLE_LOCATION; +TOK_ALTERTABLE_PROPERTIES; +TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION; +TOK_ALTERINDEX_REBUILD; +TOK_ALTERINDEX_PROPERTIES; +TOK_MSCK; +TOK_SHOWDATABASES; +TOK_SHOWTABLES; +TOK_SHOWCOLUMNS; +TOK_SHOWFUNCTIONS; +TOK_SHOWPARTITIONS; +TOK_SHOW_CREATETABLE; +TOK_SHOW_TABLESTATUS; +TOK_SHOW_TBLPROPERTIES; +TOK_SHOWLOCKS; +TOK_LOCKTABLE; +TOK_UNLOCKTABLE; +TOK_SWITCHDATABASE; +TOK_DROPDATABASE; +TOK_DROPTABLE; +TOK_DATABASECOMMENT; +TOK_TABCOLLIST; +TOK_TABCOL; +TOK_TABLECOMMENT; +TOK_TABLEPARTCOLS; +TOK_TABLEBUCKETS; +TOK_TABLEROWFORMAT; +TOK_TABLEROWFORMATFIELD; +TOK_TABLEROWFORMATCOLLITEMS; +TOK_TABLEROWFORMATMAPKEYS; +TOK_TABLEROWFORMATLINES; +TOK_TBLSEQUENCEFILE; +TOK_TBLTEXTFILE; +TOK_TBLRCFILE; +TOK_TABLEFILEFORMAT; +TOK_FILEFORMAT_GENERIC; +TOK_OFFLINE; +TOK_ENABLE; +TOK_DISABLE; +TOK_READONLY; +TOK_NO_DROP; +TOK_STORAGEHANDLER; +TOK_ALTERTABLE_CLUSTER_SORT; +TOK_NOT_CLUSTERED; +TOK_NOT_SORTED; +TOK_TABCOLNAME; +TOK_TABLELOCATION; +TOK_PARTITIONLOCATION; +TOK_TABLEBUCKETSAMPLE; +TOK_TABLESPLITSAMPLE; +TOK_PERCENT; +TOK_LENGTH; +TOK_ROWCOUNT; +TOK_TMP_FILE; +TOK_TABSORTCOLNAMEASC; +TOK_TABSORTCOLNAMEDESC; +TOK_STRINGLITERALSEQUENCE; +TOK_CHARSETLITERAL; +TOK_CREATEFUNCTION; +TOK_DROPFUNCTION; +TOK_CREATEVIEW; +TOK_DROPVIEW; +TOK_ALTERVIEW_AS; +TOK_ALTERVIEW_PROPERTIES; +TOK_DROPVIEW_PROPERTIES; +TOK_ALTERVIEW_ADDPARTS; +TOK_ALTERVIEW_DROPPARTS; +TOK_ALTERVIEW_RENAME; +TOK_VIEWPARTCOLS; +TOK_EXPLAIN; +TOK_TABLESERIALIZER; +TOK_TABLEPROPERTIES; +TOK_TABLEPROPLIST; +TOK_INDEXPROPERTIES; +TOK_INDEXPROPLIST; +TOK_TABTYPE; +TOK_LIMIT; +TOK_TABLEPROPERTY; +TOK_IFEXISTS; +TOK_IFNOTEXISTS; +TOK_ORREPLACE; +TOK_HINTLIST; +TOK_HINT; +TOK_MAPJOIN; +TOK_STREAMTABLE; +TOK_HOLD_DDLTIME; +TOK_HINTARGLIST; +TOK_USERSCRIPTCOLNAMES; +TOK_USERSCRIPTCOLSCHEMA; +TOK_RECORDREADER; +TOK_RECORDWRITER; +TOK_LEFTSEMIJOIN; +TOK_LATERAL_VIEW; +TOK_TABALIAS; +TOK_ANALYZE; +TOK_CREATEROLE; +TOK_DROPROLE; +TOK_GRANT; +TOK_REVOKE; +TOK_SHOW_GRANT; +TOK_PRIVILEGE_LIST; +TOK_PRIVILEGE; +TOK_PRINCIPAL_NAME; +TOK_USER; +TOK_GROUP; +TOK_ROLE; +TOK_GRANT_WITH_OPTION; +TOK_PRIV_ALL; +TOK_PRIV_ALTER_METADATA; +TOK_PRIV_ALTER_DATA; +TOK_PRIV_DROP; +TOK_PRIV_INDEX; +TOK_PRIV_LOCK; +TOK_PRIV_SELECT; +TOK_PRIV_SHOW_DATABASE; +TOK_PRIV_CREATE; +TOK_PRIV_OBJECT; +TOK_PRIV_OBJECT_COL; +TOK_GRANT_ROLE; +TOK_REVOKE_ROLE; +TOK_SHOW_ROLE_GRANT; +TOK_SHOWINDEXES; +TOK_INDEXCOMMENT; +TOK_DESCDATABASE; +TOK_DATABASEPROPERTIES; +TOK_DATABASELOCATION; +TOK_DBPROPLIST; +TOK_ALTERDATABASE_PROPERTIES; +TOK_ALTERTABLE_ALTERPARTS_MERGEFILES; +TOK_TABNAME; +TOK_TABSRC; +TOK_RESTRICT; +TOK_CASCADE; +TOK_TABLESKEWED; +TOK_TABCOLVALUE; +TOK_TABCOLVALUE_PAIR; +TOK_TABCOLVALUES; +TOK_ALTERTABLE_SKEWED; +TOK_ALTERTBLPART_SKEWED_LOCATION; +TOK_SKEWED_LOCATIONS; +TOK_SKEWED_LOCATION_LIST; +TOK_SKEWED_LOCATION_MAP; +TOK_STOREDASDIRS; +TOK_IGNOREPROTECTION; +} + + +// Package headers +@header { +package org.apache.hadoop.hive.ql.parse; + +import java.util.Collection; +import java.util.HashMap; +} + + +@members { + ArrayList errors = new ArrayList(); + Stack msgs = new Stack(); + + private static HashMap xlateMap; + static { + xlateMap = new HashMap(); + + // Keywords + xlateMap.put("KW_TRUE", "TRUE"); + xlateMap.put("KW_FALSE", "FALSE"); + xlateMap.put("KW_ALL", "ALL"); + xlateMap.put("KW_AND", "AND"); + xlateMap.put("KW_OR", "OR"); + xlateMap.put("KW_NOT", "NOT"); + xlateMap.put("KW_LIKE", "LIKE"); + + xlateMap.put("KW_ASC", "ASC"); + xlateMap.put("KW_DESC", "DESC"); + xlateMap.put("KW_ORDER", "ORDER"); + xlateMap.put("KW_BY", "BY"); + xlateMap.put("KW_GROUP", "GROUP"); + xlateMap.put("KW_WHERE", "WHERE"); + xlateMap.put("KW_FROM", "FROM"); + xlateMap.put("KW_AS", "AS"); + xlateMap.put("KW_SELECT", "SELECT"); + xlateMap.put("KW_DISTINCT", "DISTINCT"); + xlateMap.put("KW_INSERT", "INSERT"); + xlateMap.put("KW_OVERWRITE", "OVERWRITE"); + xlateMap.put("KW_OUTER", "OUTER"); + xlateMap.put("KW_JOIN", "JOIN"); + xlateMap.put("KW_LEFT", "LEFT"); + xlateMap.put("KW_RIGHT", "RIGHT"); + xlateMap.put("KW_FULL", "FULL"); + xlateMap.put("KW_ON", "ON"); + xlateMap.put("KW_PARTITION", "PARTITION"); + xlateMap.put("KW_PARTITIONS", "PARTITIONS"); + xlateMap.put("KW_TABLE", "TABLE"); + xlateMap.put("KW_TABLES", "TABLES"); + xlateMap.put("KW_TBLPROPERTIES", "TBLPROPERTIES"); + xlateMap.put("KW_SHOW", "SHOW"); + xlateMap.put("KW_MSCK", "MSCK"); + xlateMap.put("KW_DIRECTORY", "DIRECTORY"); + xlateMap.put("KW_LOCAL", "LOCAL"); + xlateMap.put("KW_TRANSFORM", "TRANSFORM"); + xlateMap.put("KW_USING", "USING"); + xlateMap.put("KW_CLUSTER", "CLUSTER"); + xlateMap.put("KW_DISTRIBUTE", "DISTRIBUTE"); + xlateMap.put("KW_SORT", "SORT"); + xlateMap.put("KW_UNION", "UNION"); + xlateMap.put("KW_LOAD", "LOAD"); + xlateMap.put("KW_DATA", "DATA"); + xlateMap.put("KW_INPATH", "INPATH"); + xlateMap.put("KW_IS", "IS"); + xlateMap.put("KW_NULL", "NULL"); + xlateMap.put("KW_CREATE", "CREATE"); + xlateMap.put("KW_EXTERNAL", "EXTERNAL"); + xlateMap.put("KW_ALTER", "ALTER"); + xlateMap.put("KW_DESCRIBE", "DESCRIBE"); + xlateMap.put("KW_DROP", "DROP"); + xlateMap.put("KW_REANME", "REANME"); + xlateMap.put("KW_TO", "TO"); + xlateMap.put("KW_COMMENT", "COMMENT"); + xlateMap.put("KW_BOOLEAN", "BOOLEAN"); + xlateMap.put("KW_TINYINT", "TINYINT"); + xlateMap.put("KW_SMALLINT", "SMALLINT"); + xlateMap.put("KW_INT", "INT"); + xlateMap.put("KW_BIGINT", "BIGINT"); + xlateMap.put("KW_FLOAT", "FLOAT"); + xlateMap.put("KW_DOUBLE", "DOUBLE"); + xlateMap.put("KW_DATE", "DATE"); + xlateMap.put("KW_DATETIME", "DATETIME"); + xlateMap.put("KW_TIMESTAMP", "TIMESTAMP"); + xlateMap.put("KW_STRING", "STRING"); + xlateMap.put("KW_BINARY", "BINARY"); + xlateMap.put("KW_ARRAY", "ARRAY"); + xlateMap.put("KW_MAP", "MAP"); + xlateMap.put("KW_REDUCE", "REDUCE"); + xlateMap.put("KW_PARTITIONED", "PARTITIONED"); + xlateMap.put("KW_CLUSTERED", "CLUSTERED"); + xlateMap.put("KW_SORTED", "SORTED"); + xlateMap.put("KW_INTO", "INTO"); + xlateMap.put("KW_BUCKETS", "BUCKETS"); + xlateMap.put("KW_ROW", "ROW"); + xlateMap.put("KW_FORMAT", "FORMAT"); + xlateMap.put("KW_DELIMITED", "DELIMITED"); + xlateMap.put("KW_FIELDS", "FIELDS"); + xlateMap.put("KW_TERMINATED", "TERMINATED"); + xlateMap.put("KW_COLLECTION", "COLLECTION"); + xlateMap.put("KW_ITEMS", "ITEMS"); + xlateMap.put("KW_KEYS", "KEYS"); + xlateMap.put("KW_KEY_TYPE", "$KEY$"); + xlateMap.put("KW_LINES", "LINES"); + xlateMap.put("KW_STORED", "STORED"); + xlateMap.put("KW_SEQUENCEFILE", "SEQUENCEFILE"); + xlateMap.put("KW_TEXTFILE", "TEXTFILE"); + xlateMap.put("KW_INPUTFORMAT", "INPUTFORMAT"); + xlateMap.put("KW_OUTPUTFORMAT", "OUTPUTFORMAT"); + xlateMap.put("KW_LOCATION", "LOCATION"); + xlateMap.put("KW_TABLESAMPLE", "TABLESAMPLE"); + xlateMap.put("KW_BUCKET", "BUCKET"); + xlateMap.put("KW_OUT", "OUT"); + xlateMap.put("KW_OF", "OF"); + xlateMap.put("KW_CAST", "CAST"); + xlateMap.put("KW_ADD", "ADD"); + xlateMap.put("KW_REPLACE", "REPLACE"); + xlateMap.put("KW_COLUMNS", "COLUMNS"); + xlateMap.put("KW_RLIKE", "RLIKE"); + xlateMap.put("KW_REGEXP", "REGEXP"); + xlateMap.put("KW_TEMPORARY", "TEMPORARY"); + xlateMap.put("KW_FUNCTION", "FUNCTION"); + xlateMap.put("KW_EXPLAIN", "EXPLAIN"); + xlateMap.put("KW_EXTENDED", "EXTENDED"); + xlateMap.put("KW_SERDE", "SERDE"); + xlateMap.put("KW_WITH", "WITH"); + xlateMap.put("KW_SERDEPROPERTIES", "SERDEPROPERTIES"); + xlateMap.put("KW_LIMIT", "LIMIT"); + xlateMap.put("KW_SET", "SET"); + xlateMap.put("KW_PROPERTIES", "TBLPROPERTIES"); + xlateMap.put("KW_VALUE_TYPE", "$VALUE$"); + xlateMap.put("KW_ELEM_TYPE", "$ELEM$"); + + // Operators + xlateMap.put("DOT", "."); + xlateMap.put("COLON", ":"); + xlateMap.put("COMMA", ","); + xlateMap.put("SEMICOLON", ");"); + + xlateMap.put("LPAREN", "("); + xlateMap.put("RPAREN", ")"); + xlateMap.put("LSQUARE", "["); + xlateMap.put("RSQUARE", "]"); + + xlateMap.put("EQUAL", "="); + xlateMap.put("NOTEQUAL", "<>"); + xlateMap.put("EQUAL_NS", "<=>"); + xlateMap.put("LESSTHANOREQUALTO", "<="); + xlateMap.put("LESSTHAN", "<"); + xlateMap.put("GREATERTHANOREQUALTO", ">="); + xlateMap.put("GREATERTHAN", ">"); + + xlateMap.put("DIVIDE", "/"); + xlateMap.put("PLUS", "+"); + xlateMap.put("MINUS", "-"); + xlateMap.put("STAR", "*"); + xlateMap.put("MOD", "%"); + + xlateMap.put("AMPERSAND", "&"); + xlateMap.put("TILDE", "~"); + xlateMap.put("BITWISEOR", "|"); + xlateMap.put("BITWISEXOR", "^"); + xlateMap.put("CharSetLiteral", "\\'"); + } + + public static Collection getKeywords() { + return xlateMap.values(); + } + + private static String xlate(String name) { + + String ret = xlateMap.get(name); + if (ret == null) { + ret = name; + } + + return ret; + } + + @Override + public Object recoverFromMismatchedSet(IntStream input, + RecognitionException re, BitSet follow) throws RecognitionException { + throw re; + } + + @Override + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) { + errors.add(new ParseError(this, e, tokenNames)); + } + + @Override + public String getErrorHeader(RecognitionException e) { + String header = null; + if (e.charPositionInLine < 0 && input.LT(-1) != null) { + Token t = input.LT(-1); + header = "line " + t.getLine() + ":" + t.getCharPositionInLine(); + } else { + header = super.getErrorHeader(e); + } + + return header; + } + + @Override + public String getErrorMessage(RecognitionException e, String[] tokenNames) { + String msg = null; + + // Translate the token names to something that the user can understand + String[] xlateNames = new String[tokenNames.length]; + for (int i = 0; i < tokenNames.length; ++i) { + xlateNames[i] = HiveParser.xlate(tokenNames[i]); + } + + if (e instanceof NoViableAltException) { + @SuppressWarnings("unused") + NoViableAltException nvae = (NoViableAltException) e; + // for development, can add + // "decision=<<"+nvae.grammarDecisionDescription+">>" + // and "(decision="+nvae.decisionNumber+") and + // "state "+nvae.stateNumber + msg = "cannot recognize input near" + + (input.LT(1) != null ? " " + getTokenErrorDisplay(input.LT(1)) : "") + + (input.LT(2) != null ? " " + getTokenErrorDisplay(input.LT(2)) : "") + + (input.LT(3) != null ? " " + getTokenErrorDisplay(input.LT(3)) : ""); + } else if (e instanceof MismatchedTokenException) { + MismatchedTokenException mte = (MismatchedTokenException) e; + msg = super.getErrorMessage(e, xlateNames) + (input.LT(-1) == null ? "":" near '" + input.LT(-1).getText()) + "'"; + } else if (e instanceof FailedPredicateException) { + FailedPredicateException fpe = (FailedPredicateException) e; + msg = "Failed to recognize predicate '" + fpe.token.getText() + "'. Failed rule: '" + fpe.ruleName + "'"; + } else { + msg = super.getErrorMessage(e, xlateNames); + } + + if (msgs.size() > 0) { + msg = msg + " in " + msgs.peek(); + } + return msg; + } +} + +@rulecatch { +catch (RecognitionException e) { + reportError(e); + throw e; +} +} + +// starting rule +statement + : explainStatement EOF + | execStatement EOF + ; + +explainStatement +@init { msgs.push("explain statement"); } +@after { msgs.pop(); } + : KW_EXPLAIN (explainOptions=KW_EXTENDED|explainOptions=KW_FORMATTED|explainOptions=KW_DEPENDENCY)? execStatement + -> ^(TOK_EXPLAIN execStatement $explainOptions?) + ; + +execStatement +@init { msgs.push("statement"); } +@after { msgs.pop(); } + : queryStatementExpression + | loadStatement + | exportStatement + | importStatement + | ddlStatement + ; + +loadStatement +@init { msgs.push("load statement"); } +@after { msgs.pop(); } + : KW_LOAD KW_DATA (islocal=KW_LOCAL)? KW_INPATH (path=StringLiteral) (isoverwrite=KW_OVERWRITE)? KW_INTO KW_TABLE (tab=tableOrPartition) + -> ^(TOK_LOAD $path $tab $islocal? $isoverwrite?) + ; + +exportStatement +@init { msgs.push("export statement"); } +@after { msgs.pop(); } + : KW_EXPORT KW_TABLE (tab=tableOrPartition) KW_TO (path=StringLiteral) + -> ^(TOK_EXPORT $tab $path) + ; + +importStatement +@init { msgs.push("import statement"); } +@after { msgs.pop(); } + : KW_IMPORT ((ext=KW_EXTERNAL)? KW_TABLE (tab=tableOrPartition))? KW_FROM (path=StringLiteral) tableLocation? + -> ^(TOK_IMPORT $path $tab? $ext? tableLocation?) + ; + +ddlStatement +@init { msgs.push("ddl statement"); } +@after { msgs.pop(); } + : createDatabaseStatement + | switchDatabaseStatement + | dropDatabaseStatement + | createTableStatement + | dropTableStatement + | truncateTableStatement + | alterStatement + | descStatement + | showStatement + | metastoreCheck + | createViewStatement + | dropViewStatement + | createFunctionStatement + | createIndexStatement + | dropIndexStatement + | dropFunctionStatement + | analyzeStatement + | lockStatement + | unlockStatement + | createRoleStatement + | dropRoleStatement + | grantPrivileges + | revokePrivileges + | showGrants + | showRoleGrants + | grantRole + | revokeRole + ; + +ifExists +@init { msgs.push("if exists clause"); } +@after { msgs.pop(); } + : KW_IF KW_EXISTS + -> ^(TOK_IFEXISTS) + ; + +restrictOrCascade +@init { msgs.push("restrict or cascade clause"); } +@after { msgs.pop(); } + : KW_RESTRICT + -> ^(TOK_RESTRICT) + | KW_CASCADE + -> ^(TOK_CASCADE) + ; + +ifNotExists +@init { msgs.push("if not exists clause"); } +@after { msgs.pop(); } + : KW_IF KW_NOT KW_EXISTS + -> ^(TOK_IFNOTEXISTS) + ; + +storedAsDirs +@init { msgs.push("stored as directories"); } +@after { msgs.pop(); } + : KW_STORED KW_AS KW_DIRECTORIES + -> ^(TOK_STOREDASDIRS) + ; + +orReplace +@init { msgs.push("or replace clause"); } +@after { msgs.pop(); } + : KW_OR KW_REPLACE + -> ^(TOK_ORREPLACE) + ; + +ignoreProtection +@init { msgs.push("ignore protection clause"); } +@after { msgs.pop(); } + : KW_IGNORE KW_PROTECTION + -> ^(TOK_IGNOREPROTECTION) + ; + +createDatabaseStatement +@init { msgs.push("create database statement"); } +@after { msgs.pop(); } + : KW_CREATE (KW_DATABASE|KW_SCHEMA) + ifNotExists? + name=identifier + databaseComment? + dbLocation? + (KW_WITH KW_DBPROPERTIES dbprops=dbProperties)? + -> ^(TOK_CREATEDATABASE $name ifNotExists? dbLocation? databaseComment? $dbprops?) + ; + +dbLocation +@init { msgs.push("database location specification"); } +@after { msgs.pop(); } + : + KW_LOCATION locn=StringLiteral -> ^(TOK_DATABASELOCATION $locn) + ; + +dbProperties +@init { msgs.push("dbproperties"); } +@after { msgs.pop(); } + : + LPAREN dbPropertiesList RPAREN -> ^(TOK_DATABASEPROPERTIES dbPropertiesList) + ; + +dbPropertiesList +@init { msgs.push("database properties list"); } +@after { msgs.pop(); } + : + keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_DBPROPLIST keyValueProperty+) + ; + + +switchDatabaseStatement +@init { msgs.push("switch database statement"); } +@after { msgs.pop(); } + : KW_USE identifier + -> ^(TOK_SWITCHDATABASE identifier) + ; + +dropDatabaseStatement +@init { msgs.push("drop database statement"); } +@after { msgs.pop(); } + : KW_DROP (KW_DATABASE|KW_SCHEMA) ifExists? identifier restrictOrCascade? + -> ^(TOK_DROPDATABASE identifier ifExists? restrictOrCascade?) + ; + +databaseComment +@init { msgs.push("database's comment"); } +@after { msgs.pop(); } + : KW_COMMENT comment=StringLiteral + -> ^(TOK_DATABASECOMMENT $comment) + ; + +createTableStatement +@init { msgs.push("create table statement"); } +@after { msgs.pop(); } + : KW_CREATE (ext=KW_EXTERNAL)? KW_TABLE ifNotExists? name=tableName + ( like=KW_LIKE likeName=tableName + tableLocation? + tablePropertiesPrefixed? + | (LPAREN columnNameTypeList RPAREN)? + tableComment? + tablePartition? + tableBuckets? + tableSkewed? + tableRowFormat? + tableFileFormat? + tableLocation? + tablePropertiesPrefixed? + (KW_AS selectStatement)? + ) + -> ^(TOK_CREATETABLE $name $ext? ifNotExists? + ^(TOK_LIKETABLE $likeName?) + columnNameTypeList? + tableComment? + tablePartition? + tableBuckets? + tableSkewed? + tableRowFormat? + tableFileFormat? + tableLocation? + tablePropertiesPrefixed? + selectStatement? + ) + ; + +truncateTableStatement +@init { msgs.push("truncate table statement"); } +@after { msgs.pop(); } + : KW_TRUNCATE KW_TABLE tablePartitionPrefix -> ^(TOK_TRUNCATETABLE tablePartitionPrefix); + +createIndexStatement +@init { msgs.push("create index statement");} +@after {msgs.pop();} + : KW_CREATE KW_INDEX indexName=identifier + KW_ON KW_TABLE tab=tableName LPAREN indexedCols=columnNameList RPAREN + KW_AS typeName=StringLiteral + autoRebuild? + indexPropertiesPrefixed? + indexTblName? + tableRowFormat? + tableFileFormat? + tableLocation? + tablePropertiesPrefixed? + indexComment? + ->^(TOK_CREATEINDEX $indexName $typeName $tab $indexedCols + autoRebuild? + indexPropertiesPrefixed? + indexTblName? + tableRowFormat? + tableFileFormat? + tableLocation? + tablePropertiesPrefixed? + indexComment?) + ; + +indexComment +@init { msgs.push("comment on an index");} +@after {msgs.pop();} + : + KW_COMMENT comment=StringLiteral -> ^(TOK_INDEXCOMMENT $comment) + ; + +autoRebuild +@init { msgs.push("auto rebuild index");} +@after {msgs.pop();} + : KW_WITH KW_DEFERRED KW_REBUILD + ->^(TOK_DEFERRED_REBUILDINDEX) + ; + +indexTblName +@init { msgs.push("index table name");} +@after {msgs.pop();} + : KW_IN KW_TABLE indexTbl=tableName + ->^(TOK_CREATEINDEX_INDEXTBLNAME $indexTbl) + ; + +indexPropertiesPrefixed +@init { msgs.push("table properties with prefix"); } +@after { msgs.pop(); } + : + KW_IDXPROPERTIES! indexProperties + ; + +indexProperties +@init { msgs.push("index properties"); } +@after { msgs.pop(); } + : + LPAREN indexPropertiesList RPAREN -> ^(TOK_INDEXPROPERTIES indexPropertiesList) + ; + +indexPropertiesList +@init { msgs.push("index properties list"); } +@after { msgs.pop(); } + : + keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_INDEXPROPLIST keyValueProperty+) + ; + +dropIndexStatement +@init { msgs.push("drop index statement");} +@after {msgs.pop();} + : KW_DROP KW_INDEX ifExists? indexName=identifier KW_ON tab=tableName + ->^(TOK_DROPINDEX $indexName $tab ifExists?) + ; + +dropTableStatement +@init { msgs.push("drop statement"); } +@after { msgs.pop(); } + : KW_DROP KW_TABLE ifExists? tableName -> ^(TOK_DROPTABLE tableName ifExists?) + ; + +alterStatement +@init { msgs.push("alter statement"); } +@after { msgs.pop(); } + : KW_ALTER! + ( + KW_TABLE! alterTableStatementSuffix + | + KW_VIEW! alterViewStatementSuffix + | + KW_INDEX! alterIndexStatementSuffix + | + KW_DATABASE! alterDatabaseStatementSuffix + ) + ; + +alterTableStatementSuffix +@init { msgs.push("alter table statement"); } +@after { msgs.pop(); } + : alterStatementSuffixRename + | alterStatementSuffixAddCol + | alterStatementSuffixRenameCol + | alterStatementSuffixDropPartitions + | alterStatementSuffixAddPartitions + | alterStatementSuffixTouch + | alterStatementSuffixArchive + | alterStatementSuffixUnArchive + | alterStatementSuffixProperties + | alterTblPartitionStatement + | alterStatementSuffixSkewedby + ; + +alterViewStatementSuffix +@init { msgs.push("alter view statement"); } +@after { msgs.pop(); } + : alterViewSuffixProperties + | alterStatementSuffixRename + -> ^(TOK_ALTERVIEW_RENAME alterStatementSuffixRename) + | alterStatementSuffixAddPartitions + -> ^(TOK_ALTERVIEW_ADDPARTS alterStatementSuffixAddPartitions) + | alterStatementSuffixDropPartitions + -> ^(TOK_ALTERVIEW_DROPPARTS alterStatementSuffixDropPartitions) + | name=tableName KW_AS selectStatement + -> ^(TOK_ALTERVIEW_AS $name selectStatement) + ; + +alterIndexStatementSuffix +@init { msgs.push("alter index statement"); } +@after { msgs.pop(); } + : indexName=identifier + (KW_ON tableNameId=identifier) + partitionSpec? + ( + KW_REBUILD + ->^(TOK_ALTERINDEX_REBUILD $tableNameId $indexName partitionSpec?) + | + KW_SET KW_IDXPROPERTIES + indexProperties + ->^(TOK_ALTERINDEX_PROPERTIES $tableNameId $indexName indexProperties) + ) + ; + +alterDatabaseStatementSuffix +@init { msgs.push("alter database statement"); } +@after { msgs.pop(); } + : alterDatabaseSuffixProperties + ; + +alterDatabaseSuffixProperties +@init { msgs.push("alter database properties statement"); } +@after { msgs.pop(); } + : name=identifier KW_SET KW_DBPROPERTIES dbProperties + -> ^(TOK_ALTERDATABASE_PROPERTIES $name dbProperties) + ; + +alterStatementSuffixRename +@init { msgs.push("rename statement"); } +@after { msgs.pop(); } + : oldName=identifier KW_RENAME KW_TO newName=identifier + -> ^(TOK_ALTERTABLE_RENAME $oldName $newName) + ; + +alterStatementSuffixAddCol +@init { msgs.push("add column statement"); } +@after { msgs.pop(); } + : identifier (add=KW_ADD | replace=KW_REPLACE) KW_COLUMNS LPAREN columnNameTypeList RPAREN + -> {$add != null}? ^(TOK_ALTERTABLE_ADDCOLS identifier columnNameTypeList) + -> ^(TOK_ALTERTABLE_REPLACECOLS identifier columnNameTypeList) + ; + +alterStatementSuffixRenameCol +@init { msgs.push("rename column name"); } +@after { msgs.pop(); } + : identifier KW_CHANGE KW_COLUMN? oldName=identifier newName=identifier colType (KW_COMMENT comment=StringLiteral)? alterStatementChangeColPosition? + ->^(TOK_ALTERTABLE_RENAMECOL identifier $oldName $newName colType $comment? alterStatementChangeColPosition?) + ; + +alterStatementChangeColPosition + : first=KW_FIRST|KW_AFTER afterCol=identifier + ->{$first != null}? ^(TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION ) + -> ^(TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION $afterCol) + ; + +alterStatementSuffixAddPartitions +@init { msgs.push("add partition statement"); } +@after { msgs.pop(); } + : identifier KW_ADD ifNotExists? partitionSpec partitionLocation? (partitionSpec partitionLocation?)* + -> ^(TOK_ALTERTABLE_ADDPARTS identifier ifNotExists? (partitionSpec partitionLocation?)+) + ; + +alterStatementSuffixTouch +@init { msgs.push("touch statement"); } +@after { msgs.pop(); } + : identifier KW_TOUCH (partitionSpec)* + -> ^(TOK_ALTERTABLE_TOUCH identifier (partitionSpec)*) + ; + +alterStatementSuffixArchive +@init { msgs.push("archive statement"); } +@after { msgs.pop(); } + : identifier KW_ARCHIVE (partitionSpec)* + -> ^(TOK_ALTERTABLE_ARCHIVE identifier (partitionSpec)*) + ; + +alterStatementSuffixUnArchive +@init { msgs.push("unarchive statement"); } +@after { msgs.pop(); } + : identifier KW_UNARCHIVE (partitionSpec)* + -> ^(TOK_ALTERTABLE_UNARCHIVE identifier (partitionSpec)*) + ; + +partitionLocation +@init { msgs.push("partition location"); } +@after { msgs.pop(); } + : + KW_LOCATION locn=StringLiteral -> ^(TOK_PARTITIONLOCATION $locn) + ; + +alterStatementSuffixDropPartitions +@init { msgs.push("drop partition statement"); } +@after { msgs.pop(); } + : identifier KW_DROP ifExists? dropPartitionSpec (COMMA dropPartitionSpec)* ignoreProtection? + -> ^(TOK_ALTERTABLE_DROPPARTS identifier dropPartitionSpec+ ifExists? ignoreProtection?) + ; + +alterStatementSuffixProperties +@init { msgs.push("alter properties statement"); } +@after { msgs.pop(); } + : name=identifier KW_SET KW_TBLPROPERTIES tableProperties + -> ^(TOK_ALTERTABLE_PROPERTIES $name tableProperties) + | name=identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties + -> ^(TOK_DROPTABLE_PROPERTIES $name tableProperties ifExists?) + ; + +alterViewSuffixProperties +@init { msgs.push("alter view properties statement"); } +@after { msgs.pop(); } + : name=identifier KW_SET KW_TBLPROPERTIES tableProperties + -> ^(TOK_ALTERVIEW_PROPERTIES $name tableProperties) + | name=identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties + -> ^(TOK_DROPVIEW_PROPERTIES $name tableProperties ifExists?) + ; + +alterStatementSuffixSerdeProperties +@init { msgs.push("alter serdes statement"); } +@after { msgs.pop(); } + : KW_SET KW_SERDE serdeName=StringLiteral (KW_WITH KW_SERDEPROPERTIES tableProperties)? + -> ^(TOK_ALTERTABLE_SERIALIZER $serdeName tableProperties?) + | KW_SET KW_SERDEPROPERTIES tableProperties + -> ^(TOK_ALTERTABLE_SERDEPROPERTIES tableProperties) + ; + +tablePartitionPrefix +@init {msgs.push("table partition prefix");} +@after {msgs.pop();} + :name=identifier partitionSpec? + ->^(TOK_TABLE_PARTITION $name partitionSpec?) + ; + +alterTblPartitionStatement +@init {msgs.push("alter table partition statement");} +@after {msgs.pop();} + : tablePartitionPrefix alterTblPartitionStatementSuffix + -> ^(TOK_ALTERTABLE_PARTITION tablePartitionPrefix alterTblPartitionStatementSuffix) + ; + +alterTblPartitionStatementSuffix +@init {msgs.push("alter table partition statement suffix");} +@after {msgs.pop();} + : alterStatementSuffixFileFormat + | alterStatementSuffixLocation + | alterStatementSuffixProtectMode + | alterStatementSuffixMergeFiles + | alterStatementSuffixSerdeProperties + | alterStatementSuffixRenamePart + | alterStatementSuffixBucketNum + | alterTblPartitionStatementSuffixSkewedLocation + | alterStatementSuffixClusterbySortby + ; + +alterStatementSuffixFileFormat +@init {msgs.push("alter fileformat statement"); } +@after {msgs.pop();} + : KW_SET KW_FILEFORMAT fileFormat + -> ^(TOK_ALTERTABLE_FILEFORMAT fileFormat) + ; + +alterStatementSuffixClusterbySortby +@init {msgs.push("alter partition cluster by sort by statement");} +@after {msgs.pop();} + : KW_NOT KW_CLUSTERED -> ^(TOK_ALTERTABLE_CLUSTER_SORT TOK_NOT_CLUSTERED) + | KW_NOT KW_SORTED -> ^(TOK_ALTERTABLE_CLUSTER_SORT TOK_NOT_SORTED) + | tableBuckets -> ^(TOK_ALTERTABLE_CLUSTER_SORT tableBuckets) + ; + +alterTblPartitionStatementSuffixSkewedLocation +@init {msgs.push("alter partition skewed location");} +@after {msgs.pop();} + : KW_SET KW_SKEWED KW_LOCATION skewedLocations + -> ^(TOK_ALTERTBLPART_SKEWED_LOCATION skewedLocations) + ; + +skewedLocations +@init { msgs.push("skewed locations"); } +@after { msgs.pop(); } + : + LPAREN skewedLocationsList RPAREN -> ^(TOK_SKEWED_LOCATIONS skewedLocationsList) + ; + +skewedLocationsList +@init { msgs.push("skewed locations list"); } +@after { msgs.pop(); } + : + skewedLocationMap (COMMA skewedLocationMap)* -> ^(TOK_SKEWED_LOCATION_LIST skewedLocationMap+) + ; + +skewedLocationMap +@init { msgs.push("specifying skewed location map"); } +@after { msgs.pop(); } + : + key=skewedValueLocationElement EQUAL value=StringLiteral -> ^(TOK_SKEWED_LOCATION_MAP $key $value) + ; + +alterStatementSuffixLocation +@init {msgs.push("alter location");} +@after {msgs.pop();} + : KW_SET KW_LOCATION newLoc=StringLiteral + -> ^(TOK_ALTERTABLE_LOCATION $newLoc) + ; + + +alterStatementSuffixSkewedby +@init {msgs.push("alter skewed by statement");} +@after{msgs.pop();} + :name=identifier tableSkewed + ->^(TOK_ALTERTABLE_SKEWED $name tableSkewed) + | + name=identifier KW_NOT KW_SKEWED + ->^(TOK_ALTERTABLE_SKEWED $name) + | + name=identifier KW_NOT storedAsDirs + ->^(TOK_ALTERTABLE_SKEWED $name storedAsDirs) + ; + +alterStatementSuffixProtectMode +@init { msgs.push("alter partition protect mode statement"); } +@after { msgs.pop(); } + : alterProtectMode + -> ^(TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE alterProtectMode) + ; + +alterStatementSuffixRenamePart +@init { msgs.push("alter table rename partition statement"); } +@after { msgs.pop(); } + : KW_RENAME KW_TO partitionSpec + ->^(TOK_ALTERTABLE_RENAMEPART partitionSpec) + ; + +alterStatementSuffixMergeFiles +@init { msgs.push(""); } +@after { msgs.pop(); } + : KW_CONCATENATE + -> ^(TOK_ALTERTABLE_ALTERPARTS_MERGEFILES) + ; + +alterProtectMode +@init { msgs.push("protect mode specification enable"); } +@after { msgs.pop(); } + : KW_ENABLE alterProtectModeMode -> ^(TOK_ENABLE alterProtectModeMode) + | KW_DISABLE alterProtectModeMode -> ^(TOK_DISABLE alterProtectModeMode) + ; + +alterProtectModeMode +@init { msgs.push("protect mode specification enable"); } +@after { msgs.pop(); } + : KW_OFFLINE -> ^(TOK_OFFLINE) + | KW_NO_DROP KW_CASCADE? -> ^(TOK_NO_DROP KW_CASCADE?) + | KW_READONLY -> ^(TOK_READONLY) + ; + +alterStatementSuffixBucketNum +@init { msgs.push(""); } +@after { msgs.pop(); } + : KW_INTO num=Number KW_BUCKETS + -> ^(TOK_TABLEBUCKETS $num) + ; + +fileFormat +@init { msgs.push("file format specification"); } +@after { msgs.pop(); } + : KW_SEQUENCEFILE -> ^(TOK_TBLSEQUENCEFILE) + | KW_TEXTFILE -> ^(TOK_TBLTEXTFILE) + | KW_RCFILE -> ^(TOK_TBLRCFILE) + | KW_INPUTFORMAT inFmt=StringLiteral KW_OUTPUTFORMAT outFmt=StringLiteral (KW_INPUTDRIVER inDriver=StringLiteral KW_OUTPUTDRIVER outDriver=StringLiteral)? + -> ^(TOK_TABLEFILEFORMAT $inFmt $outFmt $inDriver? $outDriver?) + | genericSpec=identifier -> ^(TOK_FILEFORMAT_GENERIC $genericSpec) + ; + +tabTypeExpr +@init { msgs.push("specifying table types"); } +@after { msgs.pop(); } + + : identifier (DOT^ (KW_ELEM_TYPE | KW_KEY_TYPE | KW_VALUE_TYPE | identifier))* + ; + +descTabTypeExpr +@init { msgs.push("specifying describe table types"); } +@after { msgs.pop(); } + + : identifier (DOT^ (KW_ELEM_TYPE | KW_KEY_TYPE | KW_VALUE_TYPE | identifier))* identifier? + ; + +partTypeExpr +@init { msgs.push("specifying table partitions"); } +@after { msgs.pop(); } + : tabTypeExpr partitionSpec? -> ^(TOK_TABTYPE tabTypeExpr partitionSpec?) + ; + +descPartTypeExpr +@init { msgs.push("specifying describe table partitions"); } +@after { msgs.pop(); } + : descTabTypeExpr partitionSpec? -> ^(TOK_TABTYPE descTabTypeExpr partitionSpec?) + ; + +descStatement +@init { msgs.push("describe statement"); } +@after { msgs.pop(); } + : (KW_DESCRIBE|KW_DESC) (descOptions=KW_FORMATTED|descOptions=KW_EXTENDED|descOptions=KW_PRETTY)? (parttype=descPartTypeExpr) -> ^(TOK_DESCTABLE $parttype $descOptions?) + | (KW_DESCRIBE|KW_DESC) KW_FUNCTION KW_EXTENDED? (name=descFuncNames) -> ^(TOK_DESCFUNCTION $name KW_EXTENDED?) + | (KW_DESCRIBE|KW_DESC) KW_DATABASE KW_EXTENDED? (dbName=identifier) -> ^(TOK_DESCDATABASE $dbName KW_EXTENDED?) + ; + +analyzeStatement +@init { msgs.push("analyze statement"); } +@after { msgs.pop(); } + : KW_ANALYZE KW_TABLE (parttype=tableOrPartition) KW_COMPUTE KW_STATISTICS ((noscan=KW_NOSCAN) | (KW_FOR KW_COLUMNS statsColumnName=columnNameList))? -> ^(TOK_ANALYZE $parttype $noscan? $statsColumnName?) + ; + +showStatement +@init { msgs.push("show statement"); } +@after { msgs.pop(); } + : KW_SHOW (KW_DATABASES|KW_SCHEMAS) (KW_LIKE showStmtIdentifier)? -> ^(TOK_SHOWDATABASES showStmtIdentifier?) + | KW_SHOW KW_TABLES ((KW_FROM|KW_IN) db_name=identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)? -> ^(TOK_SHOWTABLES (TOK_FROM $db_name)? showStmtIdentifier?) + | KW_SHOW KW_COLUMNS (KW_FROM|KW_IN) tabname=tableName ((KW_FROM|KW_IN) db_name=identifier)? + -> ^(TOK_SHOWCOLUMNS $db_name? $tabname) + | KW_SHOW KW_FUNCTIONS showStmtIdentifier? -> ^(TOK_SHOWFUNCTIONS showStmtIdentifier?) + | KW_SHOW KW_PARTITIONS identifier partitionSpec? -> ^(TOK_SHOWPARTITIONS identifier partitionSpec?) + | KW_SHOW KW_CREATE KW_TABLE tabName=tableName -> ^(TOK_SHOW_CREATETABLE $tabName) + | KW_SHOW KW_TABLE KW_EXTENDED ((KW_FROM|KW_IN) db_name=identifier)? KW_LIKE showStmtIdentifier partitionSpec? + -> ^(TOK_SHOW_TABLESTATUS showStmtIdentifier $db_name? partitionSpec?) + | KW_SHOW KW_TBLPROPERTIES tblName=identifier (LPAREN prptyName=StringLiteral RPAREN)? -> ^(TOK_SHOW_TBLPROPERTIES $tblName $prptyName?) + | KW_SHOW KW_LOCKS (parttype=partTypeExpr)? (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype? $isExtended?) + | KW_SHOW (showOptions=KW_FORMATTED)? (KW_INDEX|KW_INDEXES) KW_ON showStmtIdentifier ((KW_FROM|KW_IN) db_name=identifier)? + -> ^(TOK_SHOWINDEXES showStmtIdentifier $showOptions? $db_name?) + ; + +lockStatement +@init { msgs.push("lock statement"); } +@after { msgs.pop(); } + : KW_LOCK KW_TABLE tableName partitionSpec? lockMode -> ^(TOK_LOCKTABLE tableName lockMode partitionSpec?) + ; + +lockMode +@init { msgs.push("lock mode"); } +@after { msgs.pop(); } + : KW_SHARED | KW_EXCLUSIVE + ; + +unlockStatement +@init { msgs.push("unlock statement"); } +@after { msgs.pop(); } + : KW_UNLOCK KW_TABLE tableName partitionSpec? -> ^(TOK_UNLOCKTABLE tableName partitionSpec?) + ; + +createRoleStatement +@init { msgs.push("create role"); } +@after { msgs.pop(); } + : KW_CREATE KW_ROLE roleName=identifier + -> ^(TOK_CREATEROLE $roleName) + ; + +dropRoleStatement +@init {msgs.push("drop role");} +@after {msgs.pop();} + : KW_DROP KW_ROLE roleName=identifier + -> ^(TOK_DROPROLE $roleName) + ; + +grantPrivileges +@init {msgs.push("grant privileges");} +@after {msgs.pop();} + : KW_GRANT privList=privilegeList + privilegeObject? + KW_TO principalSpecification + (KW_WITH withOption)? + -> ^(TOK_GRANT $privList principalSpecification privilegeObject? withOption?) + ; + +revokePrivileges +@init {msgs.push("revoke privileges");} +@afer {msgs.pop();} + : KW_REVOKE privilegeList privilegeObject? KW_FROM principalSpecification + -> ^(TOK_REVOKE privilegeList principalSpecification privilegeObject?) + ; + +grantRole +@init {msgs.push("grant role");} +@after {msgs.pop();} + : KW_GRANT KW_ROLE identifier (COMMA identifier)* KW_TO principalSpecification + -> ^(TOK_GRANT_ROLE principalSpecification identifier+) + ; + +revokeRole +@init {msgs.push("revoke role");} +@after {msgs.pop();} + : KW_REVOKE KW_ROLE identifier (COMMA identifier)* KW_FROM principalSpecification + -> ^(TOK_REVOKE_ROLE principalSpecification identifier+) + ; + +showRoleGrants +@init {msgs.push("show role grants");} +@after {msgs.pop();} + : KW_SHOW KW_ROLE KW_GRANT principalName + -> ^(TOK_SHOW_ROLE_GRANT principalName) + ; + +showGrants +@init {msgs.push("show grants");} +@after {msgs.pop();} + : KW_SHOW KW_GRANT principalName privilegeIncludeColObject? + -> ^(TOK_SHOW_GRANT principalName privilegeIncludeColObject?) + ; + +privilegeIncludeColObject +@init {msgs.push("privilege object including columns");} +@after {msgs.pop();} + : KW_ON (table=KW_TABLE|KW_DATABASE) identifier (LPAREN cols=columnNameList RPAREN)? partitionSpec? + -> ^(TOK_PRIV_OBJECT_COL identifier $table? $cols? partitionSpec?) + ; + +privilegeObject +@init {msgs.push("privilege subject");} +@after {msgs.pop();} + : KW_ON (table=KW_TABLE|KW_DATABASE) identifier partitionSpec? + -> ^(TOK_PRIV_OBJECT identifier $table? partitionSpec?) + ; + +privilegeList +@init {msgs.push("grant privilege list");} +@after {msgs.pop();} + : privlegeDef (COMMA privlegeDef)* + -> ^(TOK_PRIVILEGE_LIST privlegeDef+) + ; + +privlegeDef +@init {msgs.push("grant privilege");} +@after {msgs.pop();} + : privilegeType (LPAREN cols=columnNameList RPAREN)? + -> ^(TOK_PRIVILEGE privilegeType $cols?) + ; + +privilegeType +@init {msgs.push("privilege type");} +@after {msgs.pop();} + : KW_ALL -> ^(TOK_PRIV_ALL) + | KW_ALTER -> ^(TOK_PRIV_ALTER_METADATA) + | KW_UPDATE -> ^(TOK_PRIV_ALTER_DATA) + | KW_CREATE -> ^(TOK_PRIV_CREATE) + | KW_DROP -> ^(TOK_PRIV_DROP) + | KW_INDEX -> ^(TOK_PRIV_INDEX) + | KW_LOCK -> ^(TOK_PRIV_LOCK) + | KW_SELECT -> ^(TOK_PRIV_SELECT) + | KW_SHOW_DATABASE -> ^(TOK_PRIV_SHOW_DATABASE) + ; + +principalSpecification +@init { msgs.push("user/group/role name list"); } +@after { msgs.pop(); } + : principalName (COMMA principalName)* -> ^(TOK_PRINCIPAL_NAME principalName+) + ; + +principalName +@init {msgs.push("user|group|role name");} +@after {msgs.pop();} + : KW_USER identifier -> ^(TOK_USER identifier) + | KW_GROUP identifier -> ^(TOK_GROUP identifier) + | KW_ROLE identifier -> ^(TOK_ROLE identifier) + ; + +withOption +@init {msgs.push("grant with option");} +@after {msgs.pop();} + : KW_GRANT KW_OPTION + -> ^(TOK_GRANT_WITH_OPTION) + ; + +metastoreCheck +@init { msgs.push("metastore check statement"); } +@after { msgs.pop(); } + : KW_MSCK (repair=KW_REPAIR)? (KW_TABLE table=identifier partitionSpec? (COMMA partitionSpec)*)? + -> ^(TOK_MSCK $repair? ($table partitionSpec*)?) + ; + +createFunctionStatement +@init { msgs.push("create function statement"); } +@after { msgs.pop(); } + : KW_CREATE KW_TEMPORARY KW_FUNCTION identifier KW_AS StringLiteral + -> ^(TOK_CREATEFUNCTION identifier StringLiteral) + ; + +dropFunctionStatement +@init { msgs.push("drop temporary function statement"); } +@after { msgs.pop(); } + : KW_DROP KW_TEMPORARY KW_FUNCTION ifExists? identifier + -> ^(TOK_DROPFUNCTION identifier ifExists?) + ; + +createViewStatement +@init { + msgs.push("create view statement"); +} +@after { msgs.pop(); } + : KW_CREATE (orReplace)? KW_VIEW (ifNotExists)? name=tableName + (LPAREN columnNameCommentList RPAREN)? tableComment? viewPartition? + tablePropertiesPrefixed? + KW_AS + selectStatement + -> ^(TOK_CREATEVIEW $name orReplace? + ifNotExists? + columnNameCommentList? + tableComment? + viewPartition? + tablePropertiesPrefixed? + selectStatement + ) + ; + +viewPartition +@init { msgs.push("view partition specification"); } +@after { msgs.pop(); } + : KW_PARTITIONED KW_ON LPAREN columnNameList RPAREN + -> ^(TOK_VIEWPARTCOLS columnNameList) + ; + +dropViewStatement +@init { msgs.push("drop view statement"); } +@after { msgs.pop(); } + : KW_DROP KW_VIEW ifExists? viewName -> ^(TOK_DROPVIEW viewName ifExists?) + ; + +showStmtIdentifier +@init { msgs.push("identifier for show statement"); } +@after { msgs.pop(); } + : identifier + | StringLiteral + ; + +tableComment +@init { msgs.push("table's comment"); } +@after { msgs.pop(); } + : + KW_COMMENT comment=StringLiteral -> ^(TOK_TABLECOMMENT $comment) + ; + +tablePartition +@init { msgs.push("table partition specification"); } +@after { msgs.pop(); } + : KW_PARTITIONED KW_BY LPAREN columnNameTypeList RPAREN + -> ^(TOK_TABLEPARTCOLS columnNameTypeList) + ; + +tableBuckets +@init { msgs.push("table buckets specification"); } +@after { msgs.pop(); } + : + KW_CLUSTERED KW_BY LPAREN bucketCols=columnNameList RPAREN (KW_SORTED KW_BY LPAREN sortCols=columnNameOrderList RPAREN)? KW_INTO num=Number KW_BUCKETS + -> ^(TOK_TABLEBUCKETS $bucketCols $sortCols? $num) + ; + +tableSkewed +@init { msgs.push("table skewed specification"); } +@after { msgs.pop(); } + : + KW_SKEWED KW_BY LPAREN skewedCols=columnNameList RPAREN KW_ON LPAREN (skewedValues=skewedValueElement) RPAREN (storedAsDirs)? + -> ^(TOK_TABLESKEWED $skewedCols $skewedValues storedAsDirs?) + ; + +rowFormat +@init { msgs.push("serde specification"); } +@after { msgs.pop(); } + : rowFormatSerde -> ^(TOK_SERDE rowFormatSerde) + | rowFormatDelimited -> ^(TOK_SERDE rowFormatDelimited) + | -> ^(TOK_SERDE) + ; + +recordReader +@init { msgs.push("record reader specification"); } +@after { msgs.pop(); } + : KW_RECORDREADER StringLiteral -> ^(TOK_RECORDREADER StringLiteral) + | -> ^(TOK_RECORDREADER) + ; + +recordWriter +@init { msgs.push("record writer specification"); } +@after { msgs.pop(); } + : KW_RECORDWRITER StringLiteral -> ^(TOK_RECORDWRITER StringLiteral) + | -> ^(TOK_RECORDWRITER) + ; + +rowFormatSerde +@init { msgs.push("serde format specification"); } +@after { msgs.pop(); } + : KW_ROW KW_FORMAT KW_SERDE name=StringLiteral (KW_WITH KW_SERDEPROPERTIES serdeprops=tableProperties)? + -> ^(TOK_SERDENAME $name $serdeprops?) + ; + +rowFormatDelimited +@init { msgs.push("serde properties specification"); } +@after { msgs.pop(); } + : + KW_ROW KW_FORMAT KW_DELIMITED tableRowFormatFieldIdentifier? tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? tableRowFormatLinesIdentifier? + -> ^(TOK_SERDEPROPS tableRowFormatFieldIdentifier? tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? tableRowFormatLinesIdentifier?) + ; + +tableRowFormat +@init { msgs.push("table row format specification"); } +@after { msgs.pop(); } + : + rowFormatDelimited + -> ^(TOK_TABLEROWFORMAT rowFormatDelimited) + | rowFormatSerde + -> ^(TOK_TABLESERIALIZER rowFormatSerde) + ; + +tablePropertiesPrefixed +@init { msgs.push("table properties with prefix"); } +@after { msgs.pop(); } + : + KW_TBLPROPERTIES! tableProperties + ; + +tableProperties +@init { msgs.push("table properties"); } +@after { msgs.pop(); } + : + LPAREN tablePropertiesList RPAREN -> ^(TOK_TABLEPROPERTIES tablePropertiesList) + ; + +tablePropertiesList +@init { msgs.push("table properties list"); } +@after { msgs.pop(); } + : + keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_TABLEPROPLIST keyValueProperty+) + | + keyProperty (COMMA keyProperty)* -> ^(TOK_TABLEPROPLIST keyProperty+) + ; + +keyValueProperty +@init { msgs.push("specifying key/value property"); } +@after { msgs.pop(); } + : + key=StringLiteral EQUAL value=StringLiteral -> ^(TOK_TABLEPROPERTY $key $value) + ; + +keyProperty +@init { msgs.push("specifying key property"); } +@after { msgs.pop(); } + : + key=StringLiteral -> ^(TOK_TABLEPROPERTY $key TOK_NULL) + ; + +tableRowFormatFieldIdentifier +@init { msgs.push("table row format's field separator"); } +@after { msgs.pop(); } + : + KW_FIELDS KW_TERMINATED KW_BY fldIdnt=StringLiteral (KW_ESCAPED KW_BY fldEscape=StringLiteral)? + -> ^(TOK_TABLEROWFORMATFIELD $fldIdnt $fldEscape?) + ; + +tableRowFormatCollItemsIdentifier +@init { msgs.push("table row format's column separator"); } +@after { msgs.pop(); } + : + KW_COLLECTION KW_ITEMS KW_TERMINATED KW_BY collIdnt=StringLiteral + -> ^(TOK_TABLEROWFORMATCOLLITEMS $collIdnt) + ; + +tableRowFormatMapKeysIdentifier +@init { msgs.push("table row format's map key separator"); } +@after { msgs.pop(); } + : + KW_MAP KW_KEYS KW_TERMINATED KW_BY mapKeysIdnt=StringLiteral + -> ^(TOK_TABLEROWFORMATMAPKEYS $mapKeysIdnt) + ; + +tableRowFormatLinesIdentifier +@init { msgs.push("table row format's line separator"); } +@after { msgs.pop(); } + : + KW_LINES KW_TERMINATED KW_BY linesIdnt=StringLiteral + -> ^(TOK_TABLEROWFORMATLINES $linesIdnt) + ; + +tableFileFormat +@init { msgs.push("table file format specification"); } +@after { msgs.pop(); } + : + KW_STORED KW_AS KW_SEQUENCEFILE -> TOK_TBLSEQUENCEFILE + | KW_STORED KW_AS KW_TEXTFILE -> TOK_TBLTEXTFILE + | KW_STORED KW_AS KW_RCFILE -> TOK_TBLRCFILE + | KW_STORED KW_AS KW_INPUTFORMAT inFmt=StringLiteral KW_OUTPUTFORMAT outFmt=StringLiteral (KW_INPUTDRIVER inDriver=StringLiteral KW_OUTPUTDRIVER outDriver=StringLiteral)? + -> ^(TOK_TABLEFILEFORMAT $inFmt $outFmt $inDriver? $outDriver?) + | KW_STORED KW_BY storageHandler=StringLiteral + (KW_WITH KW_SERDEPROPERTIES serdeprops=tableProperties)? + -> ^(TOK_STORAGEHANDLER $storageHandler $serdeprops?) + | KW_STORED KW_AS genericSpec=identifier + -> ^(TOK_FILEFORMAT_GENERIC $genericSpec) + ; + +tableLocation +@init { msgs.push("table location specification"); } +@after { msgs.pop(); } + : + KW_LOCATION locn=StringLiteral -> ^(TOK_TABLELOCATION $locn) + ; + +columnNameTypeList +@init { msgs.push("column name type list"); } +@after { msgs.pop(); } + : columnNameType (COMMA columnNameType)* -> ^(TOK_TABCOLLIST columnNameType+) + ; + +columnNameColonTypeList +@init { msgs.push("column name type list"); } +@after { msgs.pop(); } + : columnNameColonType (COMMA columnNameColonType)* -> ^(TOK_TABCOLLIST columnNameColonType+) + ; + +columnNameList +@init { msgs.push("column name list"); } +@after { msgs.pop(); } + : columnName (COMMA columnName)* -> ^(TOK_TABCOLNAME columnName+) + ; + +columnName +@init { msgs.push("column name"); } +@after { msgs.pop(); } + : + identifier + ; + +columnNameOrderList +@init { msgs.push("column name order list"); } +@after { msgs.pop(); } + : columnNameOrder (COMMA columnNameOrder)* -> ^(TOK_TABCOLNAME columnNameOrder+) + ; + +skewedValueElement +@init { msgs.push("skewed value element"); } +@after { msgs.pop(); } + : + skewedColumnValues + | skewedColumnValuePairList + ; + +skewedColumnValuePairList +@init { msgs.push("column value pair list"); } +@after { msgs.pop(); } + : skewedColumnValuePair (COMMA skewedColumnValuePair)* -> ^(TOK_TABCOLVALUE_PAIR skewedColumnValuePair+) + ; + +skewedColumnValuePair +@init { msgs.push("column value pair"); } +@after { msgs.pop(); } + : + LPAREN colValues=skewedColumnValues RPAREN + -> ^(TOK_TABCOLVALUES $colValues) + ; + +skewedColumnValues +@init { msgs.push("column values"); } +@after { msgs.pop(); } + : skewedColumnValue (COMMA skewedColumnValue)* -> ^(TOK_TABCOLVALUE skewedColumnValue+) + ; + +skewedColumnValue +@init { msgs.push("column value"); } +@after { msgs.pop(); } + : + constant + ; + +skewedValueLocationElement +@init { msgs.push("skewed value location element"); } +@after { msgs.pop(); } + : + skewedColumnValue + | skewedColumnValuePair + ; + +columnNameOrder +@init { msgs.push("column name order"); } +@after { msgs.pop(); } + : identifier (asc=KW_ASC | desc=KW_DESC)? + -> {$desc == null}? ^(TOK_TABSORTCOLNAMEASC identifier) + -> ^(TOK_TABSORTCOLNAMEDESC identifier) + ; + +columnNameCommentList +@init { msgs.push("column name comment list"); } +@after { msgs.pop(); } + : columnNameComment (COMMA columnNameComment)* -> ^(TOK_TABCOLNAME columnNameComment+) + ; + +columnNameComment +@init { msgs.push("column name comment"); } +@after { msgs.pop(); } + : colName=identifier (KW_COMMENT comment=StringLiteral)? + -> ^(TOK_TABCOL $colName TOK_NULL $comment?) + ; + +columnRefOrder +@init { msgs.push("column order"); } +@after { msgs.pop(); } + : expression (asc=KW_ASC | desc=KW_DESC)? + -> {$desc == null}? ^(TOK_TABSORTCOLNAMEASC expression) + -> ^(TOK_TABSORTCOLNAMEDESC expression) + ; + +columnNameType +@init { msgs.push("column specification"); } +@after { msgs.pop(); } + : colName=identifier colType (KW_COMMENT comment=StringLiteral)? + -> {$comment == null}? ^(TOK_TABCOL $colName colType) + -> ^(TOK_TABCOL $colName colType $comment) + ; + +columnNameColonType +@init { msgs.push("column specification"); } +@after { msgs.pop(); } + : colName=identifier COLON colType (KW_COMMENT comment=StringLiteral)? + -> {$comment == null}? ^(TOK_TABCOL $colName colType) + -> ^(TOK_TABCOL $colName colType $comment) + ; + +colType +@init { msgs.push("column type"); } +@after { msgs.pop(); } + : type + ; + +colTypeList +@init { msgs.push("column type list"); } +@after { msgs.pop(); } + : colType (COMMA colType)* -> ^(TOK_COLTYPELIST colType+) + ; + +type + : primitiveType + | listType + | structType + | mapType + | unionType; + +primitiveType +@init { msgs.push("primitive type specification"); } +@after { msgs.pop(); } + : KW_TINYINT -> TOK_TINYINT + | KW_SMALLINT -> TOK_SMALLINT + | KW_INT -> TOK_INT + | KW_BIGINT -> TOK_BIGINT + | KW_BOOLEAN -> TOK_BOOLEAN + | KW_FLOAT -> TOK_FLOAT + | KW_DOUBLE -> TOK_DOUBLE + | KW_DATE -> TOK_DATE + | KW_DATETIME -> TOK_DATETIME + | KW_TIMESTAMP -> TOK_TIMESTAMP + | KW_STRING -> TOK_STRING + | KW_BINARY -> TOK_BINARY + | KW_DECIMAL -> TOK_DECIMAL + ; + +listType +@init { msgs.push("list type"); } +@after { msgs.pop(); } + : KW_ARRAY LESSTHAN type GREATERTHAN -> ^(TOK_LIST type) + ; + +structType +@init { msgs.push("struct type"); } +@after { msgs.pop(); } + : KW_STRUCT LESSTHAN columnNameColonTypeList GREATERTHAN -> ^(TOK_STRUCT columnNameColonTypeList) + ; + +mapType +@init { msgs.push("map type"); } +@after { msgs.pop(); } + : KW_MAP LESSTHAN left=primitiveType COMMA right=type GREATERTHAN + -> ^(TOK_MAP $left $right) + ; + +unionType +@init { msgs.push("uniontype type"); } +@after { msgs.pop(); } + : KW_UNIONTYPE LESSTHAN colTypeList GREATERTHAN -> ^(TOK_UNIONTYPE colTypeList) + ; + +queryOperator +@init { msgs.push("query operator"); } +@after { msgs.pop(); } + : KW_UNION KW_ALL -> ^(TOK_UNION) + ; + +// select statement select ... from ... where ... group by ... order by ... +queryStatementExpression + : queryStatement (queryOperator^ queryStatement)* + ; + +queryStatement + : + fromClause + ( b+=body )+ -> ^(TOK_QUERY fromClause body+) + | regular_body + ; + +regular_body + : + insertClause + selectClause + fromClause + whereClause? + groupByClause? + havingClause? + orderByClause? + clusterByClause? + distributeByClause? + sortByClause? + limitClause? -> ^(TOK_QUERY fromClause ^(TOK_INSERT insertClause + selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? + distributeByClause? sortByClause? limitClause?)) + | + selectStatement + ; + +selectStatement + : + selectClause + fromClause + whereClause? + groupByClause? + havingClause? + orderByClause? + clusterByClause? + distributeByClause? + sortByClause? + limitClause? -> ^(TOK_QUERY fromClause ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE)) + selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? + distributeByClause? sortByClause? limitClause?)) + ; + + +body + : + insertClause + selectClause + whereClause? + groupByClause? + havingClause? + orderByClause? + clusterByClause? + distributeByClause? + sortByClause? + limitClause? -> ^(TOK_INSERT insertClause? + selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? + distributeByClause? sortByClause? limitClause?) + | + selectClause + whereClause? + groupByClause? + havingClause? + orderByClause? + clusterByClause? + distributeByClause? + sortByClause? + limitClause? -> ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE)) + selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? + distributeByClause? sortByClause? limitClause?) + ; + +insertClause +@init { msgs.push("insert clause"); } +@after { msgs.pop(); } + : + KW_INSERT KW_OVERWRITE destination ifNotExists? -> ^(TOK_DESTINATION destination ifNotExists?) + | KW_INSERT KW_INTO KW_TABLE tableOrPartition + -> ^(TOK_INSERT_INTO tableOrPartition) + ; + +destination +@init { msgs.push("destination specification"); } +@after { msgs.pop(); } + : + KW_LOCAL KW_DIRECTORY StringLiteral -> ^(TOK_LOCAL_DIR StringLiteral) + | KW_DIRECTORY StringLiteral -> ^(TOK_DIR StringLiteral) + | KW_TABLE tableOrPartition -> tableOrPartition + ; + +limitClause +@init { msgs.push("limit clause"); } +@after { msgs.pop(); } + : + KW_LIMIT num=Number -> ^(TOK_LIMIT $num) + ; + + Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SelectClauseParser.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SelectClauseParser.g (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SelectClauseParser.g (working copy) @@ -0,0 +1,157 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +parser grammar SelectClauseParser; + +options +{ +output=AST; +ASTLabelType=CommonTree; +backtrack=false; +k=3; +} + +@members { + @Override + public Object recoverFromMismatchedSet(IntStream input, + RecognitionException re, BitSet follow) throws RecognitionException { + throw re; + } + @Override + public void displayRecognitionError(String[] tokenNames, + RecognitionException e) { + gParent.errors.add(new ParseError(gParent, e, tokenNames)); + } +} + +@rulecatch { +catch (RecognitionException e) { + throw e; +} +} + +//----------------------- Rules for parsing selectClause ----------------------------- +// select a,b,c ... +selectClause +@init { gParent.msgs.push("select clause"); } +@after { gParent.msgs.pop(); } + : + KW_SELECT hintClause? (((KW_ALL | dist=KW_DISTINCT)? selectList) + | (transform=KW_TRANSFORM selectTrfmClause)) + -> {$transform == null && $dist == null}? ^(TOK_SELECT hintClause? selectList) + -> {$transform == null && $dist != null}? ^(TOK_SELECTDI hintClause? selectList) + -> ^(TOK_SELECT hintClause? ^(TOK_SELEXPR selectTrfmClause) ) + | + trfmClause ->^(TOK_SELECT ^(TOK_SELEXPR trfmClause)) + ; + +selectList +@init { gParent.msgs.push("select list"); } +@after { gParent.msgs.pop(); } + : + selectItem ( COMMA selectItem )* -> selectItem+ + ; + +selectTrfmClause +@init { gParent.msgs.push("transform clause"); } +@after { gParent.msgs.pop(); } + : + LPAREN selectExpressionList RPAREN + inSerde=rowFormat inRec=recordWriter + KW_USING StringLiteral + ( KW_AS ((LPAREN (aliasList | columnNameTypeList) RPAREN) | (aliasList | columnNameTypeList)))? + outSerde=rowFormat outRec=recordReader + -> ^(TOK_TRANSFORM selectExpressionList $inSerde $inRec StringLiteral $outSerde $outRec aliasList? columnNameTypeList?) + ; + +hintClause +@init { gParent.msgs.push("hint clause"); } +@after { gParent.msgs.pop(); } + : + DIVIDE STAR PLUS hintList STAR DIVIDE -> ^(TOK_HINTLIST hintList) + ; + +hintList +@init { gParent.msgs.push("hint list"); } +@after { gParent.msgs.pop(); } + : + hintItem (COMMA hintItem)* -> hintItem+ + ; + +hintItem +@init { gParent.msgs.push("hint item"); } +@after { gParent.msgs.pop(); } + : + hintName (LPAREN hintArgs RPAREN)? -> ^(TOK_HINT hintName hintArgs?) + ; + +hintName +@init { gParent.msgs.push("hint name"); } +@after { gParent.msgs.pop(); } + : + KW_MAPJOIN -> TOK_MAPJOIN + | KW_STREAMTABLE -> TOK_STREAMTABLE + | KW_HOLD_DDLTIME -> TOK_HOLD_DDLTIME + ; + +hintArgs +@init { gParent.msgs.push("hint arguments"); } +@after { gParent.msgs.pop(); } + : + hintArgName (COMMA hintArgName)* -> ^(TOK_HINTARGLIST hintArgName+) + ; + +hintArgName +@init { gParent.msgs.push("hint argument name"); } +@after { gParent.msgs.pop(); } + : + identifier + ; + +selectItem +@init { gParent.msgs.push("selection target"); } +@after { gParent.msgs.pop(); } + : + ( selectExpression ((KW_AS? identifier) | (KW_AS LPAREN identifier (COMMA identifier)* RPAREN))?) -> ^(TOK_SELEXPR selectExpression identifier*) + ; + +trfmClause +@init { gParent.msgs.push("transform clause"); } +@after { gParent.msgs.pop(); } + : + ( KW_MAP selectExpressionList + | KW_REDUCE selectExpressionList ) + inSerde=rowFormat inRec=recordWriter + KW_USING StringLiteral + ( KW_AS ((LPAREN (aliasList | columnNameTypeList) RPAREN) | (aliasList | columnNameTypeList)))? + outSerde=rowFormat outRec=recordReader + -> ^(TOK_TRANSFORM selectExpressionList $inSerde $inRec StringLiteral $outSerde $outRec aliasList? columnNameTypeList?) + ; + +selectExpression +@init { gParent.msgs.push("select expression"); } +@after { gParent.msgs.pop(); } + : + expression | tableAllColumns + ; + +selectExpressionList +@init { gParent.msgs.push("select expression list"); } +@after { gParent.msgs.pop(); } + : + selectExpression (COMMA selectExpression)* -> ^(TOK_EXPLIST selectExpression+) + ; + Index: ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java (revision 1442678) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java (working copy) @@ -19,15 +19,8 @@ package org.apache.hadoop.hive.ql.parse; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - import org.antlr.runtime.ANTLRStringStream; -import org.antlr.runtime.BitSet; import org.antlr.runtime.CharStream; -import org.antlr.runtime.FailedPredicateException; -import org.antlr.runtime.IntStream; -import org.antlr.runtime.MismatchedTokenException; import org.antlr.runtime.NoViableAltException; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; @@ -48,170 +41,6 @@ private static final Log LOG = LogFactory.getLog("hive.ql.parse.ParseDriver"); - private static HashMap xlateMap; - static { - xlateMap = new HashMap(); - - // Keywords - xlateMap.put("KW_TRUE", "TRUE"); - xlateMap.put("KW_FALSE", "FALSE"); - xlateMap.put("KW_ALL", "ALL"); - xlateMap.put("KW_AND", "AND"); - xlateMap.put("KW_OR", "OR"); - xlateMap.put("KW_NOT", "NOT"); - xlateMap.put("KW_LIKE", "LIKE"); - - xlateMap.put("KW_ASC", "ASC"); - xlateMap.put("KW_DESC", "DESC"); - xlateMap.put("KW_ORDER", "ORDER"); - xlateMap.put("KW_BY", "BY"); - xlateMap.put("KW_GROUP", "GROUP"); - xlateMap.put("KW_WHERE", "WHERE"); - xlateMap.put("KW_FROM", "FROM"); - xlateMap.put("KW_AS", "AS"); - xlateMap.put("KW_SELECT", "SELECT"); - xlateMap.put("KW_DISTINCT", "DISTINCT"); - xlateMap.put("KW_INSERT", "INSERT"); - xlateMap.put("KW_OVERWRITE", "OVERWRITE"); - xlateMap.put("KW_OUTER", "OUTER"); - xlateMap.put("KW_JOIN", "JOIN"); - xlateMap.put("KW_LEFT", "LEFT"); - xlateMap.put("KW_RIGHT", "RIGHT"); - xlateMap.put("KW_FULL", "FULL"); - xlateMap.put("KW_ON", "ON"); - xlateMap.put("KW_PARTITION", "PARTITION"); - xlateMap.put("KW_PARTITIONS", "PARTITIONS"); - xlateMap.put("KW_TABLE", "TABLE"); - xlateMap.put("KW_TABLES", "TABLES"); - xlateMap.put("KW_TBLPROPERTIES", "TBLPROPERTIES"); - xlateMap.put("KW_SHOW", "SHOW"); - xlateMap.put("KW_MSCK", "MSCK"); - xlateMap.put("KW_DIRECTORY", "DIRECTORY"); - xlateMap.put("KW_LOCAL", "LOCAL"); - xlateMap.put("KW_TRANSFORM", "TRANSFORM"); - xlateMap.put("KW_USING", "USING"); - xlateMap.put("KW_CLUSTER", "CLUSTER"); - xlateMap.put("KW_DISTRIBUTE", "DISTRIBUTE"); - xlateMap.put("KW_SORT", "SORT"); - xlateMap.put("KW_UNION", "UNION"); - xlateMap.put("KW_LOAD", "LOAD"); - xlateMap.put("KW_DATA", "DATA"); - xlateMap.put("KW_INPATH", "INPATH"); - xlateMap.put("KW_IS", "IS"); - xlateMap.put("KW_NULL", "NULL"); - xlateMap.put("KW_CREATE", "CREATE"); - xlateMap.put("KW_EXTERNAL", "EXTERNAL"); - xlateMap.put("KW_ALTER", "ALTER"); - xlateMap.put("KW_DESCRIBE", "DESCRIBE"); - xlateMap.put("KW_DROP", "DROP"); - xlateMap.put("KW_REANME", "REANME"); - xlateMap.put("KW_TO", "TO"); - xlateMap.put("KW_COMMENT", "COMMENT"); - xlateMap.put("KW_BOOLEAN", "BOOLEAN"); - xlateMap.put("KW_TINYINT", "TINYINT"); - xlateMap.put("KW_SMALLINT", "SMALLINT"); - xlateMap.put("KW_INT", "INT"); - xlateMap.put("KW_BIGINT", "BIGINT"); - xlateMap.put("KW_FLOAT", "FLOAT"); - xlateMap.put("KW_DOUBLE", "DOUBLE"); - xlateMap.put("KW_DATE", "DATE"); - xlateMap.put("KW_DATETIME", "DATETIME"); - xlateMap.put("KW_TIMESTAMP", "TIMESTAMP"); - xlateMap.put("KW_STRING", "STRING"); - xlateMap.put("KW_BINARY", "BINARY"); - xlateMap.put("KW_ARRAY", "ARRAY"); - xlateMap.put("KW_MAP", "MAP"); - xlateMap.put("KW_REDUCE", "REDUCE"); - xlateMap.put("KW_PARTITIONED", "PARTITIONED"); - xlateMap.put("KW_CLUSTERED", "CLUSTERED"); - xlateMap.put("KW_SORTED", "SORTED"); - xlateMap.put("KW_INTO", "INTO"); - xlateMap.put("KW_BUCKETS", "BUCKETS"); - xlateMap.put("KW_ROW", "ROW"); - xlateMap.put("KW_FORMAT", "FORMAT"); - xlateMap.put("KW_DELIMITED", "DELIMITED"); - xlateMap.put("KW_FIELDS", "FIELDS"); - xlateMap.put("KW_TERMINATED", "TERMINATED"); - xlateMap.put("KW_COLLECTION", "COLLECTION"); - xlateMap.put("KW_ITEMS", "ITEMS"); - xlateMap.put("KW_KEYS", "KEYS"); - xlateMap.put("KW_KEY_TYPE", "$KEY$"); - xlateMap.put("KW_LINES", "LINES"); - xlateMap.put("KW_STORED", "STORED"); - xlateMap.put("KW_SEQUENCEFILE", "SEQUENCEFILE"); - xlateMap.put("KW_TEXTFILE", "TEXTFILE"); - xlateMap.put("KW_INPUTFORMAT", "INPUTFORMAT"); - xlateMap.put("KW_OUTPUTFORMAT", "OUTPUTFORMAT"); - xlateMap.put("KW_LOCATION", "LOCATION"); - xlateMap.put("KW_TABLESAMPLE", "TABLESAMPLE"); - xlateMap.put("KW_BUCKET", "BUCKET"); - xlateMap.put("KW_OUT", "OUT"); - xlateMap.put("KW_OF", "OF"); - xlateMap.put("KW_CAST", "CAST"); - xlateMap.put("KW_ADD", "ADD"); - xlateMap.put("KW_REPLACE", "REPLACE"); - xlateMap.put("KW_COLUMNS", "COLUMNS"); - xlateMap.put("KW_RLIKE", "RLIKE"); - xlateMap.put("KW_REGEXP", "REGEXP"); - xlateMap.put("KW_TEMPORARY", "TEMPORARY"); - xlateMap.put("KW_FUNCTION", "FUNCTION"); - xlateMap.put("KW_EXPLAIN", "EXPLAIN"); - xlateMap.put("KW_EXTENDED", "EXTENDED"); - xlateMap.put("KW_SERDE", "SERDE"); - xlateMap.put("KW_WITH", "WITH"); - xlateMap.put("KW_SERDEPROPERTIES", "SERDEPROPERTIES"); - xlateMap.put("KW_LIMIT", "LIMIT"); - xlateMap.put("KW_SET", "SET"); - xlateMap.put("KW_PROPERTIES", "TBLPROPERTIES"); - xlateMap.put("KW_VALUE_TYPE", "$VALUE$"); - xlateMap.put("KW_ELEM_TYPE", "$ELEM$"); - - // Operators - xlateMap.put("DOT", "."); - xlateMap.put("COLON", ":"); - xlateMap.put("COMMA", ","); - xlateMap.put("SEMICOLON", ");"); - - xlateMap.put("LPAREN", "("); - xlateMap.put("RPAREN", ")"); - xlateMap.put("LSQUARE", "["); - xlateMap.put("RSQUARE", "]"); - - xlateMap.put("EQUAL", "="); - xlateMap.put("NOTEQUAL", "<>"); - xlateMap.put("EQUAL_NS", "<=>"); - xlateMap.put("LESSTHANOREQUALTO", "<="); - xlateMap.put("LESSTHAN", "<"); - xlateMap.put("GREATERTHANOREQUALTO", ">="); - xlateMap.put("GREATERTHAN", ">"); - - xlateMap.put("DIVIDE", "/"); - xlateMap.put("PLUS", "+"); - xlateMap.put("MINUS", "-"); - xlateMap.put("STAR", "*"); - xlateMap.put("MOD", "%"); - - xlateMap.put("AMPERSAND", "&"); - xlateMap.put("TILDE", "~"); - xlateMap.put("BITWISEOR", "|"); - xlateMap.put("BITWISEXOR", "^"); - xlateMap.put("CharSetLiteral", "\\'"); - } - - public static Collection getKeywords() { - return xlateMap.values(); - } - - private static String xlate(String name) { - - String ret = xlateMap.get(name); - if (ret == null) { - ret = name; - } - - return ret; - } - /** * ANTLRNoCaseStringStream. * @@ -298,89 +127,6 @@ } /** - * HiveParserX. - * - */ - public class HiveParserX extends HiveParser { - - private final ArrayList errors; - - public HiveParserX(TokenStream input) { - super(input); - errors = new ArrayList(); - } - - @Override - public Object recoverFromMismatchedSet(IntStream input, - RecognitionException re, BitSet follow) throws RecognitionException { - throw re; - } - - @Override - public void displayRecognitionError(String[] tokenNames, - RecognitionException e) { - - errors.add(new ParseError(this, e, tokenNames)); - } - - @Override - public String getErrorHeader(RecognitionException e) { - String header = null; - if (e.charPositionInLine < 0 && input.LT(-1) != null) { - Token t = input.LT(-1); - header = "line " + t.getLine() + ":" + t.getCharPositionInLine(); - } else { - header = super.getErrorHeader(e); - } - - return header; - } - - - @Override - public String getErrorMessage(RecognitionException e, String[] tokenNames) { - String msg = null; - - // Translate the token names to something that the user can understand - String[] xlateNames = new String[tokenNames.length]; - for (int i = 0; i < tokenNames.length; ++i) { - xlateNames[i] = ParseDriver.xlate(tokenNames[i]); - } - - if (e instanceof NoViableAltException) { - @SuppressWarnings("unused") - NoViableAltException nvae = (NoViableAltException) e; - // for development, can add - // "decision=<<"+nvae.grammarDecisionDescription+">>" - // and "(decision="+nvae.decisionNumber+") and - // "state "+nvae.stateNumber - msg = "cannot recognize input near " - + getTokenErrorDisplay(e.token) - + (input.LT(2) != null ? " " + getTokenErrorDisplay(input.LT(2)) : "") - + (input.LT(3) != null ? " " + getTokenErrorDisplay(input.LT(3)) : ""); - } else if (e instanceof MismatchedTokenException) { - MismatchedTokenException mte = (MismatchedTokenException) e; - msg = super.getErrorMessage(e, xlateNames) + (input.LT(-1) == null ? "":" near '" + input.LT(-1).getText()) + "'"; - } else if (e instanceof FailedPredicateException) { - FailedPredicateException fpe = (FailedPredicateException) e; - msg = "Failed to recognize predicate '" + fpe.token.getText() + "'. Failed rule: '" + fpe.ruleName + "'"; - } else { - msg = super.getErrorMessage(e, xlateNames); - } - - if (msgs.size() > 0) { - msg = msg + " in " + msgs.peek(); - } - return msg; - } - - public ArrayList getErrors() { - return errors; - } - - } - - /** * Tree adaptor for making antlr return ASTNodes instead of CommonTree nodes * so that the graph walking algorithms and the rules framework defined in * ql.lib can be used with the AST Nodes. @@ -437,22 +183,22 @@ if (ctx != null) { ctx.setTokenRewriteStream(tokens); } - HiveParserX parser = new HiveParserX(tokens); + HiveParser parser = new HiveParser(tokens); parser.setTreeAdaptor(adaptor); HiveParser.statement_return r = null; try { r = parser.statement(); } catch (RecognitionException e) { e.printStackTrace(); - throw new ParseException(parser.getErrors()); + throw new ParseException(parser.errors); } - if (lexer.getErrors().size() == 0 && parser.getErrors().size() == 0) { + if (lexer.getErrors().size() == 0 && parser.errors.size() == 0) { LOG.info("Parse Completed"); } else if (lexer.getErrors().size() != 0) { throw new ParseException(lexer.getErrors()); } else { - throw new ParseException(parser.getErrors()); + throw new ParseException(parser.errors); } return (ASTNode) r.getTree(); Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1442678) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -1,2736 +0,0 @@ -/** - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -grammar Hive; - -options -{ -output=AST; -ASTLabelType=CommonTree; -backtrack=false; -k=3; -} - -tokens { -TOK_INSERT; -TOK_QUERY; -TOK_SELECT; -TOK_SELECTDI; -TOK_SELEXPR; -TOK_FROM; -TOK_TAB; -TOK_PARTSPEC; -TOK_PARTVAL; -TOK_DIR; -TOK_LOCAL_DIR; -TOK_TABREF; -TOK_SUBQUERY; -TOK_INSERT_INTO; -TOK_DESTINATION; -TOK_ALLCOLREF; -TOK_TABLE_OR_COL; -TOK_FUNCTION; -TOK_FUNCTIONDI; -TOK_FUNCTIONSTAR; -TOK_WHERE; -TOK_OP_EQ; -TOK_OP_NE; -TOK_OP_LE; -TOK_OP_LT; -TOK_OP_GE; -TOK_OP_GT; -TOK_OP_DIV; -TOK_OP_ADD; -TOK_OP_SUB; -TOK_OP_MUL; -TOK_OP_MOD; -TOK_OP_BITAND; -TOK_OP_BITNOT; -TOK_OP_BITOR; -TOK_OP_BITXOR; -TOK_OP_AND; -TOK_OP_OR; -TOK_OP_NOT; -TOK_OP_LIKE; -TOK_TRUE; -TOK_FALSE; -TOK_TRANSFORM; -TOK_SERDE; -TOK_SERDENAME; -TOK_SERDEPROPS; -TOK_EXPLIST; -TOK_ALIASLIST; -TOK_GROUPBY; -TOK_ROLLUP_GROUPBY; -TOK_CUBE_GROUPBY; -TOK_GROUPING_SETS; -TOK_GROUPING_SETS_EXPRESSION; -TOK_HAVING; -TOK_ORDERBY; -TOK_CLUSTERBY; -TOK_DISTRIBUTEBY; -TOK_SORTBY; -TOK_UNION; -TOK_JOIN; -TOK_LEFTOUTERJOIN; -TOK_RIGHTOUTERJOIN; -TOK_FULLOUTERJOIN; -TOK_UNIQUEJOIN; -TOK_CROSSJOIN; -TOK_LOAD; -TOK_EXPORT; -TOK_IMPORT; -TOK_NULL; -TOK_ISNULL; -TOK_ISNOTNULL; -TOK_TINYINT; -TOK_SMALLINT; -TOK_INT; -TOK_BIGINT; -TOK_BOOLEAN; -TOK_FLOAT; -TOK_DOUBLE; -TOK_DATE; -TOK_DATETIME; -TOK_TIMESTAMP; -TOK_STRING; -TOK_BINARY; -TOK_DECIMAL; -TOK_LIST; -TOK_STRUCT; -TOK_MAP; -TOK_UNIONTYPE; -TOK_COLTYPELIST; -TOK_CREATEDATABASE; -TOK_CREATETABLE; -TOK_TRUNCATETABLE; -TOK_CREATEINDEX; -TOK_CREATEINDEX_INDEXTBLNAME; -TOK_DEFERRED_REBUILDINDEX; -TOK_DROPINDEX; -TOK_DROPTABLE_PROPERTIES; -TOK_LIKETABLE; -TOK_DESCTABLE; -TOK_DESCFUNCTION; -TOK_ALTERTABLE_PARTITION; -TOK_ALTERTABLE_RENAME; -TOK_ALTERTABLE_ADDCOLS; -TOK_ALTERTABLE_RENAMECOL; -TOK_ALTERTABLE_RENAMEPART; -TOK_ALTERTABLE_REPLACECOLS; -TOK_ALTERTABLE_ADDPARTS; -TOK_ALTERTABLE_DROPPARTS; -TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE; -TOK_ALTERTABLE_TOUCH; -TOK_ALTERTABLE_ARCHIVE; -TOK_ALTERTABLE_UNARCHIVE; -TOK_ALTERTABLE_SERDEPROPERTIES; -TOK_ALTERTABLE_SERIALIZER; -TOK_TABLE_PARTITION; -TOK_ALTERTABLE_FILEFORMAT; -TOK_ALTERTABLE_LOCATION; -TOK_ALTERTABLE_PROPERTIES; -TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION; -TOK_ALTERINDEX_REBUILD; -TOK_ALTERINDEX_PROPERTIES; -TOK_MSCK; -TOK_SHOWDATABASES; -TOK_SHOWTABLES; -TOK_SHOWCOLUMNS; -TOK_SHOWFUNCTIONS; -TOK_SHOWPARTITIONS; -TOK_SHOW_CREATETABLE; -TOK_SHOW_TABLESTATUS; -TOK_SHOW_TBLPROPERTIES; -TOK_SHOWLOCKS; -TOK_LOCKTABLE; -TOK_UNLOCKTABLE; -TOK_SWITCHDATABASE; -TOK_DROPDATABASE; -TOK_DROPTABLE; -TOK_DATABASECOMMENT; -TOK_TABCOLLIST; -TOK_TABCOL; -TOK_TABLECOMMENT; -TOK_TABLEPARTCOLS; -TOK_TABLEBUCKETS; -TOK_TABLEROWFORMAT; -TOK_TABLEROWFORMATFIELD; -TOK_TABLEROWFORMATCOLLITEMS; -TOK_TABLEROWFORMATMAPKEYS; -TOK_TABLEROWFORMATLINES; -TOK_TBLSEQUENCEFILE; -TOK_TBLTEXTFILE; -TOK_TBLRCFILE; -TOK_TABLEFILEFORMAT; -TOK_FILEFORMAT_GENERIC; -TOK_OFFLINE; -TOK_ENABLE; -TOK_DISABLE; -TOK_READONLY; -TOK_NO_DROP; -TOK_STORAGEHANDLER; -TOK_ALTERTABLE_CLUSTER_SORT; -TOK_NOT_CLUSTERED; -TOK_NOT_SORTED; -TOK_TABCOLNAME; -TOK_TABLELOCATION; -TOK_PARTITIONLOCATION; -TOK_TABLEBUCKETSAMPLE; -TOK_TABLESPLITSAMPLE; -TOK_PERCENT; -TOK_LENGTH; -TOK_ROWCOUNT; -TOK_TMP_FILE; -TOK_TABSORTCOLNAMEASC; -TOK_TABSORTCOLNAMEDESC; -TOK_STRINGLITERALSEQUENCE; -TOK_CHARSETLITERAL; -TOK_CREATEFUNCTION; -TOK_DROPFUNCTION; -TOK_CREATEVIEW; -TOK_DROPVIEW; -TOK_ALTERVIEW_AS; -TOK_ALTERVIEW_PROPERTIES; -TOK_DROPVIEW_PROPERTIES; -TOK_ALTERVIEW_ADDPARTS; -TOK_ALTERVIEW_DROPPARTS; -TOK_ALTERVIEW_RENAME; -TOK_VIEWPARTCOLS; -TOK_EXPLAIN; -TOK_TABLESERIALIZER; -TOK_TABLEPROPERTIES; -TOK_TABLEPROPLIST; -TOK_INDEXPROPERTIES; -TOK_INDEXPROPLIST; -TOK_TABTYPE; -TOK_LIMIT; -TOK_TABLEPROPERTY; -TOK_IFEXISTS; -TOK_IFNOTEXISTS; -TOK_ORREPLACE; -TOK_HINTLIST; -TOK_HINT; -TOK_MAPJOIN; -TOK_STREAMTABLE; -TOK_HOLD_DDLTIME; -TOK_HINTARGLIST; -TOK_USERSCRIPTCOLNAMES; -TOK_USERSCRIPTCOLSCHEMA; -TOK_RECORDREADER; -TOK_RECORDWRITER; -TOK_LEFTSEMIJOIN; -TOK_LATERAL_VIEW; -TOK_TABALIAS; -TOK_ANALYZE; -TOK_CREATEROLE; -TOK_DROPROLE; -TOK_GRANT; -TOK_REVOKE; -TOK_SHOW_GRANT; -TOK_PRIVILEGE_LIST; -TOK_PRIVILEGE; -TOK_PRINCIPAL_NAME; -TOK_USER; -TOK_GROUP; -TOK_ROLE; -TOK_GRANT_WITH_OPTION; -TOK_PRIV_ALL; -TOK_PRIV_ALTER_METADATA; -TOK_PRIV_ALTER_DATA; -TOK_PRIV_DROP; -TOK_PRIV_INDEX; -TOK_PRIV_LOCK; -TOK_PRIV_SELECT; -TOK_PRIV_SHOW_DATABASE; -TOK_PRIV_CREATE; -TOK_PRIV_OBJECT; -TOK_PRIV_OBJECT_COL; -TOK_GRANT_ROLE; -TOK_REVOKE_ROLE; -TOK_SHOW_ROLE_GRANT; -TOK_SHOWINDEXES; -TOK_INDEXCOMMENT; -TOK_DESCDATABASE; -TOK_DATABASEPROPERTIES; -TOK_DATABASELOCATION; -TOK_DBPROPLIST; -TOK_ALTERDATABASE_PROPERTIES; -TOK_ALTERTABLE_ALTERPARTS_MERGEFILES; -TOK_TABNAME; -TOK_TABSRC; -TOK_RESTRICT; -TOK_CASCADE; -TOK_TABLESKEWED; -TOK_TABCOLVALUE; -TOK_TABCOLVALUE_PAIR; -TOK_TABCOLVALUES; -TOK_ALTERTABLE_SKEWED; -TOK_ALTERTBLPART_SKEWED_LOCATION; -TOK_SKEWED_LOCATIONS; -TOK_SKEWED_LOCATION_LIST; -TOK_SKEWED_LOCATION_MAP; -TOK_STOREDASDIRS; -TOK_IGNOREPROTECTION; -} - - -// Package headers -@header { -package org.apache.hadoop.hive.ql.parse; -} -@lexer::header {package org.apache.hadoop.hive.ql.parse;} - - -@members { - Stack msgs = new Stack(); -} - -@rulecatch { -catch (RecognitionException e) { - reportError(e); - throw e; -} -} - -// starting rule -statement - : explainStatement EOF - | execStatement EOF - ; - -explainStatement -@init { msgs.push("explain statement"); } -@after { msgs.pop(); } - : KW_EXPLAIN (explainOptions=KW_EXTENDED|explainOptions=KW_FORMATTED|explainOptions=KW_DEPENDENCY)? execStatement - -> ^(TOK_EXPLAIN execStatement $explainOptions?) - ; - -execStatement -@init { msgs.push("statement"); } -@after { msgs.pop(); } - : queryStatementExpression - | loadStatement - | exportStatement - | importStatement - | ddlStatement - ; - -loadStatement -@init { msgs.push("load statement"); } -@after { msgs.pop(); } - : KW_LOAD KW_DATA (islocal=KW_LOCAL)? KW_INPATH (path=StringLiteral) (isoverwrite=KW_OVERWRITE)? KW_INTO KW_TABLE (tab=tableOrPartition) - -> ^(TOK_LOAD $path $tab $islocal? $isoverwrite?) - ; - -exportStatement -@init { msgs.push("export statement"); } -@after { msgs.pop(); } - : KW_EXPORT KW_TABLE (tab=tableOrPartition) KW_TO (path=StringLiteral) - -> ^(TOK_EXPORT $tab $path) - ; - -importStatement -@init { msgs.push("import statement"); } -@after { msgs.pop(); } - : KW_IMPORT ((ext=KW_EXTERNAL)? KW_TABLE (tab=tableOrPartition))? KW_FROM (path=StringLiteral) tableLocation? - -> ^(TOK_IMPORT $path $tab? $ext? tableLocation?) - ; - -ddlStatement -@init { msgs.push("ddl statement"); } -@after { msgs.pop(); } - : createDatabaseStatement - | switchDatabaseStatement - | dropDatabaseStatement - | createTableStatement - | dropTableStatement - | truncateTableStatement - | alterStatement - | descStatement - | showStatement - | metastoreCheck - | createViewStatement - | dropViewStatement - | createFunctionStatement - | createIndexStatement - | dropIndexStatement - | dropFunctionStatement - | analyzeStatement - | lockStatement - | unlockStatement - | createRoleStatement - | dropRoleStatement - | grantPrivileges - | revokePrivileges - | showGrants - | showRoleGrants - | grantRole - | revokeRole - ; - -ifExists -@init { msgs.push("if exists clause"); } -@after { msgs.pop(); } - : KW_IF KW_EXISTS - -> ^(TOK_IFEXISTS) - ; - -restrictOrCascade -@init { msgs.push("restrict or cascade clause"); } -@after { msgs.pop(); } - : KW_RESTRICT - -> ^(TOK_RESTRICT) - | KW_CASCADE - -> ^(TOK_CASCADE) - ; - -ifNotExists -@init { msgs.push("if not exists clause"); } -@after { msgs.pop(); } - : KW_IF KW_NOT KW_EXISTS - -> ^(TOK_IFNOTEXISTS) - ; - -storedAsDirs -@init { msgs.push("stored as directories"); } -@after { msgs.pop(); } - : KW_STORED KW_AS KW_DIRECTORIES - -> ^(TOK_STOREDASDIRS) - ; - -orReplace -@init { msgs.push("or replace clause"); } -@after { msgs.pop(); } - : KW_OR KW_REPLACE - -> ^(TOK_ORREPLACE) - ; - -ignoreProtection -@init { msgs.push("ignore protection clause"); } -@after { msgs.pop(); } - : KW_IGNORE KW_PROTECTION - -> ^(TOK_IGNOREPROTECTION) - ; - -createDatabaseStatement -@init { msgs.push("create database statement"); } -@after { msgs.pop(); } - : KW_CREATE (KW_DATABASE|KW_SCHEMA) - ifNotExists? - name=Identifier - databaseComment? - dbLocation? - (KW_WITH KW_DBPROPERTIES dbprops=dbProperties)? - -> ^(TOK_CREATEDATABASE $name ifNotExists? dbLocation? databaseComment? $dbprops?) - ; - -dbLocation -@init { msgs.push("database location specification"); } -@after { msgs.pop(); } - : - KW_LOCATION locn=StringLiteral -> ^(TOK_DATABASELOCATION $locn) - ; - -dbProperties -@init { msgs.push("dbproperties"); } -@after { msgs.pop(); } - : - LPAREN dbPropertiesList RPAREN -> ^(TOK_DATABASEPROPERTIES dbPropertiesList) - ; - -dbPropertiesList -@init { msgs.push("database properties list"); } -@after { msgs.pop(); } - : - keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_DBPROPLIST keyValueProperty+) - ; - - -switchDatabaseStatement -@init { msgs.push("switch database statement"); } -@after { msgs.pop(); } - : KW_USE Identifier - -> ^(TOK_SWITCHDATABASE Identifier) - ; - -dropDatabaseStatement -@init { msgs.push("drop database statement"); } -@after { msgs.pop(); } - : KW_DROP (KW_DATABASE|KW_SCHEMA) ifExists? Identifier restrictOrCascade? - -> ^(TOK_DROPDATABASE Identifier ifExists? restrictOrCascade?) - ; - -databaseComment -@init { msgs.push("database's comment"); } -@after { msgs.pop(); } - : KW_COMMENT comment=StringLiteral - -> ^(TOK_DATABASECOMMENT $comment) - ; - -createTableStatement -@init { msgs.push("create table statement"); } -@after { msgs.pop(); } - : KW_CREATE (ext=KW_EXTERNAL)? KW_TABLE ifNotExists? name=tableName - ( like=KW_LIKE likeName=tableName - tableLocation? - tablePropertiesPrefixed? - | (LPAREN columnNameTypeList RPAREN)? - tableComment? - tablePartition? - tableBuckets? - tableSkewed? - tableRowFormat? - tableFileFormat? - tableLocation? - tablePropertiesPrefixed? - (KW_AS selectStatement)? - ) - -> ^(TOK_CREATETABLE $name $ext? ifNotExists? - ^(TOK_LIKETABLE $likeName?) - columnNameTypeList? - tableComment? - tablePartition? - tableBuckets? - tableSkewed? - tableRowFormat? - tableFileFormat? - tableLocation? - tablePropertiesPrefixed? - selectStatement? - ) - ; - -truncateTableStatement -@init { msgs.push("truncate table statement"); } -@after { msgs.pop(); } - : KW_TRUNCATE KW_TABLE tablePartitionPrefix -> ^(TOK_TRUNCATETABLE tablePartitionPrefix); - -createIndexStatement -@init { msgs.push("create index statement");} -@after {msgs.pop();} - : KW_CREATE KW_INDEX indexName=Identifier - KW_ON KW_TABLE tab=tableName LPAREN indexedCols=columnNameList RPAREN - KW_AS typeName=StringLiteral - autoRebuild? - indexPropertiesPrefixed? - indexTblName? - tableRowFormat? - tableFileFormat? - tableLocation? - tablePropertiesPrefixed? - indexComment? - ->^(TOK_CREATEINDEX $indexName $typeName $tab $indexedCols - autoRebuild? - indexPropertiesPrefixed? - indexTblName? - tableRowFormat? - tableFileFormat? - tableLocation? - tablePropertiesPrefixed? - indexComment?) - ; - -indexComment -@init { msgs.push("comment on an index");} -@after {msgs.pop();} - : - KW_COMMENT comment=StringLiteral -> ^(TOK_INDEXCOMMENT $comment) - ; - -autoRebuild -@init { msgs.push("auto rebuild index");} -@after {msgs.pop();} - : KW_WITH KW_DEFERRED KW_REBUILD - ->^(TOK_DEFERRED_REBUILDINDEX) - ; - -indexTblName -@init { msgs.push("index table name");} -@after {msgs.pop();} - : KW_IN KW_TABLE indexTbl=tableName - ->^(TOK_CREATEINDEX_INDEXTBLNAME $indexTbl) - ; - -indexPropertiesPrefixed -@init { msgs.push("table properties with prefix"); } -@after { msgs.pop(); } - : - KW_IDXPROPERTIES! indexProperties - ; - -indexProperties -@init { msgs.push("index properties"); } -@after { msgs.pop(); } - : - LPAREN indexPropertiesList RPAREN -> ^(TOK_INDEXPROPERTIES indexPropertiesList) - ; - -indexPropertiesList -@init { msgs.push("index properties list"); } -@after { msgs.pop(); } - : - keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_INDEXPROPLIST keyValueProperty+) - ; - -dropIndexStatement -@init { msgs.push("drop index statement");} -@after {msgs.pop();} - : KW_DROP KW_INDEX ifExists? indexName=Identifier KW_ON tab=tableName - ->^(TOK_DROPINDEX $indexName $tab ifExists?) - ; - -dropTableStatement -@init { msgs.push("drop statement"); } -@after { msgs.pop(); } - : KW_DROP KW_TABLE ifExists? tableName -> ^(TOK_DROPTABLE tableName ifExists?) - ; - -alterStatement -@init { msgs.push("alter statement"); } -@after { msgs.pop(); } - : KW_ALTER! - ( - KW_TABLE! alterTableStatementSuffix - | - KW_VIEW! alterViewStatementSuffix - | - KW_INDEX! alterIndexStatementSuffix - | - KW_DATABASE! alterDatabaseStatementSuffix - ) - ; - -alterTableStatementSuffix -@init { msgs.push("alter table statement"); } -@after { msgs.pop(); } - : alterStatementSuffixRename - | alterStatementSuffixAddCol - | alterStatementSuffixRenameCol - | alterStatementSuffixDropPartitions - | alterStatementSuffixAddPartitions - | alterStatementSuffixTouch - | alterStatementSuffixArchive - | alterStatementSuffixUnArchive - | alterStatementSuffixProperties - | alterTblPartitionStatement - | alterStatementSuffixSkewedby - ; - -alterViewStatementSuffix -@init { msgs.push("alter view statement"); } -@after { msgs.pop(); } - : alterViewSuffixProperties - | alterStatementSuffixRename - -> ^(TOK_ALTERVIEW_RENAME alterStatementSuffixRename) - | alterStatementSuffixAddPartitions - -> ^(TOK_ALTERVIEW_ADDPARTS alterStatementSuffixAddPartitions) - | alterStatementSuffixDropPartitions - -> ^(TOK_ALTERVIEW_DROPPARTS alterStatementSuffixDropPartitions) - | name=tableName KW_AS selectStatement - -> ^(TOK_ALTERVIEW_AS $name selectStatement) - ; - -alterIndexStatementSuffix -@init { msgs.push("alter index statement"); } -@after { msgs.pop(); } - : indexName=Identifier - (KW_ON tableNameId=Identifier) - partitionSpec? - ( - KW_REBUILD - ->^(TOK_ALTERINDEX_REBUILD $tableNameId $indexName partitionSpec?) - | - KW_SET KW_IDXPROPERTIES - indexProperties - ->^(TOK_ALTERINDEX_PROPERTIES $tableNameId $indexName indexProperties) - ) - ; - -alterDatabaseStatementSuffix -@init { msgs.push("alter database statement"); } -@after { msgs.pop(); } - : alterDatabaseSuffixProperties - ; - -alterDatabaseSuffixProperties -@init { msgs.push("alter database properties statement"); } -@after { msgs.pop(); } - : name=Identifier KW_SET KW_DBPROPERTIES dbProperties - -> ^(TOK_ALTERDATABASE_PROPERTIES $name dbProperties) - ; - -alterStatementSuffixRename -@init { msgs.push("rename statement"); } -@after { msgs.pop(); } - : oldName=Identifier KW_RENAME KW_TO newName=Identifier - -> ^(TOK_ALTERTABLE_RENAME $oldName $newName) - ; - -alterStatementSuffixAddCol -@init { msgs.push("add column statement"); } -@after { msgs.pop(); } - : Identifier (add=KW_ADD | replace=KW_REPLACE) KW_COLUMNS LPAREN columnNameTypeList RPAREN - -> {$add != null}? ^(TOK_ALTERTABLE_ADDCOLS Identifier columnNameTypeList) - -> ^(TOK_ALTERTABLE_REPLACECOLS Identifier columnNameTypeList) - ; - -alterStatementSuffixRenameCol -@init { msgs.push("rename column name"); } -@after { msgs.pop(); } - : Identifier KW_CHANGE KW_COLUMN? oldName=Identifier newName=Identifier colType (KW_COMMENT comment=StringLiteral)? alterStatementChangeColPosition? - ->^(TOK_ALTERTABLE_RENAMECOL Identifier $oldName $newName colType $comment? alterStatementChangeColPosition?) - ; - -alterStatementChangeColPosition - : first=KW_FIRST|KW_AFTER afterCol=Identifier - ->{$first != null}? ^(TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION ) - -> ^(TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION $afterCol) - ; - -alterStatementSuffixAddPartitions -@init { msgs.push("add partition statement"); } -@after { msgs.pop(); } - : Identifier KW_ADD ifNotExists? partitionSpec partitionLocation? (partitionSpec partitionLocation?)* - -> ^(TOK_ALTERTABLE_ADDPARTS Identifier ifNotExists? (partitionSpec partitionLocation?)+) - ; - -alterStatementSuffixTouch -@init { msgs.push("touch statement"); } -@after { msgs.pop(); } - : Identifier KW_TOUCH (partitionSpec)* - -> ^(TOK_ALTERTABLE_TOUCH Identifier (partitionSpec)*) - ; - -alterStatementSuffixArchive -@init { msgs.push("archive statement"); } -@after { msgs.pop(); } - : Identifier KW_ARCHIVE (partitionSpec)* - -> ^(TOK_ALTERTABLE_ARCHIVE Identifier (partitionSpec)*) - ; - -alterStatementSuffixUnArchive -@init { msgs.push("unarchive statement"); } -@after { msgs.pop(); } - : Identifier KW_UNARCHIVE (partitionSpec)* - -> ^(TOK_ALTERTABLE_UNARCHIVE Identifier (partitionSpec)*) - ; - -partitionLocation -@init { msgs.push("partition location"); } -@after { msgs.pop(); } - : - KW_LOCATION locn=StringLiteral -> ^(TOK_PARTITIONLOCATION $locn) - ; - -alterStatementSuffixDropPartitions -@init { msgs.push("drop partition statement"); } -@after { msgs.pop(); } - : Identifier KW_DROP ifExists? dropPartitionSpec (COMMA dropPartitionSpec)* ignoreProtection? - -> ^(TOK_ALTERTABLE_DROPPARTS Identifier dropPartitionSpec+ ifExists? ignoreProtection?) - ; - -alterStatementSuffixProperties -@init { msgs.push("alter properties statement"); } -@after { msgs.pop(); } - : name=Identifier KW_SET KW_TBLPROPERTIES tableProperties - -> ^(TOK_ALTERTABLE_PROPERTIES $name tableProperties) - | name=Identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties - -> ^(TOK_DROPTABLE_PROPERTIES $name tableProperties ifExists?) - ; - -alterViewSuffixProperties -@init { msgs.push("alter view properties statement"); } -@after { msgs.pop(); } - : name=Identifier KW_SET KW_TBLPROPERTIES tableProperties - -> ^(TOK_ALTERVIEW_PROPERTIES $name tableProperties) - | name=Identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties - -> ^(TOK_DROPVIEW_PROPERTIES $name tableProperties ifExists?) - ; - -alterStatementSuffixSerdeProperties -@init { msgs.push("alter serdes statement"); } -@after { msgs.pop(); } - : KW_SET KW_SERDE serdeName=StringLiteral (KW_WITH KW_SERDEPROPERTIES tableProperties)? - -> ^(TOK_ALTERTABLE_SERIALIZER $serdeName tableProperties?) - | KW_SET KW_SERDEPROPERTIES tableProperties - -> ^(TOK_ALTERTABLE_SERDEPROPERTIES tableProperties) - ; - -tablePartitionPrefix -@init {msgs.push("table partition prefix");} -@after {msgs.pop();} - :name=Identifier partitionSpec? - ->^(TOK_TABLE_PARTITION $name partitionSpec?) - ; - -alterTblPartitionStatement -@init {msgs.push("alter table partition statement");} -@after {msgs.pop();} - : tablePartitionPrefix alterTblPartitionStatementSuffix - -> ^(TOK_ALTERTABLE_PARTITION tablePartitionPrefix alterTblPartitionStatementSuffix) - ; - -alterTblPartitionStatementSuffix -@init {msgs.push("alter table partition statement suffix");} -@after {msgs.pop();} - : alterStatementSuffixFileFormat - | alterStatementSuffixLocation - | alterStatementSuffixProtectMode - | alterStatementSuffixMergeFiles - | alterStatementSuffixSerdeProperties - | alterStatementSuffixRenamePart - | alterStatementSuffixBucketNum - | alterTblPartitionStatementSuffixSkewedLocation - | alterStatementSuffixClusterbySortby - ; - -alterStatementSuffixFileFormat -@init {msgs.push("alter fileformat statement"); } -@after {msgs.pop();} - : KW_SET KW_FILEFORMAT fileFormat - -> ^(TOK_ALTERTABLE_FILEFORMAT fileFormat) - ; - -alterStatementSuffixClusterbySortby -@init {msgs.push("alter partition cluster by sort by statement");} -@after {msgs.pop();} - : KW_NOT KW_CLUSTERED -> ^(TOK_ALTERTABLE_CLUSTER_SORT TOK_NOT_CLUSTERED) - | KW_NOT KW_SORTED -> ^(TOK_ALTERTABLE_CLUSTER_SORT TOK_NOT_SORTED) - | tableBuckets -> ^(TOK_ALTERTABLE_CLUSTER_SORT tableBuckets) - ; - -alterTblPartitionStatementSuffixSkewedLocation -@init {msgs.push("alter partition skewed location");} -@after {msgs.pop();} - : KW_SET KW_SKEWED KW_LOCATION skewedLocations - -> ^(TOK_ALTERTBLPART_SKEWED_LOCATION skewedLocations) - ; - -skewedLocations -@init { msgs.push("skewed locations"); } -@after { msgs.pop(); } - : - LPAREN skewedLocationsList RPAREN -> ^(TOK_SKEWED_LOCATIONS skewedLocationsList) - ; - -skewedLocationsList -@init { msgs.push("skewed locations list"); } -@after { msgs.pop(); } - : - skewedLocationMap (COMMA skewedLocationMap)* -> ^(TOK_SKEWED_LOCATION_LIST skewedLocationMap+) - ; - -skewedLocationMap -@init { msgs.push("specifying skewed location map"); } -@after { msgs.pop(); } - : - key=skewedValueLocationElement EQUAL value=StringLiteral -> ^(TOK_SKEWED_LOCATION_MAP $key $value) - ; - -alterStatementSuffixLocation -@init {msgs.push("alter location");} -@after {msgs.pop();} - : KW_SET KW_LOCATION newLoc=StringLiteral - -> ^(TOK_ALTERTABLE_LOCATION $newLoc) - ; - - -alterStatementSuffixSkewedby -@init {msgs.push("alter skewed by statement");} -@after{msgs.pop();} - :name=Identifier tableSkewed - ->^(TOK_ALTERTABLE_SKEWED $name tableSkewed) - | - name=Identifier KW_NOT KW_SKEWED - ->^(TOK_ALTERTABLE_SKEWED $name) - | - name=Identifier KW_NOT storedAsDirs - ->^(TOK_ALTERTABLE_SKEWED $name storedAsDirs) - ; - -alterStatementSuffixProtectMode -@init { msgs.push("alter partition protect mode statement"); } -@after { msgs.pop(); } - : alterProtectMode - -> ^(TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE alterProtectMode) - ; - -alterStatementSuffixRenamePart -@init { msgs.push("alter table rename partition statement"); } -@after { msgs.pop(); } - : KW_RENAME KW_TO partitionSpec - ->^(TOK_ALTERTABLE_RENAMEPART partitionSpec) - ; - -alterStatementSuffixMergeFiles -@init { msgs.push(""); } -@after { msgs.pop(); } - : KW_CONCATENATE - -> ^(TOK_ALTERTABLE_ALTERPARTS_MERGEFILES) - ; - -alterProtectMode -@init { msgs.push("protect mode specification enable"); } -@after { msgs.pop(); } - : KW_ENABLE alterProtectModeMode -> ^(TOK_ENABLE alterProtectModeMode) - | KW_DISABLE alterProtectModeMode -> ^(TOK_DISABLE alterProtectModeMode) - ; - -alterProtectModeMode -@init { msgs.push("protect mode specification enable"); } -@after { msgs.pop(); } - : KW_OFFLINE -> ^(TOK_OFFLINE) - | KW_NO_DROP KW_CASCADE? -> ^(TOK_NO_DROP KW_CASCADE?) - | KW_READONLY -> ^(TOK_READONLY) - ; - -alterStatementSuffixBucketNum -@init { msgs.push(""); } -@after { msgs.pop(); } - : KW_INTO num=Number KW_BUCKETS - -> ^(TOK_TABLEBUCKETS $num) - ; - -fileFormat -@init { msgs.push("file format specification"); } -@after { msgs.pop(); } - : KW_SEQUENCEFILE -> ^(TOK_TBLSEQUENCEFILE) - | KW_TEXTFILE -> ^(TOK_TBLTEXTFILE) - | KW_RCFILE -> ^(TOK_TBLRCFILE) - | KW_INPUTFORMAT inFmt=StringLiteral KW_OUTPUTFORMAT outFmt=StringLiteral (KW_INPUTDRIVER inDriver=StringLiteral KW_OUTPUTDRIVER outDriver=StringLiteral)? - -> ^(TOK_TABLEFILEFORMAT $inFmt $outFmt $inDriver? $outDriver?) - | genericSpec=Identifier -> ^(TOK_FILEFORMAT_GENERIC $genericSpec) - ; - -tabTypeExpr -@init { msgs.push("specifying table types"); } -@after { msgs.pop(); } - - : Identifier (DOT^ (Identifier | KW_ELEM_TYPE | KW_KEY_TYPE | KW_VALUE_TYPE))* - ; - -descTabTypeExpr -@init { msgs.push("specifying describe table types"); } -@after { msgs.pop(); } - - : Identifier (DOT^ (Identifier | KW_ELEM_TYPE | KW_KEY_TYPE | KW_VALUE_TYPE))* Identifier? - ; - -partTypeExpr -@init { msgs.push("specifying table partitions"); } -@after { msgs.pop(); } - : tabTypeExpr partitionSpec? -> ^(TOK_TABTYPE tabTypeExpr partitionSpec?) - ; - -descPartTypeExpr -@init { msgs.push("specifying describe table partitions"); } -@after { msgs.pop(); } - : descTabTypeExpr partitionSpec? -> ^(TOK_TABTYPE descTabTypeExpr partitionSpec?) - ; - -descStatement -@init { msgs.push("describe statement"); } -@after { msgs.pop(); } - : (KW_DESCRIBE|KW_DESC) (descOptions=KW_FORMATTED|descOptions=KW_EXTENDED|descOptions=KW_PRETTY)? (parttype=descPartTypeExpr) -> ^(TOK_DESCTABLE $parttype $descOptions?) - | (KW_DESCRIBE|KW_DESC) KW_FUNCTION KW_EXTENDED? (name=descFuncNames) -> ^(TOK_DESCFUNCTION $name KW_EXTENDED?) - | (KW_DESCRIBE|KW_DESC) KW_DATABASE KW_EXTENDED? (dbName=Identifier) -> ^(TOK_DESCDATABASE $dbName KW_EXTENDED?) - ; - -analyzeStatement -@init { msgs.push("analyze statement"); } -@after { msgs.pop(); } - : KW_ANALYZE KW_TABLE (parttype=tableOrPartition) KW_COMPUTE KW_STATISTICS ((noscan=KW_NOSCAN) | (KW_FOR KW_COLUMNS statsColumnName=columnNameList))? -> ^(TOK_ANALYZE $parttype $noscan? $statsColumnName?) - ; - -showStatement -@init { msgs.push("show statement"); } -@after { msgs.pop(); } - : KW_SHOW (KW_DATABASES|KW_SCHEMAS) (KW_LIKE showStmtIdentifier)? -> ^(TOK_SHOWDATABASES showStmtIdentifier?) - | KW_SHOW KW_TABLES ((KW_FROM|KW_IN) db_name=Identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)? -> ^(TOK_SHOWTABLES (TOK_FROM $db_name)? showStmtIdentifier?) - | KW_SHOW KW_COLUMNS (KW_FROM|KW_IN) tabname=tableName ((KW_FROM|KW_IN) db_name=Identifier)? - -> ^(TOK_SHOWCOLUMNS $db_name? $tabname) - | KW_SHOW KW_FUNCTIONS showStmtIdentifier? -> ^(TOK_SHOWFUNCTIONS showStmtIdentifier?) - | KW_SHOW KW_PARTITIONS Identifier partitionSpec? -> ^(TOK_SHOWPARTITIONS Identifier partitionSpec?) - | KW_SHOW KW_CREATE KW_TABLE tabName=tableName -> ^(TOK_SHOW_CREATETABLE $tabName) - | KW_SHOW KW_TABLE KW_EXTENDED ((KW_FROM|KW_IN) db_name=Identifier)? KW_LIKE showStmtIdentifier partitionSpec? - -> ^(TOK_SHOW_TABLESTATUS showStmtIdentifier $db_name? partitionSpec?) - | KW_SHOW KW_TBLPROPERTIES tblName=Identifier (LPAREN prptyName=StringLiteral RPAREN)? -> ^(TOK_SHOW_TBLPROPERTIES $tblName $prptyName?) - | KW_SHOW KW_LOCKS (parttype=partTypeExpr)? (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype? $isExtended?) - | KW_SHOW (showOptions=KW_FORMATTED)? (KW_INDEX|KW_INDEXES) KW_ON showStmtIdentifier ((KW_FROM|KW_IN) db_name=Identifier)? - -> ^(TOK_SHOWINDEXES showStmtIdentifier $showOptions? $db_name?) - ; - -lockStatement -@init { msgs.push("lock statement"); } -@after { msgs.pop(); } - : KW_LOCK KW_TABLE tableName partitionSpec? lockMode -> ^(TOK_LOCKTABLE tableName lockMode partitionSpec?) - ; - -lockMode -@init { msgs.push("lock mode"); } -@after { msgs.pop(); } - : KW_SHARED | KW_EXCLUSIVE - ; - -unlockStatement -@init { msgs.push("unlock statement"); } -@after { msgs.pop(); } - : KW_UNLOCK KW_TABLE tableName partitionSpec? -> ^(TOK_UNLOCKTABLE tableName partitionSpec?) - ; - -createRoleStatement -@init { msgs.push("create role"); } -@after { msgs.pop(); } - : KW_CREATE kwRole roleName=Identifier - -> ^(TOK_CREATEROLE $roleName) - ; - -dropRoleStatement -@init {msgs.push("drop role");} -@after {msgs.pop();} - : KW_DROP kwRole roleName=Identifier - -> ^(TOK_DROPROLE $roleName) - ; - -grantPrivileges -@init {msgs.push("grant privileges");} -@after {msgs.pop();} - : KW_GRANT privList=privilegeList - privilegeObject? - KW_TO principalSpecification - (KW_WITH withOption)? - -> ^(TOK_GRANT $privList principalSpecification privilegeObject? withOption?) - ; - -revokePrivileges -@init {msgs.push("revoke privileges");} -@afer {msgs.pop();} - : KW_REVOKE privilegeList privilegeObject? KW_FROM principalSpecification - -> ^(TOK_REVOKE privilegeList principalSpecification privilegeObject?) - ; - -grantRole -@init {msgs.push("grant role");} -@after {msgs.pop();} - : KW_GRANT kwRole Identifier (COMMA Identifier)* KW_TO principalSpecification - -> ^(TOK_GRANT_ROLE principalSpecification Identifier+) - ; - -revokeRole -@init {msgs.push("revoke role");} -@after {msgs.pop();} - : KW_REVOKE kwRole Identifier (COMMA Identifier)* KW_FROM principalSpecification - -> ^(TOK_REVOKE_ROLE principalSpecification Identifier+) - ; - -showRoleGrants -@init {msgs.push("show role grants");} -@after {msgs.pop();} - : KW_SHOW kwRole KW_GRANT principalName - -> ^(TOK_SHOW_ROLE_GRANT principalName) - ; - -showGrants -@init {msgs.push("show grants");} -@after {msgs.pop();} - : KW_SHOW KW_GRANT principalName privilegeIncludeColObject? - -> ^(TOK_SHOW_GRANT principalName privilegeIncludeColObject?) - ; - -privilegeIncludeColObject -@init {msgs.push("privilege object including columns");} -@after {msgs.pop();} - : KW_ON (table=KW_TABLE|KW_DATABASE) Identifier (LPAREN cols=columnNameList RPAREN)? partitionSpec? - -> ^(TOK_PRIV_OBJECT_COL Identifier $table? $cols? partitionSpec?) - ; - -privilegeObject -@init {msgs.push("privilege subject");} -@after {msgs.pop();} - : KW_ON (table=KW_TABLE|KW_DATABASE) Identifier partitionSpec? - -> ^(TOK_PRIV_OBJECT Identifier $table? partitionSpec?) - ; - -privilegeList -@init {msgs.push("grant privilege list");} -@after {msgs.pop();} - : privlegeDef (COMMA privlegeDef)* - -> ^(TOK_PRIVILEGE_LIST privlegeDef+) - ; - -privlegeDef -@init {msgs.push("grant privilege");} -@after {msgs.pop();} - : privilegeType (LPAREN cols=columnNameList RPAREN)? - -> ^(TOK_PRIVILEGE privilegeType $cols?) - ; - -privilegeType -@init {msgs.push("privilege type");} -@after {msgs.pop();} - : KW_ALL -> ^(TOK_PRIV_ALL) - | KW_ALTER -> ^(TOK_PRIV_ALTER_METADATA) - | KW_UPDATE -> ^(TOK_PRIV_ALTER_DATA) - | KW_CREATE -> ^(TOK_PRIV_CREATE) - | KW_DROP -> ^(TOK_PRIV_DROP) - | KW_INDEX -> ^(TOK_PRIV_INDEX) - | KW_LOCK -> ^(TOK_PRIV_LOCK) - | KW_SELECT -> ^(TOK_PRIV_SELECT) - | KW_SHOW_DATABASE -> ^(TOK_PRIV_SHOW_DATABASE) - ; - -principalSpecification -@init { msgs.push("user/group/role name list"); } -@after { msgs.pop(); } - : principalName (COMMA principalName)* -> ^(TOK_PRINCIPAL_NAME principalName+) - ; - -principalName -@init {msgs.push("user|group|role name");} -@after {msgs.pop();} - : kwUser Identifier -> ^(TOK_USER Identifier) - | KW_GROUP Identifier -> ^(TOK_GROUP Identifier) - | kwRole Identifier -> ^(TOK_ROLE Identifier) - ; - -withOption -@init {msgs.push("grant with option");} -@after {msgs.pop();} - : KW_GRANT KW_OPTION - -> ^(TOK_GRANT_WITH_OPTION) - ; - -metastoreCheck -@init { msgs.push("metastore check statement"); } -@after { msgs.pop(); } - : KW_MSCK (repair=KW_REPAIR)? (KW_TABLE table=Identifier partitionSpec? (COMMA partitionSpec)*)? - -> ^(TOK_MSCK $repair? ($table partitionSpec*)?) - ; - -createFunctionStatement -@init { msgs.push("create function statement"); } -@after { msgs.pop(); } - : KW_CREATE KW_TEMPORARY KW_FUNCTION Identifier KW_AS StringLiteral - -> ^(TOK_CREATEFUNCTION Identifier StringLiteral) - ; - -dropFunctionStatement -@init { msgs.push("drop temporary function statement"); } -@after { msgs.pop(); } - : KW_DROP KW_TEMPORARY KW_FUNCTION ifExists? Identifier - -> ^(TOK_DROPFUNCTION Identifier ifExists?) - ; - -createViewStatement -@init { - msgs.push("create view statement"); -} -@after { msgs.pop(); } - : KW_CREATE (orReplace)? KW_VIEW (ifNotExists)? name=tableName - (LPAREN columnNameCommentList RPAREN)? tableComment? viewPartition? - tablePropertiesPrefixed? - KW_AS - selectStatement - -> ^(TOK_CREATEVIEW $name orReplace? - ifNotExists? - columnNameCommentList? - tableComment? - viewPartition? - tablePropertiesPrefixed? - selectStatement - ) - ; - -viewPartition -@init { msgs.push("view partition specification"); } -@after { msgs.pop(); } - : KW_PARTITIONED KW_ON LPAREN columnNameList RPAREN - -> ^(TOK_VIEWPARTCOLS columnNameList) - ; - -dropViewStatement -@init { msgs.push("drop view statement"); } -@after { msgs.pop(); } - : KW_DROP KW_VIEW ifExists? viewName -> ^(TOK_DROPVIEW viewName ifExists?) - ; - -showStmtIdentifier -@init { msgs.push("Identifier for show statement"); } -@after { msgs.pop(); } - : Identifier - | StringLiteral - ; - -tableComment -@init { msgs.push("table's comment"); } -@after { msgs.pop(); } - : - KW_COMMENT comment=StringLiteral -> ^(TOK_TABLECOMMENT $comment) - ; - -tablePartition -@init { msgs.push("table partition specification"); } -@after { msgs.pop(); } - : KW_PARTITIONED KW_BY LPAREN columnNameTypeList RPAREN - -> ^(TOK_TABLEPARTCOLS columnNameTypeList) - ; - -tableBuckets -@init { msgs.push("table buckets specification"); } -@after { msgs.pop(); } - : - KW_CLUSTERED KW_BY LPAREN bucketCols=columnNameList RPAREN (KW_SORTED KW_BY LPAREN sortCols=columnNameOrderList RPAREN)? KW_INTO num=Number KW_BUCKETS - -> ^(TOK_TABLEBUCKETS $bucketCols $sortCols? $num) - ; - -tableSkewed -@init { msgs.push("table skewed specification"); } -@after { msgs.pop(); } - : - KW_SKEWED KW_BY LPAREN skewedCols=columnNameList RPAREN KW_ON LPAREN (skewedValues=skewedValueElement) RPAREN (storedAsDirs)? - -> ^(TOK_TABLESKEWED $skewedCols $skewedValues storedAsDirs?) - ; - -rowFormat -@init { msgs.push("serde specification"); } -@after { msgs.pop(); } - : rowFormatSerde -> ^(TOK_SERDE rowFormatSerde) - | rowFormatDelimited -> ^(TOK_SERDE rowFormatDelimited) - | -> ^(TOK_SERDE) - ; - -recordReader -@init { msgs.push("record reader specification"); } -@after { msgs.pop(); } - : KW_RECORDREADER StringLiteral -> ^(TOK_RECORDREADER StringLiteral) - | -> ^(TOK_RECORDREADER) - ; - -recordWriter -@init { msgs.push("record writer specification"); } -@after { msgs.pop(); } - : KW_RECORDWRITER StringLiteral -> ^(TOK_RECORDWRITER StringLiteral) - | -> ^(TOK_RECORDWRITER) - ; - -rowFormatSerde -@init { msgs.push("serde format specification"); } -@after { msgs.pop(); } - : KW_ROW KW_FORMAT KW_SERDE name=StringLiteral (KW_WITH KW_SERDEPROPERTIES serdeprops=tableProperties)? - -> ^(TOK_SERDENAME $name $serdeprops?) - ; - -rowFormatDelimited -@init { msgs.push("serde properties specification"); } -@after { msgs.pop(); } - : - KW_ROW KW_FORMAT KW_DELIMITED tableRowFormatFieldIdentifier? tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? tableRowFormatLinesIdentifier? - -> ^(TOK_SERDEPROPS tableRowFormatFieldIdentifier? tableRowFormatCollItemsIdentifier? tableRowFormatMapKeysIdentifier? tableRowFormatLinesIdentifier?) - ; - -tableRowFormat -@init { msgs.push("table row format specification"); } -@after { msgs.pop(); } - : - rowFormatDelimited - -> ^(TOK_TABLEROWFORMAT rowFormatDelimited) - | rowFormatSerde - -> ^(TOK_TABLESERIALIZER rowFormatSerde) - ; - -tablePropertiesPrefixed -@init { msgs.push("table properties with prefix"); } -@after { msgs.pop(); } - : - KW_TBLPROPERTIES! tableProperties - ; - -tableProperties -@init { msgs.push("table properties"); } -@after { msgs.pop(); } - : - LPAREN tablePropertiesList RPAREN -> ^(TOK_TABLEPROPERTIES tablePropertiesList) - ; - -tablePropertiesList -@init { msgs.push("table properties list"); } -@after { msgs.pop(); } - : - keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_TABLEPROPLIST keyValueProperty+) - | - keyProperty (COMMA keyProperty)* -> ^(TOK_TABLEPROPLIST keyProperty+) - ; - -keyValueProperty -@init { msgs.push("specifying key/value property"); } -@after { msgs.pop(); } - : - key=StringLiteral EQUAL value=StringLiteral -> ^(TOK_TABLEPROPERTY $key $value) - ; - -keyProperty -@init { msgs.push("specifying key property"); } -@after { msgs.pop(); } - : - key=StringLiteral -> ^(TOK_TABLEPROPERTY $key TOK_NULL) - ; - -tableRowFormatFieldIdentifier -@init { msgs.push("table row format's field separator"); } -@after { msgs.pop(); } - : - KW_FIELDS KW_TERMINATED KW_BY fldIdnt=StringLiteral (KW_ESCAPED KW_BY fldEscape=StringLiteral)? - -> ^(TOK_TABLEROWFORMATFIELD $fldIdnt $fldEscape?) - ; - -tableRowFormatCollItemsIdentifier -@init { msgs.push("table row format's column separator"); } -@after { msgs.pop(); } - : - KW_COLLECTION KW_ITEMS KW_TERMINATED KW_BY collIdnt=StringLiteral - -> ^(TOK_TABLEROWFORMATCOLLITEMS $collIdnt) - ; - -tableRowFormatMapKeysIdentifier -@init { msgs.push("table row format's map key separator"); } -@after { msgs.pop(); } - : - KW_MAP KW_KEYS KW_TERMINATED KW_BY mapKeysIdnt=StringLiteral - -> ^(TOK_TABLEROWFORMATMAPKEYS $mapKeysIdnt) - ; - -tableRowFormatLinesIdentifier -@init { msgs.push("table row format's line separator"); } -@after { msgs.pop(); } - : - KW_LINES KW_TERMINATED KW_BY linesIdnt=StringLiteral - -> ^(TOK_TABLEROWFORMATLINES $linesIdnt) - ; - -tableFileFormat -@init { msgs.push("table file format specification"); } -@after { msgs.pop(); } - : - KW_STORED KW_AS KW_SEQUENCEFILE -> TOK_TBLSEQUENCEFILE - | KW_STORED KW_AS KW_TEXTFILE -> TOK_TBLTEXTFILE - | KW_STORED KW_AS KW_RCFILE -> TOK_TBLRCFILE - | KW_STORED KW_AS KW_INPUTFORMAT inFmt=StringLiteral KW_OUTPUTFORMAT outFmt=StringLiteral (KW_INPUTDRIVER inDriver=StringLiteral KW_OUTPUTDRIVER outDriver=StringLiteral)? - -> ^(TOK_TABLEFILEFORMAT $inFmt $outFmt $inDriver? $outDriver?) - | KW_STORED KW_BY storageHandler=StringLiteral - (KW_WITH KW_SERDEPROPERTIES serdeprops=tableProperties)? - -> ^(TOK_STORAGEHANDLER $storageHandler $serdeprops?) - | KW_STORED KW_AS genericSpec=Identifier - -> ^(TOK_FILEFORMAT_GENERIC $genericSpec) - ; - -tableLocation -@init { msgs.push("table location specification"); } -@after { msgs.pop(); } - : - KW_LOCATION locn=StringLiteral -> ^(TOK_TABLELOCATION $locn) - ; - -columnNameTypeList -@init { msgs.push("column name type list"); } -@after { msgs.pop(); } - : columnNameType (COMMA columnNameType)* -> ^(TOK_TABCOLLIST columnNameType+) - ; - -columnNameColonTypeList -@init { msgs.push("column name type list"); } -@after { msgs.pop(); } - : columnNameColonType (COMMA columnNameColonType)* -> ^(TOK_TABCOLLIST columnNameColonType+) - ; - -columnNameList -@init { msgs.push("column name list"); } -@after { msgs.pop(); } - : columnName (COMMA columnName)* -> ^(TOK_TABCOLNAME columnName+) - ; - -columnName -@init { msgs.push("column name"); } -@after { msgs.pop(); } - : - Identifier - ; - -columnNameOrderList -@init { msgs.push("column name order list"); } -@after { msgs.pop(); } - : columnNameOrder (COMMA columnNameOrder)* -> ^(TOK_TABCOLNAME columnNameOrder+) - ; - -skewedValueElement -@init { msgs.push("skewed value element"); } -@after { msgs.pop(); } - : - skewedColumnValues - | skewedColumnValuePairList - ; - -skewedColumnValuePairList -@init { msgs.push("column value pair list"); } -@after { msgs.pop(); } - : skewedColumnValuePair (COMMA skewedColumnValuePair)* -> ^(TOK_TABCOLVALUE_PAIR skewedColumnValuePair+) - ; - -skewedColumnValuePair -@init { msgs.push("column value pair"); } -@after { msgs.pop(); } - : - LPAREN colValues=skewedColumnValues RPAREN - -> ^(TOK_TABCOLVALUES $colValues) - ; - -skewedColumnValues -@init { msgs.push("column values"); } -@after { msgs.pop(); } - : skewedColumnValue (COMMA skewedColumnValue)* -> ^(TOK_TABCOLVALUE skewedColumnValue+) - ; - -skewedColumnValue -@init { msgs.push("column value"); } -@after { msgs.pop(); } - : - constant - ; - -skewedValueLocationElement -@init { msgs.push("skewed value location element"); } -@after { msgs.pop(); } - : - skewedColumnValue - | skewedColumnValuePair - ; - -columnNameOrder -@init { msgs.push("column name order"); } -@after { msgs.pop(); } - : Identifier (asc=KW_ASC | desc=KW_DESC)? - -> {$desc == null}? ^(TOK_TABSORTCOLNAMEASC Identifier) - -> ^(TOK_TABSORTCOLNAMEDESC Identifier) - ; - -columnNameCommentList -@init { msgs.push("column name comment list"); } -@after { msgs.pop(); } - : columnNameComment (COMMA columnNameComment)* -> ^(TOK_TABCOLNAME columnNameComment+) - ; - -columnNameComment -@init { msgs.push("column name comment"); } -@after { msgs.pop(); } - : colName=Identifier (KW_COMMENT comment=StringLiteral)? - -> ^(TOK_TABCOL $colName TOK_NULL $comment?) - ; - -columnRefOrder -@init { msgs.push("column order"); } -@after { msgs.pop(); } - : expression (asc=KW_ASC | desc=KW_DESC)? - -> {$desc == null}? ^(TOK_TABSORTCOLNAMEASC expression) - -> ^(TOK_TABSORTCOLNAMEDESC expression) - ; - -columnNameType -@init { msgs.push("column specification"); } -@after { msgs.pop(); } - : colName=Identifier colType (KW_COMMENT comment=StringLiteral)? - -> {$comment == null}? ^(TOK_TABCOL $colName colType) - -> ^(TOK_TABCOL $colName colType $comment) - ; - -columnNameColonType -@init { msgs.push("column specification"); } -@after { msgs.pop(); } - : colName=Identifier COLON colType (KW_COMMENT comment=StringLiteral)? - -> {$comment == null}? ^(TOK_TABCOL $colName colType) - -> ^(TOK_TABCOL $colName colType $comment) - ; - -colType -@init { msgs.push("column type"); } -@after { msgs.pop(); } - : type - ; - -colTypeList -@init { msgs.push("column type list"); } -@after { msgs.pop(); } - : colType (COMMA colType)* -> ^(TOK_COLTYPELIST colType+) - ; - -type - : primitiveType - | listType - | structType - | mapType - | unionType; - -primitiveType -@init { msgs.push("primitive type specification"); } -@after { msgs.pop(); } - : KW_TINYINT -> TOK_TINYINT - | KW_SMALLINT -> TOK_SMALLINT - | KW_INT -> TOK_INT - | KW_BIGINT -> TOK_BIGINT - | KW_BOOLEAN -> TOK_BOOLEAN - | KW_FLOAT -> TOK_FLOAT - | KW_DOUBLE -> TOK_DOUBLE - | KW_DATE -> TOK_DATE - | KW_DATETIME -> TOK_DATETIME - | KW_TIMESTAMP -> TOK_TIMESTAMP - | KW_STRING -> TOK_STRING - | KW_BINARY -> TOK_BINARY - | KW_DECIMAL -> TOK_DECIMAL - ; - -listType -@init { msgs.push("list type"); } -@after { msgs.pop(); } - : KW_ARRAY LESSTHAN type GREATERTHAN -> ^(TOK_LIST type) - ; - -structType -@init { msgs.push("struct type"); } -@after { msgs.pop(); } - : KW_STRUCT LESSTHAN columnNameColonTypeList GREATERTHAN -> ^(TOK_STRUCT columnNameColonTypeList) - ; - -mapType -@init { msgs.push("map type"); } -@after { msgs.pop(); } - : KW_MAP LESSTHAN left=primitiveType COMMA right=type GREATERTHAN - -> ^(TOK_MAP $left $right) - ; - -unionType -@init { msgs.push("uniontype type"); } -@after { msgs.pop(); } - : KW_UNIONTYPE LESSTHAN colTypeList GREATERTHAN -> ^(TOK_UNIONTYPE colTypeList) - ; - -queryOperator -@init { msgs.push("query operator"); } -@after { msgs.pop(); } - : KW_UNION KW_ALL -> ^(TOK_UNION) - ; - -// select statement select ... from ... where ... group by ... order by ... -queryStatementExpression - : queryStatement (queryOperator^ queryStatement)* - ; - -queryStatement - : - fromClause - ( b+=body )+ -> ^(TOK_QUERY fromClause body+) - | regular_body - ; - -regular_body - : - insertClause - selectClause - fromClause - whereClause? - groupByClause? - havingClause? - orderByClause? - clusterByClause? - distributeByClause? - sortByClause? - limitClause? -> ^(TOK_QUERY fromClause ^(TOK_INSERT insertClause - selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? - distributeByClause? sortByClause? limitClause?)) - | - selectStatement - ; - -selectStatement - : - selectClause - fromClause - whereClause? - groupByClause? - havingClause? - orderByClause? - clusterByClause? - distributeByClause? - sortByClause? - limitClause? -> ^(TOK_QUERY fromClause ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE)) - selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? - distributeByClause? sortByClause? limitClause?)) - ; - - -body - : - insertClause - selectClause - whereClause? - groupByClause? - havingClause? - orderByClause? - clusterByClause? - distributeByClause? - sortByClause? - limitClause? -> ^(TOK_INSERT insertClause? - selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? - distributeByClause? sortByClause? limitClause?) - | - selectClause - whereClause? - groupByClause? - havingClause? - orderByClause? - clusterByClause? - distributeByClause? - sortByClause? - limitClause? -> ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE)) - selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause? - distributeByClause? sortByClause? limitClause?) - ; - -insertClause -@init { msgs.push("insert clause"); } -@after { msgs.pop(); } - : - KW_INSERT KW_OVERWRITE destination ifNotExists? -> ^(TOK_DESTINATION destination ifNotExists?) - | KW_INSERT KW_INTO KW_TABLE tableOrPartition - -> ^(TOK_INSERT_INTO tableOrPartition) - ; - -destination -@init { msgs.push("destination specification"); } -@after { msgs.pop(); } - : - KW_LOCAL KW_DIRECTORY StringLiteral -> ^(TOK_LOCAL_DIR StringLiteral) - | KW_DIRECTORY StringLiteral -> ^(TOK_DIR StringLiteral) - | KW_TABLE tableOrPartition -> tableOrPartition - ; - -limitClause -@init { msgs.push("limit clause"); } -@after { msgs.pop(); } - : - KW_LIMIT num=Number -> ^(TOK_LIMIT $num) - ; - -//----------------------- Rules for parsing selectClause ----------------------------- -// select a,b,c ... -selectClause -@init { msgs.push("select clause"); } -@after { msgs.pop(); } - : - KW_SELECT hintClause? (((KW_ALL | dist=KW_DISTINCT)? selectList) - | (transform=KW_TRANSFORM selectTrfmClause)) - -> {$transform == null && $dist == null}? ^(TOK_SELECT hintClause? selectList) - -> {$transform == null && $dist != null}? ^(TOK_SELECTDI hintClause? selectList) - -> ^(TOK_SELECT hintClause? ^(TOK_SELEXPR selectTrfmClause) ) - | - trfmClause ->^(TOK_SELECT ^(TOK_SELEXPR trfmClause)) - ; - -selectList -@init { msgs.push("select list"); } -@after { msgs.pop(); } - : - selectItem ( COMMA selectItem )* -> selectItem+ - ; - -selectTrfmClause -@init { msgs.push("transform clause"); } -@after { msgs.pop(); } - : - LPAREN selectExpressionList RPAREN - inSerde=rowFormat inRec=recordWriter - KW_USING StringLiteral - ( KW_AS ((LPAREN (aliasList | columnNameTypeList) RPAREN) | (aliasList | columnNameTypeList)))? - outSerde=rowFormat outRec=recordReader - -> ^(TOK_TRANSFORM selectExpressionList $inSerde $inRec StringLiteral $outSerde $outRec aliasList? columnNameTypeList?) - ; - -hintClause -@init { msgs.push("hint clause"); } -@after { msgs.pop(); } - : - DIVIDE STAR PLUS hintList STAR DIVIDE -> ^(TOK_HINTLIST hintList) - ; - -hintList -@init { msgs.push("hint list"); } -@after { msgs.pop(); } - : - hintItem (COMMA hintItem)* -> hintItem+ - ; - -hintItem -@init { msgs.push("hint item"); } -@after { msgs.pop(); } - : - hintName (LPAREN hintArgs RPAREN)? -> ^(TOK_HINT hintName hintArgs?) - ; - -hintName -@init { msgs.push("hint name"); } -@after { msgs.pop(); } - : - KW_MAPJOIN -> TOK_MAPJOIN - | KW_STREAMTABLE -> TOK_STREAMTABLE - | KW_HOLD_DDLTIME -> TOK_HOLD_DDLTIME - ; - -hintArgs -@init { msgs.push("hint arguments"); } -@after { msgs.pop(); } - : - hintArgName (COMMA hintArgName)* -> ^(TOK_HINTARGLIST hintArgName+) - ; - -hintArgName -@init { msgs.push("hint argument name"); } -@after { msgs.pop(); } - : - Identifier - ; - -selectItem -@init { msgs.push("selection target"); } -@after { msgs.pop(); } - : - ( selectExpression ((KW_AS? Identifier) | (KW_AS LPAREN Identifier (COMMA Identifier)* RPAREN))?) -> ^(TOK_SELEXPR selectExpression Identifier*) - ; - -trfmClause -@init { msgs.push("transform clause"); } -@after { msgs.pop(); } - : - ( KW_MAP selectExpressionList - | KW_REDUCE selectExpressionList ) - inSerde=rowFormat inRec=recordWriter - KW_USING StringLiteral - ( KW_AS ((LPAREN (aliasList | columnNameTypeList) RPAREN) | (aliasList | columnNameTypeList)))? - outSerde=rowFormat outRec=recordReader - -> ^(TOK_TRANSFORM selectExpressionList $inSerde $inRec StringLiteral $outSerde $outRec aliasList? columnNameTypeList?) - ; - -selectExpression -@init { msgs.push("select expression"); } -@after { msgs.pop(); } - : - expression | tableAllColumns - ; - -selectExpressionList -@init { msgs.push("select expression list"); } -@after { msgs.pop(); } - : - selectExpression (COMMA selectExpression)* -> ^(TOK_EXPLIST selectExpression+) - ; - - -//----------------------------------------------------------------------------------- - -tableAllColumns - : STAR - -> ^(TOK_ALLCOLREF) - | tableName DOT STAR - -> ^(TOK_ALLCOLREF tableName) - ; - -// (table|column) -tableOrColumn -@init { msgs.push("table or column identifier"); } -@after { msgs.pop(); } - : - Identifier -> ^(TOK_TABLE_OR_COL Identifier) - ; - -expressionList -@init { msgs.push("expression list"); } -@after { msgs.pop(); } - : - expression (COMMA expression)* -> ^(TOK_EXPLIST expression+) - ; - -aliasList -@init { msgs.push("alias list"); } -@after { msgs.pop(); } - : - Identifier (COMMA Identifier)* -> ^(TOK_ALIASLIST Identifier+) - ; - -//----------------------- Rules for parsing fromClause ------------------------------ -// from [col1, col2, col3] table1, [col4, col5] table2 -fromClause -@init { msgs.push("from clause"); } -@after { msgs.pop(); } - : - KW_FROM joinSource -> ^(TOK_FROM joinSource) - ; - -joinSource -@init { msgs.push("join source"); } -@after { msgs.pop(); } - : fromSource ( joinToken^ fromSource (KW_ON! expression)? )* - | uniqueJoinToken^ uniqueJoinSource (COMMA! uniqueJoinSource)+ - ; - -uniqueJoinSource -@init { msgs.push("join source"); } -@after { msgs.pop(); } - : KW_PRESERVE? fromSource uniqueJoinExpr - ; - -uniqueJoinExpr -@init { msgs.push("unique join expression list"); } -@after { msgs.pop(); } - : LPAREN e1+=expression (COMMA e1+=expression)* RPAREN - -> ^(TOK_EXPLIST $e1*) - ; - -uniqueJoinToken -@init { msgs.push("unique join"); } -@after { msgs.pop(); } - : KW_UNIQUEJOIN -> TOK_UNIQUEJOIN; - -joinToken -@init { msgs.push("join type specifier"); } -@after { msgs.pop(); } - : - KW_JOIN -> TOK_JOIN - | kwInner KW_JOIN -> TOK_JOIN - | KW_CROSS KW_JOIN -> TOK_CROSSJOIN - | KW_LEFT KW_OUTER KW_JOIN -> TOK_LEFTOUTERJOIN - | KW_RIGHT KW_OUTER KW_JOIN -> TOK_RIGHTOUTERJOIN - | KW_FULL KW_OUTER KW_JOIN -> TOK_FULLOUTERJOIN - | KW_LEFT KW_SEMI KW_JOIN -> TOK_LEFTSEMIJOIN - ; - -lateralView -@init {msgs.push("lateral view"); } -@after {msgs.pop(); } - : - KW_LATERAL KW_VIEW function tableAlias KW_AS Identifier (COMMA Identifier)* -> ^(TOK_LATERAL_VIEW ^(TOK_SELECT ^(TOK_SELEXPR function Identifier+ tableAlias))) - ; - -tableAlias -@init {msgs.push("table alias"); } -@after {msgs.pop(); } - : - Identifier -> ^(TOK_TABALIAS Identifier) - ; - -fromSource -@init { msgs.push("from source"); } -@after { msgs.pop(); } - : - (tableSource | subQuerySource) (lateralView^)* - ; - -tableBucketSample -@init { msgs.push("table bucket sample specification"); } -@after { msgs.pop(); } - : - KW_TABLESAMPLE LPAREN KW_BUCKET (numerator=Number) KW_OUT KW_OF (denominator=Number) (KW_ON expr+=expression (COMMA expr+=expression)*)? RPAREN -> ^(TOK_TABLEBUCKETSAMPLE $numerator $denominator $expr*) - ; - -splitSample -@init { msgs.push("table split sample specification"); } -@after { msgs.pop(); } - : - KW_TABLESAMPLE LPAREN (numerator=Number) (percent=KW_PERCENT|KW_ROWS) RPAREN - -> {percent != null}? ^(TOK_TABLESPLITSAMPLE TOK_PERCENT $numerator) - -> ^(TOK_TABLESPLITSAMPLE TOK_ROWCOUNT $numerator) - | - KW_TABLESAMPLE LPAREN (numerator=ByteLengthLiteral) RPAREN - -> ^(TOK_TABLESPLITSAMPLE TOK_LENGTH $numerator) - ; - -tableSample -@init { msgs.push("table sample specification"); } -@after { msgs.pop(); } - : - tableBucketSample | - splitSample - ; - -tableSource -@init { msgs.push("table source"); } -@after { msgs.pop(); } - : tabname=tableName (ts=tableSample)? (alias=Identifier)? - -> ^(TOK_TABREF $tabname $ts? $alias?) - ; - -tableName -@init { msgs.push("table name"); } -@after { msgs.pop(); } - : - db=Identifier DOT tab=Identifier - -> ^(TOK_TABNAME $db $tab) - | - tab=Identifier - -> ^(TOK_TABNAME $tab) - ; - -viewName -@init { msgs.push("view name"); } -@after { msgs.pop(); } - : - (db=Identifier DOT)? view=Identifier - -> ^(TOK_TABNAME $db? $view) - ; - -subQuerySource -@init { msgs.push("subquery source"); } -@after { msgs.pop(); } - : - LPAREN queryStatementExpression RPAREN Identifier -> ^(TOK_SUBQUERY queryStatementExpression Identifier) - ; - -//----------------------- Rules for parsing whereClause ----------------------------- -// where a=b and ... -whereClause -@init { msgs.push("where clause"); } -@after { msgs.pop(); } - : - KW_WHERE searchCondition -> ^(TOK_WHERE searchCondition) - ; - -searchCondition -@init { msgs.push("search condition"); } -@after { msgs.pop(); } - : - expression - ; - -//----------------------------------------------------------------------------------- - -// group by a,b -groupByClause -@init { msgs.push("group by clause"); } -@after { msgs.pop(); } - : - KW_GROUP KW_BY - groupByExpression - ( COMMA groupByExpression )* - ((rollup=KW_WITH KW_ROLLUP) | (cube=KW_WITH KW_CUBE)) ? - (sets=KW_GROUPING KW_SETS - LPAREN groupingSetExpression ( COMMA groupingSetExpression)* RPAREN ) ? - -> {rollup != null}? ^(TOK_ROLLUP_GROUPBY groupByExpression+) - -> {cube != null}? ^(TOK_CUBE_GROUPBY groupByExpression+) - -> {sets != null}? ^(TOK_GROUPING_SETS groupByExpression+ groupingSetExpression+) - -> ^(TOK_GROUPBY groupByExpression+) - ; - -groupingSetExpression -@init {msgs.push("grouping set expression"); } -@after {msgs.pop(); } - : - groupByExpression - -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression) - | - LPAREN - groupByExpression (COMMA groupByExpression)* - RPAREN - -> ^(TOK_GROUPING_SETS_EXPRESSION groupByExpression+) - | - LPAREN - RPAREN - -> ^(TOK_GROUPING_SETS_EXPRESSION) - ; - - -groupByExpression -@init { msgs.push("group by expression"); } -@after { msgs.pop(); } - : - expression - ; - -havingClause -@init { msgs.push("having clause"); } -@after { msgs.pop(); } - : - KW_HAVING havingCondition -> ^(TOK_HAVING havingCondition) - ; - -havingCondition -@init { msgs.push("having condition"); } -@after { msgs.pop(); } - : - expression - ; - -// order by a,b -orderByClause -@init { msgs.push("order by clause"); } -@after { msgs.pop(); } - : - KW_ORDER KW_BY - LPAREN columnRefOrder - ( COMMA columnRefOrder)* RPAREN -> ^(TOK_ORDERBY columnRefOrder+) - | - KW_ORDER KW_BY - columnRefOrder - ( COMMA columnRefOrder)* -> ^(TOK_ORDERBY columnRefOrder+) - ; - -clusterByClause -@init { msgs.push("cluster by clause"); } -@after { msgs.pop(); } - : - KW_CLUSTER KW_BY - LPAREN expression (COMMA expression)* RPAREN -> ^(TOK_CLUSTERBY expression+) - | - KW_CLUSTER KW_BY - expression - ( COMMA expression )* -> ^(TOK_CLUSTERBY expression+) - ; - -distributeByClause -@init { msgs.push("distribute by clause"); } -@after { msgs.pop(); } - : - KW_DISTRIBUTE KW_BY - LPAREN expression (COMMA expression)* RPAREN -> ^(TOK_DISTRIBUTEBY expression+) - | - KW_DISTRIBUTE KW_BY - expression (COMMA expression)* -> ^(TOK_DISTRIBUTEBY expression+) - ; - -sortByClause -@init { msgs.push("sort by clause"); } -@after { msgs.pop(); } - : - KW_SORT KW_BY - LPAREN columnRefOrder - ( COMMA columnRefOrder)* RPAREN -> ^(TOK_SORTBY columnRefOrder+) - | - KW_SORT KW_BY - columnRefOrder - ( COMMA columnRefOrder)* -> ^(TOK_SORTBY columnRefOrder+) - ; - -// fun(par1, par2, par3) -function -@init { msgs.push("function specification"); } -@after { msgs.pop(); } - : - functionName - LPAREN - ( - (star=STAR) - | (dist=KW_DISTINCT)? (expression (COMMA expression)*)? - ) - RPAREN -> {$star != null}? ^(TOK_FUNCTIONSTAR functionName) - -> {$dist == null}? ^(TOK_FUNCTION functionName (expression+)?) - -> ^(TOK_FUNCTIONDI functionName (expression+)?) - ; - -functionName -@init { msgs.push("function name"); } -@after { msgs.pop(); } - : // Keyword IF is also a function name - Identifier | KW_IF | KW_ARRAY | KW_MAP | KW_STRUCT | KW_UNIONTYPE - ; - -castExpression -@init { msgs.push("cast expression"); } -@after { msgs.pop(); } - : - KW_CAST - LPAREN - expression - KW_AS - primitiveType - RPAREN -> ^(TOK_FUNCTION primitiveType expression) - ; - -caseExpression -@init { msgs.push("case expression"); } -@after { msgs.pop(); } - : - KW_CASE expression - (KW_WHEN expression KW_THEN expression)+ - (KW_ELSE expression)? - KW_END -> ^(TOK_FUNCTION KW_CASE expression*) - ; - -whenExpression -@init { msgs.push("case expression"); } -@after { msgs.pop(); } - : - KW_CASE - ( KW_WHEN expression KW_THEN expression)+ - (KW_ELSE expression)? - KW_END -> ^(TOK_FUNCTION KW_WHEN expression*) - ; - -constant -@init { msgs.push("constant"); } -@after { msgs.pop(); } - : - Number - | StringLiteral - | stringLiteralSequence - | BigintLiteral - | SmallintLiteral - | TinyintLiteral - | charSetStringLiteral - | booleanValue - ; - -stringLiteralSequence - : - StringLiteral StringLiteral+ -> ^(TOK_STRINGLITERALSEQUENCE StringLiteral StringLiteral+) - ; - -charSetStringLiteral -@init { msgs.push("character string literal"); } -@after { msgs.pop(); } - : - csName=CharSetName csLiteral=CharSetLiteral -> ^(TOK_CHARSETLITERAL $csName $csLiteral) - ; - -expression -@init { msgs.push("expression specification"); } -@after { msgs.pop(); } - : - precedenceOrExpression - ; - -atomExpression - : - KW_NULL -> TOK_NULL - | constant - | function - | castExpression - | caseExpression - | whenExpression - | tableOrColumn - | LPAREN! expression RPAREN! - ; - - -precedenceFieldExpression - : - atomExpression ((LSQUARE^ expression RSQUARE!) | (DOT^ Identifier))* - ; - -precedenceUnaryOperator - : - PLUS | MINUS | TILDE - ; - -nullCondition - : - KW_NULL -> ^(TOK_ISNULL) - | KW_NOT KW_NULL -> ^(TOK_ISNOTNULL) - ; - -precedenceUnaryPrefixExpression - : - (precedenceUnaryOperator^)* precedenceFieldExpression - ; - -precedenceUnarySuffixExpression - : precedenceUnaryPrefixExpression (a=KW_IS nullCondition)? - -> {$a != null}? ^(TOK_FUNCTION nullCondition precedenceUnaryPrefixExpression) - -> precedenceUnaryPrefixExpression - ; - - -precedenceBitwiseXorOperator - : - BITWISEXOR - ; - -precedenceBitwiseXorExpression - : - precedenceUnarySuffixExpression (precedenceBitwiseXorOperator^ precedenceUnarySuffixExpression)* - ; - - -precedenceStarOperator - : - STAR | DIVIDE | MOD | DIV - ; - -precedenceStarExpression - : - precedenceBitwiseXorExpression (precedenceStarOperator^ precedenceBitwiseXorExpression)* - ; - - -precedencePlusOperator - : - PLUS | MINUS - ; - -precedencePlusExpression - : - precedenceStarExpression (precedencePlusOperator^ precedenceStarExpression)* - ; - - -precedenceAmpersandOperator - : - AMPERSAND - ; - -precedenceAmpersandExpression - : - precedencePlusExpression (precedenceAmpersandOperator^ precedencePlusExpression)* - ; - - -precedenceBitwiseOrOperator - : - BITWISEOR - ; - -precedenceBitwiseOrExpression - : - precedenceAmpersandExpression (precedenceBitwiseOrOperator^ precedenceAmpersandExpression)* - ; - - -// Equal operators supporting NOT prefix -precedenceEqualNegatableOperator - : - KW_LIKE | KW_RLIKE | KW_REGEXP - ; - -precedenceEqualOperator - : - precedenceEqualNegatableOperator | EQUAL | EQUAL_NS | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN - ; - -precedenceEqualExpression - : - (left=precedenceBitwiseOrExpression -> $left) - ( - (KW_NOT precedenceEqualNegatableOperator notExpr=precedenceBitwiseOrExpression) - -> ^(KW_NOT ^(precedenceEqualNegatableOperator $precedenceEqualExpression $notExpr)) - | (precedenceEqualOperator equalExpr=precedenceBitwiseOrExpression) - -> ^(precedenceEqualOperator $precedenceEqualExpression $equalExpr) - | (KW_NOT KW_IN expressions) - -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions)) - | (KW_IN expressions) - -> ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions) - | ( KW_NOT KW_BETWEEN (min=precedenceBitwiseOrExpression) KW_AND (max=precedenceBitwiseOrExpression) ) - -> ^(TOK_FUNCTION Identifier["between"] KW_TRUE $left $min $max) - | ( KW_BETWEEN (min=precedenceBitwiseOrExpression) KW_AND (max=precedenceBitwiseOrExpression) ) - -> ^(TOK_FUNCTION Identifier["between"] KW_FALSE $left $min $max) - )* - ; - -expressions - : - LPAREN expression (COMMA expression)* RPAREN -> expression* - ; - -precedenceNotOperator - : - KW_NOT - ; - -precedenceNotExpression - : - (precedenceNotOperator^)* precedenceEqualExpression - ; - - -precedenceAndOperator - : - KW_AND - ; - -precedenceAndExpression - : - precedenceNotExpression (precedenceAndOperator^ precedenceNotExpression)* - ; - - -precedenceOrOperator - : - KW_OR - ; - -precedenceOrExpression - : - precedenceAndExpression (precedenceOrOperator^ precedenceAndExpression)* - ; - - -booleanValue - : - KW_TRUE^ | KW_FALSE^ - ; - -tableOrPartition - : - tableName partitionSpec? -> ^(TOK_TAB tableName partitionSpec?) - ; - -partitionSpec - : - KW_PARTITION - LPAREN partitionVal (COMMA partitionVal )* RPAREN -> ^(TOK_PARTSPEC partitionVal +) - ; - -partitionVal - : - Identifier (EQUAL constant)? -> ^(TOK_PARTVAL Identifier constant?) - ; - -dropPartitionSpec - : - KW_PARTITION - LPAREN dropPartitionVal (COMMA dropPartitionVal )* RPAREN -> ^(TOK_PARTSPEC dropPartitionVal +) - ; - -dropPartitionVal - : - Identifier dropPartitionOperator constant -> ^(TOK_PARTVAL Identifier dropPartitionOperator constant) - ; - -dropPartitionOperator - : - EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN - ; - -sysFuncNames - : - KW_AND - | KW_OR - | KW_NOT - | KW_LIKE - | KW_IF - | KW_CASE - | KW_WHEN - | KW_TINYINT - | KW_SMALLINT - | KW_INT - | KW_BIGINT - | KW_FLOAT - | KW_DOUBLE - | KW_BOOLEAN - | KW_STRING - | KW_BINARY - | KW_ARRAY - | KW_MAP - | KW_STRUCT - | KW_UNIONTYPE - | EQUAL - | EQUAL_NS - | NOTEQUAL - | LESSTHANOREQUALTO - | LESSTHAN - | GREATERTHANOREQUALTO - | GREATERTHAN - | DIVIDE - | PLUS - | MINUS - | STAR - | MOD - | DIV - | AMPERSAND - | TILDE - | BITWISEOR - | BITWISEXOR - | KW_RLIKE - | KW_REGEXP - | KW_IN - | KW_BETWEEN - ; - -descFuncNames - : - sysFuncNames - | StringLiteral - | Identifier - ; - -// Keywords - -kwUser -: -{input.LT(1).getText().equalsIgnoreCase("user")}? Identifier; - -kwRole -: -{input.LT(1).getText().equalsIgnoreCase("role")}? Identifier; - -kwInner -: -{input.LT(1).getText().equalsIgnoreCase("inner")}? Identifier; - -KW_TRUE : 'TRUE'; -KW_FALSE : 'FALSE'; -KW_ALL : 'ALL'; -KW_AND : 'AND'; -KW_OR : 'OR'; -KW_NOT : 'NOT' | '!'; -KW_LIKE : 'LIKE'; - -KW_IF : 'IF'; -KW_EXISTS : 'EXISTS'; - -KW_ASC : 'ASC'; -KW_DESC : 'DESC'; -KW_ORDER : 'ORDER'; -KW_GROUP : 'GROUP'; -KW_BY : 'BY'; -KW_HAVING : 'HAVING'; -KW_WHERE : 'WHERE'; -KW_FROM : 'FROM'; -KW_AS : 'AS'; -KW_SELECT : 'SELECT'; -KW_DISTINCT : 'DISTINCT'; -KW_INSERT : 'INSERT'; -KW_OVERWRITE : 'OVERWRITE'; -KW_OUTER : 'OUTER'; -KW_UNIQUEJOIN : 'UNIQUEJOIN'; -KW_PRESERVE : 'PRESERVE'; -KW_JOIN : 'JOIN'; -KW_LEFT : 'LEFT'; -KW_RIGHT : 'RIGHT'; -KW_FULL : 'FULL'; -KW_ON : 'ON'; -KW_PARTITION : 'PARTITION'; -KW_PARTITIONS : 'PARTITIONS'; -KW_TABLE: 'TABLE'; -KW_TABLES: 'TABLES'; -KW_COLUMNS: 'COLUMNS'; -KW_INDEX: 'INDEX'; -KW_INDEXES: 'INDEXES'; -KW_REBUILD: 'REBUILD'; -KW_FUNCTIONS: 'FUNCTIONS'; -KW_SHOW: 'SHOW'; -KW_MSCK: 'MSCK'; -KW_REPAIR: 'REPAIR'; -KW_DIRECTORY: 'DIRECTORY'; -KW_LOCAL: 'LOCAL'; -KW_TRANSFORM : 'TRANSFORM'; -KW_USING: 'USING'; -KW_CLUSTER: 'CLUSTER'; -KW_DISTRIBUTE: 'DISTRIBUTE'; -KW_SORT: 'SORT'; -KW_UNION: 'UNION'; -KW_LOAD: 'LOAD'; -KW_EXPORT: 'EXPORT'; -KW_IMPORT: 'IMPORT'; -KW_DATA: 'DATA'; -KW_INPATH: 'INPATH'; -KW_IS: 'IS'; -KW_NULL: 'NULL'; -KW_CREATE: 'CREATE'; -KW_EXTERNAL: 'EXTERNAL'; -KW_ALTER: 'ALTER'; -KW_CHANGE: 'CHANGE'; -KW_COLUMN: 'COLUMN'; -KW_FIRST: 'FIRST'; -KW_AFTER: 'AFTER'; -KW_DESCRIBE: 'DESCRIBE'; -KW_DROP: 'DROP'; -KW_RENAME: 'RENAME'; -KW_IGNORE: 'IGNORE'; -KW_PROTECTION: 'PROTECTION'; -KW_TO: 'TO'; -KW_COMMENT: 'COMMENT'; -KW_BOOLEAN: 'BOOLEAN'; -KW_TINYINT: 'TINYINT'; -KW_SMALLINT: 'SMALLINT'; -KW_INT: 'INT'; -KW_BIGINT: 'BIGINT'; -KW_FLOAT: 'FLOAT'; -KW_DOUBLE: 'DOUBLE'; -KW_DATE: 'DATE'; -KW_DATETIME: 'DATETIME'; -KW_TIMESTAMP: 'TIMESTAMP'; -KW_DECIMAL: 'DECIMAL'; -KW_STRING: 'STRING'; -KW_ARRAY: 'ARRAY'; -KW_STRUCT: 'STRUCT'; -KW_MAP: 'MAP'; -KW_UNIONTYPE: 'UNIONTYPE'; -KW_REDUCE: 'REDUCE'; -KW_PARTITIONED: 'PARTITIONED'; -KW_CLUSTERED: 'CLUSTERED'; -KW_SORTED: 'SORTED'; -KW_INTO: 'INTO'; -KW_BUCKETS: 'BUCKETS'; -KW_ROW: 'ROW'; -KW_ROWS: 'ROWS'; -KW_FORMAT: 'FORMAT'; -KW_DELIMITED: 'DELIMITED'; -KW_FIELDS: 'FIELDS'; -KW_TERMINATED: 'TERMINATED'; -KW_ESCAPED: 'ESCAPED'; -KW_COLLECTION: 'COLLECTION'; -KW_ITEMS: 'ITEMS'; -KW_KEYS: 'KEYS'; -KW_KEY_TYPE: '$KEY$'; -KW_LINES: 'LINES'; -KW_STORED: 'STORED'; -KW_FILEFORMAT: 'FILEFORMAT'; -KW_SEQUENCEFILE: 'SEQUENCEFILE'; -KW_TEXTFILE: 'TEXTFILE'; -KW_RCFILE: 'RCFILE'; -KW_INPUTFORMAT: 'INPUTFORMAT'; -KW_OUTPUTFORMAT: 'OUTPUTFORMAT'; -KW_INPUTDRIVER: 'INPUTDRIVER'; -KW_OUTPUTDRIVER: 'OUTPUTDRIVER'; -KW_OFFLINE: 'OFFLINE'; -KW_ENABLE: 'ENABLE'; -KW_DISABLE: 'DISABLE'; -KW_READONLY: 'READONLY'; -KW_NO_DROP: 'NO_DROP'; -KW_LOCATION: 'LOCATION'; -KW_TABLESAMPLE: 'TABLESAMPLE'; -KW_BUCKET: 'BUCKET'; -KW_OUT: 'OUT'; -KW_OF: 'OF'; -KW_PERCENT: 'PERCENT'; -KW_CAST: 'CAST'; -KW_ADD: 'ADD'; -KW_REPLACE: 'REPLACE'; -KW_RLIKE: 'RLIKE'; -KW_REGEXP: 'REGEXP'; -KW_TEMPORARY: 'TEMPORARY'; -KW_FUNCTION: 'FUNCTION'; -KW_EXPLAIN: 'EXPLAIN'; -KW_EXTENDED: 'EXTENDED'; -KW_FORMATTED: 'FORMATTED'; -KW_PRETTY: 'PRETTY'; -KW_DEPENDENCY: 'DEPENDENCY'; -KW_SERDE: 'SERDE'; -KW_WITH: 'WITH'; -KW_DEFERRED: 'DEFERRED'; -KW_SERDEPROPERTIES: 'SERDEPROPERTIES'; -KW_DBPROPERTIES: 'DBPROPERTIES'; -KW_LIMIT: 'LIMIT'; -KW_SET: 'SET'; -KW_UNSET: 'UNSET'; -KW_TBLPROPERTIES: 'TBLPROPERTIES'; -KW_IDXPROPERTIES: 'IDXPROPERTIES'; -KW_VALUE_TYPE: '$VALUE$'; -KW_ELEM_TYPE: '$ELEM$'; -KW_CASE: 'CASE'; -KW_WHEN: 'WHEN'; -KW_THEN: 'THEN'; -KW_ELSE: 'ELSE'; -KW_END: 'END'; -KW_MAPJOIN: 'MAPJOIN'; -KW_STREAMTABLE: 'STREAMTABLE'; -KW_HOLD_DDLTIME: 'HOLD_DDLTIME'; -KW_CLUSTERSTATUS: 'CLUSTERSTATUS'; -KW_UTC: 'UTC'; -KW_UTCTIMESTAMP: 'UTC_TMESTAMP'; -KW_LONG: 'LONG'; -KW_DELETE: 'DELETE'; -KW_PLUS: 'PLUS'; -KW_MINUS: 'MINUS'; -KW_FETCH: 'FETCH'; -KW_INTERSECT: 'INTERSECT'; -KW_VIEW: 'VIEW'; -KW_IN: 'IN'; -KW_DATABASE: 'DATABASE'; -KW_DATABASES: 'DATABASES'; -KW_MATERIALIZED: 'MATERIALIZED'; -KW_SCHEMA: 'SCHEMA'; -KW_SCHEMAS: 'SCHEMAS'; -KW_GRANT: 'GRANT'; -KW_REVOKE: 'REVOKE'; -KW_SSL: 'SSL'; -KW_UNDO: 'UNDO'; -KW_LOCK: 'LOCK'; -KW_LOCKS: 'LOCKS'; -KW_UNLOCK: 'UNLOCK'; -KW_SHARED: 'SHARED'; -KW_EXCLUSIVE: 'EXCLUSIVE'; -KW_PROCEDURE: 'PROCEDURE'; -KW_UNSIGNED: 'UNSIGNED'; -KW_WHILE: 'WHILE'; -KW_READ: 'READ'; -KW_READS: 'READS'; -KW_PURGE: 'PURGE'; -KW_RANGE: 'RANGE'; -KW_ANALYZE: 'ANALYZE'; -KW_BEFORE: 'BEFORE'; -KW_BETWEEN: 'BETWEEN'; -KW_BOTH: 'BOTH'; -KW_BINARY: 'BINARY'; -KW_CROSS: 'CROSS'; -KW_CONTINUE: 'CONTINUE'; -KW_CURSOR: 'CURSOR'; -KW_TRIGGER: 'TRIGGER'; -KW_RECORDREADER: 'RECORDREADER'; -KW_RECORDWRITER: 'RECORDWRITER'; -KW_SEMI: 'SEMI'; -KW_LATERAL: 'LATERAL'; -KW_TOUCH: 'TOUCH'; -KW_ARCHIVE: 'ARCHIVE'; -KW_UNARCHIVE: 'UNARCHIVE'; -KW_COMPUTE: 'COMPUTE'; -KW_STATISTICS: 'STATISTICS'; -KW_USE: 'USE'; -KW_OPTION: 'OPTION'; -KW_CONCATENATE: 'CONCATENATE'; -KW_SHOW_DATABASE: 'SHOW_DATABASE'; -KW_UPDATE: 'UPDATE'; -KW_RESTRICT: 'RESTRICT'; -KW_CASCADE: 'CASCADE'; -KW_SKEWED: 'SKEWED'; -KW_ROLLUP: 'ROLLUP'; -KW_CUBE: 'CUBE'; -KW_DIRECTORIES: 'DIRECTORIES'; -KW_FOR: 'FOR'; -KW_GROUPING: 'GROUPING'; -KW_SETS: 'SETS'; -KW_TRUNCATE: 'TRUNCATE'; -KW_NOSCAN: 'NOSCAN'; - -// Operators -// NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work. - -DOT : '.'; // generated as a part of Number rule -COLON : ':' ; -COMMA : ',' ; -SEMICOLON : ';' ; - -LPAREN : '(' ; -RPAREN : ')' ; -LSQUARE : '[' ; -RSQUARE : ']' ; -LCURLY : '{'; -RCURLY : '}'; - -EQUAL : '=' | '=='; -EQUAL_NS : '<=>'; -NOTEQUAL : '<>' | '!='; -LESSTHANOREQUALTO : '<='; -LESSTHAN : '<'; -GREATERTHANOREQUALTO : '>='; -GREATERTHAN : '>'; - -DIVIDE : '/'; -PLUS : '+'; -MINUS : '-'; -STAR : '*'; -MOD : '%'; -DIV : 'DIV'; - -AMPERSAND : '&'; -TILDE : '~'; -BITWISEOR : '|'; -BITWISEXOR : '^'; -QUESTION : '?'; -DOLLAR : '$'; - -// LITERALS -fragment -Letter - : 'a'..'z' | 'A'..'Z' - ; - -fragment -HexDigit - : 'a'..'f' | 'A'..'F' - ; - -fragment -Digit - : - '0'..'9' - ; - -fragment -Exponent - : - ('e' | 'E') ( PLUS|MINUS )? (Digit)+ - ; - -fragment -RegexComponent - : 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' - | PLUS | STAR | QUESTION | MINUS | DOT - | LPAREN | RPAREN | LSQUARE | RSQUARE | LCURLY | RCURLY - | BITWISEXOR | BITWISEOR | DOLLAR - ; - -StringLiteral - : - ( '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' - | '\"' ( ~('\"'|'\\') | ('\\' .) )* '\"' - )+ - ; - -CharSetLiteral - : - StringLiteral - | '0' 'X' (HexDigit|Digit)+ - ; - -BigintLiteral - : - (Digit)+ 'L' - ; - -SmallintLiteral - : - (Digit)+ 'S' - ; - -TinyintLiteral - : - (Digit)+ 'Y' - ; - -ByteLengthLiteral - : - (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') - ; - -Number - : - (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? - ; - -Identifier - : - (Letter | Digit) (Letter | Digit | '_')* - | '`' RegexComponent+ '`' - ; - -CharSetName - : - '_' (Letter | Digit | '_' | '-' | '.' | ':' )+ - ; - -WS : (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;} - ; - -COMMENT - : '--' (~('\n'|'\r'))* - { $channel=HIDDEN; } - ; - Index: ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g (working copy) @@ -0,0 +1,376 @@ +/** + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +lexer grammar HiveLexer; + +@lexer::header {package org.apache.hadoop.hive.ql.parse;} + +// Keywords + +KW_TRUE : 'TRUE'; +KW_FALSE : 'FALSE'; +KW_ALL : 'ALL'; +KW_AND : 'AND'; +KW_OR : 'OR'; +KW_NOT : 'NOT' | '!'; +KW_LIKE : 'LIKE'; + +KW_IF : 'IF'; +KW_EXISTS : 'EXISTS'; + +KW_ASC : 'ASC'; +KW_DESC : 'DESC'; +KW_ORDER : 'ORDER'; +KW_GROUP : 'GROUP'; +KW_BY : 'BY'; +KW_HAVING : 'HAVING'; +KW_WHERE : 'WHERE'; +KW_FROM : 'FROM'; +KW_AS : 'AS'; +KW_SELECT : 'SELECT'; +KW_DISTINCT : 'DISTINCT'; +KW_INSERT : 'INSERT'; +KW_OVERWRITE : 'OVERWRITE'; +KW_OUTER : 'OUTER'; +KW_UNIQUEJOIN : 'UNIQUEJOIN'; +KW_PRESERVE : 'PRESERVE'; +KW_JOIN : 'JOIN'; +KW_LEFT : 'LEFT'; +KW_RIGHT : 'RIGHT'; +KW_FULL : 'FULL'; +KW_ON : 'ON'; +KW_PARTITION : 'PARTITION'; +KW_PARTITIONS : 'PARTITIONS'; +KW_TABLE: 'TABLE'; +KW_TABLES: 'TABLES'; +KW_COLUMNS: 'COLUMNS'; +KW_INDEX: 'INDEX'; +KW_INDEXES: 'INDEXES'; +KW_REBUILD: 'REBUILD'; +KW_FUNCTIONS: 'FUNCTIONS'; +KW_SHOW: 'SHOW'; +KW_MSCK: 'MSCK'; +KW_REPAIR: 'REPAIR'; +KW_DIRECTORY: 'DIRECTORY'; +KW_LOCAL: 'LOCAL'; +KW_TRANSFORM : 'TRANSFORM'; +KW_USING: 'USING'; +KW_CLUSTER: 'CLUSTER'; +KW_DISTRIBUTE: 'DISTRIBUTE'; +KW_SORT: 'SORT'; +KW_UNION: 'UNION'; +KW_LOAD: 'LOAD'; +KW_EXPORT: 'EXPORT'; +KW_IMPORT: 'IMPORT'; +KW_DATA: 'DATA'; +KW_INPATH: 'INPATH'; +KW_IS: 'IS'; +KW_NULL: 'NULL'; +KW_CREATE: 'CREATE'; +KW_EXTERNAL: 'EXTERNAL'; +KW_ALTER: 'ALTER'; +KW_CHANGE: 'CHANGE'; +KW_COLUMN: 'COLUMN'; +KW_FIRST: 'FIRST'; +KW_AFTER: 'AFTER'; +KW_DESCRIBE: 'DESCRIBE'; +KW_DROP: 'DROP'; +KW_RENAME: 'RENAME'; +KW_IGNORE: 'IGNORE'; +KW_PROTECTION: 'PROTECTION'; +KW_TO: 'TO'; +KW_COMMENT: 'COMMENT'; +KW_BOOLEAN: 'BOOLEAN'; +KW_TINYINT: 'TINYINT'; +KW_SMALLINT: 'SMALLINT'; +KW_INT: 'INT'; +KW_BIGINT: 'BIGINT'; +KW_FLOAT: 'FLOAT'; +KW_DOUBLE: 'DOUBLE'; +KW_DATE: 'DATE'; +KW_DATETIME: 'DATETIME'; +KW_TIMESTAMP: 'TIMESTAMP'; +KW_DECIMAL: 'DECIMAL'; +KW_STRING: 'STRING'; +KW_ARRAY: 'ARRAY'; +KW_STRUCT: 'STRUCT'; +KW_MAP: 'MAP'; +KW_UNIONTYPE: 'UNIONTYPE'; +KW_REDUCE: 'REDUCE'; +KW_PARTITIONED: 'PARTITIONED'; +KW_CLUSTERED: 'CLUSTERED'; +KW_SORTED: 'SORTED'; +KW_INTO: 'INTO'; +KW_BUCKETS: 'BUCKETS'; +KW_ROW: 'ROW'; +KW_ROWS: 'ROWS'; +KW_FORMAT: 'FORMAT'; +KW_DELIMITED: 'DELIMITED'; +KW_FIELDS: 'FIELDS'; +KW_TERMINATED: 'TERMINATED'; +KW_ESCAPED: 'ESCAPED'; +KW_COLLECTION: 'COLLECTION'; +KW_ITEMS: 'ITEMS'; +KW_KEYS: 'KEYS'; +KW_KEY_TYPE: '$KEY$'; +KW_LINES: 'LINES'; +KW_STORED: 'STORED'; +KW_FILEFORMAT: 'FILEFORMAT'; +KW_SEQUENCEFILE: 'SEQUENCEFILE'; +KW_TEXTFILE: 'TEXTFILE'; +KW_RCFILE: 'RCFILE'; +KW_INPUTFORMAT: 'INPUTFORMAT'; +KW_OUTPUTFORMAT: 'OUTPUTFORMAT'; +KW_INPUTDRIVER: 'INPUTDRIVER'; +KW_OUTPUTDRIVER: 'OUTPUTDRIVER'; +KW_OFFLINE: 'OFFLINE'; +KW_ENABLE: 'ENABLE'; +KW_DISABLE: 'DISABLE'; +KW_READONLY: 'READONLY'; +KW_NO_DROP: 'NO_DROP'; +KW_LOCATION: 'LOCATION'; +KW_TABLESAMPLE: 'TABLESAMPLE'; +KW_BUCKET: 'BUCKET'; +KW_OUT: 'OUT'; +KW_OF: 'OF'; +KW_PERCENT: 'PERCENT'; +KW_CAST: 'CAST'; +KW_ADD: 'ADD'; +KW_REPLACE: 'REPLACE'; +KW_RLIKE: 'RLIKE'; +KW_REGEXP: 'REGEXP'; +KW_TEMPORARY: 'TEMPORARY'; +KW_FUNCTION: 'FUNCTION'; +KW_EXPLAIN: 'EXPLAIN'; +KW_EXTENDED: 'EXTENDED'; +KW_FORMATTED: 'FORMATTED'; +KW_PRETTY: 'PRETTY'; +KW_DEPENDENCY: 'DEPENDENCY'; +KW_SERDE: 'SERDE'; +KW_WITH: 'WITH'; +KW_DEFERRED: 'DEFERRED'; +KW_SERDEPROPERTIES: 'SERDEPROPERTIES'; +KW_DBPROPERTIES: 'DBPROPERTIES'; +KW_LIMIT: 'LIMIT'; +KW_SET: 'SET'; +KW_UNSET: 'UNSET'; +KW_TBLPROPERTIES: 'TBLPROPERTIES'; +KW_IDXPROPERTIES: 'IDXPROPERTIES'; +KW_VALUE_TYPE: '$VALUE$'; +KW_ELEM_TYPE: '$ELEM$'; +KW_CASE: 'CASE'; +KW_WHEN: 'WHEN'; +KW_THEN: 'THEN'; +KW_ELSE: 'ELSE'; +KW_END: 'END'; +KW_MAPJOIN: 'MAPJOIN'; +KW_STREAMTABLE: 'STREAMTABLE'; +KW_HOLD_DDLTIME: 'HOLD_DDLTIME'; +KW_CLUSTERSTATUS: 'CLUSTERSTATUS'; +KW_UTC: 'UTC'; +KW_UTCTIMESTAMP: 'UTC_TMESTAMP'; +KW_LONG: 'LONG'; +KW_DELETE: 'DELETE'; +KW_PLUS: 'PLUS'; +KW_MINUS: 'MINUS'; +KW_FETCH: 'FETCH'; +KW_INTERSECT: 'INTERSECT'; +KW_VIEW: 'VIEW'; +KW_IN: 'IN'; +KW_DATABASE: 'DATABASE'; +KW_DATABASES: 'DATABASES'; +KW_MATERIALIZED: 'MATERIALIZED'; +KW_SCHEMA: 'SCHEMA'; +KW_SCHEMAS: 'SCHEMAS'; +KW_GRANT: 'GRANT'; +KW_REVOKE: 'REVOKE'; +KW_SSL: 'SSL'; +KW_UNDO: 'UNDO'; +KW_LOCK: 'LOCK'; +KW_LOCKS: 'LOCKS'; +KW_UNLOCK: 'UNLOCK'; +KW_SHARED: 'SHARED'; +KW_EXCLUSIVE: 'EXCLUSIVE'; +KW_PROCEDURE: 'PROCEDURE'; +KW_UNSIGNED: 'UNSIGNED'; +KW_WHILE: 'WHILE'; +KW_READ: 'READ'; +KW_READS: 'READS'; +KW_PURGE: 'PURGE'; +KW_RANGE: 'RANGE'; +KW_ANALYZE: 'ANALYZE'; +KW_BEFORE: 'BEFORE'; +KW_BETWEEN: 'BETWEEN'; +KW_BOTH: 'BOTH'; +KW_BINARY: 'BINARY'; +KW_CROSS: 'CROSS'; +KW_CONTINUE: 'CONTINUE'; +KW_CURSOR: 'CURSOR'; +KW_TRIGGER: 'TRIGGER'; +KW_RECORDREADER: 'RECORDREADER'; +KW_RECORDWRITER: 'RECORDWRITER'; +KW_SEMI: 'SEMI'; +KW_LATERAL: 'LATERAL'; +KW_TOUCH: 'TOUCH'; +KW_ARCHIVE: 'ARCHIVE'; +KW_UNARCHIVE: 'UNARCHIVE'; +KW_COMPUTE: 'COMPUTE'; +KW_STATISTICS: 'STATISTICS'; +KW_USE: 'USE'; +KW_OPTION: 'OPTION'; +KW_CONCATENATE: 'CONCATENATE'; +KW_SHOW_DATABASE: 'SHOW_DATABASE'; +KW_UPDATE: 'UPDATE'; +KW_RESTRICT: 'RESTRICT'; +KW_CASCADE: 'CASCADE'; +KW_SKEWED: 'SKEWED'; +KW_ROLLUP: 'ROLLUP'; +KW_CUBE: 'CUBE'; +KW_DIRECTORIES: 'DIRECTORIES'; +KW_FOR: 'FOR'; +KW_GROUPING: 'GROUPING'; +KW_SETS: 'SETS'; +KW_TRUNCATE: 'TRUNCATE'; +KW_NOSCAN: 'NOSCAN'; +KW_USER: 'USER'; +KW_ROLE: 'ROLE'; +KW_INNER: 'INNER'; + +// Operators +// NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work. + +DOT : '.'; // generated as a part of Number rule +COLON : ':' ; +COMMA : ',' ; +SEMICOLON : ';' ; + +LPAREN : '(' ; +RPAREN : ')' ; +LSQUARE : '[' ; +RSQUARE : ']' ; +LCURLY : '{'; +RCURLY : '}'; + +EQUAL : '=' | '=='; +EQUAL_NS : '<=>'; +NOTEQUAL : '<>' | '!='; +LESSTHANOREQUALTO : '<='; +LESSTHAN : '<'; +GREATERTHANOREQUALTO : '>='; +GREATERTHAN : '>'; + +DIVIDE : '/'; +PLUS : '+'; +MINUS : '-'; +STAR : '*'; +MOD : '%'; +DIV : 'DIV'; + +AMPERSAND : '&'; +TILDE : '~'; +BITWISEOR : '|'; +BITWISEXOR : '^'; +QUESTION : '?'; +DOLLAR : '$'; + +// LITERALS +fragment +Letter + : 'a'..'z' | 'A'..'Z' + ; + +fragment +HexDigit + : 'a'..'f' | 'A'..'F' + ; + +fragment +Digit + : + '0'..'9' + ; + +fragment +Exponent + : + ('e' | 'E') ( PLUS|MINUS )? (Digit)+ + ; + +fragment +RegexComponent + : 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' + | PLUS | STAR | QUESTION | MINUS | DOT + | LPAREN | RPAREN | LSQUARE | RSQUARE | LCURLY | RCURLY + | BITWISEXOR | BITWISEOR | DOLLAR + ; + +StringLiteral + : + ( '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' + | '\"' ( ~('\"'|'\\') | ('\\' .) )* '\"' + )+ + ; + +CharSetLiteral + : + StringLiteral + | '0' 'X' (HexDigit|Digit)+ + ; + +BigintLiteral + : + (Digit)+ 'L' + ; + +SmallintLiteral + : + (Digit)+ 'S' + ; + +TinyintLiteral + : + (Digit)+ 'Y' + ; + +ByteLengthLiteral + : + (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') + ; + +Number + : + (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? + ; + +Identifier + : + (Letter | Digit) (Letter | Digit | '_')* + | '`' RegexComponent+ '`' + ; + +CharSetName + : + '_' (Letter | Digit | '_' | '-' | '.' | ':' )+ + ; + +WS : (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;} + ; + +COMMENT + : '--' (~('\n'|'\r'))* + { $channel=HIDDEN; } + ; + Index: ql/build.xml =================================================================== --- ql/build.xml (revision 1442678) +++ ql/build.xml (working copy) @@ -142,7 +142,8 @@ - + +