AnyhowStep / sql-compiler

An experimental SQL compiler
MIT License
0 stars 0 forks source link

Bug in Bison? INTERVAL does not have higher priority than IS NULL #30

Open AnyhowStep opened 3 years ago

AnyhowStep commented 3 years ago

https://www.db-fiddle.com/f/gY7xnf8emdtnkg2zZ83ERA/0

SELECT
-- Documentation says INTERVAL has highest priority...
-- It does not.
-- sql_yacc.yy seems to also want INTERVAL to have highest priority...
-- Left to conclude bison is broken
-- https://github.com/mysql/mysql-server/blob/5c8c085ba96d30d697d0baa54d67b102c232116b/sql/sql_yacc.yy#L9582
-- https://github.com/mysql/mysql-server/blob/5c8c085ba96d30d697d0baa54d67b102c232116b/sql/sql_yacc.yy#L9300
-- https://github.com/mysql/mysql-server/blob/5c8c085ba96d30d697d0baa54d67b102c232116b/sql/sql_yacc.yy#L1169
    INTERVAL 0 DAY + NULL IS NULL,
    (INTERVAL 0 DAY + NULL) IS NULL,
    INTERVAL 0 DAY + (NULL IS NULL);
INTERVAL 0 DAY + NULL IS NULL (INTERVAL 0 DAY + NULL) IS NULL INTERVAL 0 DAY + (NULL IS NULL)
null 1 null
AnyhowStep commented 3 years ago

I'm so sick of these bugs and inconsistencies -___-

AnyhowStep commented 3 years ago
/**
 * See https://github.com/AnyhowStep/sql-compiler/issues/30
 * In general, INTERVAL is supposed has the highest precedence...
 * According to the documentation, https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html
 *
 * However, there are cases where that is not true.
 * For some reason IS NULL > INTERVAL
 *
 * Unsure if COLLATE > INTERVAL or COLLATE < INTERVAL.
 * Going to assume COLLATE > INTERVAL.
 *
 * + INTERVAL > AND
 * + INTERVAL > XOR
 * + INTERVAL > OR
 * + ^ > INTERVAL
 * + * > INTERVAL
 * + + > INTERVAL
 * + << > INTERVAL
 * + & > INTERVAL
 * + | > INTERVAL
 * + = > INTERVAL
 * + IS NULL > INTERVAL
 * + IS UNKNOWN > INTERVAL
 * + LIKE > INTERVAL
 * + REGEXP > INTERVAL
 * + IN(,) > INTERVAL
 * + IN(SELECT) > INTERVAL
 * + BETWEEN > INTERVAL
 */
AnyhowStep commented 3 years ago

The "real" precedence of INTERVAL+ is somewhere between AND/NOT and BETWEEN

AnyhowStep commented 3 years ago

So, it turns out that I just don't know how Bison works...

And neither do MySQL devs?

https://lists.gnu.org/archive/html/help-bison/2021-06/msg00003.html