Changeset: d3cc612b6c27 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d3cc612b6c27
Modified Files:
        sql/server/sql_atom.c
Branch: Oct2020
Log Message:

Backported missing cast code from larger to smaller numeric types to Oct2020


diffs (163 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
@@ -758,60 +758,112 @@ atom_cast(sql_allocator *sa, atom *a, sq
                        *at = *tp;
                        return 1;
                }
-               if (at->type->eclass == EC_NUM && tp->type->eclass == EC_NUM &&
-                   at->type->localtype <= tp->type->localtype) {
-                       /* cast numerics */
-                       switch ( tp->type->localtype) {
-                       case TYPE_bte:
-                               if (at->type->localtype != TYPE_bte)
-                                       return 0;
-                               break;
-                       case TYPE_sht:
-                               if (at->type->localtype == TYPE_bte)
-                                       a->data.val.shval = a->data.val.btval;
-                               else if (at->type->localtype != TYPE_sht)
-                                       return 0;
-                               break;
-                       case TYPE_int:
+               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 0;
+                                       break;
+                               case TYPE_sht:
+                                       if (at->type->localtype == TYPE_bte)
+                                               a->data.val.shval = 
a->data.val.btval;
+                                       else if (at->type->localtype != 
TYPE_sht)
+                                               return 0;
+                                       break;
+                               case TYPE_int:
 #if SIZEOF_OID == SIZEOF_INT
-                       case TYPE_oid:
+                               case TYPE_oid:
 #endif
-                               if (at->type->localtype == TYPE_bte)
-                                       a->data.val.ival = a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       a->data.val.ival = a->data.val.shval;
-                               else if (at->type->localtype != TYPE_int)
-                                       return 0;
-                               break;
-                       case TYPE_lng:
+                                       if (at->type->localtype == TYPE_bte)
+                                               a->data.val.ival = 
a->data.val.btval;
+                                       else if (at->type->localtype == 
TYPE_sht)
+                                               a->data.val.ival = 
a->data.val.shval;
+                                       else if (at->type->localtype != 
TYPE_int)
+                                               return 0;
+                                       break;
+                               case TYPE_lng:
 #if SIZEOF_OID == SIZEOF_LNG
-                       case TYPE_oid:
+                               case TYPE_oid:
 #endif
-                               if (at->type->localtype == TYPE_bte)
-                                       a->data.val.lval = a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       a->data.val.lval = a->data.val.shval;
-                               else if (at->type->localtype == TYPE_int)
-                                       a->data.val.lval = a->data.val.ival;
-                               else if (at->type->localtype != TYPE_lng)
+                                       if (at->type->localtype == TYPE_bte)
+                                               a->data.val.lval = 
a->data.val.btval;
+                                       else if (at->type->localtype == 
TYPE_sht)
+                                               a->data.val.lval = 
a->data.val.shval;
+                                       else if (at->type->localtype == 
TYPE_int)
+                                               a->data.val.lval = 
a->data.val.ival;
+                                       else if (at->type->localtype != 
TYPE_lng)
+                                               return 0;
+                                       break;
+#ifdef HAVE_HGE
+                               case TYPE_hge:
+                                       if (at->type->localtype == TYPE_bte)
+                                               a->data.val.hval = 
a->data.val.btval;
+                                       else if (at->type->localtype == 
TYPE_sht)
+                                               a->data.val.hval = 
a->data.val.shval;
+                                       else if (at->type->localtype == 
TYPE_int)
+                                               a->data.val.hval = 
a->data.val.ival;
+                                       else if (at->type->localtype == 
TYPE_lng)
+                                               a->data.val.hval = 
a->data.val.lval;
+                                       else if (at->type->localtype != 
TYPE_hge)
+                                               return 0;
+                                       break;
+#endif
+                               default:
                                        return 0;
-                               break;
+                               }
+                       } else { /* cast to a smaller numeric */
+                               switch (tp->type->localtype) {
 #ifdef HAVE_HGE
-                       case TYPE_hge:
-                               if (at->type->localtype == TYPE_bte)
-                                       a->data.val.hval = a->data.val.btval;
-                               else if (at->type->localtype == TYPE_sht)
-                                       a->data.val.hval = a->data.val.shval;
-                               else if (at->type->localtype == TYPE_int)
-                                       a->data.val.hval = a->data.val.ival;
-                               else if (at->type->localtype == TYPE_lng)
-                                       a->data.val.hval = a->data.val.lval;
-                               else if (at->type->localtype != TYPE_hge)
+                               case TYPE_bte:
+                                       if (a->data.val.hval > (hge) 
GDK_bte_max || a->data.val.hval <= (hge) GDK_bte_min)
+                                               return 0;
+                                       a->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 0;
+                                       a->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 0;
+                                       a->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 0;
+                                       a->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 0;
+                                       a->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 0;
+                                       a->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 0;
+                                       a->data.val.ival = (int) 
a->data.val.lval;
+                                       break;
+#endif
+                               default:
                                        return 0;
-                               break;
-#endif
-                       default:
-                               return 0;
+                               }
                        }
                        a->tpe = *tp;
                        a->data.vtype = tp->type->localtype;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to