public static void propagateNullsColCol()

in ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/NullUtil.java [289:442]


  public static void propagateNullsColCol(ColumnVector inputColVector1,
      ColumnVector inputColVector2, ColumnVector outputColVector, int[] sel,
      int n, boolean selectedInUse) {

    // We do not need to do a column reset since we are carefully changing the output.
    outputColVector.isRepeating = false;

    if (inputColVector1.noNulls && inputColVector2.noNulls) {
      if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
        outputColVector.isNull[0] = false;
        outputColVector.isRepeating = true;
      } else {
        if (selectedInUse) {
          for(int j = 0; j != n; j++) {
            int i = sel[j];
            outputColVector.isNull[i] = false;
          }
        } else {
          Arrays.fill(outputColVector.isNull, 0, n, false);
        }
      }
    } else if (inputColVector1.noNulls && !inputColVector2.noNulls) {

      if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
        if (!inputColVector2.isNull[0]) {
          outputColVector.isNull[0] = false;
        } else {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
        }
        outputColVector.isRepeating = true;
      } else if (inputColVector2.isRepeating) {
        if (!inputColVector2.isNull[0]) {
          if (selectedInUse) {
            for(int j = 0; j != n; j++) {
              int i = sel[j];
              outputColVector.isNull[i] = false;
            }
          } else {
            Arrays.fill(outputColVector.isNull, 0, n, false);
          }
        } else {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
          outputColVector.isRepeating = true;   // Because every value will be NULL.
        }
      } else {
        outputColVector.noNulls = false;
        if (selectedInUse) {
          for(int j = 0; j != n; j++) {
            int i = sel[j];
            outputColVector.isNull[i] = inputColVector2.isNull[i];
          }
        } else {
          System.arraycopy(inputColVector2.isNull, 0, outputColVector.isNull, 0, n);
        }
      }
    } else if (!inputColVector1.noNulls && inputColVector2.noNulls) {

      if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
        if (!inputColVector1.isNull[0]) {
          outputColVector.isNull[0] = false;
        } else {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
        }
        outputColVector.isRepeating = true;
      } else if (inputColVector1.isRepeating) {
        if (!inputColVector1.isNull[0]) {
          if (selectedInUse) {
            for(int j = 0; j != n; j++) {
              int i = sel[j];
              outputColVector.isNull[i] = false;
            }
          } else {
            Arrays.fill(outputColVector.isNull, 0, n, false);
          }
        } else {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
          outputColVector.isRepeating = true;   // Because every value will be NULL.
        }
      } else {
        outputColVector.noNulls = false;
        if (selectedInUse) {
          for(int j = 0; j != n; j++) {
            int i = sel[j];
            outputColVector.isNull[i] = inputColVector1.isNull[i];
          }
        } else {
          System.arraycopy(inputColVector1.isNull, 0, outputColVector.isNull, 0, n);
        }
      }
    } else if (!inputColVector1.noNulls && !inputColVector2.noNulls) {

      if (inputColVector1.isRepeating && inputColVector2.isRepeating) {
        if (!inputColVector1.isNull[0] && !inputColVector2.isNull[0]) {
          outputColVector.isNull[0] = false;
        } else {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
        }
        outputColVector.isRepeating = true;
      } else if (inputColVector1.isRepeating && !inputColVector2.isRepeating) {

        if (inputColVector1.isNull[0]) {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
          outputColVector.isRepeating = true;   // Because every value will be NULL.
        } else {
          outputColVector.noNulls = false;
          if (selectedInUse) {
             for(int j = 0; j != n; j++) {
               int i = sel[j];
               outputColVector.isNull[i] = inputColVector2.isNull[i];
             }
          } else {

            // copy nulls from the non-repeating side
            System.arraycopy(inputColVector2.isNull, 0, outputColVector.isNull, 0, n);
          }
        }
      } else if (!inputColVector1.isRepeating && inputColVector2.isRepeating) {
        if (inputColVector2.isNull[0]) {
          outputColVector.isNull[0] = true;
          outputColVector.noNulls = false;
          outputColVector.isRepeating = true;   // Because every value will be NULL.
        } else {
          outputColVector.noNulls = false;
          if (selectedInUse) {
             for(int j = 0; j != n; j++) {
               int i = sel[j];
               outputColVector.isNull[i] = inputColVector1.isNull[i];
             }
          } else {
            // copy nulls from the non-repeating side
            System.arraycopy(inputColVector1.isNull, 0, outputColVector.isNull, 0, n);
          }
        }
      } else {                      // neither side is repeating
        outputColVector.noNulls = false;
        if (selectedInUse) {
          for(int j = 0; j != n; j++) {
            int i = sel[j];
            outputColVector.isNull[i] = inputColVector1.isNull[i] || inputColVector2.isNull[i];
          }
        } else {
          for(int i = 0; i != n; i++) {
            outputColVector.isNull[i] = inputColVector1.isNull[i] || inputColVector2.isNull[i];
          }
        }
      }
    }
  }