diff --git a/src/PostgREST/DbStructure.hs b/src/PostgREST/DbStructure.hs index 8e0230bde..81a528757 100644 --- a/src/PostgREST/DbStructure.hs +++ b/src/PostgREST/DbStructure.hs @@ -19,7 +19,7 @@ import qualified Data.HashMap.Strict as M import Data.List (elemIndex) import Data.Maybe (fromJust) import Data.Text (split, strip, - breakOn, dropAround) + breakOn, dropAround, splitOn) import qualified Data.Text as T import qualified Hasql.Session as H import PostgREST.Types @@ -120,11 +120,12 @@ decodeProcs = addName pd = (pdName pd, pd) parseArgs :: Text -> [PgArg] - parseArgs = mapMaybe (parseArg . strip) . split (==',') + parseArgs = mapMaybe parseArg . filter (not . isPrefixOf "OUT" . toS) . map strip . split (==',') parseArg :: Text -> Maybe PgArg parseArg a = - let (body, def) = breakOn " DEFAULT " a + let arg = lastDef "" $ splitOn "INOUT " a + (body, def) = breakOn " DEFAULT " arg (name, typ) = breakOn " " body in if T.null typ then Nothing diff --git a/test/Feature/StructureSpec.hs b/test/Feature/StructureSpec.hs index c6b52c55e..26ab0ef9f 100644 --- a/test/Feature/StructureSpec.hs +++ b/test/Feature/StructureSpec.hs @@ -200,6 +200,22 @@ spec = do liftIO $ funcTag `shouldBe` Just [aesonQQ|"(rpc) privileged_hello"|] + it "doesn't include OUT params of function as required parameters" $ do + r <- simpleBody <$> get "/" + let params = r ^? key "paths" . key "/rpc/many_out_params" + . key "post" . key "parameters" . nth 0 + . key "schema". key "required" + + liftIO $ params `shouldBe` Nothing + + it "includes INOUT params(with no DEFAULT) of function as required parameters" $ do + r <- simpleBody <$> get "/" + let params = r ^? key "paths" . key "/rpc/many_inout_params" + . key "post" . key "parameters" . nth 0 + . key "schema". key "required" + + liftIO $ params `shouldBe` Just [aesonQQ|["num", "str"]|] + describe "Allow header" $ do it "includes read/write verbs for writeable table" $ do diff --git a/test/fixtures/schema.sql b/test/fixtures/schema.sql index b47f5c333..a9a76f9ac 100755 --- a/test/fixtures/schema.sql +++ b/test/fixtures/schema.sql @@ -1272,6 +1272,14 @@ create table test.being_part ( being int not null references test.being(being), part int not null references test.part(part) ); + +create function test.many_out_params(OUT my_json pg_catalog.json, OUT num int, OUT str text) AS $$ + select '{"a": 1, "b": "two"}'::json, 3, 'four'::text; +$$ language sql; + +create function test.many_inout_params(INOUT num int, INOUT str text, INOUT b bool DEFAULT true) AS $$ + select num, str, b; +$$ language sql; -- -- PostgreSQL database dump complete --