orm: fix codegen for option fk (fix #23383) (#23400)

This commit is contained in:
Felipe Pena 2025-01-07 12:53:37 -03:00 committed by GitHub
parent 124927ba96
commit 7078a2e185
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 55 additions and 1 deletions

View File

@ -167,6 +167,7 @@ const skip_with_fsanitize_memory = [
'vlib/orm/orm_option_time_test.v', 'vlib/orm/orm_option_time_test.v',
'vlib/orm/orm_order_by_custom_field_test.v', 'vlib/orm/orm_order_by_custom_field_test.v',
'vlib/orm/orm_serial_attribute_test.v', 'vlib/orm/orm_serial_attribute_test.v',
'vlib/orm/orm_option_subselect_test.v',
'vlib/db/sqlite/sqlite_test.v', 'vlib/db/sqlite/sqlite_test.v',
'vlib/db/sqlite/sqlite_orm_test.v', 'vlib/db/sqlite/sqlite_orm_test.v',
'vlib/db/sqlite/sqlite_comptime_field_test.v', 'vlib/db/sqlite/sqlite_comptime_field_test.v',
@ -272,6 +273,7 @@ const skip_on_ubuntu_musl = [
'vlib/orm/orm_option_time_test.v', 'vlib/orm/orm_option_time_test.v',
'vlib/orm/orm_order_by_custom_field_test.v', 'vlib/orm/orm_order_by_custom_field_test.v',
'vlib/orm/orm_serial_attribute_test.v', 'vlib/orm/orm_serial_attribute_test.v',
'vlib/orm/orm_option_subselect_test.v',
'vlib/v/tests/orm_enum_test.v', 'vlib/v/tests/orm_enum_test.v',
'vlib/v/tests/orm_sub_struct_test.v', 'vlib/v/tests/orm_sub_struct_test.v',
'vlib/v/tests/orm_sub_array_struct_test.v', 'vlib/v/tests/orm_sub_array_struct_test.v',

View File

@ -0,0 +1,49 @@
import db.sqlite
fn test_main() {
db := sqlite.connect(':memory:')!
sql db {
create table Commit
create table Measurement
}!
c := Commit{
commit_hash: 'hash'
}
sql db {
insert c into Commit
}!
c2 := sql db {
select from Commit
}!
assert c2[0].v_self_default == none
c3 := Commit{
commit_hash: 'hash1'
v_self_default: Measurement{
id: 123
}
}
sql db {
insert c3 into Commit
}!
c4 := sql db {
select from Commit
}!
assert c4[0].v_self_default == none
assert c4[1].v_self_default != none
}
@[table: 'commits']
struct Commit {
commit_hash string @[primary]
v_self_default ?Measurement
}
@[table: 'measurements']
struct Measurement {
id int @[primary; serial]
}

View File

@ -1071,7 +1071,6 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, re
sub_result_c_typ := g.styp(sub.typ) sub_result_c_typ := g.styp(sub.typ)
g.writeln('${sub_result_c_typ} ${sub_result_var};') g.writeln('${sub_result_c_typ} ${sub_result_var};')
g.write_orm_select(sub, connection_var_name, sub_result_var) g.write_orm_select(sub, connection_var_name, sub_result_var)
if field.typ.has_flag(.option) { if field.typ.has_flag(.option) {
unwrapped_field_c_typ := g.styp(field.typ.clear_flag(.option)) unwrapped_field_c_typ := g.styp(field.typ.clear_flag(.option))
g.writeln('if (!${sub_result_var}.is_error)') g.writeln('if (!${sub_result_var}.is_error)')
@ -1172,6 +1171,10 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, re
} }
g.indent-- g.indent--
if !node.is_array {
g.writeln('} else {')
g.writeln('\t${result_var}.is_error = true;')
}
g.writeln('}') g.writeln('}')
if node.is_array { if node.is_array {