mirror of
https://github.com/vlang/v.git
synced 2025-09-13 22:42:26 +03:00
orm: fix cgen inserting wrong array index (#19324)
This commit is contained in:
parent
55ca8d8d8e
commit
e8d133d548
3 changed files with 65 additions and 2 deletions
|
@ -134,6 +134,7 @@ const (
|
||||||
'vlib/orm/orm_mut_db_test.v',
|
'vlib/orm/orm_mut_db_test.v',
|
||||||
'vlib/orm/orm_result_test.v',
|
'vlib/orm/orm_result_test.v',
|
||||||
'vlib/orm/orm_custom_operators_test.v',
|
'vlib/orm/orm_custom_operators_test.v',
|
||||||
|
'vlib/orm/orm_fk_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_vfs_lowlevel_test.v',
|
'vlib/db/sqlite/sqlite_vfs_lowlevel_test.v',
|
||||||
|
@ -213,6 +214,7 @@ const (
|
||||||
'vlib/orm/orm_mut_db_test.v',
|
'vlib/orm/orm_mut_db_test.v',
|
||||||
'vlib/orm/orm_result_test.v',
|
'vlib/orm/orm_result_test.v',
|
||||||
'vlib/orm/orm_custom_operators_test.v',
|
'vlib/orm/orm_custom_operators_test.v',
|
||||||
|
'vlib/orm/orm_fk_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',
|
||||||
'vlib/v/tests/orm_joined_tables_select_test.v',
|
'vlib/v/tests/orm_joined_tables_select_test.v',
|
||||||
|
|
57
vlib/orm/orm_fk_test.v
Normal file
57
vlib/orm/orm_fk_test.v
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
import db.sqlite
|
||||||
|
|
||||||
|
struct Person {
|
||||||
|
id int [primary; sql: serial]
|
||||||
|
age int
|
||||||
|
brothers []Brother [fkey: 'person_id']
|
||||||
|
sisters []Sister [fkey: 'person_id']
|
||||||
|
field_after_fkeys string
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Brother {
|
||||||
|
id int [primary; sql: serial]
|
||||||
|
person_id int
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Sister {
|
||||||
|
id int [primary; sql: serial]
|
||||||
|
person_id int
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_field_after_fkeys() {
|
||||||
|
db := sqlite.connect(':memory:') or { panic(err) }
|
||||||
|
|
||||||
|
sql db {
|
||||||
|
create table Brother
|
||||||
|
create table Sister
|
||||||
|
create table Person
|
||||||
|
}!
|
||||||
|
|
||||||
|
person := Person{
|
||||||
|
age: 21
|
||||||
|
brothers: [Brother{
|
||||||
|
name: 'aaa'
|
||||||
|
}, Brother{
|
||||||
|
name: 'bbb'
|
||||||
|
}]
|
||||||
|
sisters: [Sister{
|
||||||
|
name: 'ccc'
|
||||||
|
}, Sister{
|
||||||
|
name: 'ddd'
|
||||||
|
}]
|
||||||
|
field_after_fkeys: 'eee'
|
||||||
|
}
|
||||||
|
|
||||||
|
sql db {
|
||||||
|
insert person into Person
|
||||||
|
}!
|
||||||
|
|
||||||
|
persons := sql db {
|
||||||
|
select from Person
|
||||||
|
}!
|
||||||
|
|
||||||
|
assert persons[0].age == 21
|
||||||
|
assert persons[0].field_after_fkeys == 'eee'
|
||||||
|
}
|
|
@ -876,8 +876,10 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, le
|
||||||
|
|
||||||
g.writeln('if (${select_unwrapped_result_var_name}.len > 0) {')
|
g.writeln('if (${select_unwrapped_result_var_name}.len > 0) {')
|
||||||
g.indent++
|
g.indent++
|
||||||
for i, field in fields {
|
|
||||||
array_get_call_code := '(*(orm__Primitive*) array_get((*(Array_orm__Primitive*) array_get(${select_unwrapped_result_var_name}, ${idx})), ${i}))'
|
mut selected_fields_idx := 0
|
||||||
|
for field in fields {
|
||||||
|
array_get_call_code := '(*(orm__Primitive*) array_get((*(Array_orm__Primitive*) array_get(${select_unwrapped_result_var_name}, ${idx})), ${selected_fields_idx}))'
|
||||||
sym := g.table.sym(field.typ)
|
sym := g.table.sym(field.typ)
|
||||||
if sym.kind == .struct_ && sym.name != 'time.Time' {
|
if sym.kind == .struct_ && sym.name != 'time.Time' {
|
||||||
mut sub := node.sub_structs[int(field.typ)]
|
mut sub := node.sub_structs[int(field.typ)]
|
||||||
|
@ -897,6 +899,7 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, le
|
||||||
|
|
||||||
g.write_orm_select(sub, connection_var_name, '${tmp}.${c_name(field.name)} = ',
|
g.write_orm_select(sub, connection_var_name, '${tmp}.${c_name(field.name)} = ',
|
||||||
or_expr)
|
or_expr)
|
||||||
|
selected_fields_idx++
|
||||||
} else if sym.kind == .array {
|
} else if sym.kind == .array {
|
||||||
mut fkey := ''
|
mut fkey := ''
|
||||||
// TODO: move to the ORM checker
|
// TODO: move to the ORM checker
|
||||||
|
@ -956,6 +959,7 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, le
|
||||||
} else {
|
} else {
|
||||||
mut typ := sym.cname
|
mut typ := sym.cname
|
||||||
g.writeln('${tmp}.${c_name(field.name)} = *(${array_get_call_code}._${typ});')
|
g.writeln('${tmp}.${c_name(field.name)} = *(${array_get_call_code}._${typ});')
|
||||||
|
selected_fields_idx++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.indent--
|
g.indent--
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue