fastmodel-ide/fastmodel-ide-open-front/antlr/FastModelGrammarParser.g4 (1,623 lines of code) (raw):

parser grammar FastModelGrammarParser; tokens { DELIMITER } options { tokenVocab=FastModelLexer; } root : sqlStatements? MINUSMINUS? EOF ; sqlStatements : (sqlStatement MINUSMINUS? SEMICOLON? | emptyStatement)* (sqlStatement (MINUSMINUS? SEMICOLON)? | emptyStatement) ; emptyStatement : SEMICOLON ; sqlStatement : buStatements | domainStatements | bpStatements | tableStatements | indicatorStatements | materializeStatements | queryOrInsertStatements | adjunctStatements | timePeriodStatements | dictStatements | measureUnitStatements | layerStatements | batchStatements | showStatements | groupStatements | useStatement | call | pipeStatements | ruleStatements | dqcRuleStatements | businessCategoryStatements | impExpStatements | scriptStatements | dimensionStatements | commandStatements ; replace : KW_OR KW_REPLACE ; ifNotExists : KW_IF KW_NOT KW_EXISTS ; alias : KW_ALIAS string ; useStatement: KW_USE unit=identifier #use ; qualifiedName : identifier | identifier (DOT identifier)* ; comment : KW_COMMENT string ; tableNameList : tableName (COMMA tableName)* ; tableProperties : LPAREN keyValueProperty (COMMA keyValueProperty)* RPAREN ; columnParenthesesList : LPAREN columnNameList RPAREN ; columnNameList : columnName (COMMA columnName)* ; columnName : identifier ; alterStatementSuffixRename : KW_RENAME KW_TO qualifiedName ; keyValueProperty : string EQUAL string ; keyProperty : string ; ifExists : KW_IF KW_EXISTS ; unSetProperties : KW_PROPERTIES? LPAREN keyProperty (COMMA keyProperty)* RPAREN ; alterStatementSuffixSetComment : KW_SET comment ; setAliasedName : KW_SET alias ; colType : typeDbCol ; typeDbCol : primitiveType | listType | mapType | structType ; primitiveType : name=KW_TINYINT #genericType | name=KW_SMALLINT #genericType | name=KW_INT #genericType | name=KW_BIGINT #genericType | name=KW_BOOLEAN #genericType | name=KW_FLOAT #genericType | name=KW_DOUBLE KW_PRECISION? #doublePrecisionType | name=KW_DATE #genericType | name=KW_DATETIME #genericType | name=KW_TIMESTAMP #genericType | name=KW_STRING #genericType | name=KW_BINARY #genericType | name=KW_DECIMAL (LPAREN typeParameter (COMMA typeParameter)* RPAREN)? #genericType | name=KW_VARCHAR LPAREN typeParameter RPAREN #genericType | name=KW_CHAR LPAREN typeParameter RPAREN #genericType | name=KW_CUSTOM (LPAREN string RPAREN) (LPAREN typeParameter (COMMA typeParameter)* RPAREN)? #customType ; typeParameter : INTEGER_VALUE | typeDbCol ; listType : KW_ARRAY LESSTHAN typeDbCol GREATERTHAN ; structType : KW_STRUCT LESSTHAN typeList GREATERTHAN ; mapType : KW_MAP LESSTHAN key=typeDbCol COMMA value=typeDbCol GREATERTHAN ; typeList : colonType (COMMA colonType)* ; colonType : identifier COLON typeDbCol (comment)? ; //----------------------------------------------------------------------------------- //-------- Row Constructor ---------------------------------------------------------- //in support of SELECT * FROM (VALUES(1,2,3),(4,5,6),...) as FOO(a,b,c) and // INSERT INTO <table> (col1,col2,...) VALUES(...),(...),... // INSERT INTO <table> (col1,col2,...) SELECT * FROM (VALUES(1,2,3),(4,5,6),...) as Foo(a,b,c) /* VALUES(1),(2) means 2 rows, 1 column each. VALUES(1,2),(3,4) means 2 rows, 2 columns each. VALUES(1,2,3) means 1 row, 3 columns */ // (table|column) tableOrColumn : tableName #tableColumn | columnVar #tableColumn ; columnVar : DOLLAR LCURLY tableName RCURLY | MACRO tableName MACRO ; //----------------------------------------------------------------------------------- //----------------------- Rules for parsing selectClause ----------------------------- // select a,b,c ... expressionsInParenthesis : LPAREN expression (COMMA expression)* RPAREN ; castExpression : KW_CAST LPAREN expression KW_AS primitiveType RPAREN ; caseExpression : KW_CASE operand=expression whenClause+ (KW_ELSE elseExpression=expression)? KW_END ; whenClause :(KW_WHEN when=expression KW_THEN then=expression) ; whenExpression : KW_CASE whenClause+ (KW_ELSE elseExpression=expression)? KW_END ; floorExpression : KW_FLOOR LPAREN expression (KW_TO floorDateQualifiers)? RPAREN ; floorDateQualifiers : KW_YEAR | KW_QUARTER | KW_MONTH | KW_WEEK | KW_DAY | KW_HOUR | KW_MINUTE | KW_SECOND ; extractExpression : KW_EXTRACT LPAREN timeQualifiers KW_FROM expression RPAREN ; timeQualifiers : KW_YEAR | KW_QUARTER | KW_MONTH | KW_WEEK | KW_DAY | KW_DOW | KW_HOUR | KW_MINUTE | KW_SECOND ; constant : intervalLiteral | numberLiteral | dateLiteral | timestampLiteral | timestampLocalTZLiteral | string | stringLiteralSequence | booleanValue | KW_NULL ; string : StringLiteral ; numberLiteral : MINUS? DECIMAL_VALUE #decimalLiteral | MINUS? DOUBLE_VALUE #doubleLiteral | MINUS? INTEGER_VALUE #integerLiteral ; stringLiteralSequence : string string+ ; dateLiteral : KW_DATE string | KW_CURRENT_DATE ; timestampLiteral : KW_TIMESTAMP string | KW_CURRENT_TIMESTAMP ; timestampLocalTZLiteral : KW_TIMESTAMPLOCALTZ string ; intervalValue : string | numberLiteral ; intervalLiteral : intervalValue intervalQualifiers ; intervalExpression : LPAREN intervalValue RPAREN intervalQualifiers | KW_INTERVAL intervalValue intervalQualifiers | KW_INTERVAL LPAREN expression RPAREN intervalQualifiers ; intervalQualifiers: KW_YEAR | KW_MONTH | KW_DAY | KW_HOUR | KW_MINUTE | KW_SECOND | KW_QUARTER | KW_WEEK ; atomExpression : constant #literal | intervalExpression #interval | castExpression #cast | extractExpression #extract | floorExpression #floor | caseExpression #case | whenExpression #when | tableOrColumn #columnReference | base=atomExpression DOT fieldName=identifier #dereference | rowConstructor #rowExpression | functionExpression #functionCall | LPAREN query RPAREN #subqueryExpression | KW_EXISTS LPAREN query RPAREN #exists | KW_SUBSTRING LPAREN expression KW_FROM expression (KW_FOR expression)? RPAREN #substring | KW_GROUPING LPAREN (qualifiedName (COMMA qualifiedName)*)? RPAREN #groupingOperation ; functionExpression: qualifiedName LPAREN STAR RPAREN filter? over? | qualifiedName LPAREN (setQuantifier? expression (COMMA expression)*)? (KW_ORDER KW_BY sortItem (COMMA sortItem)*)? RPAREN filter? (nullTreatment? over)? ; nullTreatment : KW_IGNORE KW_NULLS | KW_RESPECT KW_NULLS ; filter : KW_FILTER LPAREN KW_WHERE expression RPAREN ; over : KW_OVER LPAREN (KW_PARTITION KW_BY partition+=expression (COMMA partition+=expression)*)? (KW_ORDER KW_BY sortItem (COMMA sortItem)*)? windowFrame? RPAREN ; windowFrame : frameType=KW_RANGE startframe=frameBound | frameType=KW_ROWS startframe=frameBound | frameType=KW_GROUPS startframe=frameBound | frameType=KW_RANGE KW_BETWEEN startframe=frameBound KW_AND endframe=frameBound | frameType=KW_ROWS KW_BETWEEN startframe=frameBound KW_AND endframe=frameBound | frameType=KW_GROUPS KW_BETWEEN startframe=frameBound KW_AND endframe=frameBound ; frameBound : KW_UNBOUNDED boundType=KW_PRECEDING #unboundedFrame | KW_UNBOUNDED boundType=KW_FOLLOWING #unboundedFrame | KW_CURRENT KW_ROW #currentRowBound | expression boundType=(KW_PRECEDING | KW_FOLLOWING) #boundedFrame ; isCondition : KW_NULL | KW_TRUE | KW_FALSE | KW_NOT KW_NULL | KW_NOT KW_TRUE | KW_NOT KW_FALSE ; comparisonOperator: LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN | EQUAL | EQUAL_NS | NOTEQUAL ; rowConstructor : LPAREN expression (COMMA expression)+ RPAREN | KW_ROW LPAREN expression (COMMA expression)* RPAREN ; expression : atomExpression #atom | operator=(PLUS | MINUS | TILDE) expression #unAryExpression | expression KW_IS isCondition #isCondExpression | left=expression operator=(STAR | DIVIDE | MOD | DIV | PLUS | MINUS) right=expression #arithmetic | left=expression operator=(CONCATENATE | AMPERSAND | BITWISEOR | BITWISEXOR) right=expression #bitOperation | left=expression comparisonOperator right=expression #comparison | left=expression KW_NOT? KW_IN expressionsInParenthesis #inExpression | left=expression KW_NOT? KW_IN LPAREN query RPAREN #inSubQuery | left=expression KW_NOT? KW_BETWEEN lower=expression KW_AND upper=expression #betweenPredict | left=expression KW_NOT? operator=(KW_LIKE|KW_RLIKE|KW_REGEXP) condition=(KW_ANY|KW_ALL)? right=expression #likeExpression | left=expression KW_IS KW_NOT? KW_DISTINCT KW_FROM right=expression #distinctFrom | KW_NOT expression #notExpression | left=expression operator=KW_AND right=expression #logicalBinary | left=expression operator=KW_OR right=expression #logicalBinary | LPAREN expression RPAREN #parenthesizedExpression ; booleanValue : KW_TRUE | KW_FALSE ; setProperties : KW_PROPERTIES? tableProperties ; identifier : Identifier | nonReserved | sql11ReservedKeywordsUsedAsIdentifier | sysFuncNames | TIME_ID ; identifierWithoutSql11 : Identifier | nonReserved ; partitionSpec : KW_PARTITION LPAREN partitionExpression (COMMA partitionExpression)* RPAREN ; partitionExpression: columnName EQUAL constant ; nonReserved : KW_ADD | KW_ASC | KW_DESC | KW_CHANGE | KW_CLUSTER | KW_COLUMNS | KW_COLUMN | KW_COMMENT | KW_DAY | KW_DOUBLE | KW_DATETIME | KW_IF | KW_PARTITION | KW_DISABLE | KW_DISTRIBUTE | KW_DOW | KW_ENABLE | KW_ENFORCED | KW_FIRST | KW_HOUR | KW_TABLES | KW_LAST | KW_LIMIT | KW_OFFSET | KW_MINUTE | KW_MONTH | KW_NULLS | KW_OVERWRITE | KW_QUARTER | KW_RENAME | KW_REPLACE | KW_TYPE | KW_SECOND | KW_SEMI | KW_SETS | KW_SHOW | KW_SORT | KW_STRING | KW_STRUCT | KW_TINYINT | KW_UNIONTYPE | KW_UNSET | KW_WEEK | KW_YEAR | KW_LEVEL | KW_RELY | KW_NORELY | KW_VALIDATE | KW_NOVALIDATE | KW_KEY | KW_DEFAULT | KW_CODE | KW_DWS | KW_NORMAL | KW_TRANSACTION | KW_AGGREGATE | KW_PERIODIC_SNAPSHOT | KW_ACCUMULATING_SNAPSHOT | KW_CONSOLIDATED | KW_FACTLESS | KW_CALL | KW_FLOOR | KW_SOURCE | KW_URL | KW_PRIMARY |KW_BIZ_DATE | KW_TARGET | KW_TARGET_TYPE | KW_COPY_MODE | KW_PASSWORD | KW_MATERIALIZED | KW_ENGINE | KW_PROPERTIES | KW_OUTPUT | KW_RLIKE | KW_BERNOULLI | KW_SYSTEM | KW_RECURSIVE | KW_FETCH | KW_FIRST | KW_NEXT | KW_ONLY | KW_TIES | KW_FOR | KW_SUBSTRING | KW_PIPE | KW_SYNC | KW_ASYNC | KW_COPY | KW_CASE | KW_WHEN | KW_THEN | KW_ELSE | KW_END | KW_LIMIT | KW_DERIVATIVE | KW_COMPOSITE | KW_ATOMIC | KW_ENUM | KW_LEVEL | KW_ORDINALITY | KW_MAP | KW_PROCESS | KW_PROCESSES | KW_DOMAIN | KW_DOMAINS | KW_DIALECT | KW_FULL_BU | KW_FULL_BUS | KW_ADJUNCT | KW_ADJUNCTS | KW_DICT | KW_DICTS | KW_TIMEPERIOD | KW_TIMEPERIODS | KW_MEASUREUNIT | KW_MEASUREUNITS | KW_INDICATOR | KW_INDICATORS | KW_BATCH | KW_BATCHES| KW_PATH | KW_LAYER | KW_COlGROUP | KW_ATTRIBUTE | KW_MEASUREMENT | KW_CORRELATION | KW_PARTITIONED | KW_INCLUDE | KW_EXCLUDE | KW_CHECKERS | KW_LAYERS | KW_DROP | KW_USE | KW_DATEFIELD | KW_UNNEST | KW_VIEW | KW_HAVING | KW_WHERE | KW_PRESERVE | KW_JOIN | KW_CROSS | KW_TABLESAMPLE | KW_PRECISION | KW_CHECKER | KW_GROUPING | KW_ORDER | KW_CODES | KW_ALIAS | KW_FILTER | KW_EXTRACT | KW_ANY | KW_EXCEPT | ByteLengthLiteral | KW_CAST | KW_RESPECT | KW_DIM | KW_FACT | KW_INTERVAL | KW_ON | KW_GROUPS | KW_CONSTRAINT | KW_TRANSFORM | KW_CURRENT | KW_FROM | KW_IGNORE | KW_REDUCE | KW_REFERENCES | KW_DISTINCT | KW_SQL | KW_TASK | KW_RULES | KW_RULE | KW_DQC_RULE | KW_CHECK | KW_NAMING | KW_REL_DIMENSION | KW_REL_INDICATOR | KW_REDUNDANT | KW_EXP | KW_EXPORT | KW_UNIQUE | KW_INDEX | KW_IMPORT | KW_CUSTOM | KW_BUSINESS_CATEGORIES | KW_BUSINESS_CATEGORY | KW_DIMENSION | KW_MARKET | KW_SUBJECT | KW_ATTRIBUTES | KW_DIMENSIONS | KW_DIM_ATTRIBUTES | KW_MARKETS | KW_SUBJECTS | KW_DYNAMIC | KW_ADS | KW_RENDER | KW_INCREASE | KW_VARCHAR | KW_DECREASE |KW_REF | KW_STAT_TIME | KW_IMPORT_SQL | KW_EXPORT_SQL | KW_STRONG | KW_WEAK | KW_SELECT | KW_PRECEDING | KW_UNBOUNDED | KW_FOLLOWING | KW_ADVANCED | KW_MATERIALIZED | KW_TIMESTAMPLOCALTZ | KW_UNIONTYPE ; sysFuncNames : KW_AND | KW_OR | KW_NOT | KW_LIKE | KW_IF | KW_CASE | KW_WHEN | KW_TINYINT | KW_SMALLINT | KW_INT | KW_BIGINT | KW_FLOAT | KW_DOUBLE | KW_BOOLEAN | KW_STRING | KW_BINARY | KW_ARRAY | KW_MAP | KW_STRUCT | KW_UNIONTYPE | DIV | KW_RLIKE | KW_REGEXP | KW_IN | KW_BETWEEN | KW_CHAR ; //The following SQL2011 reserved keywords are used as identifiers in many q tests, they may be added back due to backward compatibility. sql11ReservedKeywordsUsedAsIdentifier : KW_ALL | KW_ALTER | KW_ARRAY | KW_AS | KW_BETWEEN | KW_BIGINT | KW_BINARY | KW_BOOLEAN | KW_BY | KW_CREATE | KW_CURRENT_DATE | KW_CURRENT_TIMESTAMP | KW_DATE | KW_DECIMAL | KW_DELETE | KW_DESCRIBE | KW_DOUBLE | KW_DROP | KW_EXISTS | KW_FALSE | KW_FETCH | KW_FLOAT | KW_FOR | KW_FULL | KW_GROUP | KW_GROUPING | KW_IN | KW_INNER | KW_INSERT | KW_INT | KW_INTERSECT | KW_INTO | KW_IS | KW_LATERAL | KW_LEFT | KW_LIKE | KW_NULL | KW_OF | KW_ORDER | KW_OUTER | KW_PARTITION | KW_PERCENT | KW_RANGE | KW_RIGHT | KW_OVER | KW_TABLE | KW_ROLLUP | KW_ROW | KW_ROWS | KW_SET | KW_SMALLINT | KW_TIMESTAMP | KW_TO | KW_TRUE | KW_TRUNCATE | KW_UNION | KW_USER | KW_USING | KW_VALUES | KW_WITH | KW_WINDOW | KW_NATURAL ; buStatements: createBuStatement | setBuComment | setBuAlias ; createBuStatement : KW_CREATE replace? KW_FULL_BU ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; setBuAlias : KW_ALTER KW_FULL_BU identifier setAliasedName ; setBuComment : KW_ALTER KW_FULL_BU identifier alterStatementSuffixSetComment ; domainStatements: createDomainStatement | setDomainComment | setDomainProperties | unSetDomainProperties | renameDomain | dropDomainStatement | setDomainAliasedName ; createDomainStatement :KW_CREATE replace? KW_DOMAIN ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; setDomainComment :KW_ALTER KW_DOMAIN qualifiedName alterStatementSuffixSetComment ; setDomainAliasedName : KW_ALTER KW_DOMAIN qualifiedName setAliasedName ; setDomainProperties :KW_ALTER KW_DOMAIN qualifiedName KW_SET setProperties ; unSetDomainProperties : KW_ALTER KW_DOMAIN qualifiedName KW_UNSET unSetProperties ; renameDomain : KW_ALTER KW_DOMAIN qualifiedName alterStatementSuffixRename ; dropDomainStatement : KW_DROP KW_DOMAIN qualifiedName ; bpStatements: createBpStatement | renameBp | setBpComment | setBpAliasedName | setBpProperties | unSetBpProperties | dropBpStatement ; createBpStatement : KW_CREATE replace? KW_PROCESS ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; renameBp : KW_ALTER KW_PROCESS qualifiedName alterStatementSuffixRename ; setBpAliasedName : KW_ALTER KW_PROCESS qualifiedName setAliasedName ; setBpComment : KW_ALTER KW_PROCESS qualifiedName alterStatementSuffixSetComment ; setBpProperties : KW_ALTER KW_PROCESS qualifiedName KW_SET setProperties ; unSetBpProperties : KW_ALTER KW_PROCESS qualifiedName KW_UNSET unSetProperties ; dropBpStatement : KW_DROP KW_PROCESS qualifiedName ; tableStatements: createTableStatement | renameTable | addCol | dropCol | changeCol | addPartitionCol | dropPartitionCol | addConstraint | dropConstraint | setTableComment | setTableProperties | unSetTableProperties | dropTableStatement | setTableAliasedName | trunctTable | createIndex | dropIndex ; createTableStatement : KW_CREATE (replace)? tableType KW_TABLE ifNotExists? tableName alias? (LPAREN columnNameTypeOrConstraintList RPAREN)? comment? tablePartition? (KW_WITH setProperties)? likeTablePredicate? ; likeTablePredicate: KW_LIKE likeTable=tableName ; tablePartition : KW_PARTITIONED KW_BY LPAREN columnNameTypeOrConstraintList RPAREN ; tableType : dimDetailType? type=KW_DIM | factDetailType? type=KW_FACT | type=KW_CODE | dwDetailType? type=KW_DWS | type=KW_ADS ; dwDetailType: KW_ADVANCED ; dimDetailType : KW_LEVEL | KW_ENUM | KW_NORMAL ; factDetailType : KW_PERIODIC_SNAPSHOT | KW_ACCUMULATING_SNAPSHOT | KW_AGGREGATE | KW_CONSOLIDATED | KW_TRANSACTION | KW_FACTLESS ; columnNameTypeOrConstraintList : columnNameTypeOrConstraint (COMMA columnNameTypeOrConstraint)* ; columnNameTypeOrConstraint : columnDefinition | tableConstraint | tableIndex ; tableIndex : (KW_INDEX | KW_KEY) identifier indexColumnNames indexOption? ; createIndex : KW_CREATE KW_INDEX qualifiedName KW_ON tableName indexColumnNames indexOption? ; dropIndex : KW_DROP KW_INDEX qualifiedName KW_ON tableName ; indexColumnNames : '(' indexColumnName (',' indexColumnName)* ')' ; indexColumnName : columnName ('(' numberLiteral ')')? sortType=(KW_ASC | KW_DESC)? ; indexOption : KW_WITH setProperties ; tableConstraint : createDimKey | primaryConstraint | createLevelConstraint | colGroupConstraint | timePeriodConstraint | redundantConstraint | uniqueConstraint ; colGroupConstraint : (KW_CONSTRAINT identifier)? KW_COlGROUP KW_KEY? columnParenthesesList ; createDimKey : (KW_CONSTRAINT identifier)? KW_DIM KW_KEY? columnParenthesesList? KW_REFERENCES tableName referenceColumnList? ; timePeriodConstraint : (KW_CONSTRAINT identifier)? KW_TIMEPERIOD KW_KEY? KW_REFERENCES columnParenthesesList ; redundantConstraint : (KW_CONSTRAINT identifier)? KW_REDUNDANT KW_KEY? columnName KW_REFERENCES joinColumn referenceColumnList? ; uniqueConstraint : (KW_CONSTRAINT identifier)? KW_UNIQUE KW_KEY? columnParenthesesList ; joinColumn : qualifiedName ; referenceColumnList : columnParenthesesList ; createLevelConstraint : (KW_CONSTRAINT identifier)? KW_LEVEL levelColParenthesesList (comment)? ; levelColParenthesesList : LESSTHAN levelCol GREATERTHAN ; levelCol : levelColPath (COMMA levelColPath)* ; levelColPath : columnName (COLON columnParenthesesList)? ; primaryConstraint : (KW_CONSTRAINT identifier)? KW_PRIMARY KW_KEY columnParenthesesList ; columnDefinition : identifier alias? colType category? columnConstraintType* defaultValue? comment? (KW_WITH tableProperties)? referencesObjects? ; category : KW_ATTRIBUTE | KW_MEASUREMENT | KW_CORRELATION | KW_REL_DIMENSION | KW_REL_INDICATOR | KW_STAT_TIME | KW_PARTITION ; referencesObjects: KW_REFERENCES (referenceColumnList | qualifiedName) ; addCol : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixAddCol ; renameTable : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixRename ; setTableProperties : KW_ALTER tableType? KW_TABLE tableName KW_SET setProperties ; unSetTableProperties : KW_ALTER tableType? KW_TABLE tableName KW_UNSET unSetProperties ; setTableComment : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixSetComment ; dropCol : KW_ALTER tableType? KW_TABLE tableName KW_DROP KW_COLUMN columnName ; setTableAliasedName : KW_ALTER tableType? KW_TABLE tableName setAliasedName ; addPartitionCol : KW_ALTER tableType? KW_TABLE tableName KW_ADD KW_PARTITION KW_COLUMN columnDefinition ; dropPartitionCol : KW_ALTER tableType? KW_TABLE tableName KW_DROP KW_PARTITION KW_COLUMN columnName ; addConstraint : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixAddConstraint ; dropConstraint : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixDropConstraint ; changeCol : KW_ALTER tableType? KW_TABLE tableName alterStatementSuffixRenameCol #changeAll | KW_ALTER tableType? KW_TABLE tableName KW_CHANGE KW_COLUMN left=identifier KW_RENAME KW_TO right=identifier #renameCol | KW_ALTER tableType? KW_TABLE tableName KW_CHANGE KW_COLUMN identifier KW_COMMENT string #setColComment | KW_ALTER tableType? KW_TABLE tableName KW_CHANGE KW_COLUMN identifier KW_SET setProperties #setColProperties | KW_ALTER tableType? KW_TABLE tableName KW_CHANGE KW_COLUMN identifier KW_UNSET unSetProperties #unSetColProperties ; alterStatementSuffixDropConstraint : KW_DROP KW_CONSTRAINT identifier ; alterStatementSuffixAddCol : (KW_ADD | KW_REPLACE) KW_COLUMNS LPAREN columnNameTypeList RPAREN ; alterStatementSuffixAddConstraint : KW_ADD tableConstraint ; alterStatementSuffixRenameCol : KW_CHANGE KW_COLUMN? old=identifier newIdentifier=identifier alias? colType category? alterColumnConstraint[$newIdentifier.ctx]? comment? (KW_WITH setProperties)? referencesObjects? ; enableSpecification : KW_ENABLE | KW_DISABLE ; alterColumnConstraint[ParserRuleContext value] : columnConstraintType enableSpecification? ; dropTableStatement : KW_DROP KW_TABLE ifExists? tableName ; defaultValue : KW_DEFAULT constant ; columnConstraintType : KW_NOT? KW_NULL | KW_PRIMARY KW_KEY ; columnNameTypeList : columnNameType (COMMA columnNameType)* ; columnNameType : columnDefinition ; trunctTable : KW_TRUNCATE KW_TABLE? tableName partitionSpec? ; indicatorStatements: renameIndicator | setIndicatorComment | setIndicatorProperties | dropIndicatorStatement | createIndicatorStatement | setIndicatorAlias ; indicatorType : KW_ATOMIC KW_COMPOSITE? | KW_DERIVATIVE KW_COMPOSITE? ; renameIndicator : KW_ALTER indicatorType? KW_INDICATOR qualifiedName alterStatementSuffixRename ; setIndicatorComment : KW_ALTER indicatorType? KW_INDICATOR qualifiedName alterStatementSuffixSetComment ; setIndicatorProperties : KW_ALTER indicatorType? KW_INDICATOR qualifiedName alterIndicatorSuffixProperties ; alterIndicatorSuffixProperties : colType? (KW_REFERENCES tableName)? (KW_SET setProperties)? (KW_AS expression)? ; setIndicatorAlias : KW_ALTER indicatorType? KW_INDICATOR qualifiedName setAliasedName ; dropIndicatorStatement :KW_DROP KW_INDICATOR qualifiedName ; createIndicatorStatement : KW_CREATE replace? indicatorType? KW_INDICATOR ifNotExists? qualifiedName alias? typeDbCol? (KW_REFERENCES tableName)? comment? (KW_WITH setProperties)? (KW_AS expression)? ; materializeStatements : createMaterializeStatement | renameMaterialize | setMaterializeComment | setMaterializeProperties | dropMaterializeStatement | setMaterializeAlias ; createMaterializeStatement : KW_CREATE replace? KW_MATERIALIZED KW_VIEW qualifiedName alias? KW_REFERENCES (LPAREN tableNameList RPAREN) comment? KW_ENGINE identifier (KW_WITH setProperties)? ; renameMaterialize : KW_ALTER KW_MATERIALIZED KW_VIEW qualifiedName alterStatementSuffixRename ; setMaterializeComment: KW_ALTER KW_MATERIALIZED KW_VIEW qualifiedName alterStatementSuffixSetComment ; setMaterializeAlias: KW_ALTER KW_MATERIALIZED KW_VIEW qualifiedName setAliasedName ; setMaterializeProperties: KW_ALTER KW_MATERIALIZED KW_VIEW qualifiedName (KW_REFERENCES (LPAREN tableNameList RPAREN))? (KW_ENGINE identifier)? alterMaterializeProperties ; alterMaterializeProperties : KW_SET KW_PROPERTIES tableProperties | KW_UNSET KW_PROPERTIES ifExists? tableProperties ; dropMaterializeStatement : KW_DROP KW_MATERIALIZED KW_VIEW ifExists? qualifiedName ; layerStatements: createLayer | renameLayer | setLayerComment | setLayerProperties | addLayerChecker | dropLayerChecker | dropLayer | setLayerAlias ; createLayer: KW_CREATE replace? KW_LAYER ifNotExists? qualifiedName alias? checkers? comment? (KW_WITH setProperties)? ; checkers: LPAREN checker (COMMA checker)* RPAREN ; checker: KW_CHECKER type=identifier name=identifier string comment? ; renameLayer: KW_ALTER KW_LAYER qualifiedName alterStatementSuffixRename ; setLayerComment: KW_ALTER KW_LAYER qualifiedName alterStatementSuffixSetComment ; setLayerProperties: KW_ALTER KW_LAYER qualifiedName KW_SET setProperties ; setLayerAlias: KW_ALTER KW_LAYER qualifiedName setAliasedName ; addLayerChecker: KW_ALTER KW_LAYER qualifiedName KW_ADD checker ; dropLayerChecker: KW_ALTER KW_LAYER qualifiedName KW_DROP KW_CHECKER identifier ; dropLayer: KW_DROP KW_LAYER ifExists? qualifiedName ; dictStatements: createDict | renameDict | setDictComment | setDictProperties | dropDataDict | setDictAlias ; createDict: KW_CREATE replace? KW_DICT ifNotExists? qualifiedName alias? typeDbCol columnConstraintType? defaultValue? comment? (KW_WITH setProperties)? ; setDictAlias: KW_ALTER KW_DICT qualifiedName setAliasedName ; renameDict: KW_ALTER KW_DICT qualifiedName alterStatementSuffixRename ; setDictComment: KW_ALTER KW_DICT qualifiedName alterStatementSuffixSetComment ; setDictProperties: KW_ALTER KW_DICT qualifiedName typeDbCol? columnConstraintType? enableSpecification? defaultValue? KW_SET setProperties? ; dropDataDict: KW_DROP KW_DICT qualifiedName ; adjunctStatements: createAdjunct | renameAdjunct | setAdjunctComment | setAdjunctProperties | setAdjunctAlias | dropAdjunct ; /**创建修饰词**/ createAdjunct: KW_CREATE replace? KW_ADJUNCT ifNotExists? qualifiedName alias? (comment)? (KW_WITH setProperties)? (KW_AS expression)? ; setAdjunctAlias : KW_ALTER KW_ADJUNCT qualifiedName setAliasedName ; renameAdjunct: KW_ALTER KW_ADJUNCT qualifiedName alterStatementSuffixRename ; setAdjunctComment: KW_ALTER KW_ADJUNCT qualifiedName alterStatementSuffixSetComment ; setAdjunctProperties: KW_ALTER KW_ADJUNCT qualifiedName KW_SET setProperties? (KW_AS? expression)? ; dropAdjunct: KW_DROP KW_ADJUNCT qualifiedName ; timePeriodStatements: createTimePeriod | timePeriodExpression | renameTimePeriod | setTimePeriodComment | setTimePeriodProperties | dropTimePeriod | setTimePeriodAlias ; createTimePeriod: KW_CREATE replace? KW_TIMEPERIOD ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? (KW_AS timePeriodExpression)? ; timePeriodExpression : KW_BETWEEN lower=expression KW_AND upper=expression ; renameTimePeriod: KW_ALTER KW_TIMEPERIOD qualifiedName alterStatementSuffixRename; setTimePeriodComment: KW_ALTER KW_TIMEPERIOD qualifiedName alterStatementSuffixSetComment; setTimePeriodAlias: KW_ALTER KW_TIMEPERIOD qualifiedName setAliasedName ; setTimePeriodProperties: KW_ALTER KW_TIMEPERIOD qualifiedName KW_SET setProperties? (KW_AS? timePeriodExpression)? ; dropTimePeriod: KW_DROP KW_TIMEPERIOD ifExists? qualifiedName ; groupStatements: createGroup | setGroupComment | setGroupProperties | dropGroup | renameGroup | setGroupAlias ; createGroup: KW_CREATE replace? KW_GROUP type=groupType ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; groupType : KW_MEASUREUNIT | KW_DICT | KW_CODE ; setGroupAlias : KW_ALTER KW_GROUP type=groupType qualifiedName setAliasedName ; setGroupComment: KW_ALTER KW_GROUP type=groupType qualifiedName alterStatementSuffixSetComment ; setGroupProperties: KW_ALTER KW_GROUP type=groupType qualifiedName KW_SET setProperties ; dropGroup: KW_DROP KW_GROUP type=groupType qualifiedName ; renameGroup : KW_ALTER KW_GROUP type=groupType qualifiedName alterStatementSuffixRename ; measureUnitStatements : createMeasureUnit | renameMeasureUnit | setMeasureUnitComment | setMeasureUnitProperties | dropMeasureUnit | setMeasureUnitAlias ; createMeasureUnit: KW_CREATE replace? KW_MEASUREUNIT ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; renameMeasureUnit: KW_ALTER KW_MEASUREUNIT qualifiedName alterStatementSuffixRename; setMeasureUnitComment: KW_ALTER KW_MEASUREUNIT qualifiedName alterStatementSuffixSetComment ; setMeasureUnitProperties: KW_ALTER KW_MEASUREUNIT qualifiedName KW_SET setProperties ; dropMeasureUnit: KW_DROP KW_MEASUREUNIT ifExists? qualifiedName ; setMeasureUnitAlias: KW_ALTER KW_MEASUREUNIT qualifiedName setAliasedName ; showStatements: showCreate | showObjects | describe ; showCreate: KW_SHOW KW_CREATE type=showType qualifiedName output? ; output: KW_OUTPUT EQUAL identifier ; showObjects: KW_SHOW (KW_FULL)? (type=showObjectTypes) ((KW_FROM | KW_IN) qualifiedName)? ((KW_LIKE string) | (KW_WHERE expression))? (KW_OFFSET offset=INTEGER_VALUE)? (KW_LIMIT limit=INTEGER_VALUE)? ; describe: (KW_DESC | KW_DESCRIBE) type=showType qualifiedName ; showObjectTypes: tableType? KW_TABLES | indicatorType? KW_INDICATORS | KW_DOMAINS | KW_DICTS | KW_TIMEPERIODS | KW_ADJUNCTS | KW_MEASUREUNITS | KW_PROCESSES | KW_LAYERS | KW_DICT KW_GROUPS | KW_MEASUREUNIT KW_GROUPS | KW_BATCHES | KW_BUSINESS_CATEGORIES | KW_DIMENSIONS | KW_MARKETS | KW_SUBJECTS | KW_DIM_ATTRIBUTES | KW_CODES | KW_COLUMNS ; showType: KW_TABLE | KW_INDICATOR | KW_DOMAIN | KW_DICT | KW_TIMEPERIOD | KW_ADJUNCT | KW_MEASUREUNIT | KW_PROCESS | KW_LAYER | KW_CODE | KW_GROUP | KW_PROCESS | KW_BATCH | KW_BUSINESS_CATEGORY ; batchStatements: createBatch ; createBatch : createBatchIndicator | createBatchDomain | createBatchDict ; createBatchIndicator: KW_CREATE replace? KW_BATCH KW_INDICATOR? ifNotExists? qualifiedName LPAREN batchElement (COMMA batchElement)* RPAREN (KW_WITH setProperties)? ; createBatchDomain: KW_CREATE replace? KW_BATCH KW_DOMAIN ifNotExists? qualifiedName LPAREN domainElement (COMMA domainElement)* RPAREN (KW_WITH setProperties)? ; createBatchDict : KW_CREATE replace? KW_BATCH KW_NAMING? KW_DICT ifNotExists? qualifiedName LPAREN batchDictElement (COMMA batchDictElement)* RPAREN comment? (KW_WITH setProperties)? ; batchDictElement : identifier alias? comment? (KW_WITH setProperties)? ; batchElement : indicatorDefine | timePeriod | defaultAdjunct | fromTable | dimTable | dimPath | dateField ; domainElement : identifier comment? (KW_WITH setProperties)? ; indicatorDefine : define=identifier (comment)? (KW_ADJUNCT adjunct)? KW_REFERENCES atomic=identifier (KW_AS expression)? ; adjunct: LPAREN (identifier (COMMA identifier)*) RPAREN ; timePeriod : KW_TIMEPERIOD identifier ; defaultAdjunct : KW_ADJUNCT LPAREN identifier(COMMA identifier)* RPAREN ; fromTable : KW_FROM KW_TABLE LPAREN identifier (COMMA identifier)* RPAREN ; dimTable : KW_DIM KW_TABLE LPAREN identifier (COMMA identifier)* RPAREN ; dateField : KW_DATEFIELD LPAREN tableOrColumn COMMA pattern=string RPAREN ; dimPath : KW_DIM KW_PATH LPAREN path (COMMA path)* RPAREN ; path : LESSTHAN identifier (COMMA identifier)* GREATERTHAN ; tableName : identifier (DOT identifier)* | identifier ; pipeStatements : createPipe ; createPipe : KW_CREATE replace? pipeType? KW_PIPE ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? KW_AS copyIntoFrom ; copyIntoFrom : KW_COPY KW_INTO targetType (KW_WITH copy=keyValuePairs)? KW_FROM tableName KW_WHERE expression ; keyValuePairs : LPAREN keyValue (COMMA keyValue)* RPAREN ; keyValue : pipeKey EQUAL constant ; targetType: KW_TABLE | KW_DICT ; pipeType: KW_SYNC | KW_ASYNC ; pipeKey : KW_TARGET | KW_COPY_MODE ; queryOrInsertStatements: query | insertInto | delete ; query : with? queryNoWith ; insertInto : KW_INSERT (KW_INTO | KW_OVERWRITE) tableName partitionSpec? columnParenthesesList? query ; delete: KW_DELETE deleteType? KW_FROM qualifiedName KW_WHERE expression ; deleteType : KW_TABLE | indicatorType? KW_INDICATOR ; with : KW_WITH KW_RECURSIVE? namedQuery (COMMA namedQuery)* ; queryNoWith: queryTerm (KW_ORDER KW_BY sortItem (COMMA sortItem)*)? (KW_OFFSET offset=rowCount (KW_ROW | KW_ROWS)?)? ((KW_LIMIT limit=limitRowCount) | (KW_FETCH (KW_FIRST | KW_NEXT) (fetchFirst=rowCount)? (KW_ROW | KW_ROWS) (KW_ONLY | KW_WITH KW_TIES)))? ; limitRowCount : KW_ALL | rowCount ; rowCount : INTEGER_VALUE | '?' ; queryTerm : queryPrimary #queryTermDefault | left=queryTerm operator=KW_INTERSECT setQuantifier? right=queryTerm #setOperation | left=queryTerm operator=(KW_UNION | KW_EXCEPT) setQuantifier? right=queryTerm #setOperation ; queryPrimary : querySpecification #queryPrimaryDefault | KW_TABLE qualifiedName #table | KW_VALUES expression (COMMA expression)* #inlineTable | LPAREN queryNoWith RPAREN #subquery ; sortItem : expression ordering=(KW_ASC | KW_DESC)? (KW_NULLS nullOrdering=(KW_FIRST | KW_LAST))? ; querySpecification : KW_SELECT (hints=hint)? setQuantifier? selectItem (',' selectItem)* (KW_FROM relation (COMMA relation)*)? (KW_WHERE where=expression)? (KW_GROUP KW_BY groupBy)? (KW_HAVING having=expression)? ; hint : HINT_START hintStatements+=hintStatement (COMMA? hintStatements+=hintStatement)* HINT_END ; hintStatement : hintName=identifier | hintName=identifier LPAREN parameters+=expression (COMMA parameters+=expression)* RPAREN ; groupBy : setQuantifier? groupingElement (COMMA groupingElement)* ; groupingElement : groupingSet #singleGroupingSet | KW_ROLLUP LPAREN (expression (COMMA expression)*)? RPAREN #rollup | KW_CUBE LPAREN (expression (COMMA expression)*)? RPAREN #cube | KW_GROUPING KW_SETS LPAREN groupingSet (COMMA groupingSet)* RPAREN #multipleGroupingSets ; groupingSet : LPAREN (expression (COMMA expression)*)? RPAREN | expression ; namedQuery : name=identifier (columnAliases)? KW_AS LPAREN query RPAREN ; setQuantifier : KW_DISTINCT | KW_ALL ; selectItem : expression (KW_AS? identifier)? #selectSingle | atomExpression DOT STAR (KW_AS columnAliases)? #selectAll | STAR #selectAll ; relation : left=relation ( KW_CROSS KW_JOIN right=sampledRelation | joinType KW_JOIN rightRelation=relation joinCriteria | KW_NATURAL joinType KW_JOIN right=sampledRelation ) #joinRelation | sampledRelation #relationDefault ; joinType : KW_INNER? | KW_LEFT KW_OUTER? | KW_RIGHT KW_OUTER? | KW_FULL KW_OUTER? ; joinCriteria : KW_ON expression | KW_USING LPAREN identifier (COMMA identifier)* RPAREN ; sampledRelation : aliasedRelation ( KW_TABLESAMPLE sampleType LPAREN percentage=expression RPAREN )? ; sampleType : KW_BERNOULLI | KW_SYSTEM ; aliasedRelation : relationPrimary (KW_AS? identifierWithoutSql11 columnAliases?)? ; columnAliases : LPAREN identifier (COMMA identifier)* RPAREN ; relationPrimary : qualifiedName #tableQualifiedName | LPAREN query RPAREN #subqueryRelation | KW_UNNEST LPAREN expression (COMMA expression)* RPAREN (KW_WITH KW_ORDINALITY)? #unnest | KW_LATERAL LPAREN query RPAREN #lateral | LPAREN relation RPAREN #parenthesizedRelation ; call : KW_CALL functionExpression ; ruleStatements: createRules | addRule | changeRule | dropRule ; createRules: KW_CREATE replace? ruleLevel? KW_RULES ifNotExists? qualifiedName alias? KW_REFERENCES tableName partitionSpec? (LPAREN columnOrTableRuleList RPAREN)? comment? (KW_WITH setProperties)? ; alterRuleSuffix: qualifiedName | KW_REFERENCES tableName partitionSpec? ; addRule: KW_ALTER ruleLevel? KW_RULES alterRuleSuffix KW_ADD KW_RULE LPAREN columnOrTableRuleList RPAREN ; changeRule: KW_ALTER ruleLevel? KW_RULES alterRuleSuffix KW_CHANGE KW_RULE LPAREN changeRuleItem (COMMA changeRuleItem)* RPAREN ; changeRuleItem: oldRule=identifier columnOrTableRule ; dropRule : KW_ALTER ruleLevel? KW_RULES alterRuleSuffix KW_DROP KW_RULE ruleName=identifier ; ruleLevel: KW_SQL | KW_TASK ; ruleGrade : KW_STRONG | KW_WEAK ; columnOrTableRuleList : columnOrTableRule (COMMA columnOrTableRule)* ; columnOrTableRule : ruleGrade? identifier alias? strategy comment? KW_DISABLE? ; strategy : functionExpression (KW_AS colType)? comparisonOperator numberLiteral #fixedStrategy | functionExpression (KW_AS colType)? volOperator? intervalVol #volStrategy | KW_DYNAMIC '(' functionExpression (KW_AS colType)? COMMA numberLiteral ')' #dynamicStrategy ; volOperator : KW_INCREASE | KW_DECREASE ; intervalVol : LSQUARE low=numberLiteral COMMA high=numberLiteral RSQUARE ; dropRules: KW_DROP KW_RULES ifExists? qualifiedName ; dqcRuleStatements: createDqcRule | addDqcRule | changeDqcRule | dropDqcRule ; createDqcRule: KW_CREATE replace? KW_DQC_RULE ifNotExists? qualifiedName alias? KW_ON KW_TABLE tableName partitionSpec? (LPAREN dqcColumnOrTableRuleList RPAREN)? comment? (KW_WITH setProperties)? ; alterDqcRuleSuffix: qualifiedName | KW_ON KW_TABLE tableName partitionSpec? ; addDqcRule: KW_ALTER KW_DQC_RULE alterDqcRuleSuffix KW_ADD LPAREN dqcColumnOrTableRuleList RPAREN ; changeDqcRule: KW_ALTER KW_DQC_RULE alterDqcRuleSuffix KW_CHANGE LPAREN changeDqcRuleItem (COMMA changeDqcRuleItem)* RPAREN ; changeDqcRuleItem: oldRule=identifier dqcColumnOrTableRule ; dropDqcRule : KW_ALTER KW_DQC_RULE alterDqcRuleSuffix KW_DROP ruleName=identifier ; dqcColumnOrTableRuleList : dqcColumnOrTableRule (COMMA dqcColumnOrTableRule)* ; dqcColumnOrTableRule : KW_CONSTRAINT constraint=identifier (KW_CHECK expression)? enforce? KW_DISABLE? #dqcTableRule ; enforce : KW_NOT? KW_ENFORCED ; businessCategoryStatements: createBusinessCategoryStatement | renameBusinessCategory | setBusinessCategoryAliasedName | setBusinessCategoryComment | setBusinessCategoryProperties | unSetBusinessCategoryProperties | dropBusinessCategoryStatement ; createBusinessCategoryStatement : KW_CREATE replace? categoryType ifNotExists? qualifiedName alias? comment? (KW_WITH setProperties)? ; categoryType : KW_BUSINESS_CATEGORY | KW_MARKET | KW_SUBJECT ; renameBusinessCategory : KW_ALTER categoryType qualifiedName alterStatementSuffixRename ; setBusinessCategoryAliasedName : KW_ALTER categoryType qualifiedName setAliasedName ; setBusinessCategoryComment : KW_ALTER categoryType qualifiedName alterStatementSuffixSetComment ; setBusinessCategoryProperties : KW_ALTER categoryType qualifiedName KW_SET setProperties ; unSetBusinessCategoryProperties : KW_ALTER categoryType qualifiedName KW_UNSET unSetProperties ; dropBusinessCategoryStatement : KW_DROP categoryType qualifiedName ; impExpStatements: exportStatement ; exportStatement : (KW_EXP | KW_EXPORT) exportBusinessUnit? exportOutput exportTarget? KW_WHERE expression ; exportOutput : KW_OUTPUT EQUAL string ; exportBusinessUnit : identifier ; exportTarget : KW_TARGET EQUAL string ; scriptStatements: importEntityStatement | refEntityStatement ; importEntityStatement : KW_IMPORT qualifiedName (KW_AS identifier)? ; refEntityStatement : KW_REF leftTable=tableNameList leftTableComment=string? refRelationType rightTableComent=string? rightTable=tableNameList (COLON name=identifier)? ; refRelationType: GREATERTHAN? LEFT_DIRECTION_RIGHT | RIGHT_DIRECTON_LEFT LESSTHAN? ; dimensionStatements: createDimension | renameDimension | addDimensionAttribute | changeDimensionAttribute | dropDimensionAttribute | setDimensionComment | setDimensionProperties | unSetDimensionProperties | dropDimension | setDimensionAliasedName ; createDimension : KW_CREATE KW_DIMENSION ifNotExists? tableName alias? (LPAREN dimensionAttributeList RPAREN)? comment? (KW_WITH setProperties)? ; dimensionAttributeList : dimensionAttribute (COMMA dimensionAttribute)* ; dimensionAttribute : identifier alias? attributeCategory? attributeConstraint? comment? (KW_WITH setProperties)? ; attributeCategory : KW_TIMEPERIOD ; attributeConstraint : KW_PRIMARY KW_KEY ; addDimensionAttribute : KW_ALTER KW_DIMENSION tableName (KW_ADD | KW_REPLACE) KW_ATTRIBUTES LPAREN dimensionAttributeList RPAREN ; renameDimension : KW_ALTER KW_DIMENSION tableName alterStatementSuffixRename ; setDimensionProperties : KW_ALTER KW_DIMENSION tableName KW_SET setProperties ; unSetDimensionProperties : KW_ALTER KW_DIMENSION tableName KW_UNSET unSetProperties ; setDimensionComment : KW_ALTER KW_DIMENSION tableName alterStatementSuffixSetComment ; dropDimensionAttribute : KW_ALTER KW_DIMENSION tableName KW_DROP KW_ATTRIBUTE identifier ; setDimensionAliasedName : KW_ALTER KW_DIMENSION tableName setAliasedName ; changeDimensionAttribute : KW_ALTER KW_DIMENSION tableName KW_CHANGE KW_ATTRIBUTE old=identifier dimensionAttribute ; dropDimension : KW_DROP KW_DIMENSION ifExists? tableName ; commandStatements : commonSqlCommandStatement; commonSqlCommandStatement: commands dialectOptions commandOptions (KW_WITH setProperties)? ; dialectOptions: MODE_OPTION identifier ; commandOptions : TEXT_OPTION string | URI_OPTION string ; commands : type=KW_IMPORT_SQL | type=KW_EXPORT_SQL | type=KW_RENDER ;