diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c
index 506fccd20c9..3304b0ea547 100644
--- a/src/backend/optimizer/plan/analyzejoins.c
+++ b/src/backend/optimizer/plan/analyzejoins.c
@@ -29,6 +29,7 @@
 #include "optimizer/pathnode.h"
 #include "optimizer/paths.h"
 #include "optimizer/planmain.h"
+#include "optimizer/placeholder.h"
 #include "optimizer/restrictinfo.h"
 #include "utils/lsyscache.h"
 
@@ -2101,6 +2102,36 @@ match_unique_clauses(PlannerInfo *root, RelOptInfo *outer, List *uclauses,
 	return true;
 }
 
+static bool
+check_lateral_vars(PlannerInfo *root, RelOptInfo *inner, RelOptInfo *outer)
+{
+	ListCell   *lc;
+
+	foreach(lc, inner->lateral_vars)
+	{
+		Node	   *node = (Node *) lfirst(lc);
+
+		if (IsA(node, Var))
+		{
+			Var		   *var = (Var *) node;
+
+			if (var->varno == outer->relid)
+				return false;
+		}
+		else if (IsA(node, PlaceHolderVar))
+		{
+			PlaceHolderVar *phv = (PlaceHolderVar *) node;
+			PlaceHolderInfo *phinfo = find_placeholder_info(root, phv);
+
+			if (bms_is_member(outer->relid, phinfo->ph_eval_at))
+				return false;
+		}
+		else
+			Assert(false);
+	}
+	return true;
+}
+
 /*
  * Find and remove unique self joins in a group of base relations that have
  * the same Oid.
@@ -2255,6 +2286,10 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids)
 			if (!match_unique_clauses(root, inner, uclauses, outer->relid))
 				continue;
 
+			if (!check_lateral_vars(root, outer, inner) ||
+				!check_lateral_vars(root, inner, outer))
+				continue;
+
 			/*
 			 * We can remove either relation, so remove the inner one in order
 			 * to simplify this loop.
