Thread: [GENERAL] Make "(composite).function_name" syntax work without search_path changes?
[GENERAL] Make "(composite).function_name" syntax work without search_path changes?
From
"David G. Johnston"
Date:
CREATE SCHEMA altschema;
CREATE TYPE altschema.alttype AS ( altid text, altlabel text );
CREATE FUNCTION altschema.label(item altschema.alttype)
RETURNS text
LANGUAGE sql
AS $$
SELECT (item).altlabel;
$$;
WITH vals (v) AS (
SELECT ('1', 'One')::altschema.alttype
)
SELECT (v).label
FROM vals;
-- column "label" not found in data type altschema.alttype
SET search_path TO altschema;
WITH vals (v) AS (
SELECT ('1', 'One')::altschema.alttype
)
SELECT (v).label
FROM vals;
-- success
The system knows that the datatype being inspected is "altschema.alttype" - would it be reasonable for the system to check for a function named "label" in the same schema as the target type, "altschema", with the target argument type and invoke it if present?
At this point I'm just writing: altschema.label(v) which is adequate but not as clean. I'm consciously trying to write queries that don't require application schemas in the search path: including the joyous operator(altschema.@@) syntax in some situations. I suppose inference could be considered in that situation as well.
David J.
Re: [GENERAL] Make "(composite).function_name" syntax work without search_path changes?
From
Tom Lane
Date:
"David G. Johnston" <david.g.johnston@gmail.com> writes: > The system knows that the datatype being inspected is "altschema.alttype" - > would it be reasonable for the system to check for a function named "label" > in the same schema as the target type, "altschema", with the target > argument type and invoke it if present? The rule is that (v).label is equivalent to label(v), therefore it will only find function "label" if that's in your search path. I am very much not excited about randomly enlarging the search path depending on syntax --- quite aside from the difficulty of documenting it clearly, that seems like a great recipe for security hazards. regards, tom lane -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general