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]
