Skip to content

Commit eec37da

Browse files
author
Pickle Rick
committed
feat(sqlite): disable positional indexing when sqlc.slice is present
1 parent ce83d3f commit eec37da

File tree

9 files changed

+152
-7
lines changed

9 files changed

+152
-7
lines changed

internal/endtoend/testdata/issue_4213_reuse/sqlite/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/issue_4213_reuse/sqlite/go/models.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/issue_4213_reuse/sqlite/go/query.sql.go

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- name: ReuseWithSlice :many
2+
SELECT * FROM mytable
3+
WHERE typ IN (sqlc.slice(types)) AND (name = @name OR id = @id OR name = @name);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE TABLE mytable (
2+
id INTEGER PRIMARY KEY,
3+
typ INTEGER NOT NULL,
4+
name TEXT NOT NULL
5+
);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"version": "2",
3+
"sql": [
4+
{
5+
"engine": "sqlite",
6+
"queries": "query.sql",
7+
"schema": "schema.sql",
8+
"gen": {
9+
"go": {
10+
"package": "querytest",
11+
"out": "go"
12+
}
13+
}
14+
}
15+
]
16+
}

internal/endtoend/testdata/sqlc_slice/sqlite/go/query.sql.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/sqlc_slice_prepared/sqlite/go/query.sql.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/sql/rewrite/parameters.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,20 @@ func paramFromFuncCall(call *ast.FuncCall) (named.Param, string) {
8181
func NamedParameters(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool, dollar bool) (*ast.RawStmt, *named.ParamSet, []source.Edit) {
8282
foundFunc := astutils.Search(raw, named.IsParamFunc)
8383
foundSign := astutils.Search(raw, named.IsParamSign)
84+
85+
hasSlice := false
86+
for _, item := range foundFunc.Items {
87+
if call, ok := item.(*ast.FuncCall); ok && call.Func.Name == "slice" {
88+
hasSlice = true
89+
break
90+
}
91+
}
92+
8493
hasNamedParameterSupport := engine != config.EngineMySQL
94+
if engine == config.EngineSQLite && hasSlice {
95+
hasNamedParameterSupport = false
96+
}
97+
8598
allParams := named.NewParamSet(numbs, hasNamedParameterSupport)
8699

87100
if len(foundFunc.Items)+len(foundSign.Items) == 0 {
@@ -108,7 +121,7 @@ func NamedParameters(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool,
108121
// since it's needed during template generation for replacement
109122
replace = fmt.Sprintf(`/*SLICE:%s*/?`, param.Name())
110123
} else {
111-
if engine == config.EngineSQLite {
124+
if engine == config.EngineSQLite && hasNamedParameterSupport {
112125
replace = fmt.Sprintf("?%d", argn)
113126
} else {
114127
replace = "?"
@@ -143,7 +156,11 @@ func NamedParameters(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool,
143156
if engine == config.EngineMySQL || !dollar {
144157
replace = "?"
145158
} else if engine == config.EngineSQLite {
146-
replace = fmt.Sprintf("?%d", argn)
159+
if hasNamedParameterSupport {
160+
replace = fmt.Sprintf("?%d", argn)
161+
} else {
162+
replace = "?"
163+
}
147164
} else {
148165
replace = fmt.Sprintf("$%d", argn)
149166
}
@@ -171,7 +188,11 @@ func NamedParameters(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool,
171188
if engine == config.EngineMySQL || !dollar {
172189
replace = "?"
173190
} else if engine == config.EngineSQLite {
174-
replace = fmt.Sprintf("?%d", argn)
191+
if hasNamedParameterSupport {
192+
replace = fmt.Sprintf("?%d", argn)
193+
} else {
194+
replace = "?"
195+
}
175196
} else {
176197
replace = fmt.Sprintf("$%d", argn)
177198
}

0 commit comments

Comments
 (0)