private Boolean checkForPartColsAndUnknown(Object... nodeOutputs) {
      boolean has_part_col = false;
      for (Object child : nodeOutputs) {
        NodeInfoWrapper wrapper = (NodeInfoWrapper) child;
        if (wrapper.state == WalkState.UNKNOWN) {
          return null;
        } else if (wrapper.state == WalkState.PART_COL
            || wrapper.state == WalkState.PART_COL_STRUCT) {
          has_part_col = true;
        }
      }
      return has_part_col;
    }
Processor for Generic functions

If it is AND, OR or NOT, we replace the node to be the constant true or
false if we are sure the result from children, or cut one of the child
if we know partial results. In case of both child has a result vector,
we calculate the result vector for the node. If all partitions agree on
a result, we replace the node with constant true or false. Otherwise, we
pass the vector result. For other Generic functions, if it is non-deterministic
we simply pass it (with children adjusted based on results from children).
If it is deterministic, we evaluate result vector if any of the children
is partition column. Otherwise, we pass it as it is.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrExprProcFactory.java