Beispiel #1
0
 internal object Evaluate(DataRow row, DataRowVersion version)
 {
     if (!this.bound)
     {
         this.Bind(this.table);
     }
     if (this.expr != null)
     {
         object obj2 = this.expr.Eval(row, version);
         if ((obj2 == DBNull.Value) && (StorageType.Uri >= this._storageType))
         {
             return(obj2);
         }
         try
         {
             if (StorageType.Object != this._storageType)
             {
                 obj2 = SqlConvert.ChangeType2(obj2, this._storageType, this._dataType, this.table.FormatProvider);
             }
             return(obj2);
         }
         catch (Exception exception)
         {
             if (!ADP.IsCatchableExceptionType(exception))
             {
                 throw;
             }
             ExceptionBuilder.TraceExceptionForCapture(exception);
             throw ExprException.DatavalueConvertion(obj2, this._dataType, exception);
         }
     }
     return(null);
 }
        internal object Evaluate(DataRow row, DataRowVersion version)
        {
            object result;

            if (!_bound)
            {
                Bind(_table);
            }
            if (_expr != null)
            {
                result = _expr.Eval(row, version);
                // if the type is a SqlType (StorageType.Uri < _storageType), convert DBNull values.
                if (result != DBNull.Value || StorageType.Uri < _storageType)
                {
                    // we need to convert the return value to the column.Type;
                    try
                    {
                        if (StorageType.Object != _storageType)
                        {
                            result = SqlConvert.ChangeType2(result, _storageType, _dataType, _table.FormatProvider);
                        }
                    }
                    catch (Exception e) when(ADP.IsCatchableExceptionType(e))
                    {
                        ExceptionBuilder.TraceExceptionForCapture(e);
                        throw ExprException.DatavalueConvertion(result, _dataType, e);
                    }
                }
            }
            else
            {
                result = null;
            }
            return(result);
        }
Beispiel #3
0
        internal override void SetCurrentAndIncrement(object value)
        {
            long num = (long)SqlConvert.ChangeType2(value, StorageType.Int64, typeof(long), CultureInfo.InvariantCulture);

            if (this.BoundaryCheck(num))
            {
                this.current = num + this.step;
            }
        }
Beispiel #4
0
        private object EvalFunction(FunctionId id, object[] argumentValues, DataRow row, DataRowVersion version)
        {
            StorageType storageType;

            switch (id)
            {
            case FunctionId.Abs:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));

                storageType = DataStorage.GetStorageType(argumentValues[0].GetType());
                if (ExpressionNode.IsInteger(storageType))
                {
                    return(Math.Abs((long)argumentValues[0]));
                }
                if (ExpressionNode.IsNumeric(storageType))
                {
                    return(Math.Abs((double)argumentValues[0]));
                }

                throw ExprException.ArgumentTypeInteger(s_funcs[_info]._name, 1);

            case FunctionId.cBool:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));

                storageType = DataStorage.GetStorageType(argumentValues[0].GetType());
                switch (storageType)
                {
                case StorageType.Boolean:
                    return((bool)argumentValues[0]);

                case StorageType.Int32:
                    return((int)argumentValues[0] != 0);

                case StorageType.Double:
                    return((double)argumentValues[0] != 0.0);

                case StorageType.String:
                    return(bool.Parse((string)argumentValues[0]));

                default:
                    throw ExprException.DatatypeConvertion(argumentValues[0].GetType(), typeof(bool));
                }

            case FunctionId.cInt:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                return(Convert.ToInt32(argumentValues[0], FormatProvider));

            case FunctionId.cDate:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                return(Convert.ToDateTime(argumentValues[0], FormatProvider));

            case FunctionId.cDbl:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                return(Convert.ToDouble(argumentValues[0], FormatProvider));

            case FunctionId.cStr:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                return(Convert.ToString(argumentValues[0], FormatProvider));

            case FunctionId.Charindex:
                Debug.Assert(_argumentCount == 2, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));

                Debug.Assert(argumentValues[0] is string, "Invalid argument type for " + s_funcs[_info]._name);
                Debug.Assert(argumentValues[1] is string, "Invalid argument type for " + s_funcs[_info]._name);

                if (DataStorage.IsObjectNull(argumentValues[0]) || DataStorage.IsObjectNull(argumentValues[1]))
                {
                    return(DBNull.Value);
                }

                if (argumentValues[0] is SqlString)
                {
                    argumentValues[0] = ((SqlString)argumentValues[0]).Value;
                }

                if (argumentValues[1] is SqlString)
                {
                    argumentValues[1] = ((SqlString)argumentValues[1]).Value;
                }

                return(((string)argumentValues[1]).IndexOf((string)argumentValues[0], StringComparison.Ordinal));

            case FunctionId.Iif:
                Debug.Assert(_argumentCount == 3, "Invalid argument argumentCount: " + _argumentCount.ToString(FormatProvider));

                object first = _arguments[0].Eval(row, version);

                if (DataExpression.ToBoolean(first) != false)
                {
                    return(_arguments[1].Eval(row, version));
                }
                else
                {
                    return(_arguments[2].Eval(row, version));
                }

            case FunctionId.In:
                // we never evaluate IN directly: IN as a binary operator, so evaluation of this should be in
                // BinaryNode class
                throw ExprException.NYI(s_funcs[_info]._name);

            case FunctionId.IsNull:
                Debug.Assert(_argumentCount == 2, "Invalid argument argumentCount: ");

                if (DataStorage.IsObjectNull(argumentValues[0]))
                {
                    return(argumentValues[1]);
                }
                else
                {
                    return(argumentValues[0]);
                }

            case FunctionId.Len:
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                Debug.Assert((argumentValues[0] is string) || (argumentValues[0] is SqlString), "Invalid argument type for " + s_funcs[_info]._name);

                if (argumentValues[0] is SqlString)
                {
                    if (((SqlString)argumentValues[0]).IsNull)
                    {
                        return(DBNull.Value);
                    }
                    else
                    {
                        argumentValues[0] = ((SqlString)argumentValues[0]).Value;
                    }
                }

                return(((string)argumentValues[0]).Length);


            case FunctionId.Substring:
                Debug.Assert(_argumentCount == 3, "Invalid argument argumentCount: " + _argumentCount.ToString(FormatProvider));
                Debug.Assert((argumentValues[0] is string) || (argumentValues[0] is SqlString), "Invalid first argument " + argumentValues[0].GetType().FullName + " in " + s_funcs[_info]._name);
                Debug.Assert(argumentValues[1] is int, "Invalid second argument " + argumentValues[1].GetType().FullName + " in " + s_funcs[_info]._name);
                Debug.Assert(argumentValues[2] is int, "Invalid third argument " + argumentValues[2].GetType().FullName + " in " + s_funcs[_info]._name);

                // work around the differences in .NET and VBA implementation of the Substring function
                // 1. The <index> Argument is 0-based in .NET, and 1-based in VBA
                // 2. If the <Length> argument is longer then the string length .NET throws an ArgumentException
                //    but our users still want to get a result.

                int start = (int)argumentValues[1] - 1;

                int length = (int)argumentValues[2];

                if (start < 0)
                {
                    throw ExprException.FunctionArgumentOutOfRange("index", "Substring");
                }

                if (length < 0)
                {
                    throw ExprException.FunctionArgumentOutOfRange("length", "Substring");
                }

                if (length == 0)
                {
                    return(string.Empty);
                }

                if (argumentValues[0] is SqlString)
                {
                    argumentValues[0] = ((SqlString)argumentValues[0]).Value;
                }

                int src_length = ((string)argumentValues[0]).Length;

                if (start > src_length)
                {
                    return(DBNull.Value);
                }

                if (start + length > src_length)
                {
                    length = src_length - start;
                }

                return(((string)argumentValues[0]).Substring(start, length));

            case FunctionId.Trim:
            {
                Debug.Assert(_argumentCount == 1, "Invalid argument argumentCount for " + s_funcs[_info]._name + " : " + _argumentCount.ToString(FormatProvider));
                Debug.Assert((argumentValues[0] is string) || (argumentValues[0] is SqlString), "Invalid argument type for " + s_funcs[_info]._name);

                if (DataStorage.IsObjectNull(argumentValues[0]))
                {
                    return(DBNull.Value);
                }

                if (argumentValues[0] is SqlString)
                {
                    argumentValues[0] = ((SqlString)argumentValues[0]).Value;
                }

                return(((string)argumentValues[0]).Trim());
            }

            case FunctionId.Convert:
                if (_argumentCount != 2)
                {
                    throw ExprException.FunctionArgumentCount(_name);
                }

                if (argumentValues[0] == DBNull.Value)
                {
                    return(DBNull.Value);
                }

                Type        type   = (Type)argumentValues[1];
                StorageType mytype = DataStorage.GetStorageType(type);
                storageType = DataStorage.GetStorageType(argumentValues[0].GetType());

                if (mytype == StorageType.DateTimeOffset)
                {
                    if (storageType == StorageType.String)
                    {
                        return(SqlConvert.ConvertStringToDateTimeOffset((string)argumentValues[0], FormatProvider));
                    }
                }

                if (StorageType.Object != mytype)
                {
                    if ((mytype == StorageType.Guid) && (storageType == StorageType.String))
                    {
                        return(new Guid((string)argumentValues[0]));
                    }

                    if (ExpressionNode.IsFloatSql(storageType) && ExpressionNode.IsIntegerSql(mytype))
                    {
                        if (StorageType.Single == storageType)
                        {
                            return(SqlConvert.ChangeType2((float)SqlConvert.ChangeType2(argumentValues[0], StorageType.Single, typeof(float), FormatProvider), mytype, type, FormatProvider));
                        }
                        else if (StorageType.Double == storageType)
                        {
                            return(SqlConvert.ChangeType2((double)SqlConvert.ChangeType2(argumentValues[0], StorageType.Double, typeof(double), FormatProvider), mytype, type, FormatProvider));
                        }
                        else if (StorageType.Decimal == storageType)
                        {
                            return(SqlConvert.ChangeType2((decimal)SqlConvert.ChangeType2(argumentValues[0], StorageType.Decimal, typeof(decimal), FormatProvider), mytype, type, FormatProvider));
                        }
                    }

                    // The Convert function can be called lazily, outside of a previous Serialization Guard scope.
                    // If there was a type limiter scope on the stack at the time this Convert function was created,
                    // we must manually re-enter the Serialization Guard scope.

                    DeserializationToken deserializationToken = (_capturedLimiter != null) ? SerializationInfo.StartDeserialization() : default;
                    using (deserializationToken)
                    {
                        return(SqlConvert.ChangeType2(argumentValues[0], mytype, type, FormatProvider));
                    }
                }

                return(argumentValues[0]);

            case FunctionId.DateTimeOffset:
                if (argumentValues[0] == DBNull.Value || argumentValues[1] == DBNull.Value || argumentValues[2] == DBNull.Value)
                {
                    return(DBNull.Value);
                }
                switch (((DateTime)argumentValues[0]).Kind)
                {
                case DateTimeKind.Utc:
                    if ((int)argumentValues[1] != 0 && (int)argumentValues[2] != 0)
                    {
                        throw ExprException.MismatchKindandTimeSpan();
                    }
                    break;

                case DateTimeKind.Local:
                    if (DateTimeOffset.Now.Offset.Hours != (int)argumentValues[1] && DateTimeOffset.Now.Offset.Minutes != (int)argumentValues[2])
                    {
                        throw ExprException.MismatchKindandTimeSpan();
                    }
                    break;

                case DateTimeKind.Unspecified: break;
                }
                if ((int)argumentValues[1] < -14 || (int)argumentValues[1] > 14)
                {
                    throw ExprException.InvalidHoursArgument();
                }
                if ((int)argumentValues[2] < -59 || (int)argumentValues[2] > 59)
                {
                    throw ExprException.InvalidMinutesArgument();
                }
                // range should be within -14 hours and  +14 hours
                if ((int)argumentValues[1] == 14 && (int)argumentValues[2] > 0)
                {
                    throw ExprException.InvalidTimeZoneRange();
                }
                if ((int)argumentValues[1] == -14 && (int)argumentValues[2] < 0)
                {
                    throw ExprException.InvalidTimeZoneRange();
                }

                return(new DateTimeOffset((DateTime)argumentValues[0], new TimeSpan((int)argumentValues[1], (int)argumentValues[2], 0)));

            default:
                throw ExprException.UndefinedFunction(s_funcs[_info]._name);
            }
        }
Beispiel #5
0
        private int Eval(BinaryNode expr, DataRow row, DataRowVersion version)
        {
            if (expr._op == Operators.And)
            {
                int lResult = Eval((BinaryNode)expr._left, row, version);
                if (lResult != 0)
                {
                    return(lResult);
                }
                int rResult = Eval((BinaryNode)expr._right, row, version);
                if (rResult != 0)
                {
                    return(rResult);
                }
                return(0);
            }

            long   c     = 0;
            object vLeft = expr._left.Eval(row, version);

            if (expr._op != Operators.Is && expr._op != Operators.IsNot)
            {
                object vRight   = expr._right.Eval(row, version);
                bool   isLConst = (expr._left is ConstNode);
                bool   isRConst = (expr._right is ConstNode);

                if ((vLeft == DBNull.Value) || (expr._left.IsSqlColumn && DataStorage.IsObjectSqlNull(vLeft)))
                {
                    return(-1);
                }
                if ((vRight == DBNull.Value) || (expr._right.IsSqlColumn && DataStorage.IsObjectSqlNull(vRight)))
                {
                    return(1);
                }

                StorageType leftType = DataStorage.GetStorageType(vLeft.GetType());
                if (StorageType.Char == leftType)
                {
                    if ((isRConst) || (!expr._right.IsSqlColumn))
                    {
                        vRight = Convert.ToChar(vRight, _table.FormatProvider);
                    }
                    else
                    {
                        vRight = SqlConvert.ChangeType2(vRight, StorageType.Char, typeof(char), _table.FormatProvider);
                    }
                }

                StorageType rightType = DataStorage.GetStorageType(vRight.GetType());
                StorageType resultType;
                if (expr._left.IsSqlColumn || expr._right.IsSqlColumn)
                {
                    resultType = expr.ResultSqlType(leftType, rightType, isLConst, isRConst, expr._op);
                }
                else
                {
                    resultType = expr.ResultType(leftType, rightType, isLConst, isRConst, expr._op);
                }
                if (StorageType.Empty == resultType)
                {
                    expr.SetTypeMismatchError(expr._op, vLeft.GetType(), vRight.GetType());
                }

                // if comparing a Guid column value against a string literal
                // use InvariantCulture instead of DataTable.Locale because in the Danish related cultures
                // sorting a Guid as a string has different results than in Invariant and English related cultures.
                // This fix is restricted to DataTable.Select("GuidColumn = 'string literal'") types of queries
                NameNode namedNode = null;
                System.Globalization.CompareInfo comparer =
                    ((isLConst && !isRConst && (leftType == StorageType.String) && (rightType == StorageType.Guid) && (null != (namedNode = expr._right as NameNode)) && (namedNode._column.DataType == typeof(Guid))) ||
                     (isRConst && !isLConst && (rightType == StorageType.String) && (leftType == StorageType.Guid) && (null != (namedNode = expr._left as NameNode)) && (namedNode._column.DataType == typeof(Guid))))
                     ? System.Globalization.CultureInfo.InvariantCulture.CompareInfo : null;

                c = expr.BinaryCompare(vLeft, vRight, resultType, expr._op, comparer);
            }
            switch (expr._op)
            {
            case Operators.EqualTo: c = (c == 0 ? 0 : c < 0 ? -1 : 1); break;

            case Operators.GreaterThen: c = (c > 0 ? 0 : -1); break;

            case Operators.LessThen: c = (c < 0 ? 0 : 1); break;

            case Operators.GreaterOrEqual: c = (c >= 0 ? 0 : -1); break;

            case Operators.LessOrEqual: c = (c <= 0 ? 0 : 1); break;

            case Operators.Is: c = (vLeft == DBNull.Value ? 0 : -1); break;

            case Operators.IsNot: c = (vLeft != DBNull.Value ? 0 : 1); break;

            default: Debug.Assert(true, "Unsupported Binary Search Operator!"); break;
            }
            return((int)c);
        }
Beispiel #6
0
        private int Eval(BinaryNode expr, DataRow row, DataRowVersion version)
        {
            if (expr.op == 0x1a)
            {
                int num4 = this.Eval((BinaryNode)expr.left, row, version);
                if (num4 != 0)
                {
                    return(num4);
                }
                int num3 = this.Eval((BinaryNode)expr.right, row, version);
                if (num3 != 0)
                {
                    return(num3);
                }
                return(0);
            }
            long   num  = 0L;
            object obj3 = expr.left.Eval(row, version);

            if ((expr.op != 13) && (expr.op != 0x27))
            {
                StorageType type;
                object      obj2 = expr.right.Eval(row, version);
                bool        lc   = expr.left is ConstNode;
                bool        rc   = expr.right is ConstNode;
                if ((obj3 == DBNull.Value) || (expr.left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj3)))
                {
                    return(-1);
                }
                if ((obj2 == DBNull.Value) || (expr.right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
                {
                    return(1);
                }
                StorageType storageType = DataStorage.GetStorageType(obj3.GetType());
                if (StorageType.Char == storageType)
                {
                    if (rc || !expr.right.IsSqlColumn)
                    {
                        obj2 = Convert.ToChar(obj2, this.table.FormatProvider);
                    }
                    else
                    {
                        obj2 = SqlConvert.ChangeType2(obj2, StorageType.Char, typeof(char), this.table.FormatProvider);
                    }
                }
                StorageType right = DataStorage.GetStorageType(obj2.GetType());
                if (expr.left.IsSqlColumn || expr.right.IsSqlColumn)
                {
                    type = expr.ResultSqlType(storageType, right, lc, rc, expr.op);
                }
                else
                {
                    type = expr.ResultType(storageType, right, lc, rc, expr.op);
                }
                if (type == StorageType.Empty)
                {
                    expr.SetTypeMismatchError(expr.op, obj3.GetType(), obj2.GetType());
                }
                num = expr.BinaryCompare(obj3, obj2, type, expr.op);
            }
            switch (expr.op)
            {
            case 7:
                num = (num == 0L) ? ((long)0) : ((num < 0L) ? ((long)(-1)) : ((long)1));
                break;

            case 8:
                num = (num > 0L) ? ((long)0) : ((long)(-1));
                break;

            case 9:
                num = (num < 0L) ? ((long)0) : ((long)1);
                break;

            case 10:
                num = (num >= 0L) ? ((long)0) : ((long)(-1));
                break;

            case 11:
                num = (num <= 0L) ? ((long)0) : ((long)1);
                break;

            case 13:
                num = (obj3 == DBNull.Value) ? ((long)0) : ((long)(-1));
                break;

            case 0x27:
                num = (obj3 != DBNull.Value) ? ((long)0) : ((long)1);
                break;
            }
            return((int)num);
        }
Beispiel #7
0
        internal override object Eval(DataRow row, DataRowVersion version)
        {
            object obj2 = base.left.Eval(row, version);

            if ((obj2 != DBNull.Value) && (!base.left.IsSqlColumn || !DataStorage.IsObjectSqlNull(obj2)))
            {
                string pattern;
                string str3;
                if (this.pattern == null)
                {
                    object obj3 = base.right.Eval(row, version);
                    if (!(obj3 is string) && !(obj3 is SqlString))
                    {
                        base.SetTypeMismatchError(base.op, obj2.GetType(), obj3.GetType());
                    }
                    if ((obj3 == DBNull.Value) || DataStorage.IsObjectSqlNull(obj3))
                    {
                        return(DBNull.Value);
                    }
                    string pat = (string)SqlConvert.ChangeType2(obj3, StorageType.String, typeof(string), base.FormatProvider);
                    pattern = this.AnalyzePattern(pat);
                    if (base.right.IsConstant())
                    {
                        this.pattern = pattern;
                    }
                }
                else
                {
                    pattern = this.pattern;
                }
                if (!(obj2 is string) && !(obj2 is SqlString))
                {
                    base.SetTypeMismatchError(base.op, obj2.GetType(), typeof(string));
                }
                char[] trimChars = new char[] { ' ', ' ' };
                if (obj2 is SqlString)
                {
                    SqlString str6 = (SqlString)obj2;
                    str3 = str6.Value;
                }
                else
                {
                    str3 = (string)obj2;
                }
                string str2 = str3.TrimEnd(trimChars);
                switch (this.kind)
                {
                case 1:
                    return(0 == base.table.IndexOf(str2, pattern));

                case 2:
                {
                    string str4 = pattern.TrimEnd(trimChars);
                    return(base.table.IsSuffix(str2, str4));
                }

                case 3:
                    return(0 <= base.table.IndexOf(str2, pattern));

                case 4:
                    return(0 == base.table.Compare(str2, pattern));

                case 5:
                    return(true);
                }
            }
            return(DBNull.Value);
        }
Beispiel #8
0
        private object EvalFunction(FunctionId id, object[] argumentValues, DataRow row, DataRowVersion version)
        {
            StorageType type;

            switch (id)
            {
            case FunctionId.Charindex:
                if (!DataStorage.IsObjectNull(argumentValues[0]) && !DataStorage.IsObjectNull(argumentValues[1]))
                {
                    if (argumentValues[0] is SqlString)
                    {
                        SqlString str6 = (SqlString)argumentValues[0];
                        argumentValues[0] = str6.Value;
                    }
                    if (argumentValues[1] is SqlString)
                    {
                        SqlString str5 = (SqlString)argumentValues[1];
                        argumentValues[1] = str5.Value;
                    }
                    return(((string)argumentValues[1]).IndexOf((string)argumentValues[0], StringComparison.Ordinal));
                }
                return(DBNull.Value);

            case FunctionId.Len:
            {
                if (!(argumentValues[0] is SqlString))
                {
                    goto Label_02D4;
                }
                SqlString str4 = (SqlString)argumentValues[0];
                if (!str4.IsNull)
                {
                    SqlString str3 = (SqlString)argumentValues[0];
                    argumentValues[0] = str3.Value;
                    goto Label_02D4;
                }
                return(DBNull.Value);
            }

            case FunctionId.Substring:
            {
                int startIndex = ((int)argumentValues[1]) - 1;
                int length     = (int)argumentValues[2];
                if (startIndex < 0)
                {
                    throw ExprException.FunctionArgumentOutOfRange("index", "Substring");
                }
                if (length < 0)
                {
                    throw ExprException.FunctionArgumentOutOfRange("length", "Substring");
                }
                if (length == 0)
                {
                    return("");
                }
                if (argumentValues[0] is SqlString)
                {
                    SqlString str2 = (SqlString)argumentValues[0];
                    argumentValues[0] = str2.Value;
                }
                int num3 = ((string)argumentValues[0]).Length;
                if (startIndex > num3)
                {
                    return(DBNull.Value);
                }
                if ((startIndex + length) > num3)
                {
                    length = num3 - startIndex;
                }
                return(((string)argumentValues[0]).Substring(startIndex, length));
            }

            case FunctionId.IsNull:
                if (!DataStorage.IsObjectNull(argumentValues[0]))
                {
                    return(argumentValues[0]);
                }
                return(argumentValues[1]);

            case FunctionId.Iif:
                if (!DataExpression.ToBoolean(this.arguments[0].Eval(row, version)))
                {
                    return(this.arguments[2].Eval(row, version));
                }
                return(this.arguments[1].Eval(row, version));

            case FunctionId.Convert:
            {
                if (this.argumentCount != 2)
                {
                    throw ExprException.FunctionArgumentCount(this.name);
                }
                if (argumentValues[0] == DBNull.Value)
                {
                    return(DBNull.Value);
                }
                Type        dataType    = (Type)argumentValues[1];
                StorageType storageType = DataStorage.GetStorageType(dataType);
                type = DataStorage.GetStorageType(argumentValues[0].GetType());
                if ((storageType == StorageType.DateTimeOffset) && (type == StorageType.String))
                {
                    return(SqlConvert.ConvertStringToDateTimeOffset((string)argumentValues[0], base.FormatProvider));
                }
                if (StorageType.Object == storageType)
                {
                    return(argumentValues[0]);
                }
                if ((storageType == StorageType.Guid) && (type == StorageType.String))
                {
                    return(new Guid((string)argumentValues[0]));
                }
                if (ExpressionNode.IsFloatSql(type) && ExpressionNode.IsIntegerSql(storageType))
                {
                    if (StorageType.Single == type)
                    {
                        return(SqlConvert.ChangeType2((float)SqlConvert.ChangeType2(argumentValues[0], StorageType.Single, typeof(float), base.FormatProvider), storageType, dataType, base.FormatProvider));
                    }
                    if (StorageType.Double == type)
                    {
                        return(SqlConvert.ChangeType2((double)SqlConvert.ChangeType2(argumentValues[0], StorageType.Double, typeof(double), base.FormatProvider), storageType, dataType, base.FormatProvider));
                    }
                    if (StorageType.Decimal == type)
                    {
                        return(SqlConvert.ChangeType2((decimal)SqlConvert.ChangeType2(argumentValues[0], StorageType.Decimal, typeof(decimal), base.FormatProvider), storageType, dataType, base.FormatProvider));
                    }
                }
                return(SqlConvert.ChangeType2(argumentValues[0], storageType, dataType, base.FormatProvider));
            }

            case FunctionId.cInt:
                return(Convert.ToInt32(argumentValues[0], base.FormatProvider));

            case FunctionId.cBool:
            {
                StorageType type4 = DataStorage.GetStorageType(argumentValues[0].GetType());
                if (type4 > StorageType.Int32)
                {
                    switch (type4)
                    {
                    case StorageType.Double:
                        return(!(((double)argumentValues[0]) == 0.0));

                    case StorageType.String:
                        return(bool.Parse((string)argumentValues[0]));
                    }
                    break;
                }
                switch (type4)
                {
                case StorageType.Boolean:
                    return((bool)argumentValues[0]);

                case StorageType.Int32:
                    return(((int)argumentValues[0]) != 0);
                }
                break;
            }

            case FunctionId.cDate:
                return(Convert.ToDateTime(argumentValues[0], base.FormatProvider));

            case FunctionId.cDbl:
                return(Convert.ToDouble(argumentValues[0], base.FormatProvider));

            case FunctionId.cStr:
                return(Convert.ToString(argumentValues[0], base.FormatProvider));

            case FunctionId.Abs:
                type = DataStorage.GetStorageType(argumentValues[0].GetType());
                if (!ExpressionNode.IsInteger(type))
                {
                    if (!ExpressionNode.IsNumeric(type))
                    {
                        throw ExprException.ArgumentTypeInteger(funcs[this.info].name, 1);
                    }
                    return(Math.Abs((double)argumentValues[0]));
                }
                return(Math.Abs((long)argumentValues[0]));

            case FunctionId.In:
                throw ExprException.NYI(funcs[this.info].name);

            case FunctionId.Trim:
                if (!DataStorage.IsObjectNull(argumentValues[0]))
                {
                    if (argumentValues[0] is SqlString)
                    {
                        SqlString str = (SqlString)argumentValues[0];
                        argumentValues[0] = str.Value;
                    }
                    return(((string)argumentValues[0]).Trim());
                }
                return(DBNull.Value);

            case FunctionId.DateTimeOffset:
                if (((argumentValues[0] != DBNull.Value) && (argumentValues[1] != DBNull.Value)) && (argumentValues[2] != DBNull.Value))
                {
                    DateTime time = (DateTime)argumentValues[0];
                    switch (time.Kind)
                    {
                    case DateTimeKind.Utc:
                        if ((((int)argumentValues[1]) != 0) && (((int)argumentValues[2]) != 0))
                        {
                            throw ExprException.MismatchKindandTimeSpan();
                        }
                        break;

                    case DateTimeKind.Local:
                        if ((DateTimeOffset.Now.Offset.Hours != ((int)argumentValues[1])) && (DateTimeOffset.Now.Offset.Minutes != ((int)argumentValues[2])))
                        {
                            throw ExprException.MismatchKindandTimeSpan();
                        }
                        break;
                    }
                    if ((((int)argumentValues[1]) < -14) || (((int)argumentValues[1]) > 14))
                    {
                        throw ExprException.InvalidHoursArgument();
                    }
                    if ((((int)argumentValues[2]) < -59) || (((int)argumentValues[2]) > 0x3b))
                    {
                        throw ExprException.InvalidMinutesArgument();
                    }
                    if ((((int)argumentValues[1]) == 14) && (((int)argumentValues[2]) > 0))
                    {
                        throw ExprException.InvalidTimeZoneRange();
                    }
                    if ((((int)argumentValues[1]) == -14) && (((int)argumentValues[2]) < 0))
                    {
                        throw ExprException.InvalidTimeZoneRange();
                    }
                    return(new DateTimeOffset((DateTime)argumentValues[0], new TimeSpan((int)argumentValues[1], (int)argumentValues[2], 0)));
                }
                return(DBNull.Value);

            default:
                throw ExprException.UndefinedFunction(funcs[this.info].name);
            }
            throw ExprException.DatatypeConvertion(argumentValues[0].GetType(), typeof(bool));
Label_02D4:
            return(((string)argumentValues[0]).Length);
        }