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