Thread: Advice needed,

Advice needed,

From
Chris
Date:
Hi all,

I've been trying to implement UPDATE and DELETE to work on subclasses.

I made some changes and it kinda seems to work. It works when I have no
WHERE condition. When I put a WHERE condition in, it seems to update the
wrong tuple, and then things go wierd...

pghack=# update a set aa='zzz' where oid=19286;
UPDATE 1
pghack=# select oid,* from a; oid  |  aa  
-------+------19286 | aaaa19285 | zzz
(2 rows)

pghack=# update a set aa='zzz' where oid=19285;
ERROR:  heap_update: (am)invalid tid
ERROR:  heap_update: (am)invalid tid
pghack=# update a set aa='zzz';
ERROR:  heap_update: (am)invalid tid
ERROR:  heap_update: (am)invalid tid

This message seems to be something to do with a tuple being in an
"Invisible" state whatever that means.

The change I made was basicly to add an "inh" parameter to
setTargetTable which I pass on down to addRangeTableEntry. From there I
expect it to be passed on to the executor and as I said it seems to work
ok without a where clause.

The patch is here. Any suggestions on where to start looking?

ftp://ftp.tech.com.au/pub/patch.only2






-- 
Chris Bitmead
mailto:chris@bitmead.com


Re: [HACKERS] Advice needed,

From
Thomas Lockhart
Date:
> I've been trying to implement UPDATE and DELETE to work on subclasses.
> The change I made was basicly to add an "inh" parameter to
> setTargetTable which I pass on down to addRangeTableEntry. From there I
> expect it to be passed on to the executor and as I said it seems to work
> ok without a where clause.

Hi Chris. I don't have time to look at you patches right now, since
I'm trying to get some syntax stuff finished up and committed. But fyi
my patches touch addRangeTableEntry and other files in the parser, so
you'll likely have a bit of a merge effort to get these sync'd back
up. Sorry :(
                    - Thomas

-- 
Thomas Lockhart                lockhart@alumni.caltech.edu
South Pasadena, California


Re: [HACKERS] Advice needed,

From
Tom Lane
Date:
Chris <chris@bitmead.com> writes:
> I've been trying to implement UPDATE and DELETE to work on subclasses.

Good!

> The change I made was basicly to add an "inh" parameter to
> setTargetTable which I pass on down to addRangeTableEntry. From there I
> expect it to be passed on to the executor and as I said it seems to work
> ok without a where clause.

Hm.  I do not believe that the executor is currently prepared to cope
with more than one target table for an UPDATE or DELETE.  You'll
probably need to do some work in execMain.c and related files.  Not
sure why it seemed to work at all...
        regards, tom lane


Re: [HACKERS] Advice needed,

From
Chris Bitmead
Date:
Tom Lane wrote:
> > The change I made was basicly to add an "inh" parameter to
> > setTargetTable which I pass on down to addRangeTableEntry. From there I
> > expect it to be passed on to the executor and as I said it seems to work
> > ok without a where clause.
> 
> Hm.  I do not believe that the executor is currently prepared to cope
> with more than one target table for an UPDATE or DELETE.  You'll
> probably need to do some work in execMain.c and related files.  Not
> sure why it seemed to work at all...

Been doing more tracing. The flow of code seems to be going the way one
might
expect.

Here is the strange thing. If I have
CREATE TABLE a (aa text);
CREATE TABLE b (bb text) inherits (a);

If I have a WHERE clause that updates at least one tuple in both a AND
b.

For example...
SELECT oid,* from ONLY a;
1234 | abcd
SELECT oid,* from ONLY b;
5678 | defg | NULL

Now if I have...
UPDATE a SET aa='zzzz' WHERE oid=1234 or oid=5678 
it works ok. or...
UPDATE a SET aa='zzzz';
it works ok.
But if I have a WHERE clause that only touches "a" table or only touches
"b"
table, it just updates the wrong stuff, but appears to work. From then
on
it doesn't work at all. 

Is there any function to print out a tuple?? I'm not sure how to do this
in the
debugger. Why can't pprint do it?