diff --git a/docs/sql-reserved-and-non-reserved-keywords.md b/docs/sql-keywords.md similarity index 95% rename from docs/sql-reserved-and-non-reserved-keywords.md rename to docs/sql-keywords.md index b1561fb593f35..5ba3ad8bd8ccb 100644 --- a/docs/sql-reserved-and-non-reserved-keywords.md +++ b/docs/sql-keywords.md @@ -1,16 +1,20 @@ --- layout: global -title: SQL Reserved/Non-Reserved Keywords -displayTitle: SQL Reserved/Non-Reserved Keywords +title: Spark SQL Keywords +displayTitle: Spark SQL 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. +When `spark.sql.parser.ansi.enabled` is true, Spark SQL has two kinds of keywords: +* Reserved keywords: Keywords that are reserved and can't be used as identifiers for table, view, column, function, alias, etc. +* Non-reserved keywords: Keywords that have a special meaning only in particular contexts and can be used as identifiers in other contexts. For example, `SELECT 1 WEEK` is an interval literal, but WEEK can be used as identifiers in other places. -The list of reserved and non-reserved keywords can change according to the config -`spark.sql.parser.ansi.enabled`, which is false by default. +When `spark.sql.parser.ansi.enabled` is false, Spark SQL has two kinds of keywords: +* Non-reserved keywords: Same definition as the one when `spark.sql.parser.ansi.enabled=true`. +* Strict-non-reserved keywords: A strict version of non-reserved keywords, which can not be used as table alias. + +By default `spark.sql.parser.ansi.enabled` is false. + +Below is a list of all the keywords in Spark SQL. @@ -26,7 +30,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -116,7 +120,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -185,7 +189,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -215,7 +219,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -244,7 +248,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -253,7 +257,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -261,7 +265,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -283,7 +287,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -332,7 +336,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -354,7 +358,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -440,7 +444,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -461,7 +465,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -545,7 +549,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + @@ -557,7 +561,7 @@ The list of reserved and non-reserved keywords can change according to the confi - + 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 be36aaa538b40..4d02d6256f1e8 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 @@ -758,7 +758,7 @@ qualifiedName identifier : strictIdentifier - | {!ansi}? defaultReserved + | {!ansi}? strictNonReserved ; strictIdentifier @@ -782,7 +782,16 @@ number | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral ; -// The list of the non-reserved keywords when `spark.sql.parser.ansi.enabled` is true. +// When `spark.sql.parser.ansi.enabled=true`, there are 2 kinds of keywords in Spark SQL. +// - Reserved keywords: +// Keywords that are reserved and can't be used as identifiers for table, view, column, +// function, alias, etc. +// - Non-reserved keywords: +// Keywords that have a special meaning only in particular contexts and can be used as +// identifiers in other contexts. For example, `SELECT 1 WEEK` is an interval literal, but WEEK +// can be used as identifiers in other places. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The non-reserved keywords are listed below. Keywords not in this list are reserved keywords. ansiNonReserved : ADD | AFTER @@ -961,7 +970,16 @@ ansiNonReserved | YEARS ; -defaultReserved +// When `spark.sql.parser.ansi.enabled=false`, there are 2 kinds of keywords in Spark SQL. +// - Non-reserved keywords: +// Same definition as the one when `spark.sql.parser.ansi.enabled=true`. +// - Strict-non-reserved keywords: +// A strict version of non-reserved keywords, which can not be used as table alias. +// You can find the full keywords list by searching "Start of the keywords list" in this file. +// The strict-non-reserved keywords are listed in `strictNonReserved`. +// The non-reserved keywords are listed in `nonReserved`. +// These 2 together contain all the keywords. +strictNonReserved : ANTI | CROSS | EXCEPT @@ -1215,6 +1233,9 @@ nonReserved | YEARS ; +//============================ +// Start of the keywords list +//============================ SELECT: 'SELECT'; FROM: 'FROM'; ADD: 'ADD'; @@ -1350,37 +1371,13 @@ IGNORE: 'IGNORE'; BOTH: 'BOTH'; LEADING: 'LEADING'; TRAILING: 'TRAILING'; - IF: 'IF'; POSITION: 'POSITION'; EXTRACT: 'EXTRACT'; - -EQ : '=' | '=='; -NSEQ: '<=>'; -NEQ : '<>'; -NEQJ: '!='; -LT : '<'; -LTE : '<=' | '!>'; -GT : '>'; -GTE : '>=' | '!<'; - -PLUS: '+'; -MINUS: '-'; -ASTERISK: '*'; -SLASH: '/'; -PERCENT: '%'; -DIV: 'DIV'; -TILDE: '~'; -AMPERSAND: '&'; -PIPE: '|'; -CONCAT_PIPE: '||'; -HAT: '^'; - PERCENTLIT: 'PERCENT'; BUCKET: 'BUCKET'; OUT: 'OUT'; OF: 'OF'; - SORT: 'SORT'; CLUSTER: 'CLUSTER'; DISTRIBUTE: 'DISTRIBUTE'; @@ -1487,6 +1484,30 @@ SESSION_USER: 'SESSION_USER'; SOME: 'SOME'; UNIQUE: 'UNIQUE'; USER: 'USER'; +//============================ +// End of the keywords list +//============================ + +EQ : '=' | '=='; +NSEQ: '<=>'; +NEQ : '<>'; +NEQJ: '!='; +LT : '<'; +LTE : '<=' | '!>'; +GT : '>'; +GTE : '>=' | '!<'; + +PLUS: '+'; +MINUS: '-'; +ASTERISK: '*'; +SLASH: '/'; +PERCENT: '%'; +DIV: 'DIV'; +TILDE: '~'; +AMPERSAND: '&'; +PIPE: '|'; +CONCAT_PIPE: '||'; +HAT: '^'; STRING : '\'' ( ~('\''|'\\') | ('\\' .) )* '\''
KeywordSpark SQLSQL-2011
ALTERnon-reservednon-reservedreserved
ANALYZEnon-reservednon-reservednon-reserved
ANDreservednon-reservedreserved
ANTIreservedreservednon-reserved
ANTIreservedstrict-non-reservednon-reserved
ANYreservednon-reservedreserved
AREnon-reservednon-reservedreserved
ARCHIVEnon-reservednon-reservednon-reserved
COVAR_POPnon-reservednon-reservedreserved
COVAR_SAMPnon-reservednon-reservedreserved
CREATEreservednon-reservedreserved
CROSSreservedreservedreserved
CROSSreservedstrict-non-reservedreserved
CUBEnon-reservednon-reservedreserved
CUME_DISTnon-reservednon-reservedreserved
CURRENTnon-reservednon-reservedreserved
ESCAPEnon-reservednon-reservedreserved
ESCAPEDnon-reservednon-reservednon-reserved
EVERYnon-reservednon-reservedreserved
EXCEPTreservedreservedreserved
EXCEPTreservedstrict-non-reservedreserved
EXCEPTIONnon-reservednon-reservednon-reserved
EXCHANGEnon-reservednon-reservednon-reserved
EXECnon-reservednon-reservedreserved
FRAME_ROWnon-reservednon-reservedreserved
FREEnon-reservednon-reservedreserved
FROMreservednon-reservedreserved
FULLreservedreservedreserved
FULLreservedstrict-non-reservedreserved
FUNCTIONnon-reservednon-reservedreserved
FUNCTIONSnon-reservednon-reservednon-reserved
FUSIONnon-reservednon-reservednon-reserved
INDEXESnon-reservednon-reservednon-reserved
INITIALnon-reservednon-reservednon-reserved
INITIALLYnon-reservednon-reservednon-reserved
INNERreservedreservedreserved
INNERreservedstrict-non-reservedreserved
INOUTnon-reservednon-reservedreserved
INPATHnon-reservednon-reservednon-reserved
INPUTnon-reservednon-reservednon-reserved
INSERTnon-reservednon-reservedreserved
INTnon-reservednon-reservedreserved
INTEGERnon-reservednon-reservedreserved
INTERSECTreservedreservedreserved
INTERSECTreservedstrict-non-reservedreserved
INTERSECTIONnon-reservednon-reservedreserved
INTERVALnon-reservednon-reservedreserved
INTOreservednon-reservedreserved
ISOLATIONnon-reservednon-reservednon-reserved
ITEMSnon-reservednon-reservednon-reserved
ITERATEnon-reservednon-reservedreserved
JOINreservedreservedreserved
JOINreservedstrict-non-reservedreserved
JSON_ARRAYnon-reservednon-reservednon-reserved
JSON_ARRAYAGGnon-reservednon-reservednon-reserved
JSON_EXISTSnon-reservednon-reservednon-reserved
LEADnon-reservednon-reservedreserved
LEADINGreservednon-reservedreserved
LEAVEnon-reservednon-reservedreserved
LEFTreservedreservedreserved
LEFTreservedstrict-non-reservedreserved
LEVELnon-reservednon-reservednon-reserved
LIKEnon-reservednon-reservedreserved
LIKE_REGEXnon-reservednon-reservedreserved
MULTISETnon-reservednon-reservedreserved
NAMESnon-reservednon-reservednon-reserved
NATIONALnon-reservednon-reservedreserved
NATURALreservedreservedreserved
NATURALreservedstrict-non-reservedreserved
NCHARnon-reservednon-reservedreserved
NCLOBnon-reservednon-reservedreserved
NEWnon-reservednon-reservedreserved
OFFSETnon-reservednon-reservedreserved
OLDnon-reservednon-reservedreserved
OMITnon-reservednon-reservednon-reserved
ONreservedreservedreserved
ONreservedstrict-non-reservedreserved
ONEnon-reservednon-reservednon-reserved
ONLYreservednon-reservedreserved
OPENnon-reservednon-reservedreserved
RETURNnon-reservednon-reservedreserved
RETURNSnon-reservednon-reservedreserved
REVOKEnon-reservednon-reservedreserved
RIGHTreservedreservedreserved
RIGHTreservedstrict-non-reservedreserved
RLIKEnon-reservednon-reservednon-reserved
ROLEnon-reservednon-reservednon-reserved
ROLESnon-reservednon-reservednon-reserved
SECTIONnon-reservednon-reservednon-reserved
SEEKnon-reservednon-reservednon-reserved
SELECTreservednon-reservedreserved
SEMIreservedreservednon-reserved
SEMIreservedstrict-non-reservednon-reserved
SENSITIVEnon-reservednon-reservedreserved
SEPARATEDnon-reservednon-reservednon-reserved
SERDEnon-reservednon-reservednon-reserved
UNCACHEnon-reservednon-reservednon-reserved
UNDERnon-reservednon-reservednon-reserved
UNDOnon-reservednon-reservedreserved
UNIONreservedreservedreserved
UNIONreservedstrict-non-reservedreserved
UNIQUEreservednon-reservedreserved
UNKNOWNnon-reservednon-reservedreserved
UNLOCKnon-reservednon-reservednon-reserved
USAGEnon-reservednon-reservednon-reserved
USEnon-reservednon-reservednon-reserved
USERreservednon-reservedreserved
USINGreservedreservedreserved
USINGreservedstrict-non-reservedreserved
VALUEnon-reservednon-reservedreserved
VALUESnon-reservednon-reservedreserved
VALUE_OFnon-reservednon-reservedreserved