Re: BUG #13053: type names pollute function name space - Mailing list pgsql-bugs
From | Dwayne Towell |
---|---|
Subject | Re: BUG #13053: type names pollute function name space |
Date | |
Msg-id | 03f801d07707$6c4063e0$44c12ba0$@gmail.com Whole thread Raw |
In response to | Re: BUG #13053: type names pollute function name space ("David G. Johnston" <david.g.johnston@gmail.com>) |
List | pgsql-bugs |
I figured it had something to do with array types, given the error, but = still feel like creating the function, when it cannot be called, is an = error. I would appreciate getting an error similar to the one you = described instead of one later when attempting to call the function = since I would have saved me a couple of hours of debugging. I would = appreciate it if the documentation contained some hint that = type-conversion functions were automatically created by prepending an = underscore. (I don=E2=80=99t know how I would have found that nugget = without a better error message but still feel it is missing.) =20 I also tried the quoted-identifier trick and was equally surprised it = didn=E2=80=99t work and then on reflection relieved that it = didn=E2=80=99t either. =20 We have solved the problem by changing our naming convention, given the = usual momentum on projects like this I don=E2=80=99t expect it to be = changed, but better documentation and an better error would be = appreciated. =20 From: David G. Johnston [mailto:david.g.johnston@gmail.com]=20 Sent: Tuesday, April 14, 2015 3:55 PM To: dwayne.towell@gmail.com Cc: pgsql-bugs@postgresql.org Subject: Re: [BUGS] BUG #13053: type names pollute function name space =20 On Tue, Apr 14, 2015 at 2:24 PM, <dwayne.towell@gmail.com = <mailto:dwayne.towell@gmail.com> > wrote: The following bug has been logged on the website: Bug reference: 13053 Logged by: Dwayne Towell Email address: dwayne.towell@gmail.com = <mailto:dwayne.towell@gmail.com>=20 PostgreSQL version: 9.2.10 Operating system: CentOS Description: The following: =E2=80=8B=E2=80=8B CREATE TYPE x AS (id int); CREATE FUNCTION _x(text) RETURNS SETOF x AS $$ SELECT 1 WHERE $1=3D'hi'; = $$ LANGUAGE SQL; SELECT _x('hi'); produces: ERROR: array value must start with "{" or dimension information LINE 1: SELECT _x('hi'); Which seems wrong. Creating a type named 'x' should not preempt my = function by finding an auto created(?) conversion(?) function. =20 =E2=80=8BTo be more explicit about what is happening here=E2=80=8B: =20 It is finding the auto-magically created type "array x" aka: = "x[]=E2=80=8B". For reasons unknown to myself the underlying = representation type is named "_x". =20 Then, since "type 'literal'" and "type('literal') are equivalent to = "'literal'::type", SELECT _x('literal') becomes ambiguous and its (_x) = treatment as a type precedes its treatment as a function name. =20 I'll admit it seems odd but I'd chalk this up to system oddity and move = on. What is the solution you are looking for anyway? =20 I'm sure there are more surprises relating to types and functions since = functions are used to manipulate types - and as described above some = synatic sugar is involved as well - and maybe they could be better = documented...but I'm not see where preventing the creation of either the = function or the type (whichever is created last) is a viable solution = and I'm not seeing that the current rule of using the implied type cast = function first is necessarily wrong. =20 I would have thought that maybe you could access the original function = using double-quotes: SELECT "_x"('hi'); but that appears to be = incorrect...and not obviously useful even if it worked. =20 FWIW in the example provided I would prefer to have the CREATE FUNCTION = call fail with a "function already exists" error - though I do not = believe that is strictly correct. Maybe "unsupported function signature = - matching array of type x already exists"...? =20 Not that I could fix this even if I wanted to but the effort compared to = the number of complaints is not favorable to any change being = forthcoming. That includes documentation though that is more likely if = someone even puts forth a rough suggestion for what such an improvement = would look like. =20 David J. =20
pgsql-bugs by date: