diff --git a/pkg/merge/merge.go b/pkg/merge/merge.go index b29d7d7..c6c64a2 100644 --- a/pkg/merge/merge.go +++ b/pkg/merge/merge.go @@ -120,8 +120,10 @@ func (r *MergeResult) mergeTables(schema *models.Schema, source *models.Schema, } if tgtTable, exists := existingTables[tableName]; exists { - // Table exists, merge its columns + // Table exists, merge its columns, constraints, and indexes r.mergeColumns(tgtTable, srcTable) + r.mergeConstraints(tgtTable, srcTable) + r.mergeIndexes(tgtTable, srcTable) } else { // Table doesn't exist, add it newTable := cloneTable(srcTable) @@ -151,6 +153,50 @@ func (r *MergeResult) mergeColumns(table *models.Table, srcTable *models.Table) } } +func (r *MergeResult) mergeConstraints(table *models.Table, srcTable *models.Table) { + // Initialize constraints map if nil + if table.Constraints == nil { + table.Constraints = make(map[string]*models.Constraint) + } + + // Create map of existing constraints + existingConstraints := make(map[string]*models.Constraint) + for constName := range table.Constraints { + existingConstraints[constName] = table.Constraints[constName] + } + + // Merge constraints + for constName, srcConst := range srcTable.Constraints { + if _, exists := existingConstraints[constName]; !exists { + // Constraint doesn't exist, add it + newConst := cloneConstraint(srcConst) + table.Constraints[constName] = newConst + } + } +} + +func (r *MergeResult) mergeIndexes(table *models.Table, srcTable *models.Table) { + // Initialize indexes map if nil + if table.Indexes == nil { + table.Indexes = make(map[string]*models.Index) + } + + // Create map of existing indexes + existingIndexes := make(map[string]*models.Index) + for idxName := range table.Indexes { + existingIndexes[idxName] = table.Indexes[idxName] + } + + // Merge indexes + for idxName, srcIdx := range srcTable.Indexes { + if _, exists := existingIndexes[idxName]; !exists { + // Index doesn't exist, add it + newIdx := cloneIndex(srcIdx) + table.Indexes[idxName] = newIdx + } + } +} + func (r *MergeResult) mergeViews(schema *models.Schema, source *models.Schema) { // Create map of existing views existingViews := make(map[string]*models.View)