Richard Huxton wrote:
sad wrote:
Richard Huxton wrote:

Then this is the question on the execution order of the statement INSERT...SELECT...

You'll want "Overview of PostgreSQL internals" then

http://www.postgresql.org/docs/8.2/static/overview.html

What do you think should happen?

I had expected all the currval() calls to be called before all the triggers fired.

However, consider the case where your SELECT generated 100,000,000 rows but had an unacceptable value in the second row. If you assembled the result-set first then you'd have to store all those rows just to fail on the second one.

In practice, I suspect it works this way because the planner / executor arranges things in this manner for SELECT statements (so you can e.g. stop early with a LIMIT clause).

It is clear. Thnx.

However, relying on a specific order of execution (unless it's defined in the SQL standard somewhere) is probably unwise. A future optimisation might make your assumptions wrong.

That's why i'd post the question !
Trying to know if this behavior finally defined and documented.

>
Can I ask what you were trying to achieve with the currval() select + nextval() trigger combination. I've not seen that pattern before.


I'll try to describe...

There is the global ttt_id_seq for the globally unique ids for all the tables. Since all those table are inherit from one ancestor.

CREATE TABLE ttt1 (
id int primary key,
info text);

CREATE TABLE ttt (
id int primary key,
a int references ttt1(id),
info text);

CREATE TABLE ttt2 (
id int primary key,
info text);

id default value is always set by the trigger before insert on each table for each row.

The particular subproblem is to
insert one record into ttt1
and then insert corresponding record into ttt,
___This is the place to use currval.

using some data from a ttt2
___This is a place to INSERT...SELECT... from ttt2;

This works while SELECT FROM ttt2 returns exactly one row satisfying my needs.

Finally it looks like:
BEGIN;
 INSERT INTO ttt1 (....) VALUES (....);
 INSERT INTO ttt (a,info)
  SELECT currval('ttt_id_seq'), foo(info) FROM ttt2 WHERE ....;
END;

P.S.
This happened because i am constantly trying to avoid procedural code where possible to code SQL entirely.



---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to