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]