blob: e9fa1506c4b17f4577f4bb602f1bfba4abe750ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
grammar DDLStatement;
import DMLStatement, DALStatement, TCLStatement;
alterStatement
: alterTable
| alterDatabase
| alterProcedure
| alterFunction
| alterEvent
| alterView
| alterLogfileGroup
| alterInstance
| alterServer
;
createTable
: CREATE TEMPORARY? TABLE ifNotExists? tableName (createDefinitionClause? createTableOptions? partitionClause? duplicateAsQueryExpression? startTransaction? | createLikeClause)
;
startTransaction
: START TRANSACTION
;
partitionClause
: PARTITION BY partitionTypeDef (PARTITIONS NUMBER_)? subPartitions? partitionDefinitions?
;
partitionTypeDef
: LINEAR? KEY partitionKeyAlgorithm? LP_ columnNames? RP_
| LINEAR? HASH LP_ bitExpr RP_
| (RANGE | LIST) (LP_ bitExpr RP_ | COLUMNS LP_ columnNames RP_ )
;
subPartitions
: SUBPARTITION BY LINEAR? ( HASH LP_ bitExpr RP_ | KEY partitionKeyAlgorithm? LP_ columnNames RP_ ) (SUBPARTITIONS NUMBER_)?
;
partitionKeyAlgorithm
: ALGORITHM EQ_ NUMBER_
;
duplicateAsQueryExpression
: (REPLACE | IGNORE)? AS? LP_? select RP_?
;
alterTable
: ALTER TABLE tableName alterTableActions?
| ALTER TABLE tableName standaloneAlterTableAction
;
standaloneAlterTableAction
: (alterCommandsModifierList COMMA_)? standaloneAlterCommands
;
alterTableActions
: alterCommandList alterTablePartitionOptions?
| alterTablePartitionOptions
;
alterTablePartitionOptions
: partitionClause | REMOVE PARTITIONING
;
alterCommandList
: alterCommandsModifierList
| (alterCommandsModifierList COMMA_)? alterList
;
alterList
: (alterListItem | createTableOptionsSpaceSeparated) (COMMA_ (alterListItem | alterCommandsModifier| createTableOptionsSpaceSeparated))*
;
createTableOptionsSpaceSeparated
: createTableOption+
;
alterListItem
: ADD COLUMN? (columnDefinition place? | LP_ tableElementList RP_) # addColumn
| ADD tableConstraintDef # addTableConstraint
| CHANGE COLUMN? columnInternalRef=identifier columnDefinition place? # changeColumn
| MODIFY COLUMN? columnInternalRef=identifier fieldDefinition place? # modifyColumn
| DROP (COLUMN? columnInternalRef=identifier restrict? | FOREIGN KEY columnInternalRef=identifier | PRIMARY KEY | keyOrIndex indexName | CHECK identifier | CONSTRAINT identifier) # alterTableDrop
| DISABLE KEYS # disableKeys
| ENABLE KEYS # enableKeys
| ALTER COLUMN? columnInternalRef=identifier (SET DEFAULT (LP_ expr RP_| literals)| SET visibility | DROP DEFAULT) # alterColumn
| ALTER INDEX indexName visibility # alterIndex
| ALTER CHECK constraintName constraintEnforcement # alterCheck
| ALTER CONSTRAINT constraintName constraintEnforcement # alterConstraint
| RENAME COLUMN oldColumn TO newColumn # renameColumn
| RENAME (TO | AS)? tableName # alterRenameTable
| RENAME keyOrIndex indexName TO indexName # renameIndex
| CONVERT TO charset charsetName collateClause? # alterConvert
| FORCE # alterTableForce
| ORDER BY alterOrderList # alterTableOrder
;
alterOrderList
: columnRef direction? (COMMA_ columnRef direction?)*
;
tableConstraintDef
: keyOrIndex indexName? indexTypeClause? keyListWithExpression indexOption*
| FULLTEXT keyOrIndex? indexName? keyListWithExpression fulltextIndexOption*
| SPATIAL keyOrIndex? indexName? keyListWithExpression commonIndexOption*
| constraintClause? (PRIMARY KEY | UNIQUE keyOrIndex?) indexName? indexTypeClause? keyListWithExpression indexOption*
| constraintClause? FOREIGN KEY indexName? keyParts referenceDefinition
| constraintClause? checkConstraint (constraintEnforcement)?
;
alterCommandsModifierList
: alterCommandsModifier (COMMA_ alterCommandsModifier)*
;
alterCommandsModifier
: alterAlgorithmOption
| alterLockOption
| withValidation
;
withValidation
: (WITH | WITHOUT) VALIDATION
;
standaloneAlterCommands
: DISCARD TABLESPACE
| IMPORT TABLESPACE
| alterPartition
| (SECONDARY_LOAD | SECONDARY_UNLOAD)
;
alterPartition
: ADD PARTITION noWriteToBinLog? (partitionDefinitions | PARTITIONS NUMBER_)
| DROP PARTITION identifierList
| REBUILD PARTITION noWriteToBinLog? allOrPartitionNameList
| OPTIMIZE PARTITION noWriteToBinLog? allOrPartitionNameList noWriteToBinLog?
| ANALYZE PARTITION noWriteToBinLog? allOrPartitionNameList
| CHECK PARTITION allOrPartitionNameList checkType*
| REPAIR PARTITION noWriteToBinLog? allOrPartitionNameList repairType*
| COALESCE PARTITION noWriteToBinLog? NUMBER_
| TRUNCATE PARTITION allOrPartitionNameList
| REORGANIZE PARTITION noWriteToBinLog? (identifierList INTO partitionDefinitions)?
| EXCHANGE PARTITION identifier WITH TABLE tableName withValidation?
| DISCARD PARTITION allOrPartitionNameList TABLESPACE
| IMPORT PARTITION allOrPartitionNameList TABLESPACE
;
constraintClause
: CONSTRAINT constraintName?
;
tableElementList
: tableElement (COMMA_ tableElement)*
;
tableElement
: columnDefinition
| tableConstraintDef
;
restrict
: RESTRICT | CASCADE
;
fulltextIndexOption
: commonIndexOption
| WITH PARSER identifier
;
dropTable
: DROP TEMPORARY? tableOrTables ifExists? tableList restrict?
;
dropIndex
: DROP INDEX indexName (ON tableName)? algorithmOptionAndLockOption?
;
algorithmOptionAndLockOption
: alterLockOption
| alterAlgorithmOption
| alterLockOption alterAlgorithmOption
| alterAlgorithmOption alterLockOption
;
alterAlgorithmOption
: ALGORITHM EQ_? (DEFAULT | INSTANT | INPLACE | COPY)
;
alterLockOption
: LOCK EQ_? (DEFAULT | NONE | SHARED | EXCLUSIVE)
;
truncateTable
: TRUNCATE TABLE? tableName
;
createIndex
: CREATE createIndexSpecification? INDEX indexName indexTypeClause? ON tableName keyListWithExpression indexOption? algorithmOptionAndLockOption?
;
createDatabase
: CREATE (DATABASE | SCHEMA) ifNotExists? schemaName createDatabaseSpecification_*
;
alterDatabase
: ALTER (DATABASE | SCHEMA) schemaName? alterDatabaseSpecification_*
;
createDatabaseSpecification_
: defaultCharset
| defaultCollation
| defaultEncryption
;
alterDatabaseSpecification_
: createDatabaseSpecification_
| READ ONLY EQ_? (DEFAULT | NUMBER_)
;
dropDatabase
: DROP (DATABASE | SCHEMA) ifExists? schemaName
;
alterInstance
: ALTER INSTANCE instanceAction
;
instanceAction
: (ENABLE | DISABLE) INNODB REDO_LOG
| ROTATE INNODB MASTER KEY
| ROTATE BINLOG MASTER KEY
| RELOAD TLS (FOR CHANNEL channel)? (NO ROLLBACK ON ERROR)?
;
channel
: MYSQL_MAIN | MYSQL_ADMIN
;
createEvent
: CREATE ownerStatement? EVENT ifNotExists? eventName
ON SCHEDULE scheduleExpression
(ON COMPLETION NOT? PRESERVE)?
(ENABLE | DISABLE | DISABLE ON SLAVE)?
(COMMENT string_)?
DO routineBody
;
alterEvent
: ALTER ownerStatement? EVENT eventName
(ON SCHEDULE scheduleExpression)?
(ON COMPLETION NOT? PRESERVE)?
(RENAME TO eventName)? (ENABLE | DISABLE | DISABLE ON SLAVE)?
(COMMENT string_)?
(DO routineBody)?
;
dropEvent
: DROP EVENT ifExists? eventName
;
createFunction
: CREATE ownerStatement?
FUNCTION functionName LP_ (identifier dataType)? (COMMA_ identifier dataType)* RP_
RETURNS dataType
routineOption*
routineBody
;
alterFunction
: ALTER FUNCTION functionName routineOption*
;
dropFunction
: DROP FUNCTION ifExists? functionName
;
createProcedure
: CREATE ownerStatement?
PROCEDURE functionName LP_ procedureParameter? (COMMA_ procedureParameter)* RP_
routineOption*
routineBody
;
alterProcedure
: ALTER PROCEDURE functionName routineOption*
;
dropProcedure
: DROP PROCEDURE ifExists? functionName
;
createServer
: CREATE SERVER serverName
FOREIGN DATA WRAPPER wrapperName
OPTIONS LP_ serverOption (COMMA_ serverOption)* RP_
;
alterServer
: ALTER SERVER serverName OPTIONS
LP_ serverOption (COMMA_ serverOption)* RP_
;
dropServer
: DROP SERVER ifExists? serverName
;
createView
: CREATE (OR REPLACE)?
(ALGORITHM EQ_ (UNDEFINED | MERGE | TEMPTABLE))?
ownerStatement?
(SQL SECURITY (DEFINER | INVOKER))?
VIEW viewName (LP_ columnNames RP_)?
AS select
(WITH (CASCADED | LOCAL)? CHECK OPTION)?
;
alterView
: ALTER (ALGORITHM EQ_ (UNDEFINED | MERGE | TEMPTABLE))?
ownerStatement?
(SQL SECURITY (DEFINER | INVOKER))?
VIEW viewName (LP_ columnNames RP_)?
AS select
(WITH (CASCADED | LOCAL)? CHECK OPTION)?
;
dropView
: DROP VIEW ifExists? viewNames restrict?
;
createTablespace
: createTablespaceInnodb | createTablespaceNdb
;
createTablespaceInnodb
: CREATE (UNDO)? TABLESPACE identifier
ADD DATAFILE string_
(FILE_BLOCK_SIZE EQ_ fileSizeLiteral)?
(ENCRYPTION EQ_ y_or_n=string_)?
(ENGINE EQ_? engineRef)?
(COMMENT EQ_? string_)?
;
createTablespaceNdb
: CREATE ( UNDO )? TABLESPACE identifier
ADD DATAFILE string_
USE LOGFILE GROUP identifier
(EXTENT_SIZE EQ_? fileSizeLiteral)?
(INITIAL_SIZE EQ_? fileSizeLiteral)?
(AUTOEXTEND_SIZE EQ_? fileSizeLiteral)?
(MAX_SIZE EQ_? fileSizeLiteral)?
(NODEGROUP EQ_? identifier)?
WAIT?
(COMMENT EQ_? string_)?
(ENGINE EQ_? engineRef)?
;
alterTablespace
: alterTablespaceInnodb | alterTablespaceNdb
;
alterTablespaceNdb
: ALTER UNDO? TABLESPACE tablespace=identifier
(ADD | DROP) DATAFILE string_
(INITIAL_SIZE EQ_? fileSizeLiteral)?
WAIT? (RENAME TO renameTableSpace=identifier)?
(ENGINE EQ_? identifier)?
;
alterTablespaceInnodb
: ALTER UNDO? TABLESPACE tablespace=identifier
(SET (ACTIVE | INACTIVE))?
(AUTOEXTEND_SIZE EQ_? fileSizeLiteral)?
(ENCRYPTION EQ_? y_or_n=string_)?
(ENGINE_ATTRIBUTE EQ_? jsonAttribute = string_)?
(RENAME TO renameTablespace=identifier)?
(ENGINE EQ_? identifier)?
;
dropTablespace
: DROP UNDO? TABLESPACE identifier (ENGINE EQ_? identifier)?
;
createLogfileGroup
: CREATE LOGFILE GROUP identifier
ADD UNDOFILE string_
(INITIAL_SIZE EQ_? fileSizeLiteral)?
(UNDO_BUFFER_SIZE EQ_? fileSizeLiteral)?
(REDO_BUFFER_SIZE EQ_? fileSizeLiteral)?
(NODEGROUP EQ_? identifier)?
WAIT?
(COMMENT EQ_? string_)?
(ENGINE EQ_? identifier)?
;
alterLogfileGroup
: ALTER LOGFILE GROUP identifier
ADD UNDOFILE string_
(INITIAL_SIZE EQ_? fileSizeLiteral)?
WAIT?
(ENGINE EQ_? identifier)?
;
dropLogfileGroup
: DROP LOGFILE GROUP identifier (ENGINE EQ_? identifier)?
;
createTrigger
: CREATE ownerStatement? TRIGGER triggerName triggerTime triggerEvent ON tableName FOR EACH ROW triggerOrder? routineBody
;
dropTrigger
: DROP TRIGGER ifExists? (schemaName DOT_)? triggerName
;
renameTable
: RENAME (TABLE | TABLES) tableName TO tableName (COMMA_ tableName TO tableName)*
;
createDefinitionClause
: LP_ tableElementList RP_
;
columnDefinition
: column_name=identifier fieldDefinition referenceDefinition?
;
fieldDefinition
: dataType (columnAttribute* | collateClause? generatedOption? AS LP_ expr RP_ storedAttribute=(VIRTUAL | STORED)? columnAttribute*)
;
columnAttribute
: NOT? NULL
| NOT SECONDARY
| value = DEFAULT (literals | now | LP_ expr RP_)
| value = ON UPDATE now
| value = AUTO_INCREMENT
| value = SERIAL DEFAULT VALUE
| PRIMARY? value = KEY
| value = UNIQUE KEY?
| value = COMMENT string_
| collateClause
| value = COLUMN_FORMAT columnFormat
| value = STORAGE storageMedia
| value = SRID NUMBER_
| constraintClause? checkConstraint
| constraintEnforcement
| visibility
;
checkConstraint
: CHECK LP_ expr RP_
;
constraintEnforcement
: NOT? ENFORCED
;
generatedOption
: GENERATED ALWAYS
;
referenceDefinition
: REFERENCES tableName keyParts (MATCH FULL | MATCH PARTIAL | MATCH SIMPLE)? onUpdateDelete?
;
onUpdateDelete
: ON UPDATE referenceOption (ON DELETE referenceOption)?
| ON DELETE referenceOption (ON UPDATE referenceOption)?
;
referenceOption
: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
;
indexType
: BTREE | RTREE | HASH
;
indexTypeClause
: (USING | TYPE) indexType
;
keyParts
: LP_ keyPart (COMMA_ keyPart)* RP_
;
keyPart
: columnName fieldLength? direction?
;
keyPartWithExpression
: keyPart | LP_ expr RP_ direction?
;
keyListWithExpression
: LP_ keyPartWithExpression (COMMA_ keyPartWithExpression)* RP_
;
indexOption
: commonIndexOption | indexTypeClause
;
commonIndexOption
: KEY_BLOCK_SIZE EQ_? NUMBER_
| COMMENT stringLiterals
| visibility
;
visibility
: VISIBLE | INVISIBLE
;
createLikeClause
: LP_? LIKE tableName RP_?
;
createIndexSpecification
: UNIQUE | FULLTEXT | SPATIAL
;
createTableOptions
: createTableOption (COMMA_? createTableOption)*
;
createTableOption
: option = ENGINE EQ_? engineRef
| option = SECONDARY_ENGINE EQ_? (NULL | string_ | identifier)
| option = MAX_ROWS EQ_? NUMBER_
| option = MIN_ROWS EQ_? NUMBER_
| option = AVG_ROW_LENGTH EQ_? NUMBER_
| option = PASSWORD EQ_? string_
| option = COMMENT EQ_? string_
| option = COMPRESSION EQ_? textString
| option = ENCRYPTION EQ_? textString
| option = AUTO_INCREMENT EQ_? NUMBER_
| option = PACK_KEYS EQ_? ternaryOption=(NUMBER_ | DEFAULT)
| option = (STATS_AUTO_RECALC | STATS_PERSISTENT | STATS_SAMPLE_PAGES) EQ_? ternaryOption=(NUMBER_ | DEFAULT)
| option = (CHECKSUM | TABLE_CHECKSUM) EQ_? NUMBER_
| option = DELAY_KEY_WRITE EQ_? NUMBER_
| option = ROW_FORMAT EQ_? format = (DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT)
| option = UNION EQ_? LP_ tableList RP_
| defaultCharset
| defaultCollation
| option = INSERT_METHOD EQ_? method = (NO| FIRST| LAST)
| option = DATA DIRECTORY EQ_? textString
| option = INDEX DIRECTORY EQ_? textString
| option = TABLESPACE EQ_? identifier
| option = STORAGE (DISK | MEMORY)
| option = CONNECTION EQ_? textString
| option = KEY_BLOCK_SIZE EQ_? NUMBER_
| option = ENGINE_ATTRIBUTE EQ_? jsonAttribute = string_
| option = SECONDARY_ENGINE_ATTRIBUTE EQ_ jsonAttribute = string_
;
createSRSStatement
: CREATE OR REPLACE SPATIAL REFERENCE SYSTEM NUMBER_ srsAttribute*
| CREATE SPATIAL REFERENCE SYSTEM ifNotExists? NUMBER_ srsAttribute*
;
dropSRSStatement
: DROP SPATIAL REFERENCE SYSTEM ifNotExists? NUMBER_
;
srsAttribute
: NAME string_
| DEFINITION string_
| ORGANIZATION string_ IDENTIFIED BY NUMBER_
| DESCRIPTION string_
;
place
: FIRST | AFTER columnName
;
partitionDefinitions
: LP_ partitionDefinition (COMMA_ partitionDefinition)* RP_
;
partitionDefinition
: PARTITION partitionName
(VALUES (LESS THAN partitionLessThanValue | IN LP_ partitionValueList RP_))?
partitionDefinitionOption*
(LP_ subpartitionDefinition (COMMA_ subpartitionDefinition)* RP_)?
;
partitionLessThanValue
: LP_ (expr | partitionValueList) RP_ | MAXVALUE
;
partitionValueList
: expr (COMMA_ expr)*
;
partitionDefinitionOption
: STORAGE? ENGINE EQ_? identifier
| COMMENT EQ_? string_
| DATA DIRECTORY EQ_? string_
| INDEX DIRECTORY EQ_? string_
| MAX_ROWS EQ_? NUMBER_
| MIN_ROWS EQ_? NUMBER_
| TABLESPACE EQ_? identifier
;
subpartitionDefinition
: SUBPARTITION identifier partitionDefinitionOption*
;
ownerStatement
: DEFINER EQ_ (username | CURRENT_USER ( LP_ RP_)?)
;
scheduleExpression
: AT timestampValue (PLUS_ intervalExpression)*
| EVERY intervalValue
(STARTS timestampValue (PLUS_ intervalExpression)*)?
(ENDS timestampValue (PLUS_ intervalExpression)*)?
;
timestampValue
: CURRENT_TIMESTAMP | stringLiterals | numberLiterals | expr
;
routineBody
: simpleStatement | compoundStatement
;
serverOption
: HOST string_
| DATABASE string_
| USER string_
| PASSWORD string_
| SOCKET string_
| OWNER string_
| PORT numberLiterals
;
routineOption
: COMMENT string_
| LANGUAGE SQL
| NOT? DETERMINISTIC
| (CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA)
| SQL SECURITY (DEFINER | INVOKER)
;
procedureParameter
: (IN | OUT | INOUT)? identifier dataType
;
fileSizeLiteral
: FILESIZE_LITERAL | numberLiterals
;
simpleStatement
: validStatement
;
compoundStatement
: beginStatement
;
validStatement
: (createTable | alterTable | dropTable | dropDatabase | truncateTable
| insert | replace | update | delete | select | call
| createView | prepare | executeStmt | commit | deallocate
| setVariable | beginStatement | declareStatement | flowControlStatement | cursorStatement | conditionHandlingStatement) SEMI_?
;
beginStatement
: (labelName COLON_)? BEGIN validStatement* END labelName? SEMI_?
;
declareStatement
: DECLARE variable (COMMA_ variable)* dataType (DEFAULT simpleExpr)*
;
flowControlStatement
: caseStatement | ifStatement | iterateStatement | leaveStatement | loopStatement | repeatStatement | returnStatement | whileStatement
;
caseStatement
: CASE expr?
(WHEN expr THEN validStatement+)+
(ELSE validStatement+)?
END CASE
;
ifStatement
: IF expr THEN validStatement+
(ELSEIF expr THEN validStatement+)*
(ELSE validStatement+)?
END IF
;
iterateStatement
: ITERATE labelName
;
leaveStatement
: LEAVE labelName
;
loopStatement
: (labelName COLON_)? LOOP
validStatement+
END LOOP labelName?
;
repeatStatement
: (labelName COLON_)? REPEAT
validStatement+
UNTIL expr
END REPEAT labelName?
;
returnStatement
: RETURN expr
;
whileStatement
: (labelName COLON_)? WHILE expr DO
validStatement+
END WHILE labelName?
;
cursorStatement
: cursorCloseStatement | cursorDeclareStatement | cursorFetchStatement | cursorOpenStatement
;
cursorCloseStatement
: CLOSE cursorName
;
cursorDeclareStatement
: DECLARE cursorName CURSOR FOR select
;
cursorFetchStatement
: FETCH ((NEXT)? FROM)? cursorName INTO variable (COMMA_ variable)*
;
cursorOpenStatement
: OPEN cursorName
;
conditionHandlingStatement
: declareConditionStatement | declareHandlerStatement | getDiagnosticsStatement | resignalStatement | signalStatement
;
declareConditionStatement
: DECLARE conditionName CONDITION FOR conditionValue
;
declareHandlerStatement
: DECLARE handlerAction HANDLER FOR conditionValue (COMMA_ conditionValue)* validStatement
;
getDiagnosticsStatement
: GET (CURRENT | STACKED)? DIAGNOSTICS (
(statementInformationItem (COMMA_ statementInformationItem)*
| (CONDITION conditionNumber conditionInformationItem (COMMA_ conditionInformationItem)*))
)
;
statementInformationItem
: variable EQ_ statementInformationItemName
;
conditionInformationItem
: variable EQ_ conditionInformationItemName
;
conditionNumber
: variable | numberLiterals
;
statementInformationItemName
: NUMBER
| ROW_COUNT
;
conditionInformationItemName
: CLASS_ORIGIN
| SUBCLASS_ORIGIN
| RETURNED_SQLSTATE
| MESSAGE_TEXT
| MYSQL_ERRNO
| CONSTRAINT_CATALOG
| CONSTRAINT_SCHEMA
| CONSTRAINT_NAME
| CATALOG_NAME
| SCHEMA_NAME
| TABLE_NAME
| COLUMN_NAME
| CURSOR_NAME
;
handlerAction
: CONTINUE | EXIT | UNDO
;
conditionValue
: numberLiterals | SQLSTATE (VALUE)? stringLiterals | conditionName | SQLWARNING | NOT FOUND | SQLEXCEPTION
;
resignalStatement
: RESIGNAL conditionValue?
(SET signalInformationItem (COMMA_ signalInformationItem)*)?
;
signalStatement
: SIGNAL conditionValue
(SET signalInformationItem (COMMA_ signalInformationItem)*)?
;
signalInformationItem
: conditionInformationItemName EQ_ expr
;
prepare
: PREPARE identifier FROM (stringLiterals | userVariable)
;
executeStmt
: EXECUTE identifier (USING executeVarList)?
;
executeVarList
: userVariable (COMMA_ userVariable)*
;
deallocate
: (DEALLOCATE | DROP) PREPARE identifier
;