Skip to content

Commit 8f4677a

Browse files
authored
Merge pull request #24 from blastrain/feature/fix-is-already-commit-query-log
Fix IsAlreadyCommittedQueryLog
2 parents 282d7fa + 68ad419 commit 8f4677a

File tree

3 files changed

+52
-11
lines changed

3 files changed

+52
-11
lines changed

database/sql/query_log.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
vtparser "github.com/blastrain/vitess-sqlparser/sqlparser"
77
"github.com/pkg/errors"
8+
"go.knocknote.io/octillery/debug"
89
"go.knocknote.io/octillery/exec"
910
"go.knocknote.io/octillery/sqlparser"
1011
)
@@ -248,7 +249,30 @@ func (t *Tx) mergeComparisonExprs(comparisonExprs []*vtparser.ComparisonExpr) vt
248249

249250
func (t *Tx) createEqualComparisonExprWithArgs(left vtparser.Expr, right vtparser.Expr, args []interface{}) *vtparser.ComparisonExpr {
250251
parser, _ := sqlparser.New()
251-
val := right.(*vtparser.SQLVal)
252+
switch val := right.(type) {
253+
case *vtparser.SQLVal:
254+
return &vtparser.ComparisonExpr{
255+
Operator: vtparser.EqualStr,
256+
Left: left,
257+
Right: t.covertValArgToRealValue(parser, val, args),
258+
}
259+
case vtparser.ValTuple:
260+
values := make(vtparser.ValTuple, len(val))
261+
for idx, value := range val {
262+
values[idx] = t.covertValArgToRealValue(parser, value.(*vtparser.SQLVal), args)
263+
}
264+
return &vtparser.ComparisonExpr{
265+
Operator: vtparser.InStr,
266+
Left: left,
267+
Right: values,
268+
}
269+
default:
270+
debug.Printf("[WARN] unexpected expr value %T", val)
271+
return nil
272+
}
273+
}
274+
275+
func (t *Tx) covertValArgToRealValue(parser *sqlparser.Parser, val *vtparser.SQLVal, args []interface{}) *vtparser.SQLVal {
252276
if val.Type == vtparser.ValArg {
253277
arg := args[parser.ValueIndexByValArg(val)-1]
254278
switch arg.(type) {
@@ -258,11 +282,7 @@ func (t *Tx) createEqualComparisonExprWithArgs(left vtparser.Expr, right vtparse
258282
val = vtparser.NewStrVal([]byte(arg.(string)))
259283
}
260284
}
261-
return &vtparser.ComparisonExpr{
262-
Operator: vtparser.EqualStr,
263-
Left: left,
264-
Right: val,
265-
}
285+
return val
266286
}
267287

268288
func (t *Tx) exprToComparisonExprs(expr vtparser.Expr, args []interface{}) []*vtparser.ComparisonExpr {

database/sql/sql_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,9 @@ func testPrepareContextWithNotShardingTable(ctx context.Context, t *testing.T, d
340340
power int32
341341
createdAt time.Time
342342
)
343-
stmt.QueryRow(1).Scan(&name, &age, &isGod, &point, &power, &createdAt)
343+
if err := stmt.QueryRow(1).Scan(&name, &age, &isGod, &point, &power, &createdAt); err != nil {
344+
t.Fatal(err)
345+
}
344346
if name != "alice" {
345347
t.Fatal("cannot scan")
346348
}
@@ -354,7 +356,9 @@ func testPrepareContextWithNotShardingTable(ctx context.Context, t *testing.T, d
354356
power int32
355357
createdAt time.Time
356358
)
357-
stmt.QueryRowContext(ctx, 1).Scan(&name, &age, &isGod, &point, &power, &createdAt)
359+
if err := stmt.QueryRowContext(ctx, 1).Scan(&name, &age, &isGod, &point, &power, &createdAt); err != nil {
360+
t.Fatal(err)
361+
}
358362
if name != "alice" {
359363
t.Fatal("cannot scan")
360364
}

transaction_test.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,22 @@ func TestIsAlreadyCommittedQueryLogErrorCase(t *testing.T) {
402402
}
403403

404404
func TestIsAlreadyCommittedDeleteQueryLog(t *testing.T) {
405-
testIsAlreadyCommittedQueryLog(t, &sql.QueryLog{
406-
Query: "DELETE from user_stages WHERE id = ? AND user_id = ?",
407-
Args: []interface{}{1, 10},
405+
t.Run("simple", func(t *testing.T) {
406+
testIsAlreadyCommittedQueryLog(t, &sql.QueryLog{
407+
Query: "DELETE from user_stages WHERE id = ? AND user_id = ?",
408+
Args: []interface{}{1, 10},
409+
})
410+
})
411+
412+
t.Run("included IN", func(t *testing.T) {
413+
testIsAlreadyCommittedQueryLog(t, &sql.QueryLog{
414+
Query: "DELETE from user_stages WHERE id IN (1,?,?) AND user_id = ?",
415+
Args: []interface{}{2, 3, 10},
416+
})
417+
testIsAlreadyCommittedQueryLog(t, &sql.QueryLog{
418+
Query: "DELETE from user_items WHERE id IN (?,?) AND user_id = 10",
419+
Args: []interface{}{1, 2},
420+
})
408421
})
409422
}
410423

@@ -421,4 +434,8 @@ func TestIsAlreadyCommittedUpdateQueryLog(t *testing.T) {
421434
Query: "UPDATE user_stages set name = ?, age = 5 where user_id = ?",
422435
Args: []interface{}{"alice", 10},
423436
})
437+
testIsAlreadyCommittedQueryLog(t, &sql.QueryLog{
438+
Query: "UPDATE user_stages set name = ?, age = 5 where user_id IN (?,?)",
439+
Args: []interface{}{"alice", 5, 10},
440+
})
424441
}

0 commit comments

Comments
 (0)