Changeset: ca6bc3bd3a17 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ca6bc3bd3a17
Modified Files:
sql/server/rel_basetable.c
sql/server/rel_optimizer.c
sql/server/rel_optimizer.h
Branch: Jul2021
Log Message:
Cleanup. Make sure name_find_column always returns a column and be more
defensive while retrieving merge tables
diffs (96 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
@@ -457,7 +457,8 @@ rel_base_set_mergetable(sql_rel *rel, sq
{
rel_base_t *ba = rel->r;
- ba->mt = mt;
+ if (ba)
+ ba->mt = mt;
}
sql_table *
@@ -465,5 +466,5 @@ rel_base_get_mergetable(sql_rel *rel)
{
rel_base_t *ba = rel->r;
- return ba->mt;
+ return ba ? ba->mt : NULL;
}
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
@@ -51,7 +51,7 @@ find_member_pos(list *l, sql_table *t)
*/
/* currently we only find simple column expressions */
-void *
+sql_column *
name_find_column( sql_rel *rel, const char *rname, const char *name, int pnr,
sql_rel **bt )
{
sql_exp *alias = NULL;
@@ -74,30 +74,30 @@ name_find_column( sql_rel *rel, const ch
rname = e->l;
name = e->r;
}
- if (name && !t)
- return rel_base_get_mergetable(rel);
if (rname && strcmp(t->base.name, rname) != 0)
return NULL;
- node *cn;
sql_table *mt = rel_base_get_mergetable(rel);
- for (cn = ol_first_node(t->columns); cn; cn = cn->next) {
- sql_column *c = cn->data;
- if (strcmp(c->base.name, name) == 0) {
- *bt = rel;
- if (pnr < 0 || (mt &&
- find_member_pos(mt->members, c->t) ==
pnr))
- return c;
- }
- }
- if (t->idxs)
- for (cn = ol_first_node(t->idxs); cn; cn = cn->next) {
- sql_idx *i = cn->data;
- if (strcmp(i->base.name, name+1 /* skip % */) == 0) {
- *bt = rel;
- if (pnr < 0 || (mt &&
- find_member_pos(mt->members, i->t) ==
pnr)) {
- sql_kc *c = i->columns->h->data;
- return c->c;
+ if (ol_length(t->columns)) {
+ for (node *cn = ol_first_node(t->columns); cn; cn =
cn->next) {
+ sql_column *c = cn->data;
+ if (strcmp(c->base.name, name) == 0) {
+ *bt = rel;
+ if (pnr < 0 || (mt &&
+ find_member_pos(mt->members,
c->t) == pnr))
+ return c;
+ }
+ }
+ }
+ if (ol_length(t->idxs) && name[0]) {
+ for (node *cn = ol_first_node(t->idxs); cn; cn =
cn->next) {
+ sql_idx *i = cn->data;
+ if (strcmp(i->base.name, name+1 /* skip % */)
== 0) {
+ *bt = rel;
+ if (pnr < 0 || (mt &&
+ find_member_pos(mt->members,
i->t) == pnr)) {
+ sql_kc *c = i->columns->h->data;
+ return c->c;
+ }
}
}
}
diff --git a/sql/server/rel_optimizer.h b/sql/server/rel_optimizer.h
--- a/sql/server/rel_optimizer.h
+++ b/sql/server/rel_optimizer.h
@@ -16,7 +16,7 @@ extern sql_rel *rel_optimizer(mvc *sql,
extern int exp_joins_rels(sql_exp *e, list *rels);
-extern void *name_find_column(sql_rel *rel, const char *rname, const char
*name, int pnr, sql_rel **bt);
+extern sql_column *name_find_column(sql_rel *rel, const char *rname, const
char *name, int pnr, sql_rel **bt);
extern int exps_unique(mvc *sql, sql_rel *rel, list *exps);
extern sql_rel *rel_dce(mvc *sql, sql_rel *rel);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list