From: Tom Lane Date: Thu, 29 Jul 1999 03:34:11 +0000 (+0000) Subject: Back-patch fixes for CASE in WHERE join clauses. X-Git-Tag: REL6_5_2~56 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=125d46c1253d1b19bb7685c4e53134985bcc11b6;p=thirdparty%2Fpostgresql.git Back-patch fixes for CASE in WHERE join clauses. --- diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 6a680190b20..4f9e0862b2b 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -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)); diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index cc08b17bb20..38428b2e503 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -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",