Exemplo n.º 1
0
            ByteSlice Conv_LongToDouble(ByteSlice value, int ResultSize, DbFunctionTools tools)
            {
                long    x = tools.GetLong(value);
                DbValue v = tools.AllocValue((double)x);

                return(v.Eval());
            }
Exemplo n.º 2
0
        public static DbValue SUM(DbFunctionTools tools, DbAggregatorArguments args)
        {
            string AggregatorName = "SUM";

            double sumd     = 0;
            int    sumi     = 0;
            long   suml     = 0;
            DbType arg0type = DbType.PrepareNull();

            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(AggregatorName, 1);
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {
                    switch (arg0type.ID)
                    {
                    case DbTypeID.INT:
                        sumi += tools.GetInt(arg0);
                        break;

                    case DbTypeID.LONG:
                        suml += tools.GetLong(arg0);
                        break;

                    case DbTypeID.DOUBLE:
                        sumd += tools.GetDouble(arg0);
                        break;

                    default:
                        args[iarg].Expected(AggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                        return(null);    // Doesn't reach here.
                    }
                }
            }

            if (args.Length > 0)
            {
                switch (arg0type.ID)
                {
                case DbTypeID.INT:
                    return(tools.AllocValue(sumi));

                    break;

                case DbTypeID.LONG:
                    return(tools.AllocValue(suml));

                    break;

                case DbTypeID.DOUBLE:
                    return(tools.AllocValue(sumd));

                    break;
                }
            }

            return(tools.AllocValue(sumi));
        }
Exemplo n.º 3
0
        public static DbValue SUM(DbFunctionTools tools, DbAggregatorArguments args)
        {
            string AggregatorName = "SUM";

            double sumd = 0;
            int sumi = 0;
            long suml = 0;
            DbType arg0type = DbType.PrepareNull();
            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(AggregatorName, 1);                
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {                    
                    switch (arg0type.ID)
                    {
                        case DbTypeID.INT:
                            sumi += tools.GetInt(arg0);
                            break;

                        case DbTypeID.LONG:
                            suml += tools.GetLong(arg0);
                            break;

                        case DbTypeID.DOUBLE:
                            sumd += tools.GetDouble(arg0);
                            break;

                        default:
                            args[iarg].Expected(AggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                            return null; // Doesn't reach here.
                    }
                }
            }

            if (args.Length > 0)
            {
                switch (arg0type.ID)
                {
                    case DbTypeID.INT:
                        return tools.AllocValue(sumi);
                        break;

                    case DbTypeID.LONG:
                        return tools.AllocValue(suml);
                        break;

                    case DbTypeID.DOUBLE:
                        return tools.AllocValue(sumd);
                        break;
                }
            }

            return tools.AllocValue(sumi);
        }
Exemplo n.º 4
0
        private static double _VAR(string aggregatorName, DbFunctionTools tools, DbAggregatorArguments args, bool sample)
        {
            List <double> values = new List <double>();
            double        x      = 0;
            double        sum    = 0;

            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(aggregatorName, 1);
                DbType    arg0type;
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {
                    switch (arg0type.ID)
                    {
                    case DbTypeID.INT:
                        x = (double)tools.GetInt(arg0);
                        break;

                    case DbTypeID.LONG:
                        x = (double)tools.GetLong(arg0);
                        break;

                    case DbTypeID.DOUBLE:
                        x = tools.GetDouble(arg0);
                        break;

                    default:
                        args[iarg].Expected(aggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                        return(0);    // Doesn't reach here.
                    }
                    values.Add(x);
                    sum += x;
                }
            }
            double dev = 0;

            if (values.Count > 0)
            {
                double avg = sum / (double)values.Count;
                for (int i = 0; i < values.Count; i++)
                {
                    dev += Math.Pow(values[i] - avg, 2);
                }
                dev = dev / (double)(sample ? values.Count - 1 : values.Count);
            }
            return(dev);
        }
Exemplo n.º 5
0
        public static DbValue DEGREES(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "DEGREES";

            args.EnsureCount(FunctionName, 1);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);

            if (Types.IsNullValue(arg0))
            {
                return(tools.AllocNullValue()); // Give a null, take a null.
            }

            double d = 0;

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
            {
                int x = tools.GetInt(arg0);
                d = (double)x;
            }
            break;

            case DbTypeID.LONG:
            {
                long x = tools.GetLong(arg0);
                d = (double)x;
            }
            break;

            case DbTypeID.DOUBLE:
            {
                d = tools.GetDouble(arg0);
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            double r = (d * 180d) / Math.PI;

            return(tools.AllocValue(r));
        }
Exemplo n.º 6
0
        private static double _VAR(string aggregatorName, DbFunctionTools tools, DbAggregatorArguments args, bool sample)
        {
            List<double> values = new List<double>();
            double x = 0;
            double sum = 0;
            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(aggregatorName, 1);
                DbType arg0type;
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {
                    switch (arg0type.ID)
                    {
                        case DbTypeID.INT:
                            x = (double)tools.GetInt(arg0);
                            break;

                        case DbTypeID.LONG:
                            x = (double)tools.GetLong(arg0);
                            break;

                        case DbTypeID.DOUBLE:
                            x = tools.GetDouble(arg0);
                            break;

                        default:
                            args[iarg].Expected(aggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                            return 0; // Doesn't reach here.
                    }
                    values.Add(x);
                    sum += x;
                }
            }
            double dev = 0;
            if (values.Count > 0)
            {
                double avg = sum / (double)values.Count;
                for (int i = 0; i < values.Count; i++)
                {
                    dev += Math.Pow(values[i] - avg, 2);
                }
                dev = dev / (double)(sample ? values.Count - 1 : values.Count);
            }
            return dev;
        }
Exemplo n.º 7
0
        public static DbValue ABS(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "ABS";

            args.EnsureCount(FunctionName, 1);

            DbType arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            if (Types.IsNullValue(arg0))
            {
                return tools.AllocNullValue(); // Give a null, take a null.
            }

            switch (arg0type.ID)
            {
                case DbTypeID.INT:
                    {
                        int x = tools.GetInt(arg0);
                        x = Math.Abs(x);
                        return tools.AllocValue(x);
                    }
                    break;

                case DbTypeID.LONG:
                    {
                        long x = tools.GetLong(arg0);
                        x = Math.Abs(x);
                        return tools.AllocValue(x);
                    }
                    break;

                case DbTypeID.DOUBLE:
                    {
                        double x = tools.GetDouble(arg0);
                        x = Math.Abs(x);
                        return tools.AllocValue(x);
                    }
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

        }
Exemplo n.º 8
0
        public static DbValue AVG(DbFunctionTools tools, DbAggregatorArguments args)
        {
            string AggregatorName = "AVG";

            double sum   = 0;
            int    count = 0;

            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(AggregatorName, 1);
                DbType    arg0type;
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {
                    count++;
                    switch (arg0type.ID)
                    {
                    case DbTypeID.INT:
                        sum += (double)tools.GetInt(arg0);
                        break;

                    case DbTypeID.LONG:
                        sum += (double)tools.GetLong(arg0);
                        break;

                    case DbTypeID.DOUBLE:
                        sum += tools.GetDouble(arg0);
                        break;

                    default:
                        args[iarg].Expected(AggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                        return(null);    // Doesn't reach here.
                    }
                }
            }
            double avg = 0;

            if (count > 0)
            {
                avg = sum / (double)count;
            }
            return(tools.AllocValue(avg));
        }
Exemplo n.º 9
0
        public static DbValue AVG(DbFunctionTools tools, DbAggregatorArguments args)
        {
            string AggregatorName = "AVG";

            double sum = 0;
            int count = 0;
            for (int iarg = 0; iarg < args.Length; iarg++)
            {
                args[iarg].EnsureCount(AggregatorName, 1);
                DbType arg0type;
                ByteSlice arg0 = args[iarg][0].Eval(out arg0type);
                if (!Types.IsNullValue(arg0))   //ignore null
                {
                    count++;
                    switch (arg0type.ID)
                    {
                        case DbTypeID.INT:
                            sum += (double)tools.GetInt(arg0);
                            break;

                        case DbTypeID.LONG:
                            sum += (double)tools.GetLong(arg0);
                            break;

                        case DbTypeID.DOUBLE:
                            sum += tools.GetDouble(arg0);
                            break;

                        default:
                            args[iarg].Expected(AggregatorName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                            return null; // Doesn't reach here.
                    }
                }
            }
            double avg = 0;
            if (count > 0)
            {
                avg = sum / (double)count;
            }
            return tools.AllocValue(avg);   
        }
Exemplo n.º 10
0
        public static void DbFunctions_MOD()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();

            //Double.
            {
                Console.WriteLine("Testing DbFunctions.MOD(Double, Double)...");

                double input0 = rnd.NextDouble();
                double input1 = rnd.NextDouble();

                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input0));
                args.Add(tools.AllocValue(input1));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MOD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input0 % input1;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MOD(Double, Double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbFunctions.MOD(Int32, Int32)...");

                int input0 = rnd.Next();
                int input1 = rnd.Next();

                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input0));
                args.Add(tools.AllocValue(input1));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MOD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                int expected = input0 % input1;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MOD(Int32, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbFunctions.MOD(Long, Long)...");

                long input0 = DateTime.Now.Ticks;
                long input1 = DateTime.Now.Ticks;

                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input0));
                args.Add(tools.AllocValue(input1));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MOD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input0 % input1;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MOD(Long, Long) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbFunctions.MOD(Int32, Double)...");

                int input0 = rnd.Next();
                double input1 = rnd.NextDouble();

                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input0));
                args.Add(tools.AllocValue(input1));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MOD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = (double)input0 % input1;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MOD(Int32, Double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbFunctions.MOD(Int32, Long)...");

                int input0 = rnd.Next();
                long input1 = DateTime.Now.Ticks;

                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input0));
                args.Add(tools.AllocValue(input1));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MOD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = (long)input0 % input1;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MOD(Int32, Long) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
        }
Exemplo n.º 11
0
        public static DbValue SUB(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "SUB";

            args.EnsureCount(FunctionName, 2);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);

            if (Types.IsNullValue(arg0))
            {
                return(tools.AllocValue(arg0, arg0type)); // Give a null, take a null.
            }
            DbType    arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);

            if (Types.IsNullValue(arg1))
            {
                return(tools.AllocValue(arg1, arg1type)); // Give a null, take a null.
            }

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
            {
                int x = tools.GetInt(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    int y = tools.GetInt(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.LONG:
                {
                    long y = tools.GetLong(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double y = tools.GetDouble(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                default:
                    args.Expected(FunctionName, 1, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                    return(null);            // Doesn't reach here.
                }
            }
            break;

            case DbTypeID.LONG:
            {
                long x = tools.GetLong(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    int y = tools.GetInt(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.LONG:
                {
                    long y = tools.GetLong(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double y = tools.GetDouble(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                default:
                    args.Expected(FunctionName, 1, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                    return(null);            // Doesn't reach here.
                }
            }
            break;

            case DbTypeID.DOUBLE:
            {
                double x = tools.GetDouble(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    int y = tools.GetInt(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.LONG:
                {
                    long y = tools.GetLong(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double y = tools.GetDouble(arg1);
                    return(tools.AllocValue(x - y));
                }
                break;

                default:
                    args.Expected(FunctionName, 1, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                    return(null);            // Doesn't reach here.
                }
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }
        }
Exemplo n.º 12
0
        public static DbValue SIGN(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "SIGN";

            args.EnsureCount(FunctionName, 1);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);

            if (Types.IsNullValue(arg0))
            {
                return(tools.AllocNullValue()); // Give a null, take a null.
            }

            int sign = 0;

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
            {
                int x = tools.GetInt(arg0);
                if (x > 0)
                {
                    sign = 1;
                }
                else if (x < 0)
                {
                    sign = -1;
                }
            }
            break;

            case DbTypeID.LONG:
            {
                long x = tools.GetLong(arg0);
                if (x > 0)
                {
                    sign = 1;
                }
                else if (x < 0)
                {
                    sign = -1;
                }
            }
            break;

            case DbTypeID.DOUBLE:
            {
                double x = tools.GetDouble(arg0);
                if (x > 0)
                {
                    sign = 1;
                }
                else if (x < 0)
                {
                    sign = -1;
                }
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }
            return(tools.AllocValue(sign));
        }
Exemplo n.º 13
0
        public static void DbAggregators_SUM()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();
            const int rowcount = 20;

            //Double.
            {
                Console.WriteLine("Testing DbAggregators_SUM(Double)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                double sum = 0;

                for (int i = 0; i < fargs.Length; i++)
                {
                    double input = rnd.NextDouble();
                    if (input < 0.5)
                    {
                        input = input * -1d;
                    }
                    sum += input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.SUM(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);
                double expected = sum;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_SUM(Double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_SUM(Int32)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                int sum = 0;

                for (int i = 0; i < fargs.Length; i++)
                {
                    int input = rnd.Next(Int32.MinValue, Int32.MaxValue);
                    sum += input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.SUM(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);
                int expected = sum;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_SUM(Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_SUM(Int64)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                long sum = 0;

                for (int i = 0; i < fargs.Length; i++)
                {
                    long input = DateTime.Now.Ticks;
                    if (input % 2 == 0)
                    {
                        input = input * -1;
                    }
                    sum += input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.SUM(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);
                long expected = sum;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_SUM(Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
        }
Exemplo n.º 14
0
        public static DbValue CAST(DbFunctionTools tools, DbFunctionArguments args)
        {
#if DEBUG
            //System.Diagnostics.Debugger.Launch();
#endif

            string FunctionName = "CAST";

            args.EnsureCount(FunctionName, 2);

            DbType    type;
            ByteSlice bs = args[0].Eval(out type);

            mstring xas = tools.GetString(args[1]);
            if (!xas.StartsWith("AS "))
            {
#if DEBUG
                throw new Exception("Expected AS <type> in CAST, not: " + xas);
#endif
                throw new Exception("Expected AS <type> in CAST");
            }
            mstring msastype = xas.SubstringM(3);
            string  sastype  = msastype.ToString();  // Alloc.
            sastype = DbType.NormalizeName(sastype); // Alloc if char(n).
            DbType astype = DbType.Prepare(sastype); // Alloc if char(n).
            if (DbTypeID.NULL == astype.ID)
            {
                throw new Exception("Unknown AS type in CAST: " + sastype);
            }

            switch (astype.ID)
            {
            case DbTypeID.INT:
                switch (type.ID)
                {
                case DbTypeID.INT:         // as INT
                    if (astype.Size > type.Size)
                    {
                        throw new Exception("CAST: source value buffer too small");
                    }
                    return(tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype));

                case DbTypeID.LONG:         // as INT
                    return(tools.AllocValue((int)tools.GetLong(bs)));

                case DbTypeID.DOUBLE:         // as INT
                    return(tools.AllocValue((int)tools.GetDouble(bs)));

                case DbTypeID.DATETIME:         // as INT
                    return(tools.AllocValue((int)tools.GetDateTime(bs).Ticks));

                case DbTypeID.CHARS:         // as INT
                {
                    int to = tools.GetString(bs).NextItemToInt32(' ');
                    return(tools.AllocValue(to));
                }

                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                }
                break;

            case DbTypeID.LONG:
                switch (type.ID)
                {
                case DbTypeID.INT:         // as LONG
                    return(tools.AllocValue((long)tools.GetInt(bs)));

                case DbTypeID.LONG:         // as LONG
                    if (astype.Size > type.Size)
                    {
                        throw new Exception("CAST: source value buffer too small");
                    }
                    return(tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype));

                case DbTypeID.DOUBLE:         // as LONG
                    return(tools.AllocValue((long)tools.GetDouble(bs)));

                case DbTypeID.DATETIME:         // as LONG
                    return(tools.AllocValue((long)tools.GetDateTime(bs).Ticks));

                case DbTypeID.CHARS:         // as LONG
                {
                    long to = tools.GetString(bs).NextItemToInt64(' ');
                    return(tools.AllocValue(to));
                }

                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                }
                break;

            case DbTypeID.DOUBLE:
                switch (type.ID)
                {
                case DbTypeID.INT:         // as DOUBLE
                    return(tools.AllocValue((double)tools.GetInt(bs)));

                case DbTypeID.LONG:         // as DOUBLE
                    return(tools.AllocValue((double)tools.GetLong(bs)));

                case DbTypeID.DOUBLE:         // as DOUBLE
                    if (astype.Size > type.Size)
                    {
                        throw new Exception("CAST: source value buffer too small");
                    }
                    return(tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype));

                case DbTypeID.DATETIME:         // as DOUBLE
                    return(tools.AllocValue((double)tools.GetDateTime(bs).Ticks));

                case DbTypeID.CHARS:         // as DOUBLE
                {
                    double to = tools.GetString(bs).NextItemToDouble(' ');
                    return(tools.AllocValue(to));
                }

                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                }
                break;

            case DbTypeID.DATETIME:
                switch (type.ID)
                {
                case DbTypeID.INT:         // as DATETIME
                    return(tools.AllocValue(new DateTime((long)tools.GetInt(bs))));

                case DbTypeID.LONG:         // as DATETIME
                    return(tools.AllocValue(new DateTime((long)tools.GetLong(bs))));

                case DbTypeID.DOUBLE:         // as DATETIME
                    return(tools.AllocValue(new DateTime((long)tools.GetDouble(bs))));

                case DbTypeID.DATETIME:         // as DATETIME
                    if (astype.Size > type.Size)
                    {
                        throw new Exception("CAST: source value buffer too small");
                    }
                    return(tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype));

                case DbTypeID.CHARS:         // as DATETIME
                {
                    mstring to = tools.GetString(bs);
                    return(tools.AllocValue(DateTime.Parse(to.ToString())));
                }

                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                }
                break;

            case DbTypeID.CHARS:
                switch (type.ID)
                {
                case DbTypeID.INT:         // as CHAR(n)
                {
                    mstring ms = mstring.Prepare(tools.GetInt(bs));
                    return(tools.AllocValue(ms, astype.Size));
                }

                case DbTypeID.LONG:         // as CHAR(n)
                {
                    mstring ms = mstring.Prepare(tools.GetLong(bs));
                    return(tools.AllocValue(ms, astype.Size));
                }

                case DbTypeID.DOUBLE:         // as CHAR(n)
                {
                    mstring ms = mstring.Prepare(tools.GetDouble(bs));
                    return(tools.AllocValue(ms, astype.Size));
                }

                case DbTypeID.DATETIME:         // as CHAR(n)
                {
                    mstring ms = mstring.Prepare(tools.GetDateTime(bs).ToString());
                    return(tools.AllocValue(ms, astype.Size));
                }

                case DbTypeID.CHARS:         // as CHAR(n)
                    if (astype.Size > type.Size)
                    {
                        //throw new Exception("CAST: source value buffer too small");
                        return(tools.AllocValue(tools.GetString(bs), astype.Size));
                    }
                    return(tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype));

                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                }
                break;

            default:
                throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
            }
        }
Exemplo n.º 15
0
        public static DbValue CAST(DbFunctionTools tools, DbFunctionArguments args)
        {
#if DEBUG
            //System.Diagnostics.Debugger.Launch();
#endif

            string FunctionName = "CAST";

            args.EnsureCount(FunctionName, 2);

            DbType type;
            ByteSlice bs = args[0].Eval(out type);
            
            mstring xas = tools.GetString(args[1]);
            if (!xas.StartsWith("AS "))
            {
#if DEBUG
                throw new Exception("Expected AS <type> in CAST, not: " + xas);
#endif
                throw new Exception("Expected AS <type> in CAST");
            }
            mstring msastype = xas.SubstringM(3);
            string sastype = msastype.ToString(); // Alloc.
            sastype = DbType.NormalizeName(sastype); // Alloc if char(n).
            DbType astype = DbType.Prepare(sastype); // Alloc if char(n).
            if (DbTypeID.NULL == astype.ID)
            {
                throw new Exception("Unknown AS type in CAST: " + sastype);
            }

            switch (astype.ID)
            {
                case DbTypeID.INT:
                    switch (type.ID)
                    {
                        case DbTypeID.INT: // as INT
                            if (astype.Size > type.Size)
                            {
                                throw new Exception("CAST: source value buffer too small");
                            }
                            return tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype);
                        case DbTypeID.LONG: // as INT
                            return tools.AllocValue((int)tools.GetLong(bs));
                        case DbTypeID.DOUBLE: // as INT
                            return tools.AllocValue((int)tools.GetDouble(bs));
                        case DbTypeID.DATETIME: // as INT
                            return tools.AllocValue((int)tools.GetDateTime(bs).Ticks);
                        case DbTypeID.CHARS: // as INT
                            {
                                int to = tools.GetString(bs).NextItemToInt32(' ');
                                return tools.AllocValue(to);
                            }
                        default:
                            throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                    }
                    break;
                case DbTypeID.LONG:
                    switch (type.ID)
                    {
                        case DbTypeID.INT: // as LONG
                            return tools.AllocValue((long)tools.GetInt(bs));
                        case DbTypeID.LONG: // as LONG
                            if (astype.Size > type.Size)
                            {
                                throw new Exception("CAST: source value buffer too small");
                            }
                            return tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype);
                        case DbTypeID.DOUBLE: // as LONG
                            return tools.AllocValue((long)tools.GetDouble(bs));
                        case DbTypeID.DATETIME: // as LONG
                            return tools.AllocValue((long)tools.GetDateTime(bs).Ticks);
                        case DbTypeID.CHARS: // as LONG
                            {
                                long to = tools.GetString(bs).NextItemToInt64(' ');
                                return tools.AllocValue(to);
                            }
                        default:
                            throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                    }
                    break;
                case DbTypeID.DOUBLE:
                    switch (type.ID)
                    {
                        case DbTypeID.INT: // as DOUBLE
                            return tools.AllocValue((double)tools.GetInt(bs));
                        case DbTypeID.LONG: // as DOUBLE
                            return tools.AllocValue((double)tools.GetLong(bs));
                        case DbTypeID.DOUBLE: // as DOUBLE
                            if (astype.Size > type.Size)
                            {
                                throw new Exception("CAST: source value buffer too small");
                            }
                            return tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype);
                        case DbTypeID.DATETIME: // as DOUBLE
                            return tools.AllocValue((double)tools.GetDateTime(bs).Ticks);
                        case DbTypeID.CHARS: // as DOUBLE
                            {
                                double to = tools.GetString(bs).NextItemToDouble(' ');
                                return tools.AllocValue(to);
                            }
                        default:
                            throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                    }
                    break;
                case DbTypeID.DATETIME:
                    switch (type.ID)
                    {
                        case DbTypeID.INT: // as DATETIME
                            return tools.AllocValue(new DateTime((long)tools.GetInt(bs)));
                        case DbTypeID.LONG: // as DATETIME
                            return tools.AllocValue(new DateTime((long)tools.GetLong(bs)));
                        case DbTypeID.DOUBLE: // as DATETIME
                            return tools.AllocValue(new DateTime((long)tools.GetDouble(bs)));
                        case DbTypeID.DATETIME: // as DATETIME
                            if (astype.Size > type.Size)
                            {
                                throw new Exception("CAST: source value buffer too small");
                            }
                            return tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype);
                        case DbTypeID.CHARS: // as DATETIME
                            {
                                mstring to = tools.GetString(bs);
                                return tools.AllocValue(DateTime.Parse(to.ToString()));
                            }
                        default:
                            throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                    }
                    break;
                case DbTypeID.CHARS:
                    switch (type.ID)
                    {
                        case DbTypeID.INT: // as CHAR(n)
                            {
                                mstring ms = mstring.Prepare(tools.GetInt(bs));
                                return tools.AllocValue(ms, astype.Size);
                            }
                        case DbTypeID.LONG: // as CHAR(n)
                            {
                                mstring ms = mstring.Prepare(tools.GetLong(bs));
                                return tools.AllocValue(ms, astype.Size);
                            }
                        case DbTypeID.DOUBLE: // as CHAR(n)
                            {
                                mstring ms = mstring.Prepare(tools.GetDouble(bs));
                                return tools.AllocValue(ms, astype.Size);
                            }
                        case DbTypeID.DATETIME: // as CHAR(n)
                            {
                                mstring ms = mstring.Prepare(tools.GetDateTime(bs).ToString());
                                return tools.AllocValue(ms, astype.Size);
                            }
                        case DbTypeID.CHARS: // as CHAR(n)
                            if (astype.Size > type.Size)
                            {
                                //throw new Exception("CAST: source value buffer too small");
                                return tools.AllocValue(tools.GetString(bs), astype.Size);
                            }
                            return tools.AllocValue(ByteSlice.Prepare(bs, 0, astype.Size), astype);
                        default:
                            throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
                    }
                    break;
                default:
                    throw new Exception("Cannot handle CAST value of type " + type.Name + " AS " + astype.Name);
            }

        }
Exemplo n.º 16
0
        public static void DbAggregators_BIT_OR()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();
            const int rowcount = 20;

            //Double.
            {
                Console.WriteLine("Testing DbAggregators_BIT_OR(Double)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                double[] values = new double[rowcount];

                for (int i = 0; i < fargs.Length; i++)
                {
                    double input = rnd.NextDouble();
                    if (input < 0.5)
                    {
                        input = input * -1d;
                    }
                    values[i] = input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.BIT_OR(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);
                byte[] expected = bitop(values, 2);

                if (!compareBytes(expected, bs))
                {
                    throw new Exception("DbAggregators_BIT_OR(Double) has failed.");
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_BIT_OR(Int32)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                int[] values = new int[rowcount];

                for (int i = 0; i < fargs.Length; i++)
                {
                    int input = rnd.Next(Int32.MinValue, Int32.MaxValue);
                    values[i] = input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.BIT_OR(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);
                byte[] expected = bitop(values, 2);
                if (!compareBytes(expected, bs))
                {
                    throw new Exception("DbAggregators_BIT_OR(Int32) has failed.");
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_BIT_OR(Int64)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                long[] values = new long[rowcount];

                for (int i = 0; i < fargs.Length; i++)
                {
                    long input = DateTime.Now.Ticks;
                    if (input % 2 == 0)
                    {
                        input = input * -1;
                    }
                    values[i] = input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.BIT_OR(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);
                byte[] expected = bitop(values, 2);
                if (!compareBytes(expected, bs))
                {
                    throw new Exception("DbAggregators_BIT_OR(Int64) has failed.");
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_BIT_OR(char(n))...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                mstring[] values = new mstring[rowcount];

                for (int i = 0; i < fargs.Length; i++)
                {
                    int strlen = 30;
                    mstring input = Utils.GenString(strlen);
                    values[i] = input;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.BIT_OR(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                mstring output = tools.GetString(bs);
                byte[] expected = bitop(values, 2);
                if (!compareBytes(expected, bs))
                {
                    throw new Exception("DbAggregators_BIT_OR(char(n)) has failed.");
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
        }
Exemplo n.º 17
0
        public static void DbAggregators_MIN()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();
            const int rowcount = 20;

            //Double.
            {
                Console.WriteLine("Testing DbAggregators_MIN(Double)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                double expected = double.MaxValue;

                for (int i = 0; i < fargs.Length; i++)
                {
                    double input = rnd.NextDouble();
                    if (input < 0.5)
                    {
                        input = input * -1d;
                    }
                    if (input < expected)
                    {
                        expected = input;
                    }
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);                    
                }
                DbValue valOutput = DbAggregators.MIN(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                if (expected != output)
                {
                    throw new Exception("DbAggregators_MIN(Double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_MIN(Int32)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                int expected = Int32.MaxValue;

                for (int i = 0; i < fargs.Length; i++)
                {
                    int input = rnd.Next(Int32.MinValue, Int32.MaxValue);
                    if (input < expected)
                    {
                        expected = input;
                    }
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.MIN(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                if (expected != output)
                {
                    throw new Exception("DbAggregators_MIN(Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_MIN(Int64)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                long expected = Int64.MaxValue;

                for (int i = 0; i < fargs.Length; i++)
                {
                    long input = DateTime.Now.Ticks;
                    if (input % 2 == 0)
                    {
                        input = input * -1;
                    }
                    if (input < expected)
                    {
                        expected = input;
                    }
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.MIN(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                if (expected != output)
                {
                    throw new Exception("DbAggregators_MIN(Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_MIN(char(n))...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                string expected = null;

                for (int i = 0; i < fargs.Length; i++)
                {
                    int strlen = rnd.Next(1, 100);
                    mstring input = Utils.GenString(strlen);
                    if (expected == null || input.ToString().CompareTo(expected) < 0)
                    {
                        expected = input.ToString();
                    }
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.MIN(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                mstring output = tools.GetString(bs);

                if (expected != output.ToString())
                {
                    throw new Exception("DbAggregators_MIN(char(n)) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
        }
        public static void DbAggregators_COUNTDISTINCT()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();
            const int rowcount = 20;

            //Double.
            {
                Console.WriteLine("Testing DbAggregators_COUNTDISTINCT(Double)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                Dictionary<double, short> dict = new Dictionary<double, short>();
                double repeat = 0;
                for (int i = 0; i < fargs.Length; i++)
                {                   
                    double input = rnd.NextDouble();
                    if (input < 0.5)
                    {
                        input = input * -1d;
                    }
                    if(i == 0)
                    {
                        repeat = input;
                    }

                    if (i % 3 == 1)
                    {
                        input = repeat;
                    }

                    dict[input] = 0;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.COUNTDISTINCT(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = (int)tools.GetLong(bs);
                int expected = dict.Count;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_COUNTDISTINCT(Double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_COUNTDISTINCT(Int32)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                Dictionary<int, short> dict = new Dictionary<int, short>();
                int repeat = 0;
                for (int i = 0; i < fargs.Length; i++)
                {
                    int input = rnd.Next(Int32.MinValue, Int32.MaxValue);
                    if (i == 0)
                    {
                        repeat = input;
                    }

                    if (i % 3 == 1)
                    {
                        input = repeat;
                    }
                    dict[input] = 0;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.COUNTDISTINCT(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = (int)tools.GetLong(bs);
                int expected = dict.Count;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_COUNTDISTINCT(Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_COUNTDISTINCT(Int64)...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                Dictionary<long, short> dict = new Dictionary<long, short>();
                long repeat = 0;
                for (int i = 0; i < fargs.Length; i++)
                {
                    long input = DateTime.Now.Ticks;
                    if (input % 2 == 0)
                    {
                        input = input * -1;
                    }
                    if (i == 0)
                    {
                        repeat = input;
                    }

                    if (i % 3 == 1)
                    {
                        input = repeat;
                    }
                    dict[input] = 0;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.COUNTDISTINCT(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = (int)tools.GetLong(bs);
                int expected = dict.Count;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_COUNTDISTINCT(Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            {
                Console.WriteLine("Testing DbAggregators_COUNTDISTINCT(char(n))...");

                DbFunctionArguments[] fargs = new DbFunctionArguments[rowcount];
                Dictionary<string, short> dict = new Dictionary<string, short>();
                mstring repeat = mstring.Prepare();
                for (int i = 0; i < fargs.Length; i++)
                {
                    int strlen = rnd.Next(1, 100);
                    mstring input = Utils.GenString(strlen);
                    if (i == 0)
                    {
                        repeat = input;
                    }

                    if (i % 3 == 1)
                    {
                        input = repeat;
                    }
                    dict[input.ToString()] = 0;
                    List<DbValue> args = new List<DbValue>();
                    args.Add(tools.AllocValue(input));
                    fargs[i] = new DbFunctionArguments(args);
                }
                DbValue valOutput = DbAggregators.COUNTDISTINCT(tools, new DbAggregatorArguments(fargs));
                ByteSlice bs = valOutput.Eval();
                int output = (int)tools.GetLong(bs);
                int expected = dict.Count;
                if (expected != output)
                {
                    throw new Exception("DbAggregators_COUNTDISTINCT(char(n)) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
        }
Exemplo n.º 19
0
        public static DbValue ATN2(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "ATN2";

            args.EnsureCount(FunctionName, 2);

            DbType arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            DbType arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);

            if (Types.IsNullValue(arg0) || Types.IsNullValue(arg1))
            {
                return tools.AllocNullValue(); // Give a null, take a null.
            }

            double d1 = 0;
            double d2 = 0;
            switch (arg0type.ID)
            {
                case DbTypeID.INT:
                    {
                        int x = tools.GetInt(arg0);
                        d1 = (double)x;
                    }
                    break;

                case DbTypeID.LONG:
                    {
                        long x = tools.GetLong(arg0);
                        d1 = (double)x;
                    }
                    break;

                case DbTypeID.DOUBLE:
                    {
                        d1 = tools.GetDouble(arg0);
                    }
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }
            switch (arg1type.ID)
            {
                case DbTypeID.INT:
                    {
                        int x = tools.GetInt(arg1);
                        d2 = (double)x;
                    }
                    break;

                case DbTypeID.LONG:
                    {
                        long x = tools.GetLong(arg1);
                        d2 = (double)x;
                    }
                    break;

                case DbTypeID.DOUBLE:
                    {
                        d2 = tools.GetDouble(arg1);
                    }
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

            d1 = Math.Atan2(d1, d2);
            return tools.AllocValue(d1);
        }
Exemplo n.º 20
0
 ByteSlice Conv_LongToDouble(ByteSlice value, int ResultSize, DbFunctionTools tools)
 {
     long x = tools.GetLong(value);
     DbValue v = tools.AllocValue((double)x);
     return v.Eval();
 }
Exemplo n.º 21
0
        public static DbValue POWER(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "POWER";

            args.EnsureCount(FunctionName, 2);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);

            if (Types.IsNullValue(arg0))
            {
                return(tools.AllocNullValue()); // Give a null, take a null.
            }

            DbType    arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);
            double    b    = 0;
            double    p    = 0;

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
            {
                int x = tools.GetInt(arg0);
                b = (double)x;
            }
            break;

            case DbTypeID.LONG:
            {
                long x = tools.GetLong(arg0);
                b = (double)x;
            }
            break;

            case DbTypeID.DOUBLE:
            {
                b = tools.GetDouble(arg0);
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            switch (arg1type.ID)
            {
            case DbTypeID.INT:
            {
                int x = tools.GetInt(arg1);
                p = (double)x;
            }
            break;

            case DbTypeID.LONG:
            {
                long x = tools.GetLong(arg1);
                p = (double)x;
            }
            break;

            case DbTypeID.DOUBLE:
            {
                p = tools.GetDouble(arg1);
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            double r = Math.Pow(b, p);

            return(tools.AllocValue(r));
        }
Exemplo n.º 22
0
        public static DbValue COMPARE(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "COMPARE";

            args.EnsureCount(FunctionName, 2);

            int result;

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            DbType    arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);

            if (Types.IsNullValue(arg0))
            {
                result = int.MaxValue;
                return(tools.AllocValue(result));
            }
            if (Types.IsNullValue(arg1))
            {
                result = int.MinValue;
                return(tools.AllocValue(result));
            }

            int    i0 = 0, i1 = 0;
            long   l0 = 0, l1 = 0;
            double d0 = 0, d1 = 0;

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
                i0 = tools.GetInt(arg0);
                break;

            case DbTypeID.LONG:
                l0 = tools.GetLong(arg0);
                break;

            case DbTypeID.DOUBLE:
                d0 = tools.GetDouble(arg0);
                break;

            case DbTypeID.CHARS:
            {
                if (arg1type.ID != DbTypeID.CHARS && arg1type.ID != DbTypeID.DATETIME)
                {
                    args.Expected(FunctionName, 0, "input CHAR(n) or DATETIME, got " + arg1type.Name.ToUpper());
                    return(null);        // Doesn't reach here.
                }

                if (arg1type.ID == DbTypeID.CHARS)
                {
                    for (int i = 1; ; i += 2)
                    {
                        bool b1end = (i + 2 > arg0.Length) || (arg0[i] == 0 && arg0[i + 1] == 0);
                        bool b2end = (i + 2 > arg1.Length) || (arg1[i] == 0 && arg1[i + 1] == 0);
                        if (b1end)
                        {
                            if (b2end)
                            {
                                result = 0;
                                break;
                            }
                            result = -1;
                            break;
                        }
                        else if (b2end)
                        {
                            result = 1;
                            break;
                        }
                        int diff = Types.UTF16BytesToLowerChar(arg0[i], arg0[i + 1])
                                   - Types.UTF16BytesToLowerChar(arg1[i], arg1[i + 1]);
                        if (0 != diff)
                        {
                            char ch0 = Types.UTF16BytesToChar(arg0[i], arg0[i + 1]);
                            char ch1 = Types.UTF16BytesToChar(arg1[i], arg1[i + 1]);
                            if (!Char.IsLetter(ch0) || !Char.IsLetter(ch1))
                            {
                                result = ch0 - ch1;
                            }
                            result = diff;
                            break;
                        }
                    }
                }
                else
                {
                    string   sdt = tools.GetString(arg0).ToString();
                    DateTime dt0 = DateTime.Parse(sdt);
                    DateTime dt1 = tools.GetDateTime(arg1);
                    result = dt0.CompareTo(dt1);
                }
                return(tools.AllocValue(result));
            }
            break;

            case DbTypeID.DATETIME:
            {
                if (arg1type.ID != DbTypeID.CHARS && arg1type.ID != DbTypeID.DATETIME)
                {
                    args.Expected(FunctionName, 0, "input CHAR(n) or DATETIME, got " + arg1type.Name.ToUpper());
                    return(null);        // Doesn't reach here.
                }

                if (arg1type.ID == DbTypeID.DATETIME)
                {
                    DateTime dt0 = tools.GetDateTime(arg0);
                    DateTime dt1 = tools.GetDateTime(arg1);
                    result = dt0.CompareTo(dt1);
                }
                else
                {
                    DateTime dt0 = tools.GetDateTime(arg0);
                    string   sdt = tools.GetString(arg1).ToString();
                    DateTime dt1 = DateTime.Parse(sdt);
                    result = dt0.CompareTo(dt1);
                }
                return(tools.AllocValue(result));
            }
            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got1 " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            switch (arg1type.ID)
            {
            case DbTypeID.INT:
                i1 = tools.GetInt(arg1);
                break;

            case DbTypeID.LONG:
                l1 = tools.GetLong(arg1);
                break;

            case DbTypeID.DOUBLE:
                d1 = tools.GetDouble(arg1);
                break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got2 " + arg1type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                    result = i0.CompareTo(i1);
                    break;

                case DbTypeID.LONG:
                    result = ((long)i0).CompareTo(l1);
                    break;

                case DbTypeID.DOUBLE:
                    result = ((double)i0).CompareTo(d1);
                    break;

                default:
                    return(null);        // Should never happen.
                }
                break;

            case DbTypeID.LONG:
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                    result = l0.CompareTo((long)i1);
                    break;

                case DbTypeID.LONG:
                    result = l0.CompareTo(l1);
                    break;

                case DbTypeID.DOUBLE:
                    result = ((double)l0).CompareTo(d1);
                    break;

                default:
                    return(null);        // Should never happen.
                }
                break;

            case DbTypeID.DOUBLE:
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                    result = d0.CompareTo((double)i1);
                    break;

                case DbTypeID.LONG:
                    result = d0.CompareTo((double)l1);
                    break;

                case DbTypeID.DOUBLE:
                    result = d0.CompareTo(d1);
                    break;

                default:
                    return(null);        // Should never happen.
                }
                break;

            default:
                return(null);    // Should never happen.
            }

            return(tools.AllocValue(result));
        }
Exemplo n.º 23
0
        public static DbValue IIF(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "IIF";

            args.EnsureCount(FunctionName, 3);

            DbType arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            DbType arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);
            DbType arg2type;
            ByteSlice arg2 = args[2].Eval(out arg2type);

            bool truecond;
            if (Types.IsNullValue(arg0))
            {
                truecond = false;
            }
            else if (DbTypeID.INT == arg0type.ID)
            {
                truecond = 0 != tools.GetInt(arg0);
            }
            else if (DbTypeID.LONG == arg0type.ID)
            {
                truecond = 0 != tools.GetLong(arg0);
            }
            else if (DbTypeID.DOUBLE == arg0type.ID)
            {
                truecond = 0 != tools.GetDouble(arg0);
            }
            else
            {
                bool allzero = true;
                for (int i = 1; i < arg0.Length; i++)
                {
                    if (arg0[i] != 0)
                    {
                        allzero = false;
                        break;
                    }
                }
                truecond = !allzero;
            }

            byte[] resultbuf = new byte[arg1.Length > arg2.Length ? arg1.Length : arg2.Length];
            DbType resulttype;
            if (truecond)
            {
                resulttype = DbType.Prepare(resultbuf.Length, arg1type.ID);
                for (int i = 0; i < arg1.Length; i++)
                {
                    resultbuf[i] = arg1[i];
                }
            }
            else
            {
                resulttype = DbType.Prepare(resultbuf.Length, arg2type.ID);
                for (int i = 0; i < arg2.Length; i++)
                {
                    resultbuf[i] = arg2[i];
                }
            }

            return tools.AllocValue(ByteSlice.Prepare(resultbuf), resulttype);

        }
Exemplo n.º 24
0
        public static void DbFunctions_ARITHMETIC()
        {
            DbFunctionTools tools = new DbFunctionTools();
            Random rnd = new Random();

            //Int32.
            {
                Console.WriteLine("Testing DbFunctions.ADD(Int32, Int32)...");

                int input1 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                int input2 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.ADD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                int expected = input1 + input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.ADD(Int32, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.SUB(Int32, Int32)...");

                int input1 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                int input2 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.SUB(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                int expected = input1 - input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.SUB(Int32, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.MUL(Int32, Int32)...");

                int input1 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                int input2 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MUL(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                int expected = input1 * input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MUL(Int32, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.DIV(Int32, Int32)...");

                int input1 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                int input2 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.DIV(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                int output = tools.GetInt(bs);

                int expected = input1 / input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.DIV(Int32, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            // Int32, Int64
            {
                Console.WriteLine("Testing DbFunctions.ADD(Int32, Int64)...");

                int input1 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                long input2 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.ADD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 + input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.ADD(Int32, Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            //Int64.
            {
                Console.WriteLine("Testing DbFunctions.ADD(Int64, Int64)...");

                long input1 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                long input2 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.ADD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 + input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.ADD(Int64, Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.SUB(Int64, Int64)...");

                long input1 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                long input2 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.SUB(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 - input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.SUB(Int64, Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.MUL(Int64, Int64)...");

                long input1 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                long input2 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MUL(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 * input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MUL(Int64, Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.DIV(Int64, Int64)...");

                long input1 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                long input2 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.DIV(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 / input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.DIV(Int64, Int64) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            // Int64, Int32
            {
                Console.WriteLine("Testing DbFunctions.SUB(Int64, Int32)...");

                long input1 = (long)rnd.Next(Int32.MinValue, Int32.MaxValue) * rnd.Next();
                int input2 = rnd.Next(Int32.MinValue, Int32.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.SUB(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                long output = tools.GetLong(bs);

                long expected = input1 - input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.SUB(Int64, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            //double.
            {
                Console.WriteLine("Testing DbFunctions.ADD(double, double)...");

                double input1 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                double input2 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.ADD(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 + input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.ADD(double, double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.SUB(double, double)...");

                double input1 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                double input2 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.SUB(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 - input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.SUB(double, double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.MUL(double, double)...");

                double input1 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                double input2 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MUL(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 * input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MUL(double, double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            {
                Console.WriteLine("Testing DbFunctions.DIV(double, double)...");

                double input1 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                double input2 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.DIV(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 / input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.DIV(double, double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            // double, Int32
            {
                Console.WriteLine("Testing DbFunctions.MUL(double, Int32)...");

                double input1 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                int input2 = rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.MUL(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 * input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.MUL(double, Int32) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }

            // Int64, double
            {
                Console.WriteLine("Testing DbFunctions.DIV(Int64, double)...");

                long input1 = rnd.Next(int.MinValue, int.MaxValue) * rnd.Next();
                double input2 = rnd.NextDouble() * rnd.Next(int.MinValue, int.MaxValue);
                List<DbValue> args = new List<DbValue>();
                args.Add(tools.AllocValue(input1));
                args.Add(tools.AllocValue(input2));
                DbFunctionArguments fargs = new DbFunctionArguments(args);

                DbValue valOutput = DbFunctions.DIV(tools, fargs);
                ByteSlice bs = valOutput.Eval();
                double output = tools.GetDouble(bs);

                double expected = input1 / input2;

                if (expected != output)
                {
                    throw new Exception("DbFunctions.DIV(Int64, double) has failed.  Expected result: " + expected.ToString() + ", but received: " + output.ToString());
                }
                else
                {
                    Console.WriteLine("Expected results received.");
                }
            }
            
        }
Exemplo n.º 25
0
        public static DbValue MOD(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "MOD";

            args.EnsureCount(FunctionName, 2);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);

            if (Types.IsNullValue(arg0))
            {
                return(tools.AllocNullValue()); // Give a null, take a null.
            }
            DbType    arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);

            if (Types.IsNullValue(arg1))
            {
                return(tools.AllocNullValue()); // Give a null, take a null.
            }

            int    i0, i1 = 0;
            long   l0, l1 = 0;
            double d0, d1 = 0;

            switch (arg1type.ID)
            {
            case DbTypeID.INT:
                i1 = tools.GetInt(arg1);
                break;

            case DbTypeID.LONG:
                l1 = tools.GetLong(arg1);
                break;

            case DbTypeID.DOUBLE:
                d1 = tools.GetDouble(arg1);
                break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            if (i1 == 0 && l1 == 0 && d1 == 0)
            {
                args.Expected(FunctionName, 0, "Division by zero");
                return(null);
            }

            switch (arg0type.ID)
            {
            case DbTypeID.INT:
            {
                i0 = tools.GetInt(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    int rem = i0 % i1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.LONG:
                {
                    long rem = (long)i0 % l1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double rem = (double)i0 % d1;
                    return(tools.AllocValue(rem));
                }
                break;
                }
            }
            break;

            case DbTypeID.LONG:
            {
                l0 = tools.GetLong(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    long rem = l0 % (long)i1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.LONG:
                {
                    long rem = l0 % l1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double rem = (double)l0 % d1;
                    return(tools.AllocValue(rem));
                }
                break;
                }
            }
            break;

            case DbTypeID.DOUBLE:
            {
                d0 = tools.GetDouble(arg0);
                switch (arg1type.ID)
                {
                case DbTypeID.INT:
                {
                    double rem = d0 % (double)i1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.LONG:
                {
                    double rem = d0 % (double)l1;
                    return(tools.AllocValue(rem));
                }
                break;

                case DbTypeID.DOUBLE:
                {
                    double rem = d0 % d1;
                    return(tools.AllocValue(rem));
                }
                break;
                }
            }

            break;

            default:
                args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                return(null);    // Doesn't reach here.
            }

            return(null); // Doesn't reach here.
        }
Exemplo n.º 26
0
        public static DbValue IIF(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "IIF";

            args.EnsureCount(FunctionName, 3);

            DbType    arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            DbType    arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);
            DbType    arg2type;
            ByteSlice arg2 = args[2].Eval(out arg2type);

            bool truecond;

            if (Types.IsNullValue(arg0))
            {
                truecond = false;
            }
            else if (DbTypeID.INT == arg0type.ID)
            {
                truecond = 0 != tools.GetInt(arg0);
            }
            else if (DbTypeID.LONG == arg0type.ID)
            {
                truecond = 0 != tools.GetLong(arg0);
            }
            else if (DbTypeID.DOUBLE == arg0type.ID)
            {
                truecond = 0 != tools.GetDouble(arg0);
            }
            else
            {
                bool allzero = true;
                for (int i = 1; i < arg0.Length; i++)
                {
                    if (arg0[i] != 0)
                    {
                        allzero = false;
                        break;
                    }
                }
                truecond = !allzero;
            }

            byte[] resultbuf = new byte[arg1.Length > arg2.Length ? arg1.Length : arg2.Length];
            DbType resulttype;

            if (truecond)
            {
                resulttype = DbType.Prepare(resultbuf.Length, arg1type.ID);
                for (int i = 0; i < arg1.Length; i++)
                {
                    resultbuf[i] = arg1[i];
                }
            }
            else
            {
                resulttype = DbType.Prepare(resultbuf.Length, arg2type.ID);
                for (int i = 0; i < arg2.Length; i++)
                {
                    resultbuf[i] = arg2[i];
                }
            }

            return(tools.AllocValue(ByteSlice.Prepare(resultbuf), resulttype));
        }
Exemplo n.º 27
0
        public static DbValue MOD(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "MOD";

            args.EnsureCount(FunctionName, 2);

            DbType arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);           
            if (Types.IsNullValue(arg0))
            {
                return tools.AllocNullValue(); // Give a null, take a null.
            }
            DbType arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);
            if (Types.IsNullValue(arg1))
            {
                return tools.AllocNullValue(); // Give a null, take a null.
            }

            int i0, i1 = 0;
            long l0, l1 = 0;
            double d0, d1 = 0;

            switch (arg1type.ID)
            {
                case DbTypeID.INT:
                    i1 = tools.GetInt(arg1);
                    break;

                case DbTypeID.LONG:
                    l1 = tools.GetLong(arg1);
                    break;

                case DbTypeID.DOUBLE:
                    d1 = tools.GetDouble(arg1);
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg1type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

            if (i1 == 0 && l1 == 0 && d1 == 0)
            {
                args.Expected(FunctionName, 0, "Division by zero");
                return null; 
            }

            switch (arg0type.ID)
            {
                case DbTypeID.INT:
                    {
                        i0 = tools.GetInt(arg0);
                        switch (arg1type.ID)
                        {
                            case DbTypeID.INT:
                                {
                                    int rem = i0 % i1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.LONG:
                                {
                                    long rem = (long)i0 % l1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.DOUBLE:
                                {
                                    double rem = (double)i0 % d1;
                                    return tools.AllocValue(rem);
                                }
                                break;
                        }
                    }   
                    break;

                case DbTypeID.LONG:
                    {
                        l0 = tools.GetLong(arg0);
                        switch (arg1type.ID)
                        {
                            case DbTypeID.INT:
                                {
                                    long rem = l0 % (long)i1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.LONG:
                                {
                                    long rem = l0 % l1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.DOUBLE:
                                {
                                    double rem = (double)l0 % d1;
                                    return tools.AllocValue(rem);
                                }
                                break;
                        }
                    }                   
                    break;

                case DbTypeID.DOUBLE:
                    {
                        d0 = tools.GetDouble(arg0);
                        switch (arg1type.ID)
                        {
                            case DbTypeID.INT:
                                {
                                    double rem = d0 % (double)i1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.LONG:
                                {
                                    double rem = d0 % (double)l1;
                                    return tools.AllocValue(rem);
                                }
                                break;

                            case DbTypeID.DOUBLE:
                                {
                                    double rem = d0 % d1;
                                    return tools.AllocValue(rem);
                                }
                                break;
                        }
                    }
                    
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got " + arg0type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

            return null; // Doesn't reach here.
        }
Exemplo n.º 28
0
        public static DbValue COMPARE(DbFunctionTools tools, DbFunctionArguments args)
        {
            string FunctionName = "COMPARE";

            args.EnsureCount(FunctionName, 2);

            int result;

            DbType arg0type;
            ByteSlice arg0 = args[0].Eval(out arg0type);
            DbType arg1type;
            ByteSlice arg1 = args[1].Eval(out arg1type);

            if (Types.IsNullValue(arg0))
            {
                result = int.MaxValue;
                return tools.AllocValue(result);
            }
            if (Types.IsNullValue(arg1))
            {
                result = int.MinValue;
                return tools.AllocValue(result);
            }

            int i0 = 0, i1 = 0;
            long l0 = 0, l1 = 0;
            double d0 = 0, d1 = 0;

            switch (arg0type.ID)
            {
                case DbTypeID.INT:
                    i0 = tools.GetInt(arg0);
                    break;

                case DbTypeID.LONG:
                    l0 = tools.GetLong(arg0);
                    break;

                case DbTypeID.DOUBLE:
                    d0 = tools.GetDouble(arg0);
                    break;

                case DbTypeID.CHARS:
                    {
                        if (arg1type.ID != DbTypeID.CHARS && arg1type.ID != DbTypeID.DATETIME)
                        {
                            args.Expected(FunctionName, 0, "input CHAR(n) or DATETIME, got " + arg1type.Name.ToUpper());
                            return null; // Doesn't reach here.
                        }

                        if (arg1type.ID == DbTypeID.CHARS)
                        {
                            for (int i = 1; ; i += 2)
                            {
                                bool b1end = (i + 2 > arg0.Length) || (arg0[i] == 0 && arg0[i + 1] == 0);
                                bool b2end = (i + 2 > arg1.Length) || (arg1[i] == 0 && arg1[i + 1] == 0);
                                if (b1end)
                                {
                                    if (b2end)
                                    {
                                        result = 0;
                                        break;
                                    }
                                    result = -1;
                                    break;
                                }
                                else if (b2end)
                                {
                                    result = 1;
                                    break;
                                }
                                int diff = Types.UTF16BytesToLowerChar(arg0[i], arg0[i + 1])
                                    - Types.UTF16BytesToLowerChar(arg1[i], arg1[i + 1]);
                                if (0 != diff)
                                {
                                    char ch0 = Types.UTF16BytesToChar(arg0[i], arg0[i + 1]);
                                    char ch1 = Types.UTF16BytesToChar(arg1[i], arg1[i + 1]);
                                    if (!Char.IsLetter(ch0) || !Char.IsLetter(ch1))
                                    {
                                        result = ch0 - ch1;
                                    }
                                    result = diff;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            string sdt = tools.GetString(arg0).ToString();
                            DateTime dt0 = DateTime.Parse(sdt);
                            DateTime dt1 = tools.GetDateTime(arg1);
                            result = dt0.CompareTo(dt1);
                                                      
                        }
                        return tools.AllocValue(result);  
                    }
                    break;

                case DbTypeID.DATETIME:
                    {
                        if (arg1type.ID != DbTypeID.CHARS && arg1type.ID != DbTypeID.DATETIME)
                        {
                            args.Expected(FunctionName, 0, "input CHAR(n) or DATETIME, got " + arg1type.Name.ToUpper());
                            return null; // Doesn't reach here.
                        }

                        if (arg1type.ID == DbTypeID.DATETIME)
                        {
                            DateTime dt0 = tools.GetDateTime(arg0);
                            DateTime dt1 = tools.GetDateTime(arg1);
                            result = dt0.CompareTo(dt1);
                        }
                        else
                        {                           
                            DateTime dt0 = tools.GetDateTime(arg0);
                            string sdt = tools.GetString(arg1).ToString();
                            DateTime dt1 = DateTime.Parse(sdt);
                            result = dt0.CompareTo(dt1);
                        }
                        return tools.AllocValue(result);    
                    }
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got1 " + arg0type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

            switch (arg1type.ID)
            {
                case DbTypeID.INT:
                    i1 = tools.GetInt(arg1);
                    break;

                case DbTypeID.LONG:
                    l1 = tools.GetLong(arg1);
                    break;

                case DbTypeID.DOUBLE:
                    d1 = tools.GetDouble(arg1);
                    break;

                default:
                    args.Expected(FunctionName, 0, "input INT, LONG or DOUBLE, got2 " + arg1type.Name.ToUpper());
                    return null; // Doesn't reach here.
            }

            switch (arg0type.ID)
            {
                case DbTypeID.INT:
                    switch (arg1type.ID)
                    {
                        case DbTypeID.INT:
                            result = i0.CompareTo(i1);
                            break;
                        case DbTypeID.LONG:
                            result = ((long)i0).CompareTo(l1);
                            break;
                        case DbTypeID.DOUBLE:
                            result = ((double)i0).CompareTo(d1);
                            break;
                        default:
                            return null; // Should never happen.
                    }
                    break;
                case DbTypeID.LONG:
                    switch (arg1type.ID)
                    {
                        case DbTypeID.INT:
                            result = l0.CompareTo((long)i1);
                            break;
                        case DbTypeID.LONG:
                            result = l0.CompareTo(l1);
                            break;
                        case DbTypeID.DOUBLE:
                            result = ((double)l0).CompareTo(d1);
                            break;
                        default:
                            return null; // Should never happen.
                    }
                    break;
                case DbTypeID.DOUBLE:
                    switch (arg1type.ID)
                    {
                        case DbTypeID.INT:
                            result = d0.CompareTo((double)i1);
                            break;
                        case DbTypeID.LONG:
                            result = d0.CompareTo((double)l1);
                            break;
                        case DbTypeID.DOUBLE:
                            result = d0.CompareTo(d1);
                            break;
                        default:
                            return null; // Should never happen.
                    }
                    break;
                default:
                    return null; // Should never happen.
            }

            return tools.AllocValue(result);
        }