Changeset: 4ce1b85d99eb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4ce1b85d99eb
Removed Files:
sql/test/merge-partitions/Tests/mergepart31.sql
sql/test/merge-partitions/Tests/mergepart31.stable.err
sql/test/merge-partitions/Tests/mergepart31.stable.out
Modified Files:
sql/include/sql_catalog.h
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_propagate.c
sql/server/sql_atom.c
sql/server/sql_atom.h
sql/storage/store.c
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out
sql/test/merge-partitions/Tests/All
sql/test/mergetables/Tests/forex1.stable.out
Branch: Jun2020
Log Message:
Backed out changeset 6a1476d5cb19
diffs (truncated from 1433 to 300 lines):
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -309,7 +309,6 @@ typedef enum sql_class {
#define EC_TEMP_TZ(e) (e==EC_TIME_TZ||e==EC_TIMESTAMP_TZ)
#define EC_TEMP(e)
(e==EC_TIME||e==EC_DATE||e==EC_TIMESTAMP||EC_TEMP_TZ(e))
#define EC_TEMP_FRAC(e)
(e==EC_TIME||e==EC_TIMESTAMP||EC_TEMP_TZ(e))
-#define EC_TEMP_NOFRAC(e) (e==EC_TIME||e==EC_TIMESTAMP)
#define EC_BACKEND_FIXED(e) (EC_NUMBER(e)||e==EC_BIT||EC_TEMP(e))
typedef struct sql_type {
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -18,6 +18,8 @@
#ifdef HAVE_HGE
#include "mal.h" /* for have_hge */
#endif
+#include "gdk_time.h"
+#include "blob.h"
comp_type
compare_str2type(const char *compare_op)
@@ -2524,6 +2526,97 @@ exp_sum_scales(sql_subfunc *f, sql_exp *
}
}
+sql_exp *
+create_table_part_atom_exp(mvc *sql, sql_subtype tpe, ptr value)
+{
+ str buf = NULL;
+ size_t len = 0;
+ sql_exp *res = NULL;
+
+ switch (tpe.type->eclass) {
+ case EC_BIT: {
+ bit bval = *((bit*) value);
+ return exp_atom_bool(sql->sa, bval ? 1 : 0);
+ }
+ case EC_POS:
+ case EC_NUM:
+ case EC_DEC:
+ case EC_SEC:
+ case EC_MONTH:
+ switch (tpe.type->localtype) {
+#ifdef HAVE_HGE
+ case TYPE_hge: {
+ hge hval = *((hge*) value);
+ return exp_atom_hge(sql->sa, hval);
+ }
+#endif
+ case TYPE_lng: {
+ lng lval = *((lng*) value);
+ return exp_atom_lng(sql->sa, lval);
+ }
+ case TYPE_int: {
+ int ival = *((int*) value);
+ return exp_atom_int(sql->sa, ival);
+ }
+ case TYPE_sht: {
+ sht sval = *((sht*) value);
+ return exp_atom_sht(sql->sa, sval);
+ }
+ case TYPE_bte: {
+ bte bbval = *((bte *) value);
+ return exp_atom_bte(sql->sa, bbval);
+ }
+ default:
+ return NULL;
+ }
+ case EC_FLT:
+ switch (tpe.type->localtype) {
+ case TYPE_flt: {
+ flt fval = *((flt*) value);
+ return exp_atom_flt(sql->sa, fval);
+ }
+ case TYPE_dbl: {
+ dbl dval = *((dbl*) value);
+ return exp_atom_dbl(sql->sa, dval);
+ }
+ default:
+ return NULL;
+ }
+ case EC_DATE: {
+ if(date_tostr(&buf, &len, (const date *)value, false) <
0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_TIME: {
+ if(daytime_tostr(&buf, &len, (const daytime *)value,
false) < 0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_TIMESTAMP: {
+ if(timestamp_tostr(&buf, &len, (const timestamp
*)value, false) < 0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_BLOB: {
+ if(BLOBtostr(&buf, &len, (const blob *)value, false) <
0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_CHAR:
+ case EC_STRING:
+ return exp_atom_clob(sql->sa, sa_strdup(sql->sa,
value));
+ default:
+ assert(0);
+ }
+ if(buf)
+ GDKfree(buf);
+ return res;
+}
+
int
exp_aggr_is_count(sql_exp *e)
{
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -185,6 +185,8 @@ extern atom *exp_flatten(mvc *sql, sql_e
extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r);
+extern sql_exp *create_table_part_atom_exp(mvc *sql, sql_subtype tpe, ptr
value);
+
extern int exp_aggr_is_count(sql_exp *e);
extern void exps_reset_freevar(list *exps);
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
@@ -8962,15 +8962,52 @@ rel_add_dicts(visitor *v, sql_rel *rel)
}
static int
-exp_range_overlap(atom *min, atom *max, atom *emin, atom *emax, bool
min_exclusive, bool max_exclusive)
-{
- if (!min || !max || !emin || !emax || min->isnull || max->isnull ||
emin->isnull || emax->isnull)
+find_col_exp( list *exps, sql_exp *e)
+{
+ node *n;
+ int nr = 0;
+
+ for (n=exps->h; n; n=n->next, nr++){
+ if (n->data == e)
+ return nr;
+ }
+ return -1;
+}
+
+static int
+exp_range_overlap(mvc *sql, sql_exp *e, char *min, char *max, atom *emin, atom
*emax)
+{
+ sql_subtype *t = exp_subtype(e);
+ int localtype = t->type->localtype;
+
+ if (!min || !max || !emin || !emax || strNil(min) || strNil(max) ||
emin->isnull || emax->isnull || !ATOMlinear(localtype))
return 0;
- if ((!min_exclusive && VALcmp(&(emax->data), &(min->data)) < 0) ||
(min_exclusive && VALcmp(&(emax->data), &(min->data)) <= 0))
+ 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;
+#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;
+ } break;
+ default:
return 0;
- if ((!max_exclusive && VALcmp(&(emin->data), &(max->data)) > 0) ||
(max_exclusive && VALcmp(&(emin->data), &(max->data)) >= 0))
- return 0;
+ }
return 1;
}
@@ -9006,22 +9043,13 @@ rel_rename_part(mvc *sql, sql_rel *p, ch
return p;
}
-typedef struct {
- atom *lval;
- atom *hval;
- bte anti:1,
- semantics:1;
- int flag;
- list *values;
-} range_limit;
-
/* rewrite merge tables into union of base tables and call optimizer again */
static sql_rel *
rel_merge_table_rewrite(visitor *v, sql_rel *rel)
{
sql_rel *sel = NULL;
- if (is_modify(rel->op)) {
+ if(is_modify(rel->op)) {
sql_query *query = query_create(v->sql);
return rel_propagate(query, rel, &v->changes);
} else {
@@ -9036,58 +9064,63 @@ rel_merge_table_rewrite(visitor *v, sql_
/* instantiate merge table */
sql_rel *nrel = NULL;
char *tname = t->base.name;
- list *cols = NULL, *ranges = NULL;
+ list *cols = NULL, *low = NULL, *high = NULL;
if (list_empty(t->members.set))
return rel;
if (sel) {
+ node *n;
+
+ /* no need to reduce the tables list */
+ if (list_length(t->members.set) <= 1)
+ return sel;
+
cols = sa_list(v->sql->sa);
- ranges = sa_list(v->sql->sa);
- for (node *n = sel->exps->h; n; n =
n->next) {
- sql_exp *e = n->data, *c = e->l;
- int flag = e->flag &
~CMP_BETWEEN;
-
- if (e->type != e_cmp ||
(!is_theta_exp(flag) && flag != cmp_in) || !(c = rel_find_exp(rel, c)))
- continue;
-
- if (flag == cmp_gt || flag ==
cmp_gte || flag == cmp_lte || flag == cmp_lt || flag == cmp_equal) {
- sql_exp *l = e->r, *h =
e->f;
- atom *lval =
exp_flatten(v->sql, l);
- atom *hval = h ?
exp_flatten(v->sql, h) : lval;
-
- if (lval && hval) {
- range_limit
*next = SA_ZNEW(v->sql->sa, range_limit);
- next->lval =
lval;
- next->hval =
hval;
- next->flag =
flag;
- next->anti =
is_anti(e);
- next->semantics
= is_semantics(e);
-
-
list_append(cols, c);
-
list_append(ranges, next);
+ low = sa_list(v->sql->sa);
+ high = sa_list(v->sql->sa);
+ for(n = sel->exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ atom *lval = NULL, *hval = NULL;
+
+ if (e->type == e_cmp &&
(e->flag == cmp_equal || e->f )) {
+ sql_exp *l = e->r;
+ sql_exp *h = e->f;
+ sql_exp *c = e->l;
+
+ c = rel_find_exp(rel,
c);
+ lval =
exp_flatten(v->sql, l);
+ if (!h)
+ hval = lval;
+ else if (h)
+ hval =
exp_flatten(v->sql, h);
+ if (c && lval && hval) {
+ append(cols, c);
+ append(low,
lval);
+ append(high,
hval);
}
}
- if (flag == cmp_in) { /* handle
in lists */
- list *vals = e->r,
*vlist = sa_list(v->sql->sa);
-
- node *m = NULL;
- for (m = vals->h; m; m
= m->next) {
- sql_exp *l =
m->data;
- atom *lval =
exp_flatten(v->sql, l);
-
- if (!lval)
- break;
-
list_append(vlist, lval);
- }
- if (!m) {
- range_limit
*next = SA_ZNEW(v->sql->sa, range_limit);
- next->values =
vlist; /* mark high as value list */
- next->flag =
flag;
- next->anti =
is_anti(e);
- next->semantics
= is_semantics(e);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list