File: System\Data\Filter\ExpressionNode.cs
Web Access
Project: src\src\libraries\System.Data.Common\src\System.Data.Common.csproj (System.Data.Common)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics.CodeAnalysis;
 
namespace System.Data
{
    internal abstract class ExpressionNode
    {
        private DataTable? _table;
 
        protected ExpressionNode(DataTable? table)
        {
            _table = table;
        }
 
        internal IFormatProvider FormatProvider
        {
            get
            {
                return ((null != _table) ? _table.FormatProvider : System.Globalization.CultureInfo.CurrentCulture);
            }
        }
 
        internal virtual bool IsSqlColumn
        {
            get
            {
                return false;
            }
        }
 
        protected DataTable? table
        {
            get { return _table; }
        }
 
        protected void BindTable(DataTable table)
        {
            // when the expression is created, DataColumn may not be associated with a table yet
            _table = table;
        }
 
        internal abstract void Bind(DataTable table, List<DataColumn> list);
        [RequiresUnreferencedCode(DataSet.RequiresUnreferencedCodeMessage)]
        internal abstract object Eval();
        [RequiresUnreferencedCode(DataSet.RequiresUnreferencedCodeMessage)]
        internal abstract object Eval(DataRow? row, DataRowVersion version);
        [RequiresUnreferencedCode(DataSet.RequiresUnreferencedCodeMessage)]
        internal abstract object Eval(int[] recordNos);
        internal abstract bool IsConstant();
        internal abstract bool IsTableConstant();
        internal abstract bool HasLocalAggregate();
        internal abstract bool HasRemoteAggregate();
 
        internal abstract ExpressionNode Optimize();
        internal virtual bool DependsOn(DataColumn column)
        {
            return false;
        }
 
        internal static bool IsInteger(StorageType type)
        {
            return (type == StorageType.Int16 ||
                type == StorageType.Int32 ||
                type == StorageType.Int64 ||
                type == StorageType.UInt16 ||
                type == StorageType.UInt32 ||
                type == StorageType.UInt64 ||
                type == StorageType.SByte ||
                type == StorageType.Byte);
        }
 
        internal static bool IsIntegerSql(StorageType type)
        {
            return (type == StorageType.Int16 ||
                type == StorageType.Int32 ||
                type == StorageType.Int64 ||
                type == StorageType.UInt16 ||
                type == StorageType.UInt32 ||
                type == StorageType.UInt64 ||
                type == StorageType.SByte ||
                type == StorageType.Byte ||
                type == StorageType.SqlInt64 ||
                type == StorageType.SqlInt32 ||
                type == StorageType.SqlInt16 ||
                type == StorageType.SqlByte);
        }
 
        internal static bool IsSigned(StorageType type)
        {
            return (type == StorageType.Int16 ||
                type == StorageType.Int32 ||
                type == StorageType.Int64 ||
                type == StorageType.SByte ||
                IsFloat(type));
        }
 
        internal static bool IsSignedSql(StorageType type)
        {
            return (type == StorageType.Int16 || // IsSigned(type)
                type == StorageType.Int32 ||
                type == StorageType.Int64 ||
                type == StorageType.SByte ||
                type == StorageType.SqlInt64 ||
                type == StorageType.SqlInt32 ||
                type == StorageType.SqlInt16 ||
                IsFloatSql(type));
        }
 
        internal static bool IsUnsigned(StorageType type)
        {
            return (type == StorageType.UInt16 ||
                   type == StorageType.UInt32 ||
                   type == StorageType.UInt64 ||
                   type == StorageType.Byte);
        }
 
        internal static bool IsUnsignedSql(StorageType type)
        {
            return (type == StorageType.UInt16 ||
                   type == StorageType.UInt32 ||
                   type == StorageType.UInt64 ||
                   type == StorageType.SqlByte ||// SqlByte represents an 8-bit unsigned integer, in the range of 0 through 255,
                   type == StorageType.Byte);
        }
 
        internal static bool IsNumeric(StorageType type)
        {
            return (IsFloat(type) ||
                   IsInteger(type));
        }
 
        internal static bool IsNumericSql(StorageType type)
        {
            return (IsFloatSql(type) ||
                   IsIntegerSql(type));
        }
 
        internal static bool IsFloat(StorageType type)
        {
            return (type == StorageType.Single ||
                type == StorageType.Double ||
                type == StorageType.Decimal);
        }
 
        internal static bool IsFloatSql(StorageType type)
        {
            return (type == StorageType.Single ||
                type == StorageType.Double ||
                type == StorageType.Decimal ||
                type == StorageType.SqlDouble ||
                type == StorageType.SqlDecimal || // I expect decimal to be Integer!
                type == StorageType.SqlMoney ||   // if decimal is here, this should be definitely here!
                type == StorageType.SqlSingle);
        }
    }
}