@@ -170,12 +170,12 @@ func BuildRangeComparison(columns []string, values []string, args []interface{},
170170 return result , explodedArgs , nil
171171}
172172
173- func BuildRangePreparedComparison (columns [] string , args []interface {}, comparisonSign ValueComparisonSign ) (result string , explodedArgs []interface {}, err error ) {
174- values := buildPreparedValues ( len ( columns ) )
175- return BuildRangeComparison (columns , values , args , comparisonSign )
173+ func BuildRangePreparedComparison (columns * ColumnList , args []interface {}, comparisonSign ValueComparisonSign ) (result string , explodedArgs []interface {}, err error ) {
174+ values := buildColumnsPreparedValues ( columns )
175+ return BuildRangeComparison (columns . Names () , values , args , comparisonSign )
176176}
177177
178- func BuildRangeInsertQuery (databaseName , originalTableName , ghostTableName string , sharedColumns []string , mappedSharedColumns []string , uniqueKey string , uniqueKeyColumns , rangeStartValues , rangeEndValues []string , rangeStartArgs , rangeEndArgs []interface {}, includeRangeStartValues bool , transactionalTable bool ) (result string , explodedArgs []interface {}, err error ) {
178+ func BuildRangeInsertQuery (databaseName , originalTableName , ghostTableName string , sharedColumns []string , mappedSharedColumns []string , uniqueKey string , uniqueKeyColumns * ColumnList , rangeStartValues , rangeEndValues []string , rangeStartArgs , rangeEndArgs []interface {}, includeRangeStartValues bool , transactionalTable bool ) (result string , explodedArgs []interface {}, err error ) {
179179 if len (sharedColumns ) == 0 {
180180 return "" , explodedArgs , fmt .Errorf ("Got 0 shared columns in BuildRangeInsertQuery" )
181181 }
@@ -200,12 +200,12 @@ func BuildRangeInsertQuery(databaseName, originalTableName, ghostTableName strin
200200 if includeRangeStartValues {
201201 minRangeComparisonSign = GreaterThanOrEqualsComparisonSign
202202 }
203- rangeStartComparison , rangeExplodedArgs , err := BuildRangeComparison (uniqueKeyColumns , rangeStartValues , rangeStartArgs , minRangeComparisonSign )
203+ rangeStartComparison , rangeExplodedArgs , err := BuildRangeComparison (uniqueKeyColumns . Names () , rangeStartValues , rangeStartArgs , minRangeComparisonSign )
204204 if err != nil {
205205 return "" , explodedArgs , err
206206 }
207207 explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
208- rangeEndComparison , rangeExplodedArgs , err := BuildRangeComparison (uniqueKeyColumns , rangeEndValues , rangeEndArgs , LessThanOrEqualsComparisonSign )
208+ rangeEndComparison , rangeExplodedArgs , err := BuildRangeComparison (uniqueKeyColumns . Names () , rangeEndValues , rangeEndArgs , LessThanOrEqualsComparisonSign )
209209 if err != nil {
210210 return "" , explodedArgs , err
211211 }
@@ -225,14 +225,14 @@ func BuildRangeInsertQuery(databaseName, originalTableName, ghostTableName strin
225225 return result , explodedArgs , nil
226226}
227227
228- func BuildRangeInsertPreparedQuery (databaseName , originalTableName , ghostTableName string , sharedColumns []string , mappedSharedColumns []string , uniqueKey string , uniqueKeyColumns [] string , rangeStartArgs , rangeEndArgs []interface {}, includeRangeStartValues bool , transactionalTable bool ) (result string , explodedArgs []interface {}, err error ) {
229- rangeStartValues := buildPreparedValues ( len ( uniqueKeyColumns ) )
230- rangeEndValues := buildPreparedValues ( len ( uniqueKeyColumns ) )
228+ func BuildRangeInsertPreparedQuery (databaseName , originalTableName , ghostTableName string , sharedColumns []string , mappedSharedColumns []string , uniqueKey string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, includeRangeStartValues bool , transactionalTable bool ) (result string , explodedArgs []interface {}, err error ) {
229+ rangeStartValues := buildColumnsPreparedValues ( uniqueKeyColumns )
230+ rangeEndValues := buildColumnsPreparedValues ( uniqueKeyColumns )
231231 return BuildRangeInsertQuery (databaseName , originalTableName , ghostTableName , sharedColumns , mappedSharedColumns , uniqueKey , uniqueKeyColumns , rangeStartValues , rangeEndValues , rangeStartArgs , rangeEndArgs , includeRangeStartValues , transactionalTable )
232232}
233233
234- func BuildUniqueKeyRangeEndPreparedQuery (databaseName , tableName string , uniqueKeyColumns [] string , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
235- if len ( uniqueKeyColumns ) == 0 {
234+ func BuildUniqueKeyRangeEndPreparedQuery (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
235+ if uniqueKeyColumns . Len ( ) == 0 {
236236 return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
237237 }
238238 databaseName = EscapeName (databaseName )
@@ -253,13 +253,18 @@ func BuildUniqueKeyRangeEndPreparedQuery(databaseName, tableName string, uniqueK
253253 }
254254 explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
255255
256- uniqueKeyColumns = duplicateNames (uniqueKeyColumns )
257- uniqueKeyColumnAscending := make ([]string , len (uniqueKeyColumns ), len (uniqueKeyColumns ))
258- uniqueKeyColumnDescending := make ([]string , len (uniqueKeyColumns ), len (uniqueKeyColumns ))
259- for i := range uniqueKeyColumns {
260- uniqueKeyColumns [i ] = EscapeName (uniqueKeyColumns [i ])
261- uniqueKeyColumnAscending [i ] = fmt .Sprintf ("%s asc" , uniqueKeyColumns [i ])
262- uniqueKeyColumnDescending [i ] = fmt .Sprintf ("%s desc" , uniqueKeyColumns [i ])
256+ uniqueKeyColumnNames := duplicateNames (uniqueKeyColumns .Names ())
257+ uniqueKeyColumnAscending := make ([]string , len (uniqueKeyColumnNames ), len (uniqueKeyColumnNames ))
258+ uniqueKeyColumnDescending := make ([]string , len (uniqueKeyColumnNames ), len (uniqueKeyColumnNames ))
259+ for i , column := range uniqueKeyColumns .Columns () {
260+ uniqueKeyColumnNames [i ] = EscapeName (uniqueKeyColumnNames [i ])
261+ if column .Type == EnumColumnValue {
262+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("concat(%s) asc" , uniqueKeyColumnNames [i ])
263+ uniqueKeyColumnDescending [i ] = fmt .Sprintf ("concat(%s) desc" , uniqueKeyColumnNames [i ])
264+ } else {
265+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("%s asc" , uniqueKeyColumnNames [i ])
266+ uniqueKeyColumnDescending [i ] = fmt .Sprintf ("%s desc" , uniqueKeyColumnNames [i ])
267+ }
263268 }
264269 result = fmt .Sprintf (`
265270 select /* gh-ost %s.%s %s */ %s
@@ -276,35 +281,39 @@ func BuildUniqueKeyRangeEndPreparedQuery(databaseName, tableName string, uniqueK
276281 order by
277282 %s
278283 limit 1
279- ` , databaseName , tableName , hint , strings .Join (uniqueKeyColumns , ", " ),
280- strings .Join (uniqueKeyColumns , ", " ), databaseName , tableName ,
284+ ` , databaseName , tableName , hint , strings .Join (uniqueKeyColumnNames , ", " ),
285+ strings .Join (uniqueKeyColumnNames , ", " ), databaseName , tableName ,
281286 rangeStartComparison , rangeEndComparison ,
282287 strings .Join (uniqueKeyColumnAscending , ", " ), chunkSize ,
283288 strings .Join (uniqueKeyColumnDescending , ", " ),
284289 )
285290 return result , explodedArgs , nil
286291}
287292
288- func BuildUniqueKeyMinValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns [] string ) (string , error ) {
293+ func BuildUniqueKeyMinValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns * ColumnList ) (string , error ) {
289294 return buildUniqueKeyMinMaxValuesPreparedQuery (databaseName , tableName , uniqueKeyColumns , "asc" )
290295}
291296
292- func BuildUniqueKeyMaxValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns [] string ) (string , error ) {
297+ func BuildUniqueKeyMaxValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns * ColumnList ) (string , error ) {
293298 return buildUniqueKeyMinMaxValuesPreparedQuery (databaseName , tableName , uniqueKeyColumns , "desc" )
294299}
295300
296- func buildUniqueKeyMinMaxValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns [] string , order string ) (string , error ) {
297- if len ( uniqueKeyColumns ) == 0 {
301+ func buildUniqueKeyMinMaxValuesPreparedQuery (databaseName , tableName string , uniqueKeyColumns * ColumnList , order string ) (string , error ) {
302+ if uniqueKeyColumns . Len ( ) == 0 {
298303 return "" , fmt .Errorf ("Got 0 columns in BuildUniqueKeyMinMaxValuesPreparedQuery" )
299304 }
300305 databaseName = EscapeName (databaseName )
301306 tableName = EscapeName (tableName )
302307
303- uniqueKeyColumns = duplicateNames (uniqueKeyColumns )
304- uniqueKeyColumnOrder := make ([]string , len (uniqueKeyColumns ), len (uniqueKeyColumns ))
305- for i := range uniqueKeyColumns {
306- uniqueKeyColumns [i ] = EscapeName (uniqueKeyColumns [i ])
307- uniqueKeyColumnOrder [i ] = fmt .Sprintf ("%s %s" , uniqueKeyColumns [i ], order )
308+ uniqueKeyColumnNames := duplicateNames (uniqueKeyColumns .Names ())
309+ uniqueKeyColumnOrder := make ([]string , len (uniqueKeyColumnNames ), len (uniqueKeyColumnNames ))
310+ for i , column := range uniqueKeyColumns .Columns () {
311+ uniqueKeyColumnNames [i ] = EscapeName (uniqueKeyColumnNames [i ])
312+ if column .Type == EnumColumnValue {
313+ uniqueKeyColumnOrder [i ] = fmt .Sprintf ("concat(%s) %s" , uniqueKeyColumnNames [i ], order )
314+ } else {
315+ uniqueKeyColumnOrder [i ] = fmt .Sprintf ("%s %s" , uniqueKeyColumnNames [i ], order )
316+ }
308317 }
309318 query := fmt .Sprintf (`
310319 select /* gh-ost %s.%s */ %s
@@ -313,7 +322,7 @@ func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uni
313322 order by
314323 %s
315324 limit 1
316- ` , databaseName , tableName , strings .Join (uniqueKeyColumns , ", " ),
325+ ` , databaseName , tableName , strings .Join (uniqueKeyColumnNames , ", " ),
317326 databaseName , tableName ,
318327 strings .Join (uniqueKeyColumnOrder , ", " ),
319328 )
0 commit comments