Bugs in parse_func.c ? - Mailing list pgsql-hackers

From Hiroshi Inoue
Subject Bugs in parse_func.c ?
Date
Msg-id 001501be1ea4$8b7ac020$2801007e@cadzone.tpf.co.jp
Whole thread Raw
Responses Re: [HACKERS] Projecting attributes of function return values
List pgsql-hackers
Hi all

I found 2 BUGs ? caused by ParseComplexProject() function  in parse_func.c.

The result of the following cases are different from the design 
of ParseComplexProject() in parse_func.c ?

1. Projecting attributes of function return values never execute   right operations.   create table a (elem int4);
createfunction ax2(int4) returns a as  'select $1*2;'  language 'sql';  select elem(ax2(1));  the result is  elem  ----
   4  (1 row)  It's wrong.  PostgreSQL executor evaluates functions twice.  After applying patch the result is the
following elem  ----     2  (1 row)
 
2.PostgreSQL parser rejects functions unnecessarily create function elemout(a) returns int4 as 'select $1.elem;'
language'sql'; select elemout(ax2(1)); ERROR:  Function 'elemout' has bad return type 315169
 
 This rejection by elog() is necessary ? I removed it and the result is elemout -------       2 (1 row)


I posted a patch for these cases (Subject:Projecting attributes 
of function return values)  a few days ago.
The same patch is at the end of this posting.

If   those cases are BUGs,please confirm my patch.

Thanks

Hiroshi Inoue
Inoue@tpf.co.jp

*** backend/parser/parse_func.c.orig    Thu Dec  3 18:25:31 1998
--- backend/parser/parse_func.c    Thu Dec  3 18:39:18 1998
***************
*** 1352,1358 ****                         newexpr->typeOid = funcnode->functype;
newexpr->opType= FUNC_EXPR;                         newexpr->oper = (Node *) funcnode;
 
!                         newexpr->args = lcons(first_arg, NIL);                          return (Node *) newexpr;
              }
 
--- 1352,1358 ----                         newexpr->typeOid = funcnode->functype;
newexpr->opType= FUNC_EXPR;                         newexpr->oper = (Node *) funcnode;
 
!                         newexpr->args = expr->args;                          return (Node *) newexpr;
   }
 
***************
*** 1359,1366 ****                  } 
-                 elog(ERROR, "Function '%s' has bad return type %d",
-                      funcname, argtype);                 break;             }         case T_Param:
--- 1359,1364 ----






pgsql-hackers by date:

Previous
From: "Thomas G. Lockhart"
Date:
Subject: OID min/max functions
Next
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] isnull() or is it?t