From 8288cbb985e955454fc2bc52abbc0b43db682c0f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 05:23:58 +0300 Subject: [PATCH] db.sqlite: fix orm dynamic select with multiple conditions and in operator (fixes #26913) --- vlib/db/sqlite/orm.v | 16 ++++++++- vlib/orm/orm_dynamic_test.v | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/vlib/db/sqlite/orm.v b/vlib/db/sqlite/orm.v index 065cb742f..fe84fa051 100644 --- a/vlib/db/sqlite/orm.v +++ b/vlib/db/sqlite/orm.v @@ -146,7 +146,21 @@ fn sqlite_stmt_binder(stmt Stmt, d orm.QueryData, query string, mut c &int) ! { if err != 0 { return stmt.db.error_message(err, query) } - c++ + if !sqlite_primitive_is_array(data) { + c++ + } + } +} + +fn sqlite_primitive_is_array(data orm.Primitive) bool { + return match data { + []orm.Primitive, []bool, []f32, []f64, []i16, []i64, []i8, []int, []string, []time.Time, + []u16, []u32, []u64, []u8, []orm.InfixType { + true + } + else { + false + } } } diff --git a/vlib/orm/orm_dynamic_test.v b/vlib/orm/orm_dynamic_test.v index 340959235..9e19008b3 100644 --- a/vlib/orm/orm_dynamic_test.v +++ b/vlib/orm/orm_dynamic_test.v @@ -118,3 +118,73 @@ fn test_dynamic_update_with_alias_set_block() { assert rows[0].email == 'alice@example.com' assert rows[0].status == next_status } + +fn test_dynamic_select_with_in_operator_and_additional_condition() { + mut db := sqlite.connect(':memory:')! + defer { + db.close() or { panic(err) } + } + + sql db { + create table DynamicMember + }! + + members := [ + DynamicMember{ + name: 'Alice' + email: 'alice@example.com' + age: 31 + status: 'active' + }, + DynamicMember{ + name: 'Bob' + email: 'bob@example.com' + age: 24 + status: 'pending' + }, + DynamicMember{ + name: 'Charlie' + email: 'charlie@example.com' + age: 29 + status: 'active' + }, + DynamicMember{ + name: 'Diana' + email: 'diana@example.com' + age: 35 + status: 'inactive' + }, + DynamicMember{ + name: 'Eve' + email: 'eve@example.com' + age: 22 + status: 'pending' + }, + ] + + for member in members { + sql db { + insert member into DynamicMember + }! + } + + valid_names := ['Alice', 'Charlie', 'Eve'] + min_age := 25 + + rows := sql db { + dynamic select from DynamicMember where { + if valid_names.len > 0 { + name in valid_names + }, + if min_age > 0 { + age >= min_age + } + } order by id + }! + + assert rows.len == 2 + assert rows[0].name == 'Alice' + assert rows[0].age == 31 + assert rows[1].name == 'Charlie' + assert rows[1].age == 29 +} -- 2.39.5