diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
new file mode 100644
index 76c032c..54e59dc
*** a/src/backend/optimizer/util/clauses.c
--- b/src/backend/optimizer/util/clauses.c
*************** eval_const_expressions_mutator(Node *nod
*** 3100,3105 ****
--- 3100,3122 ----
  								return makeBoolConst(false, false);
  							continue;
  						}
+ 
+ 						/* Do we have a ROW() expression in the row? */
+ 						if (type_is_rowtype(exprType(relem)))
+ 						{
+ 							/*
+ 							 * If this ROW() has an embedded ROW() value,
+ 							 * our optimization  of removing a level of ROW()
+ 							 * nesting causes ROW(ROW(NULL)) IS NULL to return
+ 							 * true, so just return the original clause.
+ 							 */
+ 							newntest = makeNode(NullTest);
+ 							newntest->arg = (Expr *) arg;
+ 							newntest->nulltesttype = ntest->nulltesttype;
+ 							newntest->argisrow = ntest->argisrow;
+ 							return (Node *) newntest;
+ 						}
+ 
  						newntest = makeNode(NullTest);
  						newntest->arg = (Expr *) relem;
  						newntest->nulltesttype = ntest->nulltesttype;
