@@ -138,50 +138,29 @@ func applyForeignKeysToNodes(ctx *sql.Context, a *Analyzer, n sql.Node, cache *f
138138 if err != nil {
139139 return nil , transform .SameTree , err
140140 }
141-
142- fkTbl , ok := updateDest .(sql.ForeignKeyTable )
143- if ! ok {
144- continue
145- }
146- fkEditor , err := getForeignKeyEditor (ctx , a , fkTbl , cache , fkChain , false )
141+ fkHandler , err :=
142+ getForeignKeyHandlerFromUpdateDestination (updateDest , ctx , a , cache , fkChain , updateTarget )
147143 if err != nil {
148144 return nil , transform .SameTree , err
149145 }
150- if fkEditor == nil {
151- continue
152- }
153- fkHandlerMap [tableName ] = & plan.ForeignKeyHandler {
154- Table : fkTbl ,
155- Sch : updateDest .Schema (),
156- OriginalNode : updateTarget ,
157- Editor : fkEditor ,
158- AllUpdaters : fkChain .GetUpdaters (),
146+ if fkHandler == nil {
147+ fkHandlerMap [tableName ] = updateTarget
148+ } else {
149+ fkHandlerMap [tableName ] = fkHandler
159150 }
160151 }
161152 uj := plan .NewUpdateJoin (fkHandlerMap , n .Child .(* plan.UpdateJoin ).Child )
162153 nn , err := n .WithChildren (uj )
163154 return nn , transform .NewTree , err
164155 default :
165- fkTbl , ok := updateDest .(sql.ForeignKeyTable )
166- // If foreign keys aren't supported then we return
167- if ! ok {
168- return n , transform .SameTree , nil
169- }
170-
171- fkEditor , err := getForeignKeyEditor (ctx , a , fkTbl , cache , fkChain , false )
156+ fkHandler , err := getForeignKeyHandlerFromUpdateDestination (updateDest , ctx , a , cache , fkChain , n .Child )
172157 if err != nil {
173158 return nil , transform .SameTree , err
174159 }
175- if fkEditor == nil {
160+ if fkHandler == nil {
176161 return n , transform .SameTree , nil
177162 }
178- nn , err := n .WithChildren (& plan.ForeignKeyHandler {
179- Table : fkTbl ,
180- Sch : updateDest .Schema (),
181- OriginalNode : n .Child ,
182- Editor : fkEditor ,
183- AllUpdaters : fkChain .GetUpdaters (),
184- })
163+ nn , err := n .WithChildren (fkHandler )
185164 return nn , transform .NewTree , err
186165 }
187166 case * plan.DeleteFrom :
@@ -480,6 +459,30 @@ func getForeignKeyRefActions(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
480459 return fkEditor , nil
481460}
482461
462+ func getForeignKeyHandlerFromUpdateDestination (updateDest sql.UpdatableTable , ctx * sql.Context , a * Analyzer ,
463+ cache * foreignKeyCache , fkChain foreignKeyChain , originalNode sql.Node ) (* plan.ForeignKeyHandler , error ) {
464+ fkTbl , ok := updateDest .(sql.ForeignKeyTable )
465+ if ! ok {
466+ return nil , nil
467+ }
468+
469+ fkEditor , err := getForeignKeyEditor (ctx , a , fkTbl , cache , fkChain , false )
470+ if err != nil {
471+ return nil , err
472+ }
473+ if fkEditor == nil {
474+ return nil , nil
475+ }
476+
477+ return & plan.ForeignKeyHandler {
478+ Table : fkTbl ,
479+ Sch : updateDest .Schema (),
480+ OriginalNode : originalNode ,
481+ Editor : fkEditor ,
482+ AllUpdaters : fkChain .GetUpdaters (),
483+ }, nil
484+ }
485+
483486// resolveSchemaDefaults resolves the default values for the schema of |table|. This is primarily needed for column
484487// default value expressions, since those don't get resolved during the planbuilder phase and assignExecIndexes
485488// doesn't traverse through the ForeignKeyEditors and referential actions to find all of them. In addition to resolving
0 commit comments