@@ -235,7 +235,62 @@ func BuildRangeInsertPreparedQuery(databaseName, originalTableName, ghostTableNa
235235 return BuildRangeInsertQuery (databaseName , originalTableName , ghostTableName , sharedColumns , mappedSharedColumns , uniqueKey , uniqueKeyColumns , rangeStartValues , rangeEndValues , rangeStartArgs , rangeEndArgs , includeRangeStartValues , transactionalTable )
236236}
237237
238- func BuildUniqueKeyRangeEndPreparedQuery (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
238+ func BuildUniqueKeyRangeEndPreparedQueryViaOffset (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
239+ if uniqueKeyColumns .Len () == 0 {
240+ return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
241+ }
242+ databaseName = EscapeName (databaseName )
243+ tableName = EscapeName (tableName )
244+
245+ var startRangeComparisonSign ValueComparisonSign = GreaterThanComparisonSign
246+ if includeRangeStartValues {
247+ startRangeComparisonSign = GreaterThanOrEqualsComparisonSign
248+ }
249+ rangeStartComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeStartArgs , startRangeComparisonSign )
250+ if err != nil {
251+ return "" , explodedArgs , err
252+ }
253+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
254+ rangeEndComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeEndArgs , LessThanOrEqualsComparisonSign )
255+ if err != nil {
256+ return "" , explodedArgs , err
257+ }
258+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
259+
260+ uniqueKeyColumnNames := duplicateNames (uniqueKeyColumns .Names ())
261+ uniqueKeyColumnAscending := make ([]string , len (uniqueKeyColumnNames ), len (uniqueKeyColumnNames ))
262+ uniqueKeyColumnDescending := make ([]string , len (uniqueKeyColumnNames ), len (uniqueKeyColumnNames ))
263+ for i , column := range uniqueKeyColumns .Columns () {
264+ uniqueKeyColumnNames [i ] = EscapeName (uniqueKeyColumnNames [i ])
265+ if column .Type == EnumColumnType {
266+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("concat(%s) asc" , uniqueKeyColumnNames [i ])
267+ uniqueKeyColumnDescending [i ] = fmt .Sprintf ("concat(%s) desc" , uniqueKeyColumnNames [i ])
268+ } else {
269+ uniqueKeyColumnAscending [i ] = fmt .Sprintf ("%s asc" , uniqueKeyColumnNames [i ])
270+ uniqueKeyColumnDescending [i ] = fmt .Sprintf ("%s desc" , uniqueKeyColumnNames [i ])
271+ }
272+ }
273+ result = fmt .Sprintf (`
274+ select /* gh-ost %s.%s %s */
275+ %s
276+ from
277+ %s.%s
278+ where %s and %s
279+ order by
280+ %s
281+ limit 1
282+ offset %d
283+ ` , databaseName , tableName , hint ,
284+ strings .Join (uniqueKeyColumnNames , ", " ),
285+ databaseName , tableName ,
286+ rangeStartComparison , rangeEndComparison ,
287+ strings .Join (uniqueKeyColumnAscending , ", " ),
288+ (chunkSize - 1 ),
289+ )
290+ return result , explodedArgs , nil
291+ }
292+
293+ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
239294 if uniqueKeyColumns .Len () == 0 {
240295 return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
241296 }
0 commit comments