This is an automated email from the ASF dual-hosted git repository. yamamuro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push: new 967e4cb [SPARK-26215][SQL] Define reserved/non-reserved keywords based on the ANSI SQL standard 967e4cb is described below commit 967e4cb0112e2dd94bc75251c23bb9e854ee97a0 Author: Takeshi Yamamuro <yamam...@apache.org> AuthorDate: Sat Feb 23 08:38:47 2019 +0900 [SPARK-26215][SQL] Define reserved/non-reserved keywords based on the ANSI SQL standard ## What changes were proposed in this pull request? This pr targeted to define reserved/non-reserved keywords for Spark SQL based on the ANSI SQL standards and the other database-like systems (e.g., PostgreSQL). We assume that they basically follow the ANSI SQL-2011 standard, but it is slightly different between each other. Therefore, this pr documented all the keywords in `docs/sql-reserved-and-non-reserved-key-words.md`. NOTE: This pr only added a small set of keywords as reserved ones and these keywords are reserved in all the ANSI SQL standards (SQL-92, SQL-99, SQL-2003, SQL-2008, SQL-2011, and SQL-2016) and PostgreSQL. This is because there is room to discuss which keyword should be reserved or not, .e.g., interval units (day, hour, minute, second, ...) are reserved in the ANSI SQL standards though, they are not reserved in PostgreSQL. Therefore, we need more researches about the other database-lik [...] References: - The reserved/non-reserved SQL keywords in the ANSI SQL standards: https://developer.mimer.com/wp-content/uploads/2018/05/Standard-SQL-Reserved-Words-Summary.pdf - SQL Key Words in PostgreSQL: https://www.postgresql.org/docs/current/sql-keywords-appendix.html ## How was this patch tested? Added tests in `TableIdentifierParserSuite`. Closes #23259 from maropu/SPARK-26215-WIP. Authored-by: Takeshi Yamamuro <yamam...@apache.org> Signed-off-by: Takeshi Yamamuro <yamam...@apache.org> --- docs/_data/menu-sql.yaml | 2 + docs/sql-reserved-and-non-reserved-keywords.md | 574 +++++++++++++++++++++ .../apache/spark/sql/catalyst/parser/SqlBase.g4 | 127 +++-- .../spark/sql/catalyst/parser/ParseDriver.scala | 2 + .../org/apache/spark/sql/internal/SQLConf.scala | 8 + 5 files changed, 675 insertions(+), 38 deletions(-) diff --git a/docs/_data/menu-sql.yaml b/docs/_data/menu-sql.yaml index cd065ea..9bbb115 100644 --- a/docs/_data/menu-sql.yaml +++ b/docs/_data/menu-sql.yaml @@ -70,6 +70,8 @@ url: sql-migration-guide-upgrade.html - text: Compatibility with Apache Hive url: sql-migration-guide-hive-compatibility.html + - text: SQL Reserved/Non-Reserved Keywords + url: sql-reserved-and-non-reserved-keywords.html - text: Reference url: sql-reference.html subitems: diff --git a/docs/sql-reserved-and-non-reserved-keywords.md b/docs/sql-reserved-and-non-reserved-keywords.md new file mode 100644 index 0000000..321fb3f --- /dev/null +++ b/docs/sql-reserved-and-non-reserved-keywords.md @@ -0,0 +1,574 @@ +--- +layout: global +title: SQL Reserved/Non-Reserved Keywords +displayTitle: SQL Reserved/Non-Reserved Keywords +--- + +In Spark SQL, there are 2 kinds of keywords: non-reserved and reserved. Non-reserved keywords have a +special meaning only in particular contexts and can be used as identifiers (e.g., table names, view names, +column names, column aliases, table aliases) in other contexts. Reserved keywords can't be used as +table alias, but can be used as other identifiers. + +The list of reserved and non-reserved keywords can change according to the config +`spark.sql.parser.ansi.enabled`, which is false by default. + +<table class="table"> + <tr><th rowspan="2" style="vertical-align: middle;"><b>Keyword</b></th><th colspan="2"><b>Spark SQL</b></th><th rowspan="2" style="vertical-align: middle;"><b>SQL-2011</b></th></tr> + <tr><th><b>ANSI mode</b></th><th><b>default mode</b></th></tr> + <tr><td>ABS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ABSOLUTE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ACOS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ACTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ADD</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>AFTER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ALL</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ALLOCATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ALTER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ANALYZE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>AND</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ANTI</td><td>reserved</td><td>reserved</td><td>non-reserved</td></tr> + <tr><td>ANY</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ARE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ARCHIVE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ARRAY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ARRAY_AGG</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ARRAY_MAX_CARDINALITY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>AS</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ASC</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ASENSITIVE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ASIN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ASSERTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ASYMMETRIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>AT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ATAN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ATOMIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>AUTHORIZATION</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>AVG</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BEFORE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BEGIN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BEGIN_FRAME</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BEGIN_PARTITION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BETWEEN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BIGINT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BINARY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BIT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BIT_LENGTH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BLOB</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BOOLEAN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BOTH</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>BREADTH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BUCKET</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BUCKETS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>BY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CACHE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CALL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CALLED</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CARDINALITY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CASCADE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CASCADED</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CASE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CAST</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CATALOG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CEIL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CEILING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CHANGE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CHAR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CHAR_LENGTH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CHARACTER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CHARACTER_LENGTH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CHECK</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CLASSIFIER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CLEAR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CLOB</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CLOSE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CLUSTER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CLUSTERED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COALESCE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CODEGEN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COLLATE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COLLATION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COLLECT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COLLECTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COLUMN</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COLUMNS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COMMENT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COMMIT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COMPACT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COMPACTIONS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COMPUTE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONCATENATE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONDITION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CONNECT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONNECTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONSTRAINT</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CONSTRAINTS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONSTRUCTOR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONTAINS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONTINUE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CONVERT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COPY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>CORR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CORRESPONDING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COSH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COST</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>COUNT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COVAR_POP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>COVAR_SAMP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CREATE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CROSS</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>CUBE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CUME_DIST</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_CATALOG</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_DATE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_DEFAULT_TRANSFORM_GROUP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_PATH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_ROLE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_ROW</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_SCHEMA</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_TIME</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_TIMESTAMP</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_TRANSFORM_GROUP_FOR_TYPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURRENT_USER</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CURSOR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>CYCLE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DATA</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DATABASE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DATABASES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DAY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DBPROPERTIES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DEALLOCATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DEC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DECFLOAT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DECIMAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DECLARE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DEFAULT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DEFERRABLE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DEFERRED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DEFINE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DEFINED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DELETE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DELIMITED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DENSE_RANK</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DEPTH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DEREF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DESC</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DESCRIBE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DESCRIPTOR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DETERMINISTIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DFS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DIAGNOSTICS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DIRECTORIES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DIRECTORY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DISCONNECT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DISTINCT</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DISTRIBUTE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DIV</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DO</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DOMAIN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>DOUBLE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DROP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>DYNAMIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EACH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ELEMENT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ELSE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ELSEIF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EMPTY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>END</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>END_FRAME</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>END_PARTITION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EQUALS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ESCAPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ESCAPED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EVERY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EXCEPT</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>EXCEPTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXCHANGE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXEC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EXECUTE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EXISTS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EXIT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXP</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXPLAIN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXPORT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXTENDED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>EXTERNAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>EXTRACT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FALSE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FETCH</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FIELDS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FILEFORMAT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FILTER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FIRST</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FIRST_VALUE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FLOAT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FOLLOWING</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FOR</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FOREIGN</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FORMAT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FORMATTED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FOUND</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FRAME_ROW</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FREE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FROM</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FULL</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>FUNCTION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>FUNCTIONS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>FUSION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>GENERAL</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>GET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>GLOBAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>GO</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>GOTO</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>GRANT</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>GROUP</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>GROUPING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>GROUPS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>HANDLER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>HAVING</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>HOLD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>HOUR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>IDENTITY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>IF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>IGNORE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>IMMEDIATE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>IMPORT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>IN</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INDICATOR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INDEX</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INDEXES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INITIAL</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INITIALLY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INNER</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>INOUT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INPATH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INPUT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INPUTFORMAT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>INSENSITIVE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INSERT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INTEGER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INTERSECT</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>INTERSECTION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INTERVAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>INTO</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>IS</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ISOLATION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ITEMS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ITERATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>JOIN</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>JSON_ARRAY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_ARRAYAGG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_EXISTS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_OBJECT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_OBJECTAGG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_QUERY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_TABLE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_TABLE_PRIMITIVE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>JSON_VALUE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>KEY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>KEYS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LAG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LANGUAGE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LARGE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LAST</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LAST_VALUE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LATERAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LAZY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LEAD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LEADING</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LEAVE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LEFT</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>LEVEL</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LIKE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LIKE_REGEX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LIMIT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LINES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LIST</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LISTAGG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LOAD</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOCAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LOCALTIME</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LOCALTIMESTAMP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LOCATION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOCATOR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOCK</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOCKS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOG</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOG10</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOGICAL</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>LOOP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>LOWER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MACRO</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MAP</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MATCH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MATCH_NUMBER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MATCH_RECOGNIZE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MATCHES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MAX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MEMBER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MERGE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>METHOD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MIN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MINUS</td><td>reserved</td><td>reserved</td><td>non-reserved</td></tr> + <tr><td>MINUTE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MOD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MODIFIES</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MODULE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MONTH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>MSCK</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>MULTISET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NAMES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>NATIONAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NATURAL</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>NCHAR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NCLOB</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NEW</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NEXT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>NO</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NONE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NORMALIZE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NOT</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NTH_VALUE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NTILE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NULL</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NULLS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>NULLIF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>NUMERIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OBJECT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OCCURRENCES_REGEX</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OCTET_LENGTH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OFFSET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OLD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OMIT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ON</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>ONE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ONLY</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OPEN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OPTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OPTIONS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OR</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ORDER</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ORDINALITY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OUT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OUTER</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OUTPUT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OUTPUTFORMAT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OVER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>OVERLAPS</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OVERLAY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>OVERWRITE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PAD</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PARAMETER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PARTIAL</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PARTITION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PARTITIONED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PARTITIONS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PATH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PATTERN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PERCENT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PERCENT_RANK</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PERCENTILE_CONT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PERCENTILE_DISC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PERCENTLIT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PERIOD</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PIVOT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PORTION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>POSITION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>POSITION_REGEX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>POWER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PRECEDES</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PRECEDING</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PRECISION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PREPARE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PRESERVE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PRIMARY</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PRINCIPALS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PRIOR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PRIVILEGES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PROCEDURE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>PTF</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PUBLIC</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>PURGE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RANGE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RANK</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>READ</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>READS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RECORDREADER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RECORDWRITER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RECURSIVE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RECOVER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>REDUCE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>REF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REFERENCES</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REFERENCING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REFRESH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>REGR_AVGX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_AVGY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_COUNT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_INTERCEPT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_R2</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_SLOPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_SXX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_SXY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REGR_SYY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RELATIVE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RELEASE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RENAME</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>REPAIR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>REPEAT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REPLACE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RESET</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RESIGNAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RESTRICT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>RESULT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RETURN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RETURNS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>REVOKE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RIGHT</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>RLIKE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ROLE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ROLES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ROLLBACK</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ROLLUP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ROUTINE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>ROW</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ROW_NUMBER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ROWS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>RUNNING</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SAVEPOINT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SCHEMA</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SCOPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SCROLL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SEARCH</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SECOND</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SECTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SEEK</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SELECT</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SEMI</td><td>reserved</td><td>reserved</td><td>non-reserved</td></tr> + <tr><td>SENSITIVE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SEPARATED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SERDE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SERDEPROPERTIES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SESSION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SESSION_USER</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SETS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SHOW</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SIGNAL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SIMILAR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SIN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SINH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SIZE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SKIP</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SKEWED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SMALLINT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SOME</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SORT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SORTED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SPACE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SPECIFIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SPECIFICTYPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SQL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SQLCODE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SQLERROR</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SQLEXCEPTION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SQLSTATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SQLWARNING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SQRT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>START</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>STATE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>STATIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>STATISTICS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>STDDEV_POP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>STDDEV_SAMP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>STORED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>STRATIFY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>STRUCT</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SUBMULTISET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SUBSET</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>SUBSTRING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SUBSTRING_REGEX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SUCCEEDS</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SUM</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SYMMETRIC</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SYSTEM</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SYSTEM_TIME</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>SYSTEM_USER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TABLE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TABLES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TABLESAMPLE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TAN</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TANH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TBLPROPERTIES</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TEMPORARY</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TERMINATED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>THEN</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TIME</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TIMESTAMP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TIMEZONE_HOUR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TIMEZONE_MINUTE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TO</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TOUCH</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TRAILING</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRANSACTION</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TRANSACTIONS</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TRANSFORM</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>TRANSLATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRANSLATE_REGEX</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRANSLATION</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TREAT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRIGGER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRIM</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRIM_ARRAY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRUE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>TRUNCATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UESCAPE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UNARCHIVE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNBOUNDED</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNCACHE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNDER</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNDO</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UNION</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>UNIQUE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UNKNOWN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UNLOCK</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNNEST</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UNSET</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>UNTIL</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UPDATE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>UPPER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>USAGE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>USE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>USER</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>USING</td><td>reserved</td><td>reserved</td><td>reserved</td></tr> + <tr><td>VALUE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VALUES</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VALUE_OF</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VAR_POP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VAR_SAMP</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VARBINARY</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VARCHAR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VARYING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VERSIONING</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>VIEW</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>WHEN</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WHENEVER</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WHERE</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WHILE</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WIDTH_BUCKET</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WINDOW</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WITH</td><td>reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WITHIN</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WITHOUT</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>WORK</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>WRITE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> + <tr><td>YEAR</td><td>non-reserved</td><td>non-reserved</td><td>reserved</td></tr> + <tr><td>ZONE</td><td>non-reserved</td><td>non-reserved</td><td>non-reserved</td></tr> +</table> diff --git a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 index b39681d..69deeb5 100644 --- a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 +++ b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 @@ -44,6 +44,11 @@ grammar SqlBase; return true; } } + + /** + * When true, ANSI SQL parsing mode is enabled. + */ + public boolean ansi = false; } singleStatement @@ -720,14 +725,15 @@ qualifiedName identifier : strictIdentifier - | ANTI | FULL | INNER | LEFT | SEMI | RIGHT | NATURAL | JOIN | CROSS | ON - | UNION | INTERSECT | EXCEPT | SETMINUS + | {ansi}? ansiReserved + | {!ansi}? defaultReserved ; strictIdentifier - : IDENTIFIER #unquotedIdentifier - | quotedIdentifier #quotedIdentifierAlternative - | nonReserved #unquotedIdentifier + : IDENTIFIER #unquotedIdentifier + | quotedIdentifier #quotedIdentifierAlternative + | {ansi}? ansiNonReserved #unquotedIdentifier + | {!ansi}? nonReserved #unquotedIdentifier ; quotedIdentifier @@ -744,40 +750,67 @@ number | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral ; +// NOTE: You must follow a rule below when you add a new ANTLR taken in this file: +// - All the ANTLR tokens = UNION(`ansiReserved`, `ansiNonReserved`) = UNION(`defaultReserved`, `nonReserved`) +// +// Let's say you add a new token `NEWTOKEN` and this is not reserved regardless of a `spark.sql.parser.ansi.enabled` +// value. In this case, you must add a token `NEWTOKEN` in both `ansiNonReserved` and `nonReserved`. + +// The list of the reserved keywords when `spark.sql.parser.ansi.enabled` is true. Currently, we only reserve +// the ANSI keywords that almost all the ANSI SQL standards (SQL-92, SQL-99, SQL-2003, SQL-2008, SQL-2011, +// and SQL-2016) and PostgreSQL reserve. +ansiReserved + : ALL | AND | ANTI | ANY | AS | AUTHORIZATION | BOTH | CASE | CAST | CHECK | COLLATE | COLUMN | CONSTRAINT | CREATE + | CROSS | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | DISTINCT | ELSE | END | EXCEPT | FALSE + | FETCH | FOR | FOREIGN | FROM | FULL | GRANT | GROUP | HAVING | IN | INNER | INTERSECT | INTO | JOIN | IS + | LEADING | LEFT | NATURAL | NOT | NULL | ON | ONLY | OR | ORDER | OUTER | OVERLAPS | PRIMARY | REFERENCES | RIGHT + | SELECT | SEMI | SESSION_USER | SETMINUS | SOME | TABLE | THEN | TO | TRAILING | UNION | UNIQUE | USER | USING + | WHEN | WHERE | WITH + ; + + +// The list of the non-reserved keywords when `spark.sql.parser.ansi.enabled` is true. +ansiNonReserved + : ADD | AFTER | ALTER | ANALYZE | ARCHIVE | ARRAY | ASC | AT | BETWEEN | BUCKET | BUCKETS | BY | CACHE | CASCADE + | CHANGE | CLEAR | CLUSTER | CLUSTERED | CODEGEN | COLLECTION | COLUMNS | COMMENT | COMMIT | COMPACT | COMPACTIONS + | COMPUTE | CONCATENATE | COST | CUBE | CURRENT | DATA | DATABASE | DATABASES | DBPROPERTIES | DEFINED | DELETE + | DELIMITED | DESC | DESCRIBE | DFS | DIRECTORIES | DIRECTORY | DISTRIBUTE | DIV | DROP | ESCAPED | EXCHANGE + | EXISTS | EXPLAIN | EXPORT | EXTENDED | EXTERNAL | EXTRACT | FIELDS | FILEFORMAT | FIRST | FOLLOWING | FORMAT + | FORMATTED | FUNCTION | FUNCTIONS | GLOBAL | GROUPING | IF | IGNORE | IMPORT | INDEX | INDEXES | INPATH + | INPUTFORMAT | INSERT | INTERVAL | ITEMS | KEYS | LAST | LATERAL | LAZY | LIKE | LIMIT | LINES | LIST | LOAD + | LOCAL | LOCATION | LOCK | LOCKS | LOGICAL | MACRO | MAP | MSCK | NO | NULLS | OF | OPTION | OPTIONS | OUT + | OUTPUTFORMAT | OVER | OVERWRITE | PARTITION | PARTITIONED | PARTITIONS | PERCENT | PERCENTLIT | PIVOT | PRECEDING + | PRINCIPALS | PURGE | RANGE | RECORDREADER | RECORDWRITER | RECOVER | REDUCE | REFRESH | RENAME | REPAIR | REPLACE + | RESET | RESTRICT | REVOKE | RLIKE | ROLE | ROLES | ROLLBACK | ROLLUP | ROW | ROWS | SCHEMA | SEPARATED | SERDE + | SERDEPROPERTIES | SET | SETS | SHOW | SKEWED | SORT | SORTED | START | STATISTICS | STORED | STRATIFY | STRUCT + | TABLES | TABLESAMPLE | TBLPROPERTIES | TEMPORARY | TERMINATED | TOUCH | TRANSACTION | TRANSACTIONS | TRANSFORM + | TRUE | TRUNCATE | UNARCHIVE | UNBOUNDED | UNCACHE | UNLOCK | UNSET | USE | VALUES | VIEW | WINDOW + ; + +defaultReserved + : ANTI | CROSS | EXCEPT | FULL | INNER | INTERSECT | JOIN | LEFT | NATURAL | ON | RIGHT | SEMI | SETMINUS | UNION + | USING + ; + nonReserved - : SHOW | TABLES | COLUMNS | COLUMN | PARTITIONS | FUNCTIONS | DATABASES - | ADD - | OVER | PARTITION | RANGE | ROWS | PRECEDING | FOLLOWING | CURRENT | ROW | LAST | FIRST | AFTER - | MAP | ARRAY | STRUCT - | PIVOT | LATERAL | WINDOW | REDUCE | TRANSFORM | SERDE | SERDEPROPERTIES | RECORDREADER - | DELIMITED | FIELDS | TERMINATED | COLLECTION | ITEMS | KEYS | ESCAPED | LINES | SEPARATED - | EXTENDED | REFRESH | CLEAR | CACHE | UNCACHE | LAZY | GLOBAL | TEMPORARY | OPTIONS - | GROUPING | CUBE | ROLLUP - | EXPLAIN | FORMAT | LOGICAL | FORMATTED | CODEGEN | COST - | TABLESAMPLE | USE | TO | BUCKET | PERCENTLIT | OUT | OF - | SET | RESET - | VIEW | REPLACE - | IF - | POSITION - | EXTRACT - | NO | DATA - | START | TRANSACTION | COMMIT | ROLLBACK | IGNORE - | SORT | CLUSTER | DISTRIBUTE | UNSET | TBLPROPERTIES | SKEWED | STORED | DIRECTORIES | LOCATION - | EXCHANGE | ARCHIVE | UNARCHIVE | FILEFORMAT | TOUCH | COMPACT | CONCATENATE | CHANGE - | CASCADE | RESTRICT | BUCKETS | CLUSTERED | SORTED | PURGE | INPUTFORMAT | OUTPUTFORMAT - | DBPROPERTIES | DFS | TRUNCATE | COMPUTE | LIST - | STATISTICS | ANALYZE | PARTITIONED | EXTERNAL | DEFINED | RECORDWRITER - | REVOKE | GRANT | LOCK | UNLOCK | MSCK | REPAIR | RECOVER | EXPORT | IMPORT | LOAD | VALUES | COMMENT | ROLE - | ROLES | COMPACTIONS | PRINCIPALS | TRANSACTIONS | INDEX | INDEXES | LOCKS | OPTION | LOCAL | INPATH - | ASC | DESC | LIMIT | RENAME | SETS - | AT | NULLS | OVERWRITE | ALL | ANY | ALTER | AS | BETWEEN | BY | CREATE | DELETE - | DESCRIBE | DROP | EXISTS | FALSE | FOR | GROUP | IN | INSERT | INTO | IS |LIKE - | NULL | ORDER | OUTER | TABLE | TRUE | WITH | RLIKE - | AND | CASE | CAST | DISTINCT | DIV | ELSE | END | FUNCTION | INTERVAL | MACRO | OR | STRATIFY | THEN - | UNBOUNDED | WHEN - | DATABASE | SELECT | FROM | WHERE | HAVING | TO | TABLE | WITH | NOT - | DIRECTORY - | BOTH | LEADING | TRAILING + : ADD | AFTER | ALL | ALTER | ANALYZE | AND | ANY | ARCHIVE | ARRAY | AS | ASC | AT | AUTHORIZATION | BETWEEN + | BOTH | BUCKET | BUCKETS | BY | CACHE | CASCADE | CASE | CAST | CHANGE | CHECK | CLEAR | CLUSTER | CLUSTERED + | CODEGEN | COLLATE | COLLECTION | COLUMN | COLUMNS | COMMENT | COMMIT | COMPACT | COMPACTIONS | COMPUTE + | CONCATENATE | CONSTRAINT | COST | CREATE | CUBE | CURRENT | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP + | CURRENT_USER | DATA | DATABASE | DATABASES | DBPROPERTIES | DEFINED | DELETE | DELIMITED | DESC | DESCRIBE | DFS + | DIRECTORIES | DIRECTORY | DISTINCT | DISTRIBUTE | DIV | DROP | ELSE | END | ESCAPED | EXCHANGE | EXISTS | EXPLAIN + | EXPORT | EXTENDED | EXTERNAL | EXTRACT | FALSE | FETCH | FIELDS | FILEFORMAT | FIRST | FOLLOWING | FOR | FOREIGN + | FORMAT | FORMATTED | FROM | FUNCTION | FUNCTIONS | GLOBAL | GRANT | GROUP | GROUPING | HAVING | IF | IGNORE + | IMPORT | IN | INDEX | INDEXES | INPATH | INPUTFORMAT | INSERT | INTERVAL | INTO | IS | ITEMS | KEYS | LAST + | LATERAL | LAZY | LEADING | LIKE | LIMIT | LINES | LIST | LOAD | LOCAL | LOCATION | LOCK | LOCKS | LOGICAL | MACRO + | MAP | MSCK | NO | NOT | NULL | NULLS | OF | ONLY | OPTION | OPTIONS | OR | ORDER | OUT | OUTER | OUTPUTFORMAT + | OVER | OVERLAPS | OVERWRITE | PARTITION | PARTITIONED | PARTITIONS | PERCENTLIT | PIVOT | POSITION | PRECEDING + | PRIMARY | PRINCIPALS | PURGE | RANGE | RECORDREADER | RECORDWRITER | RECOVER | REDUCE | REFERENCES | REFRESH + | RENAME | REPAIR | REPLACE | RESET | RESTRICT | REVOKE | RLIKE | ROLE | ROLES | ROLLBACK | ROLLUP | ROW | ROWS + | SELECT | SEPARATED | SERDE | SERDEPROPERTIES | SESSION_USER | SET | SETS | SHOW | SKEWED | SOME | SORT | SORTED + | START | STATISTICS | STORED | STRATIFY | STRUCT | TABLE | TABLES | TABLESAMPLE | TBLPROPERTIES | TEMPORARY + | TERMINATED | THEN | TO | TOUCH | TRAILING | TRANSACTION | TRANSACTIONS | TRANSFORM | TRUE | TRUNCATE | UNARCHIVE + | UNBOUNDED | UNCACHE | UNLOCK | UNIQUE | UNSET | USE | USER | VALUES | VIEW | WHEN | WHERE | WINDOW | WITH ; SELECT: 'SELECT'; @@ -1014,6 +1047,24 @@ OPTION: 'OPTION'; ANTI: 'ANTI'; LOCAL: 'LOCAL'; INPATH: 'INPATH'; +AUTHORIZATION: 'AUTHORIZATION'; +CHECK: 'CHECK'; +COLLATE: 'COLLATE'; +CONSTRAINT: 'CONSTRAINT'; +CURRENT_DATE: 'CURRENT_DATE'; +CURRENT_TIME: 'CURRENT_TIME'; +CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; +CURRENT_USER: 'CURRENT_USER'; +FETCH: 'FETCH'; +FOREIGN: 'FOREIGN'; +ONLY: 'ONLY'; +OVERLAPS: 'OVERLAPS'; +PRIMARY: 'PRIMARY'; +REFERENCES: 'REFERENCES'; +SESSION_USER: 'SESSION_USER'; +SOME: 'SOME'; +UNIQUE: 'UNIQUE'; +USER: 'USER'; STRING : '\'' ( ~('\''|'\\') | ('\\' .) )* '\'' diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala index 7d8cb1f..446cb09 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala @@ -85,6 +85,7 @@ abstract class AbstractSqlParser extends ParserInterface with Logging { lexer.removeErrorListeners() lexer.addErrorListener(ParseErrorListener) lexer.legacy_setops_precedence_enbled = SQLConf.get.setOpsPrecedenceEnforced + lexer.ansi = SQLConf.get.ansiParserEnabled val tokenStream = new CommonTokenStream(lexer) val parser = new SqlBaseParser(tokenStream) @@ -92,6 +93,7 @@ abstract class AbstractSqlParser extends ParserInterface with Logging { parser.removeErrorListeners() parser.addErrorListener(ParseErrorListener) parser.legacy_setops_precedence_enbled = SQLConf.get.setOpsPrecedenceEnforced + parser.ansi = SQLConf.get.ansiParserEnabled try { try { diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala index 7f87546..bbb79cd 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala @@ -314,6 +314,12 @@ object SQLConf { .booleanConf .createWithDefault(true) + val ANSI_SQL_PARSER = + buildConf("spark.sql.parser.ansi.enabled") + .doc("When true, tries to conform to ANSI SQL syntax.") + .booleanConf + .createWithDefault(false) + val ESCAPED_STRING_LITERALS = buildConf("spark.sql.parser.escapedStringLiterals") .internal() .doc("When true, string literals (including regex patterns) remain escaped in our SQL " + @@ -1840,6 +1846,8 @@ class SQLConf extends Serializable with Logging { def constraintPropagationEnabled: Boolean = getConf(CONSTRAINT_PROPAGATION_ENABLED) + def ansiParserEnabled: Boolean = getConf(ANSI_SQL_PARSER) + def escapedStringLiterals: Boolean = getConf(ESCAPED_STRING_LITERALS) def fileCompressionFactor: Double = getConf(FILE_COMRESSION_FACTOR) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org