add: config db-timezone-enabled for optional querying of timezones
To avoid repeated querying of `pg_timezone_names` every time schema cache is reset, `Prefer: timezone` can be disabled by setting `db-timezone-enabled = false`. Signed-off-by: Taimoor Zaeem <taimoorzaeem@gmail.com>
This commit is contained in:
committed by
Steve Chavez
parent
bd5de884fa
commit
d6c338d588
@@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. From versio
|
|||||||
+ Removed unnecessary double count when building the `Content-Range`.
|
+ Removed unnecessary double count when building the `Content-Range`.
|
||||||
- Add config `client-error-verbosity` to customize error verbosity by @taimoorzaeem in #4088, #3980, #3824
|
- Add config `client-error-verbosity` to customize error verbosity by @taimoorzaeem in #4088, #3980, #3824
|
||||||
- Add `Vary` header to responses by @develop7 in #4609
|
- Add `Vary` header to responses by @develop7 in #4609
|
||||||
|
- Add config `db-timezone-enabled` for optional querying of timezones by @taimoorzaeem in #4751
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|||||||
@@ -117,6 +117,10 @@ However, with ``handling=strict``, an invalid time zone preference will throw an
|
|||||||
|
|
||||||
HTTP/1.1 400 Bad Request
|
HTTP/1.1 400 Bad Request
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This feature requires querying `pg_timezone_names <https://www.postgresql.org/docs/current/view-pg-timezone-names.html>`_ during :ref:`schema_cache` load. If this is not desired, you can disable the feature with :ref:`db-timezone-enabled`.
|
||||||
|
|
||||||
.. _prefer_return:
|
.. _prefer_return:
|
||||||
|
|
||||||
Return Representation
|
Return Representation
|
||||||
|
|||||||
@@ -540,6 +540,21 @@ db-schemas
|
|||||||
|
|
||||||
The list of database schemas to expose to clients. See :ref:`schemas`.
|
The list of database schemas to expose to clients. See :ref:`schemas`.
|
||||||
|
|
||||||
|
.. _db-timezone-enabled:
|
||||||
|
|
||||||
|
db-timezone-enabled
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
=============== =================================
|
||||||
|
**Type** Boolean
|
||||||
|
**Default** True
|
||||||
|
**Reloadable** Y
|
||||||
|
**Environment** PGRST_DB_TIMEZONE_ENABLED
|
||||||
|
**In-Database** pgrst.db_timezone_enabled
|
||||||
|
=============== =================================
|
||||||
|
|
||||||
|
Enables the use of :ref:`prefer_timezone` preference header. Disabled when set to ``false``.
|
||||||
|
|
||||||
.. _db-tx-end:
|
.. _db-tx-end:
|
||||||
|
|
||||||
db-tx-end
|
db-tx-end
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ data AppConfig = AppConfig
|
|||||||
, configDbSchemas :: NonEmpty Text
|
, configDbSchemas :: NonEmpty Text
|
||||||
, configDbConfig :: Bool
|
, configDbConfig :: Bool
|
||||||
, configDbPreConfig :: Maybe QualifiedIdentifier
|
, configDbPreConfig :: Maybe QualifiedIdentifier
|
||||||
|
, configDbTimezoneEnabled :: Bool
|
||||||
, configDbTxAllowOverride :: Bool
|
, configDbTxAllowOverride :: Bool
|
||||||
, configDbTxRollbackAll :: Bool
|
, configDbTxRollbackAll :: Bool
|
||||||
, configDbUri :: Text
|
, configDbUri :: Text
|
||||||
@@ -181,6 +182,7 @@ toText conf =
|
|||||||
,("db-schemas", q . T.intercalate "," . toList . configDbSchemas)
|
,("db-schemas", q . T.intercalate "," . toList . configDbSchemas)
|
||||||
,("db-config", T.toLower . show . configDbConfig)
|
,("db-config", T.toLower . show . configDbConfig)
|
||||||
,("db-pre-config", q . maybe mempty dumpQi . configDbPreConfig)
|
,("db-pre-config", q . maybe mempty dumpQi . configDbPreConfig)
|
||||||
|
,("db-timezone-enabled", T.toLower . show . configDbTimezoneEnabled)
|
||||||
,("db-tx-end", q . showTxEnd)
|
,("db-tx-end", q . showTxEnd)
|
||||||
,("db-uri", q . configDbUri)
|
,("db-uri", q . configDbUri)
|
||||||
,("jwt-aud", q . fromMaybe mempty . configJwtAudience)
|
,("jwt-aud", q . fromMaybe mempty . configJwtAudience)
|
||||||
@@ -290,6 +292,7 @@ parser optPath env dbSettings roleSettings roleIsolationLvl =
|
|||||||
<*> parseDbSchemas "db-schemas" "db-schema"
|
<*> parseDbSchemas "db-schemas" "db-schema"
|
||||||
<*> (fromMaybe True <$> optBool "db-config")
|
<*> (fromMaybe True <$> optBool "db-config")
|
||||||
<*> (fmap toQi <$> optString "db-pre-config")
|
<*> (fmap toQi <$> optString "db-pre-config")
|
||||||
|
<*> (fromMaybe True <$> optBool "db-timezone-enabled")
|
||||||
<*> parseTxEnd "db-tx-end" snd
|
<*> parseTxEnd "db-tx-end" snd
|
||||||
<*> parseTxEnd "db-tx-end" fst
|
<*> parseTxEnd "db-tx-end" fst
|
||||||
<*> (fromMaybe "postgresql://" <$> optString "db-uri")
|
<*> (fromMaybe "postgresql://" <$> optString "db-uri")
|
||||||
@@ -715,6 +718,9 @@ exampleConfigFile = S.unlines
|
|||||||
, "## The name of which database schema to expose to REST clients"
|
, "## The name of which database schema to expose to REST clients"
|
||||||
, "db-schemas = \"public\""
|
, "db-schemas = \"public\""
|
||||||
, ""
|
, ""
|
||||||
|
, "## Enable quering pg_timezone_names from db"
|
||||||
|
, "# db-timezone-enabled = true"
|
||||||
|
, ""
|
||||||
, "## How to terminate database transactions"
|
, "## How to terminate database transactions"
|
||||||
, "## Possible values are:"
|
, "## Possible values are:"
|
||||||
, "## commit (default)"
|
, "## commit (default)"
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ dbSettingsNames =
|
|||||||
,"db_prepared_statements"
|
,"db_prepared_statements"
|
||||||
,"db_root_spec"
|
,"db_root_spec"
|
||||||
,"db_schemas"
|
,"db_schemas"
|
||||||
|
,"db_timezone_enabled"
|
||||||
,"db_tx_end"
|
,"db_tx_end"
|
||||||
,"db_hoisted_tx_settings"
|
,"db_hoisted_tx_settings"
|
||||||
,"jwt_aud"
|
,"jwt_aud"
|
||||||
|
|||||||
@@ -159,7 +159,9 @@ querySchemaCache conf@AppConfig{..} = do
|
|||||||
cRels <- SQL.statement mempty $ allComputedRels prepared
|
cRels <- SQL.statement mempty $ allComputedRels prepared
|
||||||
reps <- SQL.statement conf $ dataRepresentations prepared
|
reps <- SQL.statement conf $ dataRepresentations prepared
|
||||||
mHdlers <- SQL.statement conf $ mediaHandlers prepared
|
mHdlers <- SQL.statement conf $ mediaHandlers prepared
|
||||||
tzones <- SQL.statement mempty $ timezones prepared
|
tzones <- if configDbTimezoneEnabled
|
||||||
|
then SQL.statement mempty $ timezones prepared
|
||||||
|
else pure S.empty
|
||||||
_ <-
|
_ <-
|
||||||
let sleepCall = SQL.Statement "select pg_sleep($1 / 1000.0)" (param HE.int4) HD.noResult prepared in
|
let sleepCall = SQL.Statement "select pg_sleep($1 / 1000.0)" (param HE.int4) HD.noResult prepared in
|
||||||
for_ configInternalSCQuerySleep (`SQL.statement` sleepCall) -- only used for testing
|
for_ configInternalSCQuerySleep (`SQL.statement` sleepCall) -- only used for testing
|
||||||
@@ -1109,7 +1111,13 @@ decodeMediaHandlers =
|
|||||||
timezones :: Bool -> SQL.Statement () TimezoneNames
|
timezones :: Bool -> SQL.Statement () TimezoneNames
|
||||||
timezones = SQL.Statement sql HE.noParams decodeTimezones
|
timezones = SQL.Statement sql HE.noParams decodeTimezones
|
||||||
where
|
where
|
||||||
sql = "SELECT name FROM pg_timezone_names"
|
sql = encodeUtf8 $ unlines
|
||||||
|
-- This CTE wrapper is only added for clarifying the query under pg_stat_statements
|
||||||
|
["WITH pgrst_timezones AS ("
|
||||||
|
, " SELECT name FROM pg_timezone_names"
|
||||||
|
, ")"
|
||||||
|
, "SELECT * FROM pgrst_timezones"
|
||||||
|
]
|
||||||
decodeTimezones :: HD.Result TimezoneNames
|
decodeTimezones :: HD.Result TimezoneNames
|
||||||
decodeTimezones = S.fromList <$> HD.rowList (column HD.text)
|
decodeTimezones = S.fromList <$> HD.rowList (column HD.text)
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = "open_alias"
|
|||||||
db-schemas = "provided_through_alias"
|
db-schemas = "provided_through_alias"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = false
|
db-config = false
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = "other_root"
|
|||||||
db-schemas = "test,other_tenant1,other_tenant2"
|
db-schemas = "test,other_tenant1,other_tenant2"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = "postgrest.other_preconf"
|
db-pre-config = "postgrest.other_preconf"
|
||||||
|
db-timezone-enabled = false
|
||||||
db-tx-end = "rollback-allow-override"
|
db-tx-end = "rollback-allow-override"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = "https://otherexample.org"
|
jwt-aud = "https://otherexample.org"
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = "root"
|
|||||||
db-schemas = "test,tenant1,tenant2"
|
db-schemas = "test,tenant1,tenant2"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = "postgrest.preconf"
|
db-pre-config = "postgrest.preconf"
|
||||||
|
db-timezone-enabled = false
|
||||||
db-tx-end = "commit-allow-override"
|
db-tx-end = "commit-allow-override"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = "https://example.org"
|
jwt-aud = "https://example.org"
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = "openapi_v3"
|
|||||||
db-schemas = "multi,tenant,setup"
|
db-schemas = "multi,tenant,setup"
|
||||||
db-config = false
|
db-config = false
|
||||||
db-pre-config = "postgrest.pre_config"
|
db-pre-config = "postgrest.pre_config"
|
||||||
|
db-timezone-enabled = false
|
||||||
db-tx-end = "rollback-allow-override"
|
db-tx-end = "rollback-allow-override"
|
||||||
db-uri = "tmp_db"
|
db-uri = "tmp_db"
|
||||||
jwt-aud = "https://postgrest.org"
|
jwt-aud = "https://postgrest.org"
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = ""
|
|||||||
db-schemas = "public"
|
db-schemas = "public"
|
||||||
db-config = true
|
db-config = true
|
||||||
db-pre-config = ""
|
db-pre-config = ""
|
||||||
|
db-timezone-enabled = true
|
||||||
db-tx-end = "commit"
|
db-tx-end = "commit"
|
||||||
db-uri = "postgresql://"
|
db-uri = "postgresql://"
|
||||||
jwt-aud = ""
|
jwt-aud = ""
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ PGRST_DB_ROOT_SPEC: openapi_v3
|
|||||||
PGRST_DB_SCHEMAS: multi, tenant,setup
|
PGRST_DB_SCHEMAS: multi, tenant,setup
|
||||||
PGRST_DB_CONFIG: false
|
PGRST_DB_CONFIG: false
|
||||||
PGRST_DB_PRE_CONFIG: "postgrest.pre_config"
|
PGRST_DB_PRE_CONFIG: "postgrest.pre_config"
|
||||||
|
PGRST_DB_TIMEZONE_ENABLED: false
|
||||||
PGRST_DB_TX_END: rollback-allow-override
|
PGRST_DB_TX_END: rollback-allow-override
|
||||||
PGRST_DB_URI: tmp_db
|
PGRST_DB_URI: tmp_db
|
||||||
PGRST_DB_USE_LEGACY_GUCS: false
|
PGRST_DB_USE_LEGACY_GUCS: false
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ db-root-spec = "openapi_v3"
|
|||||||
db-schemas = "multi, tenant,setup"
|
db-schemas = "multi, tenant,setup"
|
||||||
db-config = false
|
db-config = false
|
||||||
db-pre-config = "postgrest.pre_config"
|
db-pre-config = "postgrest.pre_config"
|
||||||
|
db-timezone-enabled = false
|
||||||
db-tx-end = "rollback-allow-override"
|
db-tx-end = "rollback-allow-override"
|
||||||
db-uri = "tmp_db"
|
db-uri = "tmp_db"
|
||||||
jwt-aud = "https://postgrest.org"
|
jwt-aud = "https://postgrest.org"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ ALTER ROLE db_config_authenticator SET pgrst.db_pre_request = 'test.custom_heade
|
|||||||
ALTER ROLE db_config_authenticator SET pgrst.db_prepared_statements = 'false';
|
ALTER ROLE db_config_authenticator SET pgrst.db_prepared_statements = 'false';
|
||||||
ALTER ROLE db_config_authenticator SET pgrst.db_root_spec = 'root';
|
ALTER ROLE db_config_authenticator SET pgrst.db_root_spec = 'root';
|
||||||
ALTER ROLE db_config_authenticator SET pgrst.db_schemas = 'test, tenant1, tenant2';
|
ALTER ROLE db_config_authenticator SET pgrst.db_schemas = 'test, tenant1, tenant2';
|
||||||
|
ALTER ROLE db_config_authenticator SET pgrst.db_timezone_enabled = 'false';
|
||||||
ALTER ROLE db_config_authenticator SET pgrst.db_tx_end = 'commit-allow-override';
|
ALTER ROLE db_config_authenticator SET pgrst.db_tx_end = 'commit-allow-override';
|
||||||
ALTER ROLE db_config_authenticator SET pgrst.jwt_aud = 'https://example.org';
|
ALTER ROLE db_config_authenticator SET pgrst.jwt_aud = 'https://example.org';
|
||||||
ALTER ROLE db_config_authenticator SET pgrst.jwt_cache_max_entries = '86400';
|
ALTER ROLE db_config_authenticator SET pgrst.jwt_cache_max_entries = '86400';
|
||||||
@@ -67,6 +68,7 @@ ALTER ROLE other_authenticator SET pgrst.db_pre_request = 'test.other_custom_hea
|
|||||||
ALTER ROLE other_authenticator SET pgrst.db_prepared_statements = 'false';
|
ALTER ROLE other_authenticator SET pgrst.db_prepared_statements = 'false';
|
||||||
ALTER ROLE other_authenticator SET pgrst.db_root_spec = 'other_root';
|
ALTER ROLE other_authenticator SET pgrst.db_root_spec = 'other_root';
|
||||||
ALTER ROLE other_authenticator SET pgrst.db_schemas = 'test, other_tenant1, other_tenant2';
|
ALTER ROLE other_authenticator SET pgrst.db_schemas = 'test, other_tenant1, other_tenant2';
|
||||||
|
ALTER ROLE other_authenticator SET pgrst.db_timezone_enabled = 'false';
|
||||||
ALTER ROLE other_authenticator SET pgrst.jwt_aud = 'https://otherexample.org';
|
ALTER ROLE other_authenticator SET pgrst.jwt_aud = 'https://otherexample.org';
|
||||||
ALTER ROLE other_authenticator SET pgrst.jwt_secret = 'ODERREALLYREALLYREALLYREALLYVERYSAFE';
|
ALTER ROLE other_authenticator SET pgrst.jwt_secret = 'ODERREALLYREALLYREALLYREALLYVERYSAFE';
|
||||||
ALTER ROLE other_authenticator SET pgrst.jwt_secret_is_base64 = 'false';
|
ALTER ROLE other_authenticator SET pgrst.jwt_secret_is_base64 = 'false';
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ baseCfg = let secret = encodeUtf8 "reallyreallyreallyreallyverysafe" in
|
|||||||
, configDbSchemas = fromList ["test"]
|
, configDbSchemas = fromList ["test"]
|
||||||
, configDbConfig = False
|
, configDbConfig = False
|
||||||
, configDbPreConfig = Nothing
|
, configDbPreConfig = Nothing
|
||||||
|
, configDbTimezoneEnabled = True
|
||||||
, configDbUri = "postgresql://"
|
, configDbUri = "postgresql://"
|
||||||
, configFilePath = Nothing
|
, configFilePath = Nothing
|
||||||
, configJWKS = rightToMaybe $ parseSecret secret
|
, configJWKS = rightToMaybe $ parseSecret secret
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import Test.Hspec.Wai.JSON
|
|||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
import SpecHelper
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith ((), Application)
|
enabledSpec :: SpecWith ((), Application)
|
||||||
spec =
|
enabledSpec =
|
||||||
describe "test Prefer: timezone" $ do
|
describe "test Prefer: timezone with db-timezone-enabled is true" $ do
|
||||||
context "test Prefer: timezone=America/Los_Angeles" $ do
|
context "test Prefer: timezone=America/Los_Angeles" $ do
|
||||||
it "should change timezone with handling=strict" $
|
it "should change timezone with handling=strict" $
|
||||||
request methodGet "/timestamps"
|
request methodGet "/timestamps"
|
||||||
@@ -60,3 +60,34 @@ spec =
|
|||||||
{ matchStatus = 200
|
{ matchStatus = 200
|
||||||
, matchHeaders = [matchContentTypeJson
|
, matchHeaders = [matchContentTypeJson
|
||||||
, "Preference-Applied" <:> "handling=lenient"]}
|
, "Preference-Applied" <:> "handling=lenient"]}
|
||||||
|
|
||||||
|
|
||||||
|
disabledSpec :: SpecWith ((), Application)
|
||||||
|
disabledSpec =
|
||||||
|
describe "test Prefer: timezone with db-timezone-enabled is false" $ do
|
||||||
|
context "test Prefer: timezone=America/Los_Angeles when timezone is disabled" $ do
|
||||||
|
it "should throw error with handling=strict" $
|
||||||
|
request methodGet "/timestamps"
|
||||||
|
[("Prefer", "handling=strict, timezone=America/Los_Angeles")]
|
||||||
|
""
|
||||||
|
`shouldRespondWith`
|
||||||
|
[json|{"code":"PGRST122","details":"Invalid preferences: timezone=America/Los_Angeles","hint":null,"message":"Invalid preferences given with handling=strict"}|]
|
||||||
|
{ matchStatus = 400 }
|
||||||
|
|
||||||
|
it "should return with default timezone without handling or with handling=lenient" $ do
|
||||||
|
request methodGet "/timestamps"
|
||||||
|
[("Prefer", "timezone=America/Los_Angeles")]
|
||||||
|
""
|
||||||
|
`shouldRespondWith`
|
||||||
|
[json|[{"t":"2023-10-18T12:37:59.611+00:00"}, {"t":"2023-10-18T14:37:59.611+00:00"}, {"t":"2023-10-18T16:37:59.611+00:00"}]|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [matchContentTypeJson]}
|
||||||
|
|
||||||
|
request methodGet "/timestamps"
|
||||||
|
[("Prefer", "handling=lenient, timezone=America/Los_Angeles")]
|
||||||
|
""
|
||||||
|
`shouldRespondWith`
|
||||||
|
[json|[{"t":"2023-10-18T12:37:59.611+00:00"}, {"t":"2023-10-18T14:37:59.611+00:00"}, {"t":"2023-10-18T16:37:59.611+00:00"}]|]
|
||||||
|
{ matchStatus = 200
|
||||||
|
, matchHeaders = [matchContentTypeJson
|
||||||
|
, "Preference-Applied" <:> "handling=lenient"]}
|
||||||
|
|||||||
+10
-1
@@ -128,6 +128,7 @@ main = do
|
|||||||
unicodeApp = appDbs testUnicodeCfg
|
unicodeApp = appDbs testUnicodeCfg
|
||||||
multipleSchemaApp = appDbs testMultipleSchemaCfg
|
multipleSchemaApp = appDbs testMultipleSchemaCfg
|
||||||
ignorePrivOpenApi = appDbs testIgnorePrivOpenApiCfg
|
ignorePrivOpenApi = appDbs testIgnorePrivOpenApiCfg
|
||||||
|
timezoneDisabled = appDbs testCfgTimezoneDisabled
|
||||||
|
|
||||||
|
|
||||||
let analyze :: IO ()
|
let analyze :: IO ()
|
||||||
@@ -157,7 +158,6 @@ main = do
|
|||||||
, ("Feature.Query.PlanSpec.disabledSpec" , Feature.Query.PlanSpec.disabledSpec)
|
, ("Feature.Query.PlanSpec.disabledSpec" , Feature.Query.PlanSpec.disabledSpec)
|
||||||
, ("Feature.Query.Preferences.HandlingSpec" , Feature.Query.Preferences.HandlingSpec.spec)
|
, ("Feature.Query.Preferences.HandlingSpec" , Feature.Query.Preferences.HandlingSpec.spec)
|
||||||
, ("Feature.Query.Preferences.MaxAffectedSpec" , Feature.Query.Preferences.MaxAffectedSpec.spec)
|
, ("Feature.Query.Preferences.MaxAffectedSpec" , Feature.Query.Preferences.MaxAffectedSpec.spec)
|
||||||
, ("Feature.Query.Preferences.TimezoneSpec" , Feature.Query.Preferences.TimezoneSpec.spec)
|
|
||||||
, ("Feature.Query.QuerySpec" , Feature.Query.QuerySpec.spec)
|
, ("Feature.Query.QuerySpec" , Feature.Query.QuerySpec.spec)
|
||||||
, ("Feature.Query.RawOutputTypesSpec" , Feature.Query.RawOutputTypesSpec.spec)
|
, ("Feature.Query.RawOutputTypesSpec" , Feature.Query.RawOutputTypesSpec.spec)
|
||||||
, ("Feature.Query.RelatedQueriesSpec" , Feature.Query.RelatedQueriesSpec.spec)
|
, ("Feature.Query.RelatedQueriesSpec" , Feature.Query.RelatedQueriesSpec.spec)
|
||||||
@@ -257,6 +257,15 @@ main = do
|
|||||||
parallel $ before withApp $
|
parallel $ before withApp $
|
||||||
describe "Feature.Query.AggregateFunctionsDisallowedSpec." Feature.Query.AggregateFunctionsSpec.disallowed
|
describe "Feature.Query.AggregateFunctionsDisallowedSpec." Feature.Query.AggregateFunctionsSpec.disallowed
|
||||||
|
|
||||||
|
-- this test runs with db-timezone-enabled = true
|
||||||
|
parallel $ before withApp $
|
||||||
|
describe "Feature.Query.Preferences.TimezoneSpec.enabledSpec" Feature.Query.Preferences.TimezoneSpec.enabledSpec
|
||||||
|
|
||||||
|
-- this test runs with db-timezone-enabled = false
|
||||||
|
parallel $ before timezoneDisabled $
|
||||||
|
describe "Feature.Query.Preferences.TimezoneSpec.disabledSpec" Feature.Query.Preferences.TimezoneSpec.disabledSpec
|
||||||
|
|
||||||
|
|
||||||
-- Note: the rollback tests can not run in parallel, because they test persistance and
|
-- Note: the rollback tests can not run in parallel, because they test persistance and
|
||||||
-- this results in race conditions
|
-- this results in race conditions
|
||||||
|
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ baseCfg = let secret = encodeUtf8 "reallyreallyreallyreallyverysafe" in
|
|||||||
, configDbSchemas = fromList ["test"]
|
, configDbSchemas = fromList ["test"]
|
||||||
, configDbConfig = False
|
, configDbConfig = False
|
||||||
, configDbPreConfig = Nothing
|
, configDbPreConfig = Nothing
|
||||||
|
, configDbTimezoneEnabled = True
|
||||||
, configDbUri = "postgresql://"
|
, configDbUri = "postgresql://"
|
||||||
, configFilePath = Nothing
|
, configFilePath = Nothing
|
||||||
, configJWKS = rightToMaybe $ parseSecret secret
|
, configJWKS = rightToMaybe $ parseSecret secret
|
||||||
@@ -254,6 +255,9 @@ testCfgServerTiming = baseCfg { configDbPlanEnabled = True }
|
|||||||
testCfgAggregatesEnabled :: AppConfig
|
testCfgAggregatesEnabled :: AppConfig
|
||||||
testCfgAggregatesEnabled = baseCfg { configDbAggregates = True }
|
testCfgAggregatesEnabled = baseCfg { configDbAggregates = True }
|
||||||
|
|
||||||
|
testCfgTimezoneDisabled :: AppConfig
|
||||||
|
testCfgTimezoneDisabled = baseCfg { configDbTimezoneEnabled = False }
|
||||||
|
|
||||||
analyzeTable :: Text -> IO ()
|
analyzeTable :: Text -> IO ()
|
||||||
analyzeTable tableName =
|
analyzeTable tableName =
|
||||||
void $ readProcess "psql" ["-U", "postgres", "--set", "ON_ERROR_STOP=1", "-a", "-c", toS $ "ANALYZE test.\"" <> tableName <> "\""] []
|
void $ readProcess "psql" ["-U", "postgres", "--set", "ON_ERROR_STOP=1", "-a", "-c", toS $ "ANALYZE test.\"" <> tableName <> "\""] []
|
||||||
|
|||||||
Reference in New Issue
Block a user