Re: How to fix set-valued function called in context that cannot accept a set in earlier versions - Mailing list pgsql-general

From Kenichiro Tanaka
Subject Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Date
Msg-id 4BB9DF40.2060608@ashisuto.co.jp
Whole thread Raw
In response to How to fix set-valued function called in context that cannot accept a set in earlier versions  ("Andrus" <kobruleht2@hot.ee>)
List pgsql-general
Hello, Andrus

I tested this reproduce case.

8.3.9   return exception
8.3.10 return exception
8.4.0   Crash Server!!
8.4.1   OK
8.4.2   OK
8.4.3   OK

Just for your information,
8.4.0's clash made this call stack(I analyzed core file)

#0  DirectFunctionCall1 (func=0x8095a70 <hashoid>, arg1=16421) at
fmgr.c:1012
1012            result = (*func) (&fcinfo);
(gdb) where
#0  DirectFunctionCall1 (func=0x8095a70 <hashoid>, arg1=16421) at
fmgr.c:1012
#1  0x082c9eab in CatalogCacheComputeHashValue (cache=0xa091058,
     nkeys=<value optimized out>, cur_skey=0xbeca1298) at catcache.c:207
#2  0x082cad19 in SearchCatCache (cache=0xa091058, v1=16421, v2=0, v3=0,
v4=0)
     at catcache.c:1137
#3  0x082df1cf in fmgr_info_cxt_security (functionId=16421,
finfo=0xbeca144c,
     mcxt=<value optimized out>, ignore_security=0 '\0') at fmgr.c:209
#4  0x082df881 in fmgr_info (functionId=16421, finfo=0xbeca144c) at
fmgr.c:156
#5  0x082df282 in fmgr_info_cxt_security (functionId=43373,
finfo=0xb56c6320,
     mcxt=<value optimized out>, ignore_security=1 '\001') at fmgr.c:406
#6  0x082e0520 in fmgr_security_definer (fcinfo=0xa0e2f34) at fmgr.c:898
#7  0x082e041c in fmgr_security_definer (fcinfo=0xa0e2f34) at fmgr.c:961
#8  0x082e041c in fmgr_security_definer (fcinfo=0xa0e2f34) at fmgr.c:961

I usually see this call stack  in version 8.4.0 and I guess this error
does not occur in 8.4.1

Thank you.

(2010/04/05 20:14), Andrus wrote:
> In 8.3 code below causes exception
>
> ERROR:  set-valued function called in context that cannot accept a set
> CONTEXT:  PL/pgSQL function "wordwrap" line 21 at RETURN NEXT
>
> How to fix this so that wordwrap works in any PostgreSql 8.x version
> or at least in
> 8.3 and 8.4 ?
>
> Andrus
>
> CREATE OR REPLACE FUNCTION wordwrap(line text, linelen integer)
> RETURNS SETOF text as $$
> DECLARE
>  words text[] := string_to_array(line,' ');
>  i integer;
>  res text:='';
>
> BEGIN
>  if trim(line)='' then
>    return next '';
>    return;
>    end if;
> for i IN 1 .. array_upper(words,1) LOOP
>   if length(res)+length(words[i]) > linelen THEN
>     return next res;
>     res := '';
>     END IF ;
>   if res<>'' then
>     res := res || ' ';
>     end if;
>   res := res || words[i];
>   end loop;
> return next res;
> END
> $$ LANGUAGE plpgsql;
>
> select wordwrap('fdgdf',10)
>


--
================================================
Kenichiro Tanaka
K.K.Ashisuto
http://www.ashisuto.co.jp/english/index.html
================================================


pgsql-general by date:

Previous
From: hubert depesz lubaczewski
Date:
Subject: Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Next
From: Merlin Moncure
Date:
Subject: Re: How to fix set-valued function called in context that cannot accept a set in earlier versions