From 165b4fd33e411970e02f01e90e3b79d85d2515ba Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 12:45:23 +0300 Subject: [PATCH] cgen: C error when asserting value from `sql db { select from...}` (fixes #23345) --- vlib/v/gen/c/if.v | 6 +++++ vlib/v/gen/c/sql_assert_temp_var_test.v | 18 +++++++++++++ .../assert_sql_select_sub_array_field.vv | 27 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 vlib/v/gen/c/sql_assert_temp_var_test.v create mode 100644 vlib/v/gen/c/testdata/assert_sql_select_sub_array_field.vv diff --git a/vlib/v/gen/c/if.v b/vlib/v/gen/c/if.v index f81644404..fe04c1d8d 100644 --- a/vlib/v/gen/c/if.v +++ b/vlib/v/gen/c/if.v @@ -109,6 +109,9 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool { if expr.or_expr.kind != .absent { return true } + if g.need_tmp_var_in_expr(expr.left) { + return true + } if g.need_tmp_var_in_expr(expr.index) { return true } @@ -182,6 +185,9 @@ fn (mut g Gen) need_tmp_var_in_expr(expr ast.Expr) bool { sym := g.table.sym(expr.typ) return sym.info is ast.Struct && sym.info.has_option } + ast.SqlExpr { + return true + } else {} } return false diff --git a/vlib/v/gen/c/sql_assert_temp_var_test.v b/vlib/v/gen/c/sql_assert_temp_var_test.v new file mode 100644 index 000000000..dffe3e521 --- /dev/null +++ b/vlib/v/gen/c/sql_assert_temp_var_test.v @@ -0,0 +1,18 @@ +import os + +const sql_assert_temp_var_vexe = @VEXE + +const sql_assert_temp_var_vroot = os.real_path(@VMODROOT) + +const sql_assert_temp_var_testdata = os.join_path(sql_assert_temp_var_vroot, 'vlib/v/gen/c/testdata/assert_sql_select_sub_array_field.vv') + +fn test_assert_with_inline_sql_select_compiles() { + os.chdir(sql_assert_temp_var_vroot) or {} + output_path := os.join_path(os.vtmp_dir(), 'assert_sql_select_sub_array_field.exe') + defer { + os.rm(output_path) or {} + } + cmd := '${os.quoted_path(sql_assert_temp_var_vexe)} -o ${os.quoted_path(output_path)} ${os.quoted_path(sql_assert_temp_var_testdata)}' + compilation := os.execute(cmd) + assert compilation.exit_code == 0, '${cmd}\n${compilation.output}' +} diff --git a/vlib/v/gen/c/testdata/assert_sql_select_sub_array_field.vv b/vlib/v/gen/c/testdata/assert_sql_select_sub_array_field.vv new file mode 100644 index 000000000..752ccd5f5 --- /dev/null +++ b/vlib/v/gen/c/testdata/assert_sql_select_sub_array_field.vv @@ -0,0 +1,27 @@ +import db.sqlite + +struct Parent { + id int @[primary; sql: serial] + children []Child @[fkey: 'parent_id'] +} + +struct Child { + id int @[primary; sql: serial] + parent_id int +} + +fn main() { + mut db := sqlite.connect(':memory:')! + parent := Parent{ + children: [Child{}, Child{}] + } + sql db { + create table Child + create table Parent + insert parent into Parent + }! + + assert parent.children.len == (sql db { + select from Parent limit 1 + }!)[0].children.len +} -- 2.39.5