Skip to content

Commit 2839632

Browse files
cmoogkyleconroy
authored andcommitted
adds support or update queries without where (#259)
1 parent 2c8d3a7 commit 2839632

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

internal/mysql/param.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,20 @@ func paramsInLimitExpr(limit *sqlparser.Limit, s *Schema, tableAliasMap FromTabl
4444

4545
func paramsInWhereExpr(e sqlparser.SQLNode, s *Schema, tableAliasMap FromTables, defaultTable string, settings dinosql.GenerateSettings) ([]*Param, error) {
4646
params := []*Param{}
47+
if e == nil {
48+
return params, nil
49+
} else if expr, ok := e.(*sqlparser.Where); ok {
50+
if expr == nil {
51+
return params, nil
52+
}
53+
e = expr.Expr
54+
}
4755
switch v := e.(type) {
4856
case *sqlparser.Where:
4957
if v == nil {
5058
return params, nil
5159
}
52-
return paramsInWhereExpr(v.Expr, s, tableAliasMap, defaultTable, settings)
60+
return paramsInWhereExpr(v, s, tableAliasMap, defaultTable, settings)
5361
case *sqlparser.ComparisonExpr:
5462
p, found, err := paramInComparison(v, s, tableAliasMap, defaultTable, settings)
5563
if err != nil {

internal/mysql/parse.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,10 @@ func parseUpdate(node *sqlparser.Update, query string, s *Schema, settings dinos
272272
params := []*Param{}
273273
for _, updateExpr := range node.Exprs {
274274
col := updateExpr.Name
275-
newValue, isParam := updateExpr.Expr.(*sqlparser.SQLVal)
276-
if !isParam {
275+
newValue, isValue := updateExpr.Expr.(*sqlparser.SQLVal)
276+
if !isValue {
277+
continue
278+
} else if isParam := newValue.Type == sqlparser.ValArg; !isParam {
277279
continue
278280
}
279281
colDfn, err := s.getColType(col, tableAliasMap, defaultTable)
@@ -289,7 +291,7 @@ func parseUpdate(node *sqlparser.Update, query string, s *Schema, settings dinos
289291
params = append(params, &param)
290292
}
291293

292-
whereParams, err := paramsInWhereExpr(node.Where.Expr, s, tableAliasMap, defaultTable, settings)
294+
whereParams, err := paramsInWhereExpr(node.Where, s, tableAliasMap, defaultTable, settings)
293295
if err != nil {
294296
return nil, fmt.Errorf("failed to parse params from WHERE expression: %w", err)
295297
}

internal/mysql/parse_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,22 @@ UPDATE users SET first_name = ?, last_name = ? WHERE id > ? AND first_name = ? L
388388
SchemaLookup: mockSchema,
389389
},
390390
},
391+
testCase{
392+
name: "update_without_where",
393+
input: expected{
394+
query: "/* name: UpdateAllUsers :exec */ update users set first_name = 'Bob'",
395+
schema: mockSchema,
396+
},
397+
output: &Query{
398+
SQL: "update users set first_name = 'Bob'",
399+
Columns: nil,
400+
Params: []*Param{},
401+
Name: "UpdateAllUsers",
402+
Cmd: ":exec",
403+
DefaultTableName: "users",
404+
SchemaLookup: mockSchema,
405+
},
406+
},
391407
testCase{
392408
name: "update_users",
393409
input: expected{

0 commit comments

Comments
 (0)