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