@@ -168,21 +168,28 @@ func (b *BaseExecutor) queryCurrentRecords(ctx context.Context, conn *sql.Conn)
168168}
169169
170170func (b * BaseExecutor ) parsePkValues (rows []types.RowImage , pkNameList []string ) map [string ][]types.ColumnImage {
171+ if len (rows ) == 0 {
172+ return make (map [string ][]types.ColumnImage )
173+ }
174+
175+ pkLookup := make (map [string ]string , len (pkNameList ))
176+ for _ , pk := range pkNameList {
177+ pkLookup [strings .ToLower (pk )] = pk
178+ }
179+
171180 pkValues := make (map [string ][]types.ColumnImage )
172- // todo optimize 3 fors
181+
173182 for _ , row := range rows {
174183 for _ , column := range row .Columns {
175- for _ , pk := range pkNameList {
176- if strings .EqualFold (pk , column .ColumnName ) {
177- values := pkValues [strings .ToUpper (pk )]
178- if values == nil {
179- values = make ([]types.ColumnImage , 0 )
180- }
181- values = append (values , column )
182- pkValues [pk ] = values
184+ columnNameLower := strings .ToLower (column .ColumnName )
185+ if originalPk , exists := pkLookup [columnNameLower ]; exists {
186+ if pkValues [originalPk ] == nil {
187+ pkValues [originalPk ] = make ([]types.ColumnImage , 0 , len (rows ))
183188 }
189+ pkValues [originalPk ] = append (pkValues [originalPk ], column )
184190 }
185191 }
186192 }
193+
187194 return pkValues
188195}
0 commit comments