diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bdd3ba9b3..b6e98711d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #3727, Clarify "listening" logs - @steve-chavez - #3795, Clarify `Accept: vnd.pgrst.object` error message - @steve-chavez - #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 ### Changed diff --git a/src/PostgREST/SchemaCache.hs b/src/PostgREST/SchemaCache.hs index 61e5426459..5c17f64426 100644 --- a/src/PostgREST/SchemaCache.hs +++ b/src/PostgREST/SchemaCache.hs @@ -622,7 +622,7 @@ tablesSqlQuery = d.description AS description, -- typbasetype and typdefaultbin handles `CREATE DOMAIN .. DEFAULT val`, attidentity/attgenerated handles generated columns, pg_get_expr gets the default of a column 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(%L)', seq.objid::regclass) WHEN a.attgenerated = 's' THEN null ELSE pg_get_expr(ad.adbin, ad.adrelid)::text diff --git a/test/spec/Feature/Query/InsertSpec.hs b/test/spec/Feature/Query/InsertSpec.hs index 405ef62f9f..0f6a1b6e7a 100644 --- a/test/spec/Feature/Query/InsertSpec.hs +++ b/test/spec/Feature/Query/InsertSpec.hs @@ -572,6 +572,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 8c0ea89344..c29a68bee1 100644 --- a/test/spec/fixtures/schema.sql +++ b/test/spec/fixtures/schema.sql @@ -3274,6 +3274,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