diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 1999-07-29 02:48:05 +0000 | 
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 1999-07-29 02:48:05 +0000 | 
| commit | ecbfafbe0e80860ba1667438eb71865d72e4c4b0 (patch) | |
| tree | 33d777e81bb8c93a6c66a7e7f316631cfb3d347e /src/backend/optimizer/plan/createplan.c | |
| parent | 6b157f376a52edd14d63b7826bdc299645832610 (diff) | |
Add support for Case exprs to fix_indxqual_references,
so that Case works in WHERE join clauses.  Temporary patch --- this routine
is one of many that ought to be changed to use centralized expression-tree-
walking logic.
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
| -rw-r--r-- | src/backend/optimizer/plan/createplan.c | 33 | 
1 files changed, 32 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 18837cf2824..a358308a468 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.64 1999/07/27 03:51:03 tgl Exp $ + *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.65 1999/07/29 02:48:05 tgl Exp $   *   *-------------------------------------------------------------------------   */ @@ -740,6 +740,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",  | 
