@@ -33,7 +33,7 @@ func loadTriggers(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope,
33
33
switch node := n .(type ) {
34
34
case * plan.ShowTriggers :
35
35
newShowTriggers := * node
36
- loadedTriggers , err := loadTriggersFromDb (ctx , a , newShowTriggers .Database ())
36
+ loadedTriggers , err := loadTriggersFromDb (ctx , a , newShowTriggers .Database (), false )
37
37
if err != nil {
38
38
return nil , transform .SameTree , err
39
39
}
@@ -44,16 +44,16 @@ func loadTriggers(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope,
44
44
}
45
45
return & newShowTriggers , transform .NewTree , nil
46
46
case * plan.DropTrigger :
47
- loadedTriggers , err := loadTriggersFromDb (ctx , a , node .Database ())
47
+ loadedTriggers , err := loadTriggersFromDb (ctx , a , node .Database (), true )
48
48
if err != nil {
49
49
return nil , transform .SameTree , err
50
50
}
51
- lowercasedTriggerName := strings .ToLower (node .TriggerName )
52
51
for _ , trigger := range loadedTriggers {
53
- if strings .ToLower ( trigger .TriggerName ) == lowercasedTriggerName {
52
+ if strings .EqualFold ( node . TriggerName , trigger .TriggerName ) {
54
53
node .TriggerName = trigger .TriggerName
55
- } else if trigger .TriggerOrder != nil &&
56
- strings .ToLower (trigger .TriggerOrder .OtherTriggerName ) == lowercasedTriggerName {
54
+ continue
55
+ }
56
+ if trigger .TriggerOrder != nil && strings .EqualFold (node .TriggerName , trigger .TriggerOrder .OtherTriggerName ) {
57
57
return nil , transform .SameTree , sql .ErrTriggerCannotBeDropped .New (node .TriggerName , trigger .TriggerName )
58
58
}
59
59
}
@@ -70,7 +70,7 @@ func loadTriggers(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope,
70
70
dropTableDb = t .SqlDatabase
71
71
}
72
72
73
- loadedTriggers , err := loadTriggersFromDb (ctx , a , dropTableDb )
73
+ loadedTriggers , err := loadTriggersFromDb (ctx , a , dropTableDb , false )
74
74
if err != nil {
75
75
return nil , transform .SameTree , err
76
76
}
@@ -95,7 +95,7 @@ func loadTriggers(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Scope,
95
95
})
96
96
}
97
97
98
- func loadTriggersFromDb (ctx * sql.Context , a * Analyzer , db sql.Database ) ([]* plan.CreateTrigger , error ) {
98
+ func loadTriggersFromDb (ctx * sql.Context , a * Analyzer , db sql.Database , ignoreParseErrors bool ) ([]* plan.CreateTrigger , error ) {
99
99
var loadedTriggers []* plan.CreateTrigger
100
100
if triggerDb , ok := db .(sql.TriggerDatabase ); ok {
101
101
triggers , err := triggerDb .GetTriggers (ctx )
@@ -108,7 +108,17 @@ func loadTriggersFromDb(ctx *sql.Context, a *Analyzer, db sql.Database) ([]*plan
108
108
// TODO: should perhaps add the auth query handler to the analyzer? does this even use auth?
109
109
parsedTrigger , _ , err = planbuilder .ParseWithOptions (ctx , a .Catalog , trigger .CreateStatement , sqlMode .ParserOptions ())
110
110
if err != nil {
111
- return nil , err
111
+ // We want to be able to drop invalid triggers, so ignore any parser errors and return the name of the trigger
112
+ if ! ignoreParseErrors {
113
+ return nil , err
114
+ }
115
+ // TODO: we won't have TriggerOrder information for this unparseable trigger,
116
+ // but it will still be referenced by any valid triggers.
117
+ fakeTrigger := & plan.CreateTrigger {
118
+ TriggerName : trigger .Name ,
119
+ }
120
+ loadedTriggers = append (loadedTriggers , fakeTrigger )
121
+ continue
112
122
}
113
123
triggerPlan , ok := parsedTrigger .(* plan.CreateTrigger )
114
124
if ! ok {
0 commit comments