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]