Обсуждение: recursive text construction in plpgsql?

Поиск
Список
Период
Сортировка

recursive text construction in plpgsql?

От
Frank Miles
Дата:
The simple recursive function:

--
DROP FUNCTION testRecurse(int,int);
CREATE FUNCTION testRecurse(int,int) RETURNS text AS '
        DECLARE
                rslt                    text;
        BEGIN
                IF $1 = 0 THEN
                        rslt= CAST($2 AS TEXT);
                ELSE
                        rslt= CAST($1 AS TEXT) || '','' || testRecurse($1 - 1, $2);
                END IF;
                RETURN rslt;
        END;
' LANGUAGE 'plpgsql';
--

does not give the result I expect.  For example, for:
    SELECT testRecurse(4,3);
it seems to me that the result should be:
    4,3,2,1,3
instead of what is returned:
    1,1,1,1,3

Is this supposed to work in 7.1.3?

    -frank


Re: recursive text construction in plpgsql?

От
Tom Lane
Дата:
Frank Miles <fpm@u.washington.edu> writes:
> The simple recursive function:
> [ doesn't work ]

Hmm.  In development sources I get

regression=# SELECT testRecurse(4,3);
NOTICE:  Error occurred while executing PL/pgSQL function testrecurse
NOTICE:  line 7 at assignment
ERROR:  MemoryContextAlloc: invalid request size 2139062147

Looks like you have found a real bug, but I don't know what it is yet...

            regards, tom lane

Re: recursive text construction in plpgsql?

От
Tom Lane
Дата:
I said:
> Frank Miles <fpm@u.washington.edu> writes:
>> The simple recursive function:
>> [ doesn't work ]

> Looks like you have found a real bug, but I don't know what it is yet...

Now I do :-(.  FunctionCache needs to be a read-only data structure;
it can't contain the argument block that's built for an individual call,
because the same expression tree might be invoked recursively while
filling in the arguments for a function.  I'm surprised no one has
noticed this before.

I'll fix it for 7.2...

            regards, tom lane