Fix #1273, don't ignore RPC arguments by default
* Add different error message for pg 9.4
This commit is contained in:
committed by
Steve Chávez
parent
033ee5a06e
commit
2044f77d49
@@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
- #1242, Fix embedding a view having a select in a where - @steve-chavez
|
- #1242, Fix embedding a view having a select in a where - @steve-chavez
|
||||||
- #1238, Fix PostgreSQL to OpenAPI type mappings for numeric and character types - @fpusch
|
- #1238, Fix PostgreSQL to OpenAPI type mappings for numeric and character types - @fpusch
|
||||||
- #1265, Fix query generated on bulk upsert with an empty array - @qu4tro
|
- #1265, Fix query generated on bulk upsert with an empty array - @qu4tro
|
||||||
|
- #1273, Fix RPC ignoring unknown arguments by default - @steve-chavez
|
||||||
|
|
||||||
## [5.2.0] - 2018-12-12
|
## [5.2.0] - 2018-12-12
|
||||||
|
|
||||||
|
|||||||
@@ -282,9 +282,8 @@ app dbStructure proc cols conf apiRequest =
|
|||||||
Left errorResponse -> return errorResponse
|
Left errorResponse -> return errorResponse
|
||||||
Right ((q, cq), bField) -> do
|
Right ((q, cq), bField) -> do
|
||||||
let singular = contentType == CTSingularJSON
|
let singular = contentType == CTSingularJSON
|
||||||
specifiedPgArgs = filter ((`S.member` cols) . pgaName) $ maybe [] pdArgs proc
|
|
||||||
row <- H.statement (toS $ pjRaw pJson) $
|
row <- H.statement (toS $ pjRaw pJson) $
|
||||||
callProc qi specifiedPgArgs returnsScalar q cq shouldCount
|
callProc qi (specifiedProcArgs cols proc) returnsScalar q cq shouldCount
|
||||||
singular (iPreferSingleObjectParameter apiRequest)
|
singular (iPreferSingleObjectParameter apiRequest)
|
||||||
(contentType == CTTextCSV)
|
(contentType == CTTextCSV)
|
||||||
(contentType == CTOctetStream) bField
|
(contentType == CTOctetStream) bField
|
||||||
|
|||||||
+15
-1
@@ -111,6 +111,17 @@ findProc qi payloadKeys paramsAsSingleObject allProcs =
|
|||||||
else payloadKeys `S.isSubsetOf` S.fromList (pgaName <$> pdArgs x))
|
else payloadKeys `S.isSubsetOf` S.fromList (pgaName <$> pdArgs x))
|
||||||
) <$> procs
|
) <$> procs
|
||||||
|
|
||||||
|
{-|
|
||||||
|
Search the procedure parameters by matching them with the specified keys.
|
||||||
|
If the key doesn't match a parameter, a parameter with a default type "text" is assumed.
|
||||||
|
-}
|
||||||
|
specifiedProcArgs :: S.Set FieldName -> Maybe ProcDescription -> [PgArg]
|
||||||
|
specifiedProcArgs keys proc =
|
||||||
|
let
|
||||||
|
args = maybe [] pdArgs proc
|
||||||
|
in
|
||||||
|
(\k -> fromMaybe (PgArg k "text" True) (find ((==) k . pgaName) args)) <$> S.toList keys
|
||||||
|
|
||||||
type Schema = Text
|
type Schema = Text
|
||||||
type TableName = Text
|
type TableName = Text
|
||||||
type SqlQuery = Text
|
type SqlQuery = Text
|
||||||
@@ -378,7 +389,10 @@ instance Ord PgVersion where
|
|||||||
|
|
||||||
-- | Tells the minimum PostgreSQL version required by this version of PostgREST
|
-- | Tells the minimum PostgreSQL version required by this version of PostgREST
|
||||||
minimumPgVersion :: PgVersion
|
minimumPgVersion :: PgVersion
|
||||||
minimumPgVersion = PgVersion 90400 "9.4"
|
minimumPgVersion = pgVersion94
|
||||||
|
|
||||||
|
pgVersion94 :: PgVersion
|
||||||
|
pgVersion94 = PgVersion 90400 "9.4"
|
||||||
|
|
||||||
pgVersion95 :: PgVersion
|
pgVersion95 :: PgVersion
|
||||||
pgVersion95 = PgVersion 90500 "9.5"
|
pgVersion95 = PgVersion 90500 "9.5"
|
||||||
|
|||||||
+19
-2
@@ -13,8 +13,10 @@ import Network.Wai (Application)
|
|||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
|
||||||
spec :: SpecWith Application
|
import PostgREST.Types (PgVersion, pgVersion95)
|
||||||
spec =
|
|
||||||
|
spec :: PgVersion -> SpecWith Application
|
||||||
|
spec actualPgVersion =
|
||||||
describe "remote procedure call" $ do
|
describe "remote procedure call" $ do
|
||||||
context "a proc that returns a set" $ do
|
context "a proc that returns a set" $ do
|
||||||
it "returns paginated results" $ do
|
it "returns paginated results" $ do
|
||||||
@@ -77,6 +79,21 @@ spec =
|
|||||||
it "should fail with 404 on unknown proc args" $ do
|
it "should fail with 404 on unknown proc args" $ do
|
||||||
get "/rpc/sayhello" `shouldRespondWith` 404
|
get "/rpc/sayhello" `shouldRespondWith` 404
|
||||||
get "/rpc/sayhello?any_arg=value" `shouldRespondWith` 404
|
get "/rpc/sayhello?any_arg=value" `shouldRespondWith` 404
|
||||||
|
it "should not ignore unknown args and fail with 404" $
|
||||||
|
get "/rpc/add_them?a=1&b=2&smthelse=blabla" `shouldRespondWith`
|
||||||
|
let
|
||||||
|
message :: Text
|
||||||
|
message
|
||||||
|
| actualPgVersion < pgVersion95 = "function test.add_them(a := integer, b := integer, smthelse := text) does not exist"
|
||||||
|
| otherwise = "function test.add_them(a => integer, b => integer, smthelse => text) does not exist"
|
||||||
|
in [json| {
|
||||||
|
"code": "42883",
|
||||||
|
"details": null,
|
||||||
|
"hint": "No function matches the given name and argument types. You might need to add explicit type casts.",
|
||||||
|
"message": #{message} } |]
|
||||||
|
{ matchStatus = 404
|
||||||
|
, matchHeaders = [matchContentTypeJson]
|
||||||
|
}
|
||||||
|
|
||||||
it "works when having uppercase identifiers" $ do
|
it "works when having uppercase identifiers" $ do
|
||||||
get "/rpc/quotedFunction?user=mscott&fullName=Michael Scott&SSN=401-32-XXXX" `shouldRespondWith`
|
get "/rpc/quotedFunction?user=mscott&fullName=Michael Scott&SSN=401-32-XXXX" `shouldRespondWith`
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ main = do
|
|||||||
, ("Feature.InsertSpec" , Feature.InsertSpec.spec actualPgVersion)
|
, ("Feature.InsertSpec" , Feature.InsertSpec.spec actualPgVersion)
|
||||||
, ("Feature.JsonOperatorSpec" , Feature.JsonOperatorSpec.spec actualPgVersion)
|
, ("Feature.JsonOperatorSpec" , Feature.JsonOperatorSpec.spec actualPgVersion)
|
||||||
, ("Feature.QuerySpec" , Feature.QuerySpec.spec)
|
, ("Feature.QuerySpec" , Feature.QuerySpec.spec)
|
||||||
, ("Feature.RpcSpec" , Feature.RpcSpec.spec)
|
, ("Feature.RpcSpec" , Feature.RpcSpec.spec actualPgVersion)
|
||||||
, ("Feature.RangeSpec" , Feature.RangeSpec.spec)
|
, ("Feature.RangeSpec" , Feature.RangeSpec.spec)
|
||||||
, ("Feature.SingularSpec" , Feature.SingularSpec.spec)
|
, ("Feature.SingularSpec" , Feature.SingularSpec.spec)
|
||||||
, ("Feature.StructureSpec" , Feature.StructureSpec.spec)
|
, ("Feature.StructureSpec" , Feature.StructureSpec.spec)
|
||||||
|
|||||||
Reference in New Issue
Block a user