| 19 | } |
| 20 | |
| 21 | func extractChangedResources(currentDatabase string, currentSchema string, dbMetadata *model.DatabaseMetadata, asts []base.AST, _ string) (*base.ChangeSummary, error) { |
| 22 | changedResources := model.NewChangedResources(dbMetadata) |
| 23 | |
| 24 | var dmlCount, insertCount int |
| 25 | var sampleDMLs []string |
| 26 | |
| 27 | addDML := func(text string) { |
| 28 | dmlCount++ |
| 29 | if len(sampleDMLs) < common.MaximumLintExplainSize { |
| 30 | sampleDMLs = append(sampleDMLs, trimStatement(text)) |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | addTable := func(ref *ast.TableRef, affectData bool) { |
| 35 | d, s, t := omniTableRefTriple(ref, currentDatabase, currentSchema) |
| 36 | if t == "" { |
| 37 | return |
| 38 | } |
| 39 | changedResources.AddTable(d, s, &storepb.ChangedResourceTable{Name: t}, affectData) |
| 40 | } |
| 41 | |
| 42 | // addObjectDatabase records a database-only write target for a non-table object DDL |
| 43 | // (view/procedure/function/trigger) ONLY when the object's own name carries an explicit |
| 44 | // database qualifier. Unqualified names record nothing (request-database fallback). The |
| 45 | // object's own qualifier is used — never an ON-table or body reference. SUP-222 / BYT-9698. |
| 46 | addObjectDatabase := func(ref *ast.TableRef) { |
| 47 | if ref != nil && ref.Database != "" { |
| 48 | changedResources.AddDatabase(ref.Database) |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | for _, unifiedAST := range asts { |
| 53 | omniAST, ok := unifiedAST.(*OmniAST) |
| 54 | if !ok { |
| 55 | return nil, errors.New("expected OmniAST for MSSQL") |
| 56 | } |
| 57 | if omniAST.Node == nil { |
| 58 | continue |
| 59 | } |
| 60 | |
| 61 | switch n := omniAST.Node.(type) { |
| 62 | case *ast.CreateTableStmt: |
| 63 | addTable(n.Name, false) |
| 64 | |
| 65 | case *ast.AlterTableStmt: |
| 66 | addTable(n.Name, true) |
| 67 | |
| 68 | case *ast.DropStmt: |
| 69 | switch n.ObjectType { |
| 70 | case ast.DropTable: |
| 71 | if n.Names == nil { |
| 72 | continue |
| 73 | } |
| 74 | for _, item := range n.Names.Items { |
| 75 | if ref, ok := item.(*ast.TableRef); ok { |
| 76 | addTable(ref, true) |
| 77 | } |
| 78 | } |