mirror of
https://github.com/postgres/postgres.git
synced 2026-04-23 23:28:01 -04:00
Back-patch fixes for CASE in WHERE join clauses.
This commit is contained in:
parent
c7092a8e8f
commit
125d46c125
2 changed files with 65 additions and 2 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue