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

From: Kenichiro Tanaka <ketanaka(at)ashisuto(dot)co(dot)jp>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Date: 2010-04-05 13:01:52
Message-ID: 4BB9DF40.2060608@ashisuto.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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
================================================

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Merlin Moncure 2010-04-05 13:40:24 Re: How to fix set-valued function called in context that cannot accept a set in earlier versions
Previous Message hubert depesz lubaczewski 2010-04-05 11:28:37 Re: How to fix set-valued function called in context that cannot accept a set in earlier versions