Changeset: 7a09497338d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7a09497338d8
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_schema.c
Branch: use_min_max_prop
Log Message:

first check ranges/value lists before inserting into the bats


diffs (122 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
@@ -754,7 +754,7 @@ rel_generate_subinserts(sql_query *query
                        } else {
                                bool max_equal_min = ATOMcmp(tpe, 
pt->part.range.maxvalue, pt->part.range.minvalue) == 0;
 
-                               full_range = range = max_equal_min ? 
+                               full_range = range = max_equal_min ?
                                        exp_compare(sql->sa, le, 
exp_atom(sql->sa, atom_general_ptr(sql->sa, &tp, pt->part.range.minvalue)), 
cmp_equal) :
                                        exp_compare2(sql->sa, le, 
exp_atom(sql->sa, atom_general_ptr(sql->sa, &tp, pt->part.range.minvalue)),
                                                                                
          exp_atom(sql->sa, atom_general_ptr(sql->sa, &tp, 
pt->part.range.maxvalue)), 1, 0);
@@ -1055,6 +1055,17 @@ rel_subtable_insert(sql_query *query, sq
        return rel;
 }
 
+static sql_rel*
+rel_find_propagate( sql_rel *rel)
+{
+       if (is_ddl(rel->op) && rel->flag == ddl_list)
+                       return rel->r;
+       if (is_ddl(rel->op) && rel->flag == ddl_exception)
+                       return rel->r;
+       assert(is_insert(rel->op));
+       return rel;
+}
+
 sql_rel *
 rel_propagate(sql_query *query, sql_rel *rel, int *changes)
 {
@@ -1072,7 +1083,8 @@ rel_propagate(sql_query *query, sql_rel 
                                if (!nrel)
                                        return rel;
                                rel = nrel;
-                               propagate = nrel->l;
+                               propagate = rel_find_propagate(nrel);
+                               isSubtable = (rel != propagate);
                        }
                }
                if (isMergeTable(t)) {
@@ -1082,7 +1094,7 @@ rel_propagate(sql_query *query, sql_rel 
                        } else if (isRangePartitionTable(t) || 
isListPartitionTable(t)) {
                                if (is_insert(propagate->op)) { /* on inserts 
create a selection for each partition */
                                        if (isSubtable) {
-                                               rel->l = 
rel_propagate_insert(query, propagate, t, changes);
+                                               rel->r = 
rel_propagate_insert(query, propagate, t, changes);
                                        } else {
                                                rel = 
rel_propagate_insert(query, rel, t, changes);
                                        }
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -849,16 +849,32 @@ rel_project_exp(sql_allocator *sa, sql_e
 }
 
 sql_rel *
+rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r)
+{
+       sql_rel *rel = rel_create(sa);
+       if (!rel)
+               return NULL;
+       if (!l)
+               return r;
+       rel->l = l;
+       rel->r = r;
+       rel->op = op_ddl;
+       rel->flag = ddl_list;
+       return rel;
+}
+
+sql_rel *
 rel_exception(sql_allocator *sa, sql_rel *l, sql_rel *r, list *exps)
 {
        sql_rel *rel = rel_create(sa);
        if(!rel)
                return NULL;
-       rel->l = l;
        rel->r = r;
        rel->exps = exps;
        rel->op = op_ddl;
        rel->flag = ddl_exception;
+       if (l)
+               return rel_list(sa, rel, l); /* keep base relation on the right 
! */
        return rel;
 }
 
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -92,6 +92,7 @@ extern sql_rel *rel_select(sql_allocator
 extern sql_rel *rel_groupby(mvc *sql, sql_rel *l, list *groupbyexps );
 sql_export sql_rel *rel_project(sql_allocator *sa, sql_rel *l, list *e);
 extern sql_rel *rel_project_exp(sql_allocator *sa, sql_exp *e);
+extern sql_rel *rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r);
 extern sql_rel *rel_exception(sql_allocator *sa, sql_rel *l, sql_rel *r, list 
*exps);
 
 extern sql_rel *rel_relational_func(sql_allocator *sa, sql_rel *l, list *exps);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -81,21 +81,6 @@ rel_alter_table(sql_allocator *sa, int c
        return rel;
 }
 
-sql_rel *
-rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r)
-{
-       sql_rel *rel = rel_create(sa);
-       if (!rel)
-               return NULL;
-       if (!l)
-               return r;
-       rel->l = l;
-       rel->r = r;
-       rel->op = op_ddl;
-       rel->flag = ddl_list;
-       return rel;
-}
-
 static sql_rel *
 view_rename_columns(mvc *sql, const char *name, sql_rel *sq, dlist 
*column_spec)
 {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to