@@ -122,22 +122,14 @@ func applyForeignKeysToNodes(ctx *sql.Context, a *Analyzer, n sql.Node, cache *f
122
122
if plan .IsEmptyTable (n .Child ) {
123
123
return n , transform .SameTree , nil
124
124
}
125
- updateDest , err := plan .GetUpdatable (n .Child )
126
- if err != nil {
127
- return nil , transform .SameTree , err
128
- }
129
- switch updateDest .(type ) {
130
- case * plan.UpdatableJoinTable :
131
- updateTargets := updateDest .(* plan.UpdatableJoinTable ).UpdateTargets
125
+ if n .IsJoin {
126
+ uj := n .Child .(* plan.UpdateJoin )
127
+ updateTargets := uj .UpdateTargets
132
128
fkHandlerMap := make (map [string ]sql.Node , len (updateTargets ))
133
129
for tableName , updateTarget := range updateTargets {
134
130
fkHandlerMap [tableName ] = updateTarget
135
- updateDest , err := plan .GetUpdatable (updateTarget )
136
- if err != nil {
137
- return nil , transform .SameTree , err
138
- }
139
131
fkHandler , err :=
140
- getForeignKeyHandlerFromUpdateDestination ( updateDest , ctx , a , cache , fkChain , updateTarget )
132
+ getForeignKeyHandlerFromUpdateTarget ( updateTarget , ctx , a , cache , fkChain )
141
133
if err != nil {
142
134
return nil , transform .SameTree , err
143
135
}
@@ -147,20 +139,19 @@ func applyForeignKeysToNodes(ctx *sql.Context, a *Analyzer, n sql.Node, cache *f
147
139
fkHandlerMap [tableName ] = fkHandler
148
140
}
149
141
}
150
- uj : = plan .NewUpdateJoin (fkHandlerMap , n . Child .( * plan. UpdateJoin ) .Child )
142
+ uj = plan .NewUpdateJoin (fkHandlerMap , uj .Child )
151
143
nn , err := n .WithChildren (uj )
152
144
return nn , transform .NewTree , err
153
- default :
154
- fkHandler , err := getForeignKeyHandlerFromUpdateDestination (updateDest , ctx , a , cache , fkChain , n .Child )
155
- if err != nil {
156
- return nil , transform .SameTree , err
157
- }
158
- if fkHandler == nil {
159
- return n , transform .SameTree , nil
160
- }
161
- nn , err := n .WithChildren (fkHandler )
162
- return nn , transform .NewTree , err
163
145
}
146
+ fkHandler , err := getForeignKeyHandlerFromUpdateTarget (n .Child , ctx , a , cache , fkChain )
147
+ if err != nil {
148
+ return nil , transform .SameTree , err
149
+ }
150
+ if fkHandler == nil {
151
+ return n , transform .SameTree , nil
152
+ }
153
+ nn , err := n .WithChildren (fkHandler )
154
+ return nn , transform .NewTree , err
164
155
case * plan.DeleteFrom :
165
156
if plan .IsEmptyTable (n .Child ) {
166
157
return n , transform .SameTree , nil
@@ -457,10 +448,14 @@ func getForeignKeyRefActions(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
457
448
return fkEditor , nil
458
449
}
459
450
460
- // getForeignKeyHandlerFromUpdateDestination creates a ForeignKeyHandler from a given UpdatableTable. It's used in
461
- // applying foreign keys to Update nodes
462
- func getForeignKeyHandlerFromUpdateDestination (updateDest sql.UpdatableTable , ctx * sql.Context , a * Analyzer ,
463
- cache * foreignKeyCache , fkChain foreignKeyChain , originalNode sql.Node ) (* plan.ForeignKeyHandler , error ) {
451
+ // getForeignKeyHandlerFromUpdateTarget creates a ForeignKeyHandler from a given update target Node. It is used for
452
+ // applying foreign key constrains to Update nodes
453
+ func getForeignKeyHandlerFromUpdateTarget (updateTarget sql.Node , ctx * sql.Context , a * Analyzer ,
454
+ cache * foreignKeyCache , fkChain foreignKeyChain ) (* plan.ForeignKeyHandler , error ) {
455
+ updateDest , err := plan .GetUpdatable (updateTarget )
456
+ if err != nil {
457
+ return nil , err
458
+ }
464
459
fkTbl , ok := updateDest .(sql.ForeignKeyTable )
465
460
if ! ok {
466
461
return nil , nil
@@ -477,7 +472,7 @@ func getForeignKeyHandlerFromUpdateDestination(updateDest sql.UpdatableTable, ct
477
472
return & plan.ForeignKeyHandler {
478
473
Table : fkTbl ,
479
474
Sch : updateDest .Schema (),
480
- OriginalNode : originalNode ,
475
+ OriginalNode : updateTarget ,
481
476
Editor : fkEditor ,
482
477
AllUpdaters : fkChain .GetUpdaters (),
483
478
}, nil
0 commit comments