MCPcopy
hub / github.com/github/gh-ost / TestBuildRangeInsertQuery

Function TestBuildRangeInsertQuery

go/sql/builder_test.go:161–309  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

159}
160
161func 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"

Callers

nothing calls this directly

Calls 3

NewColumnListFunction · 0.85
BuildRangeInsertQueryFunction · 0.85
normalizeQueryFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…