diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 536e7110d91fba..f4a2bc803cc188 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -7930,6 +7930,10 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) ast.Type { sym := c.table.get_type_symbol(node.table_expr.typ) c.ensure_type_exists(node.table_expr.typ, node.pos) or { return ast.void_type } c.cur_orm_ts = *sym + if sym.info !is ast.Struct { + c.error('The table symbol `$sym.name` has to be a struct', node.table_expr.pos) + return ast.void_type + } info := sym.info as ast.Struct fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, sym.name) mut sub_structs := map[int]ast.SqlExpr{} diff --git a/vlib/v/checker/tests/orm_not_a_struct.out b/vlib/v/checker/tests/orm_not_a_struct.out new file mode 100644 index 00000000000000..26f2f6ec779a95 --- /dev/null +++ b/vlib/v/checker/tests/orm_not_a_struct.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/orm_not_a_struct.vv:10:15: error: The table symbol `Person` has to be a struct + 8 | db := sqlite.connect(':memory:')? + 9 | _ := sql db { + 10 | select from Person + | ~~~~~~ + 11 | } + 12 | } diff --git a/vlib/v/checker/tests/orm_not_a_struct.vv b/vlib/v/checker/tests/orm_not_a_struct.vv new file mode 100644 index 00000000000000..05b18913f43424 --- /dev/null +++ b/vlib/v/checker/tests/orm_not_a_struct.vv @@ -0,0 +1,12 @@ +import sqlite + +enum Person { + test +} + +fn main() { + db := sqlite.connect(':memory:')? + _ := sql db { + select from Person + } +}