Re: functions returning records

From: Jan Wieck <JanWieck(at)Yahoo(dot)com>
To: Jan Wieck <JanWieck(at)Yahoo(dot)com>
Cc: Alex Pilosov <alex(at)pilosoft(dot)com>, Hannu Krosing <hannu(at)tm(dot)ee>, pgsql-hackers(at)PostgreSQL(dot)org
Subject: Re: functions returning records
Date: 2001-06-28 12:40:29
Message-ID: 200106281240.f5SCeTG21354@jupiter.us.greatbridge.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Jan Wieck wrote:
> Alex Pilosov wrote:
> > On Wed, 27 Jun 2001, Jan Wieck wrote:
> >
> > > Alex Pilosov wrote:
> > > > On Thu, 28 Jun 2001, Hannu Krosing wrote:
> > > > >
> > > > > How hard would it be to turn this around and implement RETURN AND
> > > > > CONTINUE
> > > > > for at least PL/PGSQL, and possibly C/Perl/Python ... ?
> > > > Cannot talk about plpgsql, but for c this would be probably implemented
> > > > with setjmp and with perl with goto. Probably not very complex.
> > >
> > > Don't think so. When the function returns, the call stack
> > > get's destroyed. Jumping back to there - er - the core dump
> > > is not even useful any more. Or did I miss something?
> >
> > Well, it shouldn't return, but instead save the location and longjmp to
> > SPI_RESUME_jmp location. On a next call, instead of a function call, it
> > should longjmp back to saved location. I have to admit its more complex
> > than I originally thought, but probably doable.
>
> OK, let's screw it up some more:
>
> SELECT F.a, B.b FROM foo() F, bar() B
> WHERE F.a = B.a;
>
> This should normally result in a merge join, so you might get
> away with longjmp's. But you get the idea.

On a third thought, you don't get anywhere with longjmp's.
You have a call stack, do a setjmp() saving the stack
pointer. Then you call the function, do another setjmp() here
and do the longjmp() to #1. This restores the saved stack
pointer, so at the very first time you do any other function
call (lib calls included), you corrupt the stack frame at the
current stack pointer position. If you later jump back to
setjmp() #2 location, you'll not be able to return.

You can only drop stack frames safely, you can't add them
back, they aren't saved.

Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck(at)Yahoo(dot)com #

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Ilan Fait 2001-06-28 14:45:49 examine the PostgerSQL database
Previous Message Frank Ch. Eigler 2001-06-28 12:27:26 Re: functions returning records