(databaseName, tableName string, uniqueKeyColumns *ColumnList, rangeStartArgs, rangeEndArgs []interface{}, chunkSize int64, includeRangeStartValues bool, hint string)
| 426 | } |
| 427 | |
| 428 | func BuildUniqueKeyRangeEndPreparedQueryViaOffset(databaseName, tableName string, uniqueKeyColumns *ColumnList, rangeStartArgs, rangeEndArgs []interface{}, chunkSize int64, includeRangeStartValues bool, hint string) (result string, explodedArgs []interface{}, err error) { |
| 429 | if uniqueKeyColumns.Len() == 0 { |
| 430 | return "", explodedArgs, fmt.Errorf("got 0 columns in BuildUniqueKeyRangeEndPreparedQuery") |
| 431 | } |
| 432 | databaseName = EscapeName(databaseName) |
| 433 | tableName = EscapeName(tableName) |
| 434 | |
| 435 | var startRangeComparisonSign = GreaterThanComparisonSign |
| 436 | if includeRangeStartValues { |
| 437 | startRangeComparisonSign = GreaterThanOrEqualsComparisonSign |
| 438 | } |
| 439 | |
| 440 | if uniqueKeyColumns.Len() == 2 { |
| 441 | return buildUniqueKeyRangeEndTwoColumnViaOffset(databaseName, tableName, uniqueKeyColumns, rangeStartArgs, rangeEndArgs, chunkSize, startRangeComparisonSign, hint) |
| 442 | } |
| 443 | |
| 444 | rangeStartComparison, rangeExplodedArgs, err := BuildRangePreparedComparison(uniqueKeyColumns, rangeStartArgs, startRangeComparisonSign) |
| 445 | if err != nil { |
| 446 | return "", explodedArgs, err |
| 447 | } |
| 448 | explodedArgs = append(explodedArgs, rangeExplodedArgs...) |
| 449 | rangeEndComparison, rangeExplodedArgs, err := BuildRangePreparedComparison(uniqueKeyColumns, rangeEndArgs, LessThanOrEqualsComparisonSign) |
| 450 | if err != nil { |
| 451 | return "", explodedArgs, err |
| 452 | } |
| 453 | explodedArgs = append(explodedArgs, rangeExplodedArgs...) |
| 454 | |
| 455 | uniqueKeyColumnNames := duplicateNames(uniqueKeyColumns.Names()) |
| 456 | uniqueKeyColumnAscending := make([]string, len(uniqueKeyColumnNames)) |
| 457 | for i, column := range uniqueKeyColumns.Columns() { |
| 458 | uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i]) |
| 459 | if column.Type == EnumColumnType { |
| 460 | uniqueKeyColumnAscending[i] = fmt.Sprintf("concat(%s) asc", uniqueKeyColumnNames[i]) |
| 461 | } else { |
| 462 | uniqueKeyColumnAscending[i] = fmt.Sprintf("%s asc", uniqueKeyColumnNames[i]) |
| 463 | } |
| 464 | } |
| 465 | result = fmt.Sprintf(` |
| 466 | select /* gh-ost %s.%s %s */ |
| 467 | %s |
| 468 | from |
| 469 | %s.%s |
| 470 | where |
| 471 | %s and %s |
| 472 | order by |
| 473 | %s |
| 474 | limit 1 |
| 475 | offset %d`, |
| 476 | databaseName, tableName, hint, |
| 477 | strings.Join(uniqueKeyColumnNames, ", "), |
| 478 | databaseName, tableName, |
| 479 | rangeStartComparison, rangeEndComparison, |
| 480 | strings.Join(uniqueKeyColumnAscending, ", "), |
| 481 | (chunkSize - 1), |
| 482 | ) |
| 483 | return result, explodedArgs, nil |
| 484 | } |
| 485 |
searching dependent graphs…