Changeset: 1a62e0cd1ac3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1a62e0cd1ac3
Modified Files:
        sql/server/rel_propagate.c
        sql/server/sql_partition.c
Branch: Apr2019
Log Message:

Defensive lines: not all left and right children of a relation are a relation 
for every operator.


diffs (139 lines):

diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -485,34 +485,21 @@ exp_change_column_table(mvc *sql, sql_ex
 static sql_rel*
 rel_change_base_table(mvc* sql, sql_rel* rel, sql_table* oldt, sql_table* newt)
 {
-       if(!rel)
+       if (!rel)
                return NULL;
 
-       if(rel->exps)
-               for(node *n = rel->exps->h ; n ; n = n->next)
+       if (rel->exps)
+               for (node *n = rel->exps->h ; n ; n = n->next)
                        n->data = exp_change_column_table(sql, (sql_exp*) 
n->data, oldt, newt);
 
-       switch(rel->op) {
-               case op_basetable:
-                       if(rel->l == oldt)
-                               rel->l = newt;
-                       if(rel->r)
-                               rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
+       switch (rel->op) {
+               case op_ddl:
                        break;
                case op_table:
-               case op_topn:
-               case op_sample:
-               case op_project:
-               case op_groupby:
-               case op_select:
-               case op_insert:
-               case op_ddl:
-               case op_update:
-               case op_delete:
-               case op_truncate:
-               case op_union:
-               case op_inter:
-               case op_except:
+               case op_basetable:
+                       if (rel->l == oldt)
+                               rel->l = newt;
+                       break;
                case op_join:
                case op_left:
                case op_right:
@@ -520,10 +507,29 @@ rel_change_base_table(mvc* sql, sql_rel*
                case op_semi:
                case op_anti:
                case op_apply:
-                       if(rel->l)
+               case op_union:
+               case op_inter:
+               case op_except:
+                       if (rel->l)
                                rel->l = rel_change_base_table(sql, rel->l, 
oldt, newt);
-                       if(rel->r)
+                       if (rel->r)
                                rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
+                       break;
+               case op_groupby:
+               case op_project:
+               case op_select:
+               case op_topn:
+               case op_sample:
+                       if (rel->l)
+                               rel->l = rel_change_base_table(sql, rel->l, 
oldt, newt);
+                       break;
+               case op_insert:
+               case op_update:
+               case op_delete:
+               case op_truncate:
+                       if (rel->r)
+                               rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
+                       break;
        }
        return rel;
 }
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -86,16 +86,49 @@ static void exp_find_table_columns(mvc *
 static void
 rel_find_table_columns(mvc* sql, sql_rel* rel, sql_table *t, list *cols)
 {
-       if(!rel)
+       if (!rel)
                return;
 
-       if(rel->exps)
-               for(node *n = rel->exps->h ; n ; n = n->next)
+       if (rel->exps)
+               for (node *n = rel->exps->h ; n ; n = n->next)
                        exp_find_table_columns(sql, (sql_exp*) n->data, t, 
cols);
-       if(rel->l)
-               rel_find_table_columns(sql, rel->l, t, cols);
-       if(rel->r)
-               rel_find_table_columns(sql, rel->r, t, cols);
+
+       switch (rel->op) {
+               case op_table:
+               case op_basetable:
+               case op_ddl:
+                       break;
+               case op_join:
+               case op_left:
+               case op_right:
+               case op_full:
+               case op_semi:
+               case op_anti:
+               case op_apply:
+               case op_union:
+               case op_inter:
+               case op_except:
+                       if (rel->l)
+                               rel_find_table_columns(sql, rel->l, t, cols);
+                       if (rel->r)
+                               rel_find_table_columns(sql, rel->r, t, cols);
+                       break;
+               case op_groupby:
+               case op_project:
+               case op_select:
+               case op_topn:
+               case op_sample:
+                       if (rel->l)
+                               rel_find_table_columns(sql, rel->l, t, cols);
+                       break;
+               case op_insert:
+               case op_update:
+               case op_delete:
+               case op_truncate:
+                       if (rel->r)
+                               rel_find_table_columns(sql, rel->r, t, cols);
+                       break;
+       }
 }
 
 static void
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to