Fixed a bug in partitioned NLJ.
diff --git a/query_optimizer/tests/execution_generator/Partition.test b/query_optimizer/tests/execution_generator/Partition.test
index 5d44164..da9b6b8 100644
--- a/query_optimizer/tests/execution_generator/Partition.test
+++ b/query_optimizer/tests/execution_generator/Partition.test
@@ -226,7 +226,42 @@
 +-----------+------------------------+
 ==
 
-# Partitioned NestedLoopsJoin
+# Partitioned NestedLoopsJoin w/ both stored relations.
+SELECT COUNT(*)
+FROM dim_4_hash_partitions, fact;
+--
++--------------------+
+|COUNT(*)            |
++--------------------+
+|                 220|
++--------------------+
+==
+
+# Partitioned NestedLoopsJoin w/ one stored relation.
+SELECT COUNT(*)
+FROM dim_4_hash_partitions, fact
+WHERE dim_4_hash_partitions.id > 20;
+--
++--------------------+
+|COUNT(*)            |
++--------------------+
+|                  20|
++--------------------+
+==
+
+# Partitioned NestedLoopsJoin w/ the other stored relation.
+SELECT COUNT(*)
+FROM dim_4_hash_partitions, fact
+WHERE fact.id > 0;
+--
++--------------------+
+|COUNT(*)            |
++--------------------+
+|                 220|
++--------------------+
+==
+
+# Partitioned NestedLoopsJoin w/ both non-stored relations.
 SELECT dim_4_hash_partitions.id as dim_id, fact.id as fact_id
 FROM dim_4_hash_partitions, fact
 WHERE dim_4_hash_partitions.id > 20 AND fact.id > 0;
diff --git a/relational_operators/NestedLoopsJoinOperator.cpp b/relational_operators/NestedLoopsJoinOperator.cpp
index 121b1c3..658f84b 100644
--- a/relational_operators/NestedLoopsJoinOperator.cpp
+++ b/relational_operators/NestedLoopsJoinOperator.cpp
@@ -63,7 +63,7 @@
 
     for (partition_id part_id = 0; part_id < num_partitions_; ++part_id) {
       for (const block_id left_block_id : left_relation_block_ids_[part_id]) {
-        for (const block_id right_block_id : right_relation_block_ids_[part_id]) {
+        for (const block_id right_block_id : right_relation_block_ids_) {
           container->addNormalWorkOrder(
               new NestedLoopsJoinWorkOrder(
                   query_id_,
@@ -89,7 +89,7 @@
       std::vector<block_id>::size_type new_left_blocks
           = left_relation_block_ids_[part_id].size() - num_left_workorders_generated_[part_id];
       std::vector<block_id>::size_type new_right_blocks
-          = right_relation_block_ids_[part_id].size() - num_right_workorders_generated_[part_id];
+          = right_relation_block_ids_.size() - num_right_workorders_generated_[part_id];
 
       std::size_t new_workorders = 0;
       if (new_left_blocks > 0 && new_right_blocks > 0) {
@@ -102,7 +102,7 @@
                                                              0,
                                                              left_relation_block_ids_[part_id].size(),
                                                              num_right_workorders_generated_[part_id],
-                                                             right_relation_block_ids_[part_id].size());
+                                                             right_relation_block_ids_.size());
 
         // Now generate new_left_blocks * (right).
         new_workorders += getAllWorkOrdersHelperBothNotStored(container,
@@ -122,7 +122,7 @@
                                                              0,
                                                              left_relation_block_ids_[part_id].size(),
                                                              num_right_workorders_generated_[part_id],
-                                                             right_relation_block_ids_[part_id].size());
+                                                             right_relation_block_ids_.size());
       } else if (new_left_blocks > 0 && new_right_blocks == 0) {
         // Generate new_left_blocks * right
         new_workorders = getAllWorkOrdersHelperBothNotStored(container,
@@ -132,11 +132,11 @@
                                                              num_left_workorders_generated_[part_id],
                                                              left_relation_block_ids_[part_id].size(),
                                                              0,
-                                                             right_relation_block_ids_[part_id].size());
+                                                             right_relation_block_ids_.size());
       }
       if (new_workorders > 0) {
         num_left_workorders_generated_[part_id] = left_relation_block_ids_[part_id].size();
-        num_right_workorders_generated_[part_id] = right_relation_block_ids_[part_id].size();
+        num_right_workorders_generated_[part_id] = right_relation_block_ids_.size();
       }
     }
     return done_feeding_left_relation_ && done_feeding_right_relation_;
@@ -155,7 +155,7 @@
 
     for (partition_id part_id = 0; part_id < num_partitions_; ++part_id) {
       for (const block_id left_block_id : left_relation_block_ids_[part_id]) {
-        for (const block_id right_block_id : right_relation_block_ids_[part_id]) {
+        for (const block_id right_block_id : right_relation_block_ids_) {
           container->addWorkOrderProto(createWorkOrderProto(part_id, left_block_id, right_block_id),
                                        op_index_);
         }
@@ -169,7 +169,7 @@
       const std::vector<block_id>::size_type new_left_blocks
           = left_relation_block_ids_[part_id].size() - num_left_workorders_generated_[part_id];
       const std::vector<block_id>::size_type new_right_blocks
-          = right_relation_block_ids_[part_id].size() - num_right_workorders_generated_[part_id];
+          = right_relation_block_ids_.size() - num_right_workorders_generated_[part_id];
 
       std::size_t new_workorders = 0;
       if (new_left_blocks > 0 && new_right_blocks > 0) {
@@ -181,7 +181,7 @@
                                                      0,
                                                      left_relation_block_ids_[part_id].size(),
                                                      num_right_workorders_generated_[part_id],
-                                                     right_relation_block_ids_[part_id].size());
+                                                     right_relation_block_ids_.size());
 
         // Now generate new_left_blocks * (right).
         new_workorders +=
@@ -199,7 +199,7 @@
                                                      0,
                                                      left_relation_block_ids_[part_id].size(),
                                                      num_right_workorders_generated_[part_id],
-                                                     right_relation_block_ids_[part_id].size());
+                                                     right_relation_block_ids_.size());
       } else if (new_left_blocks > 0 && new_right_blocks == 0) {
         // Generate new_left_blocks * right
         new_workorders =
@@ -208,11 +208,11 @@
                                                      num_left_workorders_generated_[part_id],
                                                      left_relation_block_ids_[part_id].size(),
                                                      0,
-                                                     right_relation_block_ids_[part_id].size());
+                                                     right_relation_block_ids_.size());
       }
       if (new_workorders > 0) {
         num_left_workorders_generated_[part_id] = left_relation_block_ids_[part_id].size();
-        num_right_workorders_generated_[part_id] = right_relation_block_ids_[part_id].size();
+        num_right_workorders_generated_[part_id] = right_relation_block_ids_.size();
       }
     }
     return done_feeding_left_relation_ && done_feeding_right_relation_;
@@ -247,7 +247,7 @@
               right_input_relation_,
               part_id,
               left_relation_block_ids_[part_id][left_index],
-              right_relation_block_ids_[part_id][right_index],
+              right_relation_block_ids_[right_index],
               query_context->getPredicate(join_predicate_index_),
               query_context->getScalarGroup(selection_index_),
               query_context->getInsertDestination(output_destination_index_),
@@ -274,7 +274,7 @@
   if (left_relation_is_stored_) {
     for (partition_id part_id = 0; part_id < num_partitions_; ++part_id) {
       for (std::vector<block_id>::size_type right_index = num_right_workorders_generated_[part_id];
-           right_index < right_relation_block_ids_[part_id].size();
+           right_index < right_relation_block_ids_.size();
            ++right_index) {
         for (const block_id left_block_id : left_relation_block_ids_[part_id]) {
           container->addNormalWorkOrder(
@@ -284,7 +284,7 @@
                   right_input_relation_,
                   part_id,
                   left_block_id,
-                  right_relation_block_ids_[part_id][right_index],
+                  right_relation_block_ids_[right_index],
                   join_predicate,
                   selection,
                   output_destination,
@@ -292,7 +292,7 @@
               op_index_);
         }
       }
-      num_right_workorders_generated_[part_id] = right_relation_block_ids_[part_id].size();
+      num_right_workorders_generated_[part_id] = right_relation_block_ids_.size();
     }
     return done_feeding_right_relation_;
   } else {
@@ -300,7 +300,7 @@
       for (std::vector<block_id>::size_type left_index = num_left_workorders_generated_[part_id];
            left_index < left_relation_block_ids_[part_id].size();
            ++left_index) {
-        for (const block_id right_block_id : right_relation_block_ids_[part_id]) {
+        for (const block_id right_block_id : right_relation_block_ids_) {
           container->addNormalWorkOrder(
               new NestedLoopsJoinWorkOrder(query_id_,
                                            left_input_relation_,
@@ -340,7 +340,7 @@
          ++right_index) {
       container->addWorkOrderProto(
           createWorkOrderProto(part_id, left_relation_block_ids_[part_id][left_index],
-                               right_relation_block_ids_[part_id][right_index]),
+                               right_relation_block_ids_[right_index]),
           op_index_);
     }
   }
@@ -354,15 +354,15 @@
   if (left_relation_is_stored_) {
     for (partition_id part_id = 0; part_id < num_partitions_; ++part_id) {
       for (std::vector<block_id>::size_type right_index = num_right_workorders_generated_[part_id];
-           right_index < right_relation_block_ids_[part_id].size();
+           right_index < right_relation_block_ids_.size();
            ++right_index) {
         for (const block_id left_block_id : left_relation_block_ids_[part_id]) {
           container->addWorkOrderProto(
-              createWorkOrderProto(part_id, left_block_id, right_relation_block_ids_[part_id][right_index]),
+              createWorkOrderProto(part_id, left_block_id, right_relation_block_ids_[right_index]),
               op_index_);
         }
       }
-      num_right_workorders_generated_[part_id] = right_relation_block_ids_[part_id].size();
+      num_right_workorders_generated_[part_id] = right_relation_block_ids_.size();
     }
     return done_feeding_right_relation_;
   } else {
@@ -370,7 +370,7 @@
       for (std::vector<block_id>::size_type left_index = num_left_workorders_generated_[part_id];
            left_index < left_relation_block_ids_[part_id].size();
            ++left_index) {
-        for (const block_id right_block_id : right_relation_block_ids_[part_id]) {
+        for (const block_id right_block_id : right_relation_block_ids_) {
           container->addWorkOrderProto(
               createWorkOrderProto(part_id, left_relation_block_ids_[part_id][left_index], right_block_id),
               op_index_);
diff --git a/relational_operators/NestedLoopsJoinOperator.hpp b/relational_operators/NestedLoopsJoinOperator.hpp
index 5960b81..a379c17 100644
--- a/relational_operators/NestedLoopsJoinOperator.hpp
+++ b/relational_operators/NestedLoopsJoinOperator.hpp
@@ -113,7 +113,8 @@
         left_relation_is_stored_(left_relation_is_stored),
         right_relation_is_stored_(right_relation_is_stored),
         left_relation_block_ids_(num_partitions),
-        right_relation_block_ids_(num_partitions),
+        right_relation_block_ids_(right_relation_is_stored ? right_input_relation_.getBlocksSnapshot()
+                                                           : std::vector<block_id>()),
         num_left_workorders_generated_(num_partitions),
         num_right_workorders_generated_(num_partitions),
         done_feeding_left_relation_(false),
@@ -133,21 +134,6 @@
         left_relation_block_ids_[0] = left_input_relation_.getBlocksSnapshot();
       }
     }
-
-    if (right_relation_is_stored) {
-      if (right_input_relation_.hasPartitionScheme()) {
-        const PartitionScheme &part_scheme = *right_input_relation_.getPartitionScheme();
-        DCHECK_EQ(num_partitions_, part_scheme.getPartitionSchemeHeader().getNumPartitions());
-        for (std::size_t part_id = 0; part_id < num_partitions_; ++part_id) {
-          right_relation_block_ids_[part_id] = part_scheme.getBlocksInPartition(part_id);
-        }
-      } else {
-        // Broadcast right (smaller) side upon partitioned nlj.
-        for (partition_id part_id = 0; part_id < num_partitions_; ++part_id) {
-          right_relation_block_ids_[part_id] = right_input_relation_.getBlocksSnapshot();
-        }
-      }
-    }
   }
 
   ~NestedLoopsJoinOperator() override {}
@@ -183,10 +169,7 @@
     if (input_relation_id == left_input_relation_.getID()) {
       left_relation_block_ids_[part_id].push_back(input_block_id);
     } else if (input_relation_id == right_input_relation_.getID()) {
-      // Broadcast right (smaller) side upon partitioned nlj.
-      for (partition_id input_part_id = 0; input_part_id < num_partitions_; ++input_part_id) {
-        right_relation_block_ids_[input_part_id].push_back(input_block_id);
-      }
+      right_relation_block_ids_.push_back(input_block_id);
     } else {
       LOG(FATAL) << "The input block sent to the NestedLoopsJoinOperator belongs "
                  << "to a different relation than the left and right relations";
@@ -315,7 +298,7 @@
   const bool right_relation_is_stored_;
 
   std::vector<BlocksInPartition> left_relation_block_ids_;
-  std::vector<BlocksInPartition> right_relation_block_ids_;
+  std::vector<block_id> right_relation_block_ids_;
 
   // At a given point of time, we have paired num_left_workorders_generated[part_id]
   // number of blocks from the left relation with num_right_workorders_generated[part_id]