From aa61fcb3dceaad50d03fda107f3f08254279f29b Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 5 Jul 2023 23:25:22 +0300 Subject: [PATCH] orm: fix inserting sequential values (id=0), in tables with an i64 primary field (#18791) --- vlib/orm/orm.v | 13 ++++++++++--- vlib/orm/orm_insert_test.v | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/vlib/orm/orm.v b/vlib/orm/orm.v index 555a27a9ad..6e3dc10aeb 100644 --- a/vlib/orm/orm.v +++ b/vlib/orm/orm.v @@ -209,9 +209,16 @@ pub fn orm_stmt_gen(sql_dialect SQLDialect, table string, q string, kind StmtKin if data.data.len > 0 { // Allow the database to insert an automatically generated primary key // under the hood if it is not passed by the user. - if is_primary_column && data.data[i].type_idx() in orm.nums { - if (data.data[i] as int) == 0 { - continue + tidx := data.data[i].type_idx() + if is_primary_column && (tidx in orm.nums || tidx in orm.num64) { + x := data.data[i] + match x { + i8, i16, int, i64, u8, u16, u32, u64 { + if i64(x) == 0 { + continue + } + } + else {} } } diff --git a/vlib/orm/orm_insert_test.v b/vlib/orm/orm_insert_test.v index f2fdd44aec..566501cea3 100644 --- a/vlib/orm/orm_insert_test.v +++ b/vlib/orm/orm_insert_test.v @@ -287,3 +287,29 @@ fn test_orm_insert_with_multiple_child_elements() { assert parent.notes[1].text == 'Second note' assert parent.notes[2].text == 'Third note' } + +[table: 'customers'] +struct Customer { + id i64 [primary; sql: serial] + name string +} + +fn test_i64_primary_field_works_with_insertions_of_id_0() { + db := sqlite.connect(':memory:')! + sql db { + create table Customer + }! + for i in ['Bob', 'Charlie'] { + new_customer := Customer{ + name: i + } + sql db { + insert new_customer into Customer + }! + } + users := sql db { + select from Customer + }! + assert users.len == 2 + // println("${users}") +}