diff --git a/cmd/tools/vtest-self.v b/cmd/tools/vtest-self.v index 174adc45dd..c4275063b6 100644 --- a/cmd/tools/vtest-self.v +++ b/cmd/tools/vtest-self.v @@ -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', diff --git a/vlib/orm/orm_insert_reserved_name_test.v b/vlib/orm/orm_insert_reserved_name_test.v new file mode 100644 index 0000000000..8b42884ca1 --- /dev/null +++ b/vlib/orm/orm_insert_reserved_name_test.v @@ -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 +} diff --git a/vlib/v/gen/c/sql.v b/vlib/v/gen/c/sql.v index 5c0db9a0ac..9111b52314 100644 --- a/vlib/v/gen/c/sql.v +++ b/vlib/v/gen/c/sql.v @@ -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--