Changeset: 3054a56acf4e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3054a56acf4e
Modified Files:
        sql/server/sql_atom.c
Branch: default
Log Message:

Replace the conversions in atom_cast with a call to VARconvert.


diffs (truncated from 672 to 300 lines):

diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -722,653 +722,26 @@ atom_cast(sql_allocator *sa, atom *a, sq
                        na->data.vtype = tp->type->localtype;
                        return na;
                }
-               if (at->type->eclass == EC_NUM && tp->type->eclass == EC_NUM) {
-                       if (at->type->localtype <= tp->type->localtype) { /* 
cast to a larger numeric */
-                               switch (tp->type->localtype) {
-                               case TYPE_bte:
-                                       if (at->type->localtype != TYPE_bte)
-                                               return NULL;
-                                       break;
-                               case TYPE_sht:
-                                       if (at->type->localtype == TYPE_bte) {
-                                               na = atom_create(sa);
-                                               na->data.val.shval = 
a->data.val.btval;
-                                       } else if (at->type->localtype != 
TYPE_sht)
-                                               return NULL;
-                                       break;
-                               case TYPE_int:
-#if SIZEOF_OID == SIZEOF_INT
-                               case TYPE_oid:
-#endif
-                                       if (at->type->localtype == TYPE_bte) {
-                                               na = atom_create(sa);
-                                               na->data.val.ival = 
a->data.val.btval;
-                                       } else if (at->type->localtype == 
TYPE_sht) {
-                                               na = atom_create(sa);
-                                               na->data.val.ival = 
a->data.val.shval;
-                                       } else if (at->type->localtype != 
TYPE_int)
-                                               return NULL;
-                                       break;
-                               case TYPE_lng:
-#if SIZEOF_OID == SIZEOF_LNG
-                               case TYPE_oid:
-#endif
-                                       if (at->type->localtype == TYPE_bte) {
-                                               na = atom_create(sa);
-                                               na->data.val.lval = 
a->data.val.btval;
-                                       } else if (at->type->localtype == 
TYPE_sht) {
-                                               na = atom_create(sa);
-                                               na->data.val.lval = 
a->data.val.shval;
-                                       } else if (at->type->localtype == 
TYPE_int) {
-                                               na = atom_create(sa);
-                                               na->data.val.lval = 
a->data.val.ival;
-                                       } else if (at->type->localtype != 
TYPE_lng)
-                                               return NULL;
-                                       break;
-#ifdef HAVE_HGE
-                               case TYPE_hge:
-                                       if (at->type->localtype == TYPE_bte) {
-                                               na = atom_create(sa);
-                                               na->data.val.hval = 
a->data.val.btval;
-                                       } else if (at->type->localtype == 
TYPE_sht) {
-                                               na = atom_create(sa);
-                                               na->data.val.hval = 
a->data.val.shval;
-                                       } else if (at->type->localtype == 
TYPE_int) {
-                                               na = atom_create(sa);
-                                               na->data.val.hval = 
a->data.val.ival;
-                                       } else if (at->type->localtype == 
TYPE_lng) {
-                                               na = atom_create(sa);
-                                               na->data.val.hval = 
a->data.val.lval;
-                                       } else if (at->type->localtype != 
TYPE_hge)
-                                               return NULL;
-                                       break;
-#endif
-                               default:
-                                       return NULL;
-                               }
-                       } else { /* cast to a smaller numeric */
-                               switch (tp->type->localtype) {
-#ifdef HAVE_HGE
-                               case TYPE_bte:
-                                       if (a->data.val.hval > (hge) 
GDK_bte_max || a->data.val.hval <= (hge) GDK_bte_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.btval = (bte) 
a->data.val.hval;
-                                       break;
-                               case TYPE_sht:
-                                       if (a->data.val.hval > (hge) 
GDK_sht_max || a->data.val.hval <= (hge) GDK_sht_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.shval = (sht) 
a->data.val.hval;
-                                       break;
-                               case TYPE_int:
-#if SIZEOF_OID == SIZEOF_INT
-                               case TYPE_oid:
-#endif
-                                       if (a->data.val.hval > (hge) 
GDK_int_max || a->data.val.hval <= (hge) GDK_int_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.ival = (int) 
a->data.val.hval;
-                                       break;
-                               case TYPE_lng:
-#if SIZEOF_OID == SIZEOF_LNG
-                               case TYPE_oid:
-#endif
-                                       if (a->data.val.hval > (hge) 
GDK_lng_max || a->data.val.hval <= (hge) GDK_lng_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.lval = (lng) 
a->data.val.hval;
-                                       break;
-#else
-                               case TYPE_bte:
-                                       if (a->data.val.lval > (lng) 
GDK_bte_max || a->data.val.lval <= (lng) GDK_bte_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.btval = (bte) 
a->data.val.lval;
-                                       break;
-                               case TYPE_sht:
-                                       if (a->data.val.lval > (lng) 
GDK_sht_max || a->data.val.lval <= (lng) GDK_sht_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.shval = (sht) 
a->data.val.lval;
-                                       break;
-                               case TYPE_int:
-#if SIZEOF_OID == SIZEOF_INT
-                               case TYPE_oid:
-#endif
-                                       if (a->data.val.lval > (lng) 
GDK_int_max || a->data.val.lval <= (lng) GDK_int_min)
-                                               return NULL;
-                                       na = atom_create(sa);
-                                       na->data.val.ival = (int) 
a->data.val.lval;
-                                       break;
-#endif
-                               default:
-                                       return NULL;
-                               }
-                       }
-                       if (!na) {
-                               na = atom_create(sa);
-                               SA_VALcopy(sa, &na->data, &a->data);
-                       }
-                       na->tpe = *tp;
-                       na->data.vtype = tp->type->localtype;
-                       return na;
-               }
-               if (at->type->eclass == EC_DEC && tp->type->eclass == EC_DEC &&
-                   at->type->localtype <= tp->type->localtype &&
-                   at->digits <= tp->digits /* &&
-                   at->scale <= tp->scale*/) {
-#ifdef HAVE_HGE
-                       hge mul = 1, div = 0, rnd = 0, hval = 0;
-#else
-                       lng mul = 1, div = 0, rnd = 0;
-#endif
-                       lng lval = 0;
-                       int ival = 0;
-                       sht shval = 0;
-                       bte btval = 0;
-                       /* cast numerics */
-                       switch (tp->type->localtype) {
-                       case TYPE_bte:
-                               if (at->type->localtype != TYPE_bte)
-                                       return NULL;
-                               btval = a->data.val.btval;
-                               break;
-                       case TYPE_sht:
-                               if (at->type->localtype == TYPE_bte)
-                                       shval = (sht) a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       shval = a->data.val.shval;
-                               else
-                                       return NULL;
-                               break;
-                       case TYPE_int:
-#if SIZEOF_OID == SIZEOF_INT
-                       case TYPE_oid:
-#endif
-                               if (at->type->localtype == TYPE_bte)
-                                       ival = (int) a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       ival = (int) a->data.val.shval;
-                               else if (at->type->localtype == TYPE_int)
-                                       ival = a->data.val.ival;
-                               else
-                                       return NULL;
-                               break;
-                       case TYPE_lng:
-#if SIZEOF_OID == SIZEOF_LNG
-                       case TYPE_oid:
-#endif
-                               if (at->type->localtype == TYPE_bte)
-                                       lval = (lng) a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       lval = (lng) a->data.val.shval;
-                               else if (at->type->localtype == TYPE_int)
-                                       lval = (lng) a->data.val.ival;
-                               else if (at->type->localtype == TYPE_lng)
-                                       lval = a->data.val.lval;
-                               else
-                                       return NULL;
-                               break;
-#ifdef HAVE_HGE
-                       case TYPE_hge:
-                               if (at->type->localtype == TYPE_bte)
-                                       hval = (hge) a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       hval = (hge) a->data.val.shval;
-                               else if (at->type->localtype == TYPE_int)
-                                       hval = (hge) a->data.val.ival;
-                               else if (at->type->localtype == TYPE_lng)
-                                       hval = (hge) a->data.val.lval;
-                               else if (at->type->localtype == TYPE_hge)
-                                       hval = a->data.val.hval;
-                               else
-                                       return NULL;
-                               break;
-#endif
-                       default:
-                               return NULL;
-                       }
-                       /* fix scale */
-                       if (tp->scale >= at->scale) {
-                               mul = scales[tp->scale-at->scale];
-                       } else {
-                               /* only round when going to a lower scale */
-                               mul = scales[at->scale-tp->scale];
-#ifndef TRUNCATE_NUMBERS
-                               rnd = mul>>1;
-#endif
-                               div = 1;
-                       }
-#ifdef HAVE_HGE
-                       if (tp->type->localtype == TYPE_hge) {
-                               if (div) {
-                                       if (hval < 0)
-                                               hval -= rnd;
-                                       else
-                                               hval += rnd;
-                                       hval /= mul;
-                               } else
-                                       hval *= mul;
-                       } else if (tp->type->localtype == TYPE_lng) {
-                               if (!div && ((hge) GDK_lng_min > (hge) lval * 
mul || (hge) lval * mul > (hge) GDK_lng_max))
-                                       return NULL;
-                               if (div) {
-                                       if (lval < 0)
-                                               lval -= (lng)rnd;
-                                       else
-                                               lval += (lng)rnd;
-                                       lval /= (lng) mul;
-                               } else
-                                       lval *= (lng) mul;
-                       } else if (tp->type->localtype == TYPE_int) {
-                               if (!div && ((hge) GDK_int_min > (hge) ival * 
mul || (hge) ival * mul > (hge) GDK_int_max))
-                                       return NULL;
-                               if (div) {
-                                       if (ival < 0)
-                                               ival -= (int)rnd;
-                                       else
-                                               ival += (int)rnd;
-                                       ival /= (int) mul;
-                               } else
-                                       ival *= (int) mul;
-                       } else if (tp->type->localtype == TYPE_sht) {
-                               if (!div && ((hge) GDK_sht_min > (hge) shval * 
mul || (hge) shval * mul > (hge) GDK_sht_max))
-                                       return NULL;
-                               if (div) {
-                                       if (shval < 0)
-                                               shval -= (sht)rnd;
-                                       else
-                                               shval += (sht)rnd;
-                                       shval /= (sht) mul;
-                               } else
-                                       shval *= (sht) mul;
-                       } else if (tp->type->localtype == TYPE_bte) {
-                               if (!div && ((hge) GDK_bte_min > (hge) btval * 
mul || (hge) btval * mul > (hge) GDK_bte_max))
-                                       return NULL;
-                               if (div) {
-                                       if (btval < 0)
-                                               btval -= (bte)rnd;
-                                       else
-                                               btval += (bte)rnd;
-                                       btval /= (bte) mul;
-                               } else
-                                       btval *= (bte) mul;
-                       }
-#else
-                       if (tp->type->localtype == TYPE_lng) {
-                               if (div) {
-                                       if (lval < 0)
-                                               lval -= rnd;
-                                       else
-                                               lval += rnd;
-                                       lval /= mul;
-                               } else
-                                       lval *= mul;
-                       } else if (tp->type->localtype == TYPE_int) {
-                               if (!div && ((lng) GDK_int_min > (lng) ival * 
mul || (lng) ival * mul > (lng) GDK_int_max))
-                                       return 0;
-                               if (div) {
-                                       if (ival < 0)
-                                               ival -= (int)rnd;
-                                       else
-                                               ival += (int)rnd;
-                                       ival /= (int) mul;
-                               } else
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to