diff --git a/docs/_data/menu-sql.yaml b/docs/_data/menu-sql.yaml index cd065ea01dda..9bbb115bcdda 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 000000000000..321fb3f00acb --- /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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeywordSpark SQLSQL-2011
ANSI modedefault mode
ABSnon-reservednon-reservedreserved
ABSOLUTEnon-reservednon-reservednon-reserved
ACOSnon-reservednon-reservednon-reserved
ACTIONnon-reservednon-reservednon-reserved
ADDnon-reservednon-reservednon-reserved
AFTERnon-reservednon-reservednon-reserved
ALLreservednon-reservedreserved
ALLOCATEnon-reservednon-reservedreserved
ALTERnon-reservednon-reservedreserved
ANALYZEnon-reservednon-reservednon-reserved
ANDreservednon-reservedreserved
ANTIreservedreservednon-reserved
ANYreservednon-reservedreserved
AREnon-reservednon-reservedreserved
ARCHIVEnon-reservednon-reservednon-reserved
ARRAYnon-reservednon-reservedreserved
ARRAY_AGGnon-reservednon-reservedreserved
ARRAY_MAX_CARDINALITYnon-reservednon-reservedreserved
ASreservednon-reservedreserved
ASCnon-reservednon-reservednon-reserved
ASENSITIVEnon-reservednon-reservedreserved
ASINnon-reservednon-reservedreserved
ASSERTIONnon-reservednon-reservednon-reserved
ASYMMETRICnon-reservednon-reservedreserved
ATnon-reservednon-reservedreserved
ATANnon-reservednon-reservednon-reserved
ATOMICnon-reservednon-reservedreserved
AUTHORIZATIONreservednon-reservedreserved
AVGnon-reservednon-reservedreserved
BEFOREnon-reservednon-reservednon-reserved
BEGINnon-reservednon-reservedreserved
BEGIN_FRAMEnon-reservednon-reservedreserved
BEGIN_PARTITIONnon-reservednon-reservedreserved
BETWEENnon-reservednon-reservedreserved
BIGINTnon-reservednon-reservedreserved
BINARYnon-reservednon-reservedreserved
BITnon-reservednon-reservednon-reserved
BIT_LENGTHnon-reservednon-reservednon-reserved
BLOBnon-reservednon-reservedreserved
BOOLEANnon-reservednon-reservedreserved
BOTHreservednon-reservedreserved
BREADTHnon-reservednon-reservednon-reserved
BUCKETnon-reservednon-reservednon-reserved
BUCKETSnon-reservednon-reservednon-reserved
BYnon-reservednon-reservedreserved
CACHEnon-reservednon-reservednon-reserved
CALLnon-reservednon-reservedreserved
CALLEDnon-reservednon-reservedreserved
CARDINALITYnon-reservednon-reservedreserved
CASCADEnon-reservednon-reservedreserved
CASCADEDnon-reservednon-reservedreserved
CASEreservednon-reservedreserved
CASTreservednon-reservedreserved
CATALOGnon-reservednon-reservednon-reserved
CEILnon-reservednon-reservedreserved
CEILINGnon-reservednon-reservedreserved
CHANGEnon-reservednon-reservednon-reserved
CHARnon-reservednon-reservedreserved
CHAR_LENGTHnon-reservednon-reservedreserved
CHARACTERnon-reservednon-reservedreserved
CHARACTER_LENGTHnon-reservednon-reservedreserved
CHECKreservednon-reservedreserved
CLASSIFIERnon-reservednon-reservednon-reserved
CLEARnon-reservednon-reservednon-reserved
CLOBnon-reservednon-reservedreserved
CLOSEnon-reservednon-reservedreserved
CLUSTERnon-reservednon-reservednon-reserved
CLUSTEREDnon-reservednon-reservednon-reserved
COALESCEnon-reservednon-reservedreserved
CODEGENnon-reservednon-reservednon-reserved
COLLATEreservednon-reservedreserved
COLLATIONnon-reservednon-reservednon-reserved
COLLECTnon-reservednon-reservedreserved
COLLECTIONnon-reservednon-reservednon-reserved
COLUMNreservednon-reservedreserved
COLUMNSnon-reservednon-reservednon-reserved
COMMENTnon-reservednon-reservednon-reserved
COMMITnon-reservednon-reservedreserved
COMPACTnon-reservednon-reservednon-reserved
COMPACTIONSnon-reservednon-reservednon-reserved
COMPUTEnon-reservednon-reservednon-reserved
CONCATENATEnon-reservednon-reservednon-reserved
CONDITIONnon-reservednon-reservedreserved
CONNECTnon-reservednon-reservednon-reserved
CONNECTIONnon-reservednon-reservednon-reserved
CONSTRAINTreservednon-reservedreserved
CONSTRAINTSnon-reservednon-reservednon-reserved
CONSTRUCTORnon-reservednon-reservednon-reserved
CONTAINSnon-reservednon-reservednon-reserved
CONTINUEnon-reservednon-reservednon-reserved
CONVERTnon-reservednon-reservedreserved
COPYnon-reservednon-reservednon-reserved
CORRnon-reservednon-reservedreserved
CORRESPONDINGnon-reservednon-reservedreserved
COSnon-reservednon-reservednon-reserved
COSHnon-reservednon-reservednon-reserved
COSTnon-reservednon-reservednon-reserved
COUNTnon-reservednon-reservedreserved
COVAR_POPnon-reservednon-reservedreserved
COVAR_SAMPnon-reservednon-reservedreserved
CREATEreservednon-reservedreserved
CROSSreservedreservedreserved
CUBEnon-reservednon-reservedreserved
CUME_DISTnon-reservednon-reservedreserved
CURRENTnon-reservednon-reservedreserved
CURRENT_CATALOGnon-reservednon-reservedreserved
CURRENT_DATEreservednon-reservedreserved
CURRENT_DEFAULT_TRANSFORM_GROUPnon-reservednon-reservedreserved
CURRENT_PATHnon-reservednon-reservedreserved
CURRENT_ROLEnon-reservednon-reservedreserved
CURRENT_ROWnon-reservednon-reservedreserved
CURRENT_SCHEMAnon-reservednon-reservedreserved
CURRENT_TIMEreservednon-reservedreserved
CURRENT_TIMESTAMPreservednon-reservedreserved
CURRENT_TRANSFORM_GROUP_FOR_TYPEnon-reservednon-reservedreserved
CURRENT_USERreservednon-reservedreserved
CURSORnon-reservednon-reservedreserved
CYCLEnon-reservednon-reservedreserved
DATAnon-reservednon-reservednon-reserved
DATABASEnon-reservednon-reservednon-reserved
DATABASESnon-reservednon-reservednon-reserved
DATEnon-reservednon-reservedreserved
DAYnon-reservednon-reservedreserved
DBPROPERTIESnon-reservednon-reservednon-reserved
DEALLOCATEnon-reservednon-reservedreserved
DECnon-reservednon-reservedreserved
DECFLOATnon-reservednon-reservednon-reserved
DECIMALnon-reservednon-reservedreserved
DECLAREnon-reservednon-reservedreserved
DEFAULTnon-reservednon-reservedreserved
DEFERRABLEnon-reservednon-reservednon-reserved
DEFERREDnon-reservednon-reservednon-reserved
DEFINEnon-reservednon-reservednon-reserved
DEFINEDnon-reservednon-reservednon-reserved
DELETEnon-reservednon-reservedreserved
DELIMITEDnon-reservednon-reservednon-reserved
DENSE_RANKnon-reservednon-reservedreserved
DEPTHnon-reservednon-reservednon-reserved
DEREFnon-reservednon-reservedreserved
DESCnon-reservednon-reservednon-reserved
DESCRIBEnon-reservednon-reservedreserved
DESCRIPTORnon-reservednon-reservednon-reserved
DETERMINISTICnon-reservednon-reservedreserved
DFSnon-reservednon-reservednon-reserved
DIAGNOSTICSnon-reservednon-reservednon-reserved
DIRECTORIESnon-reservednon-reservednon-reserved
DIRECTORYnon-reservednon-reservednon-reserved
DISCONNECTnon-reservednon-reservedreserved
DISTINCTreservednon-reservedreserved
DISTRIBUTEnon-reservednon-reservednon-reserved
DIVnon-reservednon-reservednon-reserved
DOnon-reservednon-reservedreserved
DOMAINnon-reservednon-reservednon-reserved
DOUBLEnon-reservednon-reservedreserved
DROPnon-reservednon-reservedreserved
DYNAMICnon-reservednon-reservedreserved
EACHnon-reservednon-reservedreserved
ELEMENTnon-reservednon-reservedreserved
ELSEreservednon-reservedreserved
ELSEIFnon-reservednon-reservedreserved
EMPTYnon-reservednon-reservednon-reserved
ENDreservednon-reservedreserved
END_FRAMEnon-reservednon-reservedreserved
END_PARTITIONnon-reservednon-reservedreserved
EQUALSnon-reservednon-reservednon-reserved
ESCAPEnon-reservednon-reservedreserved
ESCAPEDnon-reservednon-reservednon-reserved
EVERYnon-reservednon-reservedreserved
EXCEPTreservedreservedreserved
EXCEPTIONnon-reservednon-reservednon-reserved
EXCHANGEnon-reservednon-reservednon-reserved
EXECnon-reservednon-reservedreserved
EXECUTEnon-reservednon-reservedreserved
EXISTSnon-reservednon-reservedreserved
EXITnon-reservednon-reservednon-reserved
EXPnon-reservednon-reservednon-reserved
EXPLAINnon-reservednon-reservednon-reserved
EXPORTnon-reservednon-reservednon-reserved
EXTENDEDnon-reservednon-reservednon-reserved
EXTERNALnon-reservednon-reservedreserved
EXTRACTnon-reservednon-reservedreserved
FALSEreservednon-reservedreserved
FETCHreservednon-reservedreserved
FIELDSnon-reservednon-reservednon-reserved
FILEFORMATnon-reservednon-reservednon-reserved
FILTERnon-reservednon-reservedreserved
FIRSTnon-reservednon-reservednon-reserved
FIRST_VALUEnon-reservednon-reservedreserved
FLOATnon-reservednon-reservedreserved
FOLLOWINGnon-reservednon-reservednon-reserved
FORreservednon-reservedreserved
FOREIGNreservednon-reservedreserved
FORMATnon-reservednon-reservednon-reserved
FORMATTEDnon-reservednon-reservednon-reserved
FOUNDnon-reservednon-reservednon-reserved
FRAME_ROWnon-reservednon-reservedreserved
FREEnon-reservednon-reservedreserved
FROMreservednon-reservedreserved
FULLreservedreservedreserved
FUNCTIONnon-reservednon-reservedreserved
FUNCTIONSnon-reservednon-reservednon-reserved
FUSIONnon-reservednon-reservednon-reserved
GENERALnon-reservednon-reservednon-reserved
GETnon-reservednon-reservedreserved
GLOBALnon-reservednon-reservedreserved
GOnon-reservednon-reservednon-reserved
GOTOnon-reservednon-reservednon-reserved
GRANTreservednon-reservedreserved
GROUPreservednon-reservedreserved
GROUPINGnon-reservednon-reservedreserved
GROUPSnon-reservednon-reservedreserved
HANDLERnon-reservednon-reservedreserved
HAVINGreservednon-reservedreserved
HOLDnon-reservednon-reservedreserved
HOURnon-reservednon-reservedreserved
IDENTITYnon-reservednon-reservedreserved
IFnon-reservednon-reservedreserved
IGNOREnon-reservednon-reservednon-reserved
IMMEDIATEnon-reservednon-reservednon-reserved
IMPORTnon-reservednon-reservednon-reserved
INreservednon-reservedreserved
INDICATORnon-reservednon-reservedreserved
INDEXnon-reservednon-reservednon-reserved
INDEXESnon-reservednon-reservednon-reserved
INITIALnon-reservednon-reservednon-reserved
INITIALLYnon-reservednon-reservednon-reserved
INNERreservedreservedreserved
INOUTnon-reservednon-reservedreserved
INPATHnon-reservednon-reservednon-reserved
INPUTnon-reservednon-reservednon-reserved
INPUTFORMATnon-reservednon-reservednon-reserved
INSENSITIVEnon-reservednon-reservedreserved
INSERTnon-reservednon-reservedreserved
INTnon-reservednon-reservedreserved
INTEGERnon-reservednon-reservedreserved
INTERSECTreservedreservedreserved
INTERSECTIONnon-reservednon-reservedreserved
INTERVALnon-reservednon-reservedreserved
INTOreservednon-reservedreserved
ISreservednon-reservedreserved
ISOLATIONnon-reservednon-reservednon-reserved
ITEMSnon-reservednon-reservednon-reserved
ITERATEnon-reservednon-reservedreserved
JOINreservedreservedreserved
JSON_ARRAYnon-reservednon-reservednon-reserved
JSON_ARRAYAGGnon-reservednon-reservednon-reserved
JSON_EXISTSnon-reservednon-reservednon-reserved
JSON_OBJECTnon-reservednon-reservednon-reserved
JSON_OBJECTAGGnon-reservednon-reservednon-reserved
JSON_QUERYnon-reservednon-reservednon-reserved
JSON_TABLEnon-reservednon-reservednon-reserved
JSON_TABLE_PRIMITIVEnon-reservednon-reservednon-reserved
JSON_VALUEnon-reservednon-reservednon-reserved
KEYnon-reservednon-reservednon-reserved
KEYSnon-reservednon-reservednon-reserved
LAGnon-reservednon-reservednon-reserved
LANGUAGEnon-reservednon-reservedreserved
LARGEnon-reservednon-reservedreserved
LASTnon-reservednon-reservednon-reserved
LAST_VALUEnon-reservednon-reservedreserved
LATERALnon-reservednon-reservedreserved
LAZYnon-reservednon-reservednon-reserved
LEADnon-reservednon-reservedreserved
LEADINGreservednon-reservedreserved
LEAVEnon-reservednon-reservedreserved
LEFTreservedreservedreserved
LEVELnon-reservednon-reservednon-reserved
LIKEnon-reservednon-reservedreserved
LIKE_REGEXnon-reservednon-reservedreserved
LIMITnon-reservednon-reservednon-reserved
LINESnon-reservednon-reservednon-reserved
LISTnon-reservednon-reservednon-reserved
LISTAGGnon-reservednon-reservednon-reserved
LNnon-reservednon-reservedreserved
LOADnon-reservednon-reservednon-reserved
LOCALnon-reservednon-reservedreserved
LOCALTIMEnon-reservednon-reservedreserved
LOCALTIMESTAMPnon-reservednon-reservedreserved
LOCATIONnon-reservednon-reservednon-reserved
LOCATORnon-reservednon-reservednon-reserved
LOCKnon-reservednon-reservednon-reserved
LOCKSnon-reservednon-reservednon-reserved
LOGnon-reservednon-reservednon-reserved
LOG10non-reservednon-reservednon-reserved
LOGICALnon-reservednon-reservednon-reserved
LOOPnon-reservednon-reservedreserved
LOWERnon-reservednon-reservedreserved
MACROnon-reservednon-reservednon-reserved
MAPnon-reservednon-reservednon-reserved
MATCHnon-reservednon-reservedreserved
MATCH_NUMBERnon-reservednon-reservednon-reserved
MATCH_RECOGNIZEnon-reservednon-reservednon-reserved
MATCHESnon-reservednon-reservednon-reserved
MAXnon-reservednon-reservedreserved
MEMBERnon-reservednon-reservedreserved
MERGEnon-reservednon-reservedreserved
METHODnon-reservednon-reservedreserved
MINnon-reservednon-reservedreserved
MINUSreservedreservednon-reserved
MINUTEnon-reservednon-reservedreserved
MODnon-reservednon-reservedreserved
MODIFIESnon-reservednon-reservedreserved
MODULEnon-reservednon-reservedreserved
MONTHnon-reservednon-reservedreserved
MSCKnon-reservednon-reservednon-reserved
MULTISETnon-reservednon-reservedreserved
NAMESnon-reservednon-reservednon-reserved
NATIONALnon-reservednon-reservedreserved
NATURALreservedreservedreserved
NCHARnon-reservednon-reservedreserved
NCLOBnon-reservednon-reservedreserved
NEWnon-reservednon-reservedreserved
NEXTnon-reservednon-reservednon-reserved
NOnon-reservednon-reservedreserved
NONEnon-reservednon-reservedreserved
NORMALIZEnon-reservednon-reservedreserved
NOTreservednon-reservedreserved
NTH_VALUEnon-reservednon-reservedreserved
NTILEnon-reservednon-reservedreserved
NULLreservednon-reservedreserved
NULLSnon-reservednon-reservednon-reserved
NULLIFnon-reservednon-reservedreserved
NUMERICnon-reservednon-reservedreserved
OBJECTnon-reservednon-reservednon-reserved
OCCURRENCES_REGEXnon-reservednon-reservednon-reserved
OCTET_LENGTHnon-reservednon-reservedreserved
OFnon-reservednon-reservedreserved
OFFSETnon-reservednon-reservedreserved
OLDnon-reservednon-reservedreserved
OMITnon-reservednon-reservednon-reserved
ONreservedreservedreserved
ONEnon-reservednon-reservednon-reserved
ONLYreservednon-reservedreserved
OPENnon-reservednon-reservedreserved
OPTIONnon-reservednon-reservednon-reserved
OPTIONSnon-reservednon-reservednon-reserved
ORreservednon-reservedreserved
ORDERreservednon-reservedreserved
ORDINALITYnon-reservednon-reservednon-reserved
OUTnon-reservednon-reservedreserved
OUTERreservednon-reservedreserved
OUTPUTnon-reservednon-reservednon-reserved
OUTPUTFORMATnon-reservednon-reservednon-reserved
OVERnon-reservednon-reservednon-reserved
OVERLAPSreservednon-reservedreserved
OVERLAYnon-reservednon-reservedreserved
OVERWRITEnon-reservednon-reservednon-reserved
PADnon-reservednon-reservednon-reserved
PARAMETERnon-reservednon-reservedreserved
PARTIALnon-reservednon-reservednon-reserved
PARTITIONnon-reservednon-reservedreserved
PARTITIONEDnon-reservednon-reservednon-reserved
PARTITIONSnon-reservednon-reservednon-reserved
PATHnon-reservednon-reservednon-reserved
PATTERNnon-reservednon-reservednon-reserved
PERnon-reservednon-reservednon-reserved
PERCENTnon-reservednon-reservedreserved
PERCENT_RANKnon-reservednon-reservedreserved
PERCENTILE_CONTnon-reservednon-reservedreserved
PERCENTILE_DISCnon-reservednon-reservedreserved
PERCENTLITnon-reservednon-reservednon-reserved
PERIODnon-reservednon-reservedreserved
PIVOTnon-reservednon-reservednon-reserved
PORTIONnon-reservednon-reservedreserved
POSITIONnon-reservednon-reservedreserved
POSITION_REGEXnon-reservednon-reservedreserved
POWERnon-reservednon-reservedreserved
PRECEDESnon-reservednon-reservedreserved
PRECEDINGnon-reservednon-reservednon-reserved
PRECISIONnon-reservednon-reservedreserved
PREPAREnon-reservednon-reservedreserved
PRESERVEnon-reservednon-reservednon-reserved
PRIMARYreservednon-reservedreserved
PRINCIPALSnon-reservednon-reservednon-reserved
PRIORnon-reservednon-reservednon-reserved
PRIVILEGESnon-reservednon-reservednon-reserved
PROCEDUREnon-reservednon-reservedreserved
PTFnon-reservednon-reservednon-reserved
PUBLICnon-reservednon-reservednon-reserved
PURGEnon-reservednon-reservednon-reserved
RANGEnon-reservednon-reservedreserved
RANKnon-reservednon-reservedreserved
READnon-reservednon-reservednon-reserved
READSnon-reservednon-reservedreserved
REALnon-reservednon-reservedreserved
RECORDREADERnon-reservednon-reservednon-reserved
RECORDWRITERnon-reservednon-reservednon-reserved
RECURSIVEnon-reservednon-reservedreserved
RECOVERnon-reservednon-reservednon-reserved
REDUCEnon-reservednon-reservednon-reserved
REFnon-reservednon-reservedreserved
REFERENCESreservednon-reservedreserved
REFERENCINGnon-reservednon-reservedreserved
REFRESHnon-reservednon-reservednon-reserved
REGR_AVGXnon-reservednon-reservedreserved
REGR_AVGYnon-reservednon-reservedreserved
REGR_COUNTnon-reservednon-reservedreserved
REGR_INTERCEPTnon-reservednon-reservedreserved
REGR_R2non-reservednon-reservedreserved
REGR_SLOPEnon-reservednon-reservedreserved
REGR_SXXnon-reservednon-reservedreserved
REGR_SXYnon-reservednon-reservedreserved
REGR_SYYnon-reservednon-reservedreserved
RELATIVEnon-reservednon-reservednon-reserved
RELEASEnon-reservednon-reservedreserved
RENAMEnon-reservednon-reservednon-reserved
REPAIRnon-reservednon-reservednon-reserved
REPEATnon-reservednon-reservedreserved
REPLACEnon-reservednon-reservednon-reserved
RESETnon-reservednon-reservednon-reserved
RESIGNALnon-reservednon-reservedreserved
RESTRICTnon-reservednon-reservednon-reserved
RESULTnon-reservednon-reservedreserved
RETURNnon-reservednon-reservedreserved
RETURNSnon-reservednon-reservedreserved
REVOKEnon-reservednon-reservedreserved
RIGHTreservedreservedreserved
RLIKEnon-reservednon-reservednon-reserved
ROLEnon-reservednon-reservednon-reserved
ROLESnon-reservednon-reservednon-reserved
ROLLBACKnon-reservednon-reservedreserved
ROLLUPnon-reservednon-reservedreserved
ROUTINEnon-reservednon-reservednon-reserved
ROWnon-reservednon-reservedreserved
ROW_NUMBERnon-reservednon-reservedreserved
ROWSnon-reservednon-reservedreserved
RUNNINGnon-reservednon-reservednon-reserved
SAVEPOINTnon-reservednon-reservedreserved
SCHEMAnon-reservednon-reservednon-reserved
SCOPEnon-reservednon-reservedreserved
SCROLLnon-reservednon-reservedreserved
SEARCHnon-reservednon-reservedreserved
SECONDnon-reservednon-reservedreserved
SECTIONnon-reservednon-reservednon-reserved
SEEKnon-reservednon-reservednon-reserved
SELECTreservednon-reservedreserved
SEMIreservedreservednon-reserved
SENSITIVEnon-reservednon-reservedreserved
SEPARATEDnon-reservednon-reservednon-reserved
SERDEnon-reservednon-reservednon-reserved
SERDEPROPERTIESnon-reservednon-reservednon-reserved
SESSIONnon-reservednon-reservednon-reserved
SESSION_USERreservednon-reservedreserved
SETnon-reservednon-reservedreserved
SETSnon-reservednon-reservednon-reserved
SHOWnon-reservednon-reservednon-reserved
SIGNALnon-reservednon-reservedreserved
SIMILARnon-reservednon-reservedreserved
SINnon-reservednon-reservednon-reserved
SINHnon-reservednon-reservednon-reserved
SIZEnon-reservednon-reservednon-reserved
SKIPnon-reservednon-reservednon-reserved
SKEWEDnon-reservednon-reservednon-reserved
SMALLINTnon-reservednon-reservedreserved
SOMEreservednon-reservedreserved
SORTnon-reservednon-reservednon-reserved
SORTEDnon-reservednon-reservednon-reserved
SPACEnon-reservednon-reservednon-reserved
SPECIFICnon-reservednon-reservedreserved
SPECIFICTYPEnon-reservednon-reservedreserved
SQLnon-reservednon-reservedreserved
SQLCODEnon-reservednon-reservednon-reserved
SQLERRORnon-reservednon-reservednon-reserved
SQLEXCEPTIONnon-reservednon-reservedreserved
SQLSTATEnon-reservednon-reservedreserved
SQLWARNINGnon-reservednon-reservedreserved
SQRTnon-reservednon-reservedreserved
STARTnon-reservednon-reservedreserved
STATEnon-reservednon-reservednon-reserved
STATICnon-reservednon-reservedreserved
STATISTICSnon-reservednon-reservednon-reserved
STDDEV_POPnon-reservednon-reservedreserved
STDDEV_SAMPnon-reservednon-reservedreserved
STOREDnon-reservednon-reservednon-reserved
STRATIFYnon-reservednon-reservednon-reserved
STRUCTnon-reservednon-reservednon-reserved
SUBMULTISETnon-reservednon-reservedreserved
SUBSETnon-reservednon-reservednon-reserved
SUBSTRINGnon-reservednon-reservedreserved
SUBSTRING_REGEXnon-reservednon-reservedreserved
SUCCEEDSnon-reservednon-reservedreserved
SUMnon-reservednon-reservedreserved
SYMMETRICnon-reservednon-reservedreserved
SYSTEMnon-reservednon-reservedreserved
SYSTEM_TIMEnon-reservednon-reservedreserved
SYSTEM_USERnon-reservednon-reservedreserved
TABLEreservednon-reservedreserved
TABLESnon-reservednon-reservednon-reserved
TABLESAMPLEnon-reservednon-reservedreserved
TANnon-reservednon-reservednon-reserved
TANHnon-reservednon-reservednon-reserved
TBLPROPERTIESnon-reservednon-reservednon-reserved
TEMPORARYnon-reservednon-reservednon-reserved
TERMINATEDnon-reservednon-reservednon-reserved
THENreservednon-reservedreserved
TIMEnon-reservednon-reservedreserved
TIMESTAMPnon-reservednon-reservedreserved
TIMEZONE_HOURnon-reservednon-reservedreserved
TIMEZONE_MINUTEnon-reservednon-reservedreserved
TOreservednon-reservedreserved
TOUCHnon-reservednon-reservednon-reserved
TRAILINGreservednon-reservedreserved
TRANSACTIONnon-reservednon-reservednon-reserved
TRANSACTIONSnon-reservednon-reservednon-reserved
TRANSFORMnon-reservednon-reservednon-reserved
TRANSLATEnon-reservednon-reservedreserved
TRANSLATE_REGEXnon-reservednon-reservedreserved
TRANSLATIONnon-reservednon-reservedreserved
TREATnon-reservednon-reservedreserved
TRIGGERnon-reservednon-reservedreserved
TRIMnon-reservednon-reservedreserved
TRIM_ARRAYnon-reservednon-reservedreserved
TRUEnon-reservednon-reservedreserved
TRUNCATEnon-reservednon-reservedreserved
UESCAPEnon-reservednon-reservedreserved
UNARCHIVEnon-reservednon-reservednon-reserved
UNBOUNDEDnon-reservednon-reservednon-reserved
UNCACHEnon-reservednon-reservednon-reserved
UNDERnon-reservednon-reservednon-reserved
UNDOnon-reservednon-reservedreserved
UNIONreservedreservedreserved
UNIQUEreservednon-reservedreserved
UNKNOWNnon-reservednon-reservedreserved
UNLOCKnon-reservednon-reservednon-reserved
UNNESTnon-reservednon-reservedreserved
UNSETnon-reservednon-reservednon-reserved
UNTILnon-reservednon-reservedreserved
UPDATEnon-reservednon-reservedreserved
UPPERnon-reservednon-reservedreserved
USAGEnon-reservednon-reservednon-reserved
USEnon-reservednon-reservednon-reserved
USERreservednon-reservedreserved
USINGreservedreservedreserved
VALUEnon-reservednon-reservedreserved
VALUESnon-reservednon-reservedreserved
VALUE_OFnon-reservednon-reservedreserved
VAR_POPnon-reservednon-reservedreserved
VAR_SAMPnon-reservednon-reservedreserved
VARBINARYnon-reservednon-reservedreserved
VARCHARnon-reservednon-reservedreserved
VARYINGnon-reservednon-reservedreserved
VERSIONINGnon-reservednon-reservedreserved
VIEWnon-reservednon-reservednon-reserved
WHENreservednon-reservedreserved
WHENEVERnon-reservednon-reservedreserved
WHEREreservednon-reservedreserved
WHILEnon-reservednon-reservedreserved
WIDTH_BUCKETnon-reservednon-reservedreserved
WINDOWnon-reservednon-reservedreserved
WITHreservednon-reservedreserved
WITHINnon-reservednon-reservedreserved
WITHOUTnon-reservednon-reservedreserved
WORKnon-reservednon-reservednon-reserved
WRITEnon-reservednon-reservednon-reserved
YEARnon-reservednon-reservedreserved
ZONEnon-reservednon-reservednon-reserved
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 b39681d886c5..69deeb518d6e 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 7d8cb1f18b4b..446cb0964188 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 d285e007dac1..783f33384cc6 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 " + @@ -1832,6 +1838,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)