@@ -9346,6 +9346,16 @@ func (p *Parser) parseCreateQueueStatement() (*ast.CreateQueueStatement, error)
93469346 Name : name ,
93479347 }
93489348
9349+ // Check for ON clause (filegroup)
9350+ if p .curTok .Type == TokenOn {
9351+ p .nextToken () // consume ON
9352+ fg , err := p .parseIdentifierOrValueExpression ()
9353+ if err != nil {
9354+ return nil , err
9355+ }
9356+ stmt .OnFileGroup = fg
9357+ }
9358+
93499359 // Check for WITH clause
93509360 if strings .ToUpper (p .curTok .Literal ) == "WITH" {
93519361 p .nextToken () // consume WITH
@@ -9356,8 +9366,21 @@ func (p *Parser) parseCreateQueueStatement() (*ast.CreateQueueStatement, error)
93569366 stmt .QueueOptions = opts
93579367 }
93589368
9359- // Skip rest of statement
9360- p .skipToEndOfStatement ()
9369+ // Check for ON clause after WITH (alternative syntax)
9370+ if p .curTok .Type == TokenOn {
9371+ p .nextToken () // consume ON
9372+ fg , err := p .parseIdentifierOrValueExpression ()
9373+ if err != nil {
9374+ return nil , err
9375+ }
9376+ stmt .OnFileGroup = fg
9377+ }
9378+
9379+ // Skip optional semicolon
9380+ if p .curTok .Type == TokenSemicolon {
9381+ p .nextToken ()
9382+ }
9383+
93619384 return stmt , nil
93629385}
93639386
@@ -9440,16 +9463,16 @@ func (p *Parser) parseQueueOptions() ([]ast.QueueOption, error) {
94409463 }
94419464 options = append (options , opt )
94429465 } else {
9443- // Skip to end of activation clause
9444- depth := 1
9445- for depth > 0 && p .curTok .Type != TokenEOF {
9446- if p .curTok .Type == TokenLParen {
9447- depth ++
9448- } else if p .curTok .Type == TokenRParen {
9449- depth --
9450- }
9451- p .nextToken ()
9466+ // Parse activation options
9467+ activationOpts , err := p .parseActivationOptions ()
9468+ if err != nil {
9469+ return nil , err
94529470 }
9471+ options = append (options , activationOpts ... )
9472+ if p .curTok .Type != TokenRParen {
9473+ return nil , fmt .Errorf ("expected ) after ACTIVATION options, got %s" , p .curTok .Literal )
9474+ }
9475+ p .nextToken () // consume )
94539476 }
94549477
94559478 default :
@@ -9468,6 +9491,102 @@ func (p *Parser) parseQueueOptions() ([]ast.QueueOption, error) {
94689491 return options , nil
94699492}
94709493
9494+ func (p * Parser ) parseActivationOptions () ([]ast.QueueOption , error ) {
9495+ var options []ast.QueueOption
9496+
9497+ for p .curTok .Type != TokenRParen && p .curTok .Type != TokenEOF {
9498+ optName := strings .ToUpper (p .curTok .Literal )
9499+ switch optName {
9500+ case "STATUS" :
9501+ p .nextToken () // consume STATUS
9502+ if p .curTok .Type == TokenEquals {
9503+ p .nextToken () // consume =
9504+ }
9505+ state := strings .ToUpper (p .curTok .Literal )
9506+ p .nextToken () // consume ON/OFF
9507+ opt := & ast.QueueStateOption {
9508+ OptionState : capitalizeFirst (state ),
9509+ OptionKind : "ActivationStatus" ,
9510+ }
9511+ options = append (options , opt )
9512+
9513+ case "PROCEDURE_NAME" :
9514+ p .nextToken () // consume PROCEDURE_NAME
9515+ if p .curTok .Type == TokenEquals {
9516+ p .nextToken () // consume =
9517+ }
9518+ procName , _ := p .parseSchemaObjectName ()
9519+ opt := & ast.QueueProcedureOption {
9520+ OptionValue : procName ,
9521+ OptionKind : "ActivationProcedureName" ,
9522+ }
9523+ options = append (options , opt )
9524+
9525+ case "MAX_QUEUE_READERS" :
9526+ p .nextToken () // consume MAX_QUEUE_READERS
9527+ if p .curTok .Type == TokenEquals {
9528+ p .nextToken () // consume =
9529+ }
9530+ value , _ := p .parseScalarExpression ()
9531+ opt := & ast.QueueValueOption {
9532+ OptionValue : value ,
9533+ OptionKind : "ActivationMaxQueueReaders" ,
9534+ }
9535+ options = append (options , opt )
9536+
9537+ case "EXECUTE" :
9538+ p .nextToken () // consume EXECUTE
9539+ // Expect AS
9540+ if strings .ToUpper (p .curTok .Literal ) == "AS" {
9541+ p .nextToken () // consume AS
9542+ }
9543+ execAs := & ast.ExecuteAsClause {}
9544+ // Check for SELF, OWNER, or string
9545+ execVal := strings .ToUpper (p .curTok .Literal )
9546+ switch execVal {
9547+ case "SELF" :
9548+ execAs .ExecuteAsOption = "Self"
9549+ p .nextToken ()
9550+ case "OWNER" :
9551+ execAs .ExecuteAsOption = "Owner"
9552+ p .nextToken ()
9553+ default :
9554+ // String literal - 'username'
9555+ if p .curTok .Type == TokenString {
9556+ value := p .curTok .Literal
9557+ // Remove quotes
9558+ if len (value ) >= 2 && value [0 ] == '\'' && value [len (value )- 1 ] == '\'' {
9559+ value = value [1 : len (value )- 1 ]
9560+ }
9561+ execAs .ExecuteAsOption = "String"
9562+ execAs .Literal = & ast.StringLiteral {
9563+ LiteralType : "String" ,
9564+ IsNational : false ,
9565+ IsLargeObject : false ,
9566+ Value : value ,
9567+ }
9568+ p .nextToken ()
9569+ }
9570+ }
9571+ opt := & ast.QueueExecuteAsOption {
9572+ OptionValue : execAs ,
9573+ OptionKind : "ActivationExecuteAs" ,
9574+ }
9575+ options = append (options , opt )
9576+
9577+ default :
9578+ return options , nil
9579+ }
9580+
9581+ // Check for comma separator
9582+ if p .curTok .Type == TokenComma {
9583+ p .nextToken ()
9584+ }
9585+ }
9586+
9587+ return options , nil
9588+ }
9589+
94719590func (p * Parser ) parseCreateRouteStatement () (* ast.CreateRouteStatement , error ) {
94729591 p .nextToken () // consume ROUTE
94739592
0 commit comments