Skip to content

Commit a5c42aa

Browse files
kyleconroyclaude
andcommitted
Add CREATE EVENT NOTIFICATION statement support
- Add event type name casing map for special cases (DB, TSql, etc.) - Handle Trc_* and Ddl_* prefixed names as event groups - Enable CreateEventNotificationStatementTests Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 99ba7fe commit a5c42aa

3 files changed

Lines changed: 64 additions & 7 deletions

File tree

parser/parse_statements.go

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9589,9 +9589,16 @@ func (p *Parser) parseCreateEventNotificationFromEvent() (*ast.CreateEventNotifi
95899589

95909590
// Convert event name to PascalCase and determine if it's a group or type
95919591
pascalName := eventNameToPascalCase(eventName)
9592+
upperName := strings.ToUpper(eventName)
95929593

9593-
// If name ends with "Events" (after conversion), it's a group
9594-
if strings.HasSuffix(strings.ToUpper(eventName), "_EVENTS") || strings.HasSuffix(strings.ToUpper(eventName), "EVENTS") {
9594+
// Determine if it's a group or a type
9595+
// Groups are: names ending in "_EVENTS" or "EVENTS", or TRC_* or DDL_* prefixed names
9596+
isGroup := strings.HasSuffix(upperName, "_EVENTS") ||
9597+
strings.HasSuffix(upperName, "EVENTS") ||
9598+
strings.HasPrefix(upperName, "TRC_") ||
9599+
strings.HasPrefix(upperName, "DDL_")
9600+
9601+
if isGroup {
95959602
stmt.EventTypeGroups = append(stmt.EventTypeGroups, &ast.EventGroupContainer{
95969603
EventGroup: pascalName,
95979604
})
@@ -9658,17 +9665,67 @@ func (p *Parser) parseCreateEventNotificationFromEvent() (*ast.CreateEventNotifi
96589665
}
96599666

96609667
// eventNameToPascalCase converts an event name like "Object_Created" or "DDL_CREDENTIAL_EVENTS" to PascalCase.
9668+
// eventTypeNameMap maps uppercase event type names to their correct PascalCase equivalents
9669+
var eventTypeNameMap = map[string]string{
9670+
// Audit events with DB (must be uppercase)
9671+
"AUDIT_ADD_DB_USER_EVENT": "AuditAddDBUserEvent",
9672+
"AUDIT_ADD_MEMBER_TO_DB_ROLE_EVENT": "AuditAddMemberToDBRoleEvent",
9673+
"AUDIT_ADDLOGIN_EVENT": "AuditAddLoginEvent",
9674+
// Log events
9675+
"ERRORLOG": "ErrorLog",
9676+
"EVENTLOG": "EventLog",
9677+
// OLEDB events
9678+
"OLEDB_DATAREAD_EVENT": "OledbDataReadEvent",
9679+
"OLEDB_QUERYINTERFACE_EVENT": "OledbQueryInterfaceEvent",
9680+
// Showplan events
9681+
"SHOWPLAN_ALL_FOR_QUERY_COMPILE": "ShowPlanAllForQueryCompile",
9682+
"SHOWPLAN_XML_FOR_QUERY_COMPILE": "ShowPlanXmlForQueryCompile",
9683+
"SHOWPLAN_XML": "ShowPlanXml",
9684+
"SHOWPLAN_XML_STATISTICS_PROFILE": "ShowPlanXmlStatisticsProfile",
9685+
// SP cache events
9686+
"SP_CACHEINSERT": "SpCacheInsert",
9687+
"SP_CACHEMISS": "SpCacheMiss",
9688+
"SP_CACHEREMOVE": "SpCacheRemove",
9689+
// Recompile events
9690+
"SQL_STMTRECOMPILE": "SqlStmtRecompile",
9691+
// User configurable events
9692+
"USERCONFIGURABLE_0": "UserConfigurable0",
9693+
"USERCONFIGURABLE_1": "UserConfigurable1",
9694+
"USERCONFIGURABLE_2": "UserConfigurable2",
9695+
"USERCONFIGURABLE_3": "UserConfigurable3",
9696+
"USERCONFIGURABLE_4": "UserConfigurable4",
9697+
"USERCONFIGURABLE_5": "UserConfigurable5",
9698+
"USERCONFIGURABLE_6": "UserConfigurable6",
9699+
"USERCONFIGURABLE_7": "UserConfigurable7",
9700+
"USERCONFIGURABLE_8": "UserConfigurable8",
9701+
"USERCONFIGURABLE_9": "UserConfigurable9",
9702+
// XQuery
9703+
"XQUERY_STATIC_TYPE": "XQueryStaticType",
9704+
// TSql
9705+
"TRC_TSQL": "TrcTSql",
9706+
}
9707+
96619708
func eventNameToPascalCase(name string) string {
9709+
// Check if we have a specific mapping
9710+
if mapped, ok := eventTypeNameMap[strings.ToUpper(name)]; ok {
9711+
return mapped
9712+
}
9713+
96629714
// Split by underscore
96639715
parts := strings.Split(name, "_")
96649716
var result strings.Builder
96659717
for _, part := range parts {
96669718
if len(part) == 0 {
96679719
continue
96689720
}
9669-
// Capitalize first letter, lowercase rest
9670-
result.WriteString(strings.ToUpper(part[:1]))
9671-
result.WriteString(strings.ToLower(part[1:]))
9721+
// Special case: DB should be uppercase
9722+
if strings.ToUpper(part) == "DB" {
9723+
result.WriteString("DB")
9724+
} else {
9725+
// Capitalize first letter, lowercase rest
9726+
result.WriteString(strings.ToUpper(part[:1]))
9727+
result.WriteString(strings.ToLower(part[1:]))
9728+
}
96729729
}
96739730
return result.String()
96749731
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)