From cc7fa551fe2aafe2ca055c409f40498e62a70653 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 12:14:42 +0300 Subject: [PATCH] orm: postgresql backend: invalid syntax for inserting default values (fixes #18319) --- vlib/db/pg/orm.v | 4 ++-- vlib/db/pg/pg_orm_test.v | 30 ++++++++++++++++++++++++++++++ vlib/orm/orm.v | 2 +- vlib/orm/orm_fn_test.v | 16 ++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/vlib/db/pg/orm.v b/vlib/db/pg/orm.v index 104f13316..5f580cb5f 100644 --- a/vlib/db/pg/orm.v +++ b/vlib/db/pg/orm.v @@ -30,8 +30,8 @@ pub fn (db DB) select(config orm.SelectConfig, data orm.QueryData, where orm.Que // insert is used internally by V's ORM for processing `INSERT ` queries pub fn (db DB) insert(table orm.Table, data orm.QueryData) ! { - query, converted_data := orm.orm_stmt_gen(.default, table, '"', .insert, true, '$', - 1, data, orm.QueryData{}) + query, converted_data := orm.orm_stmt_gen(.pg, table, '"', .insert, true, '$', 1, + data, orm.QueryData{}) pg_stmt_worker(db, query, converted_data, orm.QueryData{})! } diff --git a/vlib/db/pg/pg_orm_test.v b/vlib/db/pg/pg_orm_test.v index 179df7019..10677415c 100644 --- a/vlib/db/pg/pg_orm_test.v +++ b/vlib/db/pg/pg_orm_test.v @@ -36,6 +36,11 @@ struct TestDefaultAttribute { created_at string @[default: 'CURRENT_TIMESTAMP'; sql_type: 'TIMESTAMP'] } +struct TestInsertDefaultValues { + id int @[primary; sql: serial] + example string @[default: ''] +} + @[comment: 'This is a table comment'] struct TestCommentAttribute { id string @[primary; sql: serial] @@ -244,6 +249,31 @@ fn test_pg_orm() { }! assert ['gen_random_uuid()', '', 'CURRENT_TIMESTAMP'] == information_schema_defaults_results + /** test inserting only default values + */ + sql db { + create table TestInsertDefaultValues + }! + + model_default_values := TestInsertDefaultValues{ + example: '' + } + + sql db { + insert model_default_values into TestInsertDefaultValues + }! + + inserted_default_values := sql db { + select from TestInsertDefaultValues + }! + + sql db { + drop table TestInsertDefaultValues + }! + + assert inserted_default_values.len == 1 + assert inserted_default_values[0].example == '' + /** test comment attribute */ sql db { diff --git a/vlib/orm/orm.v b/vlib/orm/orm.v index aa7bbcfdb..aad38c957 100644 --- a/vlib/orm/orm.v +++ b/vlib/orm/orm.v @@ -616,7 +616,7 @@ pub fn orm_stmt_gen(sql_dialect SQLDialect, table Table, q string, kind StmtKind are_values_empty := values.len == 0 - if sql_dialect == .sqlite && are_values_empty { + if sql_dialect in [.sqlite, .pg] && are_values_empty { str += 'DEFAULT VALUES' } else { str += '(' diff --git a/vlib/orm/orm_fn_test.v b/vlib/orm/orm_fn_test.v index 36021b5a8..f2b06fb8b 100644 --- a/vlib/orm/orm_fn_test.v +++ b/vlib/orm/orm_fn_test.v @@ -47,6 +47,22 @@ fn test_orm_stmt_gen_insert() { assert query == "INSERT INTO 'Test' ('test', 'a') VALUES (?0, ?1);" } +fn test_orm_stmt_gen_insert_default_values_pg() { + table := orm.Table{ + name: 'Test' + } + query, converted := orm.orm_stmt_gen(.pg, table, "'", .insert, true, '$', 1, orm.QueryData{ + fields: ['id', 'example'] + data: [orm.Primitive(0), orm.Primitive('')] + types: [] + kinds: [] + auto_fields: [0, 1] + }, orm.QueryData{}) + assert query == "INSERT INTO 'Test' DEFAULT VALUES;" + assert converted.fields.len == 0 + assert converted.data.len == 0 +} + fn test_orm_stmt_gen_delete() { table := orm.Table{ name: 'Test' -- 2.39.5