diff --git a/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.out b/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.out new file mode 100644 index 0000000000..db8c1637e7 --- /dev/null +++ b/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/orm_using_undefined_var_in_where_err.vv:24:35: error: undefined variable: `email` + 22 | + 23 | _ := sql db { + 24 | select from User where email == email + | ~~~~~ + 25 | } + 26 | } diff --git a/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.vv b/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.vv new file mode 100644 index 0000000000..b3d685398d --- /dev/null +++ b/vlib/v/checker/tests/orm_using_undefined_var_in_where_err.vv @@ -0,0 +1,26 @@ +import time +import sqlite + +struct User { + id int [primary; sql: serial] + created_at time.Time + updated_at time.Time + email string + password string + name string +} + +fn main() { + db := sqlite.connect(':memory:') ? + sql db { + create table User + } + m := User{} + sql db { + insert m into User + } + + _ := sql db { + select from User where email == email + } +} diff --git a/vlib/v/parser/sql.v b/vlib/v/parser/sql.v index 7bb2507849..d813c8adad 100644 --- a/vlib/v/parser/sql.v +++ b/vlib/v/parser/sql.v @@ -38,6 +38,13 @@ fn (mut p Parser) sql_expr() ast.Expr { query_one = true } } + if e.right is ast.Ident { + if !p.scope.known_var(e.right.name) { + p.check_undefined_variables([e.left], e.right) or { + return p.error_with_pos(err.msg, e.right.pos) + } + } + } } } mut has_limit := false