Changeset: b0bd0b2e2528 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b0bd0b2e2528
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jul2021
Log Message:

Fix bug #7165 on Jul2021 by correctly propagating indixes to children tables


diffs (86 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
@@ -8745,26 +8745,70 @@ static sql_rel *
 rel_rename_part(mvc *sql, sql_rel *p, sql_rel *mt_rel, const char *mtalias)
 {
        sql_table *mt = rel_base_table(mt_rel), *t = rel_base_table(p);
-       node *n;
 
        assert(!p->exps);
        p->exps = sa_list(sql->sa);
        const char *pname = t->base.name;
        if (isRemote(t))
                pname = mapiuri_table(t->query, sql->sa, pname);
-       for (n = mt_rel->exps->h; n; n = n->next) {
+       for (node *n = mt_rel->exps->h; n; n = n->next) {
                sql_exp *e = n->data;
-               if (is_intern(e) || exp_name(e)[0] == '%') /* break on tid/idxs 
*/
-                       break;
-               sql_column *c = ol_find_name(mt->columns, exp_name(e))->data;
-               sql_column *rc = ol_fetch(t->columns, c->colnr);
-               /* with name find column in merge table, with colnr find column 
in member */
-               list_append(p->exps, exp_alias(sql->sa, mtalias, c->base.name, 
pname, rc->base.name, &rc->type, CARD_MULTI, rc->null, 0));
-       }
-       if (n) {
-               sql_exp *e = n->data;
-               if (strcmp(exp_name(e), TID) == 0)
+               node *cn = NULL, *ci = NULL;
+               const char *nname = exp_name(e);
+
+               if (strcmp(nname, TID) == 0) {
                        list_append(p->exps, exp_alias(sql->sa, mtalias, TID, 
pname, TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+                       rel_base_use_tid(sql, p);
+               } else if ((cn = ol_find_name(mt->columns, nname))) {
+                       sql_column *c = cn->data, *rc = ol_fetch(t->columns, 
c->colnr);
+
+                       /* with name find column in merge table, with colnr 
find column in member */
+                       sql_exp *e = exp_alias(sql->sa, mtalias, c->base.name, 
pname, rc->base.name, &rc->type, CARD_MULTI, rc->null, 0);
+                       if (rc->t->pkey && 
((sql_kc*)rc->t->pkey->k.columns->h->data)->c == rc) {
+                               prop *p = e->p = prop_create(sql->sa, 
PROP_HASHCOL, e->p);
+                               p->value = rc->t->pkey;
+                       } else if (rc->unique == 1) {
+                               prop *p = e->p = prop_create(sql->sa, 
PROP_HASHCOL, e->p);
+                               p->value = NULL;
+                       }
+                       set_basecol(e);
+                       rel_base_use(sql, p, rc->colnr);
+                       list_append(p->exps, e);
+               } else if (nname[0] && ol_length(mt->idxs) && (ci = 
ol_find_name(mt->idxs, nname + 1))) {
+                       sql_idx *i = ci->data, *ri = NULL;
+                       int has_nils = 0;
+
+                       /* indexes don't have a number field like 'colnr', so 
get the index the old way */
+                       for (node *nn = mt->idxs->l->h, *mm = t->idxs->l->h; nn 
&& mm ; nn = nn->next, mm = mm->next) {
+                               sql_idx *ii = nn->data;
+
+                               if (ii->base.id == i->base.id) {
+                                       ri = mm->data;
+                                       break;
+                               }
+                       }
+
+                       assert((!hash_index(ri->type) || 
list_length(ri->columns) > 1) && idx_has_column(ri->type));
+                       for (node *nn = ri->columns->h ; nn && !has_nils; nn = 
nn->next) { /* check for NULL values */
+                               sql_kc *kc = nn->data;
+
+                               if (kc->c->null)
+                                       has_nils = 1;
+                       }
+                       sql_subtype *t = (ri->type == join_idx) ? 
sql_bind_localtype("oid") : sql_bind_localtype("lng");
+                       char *iname1 = sa_strconcat(sql->sa, "%", 
i->base.name), *iname2 = sa_strconcat(sql->sa, "%", ri->base.name);
+
+                       sql_exp *e = exp_alias(sql->sa, mtalias, iname1, pname, 
iname2, t, CARD_MULTI, has_nils, 1);
+                       /* index names are prefixed, to make them independent */
+                       if (hash_index(ri->type)) {
+                               prop *p = e->p = prop_create(sql->sa, 
PROP_HASHIDX, e->p);
+                               p->value = ri;
+                       } else if (ri->type == join_idx) {
+                               prop *p = e->p = prop_create(sql->sa, 
PROP_JOINIDX, e->p);
+                               p->value = ri;
+                       }
+                       list_append(p->exps, e);
+               }
        }
        rel_base_set_mergetable(p, mt);
        return p;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to