Changeset: da0a600ae9d0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=da0a600ae9d0 Modified Files: sql/backends/monet5/rel_bin.c Branch: in-value-list Log Message:
Factor out a loop. diffs (84 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -279,26 +279,33 @@ value_list(backend *be, list *vals, stmt } static stmt* -distinct_value_list(backend *be, stmt *list) +distinct_value_list(backend *be, list *vals, stmt ** last_null_value) { + node *n; + stmt *s; + + /* create bat append values */ + s = stmt_temp(be, exp_subtype(vals->h->data)); + for( n = vals->h; n; n = n->next) { + sql_exp *e = n->data; + stmt *i = exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL); + + if (exp_is_null(be->mvc, e)) + *last_null_value = i; + + if (!i) + return NULL; + + s = stmt_append(be, s, i); + } + // Probably faster to filter out the values directly in the underlying list of atoms. // But for now use groupby to filter out duplicate values. - stmt* groupby = stmt_group(be, list, NULL, NULL, NULL, 1); + stmt* groupby = stmt_group(be, s, NULL, NULL, NULL, 1); stmt* ext = stmt_result(be, groupby, 1); - return stmt_project(be, ext, list); -} - -static sql_exp* in_value_list_contains_null(mvc* sql, list *vals) { - for(node* n = vals->h; n; n = n->next) { - sql_exp *e = n->data; - - if (exp_is_null(sql, e)) - return e; - } - - return NULL; + return stmt_project(be, ext, s); } static stmt * stmt_selectnonil( backend *be, stmt *col, stmt *s ); @@ -334,17 +341,17 @@ handle_in_exps(backend *be, sql_exp *ce, stmt_const(be, bin_first_column(be, left), s), stmt_bool(be, 1), cmp_equal, sel, 0); } else { - s = value_list(be, nl, NULL, NULL); + stmt* last_null_value = NULL; // CORNER CASE ALERT: See description below. - s = distinct_value_list(be, s); // The actual in-value-list should not contain duplicates to ensure that final join results are unique. + // The actual in-value-list should not contain duplicates to ensure that final join results are unique. + s = distinct_value_list(be, nl, &last_null_value); s = stmt_project(be, stmt_selectnonil(be, s, NULL), s); // The actual in-value-list should not contain null values. s = stmt_join(be, c, s, NULL, in, cmp_equal); s = stmt_result(be, s, 0); if (!in) { - sql_exp* null_value; - if ((null_value = in_value_list_contains_null(be->mvc, nl))) { + if (last_null_value) { // CORNER CASE ALERT: // In case of a not-in-expression with the associated in-value-list containing a null value, // the entire in-predicate is forced to always return false, i.e. an empty candidate list. @@ -354,9 +361,7 @@ handle_in_exps(backend *be, sql_exp *ce, // Ugly trick to return empty candidate list, because for all x it holds that: (x == null) == false. //list* singleton_bat = sa_list(sql->sa); // list_append(singleton_bat, null_value); - stmt* null_value_stmt; - null_value_stmt = exp_bin(be, null_value, left, right, grp, ext, cnt, NULL); - s = stmt_uselect(be, c, null_value_stmt, cmp_equal, NULL, 0); + s = stmt_uselect(be, c, last_null_value, cmp_equal, NULL, 0); return s; } else { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list