correct missing=default with GENERATED BY column

This commit is contained in:
steve-chavez
2023-04-14 22:12:34 -05:00
committed by Steve Chavez
parent 0a2b7064c7
commit 3e53796120
4 changed files with 42 additions and 1 deletions
+12 -1
View File
@@ -511,7 +511,8 @@ tablesSqlQuery pgVer =
c.relname::name AS table_name,
a.attname::name AS column_name,
d.description AS description,
pg_get_expr(ad.adbin, ad.adrelid)::text AS column_default,
|] <> columnDefault <>
[q|
not (a.attnotnull OR t.typtype = 'd' AND t.typnotnull) AS is_nullable,
CASE
WHEN t.typtype = 'd' THEN
@@ -693,6 +694,16 @@ tablesSqlQuery pgVer =
"ORDER BY table_schema, table_name"
where
relIsPartition = if pgVer >= pgVersion100 then " AND not c.relispartition " else mempty
-- detect default values on columns that have GENERATED .. AS IDENTITY
columnDefault =
if pgVer >= pgVersion100
then [q|
CASE
WHEN nullif(a.attidentity, '') is null
THEN pg_get_expr(ad.adbin, ad.adrelid)::text
ELSE format('nextval(%s)', quote_literal(pg_get_serial_sequence(a.attrelid::regclass::text, a.attname::text)))
END AS column_default,|]
else "pg_get_expr(ad.adbin, ad.adrelid)::text AS column_default,"
-- | Gets many-to-one relationships and one-to-one(O2O) relationships, which are a refinement of the many-to-one's
+10
View File
@@ -495,6 +495,16 @@ spec actualPgVersion = do
, matchHeaders = ["Preference-Applied" <:> "missing=default"]
}
when (actualPgVersion >= pgVersion100) $
it "inserts a default on a generated by default as identity column" $ do
request methodPost "/channels?columns=id,data,slug&select=data,slug" [("Prefer", "return=representation"), ("Prefer", "missing=default")]
[json| { "slug": "foo" } |]
`shouldRespondWith`
[json| [{"data":{"foo": "bar"},"slug":"foo"}] |] -- id 1 was inserted here, we don't get it for idempotence in the tests
{ matchStatus = 201
, matchHeaders = ["Preference-Applied" <:> "missing=default"]
}
it "inserts json that has duplicate keys" $ do
request methodPost "/tbl_w_json" [("Prefer", "return=representation")]
[json| { "data": { "a": 1, "a": 2 }, "id": 3 } |]
+8
View File
@@ -41,6 +41,14 @@ GRANT USAGE ON SEQUENCE
, leak_id_seq
TO postgrest_test_anonymous;
DO $do$
BEGIN
IF current_setting('server_version_num')::INT >= 100000 THEN
GRANT USAGE ON SEQUENCE channels_id_seq TO postgrest_test_anonymous;
END IF;
END
$do$;
-- Privileges for non anonymous users
GRANT USAGE ON SCHEMA test TO postgrest_test_author;
GRANT ALL ON TABLE authors_only TO postgrest_test_author;
+12
View File
@@ -3110,3 +3110,15 @@ create table test.tbl_w_json(
id int,
data json
);
DO $do$
BEGIN
IF current_setting('server_version_num')::INT >= 100000 THEN
CREATE TABLE test.channels (
id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
data jsonb DEFAULT '{"foo": "bar"}',
slug text
);
END IF;
END
$do$;