diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
new file mode 100644
index 6d5b204..0abf789
*** a/src/backend/optimizer/util/clauses.c
--- b/src/backend/optimizer/util/clauses.c
*************** eval_const_expressions_mutator(Node *nod
*** 3149,3155 ****
  						newntest->arg = (Expr *) relem;
  						newntest->nulltesttype = ntest->nulltesttype;
  						newntest->argisrow = type_is_rowtype(exprType(relem));
! 						newargs = lappend(newargs, newntest);
  					}
  					/* If all the inputs were constants, result is TRUE */
  					if (newargs == NIL)
--- 3149,3160 ----
  						newntest->arg = (Expr *) relem;
  						newntest->nulltesttype = ntest->nulltesttype;
  						newntest->argisrow = type_is_rowtype(exprType(relem));
! 						/* flatten nested ROW(), e.g.  ROW(ROW(ROW(NULL))) IS NULL */
! 						if (IsA(relem, RowExpr))
! 							newargs = lappend(newargs,
! 								eval_const_expressions_mutator((Node *)newntest, context));
! 						else
! 							newargs = lappend(newargs, newntest);
  					}
  					/* If all the inputs were constants, result is TRUE */
  					if (newargs == NIL)
