Re: PQftable insufficient for primary key determination - Mailing list pgsql-general

From mmc@maruska.dyndns.org (Michal Maruška)
Subject Re: PQftable insufficient for primary key determination
Date
Msg-id m2fz7n6v58.fsf@linux11.maruska.tin.it
Whole thread Raw
In response to PQftable insufficient for primary key determination  (mmc@maruska.dyndns.org (Michal Maruška))
List pgsql-general
Tom Lane <tgl@sss.pgh.pa.us> writes:

> mmc@maruska.dyndns.org (Michal =?iso-8859-2?q?Maru=B9ka?=) writes:
>> Tom Lane <tgl@sss.pgh.pa.us> writes:
>>> The problem is you haven't said what it is you want to distinguish.
>
>> SELECT * from A, A ....
>
>> gives a result table like:
>
>> p | data | p |data |....
>> --------------------
>> 1 |  xxx | 2 | yyy | ...
>
>
>> Now you edit the value  'yyy'  and want to commit this change to the DB:
>
>> update A set data = 'zzz' where  p = primary-key-value;
>
>> How to determine what to use for 'primary-key-value'? The value from the 1st
>> column (PQftable gives A) or from the 3rd column (PQftable gives A again)?
>
> I don't think this is a well-defined problem.  What does the user think
> he's doing when he edits yyy of the join output?  There may be multiple
> copies of that value in the output table, if the row that it came from
> joined to multiple rows in the other tables.  In that case it would be
> impossible to alter a single field value without changing other rows of
> the displayed result.  So at least in the general case, I don't think
> it makes sense to allow editing of fields of join results.
>
> If you have knowledge about the form of the query that's sufficient to
> guarantee that this problem won't occur, then I'd suggest taking another
> look at that knowledge and seeing if it doesn't offer a solution.  But
> in the perfectly general form that you've stated the issue, I don't see
> a solution.

i have looked a bit at the comments in header files. I seem to understand, that
what i want is:

in SendRowDescriptionMessage()  src/backend/access/common/printtup.c

when it does
             pq_sendint(&buf, res->resorigtbl, 4);

i would like to add

     Var  *source = (Var*) ( ((TargetEntry *) lfirst(targetlist))->expr );

     pq_sendint(&buf, source->varnoold, 4);


i should probably test if the ->expr is of type  Var by looking at the  NodeTag
type;   But i don't have an idea what condition to test.


And of course i don't have an idea how to extend the protocol, to send this
value w/o breaking other things.


>             regards, tom lane

hints, please ?


pgsql-general by date:

Previous
From: Jean-Christian Imbeault
Date:
Subject: Postgres vs Sybase ASE
Next
From: Anton Nikiforov
Date:
Subject: PL/Ruby timestamp problem