diff --git a/CHANGELOG.md b/CHANGELOG.md index 755665cb59..8c209d8daf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - #3779, Always log the schema cache load time - @steve-chavez + - #3706, Fix insert with `missing=default` uses default value of domain instead of column - @taimoorzaeem ## [12.2.3] - 2024-08-01 diff --git a/src/PostgREST/SchemaCache.hs b/src/PostgREST/SchemaCache.hs index e373727d2e..1631548dea 100644 --- a/src/PostgREST/SchemaCache.hs +++ b/src/PostgREST/SchemaCache.hs @@ -818,20 +818,20 @@ tablesSqlQuery pgVer = columnDefault -- typbasetype and typdefaultbin handles `CREATE DOMAIN .. DEFAULT val`, attidentity/attgenerated handles generated columns, pg_get_expr gets the default of a column | pgVer >= pgVersion120 = [q| CASE - WHEN t.typbasetype != 0 THEN pg_get_expr(t.typdefaultbin, 0) + WHEN (t.typbasetype != 0) AND (ad.adbin IS NULL) THEN pg_get_expr(t.typdefaultbin, 0) WHEN a.attidentity = 'd' THEN format('nextval(%s)', quote_literal(seqsch.nspname || '.' || seqclass.relname)) WHEN a.attgenerated = 's' THEN null ELSE pg_get_expr(ad.adbin, ad.adrelid)::text END|] | pgVer >= pgVersion100 = [q| CASE - WHEN t.typbasetype != 0 THEN pg_get_expr(t.typdefaultbin, 0) + WHEN (t.typbasetype != 0) AND (ad.adbin IS NULL) THEN pg_get_expr(t.typdefaultbin, 0) WHEN a.attidentity = 'd' THEN format('nextval(%s)', quote_literal(seqsch.nspname || '.' || seqclass.relname)) ELSE pg_get_expr(ad.adbin, ad.adrelid)::text END|] | otherwise = [q| CASE - WHEN t.typbasetype != 0 THEN pg_get_expr(t.typdefaultbin, 0) + WHEN (t.typbasetype != 0) AND (ad.adbin IS NULL) THEN pg_get_expr(t.typdefaultbin, 0) ELSE pg_get_expr(ad.adbin, ad.adrelid)::text END|] diff --git a/test/spec/Feature/Query/InsertSpec.hs b/test/spec/Feature/Query/InsertSpec.hs index 4bf15d8985..2cae964a08 100644 --- a/test/spec/Feature/Query/InsertSpec.hs +++ b/test/spec/Feature/Query/InsertSpec.hs @@ -579,6 +579,15 @@ spec actualPgVersion = do , matchHeaders = ["Preference-Applied" <:> "missing=default, return=representation"] } + it "inserts a COLUMN default before a DOMAIN default with missing=default" $ + request methodPost "/evil_friends_with_column_default?columns=id,name" [("Prefer", "return=representation"), ("Prefer", "missing=default")] + [json| { "name": "Demon" } |] + `shouldRespondWith` + [json| [{"id": 420, "name": "Demon"}] |] + { matchStatus = 201 + , matchHeaders = ["Preference-Applied" <:> "missing=default, return=representation"] + } + it "inserts json that has duplicate keys" $ do request methodPost "/tbl_w_json" [("Prefer", "return=representation")] [json| { "data": { "a": 1, "a": 2 }, "id": 3 } |] diff --git a/test/spec/fixtures/schema.sql b/test/spec/fixtures/schema.sql index 1b7e8dff23..25e699277a 100644 --- a/test/spec/fixtures/schema.sql +++ b/test/spec/fixtures/schema.sql @@ -3319,6 +3319,11 @@ create table evil_friends( , name text ); +create table evil_friends_with_column_default( + id devil_int default 420 +, name text +); + create table bets ( id int , data_json json