function checkEvalRelations_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 joinPredicate1 = tableA['id'].eq(tableC['id']);
  var result = evalFn.call(
      joinPredicate1, tableARelation, tableCRelation, false);
  assertEquals(
      nullableGenerator.sampleTableARows.length -
      nullableGenerator.tableAGroundTruth.numNullable,
      result.entries.length);
  result.entries.forEach(function(entry) {
    assertTrue(hasNonNullEntry(entry, tableA.getEffectiveName()));
    assertFalse(hasNullEntry(entry, tableC.getEffectiveName()));
  });
  // Join with left table containing only nulls.
  var joinPredicate2 = tableB['id'].eq(tableC['id']);
  result = evalFn.call(
      joinPredicate2, tableBRelation, tableCRelation, false);
  assertEquals(0, result.entries.length);
}
Checks that the given 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_.