parser: disallow invalid infix for where clause in delete and update (#21113)

This commit is contained in:
Swastik Baranwal 2024-03-27 19:05:11 +05:30 committed by GitHub
parent 1e8d1a4d0b
commit f6a00fa55b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 0 deletions

View File

@ -295,11 +295,23 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine {
} else if kind == .update {
p.check_sql_keyword('where') or { return ast.SqlStmtLine{} }
where_expr = p.expr(0)
where_expr_result := p.check_sql_where_expr_has_no_undefined_variables(&where_expr,
[])
if where_expr_result is ast.NodeError {
return ast.SqlStmtLine{}
}
} else if kind == .delete {
table_pos = p.tok.pos()
table_type = p.parse_type()
p.check_sql_keyword('where') or { return ast.SqlStmtLine{} }
where_expr = p.expr(0)
where_expr_result := p.check_sql_where_expr_has_no_undefined_variables(&where_expr,
[])
if where_expr_result is ast.NodeError {
return ast.SqlStmtLine{}
}
}
return ast.SqlStmtLine{
table_expr: ast.TypeNode{

View File

@ -0,0 +1,7 @@
vlib/v/parser/tests/orm_delete_where_invalid_inifx_err.vv:23:49: error: undefined variable: `client_id`
21 | }!
22 | sql db {
23 | delete from ParameterTable where client_id == client_id && name == name
| ~~~~~~~~~
24 | } or { panic(err) }
25 | }

View File

@ -0,0 +1,25 @@
import db.sqlite
import rand
import time
@[table: 'parameter_tables']
struct ParameterTable {
id string = rand.ulid() @[primary]
name string @[unique: 'client_table']
description string
table_type string = 'parameter'
client_id string @[unique: 'client_table']
created time.Time @[default: 'CURRENT_TIMESTAMP'; sql_type: 'datetime']
}
fn main() {
mut db := sqlite.connect('test.db')!
db.synchronization_mode(sqlite.SyncMode.off)!
db.journal_mode(sqlite.JournalMode.memory)!
sql db {
create table ParameterTable
}!
sql db {
delete from ParameterTable where client_id == client_id && name == name
} or { panic(err) }
}