diff --git a/CHANGELOG.md b/CHANGELOG.md index 088c06d65..82b48097a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Ensure that Location header in 201 response is URL-encoded - @league - Fix garbage collector CPU leak - @ruslantalpa et al. - Return deleted items when return=representation header is sent - @ruslantalpa +- Use table default values for empty object inserts - @begriffs ## [0.3.1.1] - 2016-03-28 diff --git a/src/PostgREST/QueryBuilder.hs b/src/PostgREST/QueryBuilder.hs index 8d784252f..21bd41fe8 100644 --- a/src/PostgREST/QueryBuilder.hs +++ b/src/PostgREST/QueryBuilder.hs @@ -42,7 +42,7 @@ import qualified Data.HashMap.Strict as HM import Data.List (find) import Data.Monoid ((<>)) import Data.Text (Text, intercalate, unwords, replace, isInfixOf, toLower, split) -import qualified Data.Text as T (map, takeWhile) +import qualified Data.Text as T (map, takeWhile, null) import qualified Data.Text.Encoding as T import Data.String.Conversions (cs) import Control.Applicative ((<|>)) @@ -336,13 +336,17 @@ requestToQuery schema (DbRead (Node (Select colSelects tbls conditions ord range requestToQuery schema (DbMutate (Insert mainTbl (PayloadJSON (UniformObjects rows)))) = let qi = QualifiedIdentifier schema mainTbl cols = map pgFmtIdent $ fromMaybe [] (HM.keys <$> (rows V.!? 0)) - colsString = intercalate ", " cols in - unwords [ - "INSERT INTO ", fromQi qi, - " (" <> colsString <> ")" <> - " SELECT " <> colsString <> - " FROM json_populate_recordset(null::" , fromQi qi, ", $1)" - ] + colsString = intercalate ", " cols + insInto = unwords [ "INSERT INTO" , fromQi qi, + if T.null colsString then "" else "(" <> colsString <> ")" + ] + vals = if T.null colsString + then "DEFAULT VALUES" + else unwords [ + "SELECT", colsString, "FROM json_populate_recordset(null::" , fromQi qi, ", $1)" + ] in + insInto <> vals + requestToQuery schema (DbMutate (Update mainTbl (PayloadJSON (UniformObjects rows)) conditions)) = case rows V.!? 0 of Just obj -> diff --git a/test/Feature/InsertSpec.hs b/test/Feature/InsertSpec.hs index 3be0233d4..965c426c0 100644 --- a/test/Feature/InsertSpec.hs +++ b/test/Feature/InsertSpec.hs @@ -189,6 +189,14 @@ spec = do , matchHeaders = ["Location" <:> location] } + context "empty object" $ + it "successfully populates table with all-default columns" $ + post "/items" "{}" `shouldRespondWith` ResponseMatcher { + matchBody = Just "" + , matchStatus = 201 + , matchHeaders = [] + } + describe "CSV insert" $ do context "disparate csv types" $ diff --git a/test/fixtures/data.sql b/test/fixtures/data.sql index 4153b126b..59aa2c357 100644 --- a/test/fixtures/data.sql +++ b/test/fixtures/data.sql @@ -204,7 +204,7 @@ INSERT INTO items VALUES (15); -- Name: items_id_seq; Type: SEQUENCE SET; Schema: test; Owner: - -- -SELECT pg_catalog.setval('items_id_seq', 1, true); +SELECT pg_catalog.setval('items_id_seq', 15, true); --