Compare commits
10
Commits
feat/openapi
...
v14.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3b4e5ff35 | ||
|
|
84f437b6c9 | ||
|
|
a3c8065e58 | ||
|
|
c797c09e22 | ||
|
|
fc6fbe9748 | ||
|
|
4aa712b9d8 | ||
|
|
939061baff | ||
|
|
6150d53592 | ||
|
|
d245e07df5 | ||
|
|
e913efb8cb |
@@ -112,7 +112,7 @@ runs:
|
|||||||
echo "artifacts=${artifacts}" >> "$GITHUB_OUTPUT"
|
echo "artifacts=${artifacts}" >> "$GITHUB_OUTPUT"
|
||||||
- name: Save artifact to GitHub Actions
|
- name: Save artifact to GitHub Actions
|
||||||
if: steps.find-task.outputs.task_found
|
if: steps.find-task.outputs.task_found
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.upload }}
|
name: ${{ inputs.upload }}
|
||||||
path: ${{ steps.download.outputs.artifacts }}
|
path: ${{ steps.download.outputs.artifacts }}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
|
|
||||||
# This is required for backport action to cherry-pick the PR
|
# This is required for backport action to cherry-pick the PR
|
||||||
- name: Fetch PR ref
|
- name: Fetch PR ref
|
||||||
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493
|
uses: actions/checkout@71cf2267d89c5cb81562390fa70a37fa40b1305e
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ jobs:
|
|||||||
- name: Build static executable
|
- name: Build static executable
|
||||||
run: nix-build -A postgrestStatic -A postgrestStatic.tests
|
run: nix-build -A postgrestStatic -A postgrestStatic.tests
|
||||||
- name: Save built executable as artifact
|
- name: Save built executable as artifact
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: postgrest-linux-static-x86-64
|
name: postgrest-linux-static-x86-64
|
||||||
path: result/bin/postgrest
|
path: result/bin/postgrest
|
||||||
@@ -51,7 +51,7 @@ jobs:
|
|||||||
- name: Build Docker image
|
- name: Build Docker image
|
||||||
run: nix-build -A docker.image --out-link postgrest-docker.tar.gz
|
run: nix-build -A docker.image --out-link postgrest-docker.tar.gz
|
||||||
- name: Save built Docker image as artifact
|
- name: Save built Docker image as artifact
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: postgrest-docker-x86-64
|
name: postgrest-docker-x86-64
|
||||||
path: postgrest-docker.tar.gz
|
path: postgrest-docker.tar.gz
|
||||||
@@ -155,7 +155,7 @@ jobs:
|
|||||||
- name: Strip Executable
|
- name: Strip Executable
|
||||||
run: strip result/postgrest*
|
run: strip result/postgrest*
|
||||||
- name: Save built executable as artifact
|
- name: Save built executable as artifact
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.artifact }}
|
name: ${{ matrix.artifact }}
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cabal_version="$(grep -oP '^version:\s*\K.*' postgrest.cabal)"
|
cabal_version="$(grep -oP '^version:\s*\K.*' postgrest.cabal)"
|
||||||
|
|
||||||
if [[ "$cabal_version" == *.*.*.* ]]; then
|
if [[ "$cabal_version" == *.* ]]; then
|
||||||
git fetch --tags
|
git fetch --tags
|
||||||
|
|
||||||
if [ -z "$(git tag --list "v$cabal_version")" ]; then
|
if [ -z "$(git tag --list "v$cabal_version")" ]; then
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ jobs:
|
|||||||
echo "Relevant extract from CHANGELOG.md:"
|
echo "Relevant extract from CHANGELOG.md:"
|
||||||
cat CHANGES.md
|
cat CHANGES.md
|
||||||
- name: Save CHANGES.md as artifact
|
- name: Save CHANGES.md as artifact
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: release-changes
|
name: release-changes
|
||||||
path: CHANGES.md
|
path: CHANGES.md
|
||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
path: artifacts
|
path: artifacts
|
||||||
- name: Create release bundle with archives for all builds
|
- name: Create release bundle with archives for all builds
|
||||||
@@ -94,7 +94,7 @@ jobs:
|
|||||||
artifacts/postgrest-windows-x86-64/postgrest.exe
|
artifacts/postgrest-windows-x86-64/postgrest.exe
|
||||||
|
|
||||||
- name: Save release bundle
|
- name: Save release bundle
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: release-bundle
|
name: release-bundle
|
||||||
path: release-bundle
|
path: release-bundle
|
||||||
@@ -140,11 +140,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
- name: Download x86-64 Docker image
|
- name: Download x86-64 Docker image
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: postgrest-docker-x86-64
|
name: postgrest-docker-x86-64
|
||||||
- name: Download aarch64 binary
|
- name: Download aarch64 binary
|
||||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: postgrest-ubuntu-aarch64
|
name: postgrest-ubuntu-aarch64
|
||||||
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|||||||
+8
-2
@@ -1,10 +1,16 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file. From version `14.0` onwards PostgREST follows a `MAJOR.PATCH` two-part versioning. Only even-numbered MAJOR versions will be released, reserving odd-numbered MAJOR versions for development.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
## [14.1] - 2025-11-05
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fix `db-pre-config` function failing when function names are pg reserved words by @taimoorzaeem in #4380
|
||||||
|
- Fix `server-host=!6` incorrectly binds to IPv4 address by @taimoorzaeem in #3202
|
||||||
|
|
||||||
## [14.0] - 2025-10-24
|
## [14.0] - 2025-10-24
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
index-state: hackage.haskell.org 2025-10-13T04:53:27Z
|
index-state: hackage.haskell.org 2025-10-29T04:02:18Z
|
||||||
|
|||||||
@@ -60,6 +60,16 @@ let
|
|||||||
}
|
}
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
|
# TODO: Remove once available in nixpkgs haskellPackages
|
||||||
|
streaming-commons =
|
||||||
|
prev.callHackageDirect
|
||||||
|
{
|
||||||
|
pkg = "streaming-commons";
|
||||||
|
ver = "0.2.3.1";
|
||||||
|
sha256 = "sha256-Gl2eaJcWe1sxmcE/octWlH9uSnERguf+5H66K4fV87s=";
|
||||||
|
}
|
||||||
|
{ };
|
||||||
|
|
||||||
# Downgrade hasql and related packages while we are still on GHC 9.4 for the static build.
|
# Downgrade hasql and related packages while we are still on GHC 9.4 for the static build.
|
||||||
hasql = lib.dontCheck (lib.doJailbreak prev.hasql_1_6_4_4);
|
hasql = lib.dontCheck (lib.doJailbreak prev.hasql_1_6_4_4);
|
||||||
hasql-dynamic-statements = lib.dontCheck prev.hasql-dynamic-statements_0_3_1_5;
|
hasql-dynamic-statements = lib.dontCheck prev.hasql-dynamic-statements_0_3_1_5;
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
name: postgrest
|
name: postgrest
|
||||||
version: 14.0
|
version: 14.1
|
||||||
synopsis: REST API for any Postgres database
|
synopsis: REST API for any Postgres database
|
||||||
description: Reads the schema of a PostgreSQL database and creates RESTful routes
|
description: Reads the schema of a PostgreSQL database and creates RESTful routes
|
||||||
for tables, views, and functions, supporting all HTTP methods that security
|
for tables, views, and functions, supporting all HTTP methods that security
|
||||||
@@ -139,7 +139,7 @@ library
|
|||||||
, regex-tdfa >= 1.2.2 && < 1.4
|
, regex-tdfa >= 1.2.2 && < 1.4
|
||||||
, retry >= 0.7.4 && < 0.10
|
, retry >= 0.7.4 && < 0.10
|
||||||
, scientific >= 0.3.4 && < 0.4
|
, scientific >= 0.3.4 && < 0.4
|
||||||
, streaming-commons >= 0.1.1 && < 0.3
|
, streaming-commons >= 0.2.3.1 && < 0.3
|
||||||
, swagger2 >= 2.4 && < 2.9
|
, swagger2 >= 2.4 && < 2.9
|
||||||
, text >= 1.2.2 && < 2.2
|
, text >= 1.2.2 && < 2.2
|
||||||
, time >= 1.6 && < 1.13
|
, time >= 1.6 && < 1.13
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ import PostgREST.Config.PgVersion (PgVersion (..),
|
|||||||
import PostgREST.SchemaCache (SchemaCache (..),
|
import PostgREST.SchemaCache (SchemaCache (..),
|
||||||
querySchemaCache,
|
querySchemaCache,
|
||||||
showSummary)
|
showSummary)
|
||||||
import PostgREST.SchemaCache.Identifiers (dumpQi)
|
import PostgREST.SchemaCache.Identifiers (quoteQi)
|
||||||
import PostgREST.Unix (createAndBindDomainSocket)
|
import PostgREST.Unix (createAndBindDomainSocket)
|
||||||
|
|
||||||
import Data.Streaming.Network (bindPortTCP, bindRandomPortTCP)
|
import Data.Streaming.Network (bindPortTCP, bindRandomPortTCP)
|
||||||
@@ -441,7 +441,7 @@ readInDbConfig startingUp appState@AppState{stateObserver=observer} = do
|
|||||||
pgVer <- getPgVersion appState
|
pgVer <- getPgVersion appState
|
||||||
dbSettings <-
|
dbSettings <-
|
||||||
if configDbConfig conf then do
|
if configDbConfig conf then do
|
||||||
qDbSettings <- usePool appState (queryDbSettings (dumpQi <$> configDbPreConfig conf) (configDbPreparedStatements conf))
|
qDbSettings <- usePool appState (queryDbSettings (quoteQi <$> configDbPreConfig conf) (configDbPreparedStatements conf))
|
||||||
case qDbSettings of
|
case qDbSettings of
|
||||||
Left e -> do
|
Left e -> do
|
||||||
observer $ ConfigReadErrorObs e
|
observer $ ConfigReadErrorObs e
|
||||||
|
|||||||
@@ -6,13 +6,22 @@ Module : PostgREST.Query.SqlFragment
|
|||||||
Description : Helper functions for PostgREST.QueryBuilder.
|
Description : Helper functions for PostgREST.QueryBuilder.
|
||||||
-}
|
-}
|
||||||
module PostgREST.Query.SqlFragment
|
module PostgREST.Query.SqlFragment
|
||||||
( noLocationF
|
( accessibleFuncs
|
||||||
, handlerF
|
, accessibleTables
|
||||||
|
, addConfigPgrstInserted
|
||||||
, countF
|
, countF
|
||||||
, groupF
|
, currentSettingF
|
||||||
|
, escapeIdent
|
||||||
|
, escapeIdentList
|
||||||
|
, explainF
|
||||||
|
, fromJsonBodyF
|
||||||
, fromQi
|
, fromQi
|
||||||
|
, groupF
|
||||||
|
, handlerF
|
||||||
|
, intercalateSnippet
|
||||||
, limitOffsetF
|
, limitOffsetF
|
||||||
, locationF
|
, locationF
|
||||||
|
, noLocationF
|
||||||
, orderF
|
, orderF
|
||||||
, pgFmtColumn
|
, pgFmtColumn
|
||||||
, pgFmtFilter
|
, pgFmtFilter
|
||||||
@@ -21,28 +30,19 @@ module PostgREST.Query.SqlFragment
|
|||||||
, pgFmtLogicTree
|
, pgFmtLogicTree
|
||||||
, pgFmtOrderTerm
|
, pgFmtOrderTerm
|
||||||
, pgFmtSelectItem
|
, pgFmtSelectItem
|
||||||
, pgFmtSpreadSelectItem
|
|
||||||
, pgFmtSpreadJoinSelectItem
|
, pgFmtSpreadJoinSelectItem
|
||||||
, fromJsonBodyF
|
, pgFmtSpreadSelectItem
|
||||||
, responseHeadersF
|
, responseHeadersF
|
||||||
, responseStatusF
|
, responseStatusF
|
||||||
, addConfigPgrstInserted
|
|
||||||
, currentSettingF
|
|
||||||
, returningF
|
, returningF
|
||||||
|
, schemaDescription
|
||||||
|
, setConfigWithConstantName
|
||||||
|
, setConfigWithConstantNameJSON
|
||||||
|
, setConfigWithDynamicName
|
||||||
, singleParameter
|
, singleParameter
|
||||||
, sourceCTE
|
, sourceCTE
|
||||||
, sourceCTEName
|
, sourceCTEName
|
||||||
, unknownEncoder
|
, unknownEncoder
|
||||||
, intercalateSnippet
|
|
||||||
, explainF
|
|
||||||
, setConfigWithConstantName
|
|
||||||
, setConfigWithDynamicName
|
|
||||||
, setConfigWithConstantNameJSON
|
|
||||||
, escapeIdent
|
|
||||||
, escapeIdentList
|
|
||||||
, schemaDescription
|
|
||||||
, accessibleTables
|
|
||||||
, accessibleFuncs
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
@@ -90,7 +90,8 @@ import PostgREST.RangeQuery (NonnegRange, allRange,
|
|||||||
rangeLimit, rangeOffset)
|
rangeLimit, rangeOffset)
|
||||||
import PostgREST.SchemaCache.Identifiers (FieldName,
|
import PostgREST.SchemaCache.Identifiers (FieldName,
|
||||||
QualifiedIdentifier (..),
|
QualifiedIdentifier (..),
|
||||||
RelIdentifier (..))
|
RelIdentifier (..),
|
||||||
|
escapeIdent, trimNullChars)
|
||||||
import PostgREST.SchemaCache.Routine (MediaHandler (..),
|
import PostgREST.SchemaCache.Routine (MediaHandler (..),
|
||||||
Routine (..),
|
Routine (..),
|
||||||
funcReturnsScalar,
|
funcReturnsScalar,
|
||||||
@@ -163,9 +164,6 @@ pgBuildArrayLiteral vals =
|
|||||||
pgFmtIdent :: Text -> SQL.Snippet
|
pgFmtIdent :: Text -> SQL.Snippet
|
||||||
pgFmtIdent x = SQL.sql . encodeUtf8 $ escapeIdent x
|
pgFmtIdent x = SQL.sql . encodeUtf8 $ escapeIdent x
|
||||||
|
|
||||||
escapeIdent :: Text -> Text
|
|
||||||
escapeIdent x = "\"" <> T.replace "\"" "\"\"" (trimNullChars x) <> "\""
|
|
||||||
|
|
||||||
-- Only use it if the input comes from the database itself, like on `jsonb_build_object('column_from_a_table', val)..`
|
-- Only use it if the input comes from the database itself, like on `jsonb_build_object('column_from_a_table', val)..`
|
||||||
pgFmtLit :: Text -> Text
|
pgFmtLit :: Text -> Text
|
||||||
pgFmtLit x =
|
pgFmtLit x =
|
||||||
@@ -176,9 +174,6 @@ pgFmtLit x =
|
|||||||
then "E" <> slashed
|
then "E" <> slashed
|
||||||
else slashed
|
else slashed
|
||||||
|
|
||||||
trimNullChars :: Text -> Text
|
|
||||||
trimNullChars = T.takeWhile (/= '\x0')
|
|
||||||
|
|
||||||
-- |
|
-- |
|
||||||
-- Format a list of identifiers and separate them by commas.
|
-- Format a list of identifiers and separate them by commas.
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -42,11 +42,11 @@ import NeatInterpolation (trimming)
|
|||||||
import PostgREST.Config (AppConfig (..))
|
import PostgREST.Config (AppConfig (..))
|
||||||
import PostgREST.Config.Database (TimezoneNames,
|
import PostgREST.Config.Database (TimezoneNames,
|
||||||
toIsolationLevel)
|
toIsolationLevel)
|
||||||
import PostgREST.Query.SqlFragment (escapeIdent)
|
|
||||||
import PostgREST.SchemaCache.Identifiers (FieldName,
|
import PostgREST.SchemaCache.Identifiers (FieldName,
|
||||||
QualifiedIdentifier (..),
|
QualifiedIdentifier (..),
|
||||||
RelIdentifier (..),
|
RelIdentifier (..),
|
||||||
Schema, isAnyElement)
|
Schema, escapeIdent,
|
||||||
|
isAnyElement)
|
||||||
import PostgREST.SchemaCache.Relationship (Cardinality (..),
|
import PostgREST.SchemaCache.Relationship (Cardinality (..),
|
||||||
Junction (..),
|
Junction (..),
|
||||||
Relationship (..),
|
Relationship (..),
|
||||||
|
|||||||
@@ -2,14 +2,17 @@
|
|||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
|
|
||||||
module PostgREST.SchemaCache.Identifiers
|
module PostgREST.SchemaCache.Identifiers
|
||||||
( QualifiedIdentifier(..)
|
( FieldName
|
||||||
|
, QualifiedIdentifier(..)
|
||||||
, RelIdentifier(..)
|
, RelIdentifier(..)
|
||||||
, isAnyElement
|
|
||||||
, Schema
|
, Schema
|
||||||
, TableName
|
, TableName
|
||||||
, FieldName
|
|
||||||
, dumpQi
|
, dumpQi
|
||||||
|
, escapeIdent
|
||||||
|
, isAnyElement
|
||||||
|
, quoteQi
|
||||||
, toQi
|
, toQi
|
||||||
|
, trimNullChars
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
@@ -39,6 +42,10 @@ dumpQi :: QualifiedIdentifier -> Text
|
|||||||
dumpQi (QualifiedIdentifier s i) =
|
dumpQi (QualifiedIdentifier s i) =
|
||||||
(if T.null s then mempty else s <> ".") <> i
|
(if T.null s then mempty else s <> ".") <> i
|
||||||
|
|
||||||
|
quoteQi :: QualifiedIdentifier -> Text
|
||||||
|
quoteQi (QualifiedIdentifier s i) =
|
||||||
|
(if T.null s then mempty else escapeIdent s <> ".") <> escapeIdent i
|
||||||
|
|
||||||
-- TODO: Handle a case where the QI comes like this: "my.fav.schema"."my.identifier"
|
-- TODO: Handle a case where the QI comes like this: "my.fav.schema"."my.identifier"
|
||||||
-- Right now it only handles the schema.identifier case
|
-- Right now it only handles the schema.identifier case
|
||||||
toQi :: Text -> QualifiedIdentifier
|
toQi :: Text -> QualifiedIdentifier
|
||||||
@@ -46,6 +53,12 @@ toQi txt = case T.drop 1 <$> T.breakOn "." txt of
|
|||||||
(i, "") -> QualifiedIdentifier mempty i
|
(i, "") -> QualifiedIdentifier mempty i
|
||||||
(s, i) -> QualifiedIdentifier s i
|
(s, i) -> QualifiedIdentifier s i
|
||||||
|
|
||||||
|
escapeIdent :: Text -> Text
|
||||||
|
escapeIdent x = "\"" <> T.replace "\"" "\"\"" (trimNullChars x) <> "\""
|
||||||
|
|
||||||
|
trimNullChars :: Text -> Text
|
||||||
|
trimNullChars = T.takeWhile (/= '\x0')
|
||||||
|
|
||||||
type Schema = Text
|
type Schema = Text
|
||||||
type TableName = Text
|
type TableName = Text
|
||||||
type FieldName = Text
|
type FieldName = Text
|
||||||
|
|||||||
@@ -14,3 +14,4 @@ extra-deps:
|
|||||||
- hasql-pool-1.0.1
|
- hasql-pool-1.0.1
|
||||||
- jose-jwt-0.10.0
|
- jose-jwt-0.10.0
|
||||||
- postgresql-libpq-0.10.1.0
|
- postgresql-libpq-0.10.1.0
|
||||||
|
- streaming-commons-0.2.3.1
|
||||||
|
|||||||
@@ -39,6 +39,13 @@ packages:
|
|||||||
size: 1096
|
size: 1096
|
||||||
original:
|
original:
|
||||||
hackage: postgresql-libpq-0.10.1.0
|
hackage: postgresql-libpq-0.10.1.0
|
||||||
|
- completed:
|
||||||
|
hackage: streaming-commons-0.2.3.1@sha256:ed7999fea9e912b1211ea93d7e20a7998bf4753166370c94048885650f303bf0,4841
|
||||||
|
pantry-tree:
|
||||||
|
sha256: f08e83fb00fd45865fa8cfdef5ecef7161d5135257ee98050bfbe4b807ad65f8
|
||||||
|
size: 2374
|
||||||
|
original:
|
||||||
|
hackage: streaming-commons-0.2.3.1
|
||||||
snapshots:
|
snapshots:
|
||||||
- completed:
|
- completed:
|
||||||
sha256: 238fa745b64f91184f9aa518fe04bdde6552533d169b0da5256670df83a0f1a9
|
sha256: 238fa745b64f91184f9aa518fe04bdde6552533d169b0da5256670df83a0f1a9
|
||||||
|
|||||||
@@ -461,6 +461,23 @@
|
|||||||
pdSchema: public
|
pdSchema: public
|
||||||
pdVolatility: Volatile
|
pdVolatility: Volatile
|
||||||
|
|
||||||
|
- - qiName: 'true'
|
||||||
|
qiSchema: public
|
||||||
|
- - pdDescription: null
|
||||||
|
pdFuncSettings: []
|
||||||
|
pdHasVariadic: false
|
||||||
|
pdName: 'true'
|
||||||
|
pdParams: []
|
||||||
|
pdReturnType:
|
||||||
|
contents:
|
||||||
|
contents:
|
||||||
|
qiName: bool
|
||||||
|
qiSchema: pg_catalog
|
||||||
|
tag: Scalar
|
||||||
|
tag: Single
|
||||||
|
pdSchema: public
|
||||||
|
pdVolatility: Volatile
|
||||||
|
|
||||||
- - qiName: create_function
|
- - qiName: create_function
|
||||||
qiSchema: public
|
qiSchema: public
|
||||||
- - pdDescription: null
|
- - pdDescription: null
|
||||||
|
|||||||
@@ -256,3 +256,7 @@ select * from projects;
|
|||||||
|
|
||||||
create or replace view infinite_recursion as
|
create or replace view infinite_recursion as
|
||||||
select * from infinite_recursion;
|
select * from infinite_recursion;
|
||||||
|
|
||||||
|
create or replace function "true"() returns boolean as $_$
|
||||||
|
select true;
|
||||||
|
$_$ language sql;
|
||||||
|
|||||||
+11
-3
@@ -94,11 +94,19 @@ def run(
|
|||||||
"Run PostgREST and yield an endpoint that is ready for connections."
|
"Run PostgREST and yield an endpoint that is ready for connections."
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as tmpdir:
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
|
||||||
|
# with python requests, "localhost" doesn't automatically resolves
|
||||||
|
# to [::1], hence we use this explicitly when host is ipv6 special
|
||||||
|
# address
|
||||||
|
ipv6_special_addresses = ["*6", "!6"]
|
||||||
|
|
||||||
|
localhost = "[::1]" if host in ipv6_special_addresses else "localhost"
|
||||||
|
|
||||||
if port:
|
if port:
|
||||||
env["PGRST_SERVER_PORT"] = str(port)
|
env["PGRST_SERVER_PORT"] = str(port)
|
||||||
env["PGRST_SERVER_HOST"] = host or "localhost"
|
env["PGRST_SERVER_HOST"] = host or localhost
|
||||||
# When constructing IPv6 address, host address should be bracketed like [host]
|
# When constructing IPv6 address, host address should be bracketed like [host]
|
||||||
apihost = f"[{host}]" if host and is_ipv6(host) else "localhost"
|
apihost = f"[{host}]" if host and is_ipv6(host) else localhost
|
||||||
baseurl = f"http://{apihost}:{port}"
|
baseurl = f"http://{apihost}:{port}"
|
||||||
else:
|
else:
|
||||||
socketfile = pathlib.Path(tmpdir) / "postgrest.sock"
|
socketfile = pathlib.Path(tmpdir) / "postgrest.sock"
|
||||||
@@ -107,7 +115,7 @@ def run(
|
|||||||
|
|
||||||
adminport = freeport(port)
|
adminport = freeport(port)
|
||||||
env["PGRST_ADMIN_SERVER_PORT"] = str(adminport)
|
env["PGRST_ADMIN_SERVER_PORT"] = str(adminport)
|
||||||
adminhost = f"[{host}]" if host and is_ipv6(host) else "localhost"
|
adminhost = f"[{host}]" if host and is_ipv6(host) else localhost
|
||||||
adminurl = f"http://{adminhost}:{adminport}"
|
adminurl = f"http://{adminhost}:{adminport}"
|
||||||
|
|
||||||
command = [POSTGREST_BIN]
|
command = [POSTGREST_BIN]
|
||||||
|
|||||||
@@ -2046,3 +2046,29 @@ def test_log_listener_connection_errors(defaultenv):
|
|||||||
in line
|
in line
|
||||||
for line in output
|
for line in output
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_db_pre_config_with_pg_reserved_words(defaultenv):
|
||||||
|
"The db-pre-config should not fail unexpectedly when function name is a postgres reserved word"
|
||||||
|
|
||||||
|
env = {
|
||||||
|
**defaultenv,
|
||||||
|
"PGRST_DB_PRE_CONFIG": "true", # call true function
|
||||||
|
}
|
||||||
|
|
||||||
|
with run(env=env) as postgrest:
|
||||||
|
response = postgrest.session.post("/rpc/true")
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
env = {
|
||||||
|
**defaultenv,
|
||||||
|
"PGRST_DB_PRE_CONFIG": "select", # no "select" function in our fixtures, fail gracefully at startup
|
||||||
|
}
|
||||||
|
|
||||||
|
with run(env=env, no_startup_stdout=False, wait_for_readiness=False) as postgrest:
|
||||||
|
output = postgrest.read_stdout(nlines=8)
|
||||||
|
assert any(
|
||||||
|
'Failed to query database settings for the config parameters.{"code":"42883","details":null,"hint":"No function matches the given name and argument types. You might need to add explicit type casts.","message":"function select() does not exist"}'
|
||||||
|
in line
|
||||||
|
for line in output
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user