(t *testing.T)
| 470 | } |
| 471 | |
| 472 | func TestBuildUniqueKeyRangeEndPreparedQueryViaTemptable(t *testing.T) { |
| 473 | databaseName := "mydb" |
| 474 | originalTableName := "tbl" |
| 475 | var chunkSize int64 = 500 |
| 476 | { |
| 477 | // Different first-column values → 3-part UNION for efficient boundary seeks. |
| 478 | uniqueKeyColumns := NewColumnList([]string{"name", "position"}) |
| 479 | rangeStartArgs := []interface{}{3, 17} |
| 480 | rangeEndArgs := []interface{}{103, 117} |
| 481 | |
| 482 | query, explodedArgs, err := BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, originalTableName, uniqueKeyColumns, rangeStartArgs, rangeEndArgs, chunkSize, false, "test") |
| 483 | require.NoError(t, err) |
| 484 | expected := ` |
| 485 | select /* gh-ost mydb.tbl test */ name, position |
| 486 | from ( |
| 487 | select name, position |
| 488 | from |
| 489 | ((select name, position from mydb.tbl where name = ? and position > ? order by name asc, position asc limit 500) |
| 490 | union all |
| 491 | (select name, position from mydb.tbl where name > ? and name < ? order by name asc, position asc limit 500) |
| 492 | union all |
| 493 | (select name, position from mydb.tbl where name = ? and position <= ? order by name asc, position asc limit 500)) t |
| 494 | order by name asc, position asc |
| 495 | limit 500 |
| 496 | ) select_osc_chunk |
| 497 | order by name desc, position desc |
| 498 | limit 1` |
| 499 | require.Equal(t, normalizeQuery(expected), normalizeQuery(query)) |
| 500 | require.Equal(t, []interface{}{3, 17, 3, 103, 103, 117}, explodedArgs) |
| 501 | } |
| 502 | { |
| 503 | // Same first-column value → single range query (no UNION needed). |
| 504 | uniqueKeyColumns := NewColumnList([]string{"name", "position"}) |
| 505 | rangeStartArgs := []interface{}{3, 17} |
| 506 | rangeEndArgs := []interface{}{3, 117} |
| 507 | |
| 508 | query, explodedArgs, err := BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, originalTableName, uniqueKeyColumns, rangeStartArgs, rangeEndArgs, chunkSize, false, "test") |
| 509 | require.NoError(t, err) |
| 510 | expected := ` |
| 511 | select /* gh-ost mydb.tbl test */ name, position |
| 512 | from ( |
| 513 | select name, position |
| 514 | from mydb.tbl |
| 515 | where (name = ? and position > ? and position <= ?) |
| 516 | order by name asc, position asc |
| 517 | limit 500 |
| 518 | ) select_osc_chunk |
| 519 | order by name desc, position desc |
| 520 | limit 1` |
| 521 | require.Equal(t, normalizeQuery(expected), normalizeQuery(query)) |
| 522 | require.Equal(t, []interface{}{3, 17, 117}, explodedArgs) |
| 523 | } |
| 524 | } |
| 525 | |
| 526 | func TestBuildUniqueKeyRangeEndPreparedQueryTwoColumnEnum(t *testing.T) { |
| 527 | databaseName := "mydb" |
nothing calls this directly
no test coverage detected
searching dependent graphs…