Changeset: 7e044dae5c3e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7e044dae5c3e
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
        sql/server/sql_parser.y
Branch: Jun2020
Log Message:

Cleanup and propagate not through comparison symbols


diffs (105 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -67,6 +67,42 @@ swap_compare( comp_type t )
 }
 
 comp_type 
+negate_compare( comp_type t )
+{
+       switch(t) {
+       case cmp_equal:
+               return cmp_notequal;
+       case cmp_notequal:
+               return cmp_equal;
+       case cmp_lt:
+               return cmp_gte;
+       case cmp_lte:
+               return cmp_gt;
+       case cmp_gte:
+               return cmp_lt;
+       case cmp_gt:
+               return cmp_lte;
+
+       case cmp_in:
+               return cmp_notin;
+       case cmp_notin:
+               return cmp_in;
+
+       case mark_in:
+               return mark_notin;
+       case mark_notin:
+               return mark_in;
+       case mark_exists:
+               return mark_notexists;
+       case mark_notexists:
+               return mark_exists;
+
+       default:
+               return t;
+       }
+}
+
+comp_type 
 range2lcompare( int r )
 {
        if (r&1) {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -25,6 +25,7 @@
 
 extern comp_type compare_str2type(const char *compare_op);
 extern comp_type swap_compare( comp_type t );
+extern comp_type negate_compare( comp_type t );
 extern comp_type range2lcompare( int r );
 extern comp_type range2rcompare( int r );
 extern int compare2range( int l, int r );
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
@@ -2243,6 +2243,14 @@ rel_in_exp(sql_query *query, sql_rel *re
        case SQL_NOT: /* nested NOTs eliminate each other */ \
                sc->data.sym = sc->data.sym->data.sym; \
                return NEXT_CALL; \
+       case SQL_COMPARE: { \
+               dnode *cmp_n = sc->data.sym->data.lval->h; \
+               comp_type neg_cmp_type = 
negate_compare(compare_str2type(cmp_n->next->data.sval)); /* negate the 
comparator */ \
+               cmp_n->next->data.sval = sa_strdup(sql->sa, 
compare_func(neg_cmp_type, 0)); \
+               if (cmp_n->next->next->next) /* negating ANY/ALL */ \
+                       cmp_n->next->next->next->data.i_val = 
cmp_n->next->next->next->data.i_val == 0 ? 1 : 0; \
+               return NEXT_CALL; \
+       } \
        default: \
                break; \
        } 
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
@@ -3622,24 +3622,8 @@ predicate:
  ;
 
 pred_exp:
-    NOT pred_exp 
-               { $$ = $2;
-
-                 if ($$->token == SQL_EXISTS)
-                       $$->token = SQL_NOT_EXISTS;
-                 else if ($$->token == SQL_NOT_EXISTS)
-                       $$->token = SQL_EXISTS;
-                 else if ($$->token == SQL_NOT_BETWEEN)
-                       $$->token = SQL_BETWEEN;
-                 else if ($$->token == SQL_BETWEEN)
-                       $$->token = SQL_NOT_BETWEEN;
-                 else if ($$->token == SQL_NOT_LIKE)
-                       $$->token = SQL_LIKE;
-                 else if ($$->token == SQL_LIKE)
-                       $$->token = SQL_NOT_LIKE;
-                 else
-                       $$ = _symbol_create_symbol(SQL_NOT, $2); }
- |   predicate { $$ = $1; }
+    NOT pred_exp { $$ = _symbol_create_symbol(SQL_NOT, $2); }
+ |  predicate   { $$ = $1; }
  ;
 
 comparison_predicate:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to