Thread: Re: Number of parameters in a sql function

Re: Number of parameters in a sql function

From
Tom Lane
Date:
"Stan Ng" <stan@squaresoft.com> writes:
> I'm running into a limit problem with CREATE FUNCTION. Whenever I exceed
> the limit on parameters, somewhere around 12 for me, psql bombs on me
> with the "pqReadData() -- backend closed the channel unexpectedly" error
> message.  Is there any way to increase the parameter limit for
> functions?

It shouldn't be letting you get that high; the system limit is 8
parameters for a function.  (It looks to me like parse_func.c should
be, but is failing to, verify that the length of the parameter lists
it is passed are within bounds --- or else gram.y itself should complain
if the list is overlength.)

Increasing the limit would be rather a major project I suspect.
A quick look around the sources found a lot of dependencies, some
being symbolic constants (not all the same one :-() and some being
hard coded "8"s.  Ick.  Also, you would certainly be facing an initdb
and database reload, because the number of argument-type columns in
pg_proc would have to increase.

It'd be good to clean this up and replace pg_proc's fixed-size
proargtypes column with a variable-size "array of oid" column.
Any volunteers?

            regards, tom lane

Re: [HACKERS] Re: Number of parameters in a sql function

From
Bruce Momjian
Date:
Looks like this was fixed, because we now generate an error:

test=> create function klasd (int, int, int, int, int, int, int, int,
int) returns int as 'asdf' language 'c';
ERROR:  Procedures cannot take more than 8 arguments


> "Stan Ng" <stan@squaresoft.com> writes:
> > I'm running into a limit problem with CREATE FUNCTION. Whenever I exceed
> > the limit on parameters, somewhere around 12 for me, psql bombs on me
> > with the "pqReadData() -- backend closed the channel unexpectedly" error
> > message.  Is there any way to increase the parameter limit for
> > functions?
> 
> It shouldn't be letting you get that high; the system limit is 8
> parameters for a function.  (It looks to me like parse_func.c should
> be, but is failing to, verify that the length of the parameter lists
> it is passed are within bounds --- or else gram.y itself should complain
> if the list is overlength.)
> 
> Increasing the limit would be rather a major project I suspect.
> A quick look around the sources found a lot of dependencies, some
> being symbolic constants (not all the same one :-() and some being
> hard coded "8"s.  Ick.  Also, you would certainly be facing an initdb
> and database reload, because the number of argument-type columns in
> pg_proc would have to increase.
> 
> It'd be good to clean this up and replace pg_proc's fixed-size
> proargtypes column with a variable-size "array of oid" column.
> Any volunteers?
> 
>             regards, tom lane
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [HACKERS] Re: Number of parameters in a sql function

From
Tom Lane
Date:
Bruce Momjian <maillist@candle.pha.pa.us> writes:
> Looks like this was fixed, because we now generate an error:
> test=> create function klasd (int, int, int, int, int, int, int, int,
> int) returns int as 'asdf' language 'c';
> ERROR:  Procedures cannot take more than 8 arguments

I'm not sure if this is a sufficient defense or not --- IIRC, there were
places in the parser that stuffed info into size-8 arrays without any
nearby check that no more than 8 items would be forthcoming.  Offhand
the obvious try doesn't crash it:

regression=> select foo(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
ERROR:  No such function 'foo' with the specified attributes

but I am hoping to go back and look more carefully.
        regards, tom lane