fix: make computed relationships work when the schema name has special characters

This commit is contained in:
Laurence Isla
2022-09-15 11:07:57 -05:00
committed by GitHub
parent bb52fb9b0e
commit 334f500f7c
5 changed files with 48 additions and 12 deletions
+7 -7
View File
@@ -710,13 +710,13 @@ allComputedRels =
), ),
computed_rels as ( computed_rels as (
select select
p.pronamespace::regnamespace::text as schema, (parse_ident(p.pronamespace::regnamespace::text))[1] as schema,
p.proname::text as name, p.proname::text as name,
arg_schema.nspname::text as rel_table_schema, arg_schema.nspname::text as rel_table_schema,
arg_name.typname::text as rel_table_name, arg_name.typname::text as rel_table_name,
ret_schema.nspname::text as rel_ftable_schema, ret_schema.nspname::text as rel_ftable_schema,
ret_name.typname::text as rel_ftable_name, ret_name.typname::text as rel_ftable_name,
p.prorows = 1 as single_row p.prorows = 1 as single_row
from pg_proc p from pg_proc p
join pg_type arg_name on arg_name.oid = p.proargtypes[0] join pg_type arg_name on arg_name.oid = p.proargtypes[0]
join pg_namespace arg_schema on arg_schema.oid = arg_name.typnamespace join pg_namespace arg_schema on arg_schema.oid = arg_name.typnamespace
+26 -3
View File
@@ -74,10 +74,33 @@ spec =
} }
it "succeeds in reading a table from a schema with uppercase and special characters in its name" $ it "succeeds in reading a table from a schema with uppercase and special characters in its name" $
request methodGet "/names" [("Accept-Profile", "SPECIAL \"@/\\#~_-")] "" `shouldRespondWith` request methodGet "/names?select=id,name" [("Accept-Profile", "SPECIAL \"@/\\#~_-")] "" `shouldRespondWith`
[json|[ [json|[
{"id":1,"name":"John"}, {"id": 1, "name":"John"},
{"id":2,"name":"Mary"} {"id": 2, "name":"Mary"},
{"id": 3, "name":"José"}
]|]
{
matchStatus = 200
, matchHeaders = [matchContentTypeJson, "Content-Profile" <:> "SPECIAL \"@/\\#~_-"]
}
it "succeeds in embedding with FK when the schema name has special characters" $
request methodGet "/names?select=name,languages(name)&id=in.(1,3)" [("Accept-Profile", "SPECIAL \"@/\\#~_-")] "" `shouldRespondWith`
[json|[
{"name": "John", languages: {"name": "English"}},
{"name": "José", languages: {"name": "Spanish"}}
]|]
{
matchStatus = 200
, matchHeaders = [matchContentTypeJson, "Content-Profile" <:> "SPECIAL \"@/\\#~_-"]
}
it "succeeds in embedding with computed relationships when the schema name has special characters" $
request methodGet "/names?select=name,computed_languages(name)&id=in.(1,3)" [("Accept-Profile", "SPECIAL \"@/\\#~_-")] "" `shouldRespondWith`
[json|[
{"name": "John", computed_languages: {"name": "English"}},
{"name": "José", computed_languages: {"name": "Spanish"}}
]|] ]|]
{ {
matchStatus = 200 matchStatus = 200
+3 -1
View File
@@ -792,8 +792,10 @@ INSERT INTO shop_bles(id, name, coords, shop_id, range_area) VALUES(1, 'Beacon-1
INSERT INTO shop_bles(id, name, coords, shop_id, range_area) VALUES(2, 'Beacon-2', 'SRID=4326;POINT(-71.10044 42.373695)', 1, INSERT INTO shop_bles(id, name, coords, shop_id, range_area) VALUES(2, 'Beacon-2', 'SRID=4326;POINT(-71.10044 42.373695)', 1,
extensions.ST_GeomFromGeoJSON('{"type": "Polygon", "coordinates": [ [ [ -71.10034391283989, 42.37385299961788 ], [ -71.10036939382553, 42.373756895982865 ], [ -71.1002916097641, 42.373745997623224 ], [ -71.1002641171217, 42.37384408279195 ], [ -71.10034391283989, 42.37385299961788 ] ] ]}')); extensions.ST_GeomFromGeoJSON('{"type": "Polygon", "coordinates": [ [ [ -71.10034391283989, 42.37385299961788 ], [ -71.10036939382553, 42.373756895982865 ], [ -71.1002916097641, 42.373745997623224 ], [ -71.1002641171217, 42.37384408279195 ], [ -71.10034391283989, 42.37385299961788 ] ] ]}'));
TRUNCATE TABLE "SPECIAL ""@/\#~_-".languages CASCADE;
INSERT INTO "SPECIAL ""@/\#~_-".languages (id, name) VALUES (1, 'English'), (2, 'Spanish');
TRUNCATE TABLE "SPECIAL ""@/\#~_-".names CASCADE; TRUNCATE TABLE "SPECIAL ""@/\#~_-".names CASCADE;
INSERT INTO "SPECIAL ""@/\#~_-".names (id, name) VALUES (1, 'John'), (2, 'Mary'); INSERT INTO "SPECIAL ""@/\#~_-".names (id, name, language_id) VALUES (1, 'John', 1), (2, 'Mary', 1), (3, 'José', 2);
TRUNCATE TABLE do$llar$s CASCADE; TRUNCATE TABLE do$llar$s CASCADE;
INSERT INTO do$llar$s (a$num$) VALUES (100), (200), (300); INSERT INTO do$llar$s (a$num$) VALUES (100), (200), (300);
+1
View File
@@ -191,6 +191,7 @@ GRANT ALL ON TABLE
, view_test , view_test
, shops , shops
, shop_bles , shop_bles
, "SPECIAL ""@/\#~_-".languages
, "SPECIAL ""@/\#~_-".names , "SPECIAL ""@/\#~_-".names
, do$llar$s , do$llar$s
, safe_update_items , safe_update_items
+11 -1
View File
@@ -2660,11 +2660,21 @@ create function get_shop(id int) returns shops as $$
select * from shops where id = $1; select * from shops where id = $1;
$$ language sql; $$ language sql;
CREATE TABLE "SPECIAL ""@/\#~_-".names( CREATE TABLE "SPECIAL ""@/\#~_-".languages(
id INT PRIMARY KEY, id INT PRIMARY KEY,
name TEXT name TEXT
); );
CREATE TABLE "SPECIAL ""@/\#~_-".names(
id INT PRIMARY KEY,
name TEXT,
language_id INT REFERENCES "SPECIAL ""@/\#~_-".languages(id)
);
CREATE FUNCTION "SPECIAL ""@/\#~_-".computed_languages("SPECIAL ""@/\#~_-".names) RETURNS SETOF "SPECIAL ""@/\#~_-".languages ROWS 1 AS $$
SELECT * FROM "SPECIAL ""@/\#~_-".languages where id = $1.language_id;
$$ LANGUAGE sql;
CREATE FUNCTION "EXTRA ""@/\#~_-".get_val_special(val text) RETURNS text AS $$ CREATE FUNCTION "EXTRA ""@/\#~_-".get_val_special(val text) RETURNS text AS $$
SELECT val; SELECT val;
$$ LANGUAGE sql; $$ LANGUAGE sql;