Thread: Where is the char and varchar length in pg_catalog for function input variables
I have searched and searched and just cannot find the maximum lengths for input variables in a function i.e. CREATE FUNCTION test(input1 char(5), input2 varchar(50)) RETURNS void AS $$RAISE NOTICE('%,%'), $1, $2;$$ LANGUAGE plpgsql; Where do I find the 5 and the 50 it has to be somewhere I have searched through pg_proc pg_type pg_attribute (whose attlen only relates to tables) pg_type and all possible manner of joining these tables. -- View this message in context: http://postgresql.1045698.n5.nabble.com/Where-is-the-char-and-varchar-length-in-pg-catalog-for-function-input-variables-tp5722845.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
Re: Where is the char and varchar length in pg_catalog for function input variables
From
Tom Lane
Date:
jam3 <jamorton3@gmail.com> writes: > I have searched and searched and just cannot find the maximum lengths for > input variables in a function > CREATE FUNCTION test(input1 char(5), input2 varchar(50)) > RETURNS void AS > $$RAISE NOTICE('%,%'), $1, $2;$$ > LANGUAGE plpgsql; > Where do I find the 5 and the 50 it has to be somewhere No, it doesn't have to be, and it isn't. As far as PG is concerned, the inputs to this function are just of type "char" and "varchar". You're allowed to write extra decoration but it's ignored. regards, tom lane
Re: Where is the char and varchar length in pg_catalog for function input variables
From
Pavan Deolasee
Date:
On Wed, Sep 5, 2012 at 9:10 PM, jam3 <jamorton3@gmail.com> wrote:
I have searched and searched and just cannot find the maximum lengths for
input variables in a function
i.e.
CREATE FUNCTION test(input1 char(5), input2 varchar(50))
RETURNS void AS
$$RAISE NOTICE('%,%'), $1, $2;$$
LANGUAGE plpgsql;
Where do I find the 5 and the 50 it has to be somewhere I have searched
through
pg_proc
pg_type
pg_attribute (whose attlen only relates to tables)
pg_type
and all possible manner of joining these tables.
Hmm. I only looked at the code and hence don't have a definite answer. But it seems that information is not stored anywhere. That might explain why the function you mentioned accepts parameters with any character length.
Thanks,
Pavan
Re: Where is the char and varchar length in pg_catalog for function input variables
From
Pavel Stehule
Date:
2012/9/5 Pavan Deolasee <pavan.deolasee@gmail.com>: > > > On Wed, Sep 5, 2012 at 9:10 PM, jam3 <jamorton3@gmail.com> wrote: >> >> I have searched and searched and just cannot find the maximum lengths for >> input variables in a function >> >> i.e. >> >> CREATE FUNCTION test(input1 char(5), input2 varchar(50)) >> RETURNS void AS >> $$RAISE NOTICE('%,%'), $1, $2;$$ >> LANGUAGE plpgsql; >> >> >> Where do I find the 5 and the 50 it has to be somewhere I have searched >> through >> pg_proc >> pg_type >> pg_attribute (whose attlen only relates to tables) >> pg_type >> >> and all possible manner of joining these tables. >> > > Hmm. I only looked at the code and hence don't have a definite answer. But > it seems that information is not stored anywhere. That might explain why the > function you mentioned accepts parameters with any character length. > yes, this information is just ignored - functions drops typmods Regards Pavel > Thanks, > Pavan > >
Yeah thats what I was starting to wonder if those lengths basically mean nothing. I am writing a ton of functions to unit test all of the functions in our app and am generating random strings and would like to pass the lengths to my random string generator so if it's varchar 50 I am generating a string between 0 and 50 length but since I can't find the length value I guess I am just going to put an arbitrary length in. Would be nice to know what exactly is going on when you have a length specified on an input variable in pg_catalog. -- View this message in context: http://postgresql.1045698.n5.nabble.com/Where-is-the-char-and-varchar-length-in-pg-catalog-for-function-input-variables-tp5722845p5722850.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
Duh never mind I call brain cloud on that one, and thanks for all the help. -- View this message in context: http://postgresql.1045698.n5.nabble.com/Where-is-the-char-and-varchar-length-in-pg-catalog-for-function-input-variables-tp5722845p5722880.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
How does postgres figure this out to throw the error msg? create table test_table ( column1 char(10), column2 varchar(20) ) without oids; create or replace function test1(c1 char(10), c2 varchar(20)) returns void as $$ BEGIN insert into test_table values ($1, $2); END $$ language plpgsql select test1('1234567890','ABCDEFGHIJKLMNOPQRST') select * from test_table; -- 1234567890, ABCDEFGHIJKLMNOPQRST select test1('this is way way longer than 10 characters','this is way way way way way way way way way way way way longer than 20 characters') ERROR: value too long for type character(10) CONTEXT: SQL statement "insert into test_table values ($1, $2)" PL/pgSQL function "test1" line 3 at SQL statement ********** Error ********** ERROR: value too long for type character(10) -- View this message in context: http://postgresql.1045698.n5.nabble.com/Where-is-the-char-and-varchar-length-in-pg-catalog-for-function-input-variables-tp5722845p5722876.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
This is what I meant to post drop table test_table; create table test_table ( column1 char(20), column2 varchar(40) ) without oids; drop function test1(char(10), varchar(20)); create or replace function test1(c1 char(10), c2 varchar(20)) returns void as $$ BEGIN insert into test_table values ($1, $2); END $$ language plpgsql select test1('12345678900123456789','ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCD') select * from test_table; 12345678900123456789, ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCD Just showing that it does indeed not use the length in at all, and this just seems wrong. I can definetly see situations where someone would put a length on a in put var and get an an unexpected result, like the one above. -- View this message in context: http://postgresql.1045698.n5.nabble.com/Where-is-the-char-and-varchar-length-in-pg-catalog-for-function-input-variables-tp5722845p5722881.html Sent from the PostgreSQL - general mailing list archive at Nabble.com.
Re: Where is the char and varchar length in pg_catalog for function input variables
From
"Kevin Grittner"
Date:
jam3 <jamorton3@gmail.com> wrote: > create or replace function test1(c1 char(10), c2 varchar(20)) > Just showing that it does indeed not use the length in at all Correct. That is functioning as intended and is not likely to change any time soon. You might consider using domains: drop function if exists test1(c1 t1, c2 t2); drop table if exists test_table; drop domain if exists t1; drop domain if exists t2; create domain t1 varchar(10); create domain t2 varchar(20); create table test_table ( column1 char(20), column2 varchar(40) ) without oids; create or replace function test1(c1 t1, c2 t2) returns void as $$ BEGIN insert into test_table values ($1, $2); END $$ language plpgsql; select test1('12345678900123456789', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCD'); select * from test_table; -Kevin
Re: Re: Where is the char and varchar length in pg_catalog for function input variables
From
"David Johnston"
Date:
> -----Original Message----- > From: pgsql-general-owner@postgresql.org [mailto:pgsql-general- > owner@postgresql.org] On Behalf Of jam3 > Sent: Wednesday, September 05, 2012 3:34 PM > To: pgsql-general@postgresql.org > Subject: [GENERAL] Re: Where is the char and varchar length in pg_catalog > for function input variables > > This is what I meant to post > > .................. > > Just showing that it does indeed not use the length in at all, and this just > seems wrong. I can definetly see situations where someone would put a > length on a in put var and get an an unexpected result, like the one above. > You can argue it is wrong, and I'd tend to agree. But that is how things are until someone decides it is painful enough to implement a better way. It is a documented situation though suggestions for improvements there are always welcome. If/when you care you can implement adhoc validation inside the function. Discoverability via meta-data is the nice but lacking ability with the current model but for arbitrary length and precision/scale specifications that ability has limited (but non-zero) value. For better and worse you can "extend" the system tables and include the meta-data that you feel is necessary to make the system work. It is a much less invasive procedure than altering the catalogs themselves. David J.
Re: Re: Where is the char and varchar length in pg_catalog for function input variables
From
"David Johnston"
Date:
> > How does postgres figure this out to throw the error msg? > > > select test1('this is way way longer than 10 characters','this is way way way > way way way way way way way way way longer than 20 characters') > > ERROR: value too long for type character(10) > CONTEXT: SQL statement "insert into test_table values ($1, $2)" > PL/pgSQL function "test1" line 3 at SQL statement > > ********** Error ********** > > ERROR: value too long for type character(10) > When it goes to execute: INSERT INTO test_table ('this is way way ...', 'this is way way way...') The char(10) type definition for test_table.column1 is too short to hold the supplied value (stored in $1 in the function) and throws an error. The length of $1 and $2 inside the function are however long the input values are because they ignore the length specifier on the function call types. If you want to guarantee that the INSERT will work you would need to write: INSERT INTO test_table VALUES ( $1::char(10), $2::varchar(20) ) This tells PostgreSQL to truncate the supplied value at whatever specified length is noted; the same as writing substring($1, 1, 10)::char or substring($1, 1, 20)::varchar though whether "char" and "varchar" differ in their behavior in this respect I do not know. It is generally not recommended to use "char" David J.
Re: Re: Where is the char and varchar length in pg_catalog for function input variables
From
"Kevin Grittner"
Date:
"David Johnston" <polobo@yahoo.com> wrote: > If you want to guarantee that the INSERT will work you would need > to write: > > INSERT INTO test_table VALUES ( $1::char(10), $2::varchar(20) ) Note that this will quietly cut off the tail end of the supplied data, so it should only be used when that is desirable. It is generally better to throw an error than to lose data. > whether "char" and "varchar" differ in their behavior in this > respect I do not know. Per the SQL standard, they both throw an error on attempts to assign an oversized value, but allow truncation through explicit casts. > It is generally not recommended to use "char" Right. It is supported because the standard specifies it and its behavior, but the semantics of char(n) are weird and the performance, in PostgreSQL, is generally worse for char(n) than varchar(n) or text. -Kevin