From 4118ee464d0c8849b18e6108f77f2871b29430e4 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 5 Apr 2026 02:17:37 +0300 Subject: [PATCH] all: minor fixes --- .github/workflows/tools_ci.yml | 2 +- cmd/tools/vwatch_test.v | 2 +- vlib/db/mssql/stmt_handle.c.v | 8 ++++---- vlib/db/mysql/mysql_orm_test.v | 14 ++++++++------ vlib/db/pg/pg_test.v | 2 +- vlib/orm/orm.v | 11 +++++++++-- vlib/v/checker/check_types.v | 5 +++++ 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/.github/workflows/tools_ci.yml b/.github/workflows/tools_ci.yml index de0b56cc5..afaba8d25 100644 --- a/.github/workflows/tools_ci.yml +++ b/.github/workflows/tools_ci.yml @@ -52,7 +52,7 @@ jobs: if [[ ${{ matrix.cc }} == "clang" ]]; then cmd="./v -silent -cc clang -cflags -fsanitize=undefined test-self -ubsan-compiler cmd" echo "$cmd" && $cmd - cmd="./v -silent -cc clang -cflags -fsanitize=memory test-self -msan-compiler cmd" + cmd="./v -silent -gc none -cc clang -cflags -fsanitize=memory test-self -msan-compiler cmd" echo "$cmd" && $cmd else cmd="./v -silent -cc gcc -cflags -fsanitize=thread test-self cmd" diff --git a/cmd/tools/vwatch_test.v b/cmd/tools/vwatch_test.v index 6ab0862c6..649c11b0d 100644 --- a/cmd/tools/vwatch_test.v +++ b/cmd/tools/vwatch_test.v @@ -29,7 +29,7 @@ fn test_watch_keeps_backend_flag_intact() { process.set_args(['watch', '-backend', 'js_browser', '-output', output_path, source_path]) process.run() - for _ in 0 .. 80 { + for _ in 0 .. 300 { if os.exists(output_path) || !process.is_alive() { break } diff --git a/vlib/db/mssql/stmt_handle.c.v b/vlib/db/mssql/stmt_handle.c.v index 9d0c04a13..0765410e5 100644 --- a/vlib/db/mssql/stmt_handle.c.v +++ b/vlib/db/mssql/stmt_handle.c.v @@ -11,8 +11,8 @@ mut: column_count int = -1 // columns buffers [][]char - // indicators for each column - indicators []C.SQLLEN + // indicators for each column (i64 is the same size as C.SQLLEN on 64-bit) + indicators []i64 } // new_hstmt constructs a new statement handle @@ -69,7 +69,7 @@ fn (mut h HStmt) prepare_read() ! { h.column_count = column_count // remember the count because read will need it h.buffers = [][]char{len: h.column_count} - h.indicators = []C.SQLLEN{len: h.column_count} + h.indicators = []i64{len: h.column_count} for i := 0; i < h.column_count; i++ { i_col := C.SQLUSMALLINT(i + 1) // col number starts with 1 @@ -86,7 +86,7 @@ fn (mut h HStmt) prepare_read() ! { // bind the buffer retcode = C.SQLBindCol(h.hstmt, C.SQLUSMALLINT(i_col), C.SQLSMALLINT(C.SQL_C_CHAR), - C.SQLPOINTER(&buff[0]), allocate_size, &h.indicators[i]) + C.SQLPOINTER(&buff[0]), allocate_size, unsafe { &C.SQLLEN(&h.indicators[i]) }) check_error(retcode, 'SQLBindCol()', C.SQLHANDLE(h.hstmt), C.SQLSMALLINT(C.SQL_HANDLE_STMT))! // record the buffer in HStmt diff --git a/vlib/db/mysql/mysql_orm_test.v b/vlib/db/mysql/mysql_orm_test.v index 7c0e77f29..707470e0a 100644 --- a/vlib/db/mysql/mysql_orm_test.v +++ b/vlib/db/mysql/mysql_orm_test.v @@ -137,9 +137,10 @@ fn test_mysql_orm() { }, orm.QueryData{}, orm.QueryData{}) or { panic(err) } assert sum_res.len == 1 assert sum_res[0].len == 1 - assert sum_res[0][0] is int - if sum_res[0][0] is int { - assert sum_res[0][0] == 101 + sum_val := sum_res[0][0] + assert sum_val is int + if sum_val is int { + assert sum_val == 101 } avg_res := db.select(orm.SelectConfig{ @@ -151,9 +152,10 @@ fn test_mysql_orm() { }, orm.QueryData{}, orm.QueryData{}) or { panic(err) } assert avg_res.len == 1 assert avg_res[0].len == 1 - assert avg_res[0][0] is f64 - if avg_res[0][0] is f64 { - assert avg_res[0][0] == 101.0 + avg_val := avg_res[0][0] + assert avg_val is f64 + if avg_val is f64 { + assert avg_val == 101.0 } /** test orm sql type diff --git a/vlib/db/pg/pg_test.v b/vlib/db/pg/pg_test.v index 5563b0a57..ce445b00d 100644 --- a/vlib/db/pg/pg_test.v +++ b/vlib/db/pg/pg_test.v @@ -58,7 +58,7 @@ fn test_transaction() { return } - db := pg.connect(pg.Config{ user: 'postgres', password: '12345678', dbname: 'postgres' })! + mut db := pg.connect(pg.Config{ user: 'postgres', password: '12345678', dbname: 'postgres' })! defer { db.close() or {} } diff --git a/vlib/orm/orm.v b/vlib/orm/orm.v index c3235cfde..772dea088 100644 --- a/vlib/orm/orm.v +++ b/vlib/orm/orm.v @@ -885,6 +885,7 @@ pub fn orm_table_gen(sql_dialect SQLDialect, table Table, q string, defaults boo continue } mut default_val := field.default_val + mut has_default := default_val != '' mut nullable := field.nullable mut is_unique := false mut is_skip := false @@ -936,6 +937,7 @@ pub fn orm_table_gen(sql_dialect SQLDialect, table Table, q string, defaults boo col_typ = attr.arg.str() } 'default' { + has_default = true if default_val == '' { default_val = attr.arg.str() } @@ -989,8 +991,13 @@ pub fn orm_table_gen(sql_dialect SQLDialect, table Table, q string, defaults boo return error('Unknown type (${field.typ}) for field ${field.name} in struct ${table.name}') } stmt = '${q}${field_name}${q} ${col_typ}' - if defaults && default_val != '' { - stmt += ' DEFAULT ${default_val}' + if defaults && has_default { + if default_val != '' { + stmt += ' DEFAULT ${default_val}' + } else { + // Handle @[default: ''] - explicitly set DEFAULT '' for the column + stmt += " DEFAULT ''" + } } if sql_dialect == .mysql && field_comment != '' { stmt += " COMMENT '${field_comment}'" diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index ff29a2102..ce417379d 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -242,6 +242,11 @@ fn (mut c Checker) check_expected_call_arg(got_ ast.Type, expected_ ast.Type, la if got.is_number() && expected.is_number() { return } + // allow pointer-to-number types to be used interchangeably, e.g. &int_literal as &int + if got_is_ptr && exp_is_ptr && got.nr_muls() == expected.nr_muls() + && got.deref().is_number() && expected.deref().is_number() { + return + } // allow bool & int to be used interchangeably for C functions if (got.idx() == ast.bool_type_idx && expected.idx() in [ast.int_type_idx, ast.int_literal_type_idx, ast.i32_type_idx]) -- 2.39.5