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

Make exp_range_overlap portable to more types as long as they are linear at 
their storage. Also do the same check at exp_is_zero and atom_zero_value


diffs (169 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -8705,52 +8705,38 @@ find_col_exp( list *exps, sql_exp *e)
 }
 
 static int
-exp_range_overlap( mvc *sql, sql_exp *e, char *min, char *max, atom *emin, 
atom *emax)
+exp_range_overlap(mvc *sql, sql_exp *e, char *min, char *max, atom *emin, atom 
*emax)
 {
        sql_subtype *t = exp_subtype(e);
-
-       if (!min || !max || !emin || !emax)
-               return 0;
-
-       if (strNil(min))
-               return 0;
-       if (strNil(max))
+       int localtype = t->type->localtype;
+
+       if (!min || !max || !emin || !emax || strNil(min) || strNil(max) || 
emin->isnull || emax->isnull || !ATOMlinear(localtype))
                return 0;
 
-       if (t->type->localtype == TYPE_dbl) {
-               atom *cmin = atom_general(sql->sa, t, min);
-               atom *cmax = atom_general(sql->sa, t, max);
-
-               if (emax->d < cmin->data.val.dval || emin->d > 
cmax->data.val.dval)
-                       return 0;
-       }
-       if (t->type->localtype == TYPE_bte) {
-               atom *cmin = atom_general(sql->sa, t, min);
-               atom *cmax = atom_general(sql->sa, t, max);
-
-               if (emax->data.val.btval < cmin->data.val.btval || 
emin->data.val.btval > cmax->data.val.btval)
+       switch (ATOMstorage(localtype)) {
+       case TYPE_bte:
+       case TYPE_sht:
+       case TYPE_int:
+       case TYPE_lng:
+#ifdef HAVE_HGE
+       case TYPE_hge:
+#endif
+       case TYPE_flt:
+       case TYPE_dbl:
+       case TYPE_str: {
+               atom *cmin, *cmax;
+
+#ifdef HAVE_HGE
+               if (localtype == TYPE_hge && !have_hge)
                        return 0;
-       }
-       if (t->type->localtype == TYPE_sht) {
-               atom *cmin = atom_general(sql->sa, t, min);
-               atom *cmax = atom_general(sql->sa, t, max);
-
-               if (emax->data.val.shval < cmin->data.val.shval || 
emin->data.val.shval > cmax->data.val.shval)
+#endif
+               cmin = atom_general(sql->sa, t, min);
+               cmax = atom_general(sql->sa, t, max);
+               if (VALcmp(&(emax->data), &(cmin->data)) < 0 || 
VALcmp(&(emin->data), &(cmax->data)) > 0)
                        return 0;
-       }
-       if (t->type->localtype == TYPE_int || t->type->localtype == TYPE_date) {
-               atom *cmin = atom_general(sql->sa, t, min);
-               atom *cmax = atom_general(sql->sa, t, max);
-
-               if (emax->data.val.ival < cmin->data.val.ival || 
emin->data.val.ival > cmax->data.val.ival)
-                       return 0;
-       }
-       if (t->type->localtype == TYPE_lng || t->type->localtype == 
TYPE_timestamp) {
-               atom *cmin = atom_general(sql->sa, t, min);
-               atom *cmax = atom_general(sql->sa, t, max);
-
-               if (emax->data.val.lval < cmin->data.val.lval || 
emin->data.val.lval > cmax->data.val.lval)
-                       return 0;
+       } break;
+       default:
+               return 0;
        }
        return 1;
 }
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
@@ -1335,7 +1335,7 @@ atom_inc(atom *a)
 int
 atom_is_zero(atom *a)
 {
-       if (a->isnull)
+       if (a->isnull || !ATOMlinear(a->tpe.type->localtype))
                return 0;
        switch (ATOMstorage(a->tpe.type->localtype)) {
        case TYPE_bte:
@@ -1422,6 +1422,7 @@ atom_zero_value(sql_allocator *sa, sql_s
 {
        void *ret = NULL;
        atom *res = NULL;
+       int localtype = tpe->type->localtype;
 
        bte bval = 0;
        sht sval = 0;
@@ -1433,39 +1434,41 @@ atom_zero_value(sql_allocator *sa, sql_s
        flt fval = 0;
        dbl dval = 0;
 
-       switch (ATOMstorage(tpe->type->localtype)) {
-       case TYPE_bte:
-               ret = &bval;
-               break;
-       case TYPE_sht:
-               ret = &sval;
-               break;
-       case TYPE_int:
-               ret = &ival;
-               break;
-       case TYPE_lng:
-               ret = &lval;
-               break;
+       if (ATOMlinear(localtype)) {
+               switch (ATOMstorage(localtype)) {
+               case TYPE_bte:
+                       ret = &bval;
+                       break;
+               case TYPE_sht:
+                       ret = &sval;
+                       break;
+               case TYPE_int:
+                       ret = &ival;
+                       break;
+               case TYPE_lng:
+                       ret = &lval;
+                       break;
 #ifdef HAVE_HGE
-       case TYPE_hge:
-               ret = &hval;
-               break;
+               case TYPE_hge:
+                       ret = &hval;
+                       break;
 #endif
-       case TYPE_flt:
-               ret = &fval;
-               break;
-       case TYPE_dbl:
-               ret = &dval;
-               break;
-       default: /* no support for strings and blobs zero value */
-               break;
+               case TYPE_flt:
+                       ret = &fval;
+                       break;
+               case TYPE_dbl:
+                       ret = &dval;
+                       break;
+               default: /* no support for strings and blobs zero value */
+                       break;
+               }
        }
 
        if (ret != NULL) {
                res = atom_create(sa);
                res->tpe = *tpe;
                res->isnull = 0;
-               res->data.vtype = tpe->type->localtype;
+               res->data.vtype = localtype;
                VALset(&res->data, res->data.vtype, ret);
        }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to