Index: src/backend/optimizer/path/equivclass.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/optimizer/path/equivclass.c,v
retrieving revision 1.3
diff -c -r1.3 equivclass.c
*** src/backend/optimizer/path/equivclass.c	7 Jul 2007 20:46:45 -0000	1.3
--- src/backend/optimizer/path/equivclass.c	2 Nov 2007 11:48:12 -0000
***************
*** 373,378 ****
--- 373,388 ----
  	EquivalenceMember *newem;
  	ListCell   *lc1;
  	MemoryContext oldcontext;
+ 	Expr *stripped_expr;
+ 
+ 	/*
+ 	 * Strip any relabel nodes first; they're not meaningful
+ 	 * for ordering purposes. 
+ 	 */
+ 	if (IsA(expr, RelabelType))
+ 		stripped_expr = ((RelabelType *)expr)->arg;
+ 	else
+ 		stripped_expr = expr;
  
  	/*
  	 * Scan through the existing EquivalenceClasses for a match
***************
*** 390,395 ****
--- 400,406 ----
  		foreach(lc2, cur_ec->ec_members)
  		{
  			EquivalenceMember *cur_em = (EquivalenceMember *) lfirst(lc2);
+ 			Expr *em_expr;
  
  			/*
  			 * If below an outer join, don't match constants: they're not
***************
*** 399,406 ****
  				cur_em->em_is_const)
  				continue;
  
  			if (expr_datatype == cur_em->em_datatype &&
! 				equal(expr, cur_em->em_expr))
  				return cur_ec;					/* Match! */
  		}
  	}
--- 410,421 ----
  				cur_em->em_is_const)
  				continue;
  
+ 			em_expr = cur_em->em_expr;
+ 			if (IsA(em_expr, RelabelType))
+ 				em_expr = ((RelabelType *)em_expr)->arg;
+ 
  			if (expr_datatype == cur_em->em_datatype &&
! 				equal(stripped_expr, em_expr))
  				return cur_ec;					/* Match! */
  		}
  	}
