diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc
index 6080717e5f5..9b3efb554de 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -2885,12 +2885,49 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx,
           emb_sj_nest->sj_inner_tables & ~new_join_tab->table->map))
       join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
   }
+#ifndef DBUG_OFF
+  join->dbug_verify_sj_inner_tables(idx + 1);
+#endif
+
 
   pos->prefix_cost.convert_from_cost(*current_read_time);
   pos->prefix_record_count= *current_record_count;
   pos->dups_producing_tables= dups_producing_tables;
 }
 
+#ifndef DBUG_OFF
+/*
+  Verify the value of JOIN::cur_sj_inner_tables by recomputing it
+*/
+bool JOIN::dbug_verify_sj_inner_tables(uint prefix_size) const
+{
+  table_map cur_map= const_table_map;
+  table_map nests_entered= 0;
+  if (emb_sjm_nest)
+  {
+    DBUG_ASSERT(cur_sj_inner_tables == 0);
+    return (cur_sj_inner_tables == 0);
+  }
+
+  for (uint i= const_tables; i < prefix_size; i++)
+  {
+    JOIN_TAB *tab= positions[i].table;
+    cur_map |= tab->table->map;
+    if (TABLE_LIST *sj_nest= tab->emb_sj_nest)
+    {
+      nests_entered |= sj_nest->sj_inner_tables;
+      if (!(sj_nest->sj_inner_tables & ~cur_map))
+      {
+        // all nest tables are in the prefix already
+        nests_entered &= ~sj_nest->sj_inner_tables;
+      }
+    }
+  }
+  DBUG_ASSERT(nests_entered == cur_sj_inner_tables);
+  return (nests_entered == cur_sj_inner_tables);
+}
+#endif
+ 
 
 void Sj_materialization_picker::set_from_prev(struct st_position *prev)
 {
@@ -3428,6 +3465,10 @@ void restore_prev_sj_state(const table_map remaining_tables,
       tab->join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
     }
   }
+#ifndef DBUG_OFF
+  /* positions[idx] has been removed. Verify the state for [0...idx-1]  */
+  tab->join->dbug_verify_sj_inner_tables(idx);
+#endif
 }
 
 
diff --git a/sql/sql_select.h b/sql/sql_select.h
index b37c62a4e51..12bcbfe901e 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -1262,6 +1262,9 @@ class JOIN :public Sql_alloc
   */
   table_map cur_sj_inner_tables;
   
+#ifndef DBUG_OFF
+  bool dbug_verify_sj_inner_tables(uint n_positions) const;
+#endif
   /* We also maintain a stack of join optimization states in * join->positions[] */
 /******* Join optimization state members end *******/
 
