| 18 | } |
| 19 | |
| 20 | func extractChangedResources(database string, currentSchema string, dbMetadata *model.DatabaseMetadata, asts []base.AST, _ string) (*base.ChangeSummary, error) { |
| 21 | changedResources := model.NewChangedResources(dbMetadata) |
| 22 | searchPath := dbMetadata.GetSearchPath() |
| 23 | if currentSchema != "" { |
| 24 | searchPath = []string{currentSchema} |
| 25 | } |
| 26 | if len(searchPath) == 0 { |
| 27 | searchPath = []string{"public"} |
| 28 | } |
| 29 | |
| 30 | if len(asts) == 0 { |
| 31 | return &base.ChangeSummary{ |
| 32 | ChangedResources: changedResources, |
| 33 | DMLCount: 0, |
| 34 | SampleDMLS: []string{}, |
| 35 | InsertCount: 0, |
| 36 | }, nil |
| 37 | } |
| 38 | |
| 39 | var dmlCount, insertCount int |
| 40 | var sampleDMLs []string |
| 41 | |
| 42 | for _, unifiedAST := range asts { |
| 43 | omniAST, ok := unifiedAST.(*OmniAST) |
| 44 | if !ok { |
| 45 | return nil, errors.New("expected OmniAST for PostgreSQL") |
| 46 | } |
| 47 | if omniAST.Node == nil { |
| 48 | continue |
| 49 | } |
| 50 | |
| 51 | switch n := omniAST.Node.(type) { |
| 52 | case *ast.VariableSetStmt: |
| 53 | if strings.EqualFold(n.Name, "search_path") && n.Args != nil { |
| 54 | var newSearchPath []string |
| 55 | for _, arg := range n.Args.Items { |
| 56 | if ac, ok := arg.(*ast.A_Const); ok { |
| 57 | if s, ok := ac.Val.(*ast.String); ok { |
| 58 | newSearchPath = append(newSearchPath, s.Str) |
| 59 | } |
| 60 | } |
| 61 | } |
| 62 | if len(newSearchPath) > 0 { |
| 63 | searchPath = newSearchPath |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | case *ast.CreateStmt: |
| 68 | if n.Relation != nil { |
| 69 | db, schema, table := extractRangeVarNames(n.Relation, database, searchPath) |
| 70 | changedResources.AddTable(db, schema, &storepb.ChangedResourceTable{Name: table}, false) |
| 71 | } |
| 72 | |
| 73 | case *ast.DropStmt: |
| 74 | objType := ast.ObjectType(n.RemoveType) |
| 75 | switch objType { |
| 76 | case ast.OBJECT_INDEX: |
| 77 | handleDropIndexOmni(n, database, searchPath, dbMetadata, changedResources) |