(t *testing.T)
| 159 | } |
| 160 | |
| 161 | func TestBuildRangeInsertQuery(t *testing.T) { |
| 162 | databaseName := "mydb" |
| 163 | originalTableName := "tbl" |
| 164 | ghostTableName := "ghost" |
| 165 | sharedColumns := []string{"id", "name", "position"} |
| 166 | { |
| 167 | uniqueKey := "PRIMARY" |
| 168 | uniqueKeyColumns := NewColumnList([]string{"id"}) |
| 169 | rangeStartValues := []string{"@v1s"} |
| 170 | rangeEndValues := []string{"@v1e"} |
| 171 | rangeStartArgs := []interface{}{3} |
| 172 | rangeEndArgs := []interface{}{103} |
| 173 | |
| 174 | query, explodedArgs, err := BuildRangeInsertQuery(databaseName, originalTableName, ghostTableName, sharedColumns, sharedColumns, uniqueKey, uniqueKeyColumns, rangeStartValues, rangeEndValues, rangeStartArgs, rangeEndArgs, true, true, true) |
| 175 | require.NoError(t, err) |
| 176 | expected := ` |
| 177 | insert /* gh-ost mydb.tbl */ ignore |
| 178 | into |
| 179 | mydb.ghost |
| 180 | (id, name, position) |
| 181 | ( |
| 182 | select id, name, position |
| 183 | from |
| 184 | mydb.tbl |
| 185 | force index (PRIMARY) |
| 186 | where |
| 187 | (((id > @v1s) or ((id = @v1s))) |
| 188 | and ((id < @v1e) or ((id = @v1e)))) |
| 189 | for share nowait |
| 190 | )` |
| 191 | require.Equal(t, normalizeQuery(expected), normalizeQuery(query)) |
| 192 | require.Equal(t, []interface{}{3, 3, 103, 103}, explodedArgs) |
| 193 | } |
| 194 | { |
| 195 | // Different first-column values → 3-part UNION insert. |
| 196 | uniqueKey := "name_position_uidx" |
| 197 | uniqueKeyColumns := NewColumnList([]string{"name", "position"}) |
| 198 | rangeStartValues := []string{"@v1s", "@v2s"} |
| 199 | rangeEndValues := []string{"@v1e", "@v2e"} |
| 200 | rangeStartArgs := []interface{}{3, 17} |
| 201 | rangeEndArgs := []interface{}{103, 117} |
| 202 | |
| 203 | query, explodedArgs, err := BuildRangeInsertQuery(databaseName, originalTableName, ghostTableName, sharedColumns, sharedColumns, uniqueKey, uniqueKeyColumns, rangeStartValues, rangeEndValues, rangeStartArgs, rangeEndArgs, true, true, true) |
| 204 | require.NoError(t, err) |
| 205 | expected := ` |
| 206 | insert /* gh-ost mydb.tbl */ ignore |
| 207 | into mydb.ghost (id, name, position) |
| 208 | (select id, name, position from mydb.tbl force index (name_position_uidx) where name = @v1s and position >= @v2s for share nowait) |
| 209 | union all |
| 210 | (select id, name, position from mydb.tbl force index (name_position_uidx) where name > @v1s and name < @v1e for share nowait) |
| 211 | union all |
| 212 | (select id, name, position from mydb.tbl force index (name_position_uidx) where name = @v1e and position <= @v2e for share nowait)` |
| 213 | require.Equal(t, normalizeQuery(expected), normalizeQuery(query)) |
| 214 | require.Equal(t, []interface{}{3, 17, 3, 103, 103, 117}, explodedArgs) |
| 215 | } |
| 216 | { |
| 217 | // Same first-column value → single range query (no UNION needed). |
| 218 | uniqueKey := "name_position_uidx" |
nothing calls this directly
no test coverage detected
searching dependent graphs…