diff --git a/pkg/writers/dctx/writer.go b/pkg/writers/dctx/writer.go index 7ae0368..0c29077 100644 --- a/pkg/writers/dctx/writer.go +++ b/pkg/writers/dctx/writer.go @@ -4,6 +4,7 @@ import ( "encoding/xml" "fmt" "os" + "sort" "strings" "github.com/google/uuid" @@ -155,8 +156,15 @@ func (w *Writer) mapTableFields(table *models.Table) models.DCTXTable { }, } + columnNames := make([]string, 0, len(table.Columns)) + for name := range table.Columns { + columnNames = append(columnNames, name) + } + sort.Strings(columnNames) + i := 0 - for _, column := range table.Columns { + for _, colName := range columnNames { + column := table.Columns[colName] dctxTable.Fields[i] = w.mapField(column) i++ } @@ -165,12 +173,27 @@ func (w *Writer) mapTableFields(table *models.Table) models.DCTXTable { } func (w *Writer) mapTableKeys(table *models.Table) []models.DCTXKey { - keys := make([]models.DCTXKey, len(table.Indexes)) - i := 0 + indexes := make([]*models.Index, 0, len(table.Indexes)) for _, index := range table.Indexes { - keys[i] = w.mapKey(index, table) - i++ + indexes = append(indexes, index) } + + // Stable ordering for deterministic output and test reproducibility: + // primary keys first, then lexicographic by index name. + sort.Slice(indexes, func(i, j int) bool { + iPrimary := strings.HasSuffix(indexes[i].Name, "_pkey") + jPrimary := strings.HasSuffix(indexes[j].Name, "_pkey") + if iPrimary != jPrimary { + return iPrimary + } + return indexes[i].Name < indexes[j].Name + }) + + keys := make([]models.DCTXKey, len(indexes)) + for i, index := range indexes { + keys[i] = w.mapKey(index, table) + } + return keys }