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

Reply via email to