ByteSlice Conv_LongToDouble(ByteSlice value, int ResultSize, DbFunctionTools tools) { long x = tools.GetLong(value); DbValue v = tools.AllocValue((double)x); return(v.Eval()); }
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)); }
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); }
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); }
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)); }
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; }
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. } }
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)); }
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); }
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."); } } }
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. } }
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)); }
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."); } } }
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); } }
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); } }
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."); } } }
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."); } } }
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); }
ByteSlice Conv_LongToDouble(ByteSlice value, int ResultSize, DbFunctionTools tools) { long x = tools.GetLong(value); DbValue v = tools.AllocValue((double)x); return v.Eval(); }
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)); }
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)); }
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); }
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."); } } }
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. }
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)); }
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. }
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); }