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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list