Changeset: 382f586de2c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/382f586de2c4
Modified Files:
sql/rel.txt
sql/server/rel_basetable.c
sql/server/rel_basetable.h
sql/server/rel_optimizer.c
Branch: default
Log Message:
Move rel_rename_part to the right translation unit
diffs (175 lines):
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -4,7 +4,7 @@ BASETABLE
-> exps is list of column expressions (also used for aliases)
-> l (sql_table)
-> r rel_base_t { alias table name, disallowed (read
access), bitvector of used columns/tid/idxs
- -> r rel_optimizer rel_rename_part puts parent merge table
in there
+ -> r rel_rename_part call puts parent merge table in there
TABLE (card MULTI)
-> flags TABLE_PROD_FUNC, TABLE_FROM_RELATION, TRIGGER_WRAPPER
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
@@ -419,6 +419,72 @@ rewrite_basetable(mvc *sql, sql_rel *rel
return rel;
}
+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);
+
+ 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 (node *n = mt_rel->exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ node *cn = NULL, *ci = NULL;
+ const char *nname = exp_name(e);
+
+ if (nname[0] == '%' && 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 (nname[0] != '%' && (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 *ne = 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 = ne->p = prop_create(sql->sa,
PROP_HASHCOL, ne->p);
+ p->value = rc->t->pkey;
+ } else if (rc->unique == 1) {
+ prop *p = ne->p = prop_create(sql->sa,
PROP_HASHCOL, ne->p);
+ p->value = NULL;
+ }
+ set_basecol(ne);
+ rel_base_use(sql, p, rc->colnr);
+ list_append(p->exps, ne);
+ } else if (nname[0] == '%' && ol_length(mt->idxs) && (ci =
ol_find_name(mt->idxs, nname + 1))) {
+ sql_idx *i = ci->data, *ri = NULL;
+
+ /* 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));
+ 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 *ne = exp_alias(sql->sa, mtalias, iname1,
pname, iname2, t, CARD_MULTI, has_nil(e), 1);
+ /* index names are prefixed, to make them independent */
+ if (hash_index(ri->type)) {
+ prop *p = ne->p = prop_create(sql->sa,
PROP_HASHIDX, ne->p);
+ p->value = ri;
+ } else if (ri->type == join_idx) {
+ prop *p = ne->p = prop_create(sql->sa,
PROP_JOINIDX, ne->p);
+ p->value = ri;
+ }
+ list_append(p->exps, ne);
+ }
+ }
+ rel_base_set_mergetable(p, mt);
+ return p;
+}
+
void
rel_base_dump_exps( stream *fout, sql_rel *rel)
{
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_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);
extern int rel_base_has_column_privileges( mvc *sql, sql_rel *rel);
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
@@ -8654,72 +8654,6 @@ exp_range_overlap(atom *min, atom *max,
return 1;
}
-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);
-
- 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 (node *n = mt_rel->exps->h; n; n = n->next) {
- sql_exp *e = n->data;
- 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 (nname[0] != '%' && (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 *ne = 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 = ne->p = prop_create(sql->sa,
PROP_HASHCOL, ne->p);
- p->value = rc->t->pkey;
- } else if (rc->unique == 1) {
- prop *p = ne->p = prop_create(sql->sa,
PROP_HASHCOL, ne->p);
- p->value = NULL;
- }
- set_basecol(ne);
- rel_base_use(sql, p, rc->colnr);
- list_append(p->exps, ne);
- } else if (nname[0] == '%' && ol_length(mt->idxs) && (ci =
ol_find_name(mt->idxs, nname + 1))) {
- sql_idx *i = ci->data, *ri = NULL;
-
- /* 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));
- 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 *ne = exp_alias(sql->sa, mtalias, iname1,
pname, iname2, t, CARD_MULTI, has_nil(e), 1);
- /* index names are prefixed, to make them independent */
- if (hash_index(ri->type)) {
- prop *p = ne->p = prop_create(sql->sa,
PROP_HASHIDX, ne->p);
- p->value = ri;
- } else if (ri->type == join_idx) {
- prop *p = ne->p = prop_create(sql->sa,
PROP_JOINIDX, ne->p);
- p->value = ri;
- }
- list_append(p->exps, ne);
- }
- }
- rel_base_set_mergetable(p, mt);
- return p;
-}
-
typedef struct {
atom *lval;
atom *hval;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list