Ejemplo n.º 1
0
        private static Type GetType(DataTypePrecedence code)
        {
            switch (code)
            {
            case DataTypePrecedence.Error:      return(null);

            case DataTypePrecedence.SByte:      return(typeof(SByte));

            case DataTypePrecedence.Byte:       return(typeof(Byte));

            case DataTypePrecedence.Int16:      return(typeof(Int16));

            case DataTypePrecedence.UInt16:     return(typeof(UInt16));

            case DataTypePrecedence.Int32:      return(typeof(Int32));

            case DataTypePrecedence.UInt32:     return(typeof(UInt32));

            case DataTypePrecedence.Int64:      return(typeof(Int64));

            case DataTypePrecedence.UInt64:     return(typeof(UInt64));

            case DataTypePrecedence.Decimal:    return(typeof(Decimal));

            case DataTypePrecedence.Single:     return(typeof(Single));

            case DataTypePrecedence.Double:     return(typeof(Double));

            case DataTypePrecedence.Boolean:    return(typeof(Boolean));

            case DataTypePrecedence.String:     return(typeof(String));

            case DataTypePrecedence.Char:       return(typeof(Char));

            case DataTypePrecedence.DateTime:   return(typeof(DateTime));

            case DataTypePrecedence.TimeSpan:   return(typeof(TimeSpan));
            }

            Debug.Assert(false, "Invalid (unmapped) precedence " + code.ToString());
            return(null);
        }
Ejemplo n.º 2
0
        public static StorageType GetPrecedenceType(DataTypePrecedence code)
        {
            switch (code)
            {
            case DataTypePrecedence.SqlBinary:
                return(StorageType.SqlBinary);

            case DataTypePrecedence.Char:
                return(StorageType.Char);

            case DataTypePrecedence.String:
                return(StorageType.String);

            case DataTypePrecedence.SqlString:
                return(StorageType.SqlString);

            case DataTypePrecedence.SqlGuid:
                return(StorageType.SqlGuid);

            case DataTypePrecedence.Boolean:
                return(StorageType.Boolean);

            case DataTypePrecedence.SqlBoolean:
                return(StorageType.SqlBoolean);

            case DataTypePrecedence.SByte:
                return(StorageType.SByte);

            case DataTypePrecedence.SqlByte:
                return(StorageType.SqlByte);

            case DataTypePrecedence.Byte:
                return(StorageType.Byte);

            case DataTypePrecedence.Int16:
                return(StorageType.Int16);

            case DataTypePrecedence.SqlInt16:
                return(StorageType.SqlInt16);

            case DataTypePrecedence.UInt16:
                return(StorageType.UInt16);

            case DataTypePrecedence.Int32:
                return(StorageType.Int32);

            case DataTypePrecedence.SqlInt32:
                return(StorageType.SqlInt32);

            case DataTypePrecedence.UInt32:
                return(StorageType.UInt32);

            case DataTypePrecedence.Int64:
                return(StorageType.Int64);

            case DataTypePrecedence.SqlInt64:
                return(StorageType.SqlInt64);

            case DataTypePrecedence.UInt64:
                return(StorageType.UInt64);

            case DataTypePrecedence.SqlMoney:
                return(StorageType.SqlMoney);

            case DataTypePrecedence.Decimal:
                return(StorageType.Decimal);

            case DataTypePrecedence.SqlDecimal:
                return(StorageType.SqlDecimal);

            case DataTypePrecedence.Single:
                return(StorageType.Single);

            case DataTypePrecedence.SqlSingle:
                return(StorageType.SqlSingle);

            case DataTypePrecedence.Double:
                return(StorageType.Double);

            case DataTypePrecedence.SqlDouble:
                return(StorageType.SqlDouble);

            case DataTypePrecedence.TimeSpan:
                return(StorageType.TimeSpan);

            case DataTypePrecedence.DateTime:
                return(StorageType.DateTime);

            case DataTypePrecedence.SqlDateTime:
                return(StorageType.SqlDateTime);

            default:
                return(StorageType.Empty);
            }
        }
Ejemplo n.º 3
0
        public static StorageType ResultType(
            StorageType left,
            StorageType right,
            bool lc,
            bool rc,
            Operator op)
        {
            if (left == StorageType.Guid && right == StorageType.Guid && Operator.IsRelational(op) || left == StorageType.String && right == StorageType.Guid && Operator.IsRelational(op))
            {
                return(left);
            }
            if (left == StorageType.Guid && right == StorageType.String && Operator.IsRelational(op))
            {
                return(right);
            }
            int precedence1 = (int)DataStorageHelper.GetPrecedence(left);

            if (precedence1 == 0)
            {
                return(StorageType.Empty);
            }
            int precedence2 = (int)DataStorageHelper.GetPrecedence(right);

            if (precedence2 == 0)
            {
                return(StorageType.Empty);
            }
            if (Operator.IsLogical(op))
            {
                return(left == StorageType.Boolean && right == StorageType.Boolean ? StorageType.Boolean : StorageType.Empty);
            }
            if (op == Operator.Plus && (left == StorageType.String || right == StorageType.String))
            {
                return(StorageType.String);
            }
            DataTypePrecedence code           = (DataTypePrecedence)Math.Max(precedence1, precedence2);
            StorageType        precedenceType = DataStorageHelper.GetPrecedenceType(code);

            if (Operator.IsArithmetical(op) && precedenceType != StorageType.String && precedenceType != StorageType.Char && (!DataStorageHelper.IsNumeric(left) || !DataStorageHelper.IsNumeric(right)))
            {
                return(StorageType.Empty);
            }
            if (op == Operator.Multiply && DataStorageHelper.IsInteger(precedenceType))
            {
                return(StorageType.Double);
            }
            if (!DataStorageHelper.IsMixed(left, right))
            {
                return(precedenceType);
            }
            if (lc && !rc)
            {
                return(right);
            }
            if (!lc && rc)
            {
                return(left);
            }
            if (!DataStorageHelper.IsUnsigned(precedenceType))
            {
                return(precedenceType);
            }
            if (code >= DataTypePrecedence.UInt64)
            {
                throw InvalidExpressionException.AmbiguousBinop(op, DataStorageHelper.GetTypeStorage(left), DataStorageHelper.GetTypeStorage(right));
            }
            return(DataStorageHelper.GetPrecedenceType(code + 1));
        }
Ejemplo n.º 4
0
        public static StorageType ResultSqlType(
            StorageType left,
            StorageType right,
            bool lc,
            bool rc,
            Operator op)
        {
            int precedence1 = (int)DataStorageHelper.GetPrecedence(left);

            if (precedence1 == 0)
            {
                return(StorageType.Empty);
            }
            int precedence2 = (int)DataStorageHelper.GetPrecedence(right);

            if (precedence2 == 0)
            {
                return(StorageType.Empty);
            }
            if (Operator.IsLogical(op))
            {
                if (left != StorageType.Boolean && left != StorageType.SqlBoolean || right != StorageType.Boolean && right != StorageType.SqlBoolean)
                {
                    return(StorageType.Empty);
                }
                return(left == StorageType.Boolean && right == StorageType.Boolean ? StorageType.Boolean : StorageType.SqlBoolean);
            }
            if (op == Operator.Plus)
            {
                if (left == StorageType.SqlString || right == StorageType.SqlString)
                {
                    return(StorageType.SqlString);
                }
                if (left == StorageType.String || right == StorageType.String)
                {
                    return(StorageType.String);
                }
            }
            if (left == StorageType.SqlBinary && right != StorageType.SqlBinary || left != StorageType.SqlBinary && right == StorageType.SqlBinary || (left == StorageType.SqlGuid && right != StorageType.SqlGuid || left != StorageType.SqlGuid && right == StorageType.SqlGuid) || (precedence1 > 19 && precedence2 < 20 || precedence1 < 20 && precedence2 > 19))
            {
                return(StorageType.Empty);
            }
            if (precedence1 > 19)
            {
                if (op == Operator.Plus || op == Operator.Minus)
                {
                    if (left == StorageType.TimeSpan)
                    {
                        return(right);
                    }
                    if (right == StorageType.TimeSpan)
                    {
                        return(left);
                    }
                    return(StorageType.Empty);
                }
                if (!Operator.IsRelational(op))
                {
                    return(StorageType.Empty);
                }
                return(left);
            }
            DataTypePrecedence code = (DataTypePrecedence)Math.Max(precedence1, precedence2);

            DataStorageHelper.GetPrecedenceType(code);
            StorageType type = DataStorageHelper.GetPrecedenceType((DataTypePrecedence)DataStorageHelper.SqlResultType((int)code));

            if (Operator.IsArithmetical(op) && type != StorageType.String && (type != StorageType.Char && type != StorageType.SqlString) && (!DataStorageHelper.IsNumericSql(left) || !DataStorageHelper.IsNumericSql(right)))
            {
                return(StorageType.Empty);
            }
            if (op == Operator.Multiply && DataStorageHelper.IsIntegerSql(type))
            {
                return(StorageType.SqlDouble);
            }
            if (type == StorageType.SqlMoney && left != StorageType.SqlMoney && right != StorageType.SqlMoney)
            {
                type = StorageType.SqlDecimal;
            }
            if (!DataStorageHelper.IsMixedSql(left, right) || !DataStorageHelper.IsUnsignedSql(type))
            {
                return(type);
            }
            if (code >= DataTypePrecedence.UInt64)
            {
                throw InvalidExpressionException.AmbiguousBinop(op, DataStorageHelper.GetTypeStorage(left), DataStorageHelper.GetTypeStorage(right));
            }
            return(DataStorageHelper.GetPrecedenceType(code + 1));
        }
Ejemplo n.º 5
0
        private static StorageType GetPrecedenceType(DataTypePrecedence code)
        {
            switch (code)
            {
                case DataTypePrecedence.Error: return StorageType.Empty;
                case DataTypePrecedence.SByte: return StorageType.SByte;
                case DataTypePrecedence.Byte: return StorageType.Byte;
                case DataTypePrecedence.Int16: return StorageType.Int16;
                case DataTypePrecedence.UInt16: return StorageType.UInt16;
                case DataTypePrecedence.Int32: return StorageType.Int32;
                case DataTypePrecedence.UInt32: return StorageType.UInt32;
                case DataTypePrecedence.Int64: return StorageType.Int64;
                case DataTypePrecedence.UInt64: return StorageType.UInt64;
                case DataTypePrecedence.Decimal: return StorageType.Decimal;
                case DataTypePrecedence.Single: return StorageType.Single;
                case DataTypePrecedence.Double: return StorageType.Double;

                case DataTypePrecedence.Boolean: return StorageType.Boolean;
                case DataTypePrecedence.String: return StorageType.String;
                case DataTypePrecedence.Char: return StorageType.Char;

                case DataTypePrecedence.DateTimeOffset: return StorageType.DateTimeOffset;
                case DataTypePrecedence.DateTime: return StorageType.DateTime;
                case DataTypePrecedence.TimeSpan: return StorageType.TimeSpan;

                case DataTypePrecedence.SqlDateTime: return StorageType.SqlDateTime;
                case DataTypePrecedence.SqlDouble: return StorageType.SqlDouble;
                case DataTypePrecedence.SqlSingle: return StorageType.SqlSingle;
                case DataTypePrecedence.SqlDecimal: return StorageType.SqlDecimal;
                case DataTypePrecedence.SqlInt64: return StorageType.SqlInt64;
                case DataTypePrecedence.SqlInt32: return StorageType.SqlInt32;
                case DataTypePrecedence.SqlInt16: return StorageType.SqlInt16;
                case DataTypePrecedence.SqlByte: return StorageType.SqlByte;
                case DataTypePrecedence.SqlBoolean: return StorageType.SqlBoolean;
                case DataTypePrecedence.SqlString: return StorageType.SqlString;
                case DataTypePrecedence.SqlGuid: return StorageType.SqlGuid;
                case DataTypePrecedence.SqlBinary: return StorageType.SqlBinary;
                case DataTypePrecedence.SqlMoney: return StorageType.SqlMoney;
                default:
                    Debug.Assert(false, "Invalid (unmapped) precedence " + code.ToString());
                    goto case DataTypePrecedence.Error;
            }
        }
Ejemplo n.º 6
0
        internal Type ResultType(Type left, Type right, bool lc, bool rc, int op)
        {
            if ((left == typeof(System.Guid)) && (right == typeof(System.Guid)) && Operators.IsRelational(op))
            {
                return(left);
            }

            if ((left == typeof(System.String)) && (right == typeof(System.Guid)) && Operators.IsRelational(op))
            {
                return(left);
            }

            if ((left == typeof(System.Guid)) && (right == typeof(System.String)) && Operators.IsRelational(op))
            {
                return(right);
            }

            int leftPrecedence = (int)GetPrecedence(left);

            if (leftPrecedence == (int)DataTypePrecedence.Error)
            {
                return(null);
            }
            int rightPrecedence = (int)GetPrecedence(right);

            if (rightPrecedence == (int)DataTypePrecedence.Error)
            {
                return(null);
            }

            if (Operators.IsLogical(op))
            {
                if (left == typeof(Boolean) && right == typeof(Boolean))
                {
                    return(typeof(Boolean));
                }
                else
                {
                    return(null);
                }
            }

            if ((op == Operators.Plus) && ((left == typeof(String)) || (right == typeof(String))))
            {
                return(typeof(string));
            }

            DataTypePrecedence higherPrec = (DataTypePrecedence)Math.Max(leftPrecedence, rightPrecedence);


            Type result = GetType(higherPrec);

            if (Operators.IsArithmetical(op))
            {
                if (result != typeof(string) && result != typeof(char))
                {
                    if (!IsNumeric(left))
                    {
                        return(null);
                    }
                    if (!IsNumeric(right))
                    {
                        return(null);
                    }
                }
            }

            // if the operation is a division the result should be at least a double

            if ((op == Operators.Divide) && IsInteger(result))
            {
                return(typeof(double));
            }

            if (IsMixed(left, right))
            {
                // we are dealing with one signed and one unsigned type so
                // try to see if one of them is a ConstNode
                if (lc && (!rc))
                {
                    return(right);
                }
                else if ((!lc) && rc)
                {
                    return(left);
                }

                if (IsUnsigned(result))
                {
                    if (higherPrec < DataTypePrecedence.UInt64)
                    {
                        // left and right are mixed integers but with the same length
                        // so promote to the next signed type
                        result = GetType(higherPrec + 1);
                    }
                    else
                    {
                        throw ExprException.AmbiguousBinop(op, left, right);
                    }
                }
            }

            return(result);
        }
        private static StorageType GetPrecedenceType(DataTypePrecedence code)
        {
            switch (code)
            {
                case DataTypePrecedence.SqlBinary:
                    return StorageType.SqlBinary;

                case DataTypePrecedence.Char:
                    return StorageType.Char;

                case DataTypePrecedence.String:
                    return StorageType.String;

                case DataTypePrecedence.SqlString:
                    return StorageType.SqlString;

                case DataTypePrecedence.SqlGuid:
                    return StorageType.SqlGuid;

                case DataTypePrecedence.Boolean:
                    return StorageType.Boolean;

                case DataTypePrecedence.SqlBoolean:
                    return StorageType.SqlBoolean;

                case DataTypePrecedence.SByte:
                    return StorageType.SByte;

                case DataTypePrecedence.SqlByte:
                    return StorageType.SqlByte;

                case DataTypePrecedence.Byte:
                    return StorageType.Byte;

                case DataTypePrecedence.Int16:
                    return StorageType.Int16;

                case DataTypePrecedence.SqlInt16:
                    return StorageType.SqlInt16;

                case DataTypePrecedence.UInt16:
                    return StorageType.UInt16;

                case DataTypePrecedence.Int32:
                    return StorageType.Int32;

                case DataTypePrecedence.SqlInt32:
                    return StorageType.SqlInt32;

                case DataTypePrecedence.UInt32:
                    return StorageType.UInt32;

                case DataTypePrecedence.Int64:
                    return StorageType.Int64;

                case DataTypePrecedence.SqlInt64:
                    return StorageType.SqlInt64;

                case DataTypePrecedence.UInt64:
                    return StorageType.UInt64;

                case DataTypePrecedence.SqlMoney:
                    return StorageType.SqlMoney;

                case DataTypePrecedence.Decimal:
                    return StorageType.Decimal;

                case DataTypePrecedence.SqlDecimal:
                    return StorageType.SqlDecimal;

                case DataTypePrecedence.Single:
                    return StorageType.Single;

                case DataTypePrecedence.SqlSingle:
                    return StorageType.SqlSingle;

                case DataTypePrecedence.Double:
                    return StorageType.Double;

                case DataTypePrecedence.SqlDouble:
                    return StorageType.SqlDouble;

                case DataTypePrecedence.TimeSpan:
                    return StorageType.TimeSpan;

                case DataTypePrecedence.DateTime:
                    return StorageType.DateTime;

                case DataTypePrecedence.DateTimeOffset:
                    return StorageType.DateTimeOffset;

                case DataTypePrecedence.SqlDateTime:
                    return StorageType.SqlDateTime;
            }
            return StorageType.Empty;
        }
Ejemplo n.º 8
0
        /// <summary>
        ///
        /// </summary>
        public static StorageType ResultSqlType(StorageType left
                                                , StorageType right
                                                , bool lc
                                                , bool rc
                                                , Operator op)
        {
            int leftOpPrecedence = (int)DataStorageHelper.GetPrecedence(left);

            if (leftOpPrecedence == 0)
            {
                return(StorageType.Empty);
            }
            int rightOpPrecedence = (int)DataStorageHelper.GetPrecedence(right);

            if (rightOpPrecedence == 0)
            {
                return(StorageType.Empty);
            }
            if (Operator.IsLogical(op))
            {
                if (((left != StorageType.Boolean) && (left != StorageType.SqlBoolean)) ||
                    ((right != StorageType.Boolean) && (right != StorageType.SqlBoolean)))
                {
                    return(StorageType.Empty);
                }
                if ((left == StorageType.Boolean) && (right == StorageType.Boolean))
                {
                    return(StorageType.Boolean);
                }
                return(StorageType.SqlBoolean);
            }
            if (op == Operator.Plus)
            {
                if ((left == StorageType.SqlString) || (right == StorageType.SqlString))
                {
                    return(StorageType.SqlString);
                }
                if ((left == StorageType.String) || (right == StorageType.String))
                {
                    return(StorageType.String);
                }
            }
            if (((left == StorageType.SqlBinary) && (right != StorageType.SqlBinary)) || ((left != StorageType.SqlBinary) && (right == StorageType.SqlBinary)))
            {
                return(StorageType.Empty);
            }
            if (((left == StorageType.SqlGuid) && (right != StorageType.SqlGuid)) || ((left != StorageType.SqlGuid) && (right == StorageType.SqlGuid)))
            {
                return(StorageType.Empty);
            }
            if ((leftOpPrecedence > 0x13) && (rightOpPrecedence < 20))
            {
                return(StorageType.Empty);
            }
            if ((leftOpPrecedence < 20) && (rightOpPrecedence > 0x13))
            {
                return(StorageType.Empty);
            }
            if (leftOpPrecedence > 0x13)
            {
                if ((op == Operator.Plus) || (op == Operator.Minus))
                {
                    if (left == StorageType.TimeSpan)
                    {
                        return(right);
                    }
                    if (right == StorageType.TimeSpan)
                    {
                        return(left);
                    }
                    return(StorageType.Empty);
                }
                if (!Operator.IsRelational(op))
                {
                    return(StorageType.Empty);
                }
                return(left);
            }
            DataTypePrecedence code           = (DataTypePrecedence)Math.Max(leftOpPrecedence, rightOpPrecedence);
            StorageType        precedenceType = DataStorageHelper.GetPrecedenceType(code);

            precedenceType = DataStorageHelper.GetPrecedenceType((DataTypePrecedence)DataStorageHelper.SqlResultType((int)code));
            if ((Operator.IsArithmetical(op) && (precedenceType != StorageType.String)) && ((precedenceType != StorageType.Char) && (precedenceType != StorageType.SqlString)))
            {
                if (!DataStorageHelper.IsNumericSql(left))
                {
                    return(StorageType.Empty);
                }
                if (!DataStorageHelper.IsNumericSql(right))
                {
                    return(StorageType.Empty);
                }
            }
            if ((op == Operator.Multiply) && DataStorageHelper.IsIntegerSql(precedenceType))
            {
                return(StorageType.SqlDouble);
            }
            if (((precedenceType == StorageType.SqlMoney) && (left != StorageType.SqlMoney)) && (right != StorageType.SqlMoney))
            {
                precedenceType = StorageType.SqlDecimal;
            }
            if (!DataStorageHelper.IsMixedSql(left, right) || !DataStorageHelper.IsUnsignedSql(precedenceType))
            {
                return(precedenceType);
            }
            if (code >= DataTypePrecedence.UInt64)
            {
                throw InvalidExpressionException.AmbiguousBinop(op
                                                                , DataStorageHelper.GetTypeStorage(left)
                                                                , DataStorageHelper.GetTypeStorage(right));
            }
            return(DataStorageHelper.GetPrecedenceType(code + 1));
        }