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

Reply via email to