Changeset: 3ae936fc91ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3ae936fc91ef
Modified Files:
sql/backends/monet5/rel_bin.c
sql/include/sql_relation.h
sql/server/rel_updates.c
Branch: default
Log Message:
use op_left for join_idx value computation, instead of poor mans union (inner,
nulls)
ie leave left outer implemenation to physical layer
diffs (265 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3266,7 +3266,6 @@ rel2bin_join(backend *be, sql_rel *rel,
list *l, *sexps = NULL, *l2 = NULL;
node *en = NULL, *n;
stmt *left = NULL, *right = NULL, *join = NULL, *jl, *jr, *ld = NULL,
*rd = NULL, *res;
- int need_left = (rel->flag & LEFT_JOIN);
if (rel->attr && list_length(rel->attr) > 0)
return rel2bin_groupjoin(be, rel, refs);
@@ -3352,10 +3351,10 @@ rel2bin_join(backend *be, sql_rel *rel,
list_append(exps, e);
}
if (list_length(lje) > 1) {
- join = releqjoin(be, lje, rje, exps, used_hash,
need_left, 0);
- } else if (!join || need_left) {
+ join = releqjoin(be, lje, rje, exps, used_hash,
0, 0);
+ } else if (!join) {
sql_exp *e = exps->h->data;
- join = stmt_join(be, lje->h->data,
rje->h->data, 0, cmp_equal, need_left, is_semantics(e), false);
+ join = stmt_join(be, lje->h->data,
rje->h->data, 0, cmp_equal, 0, is_semantics(e), false);
}
}
} else {
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -85,7 +85,6 @@ typedef struct expression {
/* or-ed with the above TABLE_PROD_FUNC */
#define UPD_COMP 2
-#define LEFT_JOIN 4
#define REL_PARTITION 8
#define MERGE_LEFT 16 /* used by merge statements */
#define OUTER_ZERO 32
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -157,25 +157,14 @@ rel_insert_join_idx(mvc *sql, const char
sql_key *rk = (sql_key*)os_find_id(tr->cat->objects, tr,
((sql_fkey*)i->key)->rkey);
sql_rel *rt = rel_basetable(sql, rk->t, rk->t->base.name), *brt = rt;
int selfref = (rk->t->base.id == i->t->base.id);
- int need_nulls = 0;
if (selfref)
TRC_DEBUG(SQL_TRANS, "Self-reference index\n");
- sql_subtype *bt = sql_fetch_localtype(TYPE_bit);
- sql_subfunc *or = sql_bind_func_result(sql, "sys", "or", F_FUNC, true,
bt, 2, bt, bt);
-
- sql_rel *_nlls = NULL, *nnlls, *ins = inserts->r;
- sql_exp *lnll_exps = NULL, *rnll_exps = NULL, *e;
+ sql_rel *ins = inserts->r;
+ sql_exp *e;
list *join_exps = new_exp_list(sql->sa), *pexps;
assert(is_project(ins->op) || ins->op == op_table);
- for (m = i->columns->h; m; m = m->next) {
- sql_kc *c = m->data;
-
- if (c->c->null)
- need_nulls = 1;
- }
- need_nulls = 0;
/* NULL and NOT NULL, for 'SIMPLE MATCH' semantics */
/* AND joins expressions */
@@ -192,8 +181,7 @@ rel_insert_join_idx(mvc *sql, const char
for (m = i->columns->h, o = rk->columns->h; m && o; m = m->next, o =
o->next) {
sql_kc *c = m->data;
sql_kc *rc = o->data;
- sql_subfunc *isnil = sql_bind_func(sql, "sys", "isnull",
&c->c->type, NULL, F_FUNC, true, true);
- sql_exp *_is = list_fetch(ins->exps, c->c->colnr), *lnl, *rnl,
*je;
+ sql_exp *_is = list_fetch(ins->exps, c->c->colnr), *je;
if (rel_base_use(sql, brt, rc->c->colnr)) {
/* TODO add access error */
@@ -201,67 +189,31 @@ rel_insert_join_idx(mvc *sql, const char
}
int unique = list_length(i->columns) == 1 &&
list_length(rk->columns) == 1 && is_column_unique(rc->c);
sql_exp *rtc = exp_column(sql->sa, rel_name(rt),
rc->c->base.name, &rc->c->type, CARD_MULTI, rc->c->null, unique, 0);
- rtc->nid = rel_base_nid(brt, rc->c);
- rtc->alias.label = rtc->nid;
+ rtc->alias.label = rel_base_nid(brt, rc->c);
+ rtc->nid = rtc->alias.label;
_is = exp_ref(sql, _is);
- lnl = exp_unop(sql->sa, _is, isnil);
- set_has_no_nil(lnl);
- rnl = exp_unop(sql->sa, _is, isnil);
- set_has_no_nil(rnl);
- if (need_nulls) {
- if (lnll_exps) {
- lnll_exps = exp_binop(sql->sa, lnll_exps, lnl,
or);
- rnll_exps = exp_binop(sql->sa, rnll_exps, rnl,
or);
- } else {
- lnll_exps = lnl;
- rnll_exps = rnl;
- }
- }
-
if (rel_convert_types(sql, rt, ins, &rtc, &_is, 1, type_equal)
< 0)
return NULL;
je = exp_compare(sql->sa, rtc, _is, cmp_equal);
+ if (c->c->null)
+ set_any(je);
append(join_exps, je);
}
- if (need_nulls) {
- _nlls = rel_select( sql->sa, rel_dup(ins),
- exp_compare(sql->sa, lnll_exps,
exp_atom_bool(sql->sa, 1), cmp_equal ));
- set_processed(_nlls);
- nnlls = rel_select( sql->sa, rel_dup(ins),
- exp_compare(sql->sa, rnll_exps,
exp_atom_bool(sql->sa, 0), cmp_equal ));
- set_processed(nnlls);
- _nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls,
NULL, 1, 1));
- /* add constant value for NULLS */
- e = exp_atom(sql->sa, atom_general(sql->sa,
sql_fetch_localtype(TYPE_oid), NULL, 0));
- exp_setname(sql, e, alias, iname);
- append(_nlls->exps, e);
- } else {
- nnlls = ins;
- }
- pexps = rel_projections(sql, nnlls, NULL, 1, 1);
- nnlls = rel_crossproduct(sql->sa, nnlls, rt, op_left/*op_join*/);
- nnlls->exps = join_exps;
- nnlls = rel_project(sql->sa, nnlls, pexps);
+ pexps = rel_projections(sql, ins, NULL, 1, 1);
+ ins = rel_crossproduct(sql->sa, ins, rt, op_left/*op_join*/);
+ ins->exps = join_exps;
+ ins = rel_project(sql->sa, ins, pexps);
/* add row numbers */
e = exp_column(sql->sa, rel_name(rt), TID,
sql_fetch_localtype(TYPE_oid), CARD_MULTI, 0, 1, 1);
rel_base_use_tid(sql, brt);
exp_setname(sql, e, alias, iname);
e->nid = rel_base_nid(brt, NULL);
- append(nnlls->exps, e);
- set_processed(nnlls);
-
- if (need_nulls) {
- rel_destroy(ins);
- rt = inserts->r = rel_setop_n_ary(sql->sa,
append(append(sa_list(sql->sa), _nlls), nnlls), op_munion );
+ append(ins->exps, e);
+ set_processed(ins);
- rel_setop_n_ary_set_exps(sql, rt, rel_projections(sql, nnlls,
NULL, 1, 1), false);
-
- set_processed(rt);
- } else {
- inserts->r = nnlls;
- }
+ inserts->r = ins;
return inserts;
}
@@ -860,31 +812,21 @@ rel_update_join_idx(mvc *sql, const char
char name[16], *nme = number2name(name, sizeof(name), nr);
char *iname = sa_strconcat( sql->sa, "%", i->base.name);
- int need_nulls = 0;
node *m, *o;
sql_trans *tr = sql->session->tr;
sql_key *rk = (sql_key*)os_find_id(tr->cat->objects, tr,
((sql_fkey*)i->key)->rkey);
sql_rel *rt = rel_basetable(sql, rk->t, sa_strdup(sql->sa, nme)), *brt
= rt;
- sql_subtype *bt = sql_fetch_localtype(TYPE_bit);
- sql_subfunc *or = sql_bind_func_result(sql, "sys", "or", F_FUNC, true,
bt, 2, bt, bt);
-
- sql_rel *_nlls = NULL, *nnlls, *ups = updates->r;
- sql_exp *lnll_exps = NULL, *rnll_exps = NULL, *e;
+ sql_rel *ups = updates->r;
+ sql_exp *e;
list *join_exps = new_exp_list(sql->sa), *pexps;
assert(is_project(ups->op) || ups->op == op_table);
- for (m = i->columns->h; m; m = m->next) {
- sql_kc *c = m->data;
-
- if (c->c->null)
- need_nulls = 1;
- }
for (m = i->columns->h, o = rk->columns->h; m && o; m = m->next, o =
o->next) {
sql_kc *c = m->data;
sql_kc *rc = o->data;
- sql_subfunc *isnil = sql_bind_func(sql, "sys", "isnull",
&c->c->type, NULL, F_FUNC, true, true);
- sql_exp *upd = list_fetch(ups->exps, c->c->colnr + 1), *lnl,
*rnl, *je;
+ sql_exp *upd = list_fetch(ups->exps, c->c->colnr + 1), *je;
+
if (rel_base_use(sql, rt, rc->c->colnr)) {
/* TODO add access error */
return NULL;
@@ -897,63 +839,29 @@ rel_update_join_idx(mvc *sql, const char
/* FOR MATCH FULL/SIMPLE/PARTIAL see above */
/* Currently only the default MATCH SIMPLE is supported */
upd = exp_ref(sql, upd);
- lnl = exp_unop(sql->sa, upd, isnil);
- set_has_no_nil(lnl);
- rnl = exp_unop(sql->sa, upd, isnil);
- set_has_no_nil(rnl);
- if (need_nulls) {
- if (lnll_exps) {
- lnll_exps = exp_binop(sql->sa, lnll_exps, lnl,
or);
- rnll_exps = exp_binop(sql->sa, rnll_exps, rnl,
or);
- } else {
- lnll_exps = lnl;
- rnll_exps = rnl;
- }
- }
if (rel_convert_types(sql, rt, updates, &rtc, &upd, 1,
type_equal) < 0) {
list_destroy(join_exps);
return NULL;
}
je = exp_compare(sql->sa, rtc, upd, cmp_equal);
+ if (c->c->null)
+ set_any(je);
append(join_exps, je);
}
- if (need_nulls) {
- _nlls = rel_select( sql->sa, rel_dup(ups),
- exp_compare(sql->sa, lnll_exps,
exp_atom_bool(sql->sa, 1), cmp_equal ));
- set_processed(_nlls);
- nnlls = rel_select( sql->sa, rel_dup(ups),
- exp_compare(sql->sa, rnll_exps,
exp_atom_bool(sql->sa, 0), cmp_equal ));
- set_processed(nnlls);
- _nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls,
NULL, 1, 1));
- /* add constant value for NULLS */
- e = exp_atom(sql->sa, atom_general(sql->sa,
sql_fetch_localtype(TYPE_oid), NULL, 0));
- exp_setname(sql, e, alias, iname);
- append(_nlls->exps, e);
- } else {
- nnlls = ups;
- }
- pexps = rel_projections(sql, nnlls, NULL, 1, 1);
- nnlls = rel_crossproduct(sql->sa, nnlls, rt, op_join);
- nnlls->exps = join_exps;
- nnlls->flag |= LEFT_JOIN;
- nnlls = rel_project(sql->sa, nnlls, pexps);
+ pexps = rel_projections(sql, ups, NULL, 1, 1);
+ ups = rel_crossproduct(sql->sa, ups, rt, op_left/*op_join*/);
+ ups->exps = join_exps;
+ ups = rel_project(sql->sa, ups, pexps);
/* add row numbers */
e = exp_column(sql->sa, rel_name(rt), TID,
sql_fetch_localtype(TYPE_oid), CARD_MULTI, 0, 1, 1);
rel_base_use_tid(sql, brt);
exp_setname(sql, e, alias, iname);
e->nid = rel_base_nid(brt, NULL);
- append(nnlls->exps, e);
- set_processed(nnlls);
+ append(ups->exps, e);
+ set_processed(ups);
- if (need_nulls) {
- rel_destroy(ups);
- rt = updates->r = rel_setop_n_ary(sql->sa,
append(append(sa_list(sql->sa), _nlls), nnlls), op_munion );
- rel_setop_n_ary_set_exps(sql, rt, rel_projections(sql, nnlls,
NULL, 1, 1), false);
- set_processed(rt);
- } else {
- updates->r = nnlls;
- }
+ updates->r = ups;
if (!updates->exps)
updates->exps = new_exp_list(sql->sa);
append(updates->exps, e = exp_column(sql->sa, alias, iname,
sql_fetch_localtype(TYPE_oid), CARD_MULTI, 0, 0, 0));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]