Changeset: ad169684906e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ad169684906e
Modified Files:
        sql/server/rel_basetable.c
        sql/server/rel_basetable.h
        sql/server/rel_rel.c
Branch: default
Log Message:

If a basetable relation doesn't have a TID column add it conditionally as 
identity


diffs (90 lines):

diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -421,6 +421,44 @@ rewrite_basetable(mvc *sql, sql_rel *rel
        return rel;
 }
 
+sql_exp *
+basetable_get_tid_or_add_it(mvc *sql, sql_rel *rel)
+{
+       sql_exp *res = NULL;
+
+       if (is_basetable(rel->op)) {
+               sql_allocator *sa = sql->sa;
+               sql_table *t = rel->l;
+               rel_base_t *ba = rel->r;
+               const char *tname = t->base.name;
+               const char *atname = ba->name?ba->name:tname;
+
+               if (!rel->exps) { /* no exps yet, just set TID */
+                       rel_base_use_tid(sql, rel);
+                       res = exp_alias(sa, atname, TID, tname, TID, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1, 1);
+               } else if (!rel_base_is_used(ba, ol_length(t->columns)) ||  /* 
exps set, but no TID, add it */
+                                  !(res = exps_bind_column2(rel->exps, atname, 
TID, NULL))) { /* exps set with TID, but maybe rel_dce removed it */
+                       node *n = NULL;
+                       rel_base_use_tid(sql, rel);
+                       res = exp_alias(sa, atname, TID, tname, TID, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1, 1);
+
+                       /* search for indexes */
+                       for (node *cn = rel->exps->h; cn && !n; cn = cn->next) {
+                               sql_exp *e = cn->data;
+
+                               if (is_intern(e))
+                                       n = cn;
+                       }
+                       if (n) { /* has indexes, insert TID before them */
+                               list_append_before(rel->exps, n, res);
+                       } else {
+                               list_append(rel->exps, res);
+                       }
+               }
+       }
+       return res;
+}
+
 sql_rel *
 rel_rename_part(mvc *sql, sql_rel *p, sql_rel *mt_rel, const char *mtalias)
 {
diff --git a/sql/server/rel_basetable.h b/sql/server/rel_basetable.h
--- a/sql/server/rel_basetable.h
+++ b/sql/server/rel_basetable.h
@@ -40,6 +40,7 @@ extern list *rel_base_projection( mvc *s
 extern list *rel_base_project_all( mvc *sql, sql_rel *rel, char *tname); /* 
select * from t */
 extern sql_rel *rel_base_add_columns( mvc *sql, sql_rel *r);
 extern sql_rel *rewrite_basetable(mvc *sql, sql_rel *rel);
+extern sql_exp *basetable_get_tid_or_add_it(mvc *sql, sql_rel *rel);
 extern sql_rel *rel_rename_part(mvc *sql, sql_rel *p, sql_rel *mt_rel, const 
char *mtalias);
 
 extern void rel_base_dump_exps( stream *fout, sql_rel *rel);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1563,9 +1563,11 @@ static sql_rel *
 sql_rel *
 rel_add_identity(mvc *sql, sql_rel *rel, sql_exp **exp)
 {
-       if (rel && is_simple_project(rel->op) && !need_distinct(rel) && (*exp = 
exps_find_identity(rel->exps, rel->l)) != NULL)
+       if (rel && is_basetable(rel->op)) { /* for base table relations just 
use TID column as identity */
+               *exp = basetable_get_tid_or_add_it(sql, rel);
                return rel;
-       if (rel && is_basetable(rel->op) && rel->exps && (*exp = 
exps_bind_column(rel->exps, TID, NULL, NULL, 0)) != NULL)
+       }
+       if (rel && is_simple_project(rel->op) && !need_distinct(rel) && (*exp = 
exps_find_identity(rel->exps, rel->l)) != NULL)
                return rel;
        return _rel_add_identity(sql, rel, exp);
 }
@@ -1575,9 +1577,11 @@ rel_add_identity2(mvc *sql, sql_rel *rel
 {
        sql_rel *l = rel, *p = rel;
 
-       if (rel && is_simple_project(rel->op) && !need_distinct(rel) && (*exp = 
exps_find_identity(rel->exps, rel->l)) != NULL)
+       if (rel && is_basetable(rel->op)) { /* for base table relations just 
use TID column as identity */
+               *exp = basetable_get_tid_or_add_it(sql, rel);
                return rel;
-       if (rel && is_basetable(rel->op) && rel->exps && (*exp = 
exps_bind_column(rel->exps, TID, NULL, NULL, 0)) != NULL)
+       }
+       if (rel && is_simple_project(rel->op) && !need_distinct(rel) && (*exp = 
exps_find_identity(rel->exps, rel->l)) != NULL)
                return rel;
        while(l && !is_set(l->op) && rel_has_freevar(sql, l) && l->l) {
                p = l;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to