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