private Set<Integer> multiInsertBigTableCheck(JoinOperator joinOp, Set<Integer> bigTableCandidates) {
    int multiChildrenSource = -1;
    for (int tablePosition : bigTableCandidates.toArray(new Integer[0])) {
      Operator<?> parent = joinOp.getParentOperators().get(tablePosition);
      for (; parent != null;
           parent = parent.getNumParent() > 0 ? parent.getParentOperators().get(0) : null) {
        if (parent.getNumChild() > 1 && !(parent instanceof LateralViewForwardOperator)) {
          if (multiChildrenSource >= 0) {
            return Collections.emptySet();
          }
          multiChildrenSource = tablePosition;
        }
      }
    }
    return multiChildrenSource < 0 ? bigTableCandidates :
        new HashSet<Integer>(Arrays.asList(multiChildrenSource));
  }
In the case of a multi-insert statement the Source Operator will have multiple children.
For e.g.
from src b
INSERT OVERWRITE TABLE src_4
 select *
 where b.key in
   (select a.key from src a where b.value = a.value and a.key > '9')
INSERT OVERWRITE TABLE src_5
select *
where b.key not in
  ( select key from src s1 where s1.key > '2')

The TableScan on 'src'(for alias b) will have 2 children one for each destination.

In such cases only the Source side of the Join is the candidate Big Table.
The reason being, it cannot be replaced by a HashTable as its rows must flow into the other children
of the TableScan Operator.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/CommonJoinTaskDispatcher.java