/**
   * This constructor is used during from AndNode during where clause evaluation to create QueryInfo
   * Object
   *
   * @param cr ColumnReference object
   * @throws StandardException
   * @see AndNode#computeQueryInfo()
   */
  public ColumnQueryInfo(final ColumnReference cr, QueryInfoContext qic) throws StandardException {
    final ResultColumn rc = cr.getSource();
    this.tableNum = cr.getTableNumber();
    this.columnDescriptor = searchColumnDescriptor(rc);

    if (this.columnDescriptor != null) {
      this.actualColumnName = this.columnDescriptor.getColumnName();
      this.actualColumnNumber = this.columnDescriptor.getPosition();
      this.columnType = this.columnDescriptor.getType();
      this.td = this.columnDescriptor.getTableDescriptor();
    } else {
      String columnName = rc.getSourceColumnName();
      if (columnName == null) {
        columnName = rc.getActualName();
      }
      this.actualColumnName = columnName;
      this.actualColumnNumber = rc.getColumnPosition();
      this.columnType = rc.getType();
      this.td = null;
    }
    this.exposedColumnName = this.actualColumnName;
    this.virtualColumnNumber = this.actualColumnNumber;
    if (tableNum > -1) {
      DMLQueryInfo current = qic.getCurrentScopeQueryInfo();
      this.tqi = current.getTableQueryInfo(tableNum);
      if (tqi != null) {
        this.initResolverForColumnIfApplicable();
      } else {
        DMLQueryInfo root = qic.getRootQueryInfo();
        if (root.isSelect() && qic.getNestingLevelOfScope() > 0) {
          // It is possible that this column refers to an outer scope table.
          // We need to find the Scope to which it belongs
          Scope owningScope = qic.findOwningScope(tableNum);
          if (owningScope != null) {
            this.initResolverForOuterScopeColumn(cr, qic, owningScope);
            this.isOuterScope = true;
          } else {
            // the subquery flag remains set as UNSUPPORTED_CORRELATED_SUBQUERY
          }
        }
      }
    }

    // !!!:ezoerner:20090622 a null columnDescriptor is problem if we need the
    // type for byte array formatting. Allow it for now, but may cause an NPE
    // later
    /*
    assert this.columnDescriptor != null;
    */
  }
 private final ColumnDescriptor searchColumnDescriptor(final ResultColumn rc)
     throws StandardException {
   ValueNode vn;
   ResultColumn rs = rc;
   ColumnDescriptor cd = rc.getTableColumnDescriptor();
   if (this.tableNum < 0) {
     this.tableNum = rc.getTableNumber();
   }
   if (cd != null) {
     return cd;
   }
   for (; ; ) {
     if ((vn = rs.getExpression()) instanceof ColumnReference) {
       rs = ((ColumnReference) vn).getSource();
     } else if ((vn = rs.getExpression()) instanceof VirtualColumnNode) {
       rs = ((VirtualColumnNode) vn).getSourceColumn();
     } else {
       break;
     }
     if (rs != null) {
       cd = rs.getTableColumnDescriptor();
       if (cd != null) {
         this.tableNum = rs.getTableNumber();
         break;
       }
     } else {
       break;
     }
   }
   return cd;
 }
  /**
   * This constructor is invoked while analyzing the projection attributes
   *
   * @param rc ResultColumn
   * @throws StandardException
   * @see SelectQueryInfo#visit(com.pivotal.gemfirexd.internal.iapi.sql.compile.Visitable)
   */
  ColumnQueryInfo(final ResultColumn rc, QueryInfoContext qic) throws StandardException {
    final ColumnDescriptor cd = searchColumnDescriptor(rc);

    if (cd != null) {
      this.actualColumnName = cd.getColumnName();
      this.actualColumnNumber = cd.getPosition();
      this.columnDescriptor = cd;
      this.columnType = cd.getType();
      this.td = cd.getTableDescriptor();
    } else {
      String columnName = rc.getSourceColumnName();
      if (columnName == null) {
        columnName = rc.getActualName();
      }
      this.actualColumnName = columnName;
      this.actualColumnNumber = rc.getColumnPosition();
      this.columnType = rc.getType();
      this.td = null;
      this.columnDescriptor =
          new ColumnDescriptor(
              this.actualColumnName,
              this.actualColumnNumber,
              this.columnType,
              null, // default
              null, // defaultInfo
              (UUID) null, // table uuid
              (UUID) null, // default uuid
              0L, // autoincStart
              0L, // autoincInc
              0L,
              false); // autoincValue
    }

    if (tableNum > -1) {
      DMLQueryInfo currentTop = qic.getCurrentScopeQueryInfo();
      this.tqi = currentTop.getTableQueryInfo(tableNum);
      // TODO:Asif Should we do correlation check here?
    }
    this.exposedColumnName = rc.getName();
    this.virtualColumnNumber = rc.getVirtualColumnId();
    assert this.columnDescriptor != null;
  }