1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

sql: fix wrong field name on generated code (#17684)

This commit is contained in:
Felipe Pena 2023-03-17 17:45:52 -03:00 committed by GitHub
parent 68955bb26c
commit 9e7aeec215
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 6 deletions

View File

@ -124,6 +124,7 @@ const (
'vlib/orm/orm_sql_or_blocks_test.v',
'vlib/orm/orm_create_and_drop_test.v',
'vlib/orm/orm_insert_test.v',
'vlib/orm/orm_insert_reserved_name_test.v',
'vlib/orm/orm_fn_calls_test.v',
'vlib/orm/orm_last_id_test.v',
'vlib/orm/orm_string_interpolation_in_where_test.v',
@ -155,6 +156,7 @@ const (
'vlib/net/websocket/websocket_test.v',
'vlib/orm/orm_create_and_drop_test.v',
'vlib/orm/orm_insert_test.v',
'vlib/orm/orm_insert_reserved_name_test.v',
'vlib/v/tests/websocket_logger_interface_should_compile_test.v',
'vlib/v/tests/orm_sub_array_struct_test.v',
'vlib/v/tests/orm_handle_error_for_select_from_not_created_table_test.v',
@ -163,6 +165,7 @@ const (
'do_not_remove',
'vlib/orm/orm_create_and_drop_test.v',
'vlib/orm/orm_insert_test.v',
'vlib/orm/orm_insert_reserved_name_test.v',
'vlib/v/tests/orm_sub_array_struct_test.v',
'vlib/v/tests/orm_handle_error_for_select_from_not_created_table_test.v',
]
@ -196,6 +199,7 @@ const (
'vlib/orm/orm_sql_or_blocks_test.v',
'vlib/orm/orm_create_and_drop_test.v',
'vlib/orm/orm_insert_test.v',
'vlib/orm/orm_insert_reserved_name_test.v',
'vlib/orm/orm_fn_calls_test.v',
'vlib/orm/orm_last_id_test.v',
'vlib/orm/orm_string_interpolation_in_where_test.v',

View File

@ -0,0 +1,33 @@
import db.sqlite
[table: 'bad_table']
struct Bad {
id int [primary; sql: serial]
link string
}
fn test_insert_with_reserved_name() {
db := sqlite.connect(':memory:') or { panic(err) }
bad := Bad{
link: 'test'
}
sql db {
create table Bad
}
sql db {
insert bad into Bad
}
sql db {
insert bad into Bad
insert bad into Bad
insert bad into Bad
}
rows := sql db {
select from Bad
}
assert rows.len == 4
}

View File

@ -200,7 +200,7 @@ fn (mut g Gen) sql_insert(node ast.SqlStmtLine, expr string, table_name string,
typ = 'time'
}
g.write('orm__${typ}_to_primitive(${node.object_var_name}${member_access_type}${f.name}),')
g.write('orm__${typ}_to_primitive(${node.object_var_name}${member_access_type}${c_name(f.name)}),')
}
g.write('})')
} else {
@ -216,13 +216,14 @@ fn (mut g Gen) sql_insert(node ast.SqlStmtLine, expr string, table_name string,
mut id_name := g.new_tmp_var()
g.writeln('orm__Primitive ${id_name} = orm__int_to_primitive(orm__Connection_name_table[${expr}._typ]._method_last_id(${expr}._object));')
for i, mut arr in arrs {
c_field_name := c_name(field_names[i])
idx := g.new_tmp_var()
g.writeln('for (int ${idx} = 0; ${idx} < ${arr.object_var_name}${member_access_type}${field_names[i]}.len; ${idx}++) {')
g.writeln('for (int ${idx} = 0; ${idx} < ${arr.object_var_name}${member_access_type}${c_field_name}.len; ${idx}++) {')
last_ids := g.new_tmp_var()
res_ := g.new_tmp_var()
tmp_var := g.new_tmp_var()
ctyp := g.typ(arr.table_expr.typ)
g.writeln('${ctyp} ${tmp_var} = (*(${ctyp}*)array_get(${arr.object_var_name}${member_access_type}${field_names[i]}, ${idx}));')
g.writeln('${ctyp} ${tmp_var} = (*(${ctyp}*)array_get(${arr.object_var_name}${member_access_type}${c_field_name}, ${idx}));')
arr.object_var_name = tmp_var
mut fff := []ast.StructField{}
for f in arr.fields {
@ -723,7 +724,7 @@ fn (mut g Gen) sql_select(node ast.SqlExpr, expr string, left string, or_expr as
where_expr.right = ident
sub.where_expr = where_expr
g.sql_select(sub, expr, '${tmp}.${field.name} = ', or_expr)
g.sql_select(sub, expr, '${tmp}.${c_name(field.name)} = ', or_expr)
} else if sym.kind == .array {
mut fkey := ''
for attr in field.attrs {
@ -775,10 +776,10 @@ fn (mut g Gen) sql_select(node ast.SqlExpr, expr string, left string, or_expr as
where_expr: where_expr
}
g.sql_select(arr, expr, '${tmp}.${field.name} = ', or_expr)
g.sql_select(arr, expr, '${tmp}.${c_name(field.name)} = ', or_expr)
} else {
mut typ := sym.cname
g.writeln('${tmp}.${field.name} = *(${sel}._${typ});')
g.writeln('${tmp}.${c_name(field.name)} = *(${sel}._${typ});')
}
}
g.indent--