internal override SqlExpression VisitUnaryOperator(SqlUnary fc) {
            // process the arguments
            SqlExpression result = base.VisitUnaryOperator(fc);
            if (result is SqlUnary) {
                SqlUnary unary = (SqlUnary)result;

                switch (unary.NodeType) {
                    case SqlNodeType.ClrLength:
                        SqlExpression expr = unary.Operand;

                        result = sql.DATALENGTH(expr);

                        if (expr.SqlType.IsUnicodeType) {
                            result = sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression));
                        }

                        result = sql.ConvertToInt(result);
                        break;
                    default:
                        break;
                }
            }

            return result;
        }
Exemplo n.º 2
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     base.VisitUnaryOperator(uo);
     if (uo.NodeType != SqlNodeType.Convert && uo.Operand != null && uo.Operand.SqlType != null) {
         uo.SetSqlType(this.typeProvider.PredictTypeForUnary(uo.NodeType, uo.Operand.SqlType));
     }
     return uo;
 }
Exemplo n.º 3
0
 public void Visit(SqlUnary node)
 {
     if (!node.Operand.IsNullReference())
     {
         Visit(node.Operand);
     }
 }
Exemplo n.º 4
0
            internal override SqlExpression VisitTreat(SqlUnary t)
            {
                t.Operand = this.VisitExpression(t.Operand);
                Type treatType    = t.ClrType;
                Type originalType = model.GetMetaType(t.Operand.ClrType).InheritanceRoot.Type;

                // .NET nullability rules are that typeof(int)==typeof(int?). Let's be consistent with that:
                treatType    = TypeSystem.GetNonNullableType(treatType);
                originalType = TypeSystem.GetNonNullableType(originalType);

                if (treatType == originalType)
                {
                    return(t.Operand);
                }
                if (treatType.IsAssignableFrom(originalType))
                {
                    t.Operand.SetClrType(treatType);
                    return(t.Operand);
                }
                if (!treatType.IsAssignableFrom(originalType) && !originalType.IsAssignableFrom(treatType))
                {
                    if (!treatType.IsInterface && !originalType.IsInterface)
                    {                     // You can't tell when there's an interface involved.
                        // We statically know the TREAT will result in NULL.
                        return(sql.TypedLiteralNull(treatType, t.SourceExpression));
                    }
                }

                //return base.VisitTreat(t);
                return(t);
            }
Exemplo n.º 5
0
        internal SqlExpression TranslateLinkIsNull(SqlUnary expr)
        {
            System.Diagnostics.Debug.Assert(expr.NodeType == SqlNodeType.IsNull || expr.NodeType == SqlNodeType.IsNotNull);

            SqlLink link = expr.Operand as SqlLink;

            if (!(link != null && link.Member.IsAssociation && link.Member.Association.IsForeignKey))
            {
                return(expr);
            }

            List <SqlExpression> exprs = link.KeyExpressions;

            System.Diagnostics.Debug.Assert(exprs.Count > 0);

            SqlExpression exp   = null;
            SqlNodeType   combo = (expr.NodeType == SqlNodeType.IsNull) ? SqlNodeType.Or : SqlNodeType.And;

            for (int i = 0, n = exprs.Count; i < n; i++)
            {
                SqlExpression compare = sql.Unary(expr.NodeType, sql.DoNotVisitExpression(exprs[i]), expr.SourceExpression);
                if (exp == null)
                {
                    exp = compare;
                }
                else
                {
                    exp = sql.Binary(combo, exp, compare);
                }
            }
            return(exp);
        }
Exemplo n.º 6
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     //if (uo.NodeType == SqlNodeType.Convert)
     //{
     //    this.Visit(uo.Operand);
     //    return uo;
     //}
     if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
         uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
     {
         //IFNULL
         //if (!TypeSystem.IsNullableType(uo.ClrType))
         //{
         sb.Append("COALESCE(");
         sb.Append(GetOperator(uo.NodeType));
         sb.Append("(");
         if (uo.Operand == null)
         {
             sb.Append("*");
         }
         else
         {
             Visit(uo.Operand);
         }
         sb.Append("),0)");
         return(uo);
         //}
     }
     return(base.VisitUnaryOperator(uo));
 }
Exemplo n.º 7
0
        public override string Translate(SqlCompilerContext context, SqlUnary node, NodeSection section)
        {
            //substitute UNIQUE predicate with a more complex EXISTS predicate,
            //because UNIQUE is not supported

            if (node.NodeType == SqlNodeType.Unique)
            {
                if (node.Operand is SqlSubQuery origSubselect)
                {
                    var origQuery = SqlDml.QueryRef(origSubselect.Query);
                    var existsOp  = SqlDml.Select(origQuery);
                    existsOp.Columns.Add(1);
                    existsOp.Where = true;
                    foreach (SqlColumn col in origQuery.Columns)
                    {
                        existsOp.Where = existsOp.Where && SqlDml.IsNotNull(col);
                        existsOp.GroupBy.Add(col);
                    }
                    existsOp.Having = SqlDml.Count(SqlDml.Asterisk) > 1;
                    existsOp.Limit  = 1;

                    node.ReplaceWith(SqlDml.Not(SqlDml.Exists(existsOp)));
                }
            }
            return(base.Translate(context, node, section));
        }
        private static SqlColumn UnwrapColumn(SqlExpression expr)
        {
            System.Diagnostics.Debug.Assert(expr != null);

            SqlUnary exprAsUnary = expr as SqlUnary;

            if (exprAsUnary != null)
            {
                expr = exprAsUnary.Operand;
            }

            SqlColumn exprAsColumn = expr as SqlColumn;

            if (exprAsColumn != null)
            {
                return(exprAsColumn);
            }

            SqlColumnRef exprAsColumnRef = expr as SqlColumnRef;

            if (exprAsColumnRef != null)
            {
                return(exprAsColumnRef.GetRootColumn());
            }
            //
            // For all other types return null to revert to default behavior for Equals()
            // and GetHashCode()
            //
            return(null);
        }
Exemplo n.º 9
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                SqlNodeType nodeType = uo.NodeType;

                if (nodeType <= SqlNodeType.LongCount)
                {
                    switch (nodeType)
                    {
                    case SqlNodeType.Avg:
                    case SqlNodeType.Count:
                    case SqlNodeType.LongCount:
                        goto Label_002B;
                    }
                    goto Label_0034;
                }
                if (((nodeType != SqlNodeType.Max) && (nodeType != SqlNodeType.Min)) && (nodeType != SqlNodeType.Sum))
                {
                    goto Label_0034;
                }
Label_002B:
                this.hasAggregates = true;
                return(uo);

Label_0034:
                return(base.VisitUnaryOperator(uo));
            }
        internal override SqlExpression VisitUnaryOperator(SqlUnary fc)
        {
            // process the arguments
            SqlExpression result = base.VisitUnaryOperator(fc);

            if (result is SqlUnary)
            {
                SqlUnary unary = (SqlUnary)result;

                switch (unary.NodeType)
                {
                case SqlNodeType.ClrLength:
                    SqlExpression expr = unary.Operand;

                    result = sql.FunctionCallDataLength(expr);

                    if (expr.SqlType.IsUnicodeType)
                    {
                        result = sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression));
                    }

                    result = sql.ConvertToInt(result);
                    break;

                default:
                    break;
                }
            }

            return(result);
        }
Exemplo n.º 11
0
        public void SqlUnaryCloneTest()
        {
            SqlUnary u      = -SqlDml.Literal(1);
            SqlUnary uClone = (SqlUnary)u.Clone();

            Assert.AreNotEqual(u, uClone);
            Assert.AreEqual(u.NodeType, uClone.NodeType);
        }
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     if (uo.NodeType.IsUnaryOperatorExpectingPredicateOperand()) {
         uo.Operand = this.VisitPredicate(uo.Operand);
     } else {
         uo.Operand = this.VisitExpression(uo.Operand);
     }
     return uo;
 }
Exemplo n.º 13
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     if (uo.NodeType == SqlNodeType.Convert)
     {
         return(VisitExpression(uo.Operand));
     }
     return(base.VisitUnaryOperator(uo));
 }
Exemplo n.º 14
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     base.VisitUnaryOperator(uo);
     if (uo.NodeType != SqlNodeType.Convert && uo.Operand != null && uo.Operand.SqlType != null)
     {
         uo.SetSqlType(this.typeProvider.PredictTypeForUnary(uo.NodeType, uo.Operand.SqlType));
     }
     return(uo);
 }
Exemplo n.º 15
0
 /// <inheritdoc/>
 public override void Visit(SqlUnary node)
 {
     if (node.NodeType == SqlNodeType.BitNot)
     {
         Visit(BitNot(node.Operand));
         return;
     }
     base.Visit(node);
 }
Exemplo n.º 16
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
 {
     if (uo.NodeType.IsUnaryOperatorExpectingPredicateOperand())
     {
         uo.Operand = this.VisitPredicate(uo.Operand);
         return(uo);
     }
     uo.Operand = this.VisitExpression(uo.Operand);
     return(uo);
 }
Exemplo n.º 17
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                if (uo.NodeType == SqlNodeType.Max || uo.NodeType == SqlNodeType.Min ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    Debug.Assert(uo.ClrType != null);

                    sb.Append("IIF(");

                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    if (uo.Operand == null)
                    {
                        sb.Append("*");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }
                    sb.Append(")");

                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format(" IS NULL, '{0}', ", ((DateTime)defaultValue).ToShortDateString()));
                    }
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format(" IS NULL, '{0}', ", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format(" IS NULL, {0}, ", defaultValue));
                    }

                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    if (uo.Operand == null)
                    {
                        sb.Append("*");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }
                    sb.Append(")");

                    sb.Append(")");
                    return(uo);
                }
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 18
0
            protected override SqlExpression TranslateConverter(SqlUnary uo)
            {
                sb.Append("CAST(");
                QueryFormatOptions none = QueryFormatOptions.None;

                if (uo.Operand.SqlType.CanSuppressSizeForConversionToString)
                {
                    none = QueryFormatOptions.SuppressSize;
                }
                Visit(uo.Operand);
                sb.Append(" AS ");
                var sqlType = (MySqlDataType)uo.SqlType;

                switch (sqlType.Category)
                {
                case DBTypeCategory.Binary:
                    sb.Append("BINARY");
                    break;

                case DBTypeCategory.Numeric:
                    switch (sqlType.SqlDbType)
                    {
                    case MySqlDbType.Decimal:
                    case MySqlDbType.Double:
                    case MySqlDbType.Float:
                        sb.Append("DECIMAL");
                        break;

                    default:
                        if (sqlType.SqlDbType.ToString()[0] == 'U')
                        {
                            sb.Append("UNSIGNED");
                        }
                        else
                        {
                            sb.Append("SIGNED");
                        }
                        break;
                    }
                    break;

                case DBTypeCategory.Text:
                    sb.Append("CHAR");
                    break;

                case DBTypeCategory.DateTime:
                    sb.Append("DATETIME");
                    break;
                }
                sb.Append(")");
                return(uo);
            }
Exemplo n.º 19
0
        public override void Visit(SqlUnary node)
        {
            switch (node.NodeType)
            {
            case SqlNodeType.BitNot:
                BitNot(node.Operand).AcceptVisitor(this);
                return;

            default:
                base.Visit(node);
                return;
            }
        }
Exemplo n.º 20
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                if (uo.NodeType == SqlNodeType.BitNot)
                {
                    sb.Append("BITNOT(");
                    Visit(uo.Operand);
                    sb.Append(")");
                    return(uo);
                }

                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    Debug.Assert(uo.Operand != null);

                    sb.Append("NVL(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    Visit(uo.Operand);

                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format("), TO_DATE('{0}', 'YYYY-MM-DD'))", ((DateTime)defaultValue).ToString("yyyy-MM-dd")));
                    }
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format("),'{0}')", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format("),{0})", defaultValue));
                    }

                    //sb.Append("),0)");

                    return(uo);
                }
                //if (uo.Operand.NodeType == SqlNodeType.Convert)
                //{
                //    var dbType1 = uo.SqlType;
                //    var dbType2 = uo.SqlType;
                //    if (dbType1.IsNumeric && dbType2.IsNumeric)
                //    {
                //        base.Visit(uo.Operand);
                //        return uo;
                //    }

                //}
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 21
0
            protected override SqlExpression TranslateConverter(SqlUnary uo)
            {
                if (uo.SqlType.IsNumeric)
                {
                    if (prevConvert != ConvertType.Number)
                    {
                        sb.Append("TO_NUMBER(");
                        prevConvert = ConvertType.Number;
                        Visit(uo.Operand);
                        sb.Append(")");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }
                }
                else if (uo.SqlType.IsString || uo.SqlType.IsChar)
                {
                    if (prevConvert != ConvertType.Char)
                    {
                        prevConvert = ConvertType.Char;
                        sb.Append("TO_CHAR(");
                        Visit(uo.Operand);
                        sb.Append(")");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }
                }
                else if (uo.ClrType == typeof(DateTime))
                {
                    if (prevConvert != ConvertType.Date)
                    {
                        prevConvert = ConvertType.Date;

                        sb.Append("TO_DATE(");
                        Visit(uo.Operand);
                        sb.Append(",'YYYY-MM-DD HH24:MI:SS')");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }
                }
                else
                {
                    Visit(uo.Operand);
                }
                return(uo);
            }
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     switch (uo.NodeType) {
         case SqlNodeType.Min:
         case SqlNodeType.Max:
         case SqlNodeType.Avg:
         case SqlNodeType.Sum:
         case SqlNodeType.Count:
         case SqlNodeType.LongCount:
             this.hasAggregates = true;
             return uo;
         default:
             return base.VisitUnaryOperator(uo);
     }
 }
Exemplo n.º 23
0
        internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
            uo.Operand = this.VisitExpression(uo.Operand);
            if (uo.NodeType != SqlNodeType.Convert) {
                return uo;
            }
            ProviderType oldSqlType = uo.Operand.SqlType;
            ProviderType newSqlType = uo.SqlType;
            Type oldClrType = TypeSystem.GetNonNullableType(uo.Operand.ClrType);
            Type newClrType = TypeSystem.GetNonNullableType(uo.ClrType);

            if (newClrType == typeof(char)) {
                if (oldClrType == typeof(bool)) {
                    throw Error.ConvertToCharFromBoolNotSupported();
                }

                if (oldSqlType.IsNumeric) {
                    // numeric --> char
                    return sql.FunctionCall(uo.ClrType, "NCHAR", new SqlExpression[] { uo.Operand }, uo.SourceExpression);
                }

                if (StringConversionIsSafe(oldSqlType, newSqlType)) {
                    if (StringConversionIsNeeded(oldSqlType, newSqlType)) {
                        // set the new size to the (potentially smaller) oldSqlType.Size
                        uo.SetSqlType(sql.TypeProvider.From(uo.ClrType, oldSqlType.HasSizeOrIsLarge ? oldSqlType.Size : (int?)null));
                    }
                } else {
                    throw Error.UnsafeStringConversion(oldSqlType.ToQueryString(), newSqlType.ToQueryString());
                }
            } else if (oldClrType == typeof(char) && (oldSqlType.IsChar || oldSqlType.IsString) && newSqlType.IsNumeric) {
                // char --> int 
                return sql.FunctionCall(newClrType, sql.TypeProvider.From(typeof(int)), "UNICODE", new SqlExpression[] { uo.Operand }, uo.SourceExpression);
            } else if (newClrType == typeof(string)) {
                if (oldClrType == typeof(double)) {
                    // use longer format if it was a double in the CLR expression
                    return ConvertDoubleToString(uo.Operand, uo.ClrType);
                } else if (oldClrType == typeof(bool)) {
                    // use 'true' or 'false' if it was a bool in the CLR expression
                    return ConvertBitToString(uo.Operand, uo.ClrType);
                } else if (StringConversionIsSafe(oldSqlType, newSqlType)) {
                    if (StringConversionIsNeeded(oldSqlType, newSqlType)) {
                        // set the new size to the (potentially smaller) oldSqlType.Size
                        uo.SetSqlType(sql.TypeProvider.From(uo.ClrType, oldSqlType.HasSizeOrIsLarge ? oldSqlType.Size : (int?)null));
                    }
                } else {
                    throw Error.UnsafeStringConversion(oldSqlType.ToQueryString(), newSqlType.ToQueryString());
                }
            }
            return uo;
        }
Exemplo n.º 24
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                //if (uo.NodeType == SqlNodeType.Convert)
                //{
                //    this.Visit(uo.Operand);
                //    return uo;
                //}
                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    //IFNULL
                    //if (!TypeSystem.IsNullableType(uo.ClrType))
                    //{
                    sb.Append("COALESCE(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    if (uo.Operand == null)
                    {
                        sb.Append("*");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }

                    //============================================================
                    // 说明:增加对类型的判断
                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format("),'{0}') ", ((DateTime)defaultValue).ToShortDateString()));
                    }
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format("),'{0}') ", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format("),{0}) ", defaultValue));
                    }
                    //============================================================
                    //sb.Append("),0)"); 旧代码
                    //============================================================

                    return(uo);
                    //}
                }
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 25
0
            protected override SqlExpression TranslateConverter(SqlUnary uo)
            {
                sb.Append("CAST(");
                QueryFormatOptions none = QueryFormatOptions.None;

                if (uo.Operand.SqlType.CanSuppressSizeForConversionToString)
                {
                    none = QueryFormatOptions.SuppressSize;
                }
                Visit(uo.Operand);
                sb.Append(" AS ");
                sb.Append(uo.SqlType.ToQueryString(none));
                sb.Append(")");
                return(uo);
            }
Exemplo n.º 26
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                switch (uo.NodeType)
                {
                case SqlNodeType.Min:
                case SqlNodeType.Max:
                case SqlNodeType.Avg:
                case SqlNodeType.Sum:
                case SqlNodeType.Count:
                case SqlNodeType.LongCount:
                    this.hasAggregates = true;
                    return(uo);

                default:
                    return(base.VisitUnaryOperator(uo));
                }
            }
Exemplo n.º 27
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                if (uo.NodeType == SqlNodeType.BitNot)
                {
                    sb.Append("BITNOT(");
                    Visit(uo.Operand);
                    sb.Append(")");
                    return(uo);
                }

                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    Debug.Assert(uo.Operand != null);

                    sb.Append("NVL(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    Visit(uo.Operand);

                    //============================================================
                    // 说明:增加对类型的判断
                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format("), CAST('{0}' AS DATE))", ((DateTime)defaultValue).ToShortDateString()));
                    }
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format("),'{0}')", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format("),{0})", defaultValue));
                    }
                    //============================================================
                    //sb.Append("),0)"); 旧代码
                    //============================================================

                    return(uo);
                }

                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 28
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                //if (uo.NodeType == SqlNodeType.Convert)
                //{
                //
                //    base.Visit(uo.Operand);
                //    return uo;
                //}
                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    //if (!TypeSystem.IsNullableType(uo.ClrType))
                    //{
                    sb.Append("IFNULL(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    if (uo.Operand == null)
                    {
                        sb.Append("*");
                    }
                    else
                    {
                        Visit(uo.Operand);
                    }

                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format("), CAST('{0}' AS DATETIME))", ((DateTime)defaultValue).ToShortDateString()));
                    }
                    // sb.Append(string.Format("), DATE('{0}'))", ((DateTime)defaultValue).ToString("yyyy-MM-dd")));
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format("),'{0}')", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format("),{0})", defaultValue));
                    }

                    return(uo);
                }
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 29
0
            //禁用转换
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                //dont's use convert function
                if (uo.NodeType == SqlNodeType.Convert)
                {
                    Visit(uo.Operand);
                    return(uo);
                }
                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    //if (!TypeSystem.IsNullableType(uo.ClrType))
                    //{
                    Debug.Assert(uo.Operand != null);

                    sb.Append("IFNULL(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    Visit(uo.Operand);

                    //============================================================
                    // 说明:增加对类型的判断
                    var defaultValue = TypeSystem.GetDefaultValue(uo.ClrType);
                    if (defaultValue is DateTime)
                    {
                        sb.Append(string.Format("), DATE('{0}'))", ((DateTime)defaultValue).ToShortDateString()));
                    }
                    else if (defaultValue is string)
                    {
                        sb.Append(string.Format("),'{0}')", defaultValue));
                    }
                    else
                    {
                        sb.Append(string.Format("),{0})", defaultValue));
                    }
                    //============================================================
                    //sb.Append("),0)"); 旧代码
                    //============================================================

                    return(uo);
                    //}
                }
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 30
0
            protected override SqlExpression VisitUnary(SqlUnary expr)
            {
                string op = GetUnaryOperator(expr.Operation);

                switch (expr.Operation)
                {
                case SqlUnaryOperation.IsNull:
                case SqlUnaryOperation.IsNotNull:
                    AddParentheses(expr.Operand, expr);
                    _builder.Append(op);
                    break;

                default:
                    _builder.Append(op);
                    AddParentheses(expr.Operand, expr);
                    break;
                }
                return(expr);
            }
Exemplo n.º 31
0
            //internal override string GetBoolValue(bool value)
            //{
            //    return value ? "true" : "false";
            //}

            internal override SqlExpression VisitUnaryOperator(SqlUnary uo)
            {
                if (uo.NodeType == SqlNodeType.Min || uo.NodeType == SqlNodeType.Max ||
                    uo.NodeType == SqlNodeType.Avg || uo.NodeType == SqlNodeType.Sum)
                {
                    //if (!TypeSystem.IsNullableType(uo.ClrType))
                    //{
                    Debug.Assert(uo.Operand != null);

                    sb.Append("IFNULL(");
                    sb.Append(GetOperator(uo.NodeType));
                    sb.Append("(");
                    Visit(uo.Operand);
                    sb.Append("),0)");
                    return(uo);
                    //}
                }
                return(base.VisitUnaryOperator(uo));
            }
Exemplo n.º 32
0
        public void SqlUnaryReplacingTest()
        {
            SqlUnary u          = -SqlDml.Literal(1);
            SqlUnary uReplacing = ~SqlDml.Literal(2);

            u.ReplaceWith(uReplacing);

            bool passed = false;

            try {
                u.ReplaceWith(1);
            }
            catch {
                passed = true;
            }

            Assert.IsTrue(passed);
            Assert.AreNotEqual(u, uReplacing);
            Assert.AreEqual(u.NodeType, uReplacing.NodeType);
            Assert.AreEqual(u.Operand, uReplacing.Operand);
        }
Exemplo n.º 33
0
            protected override SqlExpression TranslateConverter(SqlUnary uo)
            {
                //兼容类型,无需转换
                switch (((SqlDataType <DB2Type>)uo.SqlType).Category)
                {
                case DBTypeCategory.Text:
                    if (uo.Operand.ClrType == typeof(char) || uo.Operand.ClrType == typeof(string))
                    {
                        Visit(uo.Operand);
                        return(uo);
                    }
                    break;

                case DBTypeCategory.Numeric:
                    //if (uo.Operand.ClrType == typeof(int) || uo.Operand.ClrType == typeof(Int16) ||
                    //   uo.Operand.ClrType == typeof(long) || uo.Operand.ClrType == typeof(byte))
                    if (uo.Operand.ClrType.IsValueType)
                    {
                        Visit(uo.Operand);
                        return(uo);
                    }
                    break;
                }


                sb.Append("CAST(");
                QueryFormatOptions none = QueryFormatOptions.None;

                if (uo.Operand.SqlType.CanSuppressSizeForConversionToString)
                {
                    none = QueryFormatOptions.SuppressSize;
                }
                Visit(uo.Operand);
                sb.Append(" AS ");
                sb.Append(uo.SqlType.ToQueryString(none));
                sb.Append(")");
                return(uo);
            }
Exemplo n.º 34
0
 internal override SqlExpression VisitCast(SqlUnary c) {
     sb.Append("CAST(");
     this.Visit(c.Operand);
     sb.Append(" AS ");
     QueryFormatOptions options = QueryFormatOptions.None;
     if (c.Operand.SqlType.CanSuppressSizeForConversionToString) {
         options = QueryFormatOptions.SuppressSize;
     }
     sb.Append(c.SqlType.ToQueryString(options));
     sb.Append(")");
     return c;
 }
Exemplo n.º 35
0
 protected virtual SqlExpression VisitUnary(SqlUnary expr)
 {
     return expr;
 }
Exemplo n.º 36
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     switch (uo.NodeType) {
         case SqlNodeType.Not:
         case SqlNodeType.Not2V:
             this.sb.Append(GetOperator(uo.NodeType));
             this.sb.Append(" ");
             this.VisitWithParens(uo.Operand, uo);
             break;
         case SqlNodeType.Negate:
         case SqlNodeType.BitNot:
             this.sb.Append(GetOperator(uo.NodeType));
             this.VisitWithParens(uo.Operand, uo);
             break;
         case SqlNodeType.Count:
         case SqlNodeType.LongCount:
         case SqlNodeType.Max:
         case SqlNodeType.Min:
         case SqlNodeType.Sum:
         case SqlNodeType.Avg:
         case SqlNodeType.Stddev:
         case SqlNodeType.ClrLength:{
                 this.sb.Append(GetOperator(uo.NodeType));
                 this.sb.Append("(");
                 if (uo.Operand == null) {
                     this.sb.Append("*");
                 } else {
                     this.Visit(uo.Operand);
                 }
                 this.sb.Append(")");
                 break;
             }
         case SqlNodeType.IsNull:
         case SqlNodeType.IsNotNull: {
                 this.VisitWithParens(uo.Operand, uo);
                 sb.Append(" ");
                 sb.Append(GetOperator(uo.NodeType));
                 break;
             }
         case SqlNodeType.Convert: {
                 this.sb.Append("CONVERT(");
                 QueryFormatOptions options = QueryFormatOptions.None; 
                 if(uo.Operand.SqlType.CanSuppressSizeForConversionToString) {
                     options = QueryFormatOptions.SuppressSize;
                 }
                 this.sb.Append(uo.SqlType.ToQueryString(options));
                 this.sb.Append(",");
                 this.Visit(uo.Operand);
                 this.sb.Append(")");
                 break;
             }
         case SqlNodeType.ValueOf:
         case SqlNodeType.OuterJoinedValue:
             this.Visit(uo.Operand); // no op
             break;
         default:
             throw Error.InvalidFormatNode(uo.NodeType);
     }
     return uo;
 }
Exemplo n.º 37
0
 internal virtual SqlExpression VisitCast(SqlUnary c) {
     c.Operand = this.VisitExpression(c.Operand);
     return c;
 }
 // transform type conversion if necessary
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     if (uo.NodeType == SqlNodeType.Convert) {
         Type newType = uo.ClrType;
         SqlExpression expr = uo.Operand;
         if (newType == typeof(char) || expr.ClrType == typeof(char)) {
             expr = this.VisitExpression(uo.Operand);
             uo.Operand = expr;
             return sql.ConvertTo(newType, uo.SqlType, expr);
         }
     }
     return base.VisitUnaryOperator(uo);
 }
Exemplo n.º 39
0
 internal virtual SqlExpression VisitTreat(SqlUnary t) {
     t.Operand = this.VisitExpression(t.Operand);
     return t;
 }
Exemplo n.º 40
0
 internal virtual SqlExpression VisitTreat(SqlUnary t) {
     t.Operand = this.VisitExpression(t.Operand);
     return t;
 }
Exemplo n.º 41
0
        internal SqlExpression TranslateLinkIsNull(SqlUnary expr) {
            System.Diagnostics.Debug.Assert(expr.NodeType == SqlNodeType.IsNull || expr.NodeType == SqlNodeType.IsNotNull);

            SqlLink link = expr.Operand as SqlLink;
            if (!(link != null && link.Member.IsAssociation && link.Member.Association.IsForeignKey)) {
                return expr;
            }

            List<SqlExpression> exprs = link.KeyExpressions;
            System.Diagnostics.Debug.Assert(exprs.Count > 0);

            SqlExpression exp = null;
            SqlNodeType combo = (expr.NodeType == SqlNodeType.IsNull) ? SqlNodeType.Or : SqlNodeType.And;
            for (int i = 0, n = exprs.Count; i < n; i++) {
                SqlExpression compare = sql.Unary(expr.NodeType, sql.DoNotVisitExpression(exprs[i]), expr.SourceExpression);
                if (exp == null) {
                    exp = compare;
                }
                else {
                    exp = sql.Binary(combo, exp, compare);
                }
            }
            return exp;
        }
Exemplo n.º 42
0
 internal virtual SqlExpression VisitCast(SqlUnary c) {
     c.Operand = this.VisitExpression(c.Operand);
     return c;
 }
Exemplo n.º 43
0
 internal override SqlExpression VisitTreat(SqlUnary t) {
     return new SqlUnary(SqlNodeType.Treat, t.ClrType, t.SqlType, (SqlExpression)this.Visit(t.Operand), t.SourceExpression);
 }
Exemplo n.º 44
0
 internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
     return new SqlUnary(uo.NodeType, uo.ClrType, uo.SqlType, (SqlExpression)this.Visit(uo.Operand), uo.Method, uo.SourceExpression);
 }
Exemplo n.º 45
0
 protected override SqlExpression VisitUnary(SqlUnary expr)
 {
     string op = GetUnaryOperator(expr.Operation);
     switch (expr.Operation)
     {
         case SqlUnaryOperation.IsNull:
         case SqlUnaryOperation.IsNotNull:
             AddParentheses(expr.Operand, expr);
             _builder.Append(op);
             break;
         default:
             _builder.Append(op);
             AddParentheses(expr.Operand, expr);
             break;
     }
     return expr;
 }
 private static bool IsSupportedUnary(SqlUnary uo) {
     return uo.NodeType == SqlNodeType.Convert &&
            uo.ClrType == typeof(char) || uo.Operand.ClrType == typeof(char);
 }
Exemplo n.º 47
0
 internal override SqlExpression VisitTreat(SqlUnary t) {
     sb.Append("TREAT(");
     this.Visit(t.Operand);
     sb.Append(" AS ");
     this.FormatType(t.SqlType);
     sb.Append(")");
     return t;
 }
Exemplo n.º 48
0
 internal override SqlExpression VisitTreat(SqlUnary a) {
     return VisitUnaryOperator(a);
 }
Exemplo n.º 49
0
            internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
                uo.Operand = this.VisitExpression(uo.Operand);
                // ------------------------------------------------------------
                // PHASE 1: If possible, evaluate without fetching the operand.
                // This is preferred because fetching LINKs causes them to not
                // be deferred.
                // ------------------------------------------------------------
                if (uo.NodeType == SqlNodeType.IsNull || uo.NodeType == SqlNodeType.IsNotNull) {
                    SqlExpression translated = this.translator.TranslateLinkIsNull(uo);
                    if (translated != uo) {
                        return this.VisitExpression(translated);
                    }
                    if (uo.Operand.NodeType==SqlNodeType.OuterJoinedValue) {
                        SqlUnary ojv = uo.Operand as SqlUnary;
                        if (ojv.Operand.NodeType == SqlNodeType.OptionalValue) {
                            SqlOptionalValue ov = (SqlOptionalValue)ojv.Operand;
                            return this.VisitUnaryOperator(
                                new SqlUnary(uo.NodeType, uo.ClrType, uo.SqlType,
                                    new SqlUnary(SqlNodeType.OuterJoinedValue, ov.ClrType, ov.SqlType, ov.HasValue, ov.SourceExpression)
                                , uo.SourceExpression)
                            );
                        }
                        else if (ojv.Operand.NodeType == SqlNodeType.TypeCase) {
                            SqlTypeCase tc = (SqlTypeCase)ojv.Operand;
                            return new SqlUnary(uo.NodeType, uo.ClrType, uo.SqlType,
                                       new SqlUnary(SqlNodeType.OuterJoinedValue, tc.Discriminator.ClrType, tc.Discriminator.SqlType, tc.Discriminator, tc.SourceExpression),
                                       uo.SourceExpression
                                       );
                        }
                    }
                }

                // Fetch the expression.
                uo.Operand = this.ConvertToFetchedExpression(uo.Operand);

                // ------------------------------------------------------------
                // PHASE 2: Evaluate operator on fetched expression.
                // ------------------------------------------------------------
                if ((uo.NodeType == SqlNodeType.Not || uo.NodeType == SqlNodeType.Not2V) && uo.Operand.NodeType == SqlNodeType.Value) {
                    SqlValue val = (SqlValue)uo.Operand;
                    return sql.Value(typeof(bool), val.SqlType, !(bool)val.Value, val.IsClientSpecified, val.SourceExpression);
                }
                else if (uo.NodeType == SqlNodeType.Not2V) {
                    if (SqlExpressionNullability.CanBeNull(uo.Operand) != false) {
                        SqlSearchedCase c = new SqlSearchedCase(
                            typeof(int),
                            new [] { new SqlWhen(uo.Operand, sql.ValueFromObject(1, false, uo.SourceExpression)) },
                            sql.ValueFromObject(0, false, uo.SourceExpression),
                            uo.SourceExpression
                            );
                        return sql.Binary(SqlNodeType.EQ, c, sql.ValueFromObject(0, false, uo.SourceExpression));
                    }
                    else {
                        return sql.Unary(SqlNodeType.Not, uo.Operand);
                    }
                }
                // push converts of client-expressions inside the client-expression (to be evaluated client side) 
                else if (uo.NodeType == SqlNodeType.Convert && uo.Operand.NodeType == SqlNodeType.Value) {
                    SqlValue val = (SqlValue)uo.Operand;
                    return sql.Value(uo.ClrType, uo.SqlType, DBConvert.ChangeType(val.Value, uo.ClrType), val.IsClientSpecified, val.SourceExpression);
                }
                else if (uo.NodeType == SqlNodeType.IsNull || uo.NodeType == SqlNodeType.IsNotNull) {
                    bool? canBeNull = SqlExpressionNullability.CanBeNull(uo.Operand);
                    if (canBeNull == false) {
                        return sql.ValueFromObject(uo.NodeType == SqlNodeType.IsNotNull, false, uo.SourceExpression);
                    }
                    SqlExpression exp = uo.Operand;
                    switch (exp.NodeType) {
                        case SqlNodeType.Element:
                            exp = sql.SubSelect(SqlNodeType.Exists, ((SqlSubSelect)exp).Select);
                            if (uo.NodeType == SqlNodeType.IsNull) {
                                exp = sql.Unary(SqlNodeType.Not, exp, exp.SourceExpression);
                            }
                            return exp;
                        case SqlNodeType.ClientQuery: {
                                SqlClientQuery cq = (SqlClientQuery)exp;
                                if (cq.Query.NodeType == SqlNodeType.Element) {
                                    exp = sql.SubSelect(SqlNodeType.Exists, cq.Query.Select);
                                    if (uo.NodeType == SqlNodeType.IsNull) {
                                        exp = sql.Unary(SqlNodeType.Not, exp, exp.SourceExpression);
                                    }
                                    return exp;
                                }
                                return sql.ValueFromObject(uo.NodeType == SqlNodeType.IsNotNull, false, uo.SourceExpression);
                            }
                        case SqlNodeType.OptionalValue:
                            uo.Operand = ((SqlOptionalValue)exp).HasValue;
                            return uo;

                        case SqlNodeType.ClientCase: {
                                // Distribute unary into simple case.
                                SqlClientCase sc = (SqlClientCase)uo.Operand;
                                List<SqlExpression> matches = new List<SqlExpression>();
                                List<SqlExpression> values = new List<SqlExpression>();
                                foreach (SqlClientWhen when in sc.Whens) {
                                    matches.Add(when.Match);
                                    values.Add(VisitUnaryOperator(sql.Unary(uo.NodeType, when.Value, when.Value.SourceExpression)));
                                }
                                return sql.Case(sc.ClrType, sc.Expression, matches, values, sc.SourceExpression);
                            }
                        case SqlNodeType.TypeCase: {
                                // Distribute unary into type case. In the process, convert to simple case.
                                SqlTypeCase tc = (SqlTypeCase)uo.Operand;
                                List<SqlExpression> newMatches = new List<SqlExpression>();
                                List<SqlExpression> newValues = new List<SqlExpression>();
                                foreach (SqlTypeCaseWhen when in tc.Whens) {
                                    SqlUnary un = new SqlUnary(uo.NodeType, uo.ClrType, uo.SqlType, when.TypeBinding, when.TypeBinding.SourceExpression);
                                    SqlExpression expr = VisitUnaryOperator(un);
                                    if (expr is SqlNew) {
                                        throw Error.DidNotExpectTypeBinding();
                                    }
                                    newMatches.Add(when.Match);
                                    newValues.Add(expr);
                                }
                                return sql.Case(uo.ClrType, tc.Discriminator, newMatches, newValues, tc.SourceExpression);
                            }
                        case SqlNodeType.Value: {
                                SqlValue val = (SqlValue)uo.Operand;
                                return sql.Value(typeof(bool), this.typeProvider.From(typeof(int)), (val.Value == null) == (uo.NodeType == SqlNodeType.IsNull), val.IsClientSpecified, uo.SourceExpression);
                            }
                    }
                }
                else if (uo.NodeType == SqlNodeType.Treat) {
                    return ApplyTreat(VisitExpression(uo.Operand), uo.ClrType);
                }

                return uo;
            }
Exemplo n.º 50
0
 internal virtual SqlExpression VisitUnaryOperator(SqlUnary uo) {
     uo.Operand = this.VisitExpression(uo.Operand);
     return uo;
 }
            internal override SqlExpression VisitTreat(SqlUnary t) {
                t.Operand = this.VisitExpression(t.Operand);
                Type treatType = t.ClrType;
                Type originalType = model.GetMetaType(t.Operand.ClrType).InheritanceRoot.Type;

                // .NET nullability rules are that typeof(int)==typeof(int?). Let's be consistent with that:
                treatType = TypeSystem.GetNonNullableType(treatType);
                originalType = TypeSystem.GetNonNullableType(originalType);

                if (treatType == originalType) {
                    return t.Operand;
                }
                else if (treatType.IsAssignableFrom(originalType)) {
                    t.Operand.SetClrType(treatType);
                    return t.Operand;
                }
                else if (!treatType.IsAssignableFrom(originalType) && !originalType.IsAssignableFrom(treatType)) {
                    if (!treatType.IsInterface && !originalType.IsInterface) { // You can't tell when there's an interface involved.
                        // We statically know the TREAT will result in NULL.
                        return sql.TypedLiteralNull(treatType, t.SourceExpression);
                    }
                }
                //return base.VisitTreat(t);
                return t;
            }