Repository: tajo Updated Branches: refs/heads/master 6c9ddeaac -> 33b8893fe
http://git-wip-us.apache.org/repos/asf/tajo/blob/33b8893f/tajo-sql-parser/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-sql-parser/pom.xml b/tajo-sql-parser/pom.xml new file mode 100644 index 0000000..cba8af5 --- /dev/null +++ b/tajo-sql-parser/pom.xml @@ -0,0 +1,193 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>tajo-project</artifactId> + <groupId>org.apache.tajo</groupId> + <version>0.12.0-SNAPSHOT</version> + <relativePath>../tajo-project</relativePath> + </parent> + <artifactId>tajo-sql-parser</artifactId> + <packaging>jar</packaging> + <name>Tajo SQL Parser</name> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <antlr4.visitor>true</antlr4.visitor> + <antlr4.listener>true</antlr4.listener> + </properties> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <executions> + <execution> + <phase>verify</phase> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-deploy-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.antlr</groupId> + <artifactId>antlr4-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>antlr4</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-dependencies</id> + <phase>package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <includeScope>runtime</includeScope> + <outputDirectory>${project.build.directory}/lib</outputDirectory> + <overWriteReleases>false</overWriteReleases> + <overWriteSnapshots>false</overWriteSnapshots> + <overWriteIfNewer>true</overWriteIfNewer> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + + <dependencies> + <dependency> + <groupId>org.apache.tajo</groupId> + <artifactId>tajo-algebra</artifactId> + </dependency> + <dependency> + <groupId>org.antlr</groupId> + <artifactId>antlr4</artifactId> + </dependency> + </dependencies> + + <profiles> + <profile> + <id>docs</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <executions> + <execution> + <!-- build javadoc jars per jar for publishing to maven --> + <id>module-javadocs</id> + <phase>package</phase> + <goals> + <goal>jar</goal> + </goals> + <configuration> + <destDir>${project.build.directory}</destDir> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>dist</id> + <activation> + <activeByDefault>false</activeByDefault> + <property> + <name>tar|rpm|deb</name> + </property> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + <execution> + <id>dist</id> + <phase>package</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <target> + <echo file="${project.build.directory}/dist-layout-stitching.sh"> + run() { + echo "\$ ${@}" + "${@}" + res=$? + if [ $res != 0 ]; then + echo + echo "Failed!" + echo + exit $res + fi + } + + ROOT=`cd ${basedir}/..;pwd` + echo + echo "Current directory `pwd`" + echo + run rm -rf ${project.artifactId}-${project.version} + run mkdir ${project.artifactId}-${project.version} + run cd ${project.artifactId}-${project.version} + run cp -r ${basedir}/target/${project.artifactId}-${project.version}*.jar . + echo + echo "Tajo Algebra dist layout available at: ${project.build.directory}/${project.artifactId}-${project.version}" + echo + </echo> + <exec executable="sh" dir="${project.build.directory}" failonerror="true"> + <arg line="./dist-layout-stitching.sh" /> + </exec> + </target> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> +</project> + http://git-wip-us.apache.org/repos/asf/tajo/blob/33b8893f/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLLexer.g4 ---------------------------------------------------------------------- diff --git a/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLLexer.g4 b/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLLexer.g4 new file mode 100644 index 0000000..896f627 --- /dev/null +++ b/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLLexer.g4 @@ -0,0 +1,513 @@ +/* + 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 SQLLexer; + +@header { +} + +@members { +} + + +/* +=============================================================================== + Tokens for Case Insensitive Keywords +=============================================================================== +*/ +fragment A + : 'A' | 'a'; + +fragment B + : 'B' | 'b'; + +fragment C + : 'C' | 'c'; + +fragment D + : 'D' | 'd'; + +fragment E + : 'E' | 'e'; + +fragment F + : 'F' | 'f'; + +fragment G + : 'G' | 'g'; + +fragment H + : 'H' | 'h'; + +fragment I + : 'I' | 'i'; + +fragment J + : 'J' | 'j'; + +fragment K + : 'K' | 'k'; + +fragment L + : 'L' | 'l'; + +fragment M + : 'M' | 'm'; + +fragment N + : 'N' | 'n'; + +fragment O + : 'O' | 'o'; + +fragment P + : 'P' | 'p'; + +fragment Q + : 'Q' | 'q'; + +fragment R + : 'R' | 'r'; + +fragment S + : 'S' | 's'; + +fragment T + : 'T' | 't'; + +fragment U + : 'U' | 'u'; + +fragment V + : 'V' | 'v'; + +fragment W + : 'W' | 'w'; + +fragment X + : 'X' | 'x'; + +fragment Y + : 'Y' | 'y'; + +fragment Z + : 'Z' | 'z'; + +/* +=============================================================================== + Reserved Keywords +=============================================================================== +*/ + +AS : A S; +ALL : A L L; +AND : A N D; +ANY : A N Y; +ASYMMETRIC : A S Y M M E T R I C; +ASC : A S C; + + +BOTH : B O T H; + +CASE : C A S E; +CAST : C A S T; +CREATE : C R E A T E; +CROSS : C R O S S; +CURRENT_DATE: C U R R E N T UNDERLINE D A T E; +CURRENT_TIME: C U R R E N T UNDERLINE T I M E; +CURRENT_TIMESTAMP: C U R R E N T UNDERLINE T I M E S T A M P; + +DESC : D E S C; +DISTINCT : D I S T I N C T; + +END : E N D; +ELSE : E L S E; +EXCEPT : E X C E P T; + +FALSE : F A L S E; +FULL : F U L L; +FROM : F R O M; + +GROUP : G R O U P; + +HAVING : H A V I N G; + +ILIKE : I L I K E; +IN : I N; +INNER : I N N E R; +INTERSECT : I N T E R S E C T; +INTO : I N T O; +IS : I S; + +JOIN : J O I N; + +LEADING : L E A D I N G; +LEFT : L E F T; +LIKE : L I K E; +LIMIT : L I M I T; + +NATURAL : N A T U R A L; +NOT : N O T; +NULL : N U L L; + +ON : O N; +OR : O R; +ORDER : O R D E R; +OUTER : O U T E R; +OVER : O V E R; +RIGHT : R I G H T; +SELECT : S E L E C T; +SOME : S O M E; +SYMMETRIC : S Y M M E T R I C; + +TABLE : T A B L E; +THEN : T H E N; +TRAILING : T R A I L I N G; +TRUE : T R U E; + +UNION : U N I O N; +UNIQUE : U N I Q U E; +USING : U S I N G; + +WHEN : W H E N; +WHERE : W H E R E; +WITH : W I T H; +WINDOW : W I N D O W; + +/* +=============================================================================== + Non Reserved Keywords +=============================================================================== +*/ +AVG : A V G; +ADD: A D D; +ALTER : A L T E R; + +BETWEEN : B E T W E E N; +BY : B Y; + +CATALOG : C A T A L O G; +CENTURY : C E N T U R Y; +CHARACTER : C H A R A C T E R; +COLLECT : C O L L E C T; +COALESCE : C O A L E S C E; +COLUMN : C O L U M N; +COUNT : C O U N T; +CUBE : C U B E; +CUME_DIST : C U M E UNDERLINE D I S T; +CURRENT : C U R R E N T; + +DAY : D A Y; +DEFAULT : D E F A U L T; +DATABASE : D A T A B A S E; +DEC : D E C; +DECADE : D E C A D E; +DENSE_RANK : D E N S E UNDERLINE R A N K; +DOW : D O W; +DOY : D O Y; +DROP : D R O P; + +EPOCH : E P O C H; +EVERY : E V E R Y; +EXCLUDE : E X C L U D E; +EXISTS : E X I S T S; +EXPLAIN : E X P L A I N; +EXTERNAL : E X T E R N A L; +EXTRACT : E X T R A C T; + +FILTER : F I L T E R; +FIRST : F I R S T; +FIRST_VALUE : F I R S T UNDERLINE V A L U E; +FOLLOWING : F O L L O W I N G; +FORMAT : F O R M A T; +FUSION : F U S I O N; + +GLOBAL : G L O B A L; +GROUPING : G R O U P I N G; + +HASH : H A S H; +HOUR : H O U R; + +IF : I F; +INDEX : I N D E X; +INSERT : I N S E R T; +INTERSECTION : I N T E R S E C T I O N; +ISODOW : I S O D O W; +ISOYEAR : I S O Y E A R; + +LAG : L A G; +LAST : L A S T; +LAST_VALUE : L A S T UNDERLINE V A L U E; +LEAD : L E A D; +LESS : L E S S; +LIST : L I S T; +LOCATION : L O C A T I O N; + +MAP : M A P; +MAX : M A X; +MAXVALUE : M A X V A L U E; +MICROSECONDS : M I C R O S E C O N D S; +MILLENNIUM : M I L L E N N I U M; +MILLISECONDS : M I L L I S E C O N D S; +MIN : M I N; +MINUTE : M I N U T E; +MONTH : M O N T H; + +NATIONAL : N A T I O N A L; +NULLIF : N U L L I F; +NO : N O; + +OVERWRITE : O V E R W R I T E; +OTHERS: O T H E R S; + +PARTITION : P A R T I T I O N; +PARTITIONS : P A R T I T I O N S; +PERCENT_RANK : P E R C E N T UNDERLINE R A N K; +PRECEDING : P R E C E D I N G; +PRECISION : P R E C I S I O N; +PURGE : P U R G E; +PROPERTY : P R O P E R T Y; + +QUARTER : Q U A R T E R; + +RANGE : R A N G E; +RANK : R A N K; +RECORD : R E C O R D; +REGEXP : R E G E X P; +RENAME : R E N A M E; +RESET : R E S E T; +RLIKE : R L I K E; +ROLLUP : R O L L U P; +ROW : R O W; +ROWS : R O W S; +ROW_NUMBER : R O W UNDERLINE N U M B E R; + +SECOND : S E C O N D; +SESSION : S E S S I O N; +SET : S E T; +SIMILAR : S I M I L A R; +STDDEV_POP : S T D D E V UNDERLINE P O P; +STDDEV_SAMP : S T D D E V UNDERLINE S A M P; +SUBPARTITION : S U B P A R T I T I O N; +SUM : S U M; + +TABLESPACE : T A B L E S P A C E; +THAN : T H A N; +TIES : T I E S; +TIMEZONE: T I M E Z O N E; +TIMEZONE_HOUR: T I M E Z O N E UNDERLINE H O U R; +TIMEZONE_MINUTE: T I M E Z O N E UNDERLINE M I N U T E; +TRIM : T R I M; +TO : T O; +TRUNCATE : T R U N C A T E; + +UNBOUNDED : U N B O U N D E D; +UNKNOWN : U N K N O W N; + +VALUES : V A L U E S; +VAR_SAMP : V A R UNDERLINE S A M P; +VAR_POP : V A R UNDERLINE P O P; +VARYING : V A R Y I N G; + +WEEK : W E E K; + +YEAR : Y E A R; + +ZONE : Z O N E; + + +/* +=============================================================================== + Data Type Tokens +=============================================================================== +*/ +BOOLEAN : B O O L E A N; +BOOL : B O O L; +BIT : B I T; +VARBIT : V A R B I T; + +INT1 : I N T '1'; +INT2 : I N T '2'; +INT4 : I N T '4'; +INT8 : I N T '8'; + +TINYINT : T I N Y I N T; // alias for INT1 +SMALLINT : S M A L L I N T; // alias for INT2 +INT : I N T; // alias for INT4 +INTEGER : I N T E G E R; // alias - INT4 +BIGINT : B I G I N T; // alias for INT8 + +FLOAT4 : F L O A T '4'; +FLOAT8 : F L O A T '8'; + +REAL : R E A L; // alias for FLOAT4 +FLOAT : F L O A T; // alias for FLOAT8 +DOUBLE : D O U B L E; // alias for FLOAT8 + +NUMERIC : N U M E R I C; +DECIMAL : D E C I M A L; // alias for number + +CHAR : C H A R; +VARCHAR : V A R C H A R; +NCHAR : N C H A R; +NVARCHAR : N V A R C H A R; + +DATE : D A T E; +INTERVAL: I N T E R V A L; +TIME : T I M E; +TIMETZ : T I M E T Z; +TIMESTAMP : T I M E S T A M P; +TIMESTAMPTZ : T I M E S T A M P T Z; + +TEXT : T E X T; + +BINARY : B I N A R Y; +VARBINARY : V A R B I N A R Y; +BLOB : B L O B; +BYTEA : B Y T E A; // alias for BLOB + +INET4 : I N E T '4'; + +// Operators +Similar_To : '~'; +Not_Similar_To : '!~'; +Similar_To_Case_Insensitive : '~*'; +Not_Similar_To_Case_Insensitive : '!~*'; + +// Cast Operator +CAST_EXPRESSION + : COLON COLON + ; + +ASSIGN : ':='; +EQUAL : '='; +COLON : ':'; +SEMI_COLON : ';'; +COMMA : ','; +CONCATENATION_OPERATOR : VERTICAL_BAR VERTICAL_BAR; +NOT_EQUAL : '<>' | '!=' | '~='| '^=' ; +LTH : '<' ; +LEQ : '<='; +GTH : '>'; +GEQ : '>='; +LEFT_PAREN : '('; +RIGHT_PAREN : ')'; +PLUS : '+'; +MINUS : '-'; +MULTIPLY: '*'; +DIVIDE : '/'; +MODULAR : '%'; +DOT : '.'; +UNDERLINE : '_'; +VERTICAL_BAR : '|'; +QUOTE : '\''; +DOUBLE_QUOTE : '"'; + +NUMBER : Digit+; + +fragment +Digit : '0'..'9'; + +REAL_NUMBER + : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? + | '.' ('0'..'9')+ EXPONENT? + | ('0'..'9')+ EXPONENT + ; + +BlockComment + : '/*' .*? '*/' -> skip + ; + +LineComment + : '--' ~[\r\n]* -> skip + ; + +/* +=============================================================================== + Identifiers +=============================================================================== +*/ + +Regular_Identifier + : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|Digit|'_')* { setText(getText().toLowerCase()); } + ; + +Quoted_Identifier + : DOUBLE_QUOTE ( ESC_SEQ | ~('\\'|'"') )* DOUBLE_QUOTE { setText(getText().substring(1, getText().length()-1)); } + ; + +/* +=============================================================================== + Literal +=============================================================================== +*/ + +// Some Unicode Character Ranges +fragment +Control_Characters : '\u0001' .. '\u001F'; +fragment +Extended_Control_Characters : '\u0080' .. '\u009F'; + +Character_String_Literal + : QUOTE ( ESC_SEQ | ~('\\'|'\'') )* QUOTE + ; + +fragment +EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; + +fragment +HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; + +fragment +ESC_SEQ + : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') + | UNICODE_ESC + | OCTAL_ESC + ; + +fragment +OCTAL_ESC + : '\\' ('0'..'3') ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') + ; + +fragment +UNICODE_ESC + : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT + ; + + +/* +=============================================================================== + Whitespace Tokens +=============================================================================== +*/ + +Space + : ' ' -> skip + ; + +White_Space + : ( Control_Characters | Extended_Control_Characters )+ -> skip + ; + + +BAD + : . -> skip + ; http://git-wip-us.apache.org/repos/asf/tajo/blob/33b8893f/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLParser.g4 ---------------------------------------------------------------------- diff --git a/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLParser.g4 b/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLParser.g4 new file mode 100644 index 0000000..41de218 --- /dev/null +++ b/tajo-sql-parser/src/main/antlr4/org.apache.tajo.parser.sql/SQLParser.g4 @@ -0,0 +1,1639 @@ +/** + * 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 SQLParser; + +options { + language=Java; + tokenVocab=SQLLexer; +} + +@header { +} + +@members { +} + +/* +=============================================================================== + SQL statement (Start Symbol) +=============================================================================== +*/ +sql + : (explain_clause)? statement (SEMI_COLON)? EOF + ; + +explain_clause + : EXPLAIN (GLOBAL)? + ; + +statement + : session_statement + | data_statement + | data_change_statement + | schema_statement + | index_statement + ; + +session_statement + : SET CATALOG dbname = identifier + | SET TIME ZONE (TO | EQUAL)? (Character_String_Literal | signed_numerical_literal | DEFAULT) + | SET (SESSION)? name=identifier (TO | EQUAL)? + (Character_String_Literal | signed_numerical_literal | boolean_literal | DEFAULT) + | RESET name=identifier + ; + +data_statement + : query_expression + ; + +data_change_statement + : insert_statement + ; + +schema_statement + : database_definition + | drop_database_statement + | create_table_statement + | drop_table_statement + | alter_tablespace_statement + | alter_table_statement + | truncate_table_statement + ; + +index_statement + : create_index_statement + | drop_index_statement + ; + +create_index_statement + : CREATE (u=UNIQUE)? INDEX index_name = identifier ON table_name (method_specifier)? + LEFT_PAREN sort_specifier_list RIGHT_PAREN param_clause? (where_clause)? (LOCATION path=Character_String_Literal)? + ; + +drop_index_statement + : DROP INDEX index_name = identifier + ; + +database_definition + : CREATE DATABASE (if_not_exists)? dbname = identifier + ; + +if_not_exists + : IF NOT EXISTS + ; + +drop_database_statement + : DROP DATABASE (if_exists)? dbname = identifier + ; + +if_exists + : IF EXISTS + ; + +create_table_statement + : CREATE EXTERNAL TABLE (if_not_exists)? table_name table_elements (TABLESPACE spacename=identifier)? USING storage_type=identifier + (param_clause)? (table_partitioning_clauses)? (LOCATION uri=Character_String_Literal)? + | CREATE TABLE (if_not_exists)? table_name table_elements (TABLESPACE spacename=identifier)? (USING storage_type=identifier)? + (param_clause)? (table_partitioning_clauses)? (AS query_expression)? + | CREATE TABLE (if_not_exists)? table_name (TABLESPACE spacename=identifier)? (USING storage_type=identifier)? + (param_clause)? (table_partitioning_clauses)? AS query_expression + | CREATE TABLE (if_not_exists)? table_name LIKE like_table_name=table_name + ; + +table_elements + : LEFT_PAREN field_element (COMMA field_element)* RIGHT_PAREN + ; + +field_element + : name=identifier field_type + ; + +field_type + : data_type + ; + +param_clause + : WITH LEFT_PAREN param (COMMA param)* RIGHT_PAREN + ; + +param + : key=Character_String_Literal EQUAL value=numeric_value_expression + ; + +method_specifier + : USING m=identifier + ; + +table_space_specifier + : TABLESPACE table_space_name + ; + +table_space_name + : identifier + ; + +table_partitioning_clauses + : range_partitions + | hash_partitions + | list_partitions + | column_partitions + ; + +range_partitions + : PARTITION BY RANGE LEFT_PAREN column_reference_list RIGHT_PAREN + LEFT_PAREN range_value_clause_list RIGHT_PAREN + ; + +range_value_clause_list + : range_value_clause (COMMA range_value_clause)* + ; + +range_value_clause + : PARTITION partition_name VALUES LESS THAN (LEFT_PAREN value_expression RIGHT_PAREN | LEFT_PAREN? MAXVALUE RIGHT_PAREN?) + ; + +hash_partitions + : PARTITION BY HASH LEFT_PAREN column_reference_list RIGHT_PAREN + (LEFT_PAREN individual_hash_partitions RIGHT_PAREN | hash_partitions_by_quantity) + ; + +individual_hash_partitions + : individual_hash_partition (COMMA individual_hash_partition)* + ; + +individual_hash_partition + : PARTITION partition_name + ; + +hash_partitions_by_quantity + : PARTITIONS quantity = numeric_value_expression + ; + +list_partitions + : PARTITION BY LIST LEFT_PAREN column_reference_list RIGHT_PAREN LEFT_PAREN list_value_clause_list RIGHT_PAREN + ; + +list_value_clause_list + : list_value_partition (COMMA list_value_partition)* + ; + +list_value_partition + : PARTITION partition_name VALUES (IN)? LEFT_PAREN in_value_list RIGHT_PAREN + ; + +column_partitions + : PARTITION BY COLUMN table_elements + ; + +partition_name + : identifier + ; + +truncate_table_statement + : TRUNCATE (TABLE)? table_name (COMMA table_name)* + ; + +/* +=============================================================================== + 11.21 <data types> +=============================================================================== +*/ + +drop_table_statement + : DROP TABLE (if_exists)? table_name (PURGE)? + ; + +/* +=============================================================================== + 5.2 <token and separator> + + Specifying lexical units (tokens and separators) that participate in SQL language +=============================================================================== +*/ + +identifier + : Regular_Identifier + | nonreserved_keywords + | Quoted_Identifier + ; + +nonreserved_keywords + : ADD + | AVG + | ALTER + | BETWEEN + | BY + | CATALOG + | CENTURY + | CHARACTER + | COALESCE + | COLLECT + | COLUMN + | COUNT + | CUBE + | CUME_DIST + | CURRENT + | DAY + | DEC + | DECADE + | DEFAULT + | DENSE_RANK + | DOW + | DOY + | DROP + | EPOCH + | EVERY + | EXISTS + | EXCLUDE + | EXPLAIN + | EXTERNAL + | EXTRACT + | FILTER + | FIRST + | FIRST_VALUE + | FOLLOWING + | FORMAT + | FUSION + | GROUPING + | HASH + | INDEX + | INSERT + | INTERSECTION + | ISODOW + | ISOYEAR + | LAST + | LAST_VALUE + | LESS + | LIST + | LOCATION + | MAP + | MAX + | MAXVALUE + | MICROSECONDS + | MILLENNIUM + | MILLISECONDS + | MIN + | MINUTE + | MONTH + | NATIONAL + | NO + | NULLIF + | OVERWRITE + | OTHERS + | PARTITION + | PARTITIONS + | PERCENT_RANK + | PRECEDING + | PRECISION + | PURGE + | QUARTER + | RANGE + | RANK + | RECORD + | REGEXP + | RENAME + | RESET + | RLIKE + | ROLLUP + | ROW + | ROWS + | ROW_NUMBER + | SECOND + | SET + | SESSION + | SIMILAR + | STDDEV_POP + | STDDEV_SAMP + | SUBPARTITION + | SUM + | TABLESPACE + | THAN + | TIES + | TIMEZONE + | TIMEZONE_HOUR + | TIMEZONE_MINUTE + | TRIM + | TO + | UNBOUNDED + | UNKNOWN + | VALUES + | VAR_POP + | VAR_SAMP + | VARYING + | WEEK + | YEAR + | ZONE + + | BIGINT + | BIT + | BLOB + | BOOL + | BOOLEAN + | BYTEA + | CHAR + | DATE + | DECIMAL + | DOUBLE + | FLOAT + | FLOAT4 + | FLOAT8 + | INET4 + | INT + | INT1 + | INT2 + | INT4 + | INT8 + | INTEGER + | INTERVAL + | NCHAR + | NUMERIC + | NVARCHAR + | REAL + | SMALLINT + | TEXT + | TIME + | TIMESTAMP + | TIMESTAMPTZ + | TIMETZ + | TINYINT + | VARBINARY + | VARBIT + | VARCHAR + ; + +/* +=============================================================================== + 5.3 <literal> +=============================================================================== +*/ + +unsigned_literal + : unsigned_numeric_literal + | general_literal + ; + +general_literal + : Character_String_Literal + | datetime_literal + | boolean_literal + ; + +datetime_literal + : timestamp_literal + | time_literal + | date_literal + | interval_literal + ; + +time_literal + : TIME time_string=Character_String_Literal + ; + +timestamp_literal + : TIMESTAMP timestamp_string=Character_String_Literal + ; + +date_literal + : DATE date_string=Character_String_Literal + ; + +interval_literal + : INTERVAL interval_string=Character_String_Literal + ; + +boolean_literal + : TRUE | FALSE | UNKNOWN + ; + +/* +=============================================================================== + 6.1 <data types> +=============================================================================== +*/ + +data_type + : predefined_type + ; + +predefined_type + : character_string_type + | national_character_string_type + | binary_large_object_string_type + | numeric_type + | boolean_type + | datetime_type + | bit_type + | binary_type + | network_type + | record_type + | map_type + ; + +character_string_type + : CHARACTER type_length? + | CHAR type_length? + | CHARACTER VARYING type_length? + | CHAR VARYING type_length? + | VARCHAR type_length? + | TEXT + ; + +type_length + : LEFT_PAREN NUMBER RIGHT_PAREN + ; + +national_character_string_type + : NATIONAL CHARACTER type_length? + | NATIONAL CHAR type_length? + | NCHAR type_length? + | NATIONAL CHARACTER VARYING type_length? + | NATIONAL CHAR VARYING type_length? + | NCHAR VARYING type_length? + | NVARCHAR type_length? + ; + +binary_large_object_string_type + : BLOB type_length? + | BYTEA type_length? + ; + +numeric_type + : exact_numeric_type | approximate_numeric_type + ; + +exact_numeric_type + : NUMERIC (precision_param)? + | DECIMAL (precision_param)? + | DEC (precision_param)? + | INT1 + | TINYINT + | INT2 + | SMALLINT + | INT4 + | INT + | INTEGER + | INT8 + | BIGINT + ; + +approximate_numeric_type + : FLOAT (precision_param)? + | FLOAT4 + | REAL + | FLOAT8 + | DOUBLE + | DOUBLE PRECISION + ; + +precision_param + : LEFT_PAREN precision=NUMBER RIGHT_PAREN + | LEFT_PAREN precision=NUMBER COMMA scale=NUMBER RIGHT_PAREN + ; + +boolean_type + : BOOLEAN + | BOOL + ; + +datetime_type + : DATE + | INTERVAL + | TIME + | TIME WITH TIME ZONE + | TIMETZ + | TIMESTAMP + | TIMESTAMP WITH TIME ZONE + | TIMESTAMPTZ + ; + +bit_type + : BIT type_length? + | VARBIT type_length? + | BIT VARYING type_length? + ; + +binary_type + : BINARY type_length? + | BINARY VARYING type_length? + | VARBINARY type_length? + ; + +network_type + : INET4 + ; + +record_type + : RECORD table_elements + ; + +map_type + : MAP LTH key_type=data_type COMMA value_type=data_type GTH + ; + +/* +=============================================================================== + 6.3 <value_expression_primary> +=============================================================================== +*/ +value_expression_primary + : parenthesized_value_expression + | nonparenthesized_value_expression_primary + ; + +parenthesized_value_expression + : LEFT_PAREN value_expression RIGHT_PAREN + ; + +nonparenthesized_value_expression_primary + : unsigned_value_specification + | column_reference + | set_function_specification + | window_function + | scalar_subquery + | case_expression + | cast_specification + | routine_invocation + ; + +/* +=============================================================================== + 6.4 <unsigned value specification> +=============================================================================== +*/ + +unsigned_value_specification + : unsigned_literal + ; + +unsigned_numeric_literal + : NUMBER + | REAL_NUMBER + ; + +signed_numerical_literal + : sign? unsigned_numeric_literal + ; + +/* +=============================================================================== + 6.9 <set function specification> + + Invoke an SQL-invoked routine. +=============================================================================== +*/ +set_function_specification + : aggregate_function + ; + +aggregate_function + : COUNT LEFT_PAREN MULTIPLY RIGHT_PAREN + | general_set_function filter_clause? + ; + +general_set_function + : set_function_type LEFT_PAREN set_qualifier? value_expression RIGHT_PAREN + ; + +set_function_type + : AVG + | MAX + | MIN + | SUM + | EVERY + | ANY + | SOME + | COUNT + | STDDEV_POP + | STDDEV_SAMP + | VAR_SAMP + | VAR_POP + | COLLECT + | FUSION + | INTERSECTION + ; + +filter_clause + : FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN + ; + +grouping_operation + : GROUPING LEFT_PAREN column_reference_list RIGHT_PAREN + ; + +/* +=============================================================================== + 6.10 window function +=============================================================================== +*/ + +window_function + : window_function_type OVER window_name_or_specification + ; + +window_function_type + : rank_function_type LEFT_PAREN RIGHT_PAREN + | ROW_NUMBER LEFT_PAREN RIGHT_PAREN + | aggregate_function + | FIRST_VALUE LEFT_PAREN column_reference RIGHT_PAREN + | LAST_VALUE LEFT_PAREN column_reference RIGHT_PAREN + | LAG LEFT_PAREN column_reference ( COMMA numeric_value_expression ( COMMA common_value_expression )? )? RIGHT_PAREN + | LEAD LEFT_PAREN column_reference ( COMMA numeric_value_expression ( COMMA common_value_expression )? )? RIGHT_PAREN + ; + +rank_function_type + : RANK | DENSE_RANK | PERCENT_RANK | CUME_DIST + ; + + +window_name_or_specification + : window_name + | window_specification + ; + +/* +=============================================================================== + 6.11 <case expression> +=============================================================================== +*/ + +case_expression + : case_specification + ; + +case_abbreviation + : NULLIF LEFT_PAREN numeric_value_expression COMMA boolean_value_expression RIGHT_PAREN + | COALESCE LEFT_PAREN numeric_value_expression ( COMMA boolean_value_expression )+ RIGHT_PAREN + ; + +case_specification + : simple_case + | searched_case + ; + +simple_case + : CASE boolean_value_expression ( simple_when_clause )+ ( else_clause )? END + ; + +searched_case + : CASE (searched_when_clause)+ (else_clause)? END + ; + +simple_when_clause : WHEN search_condition THEN result ; + +searched_when_clause + : WHEN c=search_condition THEN r=result + ; + +else_clause + : ELSE r=result + ; + +result + : value_expression | NULL + ; + +/* +=============================================================================== + 6.12 <cast specification> +=============================================================================== +*/ + +cast_specification + : CAST LEFT_PAREN cast_operand AS cast_target RIGHT_PAREN + ; + +cast_operand + : value_expression + ; + +cast_target + : data_type + ; + +/* +=============================================================================== + 6.25 <value expression> +=============================================================================== +*/ +value_expression + : common_value_expression + | row_value_expression + | boolean_value_expression + ; + +common_value_expression + : numeric_value_expression + | string_value_expression + | datetime_value_expression + | NULL + ; + +/* +=============================================================================== + 6.26 <numeric value expression> + + Specify a comparison of two row values. +=============================================================================== +*/ + +numeric_value_expression + : left=term ((PLUS|MINUS) right=term)* + ; + +term + : left=factor ((MULTIPLY|DIVIDE|MODULAR) right=factor)* + ; + +factor + : (sign)? numeric_primary + ; + +array + : LEFT_PAREN numeric_value_expression (COMMA numeric_value_expression )* RIGHT_PAREN + ; + +numeric_primary + : value_expression_primary (CAST_EXPRESSION cast_target)* + | numeric_value_function + ; + +sign + : PLUS | MINUS + ; + +/* +=============================================================================== + 6.27 <numeric value function> +=============================================================================== +*/ + +numeric_value_function + : extract_expression + | datetime_value_function + ; + +extract_expression + : EXTRACT LEFT_PAREN extract_field_string=extract_field FROM extract_source RIGHT_PAREN + ; + +extract_field + : primary_datetime_field + | time_zone_field + | extended_datetime_field + ; + +time_zone_field + : TIMEZONE | TIMEZONE_HOUR | TIMEZONE_MINUTE + ; + +extract_source + : datetime_value_expression + ; + +/* +=============================================================================== + 6.28 <string value expression> +=============================================================================== +*/ + +string_value_expression + : character_value_expression + ; + +character_value_expression + : character_factor (CONCATENATION_OPERATOR character_factor)* + ; + +character_factor + : character_primary + ; + +character_primary + : value_expression_primary + | string_value_function + ; + +/* +=============================================================================== + 6.29 <string value function> +=============================================================================== +*/ + +string_value_function + : trim_function + ; + +trim_function + : TRIM LEFT_PAREN trim_operands RIGHT_PAREN + ; + +trim_operands + : ((trim_specification)? (trim_character=character_value_expression)? FROM)? trim_source=character_value_expression + | trim_source=character_value_expression COMMA trim_character=character_value_expression + ; + +trim_specification + : LEADING | TRAILING | BOTH + ; + +/* +=============================================================================== + 6.30 <datetime_value_expression> +=============================================================================== +*/ +datetime_value_expression + : datetime_term + ; +datetime_term + : datetime_factor + ; + +datetime_factor + : datetime_primary + ; + +datetime_primary + : value_expression_primary + | datetime_value_function + ; + +/* +=============================================================================== + 6.31 <datetime_value_function> +=============================================================================== +*/ + +datetime_value_function + : current_date_value_function + | current_time_value_function + | current_timestamp_value_function + ; + +current_date_value_function + : CURRENT_DATE + | CURRENT_DATE LEFT_PAREN RIGHT_PAREN + ; + +current_time_value_function + : CURRENT_TIME + | CURRENT_TIME LEFT_PAREN RIGHT_PAREN + ; + +current_timestamp_value_function + : CURRENT_TIMESTAMP + ; + +/* +=============================================================================== + 6.34 <boolean value expression> +=============================================================================== +*/ + +boolean_value_expression + : or_predicate + ; + +or_predicate + : and_predicate (OR or_predicate)* + ; + +and_predicate + : boolean_factor (AND and_predicate)* + ; + +boolean_factor + : boolean_test + | NOT boolean_test + ; + +boolean_test + : boolean_primary is_clause? + ; + +is_clause + : IS NOT? t=truth_value + ; + +truth_value + : TRUE | FALSE | UNKNOWN + ; + +boolean_primary + : predicate + | boolean_predicand + ; + +boolean_predicand + : parenthesized_boolean_value_expression + | nonparenthesized_value_expression_primary + ; + +parenthesized_boolean_value_expression + : LEFT_PAREN boolean_value_expression RIGHT_PAREN + ; + +/* +=============================================================================== + 7.2 <row value expression> +=============================================================================== +*/ +row_value_expression + : row_value_special_case + | explicit_row_value_constructor + ; + +row_value_special_case + : nonparenthesized_value_expression_primary + ; + +explicit_row_value_constructor + : NULL + ; + +row_value_predicand + : row_value_special_case + | row_value_constructor_predicand + ; + +row_value_constructor_predicand + : common_value_expression + | boolean_predicand +// | explicit_row_value_constructor + ; + +/* +=============================================================================== + 7.4 <table expression> +=============================================================================== +*/ + +table_expression + : from_clause + where_clause? + groupby_clause? + having_clause? + orderby_clause? + window_clause? + limit_clause? + ; + +/* +=============================================================================== + 7.5 <from clause> +=============================================================================== +*/ + +from_clause + : FROM table_reference_list + ; + +table_reference_list + :table_reference (COMMA table_reference)* + ; + +/* +=============================================================================== + 7.6 <table reference> +=============================================================================== +*/ + +table_reference + : joined_table + | table_primary + ; + +/* +=============================================================================== + 7.7 <joined table> +=============================================================================== +*/ + +joined_table + : table_primary joined_table_primary+ + ; + +joined_table_primary + : CROSS JOIN right=table_primary + | (t=join_type)? JOIN right=table_primary s=join_specification + | NATURAL (t=join_type)? JOIN right=table_primary + | UNION JOIN right=table_primary + ; + +cross_join + : CROSS JOIN r=table_primary + ; + +qualified_join + : (t=join_type)? JOIN r=table_primary s=join_specification + ; + +natural_join + : NATURAL (t=join_type)? JOIN r=table_primary + ; + +union_join + : UNION JOIN r=table_primary + ; + +join_type + : INNER + | t=outer_join_type + ; + +outer_join_type + : outer_join_type_part2 OUTER? + ; + +outer_join_type_part2 + : LEFT + | RIGHT + | FULL + ; + +join_specification + : join_condition + | named_columns_join + ; + +join_condition + : ON search_condition + ; + +named_columns_join + : USING LEFT_PAREN f=column_reference_list RIGHT_PAREN + ; + +table_primary + : table_or_query_name ((AS)? alias=identifier)? (LEFT_PAREN column_name_list RIGHT_PAREN)? + | derived_table (AS)? name=identifier (LEFT_PAREN column_name_list RIGHT_PAREN)? + ; + +column_name_list + : identifier ( COMMA identifier )* + ; + +derived_table + : table_subquery + ; + +/* +=============================================================================== + 7.8 <where clause> +=============================================================================== +*/ +where_clause + : WHERE search_condition + ; + +search_condition + : value_expression // instead of boolean_value_expression, we use value_expression for more flexibility. + ; + +/* +=============================================================================== + 7.9 <group by clause> +=============================================================================== +*/ +groupby_clause + : GROUP BY g=grouping_element_list + ; + +grouping_element_list + : grouping_element (COMMA grouping_element)* + ; + +grouping_element + : rollup_list + | cube_list + | empty_grouping_set + | ordinary_grouping_set + ; + +ordinary_grouping_set + : row_value_predicand + | LEFT_PAREN row_value_predicand_list RIGHT_PAREN + ; + +ordinary_grouping_set_list + : ordinary_grouping_set (COMMA ordinary_grouping_set)* + ; + +rollup_list + : ROLLUP LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN + ; + +cube_list + : CUBE LEFT_PAREN c=ordinary_grouping_set_list RIGHT_PAREN + ; + +empty_grouping_set + : LEFT_PAREN RIGHT_PAREN + ; + +having_clause + : HAVING boolean_value_expression + ; + +row_value_predicand_list + : row_value_predicand (COMMA row_value_predicand)* + ; + + + /* + =============================================================================== + 7.11 <window clause> (p331) + =============================================================================== + */ + +window_clause + : WINDOW window_definition_list; + +window_definition_list + : window_definition (COMMA window_definition)* + ; + +window_definition + : window_name AS window_specification + ; + +window_name + : identifier + ; + +window_specification + : LEFT_PAREN window_specification_details RIGHT_PAREN + ; + +window_specification_details + : (existing_window_name)? (window_partition_clause)? (window_order_clause)? (window_frame_clause)? + ; + +existing_window_name + : window_name + ; + +window_partition_clause + : PARTITION BY row_value_predicand_list + ; + +window_order_clause + : orderby_clause + ; + +window_frame_clause + : window_frame_units window_frame_extent (window_frame_exclusion)? + ; + +window_frame_units + : ROWS | RANGE + ; + +window_frame_extent + : window_frame_start_bound + | window_frame_between + ; + +window_frame_start_bound + : UNBOUNDED PRECEDING + | unsigned_value_specification PRECEDING // window_frame_preceding + | CURRENT ROW + ; + +window_frame_between + : BETWEEN bound1=window_frame_start_bound AND bound2=window_frame_end_bound + ; + +window_frame_end_bound + : UNBOUNDED FOLLOWING + | unsigned_value_specification FOLLOWING // window_frame_following FOLLOWING + | CURRENT ROW + ; + +window_frame_exclusion + : EXCLUDE CURRENT ROW + | EXCLUDE GROUP + | EXCLUDE TIES + | EXCLUDE NO OTHERS + ; + +/* +=============================================================================== + 7.13 <query expression> +=============================================================================== +*/ +query_expression + : query_expression_body + ; + +query_expression_body + : non_join_query_expression + | joined_table + ; + +non_join_query_expression + : (non_join_query_term + | joined_table (UNION | EXCEPT) (ALL|DISTINCT)? query_term) + ((UNION | EXCEPT) (ALL|DISTINCT)? query_term)* + ; + +query_term + : non_join_query_term + | joined_table + ; + +non_join_query_term + : ( non_join_query_primary + | joined_table INTERSECT (ALL|DISTINCT)? query_primary) + (INTERSECT (ALL|DISTINCT)? query_primary)* + ; + +query_primary + : non_join_query_primary + | joined_table + ; + +non_join_query_primary + : simple_table + | LEFT_PAREN non_join_query_expression RIGHT_PAREN + ; + +simple_table + : query_specification + | explicit_table + ; + +explicit_table + : TABLE table_or_query_name + ; + +table_or_query_name + : table_name + | identifier + ; + +table_name + : identifier (DOT identifier ( DOT identifier)? )? + ; + +column_name + : identifier + ; + +query_specification + : SELECT set_qualifier? select_list table_expression? + ; + +select_list + : select_sublist (COMMA select_sublist)* + ; + +select_sublist + : derived_column + | qualified_asterisk + ; + +derived_column + : value_expression as_clause? + ; + +qualified_asterisk + : (tb_name=identifier DOT)? MULTIPLY + ; + +set_qualifier + : DISTINCT + | ALL + ; + +column_reference + : identifier (DOT identifier)* + ; + +as_clause + : (AS)? identifier + ; + +column_reference_list + : column_reference (COMMA column_reference)* + ; + +/* +============================================================================================== + 7.15 <subquery> + + Specify a scalar value, a row, or a table derived from a query_expression . +============================================================================================== +*/ + +scalar_subquery + : subquery + ; + +row_subquery + : subquery + ; + +table_subquery + : subquery + ; + +subquery + : LEFT_PAREN query_expression RIGHT_PAREN + ; + +/* +=============================================================================== + 8.1 <predicate> +=============================================================================== +*/ + +predicate + : comparison_predicate + | between_predicate + | in_predicate + | pattern_matching_predicate // like predicate and other similar predicates + | null_predicate + | exists_predicate + ; + +/* +=============================================================================== + 8.2 <comparison predicate> + + Specify a comparison of two row values. +=============================================================================== +*/ +comparison_predicate + : left=row_value_predicand c=comp_op right=row_value_predicand + ; + +comp_op + : EQUAL + | NOT_EQUAL + | LTH + | LEQ + | GTH + | GEQ + ; + +/* +=============================================================================== + 8.3 <between predicate> +=============================================================================== +*/ + +between_predicate + : predicand=row_value_predicand between_predicate_part_2 + ; + +between_predicate_part_2 + : (NOT)? BETWEEN (ASYMMETRIC | SYMMETRIC)? begin=row_value_predicand AND end=row_value_predicand + ; + + +/* +=============================================================================== + 8.4 <in predicate> +=============================================================================== +*/ + +in_predicate + : predicand=numeric_value_expression NOT? IN in_predicate_value + ; + +in_predicate_value + : table_subquery + | LEFT_PAREN in_value_list RIGHT_PAREN + ; + +in_value_list + : row_value_predicand ( COMMA row_value_predicand )* + ; + +/* +=============================================================================== + 8.5, 8.6 <pattern matching predicate> + + Specify a pattern-matching comparison. +=============================================================================== +*/ + +pattern_matching_predicate + : f=row_value_predicand pattern_matcher s=Character_String_Literal + ; + +pattern_matcher + : NOT? negativable_matcher + | regex_matcher + ; + +negativable_matcher + : LIKE + | ILIKE + | SIMILAR TO + | REGEXP + | RLIKE + ; + +regex_matcher + : Similar_To + | Not_Similar_To + | Similar_To_Case_Insensitive + | Not_Similar_To_Case_Insensitive + ; + +/* +=============================================================================== + 8.7 <null predicate> + + Specify a test for a null value. +=============================================================================== +*/ + +null_predicate + : predicand=row_value_predicand IS (n=NOT)? NULL + ; + +/* +============================================================================================== + 8.8 <quantified comparison predicate> + + Specify a quantified comparison. +============================================================================================== +*/ + +quantified_comparison_predicate + : l=numeric_value_expression c=comp_op q=quantifier s=table_subquery + ; + +quantifier : all | some ; + +all : ALL; + +some : SOME | ANY; + +/* +============================================================================================== + 8.9 <exists predicate> + + Specify a test for a non_empty set. +============================================================================================== +*/ + +exists_predicate + : NOT? EXISTS s=table_subquery + ; + + +/* +============================================================================================== + 8.10 <unique predicate> + + Specify a test for the absence of duplicate rows +============================================================================================== +*/ + +unique_predicate + : UNIQUE s=table_subquery + ; + +/* +=============================================================================== + 10.1 <interval qualifier> + + Specify the precision of an interval data type. +=============================================================================== +*/ + +primary_datetime_field + : non_second_primary_datetime_field + | SECOND + ; + +non_second_primary_datetime_field + : YEAR | MONTH | DAY | HOUR | MINUTE + ; + +extended_datetime_field + : CENTURY | DECADE | DOW | DOY | EPOCH | ISODOW | ISOYEAR | MICROSECONDS | MILLENNIUM | MILLISECONDS | QUARTER | WEEK + ; + +/* +=============================================================================== + 10.4 <routine invocation> + + Invoke an SQL-invoked routine. +=============================================================================== +*/ + +routine_invocation + : function_name LEFT_PAREN sql_argument_list? RIGHT_PAREN + ; + +function_names_for_reserved_words + : LEFT + | RIGHT + ; + +function_name + : identifier + | function_names_for_reserved_words + ; + +sql_argument_list + : value_expression (COMMA value_expression)* + ; + +/* +=============================================================================== + 14.1 <declare cursor> +=============================================================================== +*/ + +orderby_clause + : ORDER BY sort_specifier_list + ; + +sort_specifier_list + : sort_specifier (COMMA sort_specifier)* + ; + +sort_specifier + : key=row_value_predicand order=order_specification? null_order=null_ordering? + ; + +order_specification + : ASC + | DESC + ; + +limit_clause + : LIMIT e=numeric_value_expression + ; + +null_ordering + : NULL FIRST + | NULL LAST + ; + +/* +=============================================================================== + 14.8 <insert statement> +=============================================================================== +*/ + +insert_statement + : INSERT (OVERWRITE)? INTO table_name (LEFT_PAREN column_reference_list RIGHT_PAREN)? query_expression + | INSERT (OVERWRITE)? INTO LOCATION path=Character_String_Literal (USING storage_type=identifier (param_clause)?)? query_expression + ; + +/* +=============================================================================== + <alter table> +=============================================================================== +*/ + +alter_tablespace_statement + : ALTER TABLESPACE space_name=identifier LOCATION uri=Character_String_Literal + ; + +alter_table_statement + : ALTER TABLE table_name RENAME TO table_name + | ALTER TABLE table_name RENAME COLUMN column_name TO column_name + | ALTER TABLE table_name ADD COLUMN field_element + | ALTER TABLE table_name ADD (if_not_exists)? PARTITION LEFT_PAREN partition_column_value_list RIGHT_PAREN (LOCATION path=Character_String_Literal)? + | ALTER TABLE table_name DROP (if_exists)? PARTITION LEFT_PAREN partition_column_value_list RIGHT_PAREN (PURGE)? + | ALTER TABLE table_name SET PROPERTY property_list + ; + +partition_column_value_list + : partition_column_value (COMMA partition_column_value)* + ; + +partition_column_value + : identifier EQUAL row_value_predicand + ; + +property_list + : property (COMMA property)* + ; + +property + : key=Character_String_Literal EQUAL value=Character_String_Literal + ;
