BNF for SQLPP.jj

TOKENS

<DEFAULT,IN_DBL_BRACE> TOKEN [IGNORE_CASE] : {
<ALL: "all">
| <AND: "and">
| <APPLY: "apply">
| <AS: "as">
| <ASC: "asc">
| <AT: "at">
| <AUTOGENERATED: "autogenerated">
| <BTREE: "btree">
| <BY: "by">
| <CASE: "case">
| <CLOSED: "closed">
| <CREATE: "create">
| <COMPACTION: "compaction">
| <COMPACT: "compact">
| <CONNECT: "connect">
| <CORRELATE: "correlate">
| <DATASET: "table">
| <DATAVERSE: "database">
| <DECLARE: "declare">
| <DEFINITION: "definition">
| <DELETE: "delete">
| <DESC: "desc">
| <DISCONNECT: "disconnect">
| <DISTINCT: "distinct">
| <DROP: "drop">
| <ELEMENT: "element">
| <ELSE: "else">
| <ENFORCED: "enforced">
| <EVERY: "every">
| <EXCEPT: "except">
| <EXISTS: "exists">
| <EXTERNAL: "external">
| <FEED: "feed">
| <FILTER: "filter">
| <FLATTEN: "flatten">
| <FOR: "for">
| <FORMAT: "format">
| <FROM: "from">
| <FULL: "full">
| <FUNCTION: "function">
| <GROUP: "group">
| <HAVING: "having">
| <HINTS: "hints">
| <IF: "if">
| <INTO: "into">
| <IN: "in">
| <INDEX: "index">
| <INGESTION: "ingestion">
| <INNER: "inner">
| <INSERT: "insert">
| <INTERNAL: "internal">
| <INTERSECT: "intersect">
| <JOIN: "join">
| <KEYWORD: "keyword">
| <KEY: "key">
| <LEFT: "left">
| <LETTING: "letting">
| <LET: "let">
| <LIMIT: "limit">
| <LOAD: "load">
| <NEST: "nest">
| <NODEGROUP: "nodegroup">
| <NGRAM: "ngram">
| <OFFSET: "offset">
| <ON: "on">
| <OPEN: "open">
| <OR: "or">
| <ORDER: "order">
| <OUTER: "outer">
| <OUTPUT: "output">
| <PATH: "path">
| <POLICY: "policy">
| <PRESORTED: "pre-sorted">
| <PRIMARY: "primary">
| <RAW: "raw">
| <REFRESH: "refresh">
| <RETURN: "return">
| <RTREE: "rtree">
| <RUN: "run">
| <SATISFIES: "satisfies">
| <SECONDARY: "secondary">
| <SELECT: "select">
| <SET: "set">
| <SOME: "some">
| <TEMPORARY: "temporary">
| <THEN: "then">
| <TYPE: "type">
| <TO: "to">
| <UNION: "union">
| <UNNEST: "unnest">
| <VALUE: "value">
| <WHEN: "when">
| <WHERE: "where">
| <WITH: "with">
| <WRITE: "write">
| <UPDATE: "update">
| <USE: "use">
| <USING: "using">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<CARET: "^">
| <DIV: "/">
| <IDIV: "idiv">
| <MINUS: "-">
| <MOD: "%">
| <MUL: "*">
| <PLUS: "+">
| <LEFTPAREN: "(">
| <RIGHTPAREN: ")">
| <LEFTBRACKET: "[">
| <RIGHTBRACKET: "]">
| <ATT: "@">
| <COLON: ":">
| <COMMA: ",">
| <DOT: ".">
| <QUES: "?">
| <SEMICOLON: ";">
| <SHARP: "#">
| <LT: "<">
| <GT: ">">
| <LE: "<=">
| <GE: ">=">
| <EQ: "=">
| <NE: "!=">
| <SIMILAR: "~=">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<LEFTBRACE: "{"> : DEFAULT
}

   
<DEFAULT> TOKEN : {
<RIGHTBRACE: "}"> : {
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<LEFTDBLBRACE: "{{"> : IN_DBL_BRACE
}

   
<IN_DBL_BRACE> TOKEN : {
<RIGHTDBLBRACE: "}}"> : {
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<INTEGER_LITERAL: (<DIGIT>)+>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<NULL: "null">
| <TRUE: "true">
| <FALSE: "false">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<#DIGIT: ["0"-"9"]>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<DOUBLE_LITERAL: <DIGITS> | <DIGITS> ("." <DIGITS>)? | "." <DIGITS>>
| <FLOAT_LITERAL: <DIGITS> ("f" | "F") | <DIGITS> ("." <DIGITS> ("f" | "F"))? | "." <DIGITS> ("f" | "F")>
| <DIGITS: (<DIGIT>)+>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<#LETTER: ["A"-"Z","a"-"z"]>
| <SPECIALCHARS: ["$","_"]>
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<QUOTED_STRING: "\"" (<EscapeQuot> | <EscapeBslash> | <EscapeSlash> | <EscapeBspace> | <EscapeFormf> | <EscapeNl> | <EscapeCr> | <EscapeTab> | ~["\"","\\"])* "\"">
| <STRING_LITERAL: "\'" (<EscapeQuot> | <EscapeApos> | <EscapeBslash> | <EscapeSlash> | <EscapeBspace> | <EscapeFormf> | <EscapeNl> | <EscapeCr> | <EscapeTab> | ~["\'","\\"])* "\'">
| <#EscapeQuot: "\\\"">
| <#EscapeApos: "\\\'">
| <#EscapeBslash: "\\\\">
| <#EscapeSlash: "\\/">
| <#EscapeBspace: "\\b">
| <#EscapeFormf: "\\f">
| <#EscapeNl: "\\n">
| <#EscapeCr: "\\r">
| <#EscapeTab: "\\t">
}

   
<DEFAULT,IN_DBL_BRACE> TOKEN : {
<IDENTIFIER: <LETTER> (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
" "
| "\t"
| "\r"
| "\n"
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
<"//" (~["\n"])* "\n">
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
<"//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")?>
}

   
<DEFAULT,IN_DBL_BRACE> SKIP : {
"/*" : INSIDE_COMMENT
}

   
<INSIDE_COMMENT> SPECIAL : {
<"+" (" ")* (~["*"])*>
}

   
<INSIDE_COMMENT> SKIP : {
"/*" : {
}

   
<INSIDE_COMMENT> SKIP : {
"*/" : {
| <~[]>
}

   

NON-TERMINALS

Statement ::= ( SingleStatement ( <SEMICOLON> )* )* <EOF>
SingleStatement ::= ( DataverseDeclaration | FunctionDeclaration | CreateStatement | LoadStatement | DropStatement | WriteStatement | SetStatement | InsertStatement | DeleteStatement | UpdateStatement | FeedStatement | CompactStatement | Query <SEMICOLON> | RefreshExternalDatasetStatement | RunStatement )
DataverseDeclaration ::= <USE> Identifier
CreateStatement ::= <CREATE> ( TypeSpecification | NodegroupSpecification | DatasetSpecification | IndexSpecification | DataverseSpecification | FunctionSpecification | FeedSpecification | FeedPolicySpecification )
TypeSpecification ::= <TYPE> TypeName IfNotExists <AS> TypeExpr
NodegroupSpecification ::= <NODEGROUP> Identifier IfNotExists <ON> Identifier ( <COMMA> Identifier )*
DatasetSpecification ::= ( <EXTERNAL> <DATASET> QualifiedName <LEFTPAREN> TypeName <RIGHTPAREN> IfNotExists <USING> AdapterName Configuration ( <ON> Identifier )? ( <HINTS> Properties )? ( <USING> <COMPACTION> <POLICY> CompactionPolicy ( Configuration )? )? | ( <INTERNAL> | <TEMPORARY> )? <DATASET> QualifiedName <LEFTPAREN> TypeName <RIGHTPAREN> ( <WITH> Identifier <LEFTPAREN> TypeName <RIGHTPAREN> )? IfNotExists PrimaryKey ( <AUTOGENERATED> )? ( <ON> Identifier )? ( <HINTS> Properties )? ( <USING> <COMPACTION> <POLICY> CompactionPolicy ( Configuration )? )? ( <WITH> <FILTER> <ON> NestedField )? )
RefreshExternalDatasetStatement ::= <REFRESH> <EXTERNAL> <DATASET> QualifiedName
RunStatement ::= <RUN> Identifier <LEFTPAREN> ( Identifier ( <COMMA> )? )* <RIGHTPAREN> <FROM> <DATASET> QualifiedName <TO> <DATASET> QualifiedName
IndexSpecification ::= <INDEX> Identifier IfNotExists <ON> QualifiedName <LEFTPAREN> ( OpenField ) ( <COMMA> OpenField )* <RIGHTPAREN> ( <TYPE> IndexType )? ( <ENFORCED> )?
CompactionPolicy ::= Identifier
FilterField ::= Identifier
IndexType ::= ( <BTREE> | <RTREE> | <KEYWORD> | <NGRAM> <LEFTPAREN> <INTEGER_LITERAL> <RIGHTPAREN> )
DataverseSpecification ::= <DATAVERSE> Identifier IfNotExists ( <WITH> <FORMAT> QuotedString )?
FunctionSpecification ::= <FUNCTION> FunctionName IfNotExists ParameterList <LEFTBRACE> Expression <RIGHTBRACE>
FeedSpecification ::= ( <SECONDARY> <FEED> QualifiedName IfNotExists <FROM> <FEED> QualifiedName ( ApplyFunction )? | ( <PRIMARY> )? <FEED> QualifiedName IfNotExists <USING> AdapterName Configuration ( ApplyFunction )? )
FeedPolicySpecification ::= ( <INGESTION> <POLICY> Identifier IfNotExists <FROM> ( <POLICY> Identifier Configuration ( <DEFINITION> QuotedString )? | <PATH> Identifier ( <DEFINITION> QuotedString )? ) )
ParameterList ::= <LEFTPAREN> ( <IDENTIFIER> ( <COMMA> <IDENTIFIER> )* )? <RIGHTPAREN>
IfNotExists ::= ( <IF> ( "not exists" | "NOT EXISTS" ) )?
ApplyFunction ::= <APPLY> <FUNCTION> FunctionName
GetPolicy ::= <USING> <POLICY> Identifier
FunctionSignature ::= FunctionName <ATT> <INTEGER_LITERAL>
PrimaryKey ::= <PRIMARY> <KEY> NestedField ( <COMMA> NestedField )*
DropStatement ::= <DROP> ( <DATASET> QualifiedName IfExists | <INDEX> DoubleQualifiedName IfExists | <NODEGROUP> Identifier IfExists | <TYPE> TypeName IfExists | <DATAVERSE> Identifier IfExists | <FUNCTION> FunctionSignature IfExists | <FEED> QualifiedName IfExists )
IfExists ::= ( <IF> <EXISTS> )?
InsertStatement ::= <INSERT> <INTO> QualifiedName Query
DeleteStatement ::= <DELETE> Variable <FROM> QualifiedName ( <WHERE> Expression )?
UpdateStatement ::= <UPDATE> Variable <IN> Expression <WHERE> Expression <LEFTPAREN> ( UpdateClause ( <COMMA> UpdateClause )* ) <RIGHTPAREN>
UpdateClause ::= ( <SET> Expression <EQ> Expression | InsertStatement | DeleteStatement | UpdateStatement | <IF> <LEFTPAREN> Expression <RIGHTPAREN> <THEN> UpdateClause ( <ELSE> UpdateClause )? )
SetStatement ::= <SET> Identifier QuotedString
WriteStatement ::= <WRITE> <OUTPUT> <TO> Identifier <COLON> QuotedString ( <USING> QuotedString )?
LoadStatement ::= <LOAD> <DATASET> QualifiedName <USING> AdapterName Configuration ( <PRESORTED> )?
AdapterName ::= Identifier
CompactStatement ::= <COMPACT> <DATASET> QualifiedName
FeedStatement ::= ( <CONNECT> <FEED> QualifiedName <TO> <DATASET> QualifiedName ( GetPolicy )? | <DISCONNECT> <FEED> QualifiedName <FROM> <DATASET> QualifiedName )
Configuration ::= <LEFTPAREN> ( KeyValuePair ( <COMMA> KeyValuePair )* )? <RIGHTPAREN>
KeyValuePair ::= <LEFTPAREN> QuotedString <EQ> QuotedString <RIGHTPAREN>
Properties ::= ( <LEFTPAREN> Property ( <COMMA> Property )* <RIGHTPAREN> )?
Property ::= Identifier <EQ> ( QuotedString | <INTEGER_LITERAL> )
IndexedTypeExpr ::= ( TypeReference | OrderedListTypeDef | UnorderedListTypeDef )
TypeExpr ::= ( RecordTypeDef | TypeReference | OrderedListTypeDef | UnorderedListTypeDef )
RecordTypeDef ::= ( <CLOSED> | <OPEN> )? <LEFTBRACE> ( RecordField ( <COMMA> RecordField )* )? <RIGHTBRACE>
RecordField ::= Identifier <COLON> TypeExpr ( <QUES> )?
TypeReference ::= Identifier
OrderedListTypeDef ::= <LEFTBRACKET> ( TypeExpr ) <RIGHTBRACKET>
UnorderedListTypeDef ::= <LEFTDBLBRACE> ( TypeExpr ) <RIGHTDBLBRACE>
FunctionName ::= Identifier ( <DOT> Identifier ( <SHARP> Identifier )? | <SHARP> Identifier )?
TypeName ::= QualifiedName
Identifier ::= ( <IDENTIFIER> | QuotedString )
OpenField ::= NestedField ( <COLON> IndexedTypeExpr )?
NestedField ::= Identifier ( <LEFTPAREN> <RIGHTPAREN> )? ( <DOT> Identifier )*
QuotedString ::= <QUOTED_STRING>
StringLiteral ::= <STRING_LITERAL>
QualifiedName ::= Identifier ( <DOT> Identifier )?
DoubleQualifiedName ::= Identifier <DOT> Identifier ( <DOT> Identifier )?
FunctionDeclaration ::= <DECLARE> <FUNCTION> Identifier ParameterList <LEFTBRACE> Expression <RIGHTBRACE>
Query ::= ( Expression | SelectExpression )
Expression ::= ( OperatorExpr | IfThenElse | QuantifiedExpression )
OperatorExpr ::= AndExpr ( <OR> AndExpr )*
AndExpr ::= RelExpr ( <AND> RelExpr )*
RelExpr ::= AddExpr ( ( <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> | <SIMILAR> ) AddExpr )?
AddExpr ::= MultExpr ( ( <PLUS> | <MINUS> ) MultExpr )*
MultExpr ::= UnaryExpr ( ( <MUL> | <DIV> | <MOD> | <CARET> | <IDIV> ) UnaryExpr )*
UnaryExpr ::= ( ( <PLUS> | <MINUS> ) )? ValueExpr
ValueExpr ::= PrimaryExpr ( Field | Index )*
Field ::= <DOT> Identifier
Index ::= <LEFTBRACKET> ( Expression | <QUES> ) <RIGHTBRACKET>
PrimaryExpr ::= ( FunctionCallExpr | Literal | VariableRef | ListConstructor | RecordConstructor | ParenthesizedExpression )
Literal ::= ( StringLiteral | <INTEGER_LITERAL> | <FLOAT_LITERAL> | <DOUBLE_LITERAL> | <NULL> | <TRUE> | <FALSE> )
VariableRef ::= ( <IDENTIFIER> | QuotedString )
Variable ::= ( <IDENTIFIER> | QuotedString )
ListConstructor ::= ( OrderedListConstructor | UnorderedListConstructor )
OrderedListConstructor ::= <LEFTBRACKET> ExpressionList <RIGHTBRACKET>
UnorderedListConstructor ::= <LEFTDBLBRACE> ExpressionList <RIGHTDBLBRACE>
ExpressionList ::= ( Expression ( <COMMA> ExpressionList )? )? ( Comma )?
Comma ::= <COMMA>
RecordConstructor ::= <LEFTBRACE> ( FieldBinding ( <COMMA> FieldBinding )* )? <RIGHTBRACE>
FieldBinding ::= Expression <COLON> Expression
FunctionCallExpr ::= FunctionName <LEFTPAREN> ( Expression ( <COMMA> Expression )* )? <RIGHTPAREN>
ParenthesizedExpression ::= ( <LEFTPAREN> Expression <RIGHTPAREN> | Subquery )
IfThenElse ::= <IF> <LEFTPAREN> Expression <RIGHTPAREN> <THEN> Expression <ELSE> Expression
SelectExpression ::= ( LetClause )? SelectSetOperation ( OrderbyClause )? ( LimitClause )?
SelectSetOperation ::= SelectBlock ( ( <UNION> | <INTERSECT> | <EXCEPT> ) ( <ALL> )? ( SelectBlock | Subquery ) )*
Subquery ::= <LEFTPAREN> SelectExpression <RIGHTPAREN>
SelectBlock ::= ( SelectClause ( FromClause ( LetClause )? )? ( WhereClause )? ( GroupbyClause ( LetClause )? ( HavingClause )? )? | FromClause ( LetClause )? ( WhereClause )? ( GroupbyClause ( LetClause )? ( HavingClause )? )? SelectClause )
SelectClause ::= <SELECT> ( <ALL> | <DISTINCT> )? ( SelectRegular | SelectElement )
SelectRegular ::= Projection ( <COMMA> Projection )*
SelectElement ::= ( <RAW> | <ELEMENT> | <VALUE> ) Expression
Projection ::= ( Expression ( <AS> )? Identifier | Expression <DOT> <MUL> | <MUL> )
FromClause ::= <FROM> FromTerm ( <COMMA> FromTerm )*
FromTerm ::= Expression ( <AS> )? Variable ( <AT> Variable )? ( ( JoinType )? ( JoinClause | NestClause | UnnestClause ) )*
JoinClause ::= <JOIN> Expression ( <AS> )? Variable ( <AT> Variable )? <ON> Expression
NestClause ::= <NEST> Expression ( <AS> )? Variable ( <AT> Variable )? <ON> Expression
UnnestClause ::= ( <UNNEST> | <CORRELATE> | <FLATTEN> ) Expression ( <AS> )? Variable ( <AT> Variable )?
JoinType ::= ( <INNER> | <LEFT> ( <OUTER> )? )
LetClause ::= ( ( <LET> | <LETTING> ) LetElement ( <COMMA> LetElement )* | <WITH> WithElement ( <COMMA> WithElement )* )
WhereClause ::= <WHERE> Expression
OrderbyClause ::= <ORDER> <BY> Expression ( ( <ASC> ) | ( <DESC> ) )? ( <COMMA> Expression ( ( <ASC> ) | ( <DESC> ) )? )*
GroupbyClause ::= <GROUP> <BY> ( Expression ( ( <AS> )? Variable )? ( <COMMA> Expression ( ( <AS> )? Variable )? )* )
HavingClause ::= <HAVING> Expression
LimitClause ::= <LIMIT> Expression ( <OFFSET> Expression )?
QuantifiedExpression ::= ( ( <SOME> ) | ( <EVERY> ) ) Variable <IN> Expression ( <COMMA> Variable <IN> Expression )* <SATISFIES> Expression
LetElement ::= Variable <EQ> Expression
WithElement ::= Variable <AS> Expression