@@ -4525,11 +4525,131 @@ func (p *Parser) parseCreateEventNotificationFromEvent() (*ast.CreateEventNotifi
45254525 Name : p .parseIdentifier (),
45264526 }
45274527
4528- // Skip rest of statement
4528+ // Parse ON <scope>
4529+ if p .curTok .Type == TokenOn {
4530+ p .nextToken () // consume ON
4531+ stmt .Scope = & ast.EventNotificationObjectScope {}
4532+
4533+ scopeUpper := strings .ToUpper (p .curTok .Literal )
4534+ switch scopeUpper {
4535+ case "SERVER" :
4536+ stmt .Scope .Target = "Server"
4537+ p .nextToken ()
4538+ case "DATABASE" :
4539+ stmt .Scope .Target = "Database"
4540+ p .nextToken ()
4541+ case "QUEUE" :
4542+ stmt .Scope .Target = "Queue"
4543+ p .nextToken ()
4544+ // Parse queue name
4545+ stmt .Scope .QueueName , _ = p .parseSchemaObjectName ()
4546+ }
4547+ }
4548+
4549+ // Parse optional WITH FAN_IN
4550+ if strings .ToUpper (p .curTok .Literal ) == "WITH" {
4551+ p .nextToken () // consume WITH
4552+ if strings .ToUpper (p .curTok .Literal ) == "FAN_IN" {
4553+ stmt .WithFanIn = true
4554+ p .nextToken () // consume FAN_IN
4555+ }
4556+ }
4557+
4558+ // Parse FOR <event_type_or_group_list>
4559+ if strings .ToUpper (p .curTok .Literal ) == "FOR" {
4560+ p .nextToken () // consume FOR
4561+
4562+ // Parse comma-separated list of event types/groups
4563+ for {
4564+ eventName := p .curTok .Literal
4565+ p .nextToken ()
4566+
4567+ // Convert event name to PascalCase and determine if it's a group or type
4568+ pascalName := eventNameToPascalCase (eventName )
4569+
4570+ // If name ends with "Events" (after conversion), it's a group
4571+ if strings .HasSuffix (strings .ToUpper (eventName ), "_EVENTS" ) || strings .HasSuffix (strings .ToUpper (eventName ), "EVENTS" ) {
4572+ stmt .EventTypeGroups = append (stmt .EventTypeGroups , & ast.EventGroupContainer {
4573+ EventGroup : pascalName ,
4574+ })
4575+ } else {
4576+ stmt .EventTypeGroups = append (stmt .EventTypeGroups , & ast.EventTypeContainer {
4577+ EventType : pascalName ,
4578+ })
4579+ }
4580+
4581+ if p .curTok .Type != TokenComma {
4582+ break
4583+ }
4584+ p .nextToken () // consume comma
4585+ }
4586+ }
4587+
4588+ // Parse TO SERVICE 'service_name', 'broker_instance'
4589+ if strings .ToUpper (p .curTok .Literal ) == "TO" {
4590+ p .nextToken () // consume TO
4591+ if strings .ToUpper (p .curTok .Literal ) == "SERVICE" {
4592+ p .nextToken () // consume SERVICE
4593+
4594+ // Parse broker service name (string literal)
4595+ if p .curTok .Type == TokenString {
4596+ litVal := p .curTok .Literal
4597+ // Strip surrounding quotes
4598+ if len (litVal ) >= 2 && litVal [0 ] == '\'' && litVal [len (litVal )- 1 ] == '\'' {
4599+ litVal = litVal [1 : len (litVal )- 1 ]
4600+ }
4601+ stmt .BrokerService = & ast.StringLiteral {
4602+ LiteralType : "String" ,
4603+ IsNational : false ,
4604+ IsLargeObject : false ,
4605+ Value : litVal ,
4606+ }
4607+ p .nextToken ()
4608+ }
4609+
4610+ // Parse comma and broker instance specifier
4611+ if p .curTok .Type == TokenComma {
4612+ p .nextToken () // consume comma
4613+
4614+ if p .curTok .Type == TokenString {
4615+ litVal := p .curTok .Literal
4616+ // Strip surrounding quotes
4617+ if len (litVal ) >= 2 && litVal [0 ] == '\'' && litVal [len (litVal )- 1 ] == '\'' {
4618+ litVal = litVal [1 : len (litVal )- 1 ]
4619+ }
4620+ stmt .BrokerInstanceSpecifier = & ast.StringLiteral {
4621+ LiteralType : "String" ,
4622+ IsNational : false ,
4623+ IsLargeObject : false ,
4624+ Value : litVal ,
4625+ }
4626+ p .nextToken ()
4627+ }
4628+ }
4629+ }
4630+ }
4631+
4632+ // Skip any remaining tokens
45294633 p .skipToEndOfStatement ()
45304634 return stmt , nil
45314635}
45324636
4637+ // eventNameToPascalCase converts an event name like "Object_Created" or "DDL_CREDENTIAL_EVENTS" to PascalCase.
4638+ func eventNameToPascalCase (name string ) string {
4639+ // Split by underscore
4640+ parts := strings .Split (name , "_" )
4641+ var result strings.Builder
4642+ for _ , part := range parts {
4643+ if len (part ) == 0 {
4644+ continue
4645+ }
4646+ // Capitalize first letter, lowercase rest
4647+ result .WriteString (strings .ToUpper (part [:1 ]))
4648+ result .WriteString (strings .ToLower (part [1 :]))
4649+ }
4650+ return result .String ()
4651+ }
4652+
45334653func (p * Parser ) parseCreatePartitionFunctionFromPartition () (* ast.CreatePartitionFunctionStatement , error ) {
45344654 // PARTITION has already been consumed, curTok is FUNCTION
45354655 if strings .ToUpper (p .curTok .Literal ) == "FUNCTION" {
0 commit comments