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