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

Поиск
Список
Период
Сортировка
От Kenichiro Tanaka
Тема Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Дата
Msg-id 4BB9DF40.2060608@ashisuto.co.jp
обсуждение исходный текст
Ответ на How to fix set-valued function called in context that cannot accept a set in earlier versions  ("Andrus" <kobruleht2@hot.ee>)
Список 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 по дате отправления:

Предыдущее
От: hubert depesz lubaczewski
Дата:
Сообщение: Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Следующее
От: Merlin Moncure
Дата:
Сообщение: Re: How to fix set-valued function called in context that cannot accept a set in earlier versions