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