Skip to content

Commit cbc86bc

Browse files
committed
Guard against column, value, and args mismatches
1 parent 6836629 commit cbc86bc

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

go/sql/builder.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,20 @@ func buildRangeInsertQueryTwoColumn(
349349
transactionalClause string,
350350
) (result string, explodedArgs []interface{}, err error) {
351351
cols := uniqueKeyColumns.Columns()
352+
353+
if len(cols) != len(rangeStartValues) {
354+
return "", explodedArgs, fmt.Errorf("got %d columns but %d rangeStartValues in buildRangeInsertQueryTwoColumn", len(cols), len(rangeStartValues))
355+
}
356+
if len(cols) != len(rangeEndValues) {
357+
return "", explodedArgs, fmt.Errorf("got %d columns but %d rangeEndValues in buildRangeInsertQueryTwoColumn", len(cols), len(rangeEndValues))
358+
}
359+
if len(cols) != len(rangeStartArgs) {
360+
return "", explodedArgs, fmt.Errorf("got %d columns but %d rangeStartArgs in buildRangeInsertQueryTwoColumn", len(cols), len(rangeStartArgs))
361+
}
362+
if len(cols) != len(rangeEndArgs) {
363+
return "", explodedArgs, fmt.Errorf("got %d columns but %d rangeEndArgs in buildRangeInsertQueryTwoColumn", len(cols), len(rangeEndArgs))
364+
}
365+
352366
col1Name := EscapeName(cols[0].Name)
353367
col2Name := EscapeName(cols[1].Name)
354368
col1StartVal := rangeStartValues[0]

go/sql/builder_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,50 @@ func TestBuildTwoColumnUnionParts(t *testing.T) {
658658
require.Equal(t, []interface{}{3, 17, 3, 103, 103, 117}, explodedArgs)
659659
}
660660

661+
func TestBuildRangeInsertQueryTwoColumnGuards(t *testing.T) {
662+
databaseName := "mydb"
663+
originalTableName := "tbl"
664+
ghostTableName := "ghost"
665+
sharedColumnsListing := "id, name, position"
666+
uniqueKey := "name_position_uidx"
667+
uniqueKeyColumns := NewColumnList([]string{"name", "position"})
668+
validValues := []string{"@v1", "@v2"}
669+
validArgs := []interface{}{3, 17}
670+
671+
call := func(rangeStartValues, rangeEndValues []string, rangeStartArgs, rangeEndArgs []interface{}) error {
672+
_, _, err := buildRangeInsertQueryTwoColumn(
673+
databaseName, originalTableName, ghostTableName,
674+
sharedColumnsListing, sharedColumnsListing,
675+
uniqueKey, uniqueKeyColumns,
676+
rangeStartValues, rangeEndValues,
677+
rangeStartArgs, rangeEndArgs,
678+
GreaterThanOrEqualsComparisonSign, "",
679+
)
680+
return err
681+
}
682+
683+
{
684+
// rangeStartValues length mismatch.
685+
err := call([]string{"@v1"}, validValues, validArgs, validArgs)
686+
require.ErrorContains(t, err, "got 2 columns but 1 rangeStartValues")
687+
}
688+
{
689+
// rangeEndValues length mismatch.
690+
err := call(validValues, []string{"@v1", "@v2", "@v3"}, validArgs, validArgs)
691+
require.ErrorContains(t, err, "got 2 columns but 3 rangeEndValues")
692+
}
693+
{
694+
// rangeStartArgs length mismatch.
695+
err := call(validValues, validValues, []interface{}{3}, validArgs)
696+
require.ErrorContains(t, err, "got 2 columns but 1 rangeStartArgs")
697+
}
698+
{
699+
// rangeEndArgs length mismatch.
700+
err := call(validValues, validValues, validArgs, []interface{}{})
701+
require.ErrorContains(t, err, "got 2 columns but 0 rangeEndArgs")
702+
}
703+
}
704+
661705
func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) {
662706
databaseName := "mydb"
663707
originalTableName := "tbl"

0 commit comments

Comments
 (0)