Am I misunderstanding precedence?
Justin Ng <[email protected]> Mon, 14 Jun 2021 05:02:48 +0000
| Newsgroups | gmane.comp.parsers.bison.general |
|---|---|
| Message-ID | <DM6PR06MB65707487472662091AF6D174CF319@DM6PR06MB6570.namprd06.prod.outlook.com> |
I've encountered something which confuses me, but I'm not sure if it's a bug or just something I don't understand.
I'm looking at this file,
https://github.com/mysql/mysql-server/blob/5c8c085ba96d30d697d0baa54d67b102c232116b/sql/sql_yacc.yy#L1169
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#L9582
Of note are,
```
%left EQ EQUAL_SYM GE GT_SYM LE LT NE IS LIKE REGEXP IN_SYM
...
%left INTERVAL_SYM
...
bool_pri:
bool_pri IS NULL_SYM %prec IS
...
simple_expr:
| INTERVAL_SYM expr interval '+' expr %prec INTERVAL_SYM
```
From the above snippet, it looks like the intention is for the `INTERVAL_SYM` rule to have a higher precedence than the `IS NULL` rule.
Given the input string `INTERVAL 0 DAY + NULL IS NULL`, there are two valid parse trees, ignoring precedence,
+ (INTERVAL 0 DAY + NULL) IS NULL
+ INTERVAL 0 DAY + (NULL IS NULL)
If we include precedence, it seems we would want,
+ (INTERVAL 0 DAY + NULL) IS NULL
The MySQL documentation seems to agree,
https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html
It shows that INTERVAL should have a higher precedence than IS.
However, when I actually run this input against MySQL,
```
SELECT
INTERVAL 0 DAY + NULL IS NULL,
(INTERVAL 0 DAY + NULL) IS NULL,
INTERVAL 0 DAY + (NULL IS NULL)
```
https://www.db-fiddle.com/f/cMPJfx5kZKoMeX4PKDrTWC/0
I find that IS NULL has higher precedence. Which is unexpected.
Is this a bug with bison? Or am I misunderstanding something?
I'm not sure what specific version of bison is being used but I found it should be 2.1+
https://dev.mysql.com/doc/refman/5.7/en/source-installation-prerequisites.html