diff --git a/vlib/sqlite/sqlite_test.v b/vlib/sqlite/sqlite_test.v index bf7032bd7b..2e93b8ac5c 100644 --- a/vlib/sqlite/sqlite_test.v +++ b/vlib/sqlite/sqlite_test.v @@ -1,5 +1,34 @@ import sqlite +type Connection = sqlite.DB + +struct User { +pub: + id int [primary; sql: serial] + name string +} + +type Content = []u8 | string + +struct Host { +pub: + db Connection +} + +fn (back Host) get_users() []User { + return [] +} + +fn create_host(db Connection) Host { + sql db { + create table User + } + + return Host{ + db: db + } +} + fn test_sqlite() { $if !linux { return @@ -56,3 +85,8 @@ fn test_can_access_sqlite_result_consts() { assert sqlite.sqlite_row == 100 assert sqlite.sqlite_done == 101 } + +fn test_alias_db() { + create_host(sqlite.connect(':memory:')!) + assert true +} diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 8c97e9cc47..597df7dae7 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -735,6 +735,12 @@ pub fn (t &Table) get_type_name(typ Type) string { return sym.name } +[inline] +pub fn (t &Table) get_final_type_name(typ Type) string { + sym := t.final_sym(typ) + return sym.name +} + [inline] pub fn (t &Table) unalias_num_type(typ Type) Type { sym := t.sym(typ) diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index 5e067c14a7..d336ee6c96 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -239,6 +239,8 @@ fn (mut g Gen) gen_str_for_result(typ ast.Type, styp string, str_fn_name string) fn (mut g Gen) gen_str_for_alias(info ast.Alias, styp string, str_fn_name string) { parent_str_fn_name := g.get_str_fn(info.parent_type) + _, str_method_expects_ptr, _ := g.table.sym(info.parent_type).str_method_info() + $if trace_autostr ? { eprintln('> gen_str_for_alias: ${parent_str_fn_name} | ${styp} | ${str_fn_name}') } @@ -248,7 +250,11 @@ fn (mut g Gen) gen_str_for_alias(info ast.Alias, styp string, str_fn_name string g.definitions.writeln('static string indent_${str_fn_name}(${styp} it, int indent_count); // auto') g.auto_str_funcs.writeln('static string indent_${str_fn_name}(${styp} it, int indent_count) {') g.auto_str_funcs.writeln('\tstring indents = string_repeat(_SLIT(" "), indent_count);') - g.auto_str_funcs.writeln('\tstring tmp_ds = ${parent_str_fn_name}(it);') + if str_method_expects_ptr { + g.auto_str_funcs.writeln('\tstring tmp_ds = ${parent_str_fn_name}(&it);') + } else { + g.auto_str_funcs.writeln('\tstring tmp_ds = ${parent_str_fn_name}(it);') + } g.auto_str_funcs.writeln('\tstring res = str_intp(3, _MOV((StrIntpData[]){ {_SLIT0, ${c.si_s_code}, {.d_s = indents }}, {_SLIT("${clean_type_v_type_name}("), ${c.si_s_code}, {.d_s = tmp_ds }}, diff --git a/vlib/v/gen/c/sql.v b/vlib/v/gen/c/sql.v index e07e3679fc..2f6e34c78e 100644 --- a/vlib/v/gen/c/sql.v +++ b/vlib/v/gen/c/sql.v @@ -835,11 +835,11 @@ fn (mut g Gen) parse_db_type(expr ast.Expr) SqlType { match expr { ast.Ident { if expr.info is ast.IdentVar { - return g.parse_db_from_type_string(g.table.get_type_name(expr.info.typ)) + return g.parse_db_from_type_string(g.table.get_final_type_name(expr.info.typ)) } } ast.SelectorExpr { - return g.parse_db_from_type_string(g.table.get_type_name(expr.typ)) + return g.parse_db_from_type_string(g.table.get_final_type_name(expr.typ)) } else { return .unknown