@@ -251,6 +251,59 @@ func BuildRangeInsertPreparedQuery(databaseName, originalTableName, ghostTableNa
251251 return BuildRangeInsertQuery (databaseName , originalTableName , ghostTableName , sharedColumns , mappedSharedColumns , uniqueKey , uniqueKeyColumns , rangeStartValues , rangeEndValues , rangeStartArgs , rangeEndArgs , includeRangeStartValues , transactionalTable , noWait )
252252}
253253
254+ func BuildUniqueKeyRangeEndPreparedQueryViaOffset (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
255+ if uniqueKeyColumns .Len () == 0 {
256+ return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
257+ }
258+ databaseName = EscapeName (databaseName )
259+ tableName = EscapeName (tableName )
260+
261+ var startRangeComparisonSign ValueComparisonSign = GreaterThanComparisonSign
262+ if includeRangeStartValues {
263+ startRangeComparisonSign = GreaterThanOrEqualsComparisonSign
264+ }
265+ rangeStartComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeStartArgs , startRangeComparisonSign )
266+ if err != nil {
267+ return "" , explodedArgs , err
268+ }
269+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
270+ rangeEndComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeEndArgs , LessThanOrEqualsComparisonSign )
271+ if err != nil {
272+ return "" , explodedArgs , err
273+ }
274+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
275+
276+ uniqueKeyColumnNames := duplicateNames (uniqueKeyColumns .Names ())
277+ uniqueKeyColumnAscending := make ([]string , len (uniqueKeyColumnNames ))
278+ for i , column := range uniqueKeyColumns .Columns () {
279+ uniqueKeyColumnNames [i ] = EscapeName (uniqueKeyColumnNames [i ])
280+ if column .Type == EnumColumnType {
281+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("concat(%s) asc" , uniqueKeyColumnNames [i ])
282+ } else {
283+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("%s asc" , uniqueKeyColumnNames [i ])
284+ }
285+ }
286+ result = fmt .Sprintf (`
287+ select /* gh-ost %s.%s %s */
288+ %s
289+ from
290+ %s.%s
291+ where
292+ %s and %s
293+ order by
294+ %s
295+ limit 1
296+ offset %d` ,
297+ databaseName , tableName , hint ,
298+ strings .Join (uniqueKeyColumnNames , ", " ),
299+ databaseName , tableName ,
300+ rangeStartComparison , rangeEndComparison ,
301+ strings .Join (uniqueKeyColumnAscending , ", " ),
302+ (chunkSize - 1 ),
303+ )
304+ return result , explodedArgs , nil
305+ }
306+
254307func BuildUniqueKeyRangeEndPreparedQueryViaTemptable (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
255308 if uniqueKeyColumns .Len () == 0 {
256309 return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
@@ -286,22 +339,8 @@ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, tableName str
286339 uniqueKeyColumnDescending [i ] = fmt .Sprintf ("%s desc" , uniqueKeyColumnNames [i ])
287340 }
288341 }
289-
290- joinedColumnNames := strings .Join (uniqueKeyColumnNames , ", " )
291342 result = fmt .Sprintf (`
292- select /* gh-ost %s.%s %s */
293- %s,
294- (select count(*) from (
295- select
296- %s
297- from
298- %s.%s
299- where
300- %s and %s
301- order by
302- %s
303- limit %d
304- ) select_osc_chunk)
343+ select /* gh-ost %s.%s %s */ %s
305344 from (
306345 select
307346 %s
@@ -316,17 +355,13 @@ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, tableName str
316355 order by
317356 %s
318357 limit 1` ,
319- databaseName , tableName , hint , joinedColumnNames ,
320- joinedColumnNames , databaseName , tableName ,
321- rangeStartComparison , rangeEndComparison ,
322- strings .Join (uniqueKeyColumnAscending , ", " ), chunkSize ,
323- joinedColumnNames , databaseName , tableName ,
358+ databaseName , tableName , hint , strings .Join (uniqueKeyColumnNames , ", " ),
359+ strings .Join (uniqueKeyColumnNames , ", " ), databaseName , tableName ,
324360 rangeStartComparison , rangeEndComparison ,
325361 strings .Join (uniqueKeyColumnAscending , ", " ), chunkSize ,
326362 strings .Join (uniqueKeyColumnDescending , ", " ),
327363 )
328- // 2x the explodedArgs for the subquery (CTE would be possible but not supported by MySQL 5)
329- return result , append (explodedArgs , explodedArgs ... ), nil
364+ return result , explodedArgs , nil
330365}
331366
332367func BuildUniqueKeyMinValuesPreparedQuery (databaseName , tableName string , uniqueKey * UniqueKey ) (string , error ) {
0 commit comments