Changeset: 601237f8fd11 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=601237f8fd11 Modified Files: sql/server/rel_propagate.c sql/test/merge-partitions/Tests/mergepart06.stable.out Branch: merge-partitions Log Message:
Generate an exp_or instead of a whole new relation, so NULL values are inserted in order. diffs (97 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 @@ -239,36 +239,26 @@ rel_generate_subinserts(mvc *sql, sql_re le = exp_column(sql->sa, exp_relname(le), exp_name(le), exp_subtype(le), le->card, has_nil(le), is_intern(le)); if(isRangePartitionTable(t)) { - sql_exp *e1, *e2; - + sql_exp *e1, *e2, *range; e1 = create_table_part_atom_exp(sql, pt->tpe, pt->part.range.minvalue); e2 = create_table_part_atom_exp(sql, pt->tpe, pt->part.range.maxvalue); - dup = rel_compare_exp_(sql, dup, le, e1, e2, 3, 0); + range = exp_compare2(sql->sa, le, e1, e2, 3); if(accum) { - sql_exp *nr = exp_compare2(sql->sa, anti_le, exp_copy(sql->sa, e1), exp_copy(sql->sa, e2), 3); - accum = exp_or(sql->sa, list_append(new_exp_list(sql->sa), accum), - list_append(new_exp_list(sql->sa), nr), 1); + accum = exp_or(sql->sa, list_append(new_exp_list(sql->sa), exp_copy(sql->sa, range)), + list_append(new_exp_list(sql->sa), accum), 1); } else { - accum = exp_compare2(sql->sa, anti_le, exp_copy(sql->sa, e1), exp_copy(sql->sa, e2), 3); + accum = exp_copy(sql->sa, range); } if(pt->with_nills) { /* handle the nulls case */ - sql_rel *extra; - sql_exp *nils = rel_unop_(sql, le, NULL, "isnull", card_value), - *anti_nils = rel_unop_(sql, anti_le, NULL, "isnull", card_value); + sql_exp *nils = rel_unop_(sql, le, NULL, "isnull", card_value); nils = exp_compare(sql->sa, nils, exp_atom_bool(sql->sa, 1), cmp_equal); - - if(accum) { - sql_exp *nr = exp_compare(sql->sa, anti_nils, exp_atom_bool(sql->sa, 1), cmp_notequal); - accum = exp_or(sql->sa, list_append(new_exp_list(sql->sa), accum), - list_append(new_exp_list(sql->sa), nr), 1); - } else { - accum = exp_compare(sql->sa, anti_nils, exp_atom_bool(sql->sa, 1), cmp_notequal); - } - extra = rel_select(sql->sa, rel->r, nils); - dup = rel_or(sql, NULL, dup, extra, NULL, NULL, NULL); + range = exp_or(sql->sa, list_append(new_exp_list(sql->sa), range), + list_append(new_exp_list(sql->sa), nils), 0); + found_nils = 1; } + dup = rel_select(sql->sa, dup, range); } else if(isListPartitionTable(t)) { sql_exp *ein; list *exps = new_exp_list(sql->sa); @@ -314,15 +304,15 @@ rel_generate_subinserts(mvc *sql, sql_re anti_exp = accum; } else if(isListPartitionTable(t)) { anti_exp = exp_in(sql->sa, anti_le, anti_exps, cmp_notin); - if(!found_nils) { - sql_exp *anti_nils = rel_unop_(sql, anti_le, NULL, "isnull", card_value); - anti_nils = exp_compare(sql->sa, anti_nils, exp_atom_bool(sql->sa, 1), cmp_equal); - anti_exp = exp_or(sql->sa, list_append(new_exp_list(sql->sa), anti_exp), - list_append(new_exp_list(sql->sa), anti_nils), 0); - } } else { assert(0); } + if(!found_nils) { + sql_exp *anti_nils = rel_unop_(sql, anti_le, NULL, "isnull", card_value); + anti_nils = exp_compare(sql->sa, anti_nils, exp_atom_bool(sql->sa, 1), cmp_equal); + anti_exp = exp_or(sql->sa, list_append(new_exp_list(sql->sa), anti_exp), + list_append(new_exp_list(sql->sa), anti_nils), 0); + } //generate a count aggregation for the values not present in any of the partitions *anti_rel = rel_select(sql->sa, *anti_rel, anti_exp); *anti_rel = rel_groupby(sql, *anti_rel, NULL); diff --git a/sql/test/merge-partitions/Tests/mergepart06.stable.out b/sql/test/merge-partitions/Tests/mergepart06.stable.out --- a/sql/test/merge-partitions/Tests/mergepart06.stable.out +++ b/sql/test/merge-partitions/Tests/mergepart06.stable.out @@ -104,9 +104,9 @@ Ready. [ 102, "successful" ] [ 401, "c" ] [ 401, "another" ] +[ NULL, "test" ] [ 450, "to" ] [ 500, "pass" ] -[ NULL, "test" ] [ NULL, "attempt" ] #SELECT a,b FROM sublimits1; % sys.sublimits1, sys.sublimits1 # table_name @@ -132,9 +132,9 @@ Ready. % 3, 7 # length [ 401, "c" ] [ 401, "another" ] +[ NULL, "test" ] [ 450, "to" ] [ 500, "pass" ] -[ NULL, "test" ] [ NULL, "attempt" ] #ALTER TABLE testrangelimits DROP TABLE sublimits1; #ALTER TABLE testrangelimits DROP TABLE sublimits2; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list