| 21 | } |
| 22 | |
| 23 | func extractChangedResources(currentDatabase string, _ string, dbMetadata *model.DatabaseMetadata, asts []base.AST, _ string) (*base.ChangeSummary, error) { |
| 24 | changedResources := model.NewChangedResources(dbMetadata) |
| 25 | |
| 26 | var dmlCount, insertCount int |
| 27 | var sampleDMLs []string |
| 28 | |
| 29 | // addObjectDatabase records a database-only write target for a non-table object DDL |
| 30 | // (view/function/routine/trigger) ONLY when the object's own name carries an explicit |
| 31 | // database qualifier (TableRef.Schema). Unqualified names record nothing (request-database |
| 32 | // fallback). The object's own qualifier is used — never an ON-table reference. SUP-222. |
| 33 | addObjectDatabase := func(ref *ast.TableRef) { |
| 34 | if ref != nil && ref.Schema != "" { |
| 35 | changedResources.AddDatabase(ref.Schema) |
| 36 | } |
| 37 | } |
| 38 | |
| 39 | for _, unifiedAST := range asts { |
| 40 | omniAST, ok := unifiedAST.(*OmniAST) |
| 41 | if !ok { |
| 42 | return nil, errors.New("expected OmniAST for MySQL") |
| 43 | } |
| 44 | if omniAST.Node == nil { |
| 45 | continue |
| 46 | } |
| 47 | |
| 48 | switch n := omniAST.Node.(type) { |
| 49 | case *ast.CreateTableStmt: |
| 50 | if n.Table != nil { |
| 51 | db, table := omniTableRef(n.Table, currentDatabase) |
| 52 | changedResources.AddTable(db, "", &storepb.ChangedResourceTable{Name: table}, false) |
| 53 | } |
| 54 | |
| 55 | case *ast.DropTableStmt: |
| 56 | for _, ref := range n.Tables { |
| 57 | db, table := omniTableRef(ref, currentDatabase) |
| 58 | changedResources.AddTable(db, "", &storepb.ChangedResourceTable{Name: table}, true) |
| 59 | } |
| 60 | |
| 61 | case *ast.TruncateStmt: |
| 62 | for _, ref := range n.Tables { |
| 63 | db, table := omniTableRef(ref, currentDatabase) |
| 64 | changedResources.AddTable(db, "", &storepb.ChangedResourceTable{Name: table}, true) |
| 65 | } |
| 66 | |
| 67 | case *ast.LoadDataStmt: |
| 68 | if n.Table != nil { |
| 69 | db, table := omniTableRef(n.Table, currentDatabase) |
| 70 | changedResources.AddTable(db, "", &storepb.ChangedResourceTable{Name: table}, false) |
| 71 | } |
| 72 | |
| 73 | case *ast.AlterTableStmt: |
| 74 | if n.Table != nil { |
| 75 | db, table := omniTableRef(n.Table, currentDatabase) |
| 76 | changedResources.AddTable(db, "", &storepb.ChangedResourceTable{Name: table}, true) |
| 77 | } |
| 78 | |
| 79 | case *ast.RenameTableStmt: |
| 80 | for _, pair := range n.Pairs { |