Skip to content

Commit

Permalink
parser: disallow using sql as name (#19298)
Browse files Browse the repository at this point in the history
  • Loading branch information
Delta456 committed Sep 8, 2023
1 parent 9a4fbc8 commit 68cbf27
Show file tree
Hide file tree
Showing 10 changed files with 36 additions and 16 deletions.
4 changes: 2 additions & 2 deletions vlib/db/mssql/stmt_handle.v
Expand Up @@ -40,8 +40,8 @@ fn (mut h HStmt) close() {
}

// exec executes a Sql statement. Result is stored in odbc driver, and not yet read.
fn (h HStmt) exec(sql string) ! {
retcode := C.SQLExecDirect(h.hstmt, sql.str, C.SQLINTEGER(C.SQL_NTS))
fn (h HStmt) exec(sql_ string) ! {
retcode := C.SQLExecDirect(h.hstmt, sql_.str, C.SQLINTEGER(C.SQL_NTS))
check_error(retcode, 'SQLExecDirect()', C.SQLHANDLE(h.hstmt), C.SQLSMALLINT(C.SQL_HANDLE_STMT))!
}

Expand Down
2 changes: 1 addition & 1 deletion vlib/v/checker/tests/match_alias_type_err.vv
Expand Up @@ -2,7 +2,7 @@ type Stmt = SelectStmt

struct SelectStmt {}

fn parse(sql string) Stmt {
fn parse(sql_ string) Stmt {
return SelectStmt{}
}

Expand Down
9 changes: 9 additions & 0 deletions vlib/v/parser/parser.v
Expand Up @@ -65,6 +65,7 @@ mut:
inside_map_init bool
inside_orm bool
inside_chan_decl bool
inside_attr_decl bool
fixed_array_dim int // fixed array dim parsing level
or_is_handled bool // ignore `or` in this expression
builtin_mod bool // are we in the `builtin` module?
Expand Down Expand Up @@ -676,6 +677,7 @@ fn (mut p Parser) check_js_name() string {
}

fn (mut p Parser) check_name() string {
pos := p.tok.pos()
name := p.tok.lit
if p.peek_tok.kind == .dot && name in p.imports {
p.register_used_import(name)
Expand All @@ -686,6 +688,9 @@ fn (mut p Parser) check_name() string {
.key_interface { p.check(.key_interface) }
else { p.check(.name) }
}
if !p.inside_orm && !p.inside_attr_decl && name == 'sql' {
p.error_with_pos('unexpected keyword `sql`, expecting name', pos)
}
return name
}

Expand Down Expand Up @@ -1826,6 +1831,10 @@ fn (mut p Parser) attributes() {

fn (mut p Parser) parse_attr(is_at bool) ast.Attr {
mut kind := ast.AttrKind.plain
p.inside_attr_decl = true
defer {
p.inside_attr_decl = false
}
apos := p.prev_tok.pos()
if p.tok.kind == .key_unsafe {
p.next()
Expand Down
5 changes: 5 additions & 0 deletions vlib/v/parser/tests/keyword_sql_used_as_name_err.out
@@ -0,0 +1,5 @@
vlib/v/parser/tests/keyword_sql_used_as_name_err.vv:1:8: error: unexpected keyword `sql`, expecting name
1 | fn foo(sql string) {
| ~~~
2 | println(sql)
3 | }
6 changes: 6 additions & 0 deletions vlib/v/parser/tests/keyword_sql_used_as_name_err.vv
@@ -0,0 +1,6 @@
fn foo(sql string) {
println(sql)
}
fn main() {
foo("hi")
}
2 changes: 1 addition & 1 deletion vlib/v/parser/tests/sql_no_db_expr_a.out
@@ -1,5 +1,5 @@
vlib/v/parser/tests/sql_no_db_expr_a.vv:4:1: error: invalid expression: unexpected token `}`
2 | // SqlStmt
3 | sql :=
3 | sql_ :=
4 | }
| ^
2 changes: 1 addition & 1 deletion vlib/v/parser/tests/sql_no_db_expr_a.vv
@@ -1,4 +1,4 @@
fn x() {
// SqlStmt
sql :=
sql_ :=
}
6 changes: 3 additions & 3 deletions vlib/v/parser/tests/sql_no_db_expr_b.out
@@ -1,6 +1,6 @@
vlib/v/parser/tests/sql_no_db_expr_b.vv:3:11: error: invalid expression: unexpected token `:=`
vlib/v/parser/tests/sql_no_db_expr_b.vv:3:12: error: invalid expression: unexpected token `:=`
1 | fn x() {
2 | // SqlExpr
3 | x := sql :=
| ~~
3 | x := sql_ :=
| ~~
4 | }
2 changes: 1 addition & 1 deletion vlib/v/parser/tests/sql_no_db_expr_b.vv
@@ -1,4 +1,4 @@
fn x() {
// SqlExpr
x := sql :=
x := sql_ :=
}
14 changes: 7 additions & 7 deletions vlib/v/tests/struct_init_and_assign_test.v
Expand Up @@ -12,15 +12,15 @@ struct Foo {
}

fn test_struct_init_and_assign() {
mut sql := FooFoo{}
sql.conn = Foo{
mut sql_ := FooFoo{}
sql_.conn = Foo{
username: 'username'
password: 'abc'
dbname: 'test'
}
assert sql.conn.host == '127.0.0.1'
assert sql.conn.port == 3306
assert sql.conn.username == 'username'
assert sql.conn.password == 'abc'
assert sql.conn.dbname == 'test'
assert sql_.conn.host == '127.0.0.1'
assert sql_.conn.port == 3306
assert sql_.conn.username == 'username'
assert sql_.conn.password == 'abc'
assert sql_.conn.dbname == 'test'
}

0 comments on commit 68cbf27

Please sign in to comment.