diff --git a/CHANGELOG.md b/CHANGELOG.md index a0c484d35..6e35a7aae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,14 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #2771, Add `Server-Timing` header with JWT duration - @taimoorzaeem - #2698, Add config `jwt-cache-max-lifetime` and implement JWT caching - @taimoorzaeem - #2943, Add `handling=strict/lenient` for Prefer header - @taimoorzaeem + - #2983, Add more data to `Server-Timing` header - @develop7 + +### Fixed + - #2824, Fix range request with 0 rows and 0 offset return status 416 - @strengthless + - #3015, Fix unnecessary count() on RPC returning single - @steve-chavez ## [11.2.1] - 2023-10-03 - - #2983, Add more data to `Server-Timing` header - @develop7 ### Fixed diff --git a/src/PostgREST/Query/Statements.hs b/src/PostgREST/Query/Statements.hs index 634568fb9..b9d9c8f5b 100644 --- a/src/PostgREST/Query/Statements.hs +++ b/src/PostgREST/Query/Statements.hs @@ -29,7 +29,7 @@ import PostgREST.MediaType (MTPlanFormat (..), MediaType (..)) import PostgREST.Query.SqlFragment import PostgREST.SchemaCache.Routine (ResultAggregate (..), - Routine) + Routine, funcReturnsSingle) import Protolude @@ -121,7 +121,9 @@ prepareCall rout callProcQuery selectQuery countQuery countTotal mt rAgg = countCTEF <> "SELECT " <> countResultF <> " AS total_result_set, " <> - "pg_catalog.count(_postgrest_t) AS page_total, " <> + (if funcReturnsSingle rout + then "1" + else "pg_catalog.count(_postgrest_t)") <> " AS page_total, " <> aggF (Just rout) rAgg <> " AS body, " <> responseHeadersF <> " AS response_headers, " <> responseStatusF <> " AS response_status " <> diff --git a/src/PostgREST/SchemaCache/Routine.hs b/src/PostgREST/SchemaCache/Routine.hs index d4e681333..cc993fd80 100644 --- a/src/PostgREST/SchemaCache/Routine.hs +++ b/src/PostgREST/SchemaCache/Routine.hs @@ -14,6 +14,7 @@ module PostgREST.SchemaCache.Routine , funcReturnsVoid , funcTableName , funcReturnsCompositeAlias + , funcReturnsSingle , ResultAggregate(..) ) where @@ -99,6 +100,11 @@ data ResultAggregate | NoAgg deriving (Eq, Show) +funcReturnsSingle :: Routine -> Bool +funcReturnsSingle proc = case proc of + Function{pdReturnType = Single _} -> True + _ -> False + funcReturnsScalar :: Routine -> Bool funcReturnsScalar proc = case proc of Function{pdReturnType = Single (Scalar{})} -> True diff --git a/test/spec/Feature/Query/PlanSpec.hs b/test/spec/Feature/Query/PlanSpec.hs index f9a6562d0..2b14c9d22 100644 --- a/test/spec/Feature/Query/PlanSpec.hs +++ b/test/spec/Feature/Query/PlanSpec.hs @@ -383,7 +383,7 @@ spec actualPgVersion = do r <- request methodGet "/rpc/add_them?a=3&b=4" [planHdr] "" - liftIO $ planCost r `shouldSatisfy` (< 1.18) + liftIO $ planCost r `shouldSatisfy` (< 0.11) context "function inlining" $ do it "should inline a zero argument function(the function won't appear in the plan tree)" $ do