Skip to content

Commit 8c75b07

Browse files
committed
orm: resolve generic inserting object type
1 parent dcbf5d8 commit 8c75b07

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

‎vlib/orm/orm_generic_struct_field_test.v‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,33 @@ fn test_create_table_in_generic_function() {
145145

146146
queue.conn.close()!
147147
}
148+
149+
// Test inserting from within a generic function
150+
// This tests the fix for the "cannot use `Message` as `Message[Payload]`" error
151+
pub fn (mut q Queue[T]) add_message(data string) !GenericMessage[T] {
152+
msg := GenericMessage[T]{
153+
data: data
154+
}
155+
sql q.conn {
156+
insert msg into GenericMessage[T]
157+
}!
158+
return msg
159+
}
160+
161+
fn test_insert_in_generic_function() {
162+
mut queue := create_queue[Payload](':memory:')!
163+
164+
// Insert from within a generic function
165+
msg := queue.add_message('inserted from generic fn')!
166+
assert msg.data == 'inserted from generic fn'
167+
168+
// Verify it was inserted
169+
messages := sql queue.conn {
170+
select from GenericMessage[Payload]
171+
}!
172+
173+
assert messages.len == 1
174+
assert messages[0].data == 'inserted from generic fn'
175+
176+
queue.conn.close()!
177+
}

‎vlib/v/checker/orm.v‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,13 @@ fn (mut c Checker) sql_stmt_line(mut node ast.SqlStmtLine) ast.Type {
277277
inserting_object_type = inserting_object.typ.deref()
278278
}
279279

280+
// Resolve generic inserting object type if we're inside a generic function context
281+
if inserting_object_type.has_flag(.generic) && c.table.cur_fn != unsafe { nil }
282+
&& c.table.cur_fn.generic_names.len > 0 && c.table.cur_concrete_types.len > 0 {
283+
inserting_object_type = c.table.unwrap_generic_type(inserting_object_type,
284+
c.table.cur_fn.generic_names, c.table.cur_concrete_types)
285+
}
286+
280287
if inserting_object_type != node.table_expr.typ
281288
&& !c.table.sumtype_has_variant(inserting_object_type, node.table_expr.typ, false) {
282289
table_name := table_sym.name

0 commit comments

Comments
 (0)