         if (err != GDF_SUCCESS) { return err; }
     }
 
-    gdf_table<size_type> j_i_table(ljoincol.size(), ljoincol.data());
-    gdf_table<size_type> j_table(num_cols_to_join, result_cols + left_table_end);
-    err = j_i_table.gather(static_cast<index_type*>(left_indices->data),
-            j_table, join_type != JoinType::INNER_JOIN);
+    //Construct the joined columns
+    if (0 != ljoincol.size()) {
+        gdf_table<size_type> j_i_table(ljoincol.size(), ljoincol.data());
+        gdf_table<size_type> j_table(num_cols_to_join, result_cols + left_table_end);
+        //Full Join left indices need to be fixed before calling gather
+        if (JoinType::FULL_JOIN == join_type) {
+            gdf_table<size_type> j_i_r_table(rjoincol.size(), rjoincol.data());
+            err = j_i_r_table.gather(static_cast<index_type*>(right_indices->data),
+                    j_table, join_type != JoinType::INNER_JOIN);
+        }
+        err = j_i_table.gather(static_cast<index_type*>(left_indices->data),
+                j_table, join_type != JoinType::INNER_JOIN);
+    }
 
 	POP_RANGE();
     return err;

    }

    gdf_error err{GDF_SUCCESS};
    if (0 != lnonjoincol.size()) {
        gdf_table<size_type> l_i_table(lnonjoincol.size(), lnonjoincol.data());
        gdf_table<size_type> l_table(num_left_cols - num_cols_to_join, result_cols);

    }
    //TODO : Invalid api

    size_type join_size = left_indices->size;
    int left_table_end = num_left_cols - num_cols_to_join;
    int right_table_begin = num_left_cols;

