Re: [SQL] COALESCE() bug? - Mailing list pgsql-sql

From Tom Lane
Subject Re: [SQL] COALESCE() bug?
Date
Msg-id 29428.933220072@sss.pgh.pa.us
Whole thread Raw
In response to Re: [SQL] COALESCE() bug?  (Bruce Momjian <maillist@candle.pha.pa.us>)
List pgsql-sql
Bruce Momjian <maillist@candle.pha.pa.us> writes:
>> Jens Glaser <jens@helena.jens.de> writes:
>>>> the following SQL statement gives an error:
>>>> ERROR:  fix_indxqual_references: Cannot handle node type 723
>> 
>> Interesting.  I wouldn't have thought 6.5 would try to use an index
>> with an expression involving COALESCE().  Evidently it does.

> Let me know if this is a TODO item.  Sounds interesting.

It's not a TODO item any more ;-).  Not really all that interesting
--- just another routine that didn't know about all the expression node
types it should have.  I am planning a sweep to catch all of these
guys and reduce them to calls of centralized tree-walker routines,
so that future addition of node types shouldn't be quite so painful.

In the meantime, I have fixed the problem via brute-force addition
of code in both the current and 6.5 CVS branches.  Since there may
or may not be a 6.5.2 release, I attach a diff against 6.5.1 code
for anyone who needs to patch this problem locally.
        regards, tom lane


*** src/backend/optimizer/plan/createplan.c.orig    Tue May 25 18:41:38 1999
--- src/backend/optimizer/plan/createplan.c    Wed Jul 28 23:08:35 1999
***************
*** 746,751 ****
--- 746,782 ----          return (Node *) newnode;     }
+     else if (IsA(clause, CaseExpr))
+     {
+         CaseExpr   *oldnode = (CaseExpr *) clause;
+         CaseExpr   *newnode = makeNode(CaseExpr);
+ 
+         newnode->casetype = oldnode->casetype;
+         newnode->arg = oldnode->arg;    /* XXX should always be null
+                                          * anyway ... */
+         newnode->args = (List *)
+             fix_indxqual_references((Node *) oldnode->args,
+                                     index_path);
+         newnode->defresult =
+             fix_indxqual_references(oldnode->defresult,
+                                     index_path);
+ 
+         return (Node *) newnode;
+     }
+     else if (IsA(clause, CaseWhen))
+     {
+         CaseWhen   *oldnode = (CaseWhen *) clause;
+         CaseWhen   *newnode = makeNode(CaseWhen);
+ 
+         newnode->expr =
+             fix_indxqual_references(oldnode->expr,
+                                     index_path);
+         newnode->result =
+             fix_indxqual_references(oldnode->result,
+                                     index_path);
+ 
+         return (Node *) newnode;
+     }     else     {         elog(ERROR, "fix_indxqual_references: Cannot handle node type %d",
*** src/backend/nodes/equalfuncs.c.orig    Sun Jun  6 13:46:40 1999
--- src/backend/nodes/equalfuncs.c    Wed Jul 28 23:07:56 1999
***************
*** 706,711 ****
--- 706,737 ----     return true; } 
+ static bool
+ _equalCaseExpr(CaseExpr *a, CaseExpr *b)
+ {
+     if (a->casetype != b->casetype)
+         return false;
+     if (!equal(a->arg, b->arg))
+         return false;
+     if (!equal(a->args, b->args))
+         return false;
+     if (!equal(a->defresult, b->defresult))
+         return false;
+ 
+     return true;
+ }
+ 
+ static bool
+ _equalCaseWhen(CaseWhen *a, CaseWhen *b)
+ {
+     if (!equal(a->expr, b->expr))
+         return false;
+     if (!equal(a->result, b->result))
+         return false;
+ 
+     return true;
+ }
+  /*  * Stuff from pg_list.h  */
***************
*** 873,878 ****
--- 899,910 ----             break;         case T_TargetEntry:             retval = _equalTargetEntry(a, b);
+             break;
+         case T_CaseExpr:
+             retval = _equalCaseExpr(a, b);
+             break;
+         case T_CaseWhen:
+             retval = _equalCaseWhen(a, b);             break;         default:             elog(NOTICE, "equal: don't
knowwhether nodes of type %d are equal",
 


pgsql-sql by date:

Previous
From: Thomas Lockhart
Date:
Subject: Re: [SQL] WHERE parent IN (0,-1)
Next
From: "Zot O'Connor"
Date:
Subject: Re: Subject: Form making with psql and php.cgi