Skip to content

Commit 40888f3

Browse files
authored
chore: make cached params immutable (#442)
Fixes #441
1 parent 98e3097 commit 40888f3

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

statement_parser.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,9 @@ func (p *statementParser) findParams(sql string) (string, []string, error) {
683683
return "", nil, err
684684
}
685685
info := p.detectStatementType(sql)
686-
p.statementsCache.Add(sql, &statementsCacheEntry{sql: namedParamsSql, params: params, info: info})
686+
cachedParams := make([]string, len(params))
687+
copy(cachedParams, params)
688+
p.statementsCache.Add(sql, &statementsCacheEntry{sql: namedParamsSql, params: cachedParams, info: info})
687689
return namedParamsSql, params, nil
688690
}
689691
}

statement_parser_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,27 @@ func TestDetectStatementType(t *testing.T) {
23782378
}
23792379
}
23802380

2381+
func TestCachedParamsAreImmutable(t *testing.T) {
2382+
parser, err := newStatementParser(databasepb.DatabaseDialect_GOOGLE_STANDARD_SQL, 1000)
2383+
if err != nil {
2384+
t.Fatal(err)
2385+
}
2386+
for n := 0; n < 2; n++ {
2387+
_, params, err := parser.findParams("select * from test where id=?")
2388+
if err != nil {
2389+
t.Fatal(err)
2390+
}
2391+
if g, w := len(params), 1; g != w {
2392+
t.Fatalf("params length mismatch\n Got: %v\nWant: %v", g, w)
2393+
}
2394+
if g, w := params[0], "p1"; g != w {
2395+
t.Fatalf("param mismatch\n Got: %v\nWant: %v", g, w)
2396+
}
2397+
// Modify the params we got from the parser and verify that this does not modify the cached params.
2398+
params[0] = "test"
2399+
}
2400+
}
2401+
23812402
func BenchmarkDetectStatementTypeWithoutCache(b *testing.B) {
23822403
parser, err := newStatementParser(databasepb.DatabaseDialect_GOOGLE_STANDARD_SQL, 0)
23832404
if err != nil {

0 commit comments

Comments
 (0)