Changeset: 17a236c4bfce for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/17a236c4bfce
Branch: default
Log Message:

Merged branch join-idx-improvements into default.


diffs (83 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
@@ -4093,20 +4093,37 @@ insert_check_fkey(backend *be, list *ins
        sql_subtype *bt = sql_bind_localtype("bit");
        sql_subfunc *ne = sql_bind_func_result(sql, "sys", "<>", F_FUNC, true, 
bt, 2, lng, lng);
 
+    stmt *nonil_rows = NULL;
        for (node *m = k->columns->h; m; m = m->next) {
                sql_kc *c = m->data;
 
                /* foreach column add predicate */
                stmt_add_column_predicate(be, c->c);
-       }
-
-       if (pin && list_length(pin->op4.lval))
+           
+        // foreach column aggregate the nonil (literally 'null') values.
+        // mind that null values are valid fkeys with undefined value so
+        // we won't have an entry for them in the idx_inserts col
+               s = list_fetch(inserts, c->c->colnr);
+               nonil_rows = stmt_selectnonil(be, s, nonil_rows);
+       }
+
+       if (!s && pin && list_length(pin->op4.lval))
                s = pin->op4.lval->h->data;
+    
+    // we want to make sure that the data column(s) has the same number
+    // of (nonil) rows as the index column. if that is **not** the case
+    // then we are obviously dealing with an invalid foreign key 
        if (s->key && s->nrcols == 0) {
-               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 
1, 0, 1), stmt_atom_lng(be, 1), NULL, ne);
+               s = stmt_binop(be, 
+                       stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 1, 1, 1), 
+                       stmt_aggr(be, const_column(be, nonil_rows), NULL, NULL, 
cnt, 1, 1, 1), 
+                       NULL, ne);
        } else {
-               /* releqjoin.count <> inserts[col1].count */
-               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 
1, 0, 1), stmt_aggr(be, column(be, s), NULL, NULL, cnt, 1, 0, 1), NULL, ne);
+               /* relThetaJoin.notNull.count <> inserts[notNull(col1) && ... 
&& notNull(colN)].count */
+               s = stmt_binop(be, 
+                       stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 1, 1, 1), 
+                       stmt_aggr(be, column(be, nonil_rows), NULL, NULL, cnt, 
1, 1, 1), 
+                       NULL, ne);
        }
 
        /* s should be empty */
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
@@ -142,11 +142,14 @@ static sql_rel *
 rel_insert_join_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *inserts)
 {
        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, rk->t->base.name);
+       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_bind_localtype("bit");
        sql_subfunc *or = sql_bind_func_result(sql, "sys", "or", F_FUNC, true, 
bt, 2, bt, bt);
@@ -162,6 +165,7 @@ rel_insert_join_idx(mvc *sql, const char
                if (c->c->null)
                        need_nulls = 1;
        }
+       need_nulls = 0;
        /* NULL and NOT NULL, for 'SIMPLE MATCH' semantics */
        /* AND joins expressions */
        for (m = i->columns->h, o = rk->columns->h; m && o; m = m->next, o = 
o->next) {
@@ -213,7 +217,7 @@ rel_insert_join_idx(mvc *sql, const char
        }
 
        pexps = rel_projections(sql, nnlls, NULL, 1, 1);
-       nnlls = rel_crossproduct(sql->sa, nnlls, rt, op_join);
+       nnlls = rel_crossproduct(sql->sa, nnlls, rt, op_left/*op_join*/);
        nnlls->exps = join_exps;
        nnlls = rel_project(sql->sa, nnlls, pexps);
        /* add row numbers */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to