//protected FromItem clone()
        //{
        //    FromItem f    = new FromItem();
        //    f._alias      = _alias;
        //    f._join       = _join;
        //    f._table      = _table;
        //    f._expression = _expression;
        //    if (_subQuery != null)
        //    {
        //        f._subQuery = _subQuery.clone();
        //    }
        //    if (_leftOn != null && _leftSide != null && _rightOn != null && _rightSide != null)
        //    {
        //        f._leftSide  = _leftSide.clone();
        //        f._leftOn    = _leftOn.clone();
        //        f._rightSide = _rightSide.clone();
        //        f._rightOn   = _rightOn.clone();
        //    }
        //    return f;
        //} // clone()

        protected override void decorateIdentity(CsList <Object> identifiers)
        {
            identifiers.add(_table);
            identifiers.add(_alias);
            identifiers.add(_subQuery);
            identifiers.add(_join);
            identifiers.add(_leftSide);
            identifiers.add(_rightSide);
            identifiers.add(_leftOn);
            identifiers.add(_rightOn);
            identifiers.add(_expression);
        } // decorateIdentity()
        } // constructor

        /**
         * Subclasses should implement this method and add all fields to the list
         * that are to be included in equals(...) and hashCode() evaluation
         *
         * @param identifiers
         */
        protected override void decorateIdentity(CsList <Object> identifiers)
        {
            identifiers.add(_expression);
            identifiers.add(_alias);
            identifiers.add(_column);
            identifiers.add(_function);
            identifiers.add(_functionApproximationAllowed);
            if (_fromItem == null && _column != null && _column.getTable() != null)
            {
                // add a FromItem representing the column's table - this makes equal
                // comparison work when the only difference is whether or not
                // FromItem is specified
                identifiers.add(new FromItem(_column.getTable()));
            }
            else
            {
                identifiers.add(_fromItem);
            }
            identifiers.add(_subQuerySelectItem);
        } // decorateIdentity()