@@ -231,7 +231,62 @@ func BuildRangeInsertPreparedQuery(databaseName, originalTableName, ghostTableNa
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 * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
234+ func BuildUniqueKeyRangeEndPreparedQueryViaOffset (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 {
236+ return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
237+ }
238+ databaseName = EscapeName (databaseName )
239+ tableName = EscapeName (tableName )
240+
241+ var startRangeComparisonSign ValueComparisonSign = GreaterThanComparisonSign
242+ if includeRangeStartValues {
243+ startRangeComparisonSign = GreaterThanOrEqualsComparisonSign
244+ }
245+ rangeStartComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeStartArgs , startRangeComparisonSign )
246+ if err != nil {
247+ return "" , explodedArgs , err
248+ }
249+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
250+ rangeEndComparison , rangeExplodedArgs , err := BuildRangePreparedComparison (uniqueKeyColumns , rangeEndArgs , LessThanOrEqualsComparisonSign )
251+ if err != nil {
252+ return "" , explodedArgs , err
253+ }
254+ explodedArgs = append (explodedArgs , rangeExplodedArgs ... )
255+
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 == EnumColumnType {
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+ }
268+ }
269+ result = fmt .Sprintf (`
270+ select /* gh-ost %s.%s %s */
271+ %s
272+ from
273+ %s.%s
274+ where %s and %s
275+ order by
276+ %s
277+ limit 1
278+ offset %d
279+ ` , databaseName , tableName , hint ,
280+ strings .Join (uniqueKeyColumnNames , ", " ),
281+ databaseName , tableName ,
282+ rangeStartComparison , rangeEndComparison ,
283+ strings .Join (uniqueKeyColumnAscending , ", " ),
284+ (chunkSize - 1 ),
285+ )
286+ return result , explodedArgs , nil
287+ }
288+
289+ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable (databaseName , tableName string , uniqueKeyColumns * ColumnList , rangeStartArgs , rangeEndArgs []interface {}, chunkSize int64 , includeRangeStartValues bool , hint string ) (result string , explodedArgs []interface {}, err error ) {
235290 if uniqueKeyColumns .Len () == 0 {
236291 return "" , explodedArgs , fmt .Errorf ("Got 0 columns in BuildUniqueKeyRangeEndPreparedQuery" )
237292 }
0 commit comments