| From: | jwieck(at)debis(dot)com (Jan Wieck) | 
|---|---|
| To: | lockhart(at)alumni(dot)caltech(dot)edu (Thomas G(dot) Lockhart) | 
| Cc: | jwieck(at)debis(dot)com, pgsql-hackers(at)postgresql(dot)org | 
| Subject: | Re: [HACKERS] CREATE FUNCTION broken | 
| Date: | 1998-02-13 15:34:51 | 
| Message-ID: | m0y3N8f-000BFRC@orion.SAPserv.Hamburg.dsh.de | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Tom wrote:
>
> >     Someone changed the parser to build a TypeName node on CREATE
> >     FUNCTION in any  case.  As  a  side  effect,  ALL!  functions
> >     created  got  the  proretset  attribute  to  true. Thus for a
> >     SELECT the parser wrapped an Iter node around  the  Expr  and
> >     since  singleton  functions  set  isDone  the Iter returns no
> >     tuple up.
>
> Ah. I broke it (though the regression tests did not find the problem). What
> I changed was the code in gram.y, which used to just create a string node
> for the return type clause _unless_ the return type was a "SETOF type". In
> that case a Typename node was created, and the setof attribute was
> explicitly set.
>
> What you found is that farther along, the setof attribute was forced to be
> true if _any_ Typename node is present.
    Haven't spend time to analyze if other places might have been
    affected by that - just thought we should  trust  the  parser
    about  the  SETOF flag in TypeName node instead of knowing it
    better deep down in the utility commands.
;-)
>
> It looks like your patch will completely fix things, and is better than my
> reverting the gram.y code. Can you suggest a small test case to include in
> the regression suite?
Small test case - hmmm.
    The regression tests found it - but you  wouldn't  expect  it
    there.  It's in the trigger test, where at some places SELECT
    set_ttdummy(0) returns 0 columns instead of one.
    Anyway - add a  little  function  in  regress.c  returning  a
    basetype value. Then add tests that use it in SELECT queries.
    int32
    allways_one()
    {
        return 1;
    }
SELECT allways_one() AS one;
SELECT a, allways_one() AS one FROM t;
>
> Unless there are objections from others (with a preference for reverting
> the gram.y code) I'll go ahead and apply Jan's patch.
    Even if reverting the gram.y code - my patch could only  make
    things better.
Until later, Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#======================================== jwieck(at)debis(dot)com (Jan Wieck) #
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Thomas G. Lockhart | 1998-02-13 16:08:45 | v6.3 release ToDo list and supported ports | 
| Previous Message | Thomas G. Lockhart | 1998-02-13 15:33:36 | Re: [HACKERS] postgres initdb on ALPHA/Digital Unix |