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

Reply via email to