From ff1f157b0654ea116dd24a27aa1af126eae5e30b Mon Sep 17 00:00:00 2001 From: Jengro Date: Sat, 9 May 2026 02:49:39 +0800 Subject: [PATCH] orm: fixdynamic query-data guard folding (#27114) --- vlib/orm/orm_dynamic_test.v | 26 +++++++++++++++++++++++++- vlib/v/transformer/transformer.v | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/vlib/orm/orm_dynamic_test.v b/vlib/orm/orm_dynamic_test.v index e61257d78..cb30c3db5 100644 --- a/vlib/orm/orm_dynamic_test.v +++ b/vlib/orm/orm_dynamic_test.v @@ -11,6 +11,10 @@ mut: status string } +struct DynamicMemberFilter { + name ?string +} + @[table: 'dynamic_cast_members'] struct DynamicCastMember { mut: @@ -76,6 +80,21 @@ fn test_dynamic_select_with_inline_where_block() { assert rows[0].name == 'Alice' assert rows[0].email == 'alice@example.com' assert rows[0].age == 31 + + filter := DynamicMemberFilter{ + name: 'Alice' + } + where_expr := { + if name := filter.name { + name == name + } + } + + guard_rows := sql db { + dynamic select from DynamicMember where where_expr + }! + + assert guard_rows.len == 2 } fn test_dynamic_update_with_alias_set_block() { @@ -149,8 +168,13 @@ fn test_dynamic_update_with_alias_set_block_cast_expr() { id := db.last_id() next_name := 'Alicia' next_required := true + filter := DynamicMemberFilter{ + name: next_name + } update_expr := { - name == next_name, + if name := filter.name { + name == name + }, is_required == u8(if next_required { 1 } else { 0 }) } diff --git a/vlib/v/transformer/transformer.v b/vlib/v/transformer/transformer.v index 72c833e87..0a55a61c1 100644 --- a/vlib/v/transformer/transformer.v +++ b/vlib/v/transformer/transformer.v @@ -808,7 +808,12 @@ fn (mut t Transformer) sql_query_data_items(items []ast.SqlQueryDataItem) []ast. fn (mut t Transformer) sql_query_data_item(mut item ast.SqlQueryDataItem) ast.SqlQueryDataItem { match mut item { ast.SqlQueryDataLeaf { + // The left side is an ORM field, but the right side can be a V variable + // with the same name, so `field == field` must not fold to `true`. + old_inside_sql := t.inside_sql + t.inside_sql = true item.expr = t.expr(mut item.expr) + t.inside_sql = old_inside_sql } ast.SqlQueryDataIf { for mut branch in item.branches { -- 2.39.5