Changeset: a48f714e5586 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a48f714e5586
Modified Files:
        sql/server/rel_select.c
        sql/test/miscellaneous/Tests/groupby_error.sql
        sql/test/miscellaneous/Tests/groupby_error.stable.out
Branch: Jun2020
Log Message:

Fixed sqlite query optimizing early on nested not symbols in the parser


diffs (138 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
@@ -2464,6 +2464,42 @@ rel_logical_value_exp(sql_query *query, 
                return le;
        }
        case SQL_NOT: {
+               switch (sc->data.sym->token) {
+               case SQL_IN:
+                       sc->data.sym->token = SQL_NOT_IN;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_NOT_IN:
+                       sc->data.sym->token = SQL_IN;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_EXISTS:
+                       sc->data.sym->token = SQL_NOT_EXISTS;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_NOT_EXISTS:
+                       sc->data.sym->token = SQL_EXISTS;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_LIKE:
+                       sc->data.sym->token = SQL_NOT_LIKE;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_NOT_LIKE:
+                       sc->data.sym->token = SQL_LIKE;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_BETWEEN:
+                       sc->data.sym->token = SQL_NOT_BETWEEN;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_NOT_BETWEEN:
+                       sc->data.sym->token = SQL_BETWEEN;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_IS_NULL:
+                       sc->data.sym->token = SQL_IS_NOT_NULL;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_IS_NOT_NULL:
+                       sc->data.sym->token = SQL_IS_NULL;
+                       return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
+               case SQL_NOT: /* nested NOTs eliminate each other */
+                       return rel_logical_value_exp(query, rel, 
sc->data.sym->data.sym, f, ek);
+               default:
+                       break;
+               } 
                sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
 
                if (!le)
@@ -2784,6 +2820,32 @@ rel_logical_exp(sql_query *query, sql_re
                case SQL_NOT_IN:
                        sc->data.sym->token = SQL_IN;
                        return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_EXISTS:
+                       sc->data.sym->token = SQL_NOT_EXISTS;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_NOT_EXISTS:
+                       sc->data.sym->token = SQL_EXISTS;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_LIKE:
+                       sc->data.sym->token = SQL_NOT_LIKE;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_NOT_LIKE:
+                       sc->data.sym->token = SQL_LIKE;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_BETWEEN:
+                       sc->data.sym->token = SQL_NOT_BETWEEN;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_NOT_BETWEEN:
+                       sc->data.sym->token = SQL_BETWEEN;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_IS_NULL:
+                       sc->data.sym->token = SQL_IS_NOT_NULL;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_IS_NOT_NULL:
+                       sc->data.sym->token = SQL_IS_NULL;
+                       return rel_logical_exp(query, rel, sc->data.sym, f);
+               case SQL_NOT: /* nested NOTs eliminate each other */
+                       return rel_logical_exp(query, rel, 
sc->data.sym->data.sym, f);
                default:
                        break;
                } 
diff --git a/sql/test/miscellaneous/Tests/groupby_error.sql 
b/sql/test/miscellaneous/Tests/groupby_error.sql
--- a/sql/test/miscellaneous/Tests/groupby_error.sql
+++ b/sql/test/miscellaneous/Tests/groupby_error.sql
@@ -35,9 +35,19 @@ SELECT col0 FROM tab2 WHERE - - col2;
 SELECT 1 FROM tab0 WHERE NOT (NOT NULL IN (1));
        --empty
 
+SELECT NOT (NOT NULL IN (1)) FROM tab0;
+       -- NULL
+       -- NULL
+       -- NULL
+
 SELECT - col0 + + CAST ( NULL AS INTEGER ) AS col2 FROM tab0 AS cor0 WHERE NOT 
( NOT + - CAST ( NULL AS INTEGER ) NOT IN ( col0 / CAST ( col2 AS INTEGER ) - + 
col1 ) );
        --empty
 
+SELECT NOT ( NOT + - CAST ( NULL AS INTEGER ) NOT IN ( col0 / CAST ( col2 AS 
INTEGER ) - + col1 ) ) FROM tab0 AS cor0;
+       -- NULL
+       -- NULL
+       -- NULL
+
 PLAN SELECT DISTINCT col0, col1, col2, col0 FROM tab0;
 
 SELECT DISTINCT col0, col1, col2, col0 FROM tab0;
diff --git a/sql/test/miscellaneous/Tests/groupby_error.stable.out 
b/sql/test/miscellaneous/Tests/groupby_error.stable.out
--- a/sql/test/miscellaneous/Tests/groupby_error.stable.out
+++ b/sql/test/miscellaneous/Tests/groupby_error.stable.out
@@ -132,6 +132,32 @@ stdout of test 'groupby_error` in direct
 [ 64   ]
 [ 75   ]
 [ 46   ]
+#SELECT 1 FROM tab0 WHERE NOT (NOT NULL IN (1));
+% . # table_name
+% single_value # name
+% tinyint # type
+% 1 # length
+#SELECT NOT (NOT NULL IN (1)) FROM tab0;
+% . # table_name
+% %3 # name
+% boolean # type
+% 5 # length
+[ NULL ]
+[ NULL ]
+[ NULL ]
+#SELECT - col0 + + CAST ( NULL AS INTEGER ) AS col2 FROM tab0 AS cor0 WHERE 
NOT ( NOT + - CAST ( NULL AS INTEGER ) NOT IN ( col0 / CAST ( col2 AS INTEGER ) 
- + col1 ) );
+% . # table_name
+% col2 # name
+% bigint # type
+% 1 # length
+#SELECT NOT ( NOT + - CAST ( NULL AS INTEGER ) NOT IN ( col0 / CAST ( col2 AS 
INTEGER ) - + col1 ) ) FROM tab0 AS cor0;
+% . # table_name
+% %3 # name
+% boolean # type
+% 5 # length
+[ NULL ]
+[ NULL ]
+[ NULL ]
 #PLAN SELECT DISTINCT col0, col1, col2, col0 FROM tab0;
 % .plan # table_name
 % rel # name
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to