Обсуждение: recursive text construction in plpgsql?
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
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
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