]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Back-patch fixes for CASE in WHERE join clauses.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Jul 1999 03:34:11 +0000 (03:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Jul 1999 03:34:11 +0000 (03:34 +0000)
src/backend/nodes/equalfuncs.c
src/backend/optimizer/plan/createplan.c

index 6a680190b201c9b56a09a547bce456b94a8ca7a1..4f9e0862b2b95d0fb5d2ce2c38caef1adb036b25 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.39 1999/06/06 17:46:40 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.39.2.1 1999/07/29 03:34:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -706,6 +706,32 @@ _equalTargetEntry(TargetEntry *a, TargetEntry *b)
        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
  */
@@ -874,6 +900,12 @@ equal(void *a, void *b)
                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 know whether nodes of type %d are equal",
                                 nodeTag(a));
index cc08b17bb2003effd9535f866457a4f29e078cd2..38428b2e503860f7b2f4f86fb616bc5dbbedf00e 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.57 1999/05/25 22:41:38 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.57.2.1 1999/07/29 03:34:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -746,6 +746,37 @@ fix_indxqual_references(Node *clause, Path *index_path)
 
                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",