Re: [HACKERS] Problem with parser - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [HACKERS] Problem with parser
Date
Msg-id 199808141926.PAA20703@candle.pha.pa.us
Whole thread Raw
In response to Problem with parser  (jwieck@debis.com (Jan Wieck))
Responses Re: [HACKERS] Problem with parser  (jwieck@debis.com (Jan Wieck))
List pgsql-hackers
> Hi,
>
>     who's the parser guru? I need help!
>
>     I have a table t1(a int4, b int4)
>
>     When I
>
>         update t1 set b = 2 where a = 1;
>
>     I get a targetlist with 1 entry and resno=2.
>
>     But when I
>
>         update t1 set b = t2.b where a = t2.a;

Is the parser code correct here?  You are actually doing:

         update t1 set b = t2.b from t2 where a = t2.a;
                                ^^^^^^^

I don't have a running system right now because of my other patch.  Can
you send me a tree pointing to the problem?  In the above example, what
is the first resno?  EXPLAIN VERBOSE should give you the plans, and dump
detailed plans into the postmaster log file.

I think I see the problem.  In MakeTargetlistExpr(), we have this code:

    /* Processes target columns that will be receiving results */
    if (pstate->p_is_insert || pstate->p_is_update)
    {
        /*
         * insert or update query -- insert, update work only on one
         * relation, so multiple occurence of same resdomno is bogus
         */
        rd = pstate->p_target_relation;
        Assert(rd != NULL);
--->    resdomno = attnameAttNum(rd, colname);
        attrisset = attnameIsSet(rd, colname);
        attrtype = attnumTypeId(rd, resdomno);
        if ((arrayRef != NIL) && (lfirst(arrayRef) == NIL))
            attrtype = GetArrayElementType(attrtype);
        attrtypmod = rd->rd_att->attrs[resdomno - 1]->atttypmod;


This looks bad to me, especially because you have a join going on in the
update.  In fact, the comment clearly shows a false assertion, that ther
is only one relation in UPDATE.

Is the update rewrite code assuming that the resdomno of an updated
column must match the attribute number?  And the join is messing this
up?



>
>     I  get the same 1 entry targetlist with resno=1 for attribute
>     "b".  That causes deep deep trouble in  the  rewrite  system,
>     when  fixing  the  expressions for *new* variable references.
>     *new*.attr defaults to *old*.attr except given in  the  query
>     to  be  updated.  When  fixing  *new* references, the rewrite
>     system looks up the original parsetree to find a TLE with the
>     same  resno as the attribute number in the *new*.attr.  So it
>     depends on having the resno same to the attno of  the  result
>     relation.
>
>     I'm  absolutely unfamiliar with the parser in this area and I
>     don't want to hack around and break things  so  close  before
>     6.4.  Who knows how to fix this?
>
>     BTW: up to now the rewrite system looks much better. It works
>     for insert, update and delete  when  using  constant  values.
>     insert ... select ... works too.
>
>
> Jan
>
> --
>
> #======================================================================#
> # It's easier to get forgiveness for being wrong than for being right. #
> # Let's break this rule - forgive me.                                  #
> #======================================== jwieck@debis.com (Jan Wieck) #
>
>
>
>


--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)

pgsql-hackers by date:

Previous
From: Linda Chow
Date:
Subject: access Postgre database through JDBC driver from Netscape FastTrack3.0.1 machine
Next
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] Problem with parser