diff --git a/src/PostgREST/PgQuery.hs b/src/PostgREST/PgQuery.hs index c84c1fab3..c5cda4ede 100644 --- a/src/PostgREST/PgQuery.hs +++ b/src/PostgREST/PgQuery.hs @@ -192,6 +192,7 @@ wherePred table (col, predicate) = "like" -> unknownLiteral $ T.map star value "ilike" -> unknownLiteral $ T.map star value "in" -> "(" <> T.intercalate ", " (map unknownLiteral $ T.split (==',') value) <> ") " + "notin" -> "(" <> T.intercalate ", " (map unknownLiteral $ T.split (==',') value) <> ") " "@@" -> "to_tsquery(" <> unknownLiteral value <> ") " _ -> unknownLiteral value @@ -205,6 +206,7 @@ wherePred table (col, predicate) = "like"-> "like" "ilike"-> "ilike" "in" -> "in" + "notin" -> "not in" "is" -> "is" "isnot" -> "is not" "@@" -> "@@" diff --git a/test/Feature/InsertSpec.hs b/test/Feature/InsertSpec.hs index ea6badbb2..d047e70a9 100644 --- a/test/Feature/InsertSpec.hs +++ b/test/Feature/InsertSpec.hs @@ -89,7 +89,7 @@ spec = afterAll_ resetDb $ around withApp $ do it "fails with 400 and error" $ post "/simple_pk" "}{ x = 2" `shouldRespondWith` ResponseMatcher { - matchBody = Just [json| {"message":"Failed to parse JSON payload. Failed reading: satisfy"} |] + matchBody = Just [json| {"message":"Failed to parse JSON payload. Failed reading: not a valid json value"} |] , matchStatus = 400 , matchHeaders = [] } diff --git a/test/Feature/QuerySpec.hs b/test/Feature/QuerySpec.hs index f00d74fa0..ccebcf20d 100644 --- a/test/Feature/QuerySpec.hs +++ b/test/Feature/QuerySpec.hs @@ -45,6 +45,14 @@ spec = , matchHeaders = ["Content-Range" <:> "0-2/3"] } + it "matches items NOT IN" $ + get "/items?id=notin.2,4,6,7,8,9,10,11,12,13,14,15" + `shouldRespondWith` ResponseMatcher { + matchBody = Just [json| [{"id":1},{"id":3},{"id":5}] |] + , matchStatus = 200 + , matchHeaders = ["Content-Range" <:> "0-2/3"] + } + it "matches nulls in varchar and numeric fields alike" $ do get "/no_pk?a=is.null" `shouldRespondWith` [json| [{"a": null, "b": null}] |]