Changeset: a24a58b8ca90 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a24a58b8ca90 Modified Files: sql/server/rel_select.c sql/server/sql_parser.y Branch: distinct_from Log Message:
allow IS NOT DISTINCT FROM in a join condition diffs (113 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1730,7 +1730,7 @@ rel_select_push_compare_exp_down(mvc *sq } static sql_rel * -rel_compare_exp_(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2, int type, int anti, int quantifier, int f, int symmetric) +rel_compare_exp_(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2, int type, int anti, int quantifier, int f, int symmetric, int is_semantics) { mvc *sql = query->sql; sql_exp *e = NULL; @@ -1758,6 +1758,7 @@ rel_compare_exp_(sql_query *query, sql_r if (rel_convert_types(sql, rel, rel, &ls, &rs, 1, type_equal_no_any) < 0) return NULL; e = exp_compare(sql->sa, ls, rs, type); + if (is_semantics) set_semantics(e); } else { assert(rs2); if (rel_convert_types(sql, rel, rel, &ls, &rs, 1, type_equal_no_any) < 0) @@ -1783,7 +1784,7 @@ rel_compare_exp_(sql_query *query, sql_r } static sql_rel * -rel_compare_exp(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, char *compare_op, int reduce, int quantifier, int need_not, int f) +rel_compare_exp(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, char *compare_op, int reduce, int quantifier, int need_not, int f, int is_semantics) { mvc *sql = query->sql; comp_type type = cmp_equal; @@ -1816,11 +1817,11 @@ rel_compare_exp(sql_query *query, sql_re } type = compare_str2type(compare_op); assert(type != cmp_filter); - return rel_compare_exp_(query, rel, ls, rs, NULL, type, need_not, quantifier, f, 0); + return rel_compare_exp_(query, rel, ls, rs, NULL, type, need_not, quantifier, f, 0, is_semantics); } static sql_rel * -rel_compare(sql_query *query, sql_rel *rel, symbol *sc, symbol *lo, symbol *ro, char *compare_op, int f, exp_kind k, int quantifier) +rel_compare(sql_query *query, sql_rel *rel, symbol *sc, symbol *lo, symbol *ro, char *compare_op, int f, exp_kind k, int quantifier, int is_semantics) { mvc *sql = query->sql; sql_exp *rs = NULL, *ls; @@ -1884,7 +1885,7 @@ rel_compare(sql_query *query, sql_rel *r return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", exp_relname(rs), exp_name(rs)); return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results without an aggregate function"); } - return rel_compare_exp(query, rel, ls, rs, compare_op, k.reduce, quantifier, need_not, f); + return rel_compare_exp(query, rel, ls, rs, compare_op, k.reduce, quantifier, need_not, f, is_semantics); } static sql_exp* @@ -2703,11 +2704,19 @@ rel_logical_exp(sql_query *query, sql_re symbol *ro = n->next->next->data.sym; char *compare_op = n->next->data.sval; int quantifier = 0; + int is_semantics = 0; if (n->next->next->next) quantifier = n->next->next->next->data.i_val + 1; - assert(quantifier == 0 || quantifier == 1 || quantifier == 2); - return rel_compare(query, rel, sc, lo, ro, compare_op, f, ek, quantifier); + assert(quantifier == 0 || quantifier == 1 || quantifier == 2 || quantifier == 3 || quantifier == 4); + + if (quantifier >= 3) { + quantifier = 0; + is_semantics = 1; + } + + /* [NOT] DISTINCT FROM */ + return rel_compare(query, rel, sc, lo, ro, compare_op, f, ek, quantifier, is_semantics); } /* Set Member ship */ case SQL_IN: @@ -2777,7 +2786,7 @@ rel_logical_exp(sql_query *query, sql_re (re2 = exp_check_type(sql, &super, rel, re2, type_equal)) == NULL) return NULL; - return rel_compare_exp_(query, rel, le, re1, re2, 3, sc->token == SQL_NOT_BETWEEN ? 1 : 0, 0, f, symmetric); + return rel_compare_exp_(query, rel, le, re1, re2, 3, sc->token == SQL_NOT_BETWEEN ? 1 : 0, 0, f, symmetric, 0); } case SQL_IS_NULL: case SQL_IS_NOT_NULL: @@ -5457,7 +5466,7 @@ join_on_column_name(sql_query *query, sq return sql_error(sql, ERR_AMBIGUOUS, SQLSTATE(42000) "NATURAL JOIN: common column name '%s' appears more than once in left table", rname); found = 1; - if (!(rel = rel_compare_exp(query, rel, le, re, "=", TRUE, 0, 0, 0))) + if (!(rel = rel_compare_exp(query, rel, le, re, "=", TRUE, 0, 0, 0, 0))) return NULL; if (full) { sql_exp *cond = rel_unop_(sql, rel, le, "sys", "isnull", card_value); @@ -5872,7 +5881,7 @@ rel_joinquery_(sql_query *query, symbol return NULL; if (!ls || !rs) return sql_error(sql, 02, SQLSTATE(42000) "JOIN: tables '%s' and '%s' do not have a matching column '%s'", rel_name(t1)?rel_name(t1):"", rel_name(t2)?rel_name(t2):"", nm); - if (!(rel = rel_compare_exp(query, rel, ls, rs, "=", TRUE, 0, 0, 0))) + if (!(rel = rel_compare_exp(query, rel, ls, rs, "=", TRUE, 0, 0, 0, 0))) return NULL; if (op != op_join) { if (!(cond = rel_unop_(sql, rel, ls, "sys", "isnull", card_value))) diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -3919,7 +3919,7 @@ comparison_predicate: | pred_exp IS DISTINCT FROM pred_exp { dlist *l = L(); append_symbol(l, $1); - append_string(l, sa_strdup(SA, "=")); + append_string(l, sa_strdup(SA, "<>")); append_symbol(l, $5); append_int(l, 3); $$ = _symbol_create_list(SQL_COMPARE, l ); } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org