Changeset: b18f217ca6c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b18f217ca6c1
Modified Files:
        sql/backends/monet5/sql_statement.c
        sql/server/rel_select.c
        
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
        sql/test/miscellaneous/Tests/anti_join_plan.test
Branch: default
Log Message:

use new thetaselect for 'is distinct from'
Simply use is-semantics


diffs (191 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1728,64 +1728,49 @@ stmt_uselect(backend *be, stmt *op1, stm
                k = getDestVar(q);
        } else {
                assert (cmptype != cmp_filter);
-               if (is_semantics) {
-                       assert(cmptype == cmp_equal || cmptype == cmp_notequal);
-                       if (cmptype == cmp_notequal)
-                               anti = !anti;
-                       q = newStmtArgs(mb, algebraRef, selectRef, 9);
-                       if (q == NULL)
-                               goto bailout;
-                       q = pushArgument(mb, q, l);
-                       if (sub && !op1->cand) {
-                               q = pushArgument(mb, q, sub->nr);
-                       } else {
-                               assert(!sub || op1->cand == sub);
-                               sub = NULL;
-                       }
-                       q = pushArgument(mb, q, r);
-                       q = pushArgument(mb, q, r);
-                       q = pushBit(mb, q, TRUE);
-                       q = pushBit(mb, q, TRUE);
-                       q = pushBit(mb, q, anti);
+               q = newStmt(mb, algebraRef, thetaselectRef);
+               if (q == NULL)
+                       goto bailout;
+               q = pushArgument(mb, q, l);
+               if (sub && !op1->cand) {
+                       q = pushArgument(mb, q, sub->nr);
                } else {
-                       q = newStmt(mb, algebraRef, thetaselectRef);
-                       if (q == NULL)
-                               goto bailout;
-                       q = pushArgument(mb, q, l);
-                       if (sub && !op1->cand) {
-                               q = pushArgument(mb, q, sub->nr);
-                       } else {
-                               assert(!sub || op1->cand == sub);
-                               q = pushNilBat(mb, q);
-                               sub = NULL;
-                       }
-                       q = pushArgument(mb, q, r);
-                       switch (cmptype) {
-                       case cmp_equal:
+                       assert(!sub || op1->cand == sub);
+                       q = pushNilBat(mb, q);
+                       sub = NULL;
+               }
+               q = pushArgument(mb, q, r);
+               switch (cmptype) {
+               case cmp_equal:
+                       if (is_semantics)
+                               q = pushStr(mb, q, anti?"ne":"eq");
+                       else
                                q = pushStr(mb, q, anti?"!=":"==");
-                               break;
-                       case cmp_notequal:
+                       break;
+               case cmp_notequal:
+                       if (is_semantics)
+                               q = pushStr(mb, q, anti?"eq":"ne");
+                       else
                                q = pushStr(mb, q, anti?"==":"!=");
-                               break;
-                       case cmp_lt:
-                               q = pushStr(mb, q, anti?">=":"<");
-                               break;
-                       case cmp_lte:
-                               q = pushStr(mb, q, anti?">":"<=");
-                               break;
-                       case cmp_gt:
-                               q = pushStr(mb, q, anti?"<=":">");
-                               break;
-                       case cmp_gte:
-                               q = pushStr(mb, q, anti?"<":">=");
-                               break;
-                       default:
-                               TRC_ERROR(SQL_EXECUTION, "Impossible select 
compare\n");
-                               if (q)
-                                       freeInstruction(q);
-                               q = NULL;
-                               goto bailout;
-                       }
+                       break;
+               case cmp_lt:
+                       q = pushStr(mb, q, anti?">=":"<");
+                       break;
+               case cmp_lte:
+                       q = pushStr(mb, q, anti?">":"<=");
+                       break;
+               case cmp_gt:
+                       q = pushStr(mb, q, anti?"<=":">");
+                       break;
+               case cmp_gte:
+                       q = pushStr(mb, q, anti?"<":">=");
+                       break;
+               default:
+                       TRC_ERROR(SQL_EXECUTION, "Impossible select compare\n");
+                       if (q)
+                               freeInstruction(q);
+                       q = NULL;
+                       goto bailout;
                }
        }
 
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
@@ -2835,51 +2835,17 @@ rel_logical_exp(sql_query *query, sql_re
                char *compare_op = n->next->data.sval;
                int quantifier = 0;
                int is_semantics = 0;
-               bool is_distinct_from = false;
 
                if (n->next->next->next)
                        quantifier = n->next->next->next->data.i_val + 1;
                assert(quantifier == 0 || quantifier == 1 || quantifier == 2 || 
quantifier == 3 || quantifier == 4);
 
                if (quantifier >= 3) {
-                       if (quantifier == 4) {
-                               is_distinct_from = true;
+                       if (quantifier == 4)
                                compare_op = "<>";
-                       }
                        quantifier = 0;
                        is_semantics = 1;
                }
-               if (is_distinct_from) {
-                       sql_exp* ls = rel_value_exp(query, &rel, lo, 
f|sql_farg, ek);
-                       if (!ls)
-                               return NULL;
-                       sql_exp* rs = rel_value_exp(query, &rel, ro, 
f|sql_farg, ek);
-                       if (!rs)
-                               return NULL;
-
-                       bool ls_is_non_null_atom = exp_is_atom(ls) && 
exp_is_not_null(ls);
-                       bool rs_is_non_null_atom = exp_is_atom(rs) && 
exp_is_not_null(rs);
-
-                       if (ls_is_non_null_atom || rs_is_non_null_atom) {
-                               sql_rel *r = rel_dup(rel);
-                               sql_rel* l = rel_compare(query, rel, sc, lo, 
ro, compare_op, f | sql_or, ek, quantifier, 0);
-                               if (!l)
-                                       return NULL;
-                               sql_subtype *t;
-                               if (!(t = 
exp_subtype(rs_is_non_null_atom?ls:rs)))
-                                       return sql_error(sql, 01, 
SQLSTATE(42000) "Cannot have a parameter for IS NULL operator");
-                               sql_exp* e = exp_compare(sql->sa, 
rs_is_non_null_atom?ls:rs, exp_atom(sql->sa, atom_general(sql->sa, t, NULL, 
0)), cmp_equal);
-                               set_has_no_nil(e);
-                               set_semantics(e);
-
-                               r = rel_select_push_compare_exp_down(sql, r, e, 
e->l, e->r, NULL, f | sql_or);
-                               if (!r)
-                                       return NULL;
-                               return rel_or(sql, rel, l, r, NULL, NULL, NULL);
-                       }
-               }
-
-               /* [NOT] DISTINCT FROM */
                return rel_compare(query, rel, sc, lo, ro, compare_op, f, ek, 
quantifier, is_semantics);
        }
        /* Set Member ship */
diff --git 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
--- 
a/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
+++ 
b/sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.test
@@ -85,7 +85,7 @@ 46
 query I rowsort
 select count(*) from sys.tracelog() where stmt like '%algebra.thetaselect%'
 ----
-47
+48
 
 query I rowsort
 select count(*) from sys.tracelog() where stmt like '%bat.replace%'
diff --git a/sql/test/miscellaneous/Tests/anti_join_plan.test 
b/sql/test/miscellaneous/Tests/anti_join_plan.test
--- a/sql/test/miscellaneous/Tests/anti_join_plan.test
+++ b/sql/test/miscellaneous/Tests/anti_join_plan.test
@@ -27,10 +27,8 @@ algebra.projection
 9
 algebra.projectionpath
 3
-algebra.select
-1
 algebra.thetaselect
-2
+3
 bat.mirror
 1
 bat.pack
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to