Update of /cvsroot/monetdb/sql/src/backends/monet5
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv24832/src/backends/monet5

Modified Files:
        sql.mx sql_result.mx 
Log Message:

Tyring to fix the code that triggers some of the 120
"conversion from <type1> to <type2>, possible loss of data"
warnings with the Microsoft compiler on Windows (cf.,
http://monetdb.cwi.nl/testing/projects/monetdb/Current/sql/.Mic.32.32.d.1-Windows5.1..2008.08.29_00-09-02/make.out.html
):

added explicite downcasts, triggering assertions in case of overflows.

(Check the effect tomorrow at
http://monetdb.cwi.nl/testing/projects/monetdb/Current/sql/.Mic.32.32.d.1-Windows5.1/make.out.html
and
http://monetdb.cwi.nl/testing/projects/monetdb/Current/sql/.Mic.64.64.d.1-Windows5.2/make.out.html
)

Most of the remaining warnings are due to the fact that
member "ival" of struct "symbdata" in src/server/sql_symbol.mx
is defined as "lng" but often used as / assigned to "int"
(without cast or overflow check).
I will try to find a proper solution for this together with
Niels and/or Sjoerd...


U sql_result.mx
Index: sql_result.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_result.mx,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- sql_result.mx       28 Aug 2008 19:35:17 -0000      1.93
+++ sql_result.mx       29 Aug 2008 17:03:45 -0000      1.94
@@ -610,8 +610,8 @@
        int l = 0;
 
        if (!p || ATOMcmp(mtype, ATOMnilptr(mtype), p) == 0) {
-               l = strlen(ns);
-               ok = (stream_write(s, ns, l, 1) == 1);
+               size_t ll = strlen(ns);
+               ok = (stream_write(s, ns, ll, 1) == 1);
        } else if (eclass == EC_DEC) {
                l = dec_tostr((void *) (ptrdiff_t) sc, buf, len,
                                  mtype, p);

U sql.mx
Index: sql.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql.mx,v
retrieving revision 1.277
retrieving revision 1.278
diff -u -d -r1.277 -r1.278
--- sql.mx      25 Aug 2008 13:36:15 -0000      1.277
+++ sql.mx      29 Aug 2008 17:03:45 -0000      1.278
@@ -2237,17 +2237,23 @@
        } else if (*r > 0 && *r < *s) {
                int dff = *s - *r;
                lng rnd = scales[dff]>>1;
+               lng lres;
                if (*v > 0)
-                       *res = (((*v + rnd)/scales[dff])*scales[dff]);
+                       lres = (((*v + rnd)/scales[dff])*scales[dff]);
                else
-                       *res = (((*v - rnd)/scales[dff])*scales[dff]);
+                       lres = (((*v - rnd)/scales[dff])*scales[dff]);
+               assert((lng) [EMAIL PROTECTED] <= lres && lres <= (lng) [EMAIL 
PROTECTED]);
+               *res = lres;
        } else if (*r <= 0 && -*r + *s > 0) {
                int dff = -*r + *s;
                lng rnd = scales[dff]>>1;
+               lng lres;
                if (*v > 0)
-                       *res = (((*v + rnd)/scales[dff])*scales[dff]);
+                       lres = (((*v + rnd)/scales[dff])*scales[dff]);
                else
-                       *res = (((*v - rnd)/scales[dff])*scales[dff]);
+                       lres = (((*v - rnd)/scales[dff])*scales[dff]);
+               assert((lng) [EMAIL PROTECTED] <= lres && lres <= (lng) [EMAIL 
PROTECTED]);
+               *res = lres;
        } else {
                *res = *v;
        }
@@ -2390,19 +2396,19 @@
                *res = @1_nil;
        } else if (*r < 0) {
                int d = -*r;
-               @1 rnd = scales[d]>>1; 
+               @1 rnd = (@1) (scales[d]>>1); 
 
                if (*v > 0)
-                       *res = (floor(((*v + 
rnd)/((@1)(scales[d]))))*scales[d]);
+                       *res = (@1) (floor(((*v + 
rnd)/((@1)(scales[d]))))*scales[d]);
                else
-                       *res = (floor(((*v + 
rnd)/((@1)(scales[d]))))*scales[d]);
+                       *res = (@1) (floor(((*v + 
rnd)/((@1)(scales[d]))))*scales[d]);
        } else if (*r > 0) {
                int d = *r;
 
                if (*v > 0)
-                       *res = (floor(*v*(@1)scales[d]+.5)/scales[d]);
+                       *res = (@1) (floor(*v*(@1)scales[d]+.5)/scales[d]);
                else
-                       *res = (floor(*v*(@1)scales[d]+.5)/scales[d]);
+                       *res = (@1) (floor(*v*(@1)scales[d]+.5)/scales[d]);
        } else {
                *res = *v;
        }
@@ -2634,7 +2640,7 @@
 @= simpledowncast
 str @[EMAIL PROTECTED]( @1 *res, @2 *v )
 {
-       lng val = *v;
+       @3 val = *v;
 
        /* shortcut nil */
        if (*v == @2_nil) {
@@ -2643,12 +2649,12 @@
        }
        
        /* see if the number fits in the data type */
-       if (val >= [EMAIL PROTECTED] && val <= [EMAIL PROTECTED])       {
+       if (val >= (@3) [EMAIL PROTECTED] && val <= (@3) [EMAIL PROTECTED])     
{
                *res = (@1)val;
                return(MAL_SUCCEED);
        } else {
                throw(SQL, "convert",
-                       "value (" LLFMT ") exceeds limits of type @1", val);
+                       "value (" @4 ") exceeds limits of type @1", val);
        }
 }
 
@@ -2835,7 +2841,7 @@
 @:numcastup(lng,lng)@
 
 @= fnumcastdown
-@:simpledowncast(@1,@2)@
+@:simpledowncast(@1,@2,dbl,"%f")@
 
 /* when casting a floating point to an decimal we like to preserve the 
  * precision.  This means we first scale the float before converting.
@@ -3065,7 +3071,7 @@
 
 @c
 @= numcastdown
-@:simpledowncast(@1,@2)@
+@:simpledowncast(@1,@2,lng,LLFMT)@
 
 str 
 @[EMAIL PROTECTED]( @1 *res, int *s1, @2 *v )
@@ -3231,7 +3237,8 @@
        if (interval_from_str( *s, *sk, *ek, &res ) < 0)
                throw(SQL, "calc.month_interval",
                        "wrong format (%s)", *s);
-       *ret = res;
+       assert((lng) GDK_int_min <= res && res <= (lng) GDK_int_max);
+       *ret = (int) res;
        return MAL_SUCCEED;
 }
 


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to