Changeset: 795b4a189ea3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=795b4a189ea3 Modified Files: gdk/gdk_bat.c sql/backends/monet5/vaults/shp/shp.h sql/server/rel_optimizer.c sql/server/rel_unnest.c Branch: default Log Message:
Merge with Jun2020 branch. diffs (173 lines): diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2317,6 +2317,8 @@ BATassertProps(BAT *b) BATloop(b, p, q) { valp = BUNtail(bi, p); bool isnil = cmpf(valp, nilp) == 0; + assert(b->ttype != TYPE_flt || !isinf(*(flt*)valp)); + assert(b->ttype != TYPE_dbl || !isinf(*(dbl*)valp)); if (maxval && !isnil) { cmp = cmpf(maxval, valp); assert(cmp >= 0); @@ -2396,6 +2398,8 @@ BATassertProps(BAT *b) BUN prb; valp = BUNtail(bi, p); bool isnil = cmpf(valp, nilp) == 0; + assert(b->ttype != TYPE_flt || !isinf(*(flt*)valp)); + assert(b->ttype != TYPE_dbl || !isinf(*(dbl*)valp)); if (maxval && !isnil) { cmp = cmpf(maxval, valp); assert(cmp >= 0); 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 @@ -5415,115 +5415,6 @@ rel_join2semijoin(visitor *v, sql_rel *r return rel; } -typedef struct { - sql_rel *p; /* the found join's parent */ - sql_rel *j; /* the found join relation itself */ -} found_join; - -static void -rel_find_joins(mvc *sql, sql_rel *parent, sql_rel *rel, list *l, int depth) -{ - if (!rel || depth == 5) /* limit to 5 relations below in the tree */ - return; - - switch (rel->op) { - case op_basetable: - case op_table: - case op_ddl: - case op_truncate: - break; - case op_join: - case op_left: - case op_right: - case op_full: - case op_semi: - case op_anti: { - found_join *fl = SA_NEW(sql->sa, found_join); - fl->p = parent; - fl->j = rel; - list_append(l, fl); - - if (rel->l) - rel_find_joins(sql, rel, rel->l, l, depth + 1); - if (rel->r) - rel_find_joins(sql, rel, rel->r, l, depth + 1); - } break; - case op_union: - case op_inter: - case op_except: { - if (rel->l) - rel_find_joins(sql, rel, rel->l, l, depth + 1); - if (rel->r) - rel_find_joins(sql, rel, rel->r, l, depth + 1); - } break; - case op_groupby: - case op_project: - case op_select: - case op_topn: - case op_sample: { - if (rel->l) - rel_find_joins(sql, rel, rel->l, l, depth + 1); - } break; - case op_insert: - case op_update: - case op_delete: { - if (rel->r) - rel_find_joins(sql, rel, rel->r, l, depth + 1); - } break; - } -} - -/* find identical joins in diferent branches of the relational plan and merge them together */ -static sql_rel * -rel_merge_identical_joins(visitor *v, sql_rel *rel) -{ - if (is_joinop(rel->op) && rel->l && rel->r) { - list *l1 = sa_list(v->sql->sa), *l2 = sa_list(v->sql->sa); - - rel_find_joins(v->sql, rel, rel->l, l1, 0); - rel_find_joins(v->sql, rel, rel->r, l2, 0); - - if (list_length(l1) && list_length(l2)) { /* found joins on both */ - for (node *n1 = l1->h ; n1; n1 = n1->next) { - found_join *f1 = (found_join*) n1->data; - for (node *n2 = l2->h ; n2; n2 = n2->next) { - found_join *f2 = (found_join*) n2->data; - sql_rel *j1 = f1->j, *j2 = f2->j, *j1_l = j1->l, *j1_r = j1->r, *j2_l = j2->l, *j2_r = j2->r; - bool sides_equal = false; - - if (j1 != j2) { - const char *j1_ln = rel_name(j1_l), *j1_rn = rel_name(j1_r), *j2_ln = rel_name(j2_l), *j2_rn = rel_name(j2_r); - - /* So far it looks on identical relations and common basetable relations */ - if ((j1_l == j2_l || (is_basetable(j1_l->op) && is_basetable(j2_l->op) && strcmp(j1_ln, j2_ln) == 0 && j1_l->l == j2_l->l)) && - (j1_r == j2_r || (is_basetable(j1_r->op) && is_basetable(j2_r->op) && strcmp(j1_rn, j2_rn) == 0 && j1_r->l == j2_r->l))) - sides_equal = true; - else if ((j1_l == j2_r || (is_basetable(j1_l->op) && is_basetable(j2_r->op) && strcmp(j1_ln, j2_rn) == 0 && j1_l->l == j2_r->l)) && - (j1_r == j2_l || (is_basetable(j1_r->op) && is_basetable(j2_l->op) && strcmp(j1_rn, j2_ln) == 0 && j1_r->l == j2_l->l))) - sides_equal = true; - - /* the left and right sides are equal */ - if (sides_equal && exp_match_list(j1->exps, j2->exps)) { - sql_rel *p2 = f2->p; - - if (p2->l == j2) {/* replace j2's parent join with j1 */ - rel_destroy(p2->l); - p2->l = rel_dup(j1); - } else { - rel_destroy(p2->r); - p2->r = rel_dup(j1); - } - v->changes++; - return rel; - } - } - } - } - } - } - return rel; -} - static sql_rel * rel_push_select_down_union(visitor *v, sql_rel *rel) { @@ -9493,8 +9384,6 @@ optimize_rel(mvc *sql, sql_rel *rel, int if (level <= 0) rel = rel_visitor_bottomup(&v, rel, &rel_join_push_exps_down); - - if (/* DISABLES CODE */ (0)) rel = rel_visitor_bottomup(&ev, rel, &rel_merge_identical_joins); } /* Important -> Re-write semijoins after rel_join_order */ diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -880,19 +880,7 @@ push_up_project(mvc *sql, sql_rel *rel, } if (r->l) e = exp_rewrite(sql, r->l, e, ad); - if (e->type == e_atom && e->f) { - list *atoms = (list*)e->f; - - if (list_length(atoms) > 1) - return sql_error(sql, 02, SQLSTATE(21000) "Cardinality violation, scalar value expected"); - for (node *nn = atoms->h ; nn ; nn = nn->next) { - sql_exp *ee = (sql_exp *) nn->data; - - exp_setname(sql->sa, ee, exp_relname(e), exp_name(e)); - append(n->exps, ee); - } - } else - append(n->exps, e); + append(n->exps, e); } if (r->r) { list *exps = r->r, *oexps = n->r = sa_list(sql->sa); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list