checker: do not register pseudo variables in sql queries
parent
9cbf572561
commit
3dea698c93
|
@ -39,6 +39,8 @@ pub mut:
|
||||||
cur_generic_type table.Type
|
cur_generic_type table.Type
|
||||||
mut:
|
mut:
|
||||||
expr_level int // to avoid infinit recursion segfaults due to compiler bugs
|
expr_level int // to avoid infinit recursion segfaults due to compiler bugs
|
||||||
|
inside_sql bool // to handle sql table fields pseudo variables
|
||||||
|
cur_orm_ts table.TypeSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_checker(table &table.Table, pref &pref.Preferences) Checker {
|
pub fn new_checker(table &table.Table, pref &pref.Preferences) Checker {
|
||||||
|
@ -2249,6 +2251,11 @@ pub fn (mut c Checker) ident(mut ident ast.Ident) table.Type {
|
||||||
return table.int_type
|
return table.int_type
|
||||||
}
|
}
|
||||||
if ident.name != '_' {
|
if ident.name != '_' {
|
||||||
|
if c.inside_sql {
|
||||||
|
if field := c.table.struct_find_field(c.cur_orm_ts, ident.name) {
|
||||||
|
return field.typ
|
||||||
|
}
|
||||||
|
}
|
||||||
c.error('undefined ident: `$ident.name`', ident.pos)
|
c.error('undefined ident: `$ident.name`', ident.pos)
|
||||||
}
|
}
|
||||||
if c.table.known_type(ident.name) {
|
if c.table.known_type(ident.name) {
|
||||||
|
@ -2699,7 +2706,12 @@ fn (c &Checker) fileis(s string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut c Checker) sql_expr(mut node ast.SqlExpr) table.Type {
|
fn (mut c Checker) sql_expr(mut node ast.SqlExpr) table.Type {
|
||||||
|
c.inside_sql = true
|
||||||
|
defer {
|
||||||
|
c.inside_sql = false
|
||||||
|
}
|
||||||
sym := c.table.get_type_symbol(node.table_type)
|
sym := c.table.get_type_symbol(node.table_type)
|
||||||
|
c.cur_orm_ts = sym
|
||||||
info := sym.info as table.Struct
|
info := sym.info as table.Struct
|
||||||
fields := c.fetch_and_verify_orm_fields(info, node.pos, node.table_name)
|
fields := c.fetch_and_verify_orm_fields(info, node.pos, node.table_name)
|
||||||
node.fields = fields
|
node.fields = fields
|
||||||
|
@ -2707,6 +2719,7 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) table.Type {
|
||||||
if node.has_where {
|
if node.has_where {
|
||||||
// Register this type's fields as variables so they can be used in `where`
|
// Register this type's fields as variables so they can be used in `where`
|
||||||
// expressions
|
// expressions
|
||||||
|
/*
|
||||||
scope := c.file.scope.innermost(node.pos.pos)
|
scope := c.file.scope.innermost(node.pos.pos)
|
||||||
for field in fields {
|
for field in fields {
|
||||||
// println('registering sql field var $field.name')
|
// println('registering sql field var $field.name')
|
||||||
|
@ -2718,6 +2731,7 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) table.Type {
|
||||||
is_changed: true
|
is_changed: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
if node.has_where {
|
if node.has_where {
|
||||||
c.expr(node.where_expr)
|
c.expr(node.where_expr)
|
||||||
|
@ -2733,23 +2747,32 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) table.Type {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut c Checker) sql_stmt(mut node ast.SqlStmt) table.Type {
|
fn (mut c Checker) sql_stmt(mut node ast.SqlStmt) table.Type {
|
||||||
|
c.inside_sql = true
|
||||||
|
defer {
|
||||||
|
c.inside_sql = false
|
||||||
|
}
|
||||||
sym := c.table.get_type_symbol(node.table_type)
|
sym := c.table.get_type_symbol(node.table_type)
|
||||||
|
c.cur_orm_ts = sym
|
||||||
info := sym.info as table.Struct
|
info := sym.info as table.Struct
|
||||||
fields := c.fetch_and_verify_orm_fields(info, node.pos, node.table_name)
|
fields := c.fetch_and_verify_orm_fields(info, node.pos, node.table_name)
|
||||||
node.fields = fields
|
node.fields = fields
|
||||||
// Register this type's fields as variables so they can be used in `where`
|
// Register this type's fields as variables so they can be used in `where`
|
||||||
// expressions
|
// expressions
|
||||||
|
/*
|
||||||
scope := c.file.scope.innermost(node.pos.pos)
|
scope := c.file.scope.innermost(node.pos.pos)
|
||||||
for field in fields {
|
for field in fields {
|
||||||
// println('registering sql field var $field.name')
|
println('registering sql field var $field.name')
|
||||||
scope.register(field.name, ast.Var{
|
scope.register(field.name, ast.Var{
|
||||||
name: field.name
|
name: field.name
|
||||||
typ: field.typ
|
typ: field.typ
|
||||||
is_mut: true
|
is_mut: true
|
||||||
is_used: true
|
is_used: true
|
||||||
is_changed: true
|
is_changed: true
|
||||||
|
is_arg: true
|
||||||
})
|
})
|
||||||
|
// is_arg so that it's not freed TODO not an arg
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
c.expr(node.db_expr)
|
c.expr(node.db_expr)
|
||||||
if node.kind == .update {
|
if node.kind == .update {
|
||||||
for expr in node.update_exprs {
|
for expr in node.update_exprs {
|
||||||
|
|
|
@ -2204,7 +2204,8 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) {
|
||||||
g.write(', &')
|
g.write(', &')
|
||||||
}
|
}
|
||||||
// `x[0] *= y`
|
// `x[0] *= y`
|
||||||
if g.assign_op != .assign && g.assign_op in token.assign_tokens &&
|
if g.assign_op != .assign &&
|
||||||
|
g.assign_op in token.assign_tokens &&
|
||||||
info.elem_type != table.string_type {
|
info.elem_type != table.string_type {
|
||||||
// TODO move this
|
// TODO move this
|
||||||
g.write('*($elem_type_str*)array_get(')
|
g.write('*($elem_type_str*)array_get(')
|
||||||
|
|
Loading…
Reference in New Issue