function checkEvalRelations_OuterJoin_NullableKeys(evalFn) {
  var tableA = schemaWithNullable.table('TableA');
  var tableB = schemaWithNullable.table('TableB');
  var tableC = schemaWithNullable.table('TableC');

  var tableARelation = lf.proc.Relation.fromRows(
      nullableGenerator.sampleTableARows, [tableA.getName()]);
  var tableBRelation = lf.proc.Relation.fromRows(
      nullableGenerator.sampleTableBRows, [tableB.getName()]);
  var tableCRelation = lf.proc.Relation.fromRows(
      nullableGenerator.sampleTableCRows, [tableC.getName()]);

  var lengthTableA = nullableGenerator.sampleTableARows.length;
  var numNullableTableA = nullableGenerator.tableAGroundTruth.numNullable;
  var joinPredicate1 = tableA['id'].eq(tableC['id']);
  var result = evalFn.call(
      joinPredicate1, tableARelation, tableCRelation, true);
  assertEquals(lengthTableA, result.entries.length);
  result.entries.slice(0, lengthTableA - numNullableTableA).forEach(
      function(entry) {
        assertTrue(hasNonNullEntry(entry, tableA.getEffectiveName()));
      });
  result.entries.slice(lengthTableA - numNullableTableA).forEach(
      function(entry) {
        assertTrue(hasNullEntry(entry, tableA.getEffectiveName()));
      });
  var numNullEntries = result.entries.filter(function(entry) {
    return hasNullEntry(entry, tableC.getEffectiveName());
  }).length;
  assertEquals(numNullableTableA, numNullEntries);

  // Join with left table containing only nulls.
  var joinPredicate2 = tableB['id'].eq(tableC['id']);
  result = evalFn.call(
      joinPredicate2, tableBRelation, tableCRelation, true);
  assertEquals(
      nullableGenerator.sampleTableBRows.length,
      result.entries.length);
  numNullEntries = result.entries.filter(function(entry) {
    return hasNullEntry(entry, tableC.getEffectiveName()) &&
        hasNullEntry(entry, tableB.getEffectiveName());
  }).length;
  assertEquals(
      nullableGenerator.sampleTableBRows.length, numNullEntries);
}
Checks that the given outer join implementation is correct, for the case
where the join predicate refers to nullable keys.
@param {!function(!lf.proc.Relation, !lf.proc.Relation, boolean)
    :!lf.proc.Relation} evalFn The join implementation method should be
    either evalRelationsNestedLoopJoin_ or evalRelationsHashJoin_.