drop table if exists t1_30237_bool;
create table t1_30237_bool(A boolean, B boolean, C boolean);
insert into t1_30237_bool values
(FALSE, FALSE, FALSE),
(FALSE, FALSE, NULL),
(FALSE, FALSE, TRUE),
(FALSE, NULL, FALSE),
(FALSE, NULL, NULL),
(FALSE, NULL, TRUE),
(FALSE, TRUE, FALSE),
(FALSE, TRUE, NULL),
(FALSE, TRUE, TRUE),
(NULL, FALSE, FALSE),
(NULL, FALSE, NULL),
(NULL, FALSE, TRUE),
(NULL, NULL, FALSE),
(NULL, NULL, NULL),
(NULL, NULL, TRUE),
(NULL, TRUE, FALSE),
(NULL, TRUE, NULL),
(NULL, TRUE, TRUE),
(TRUE, FALSE, FALSE),
(TRUE, FALSE, NULL),
(TRUE, FALSE, TRUE),
(TRUE, NULL, FALSE),
(TRUE, NULL, NULL),
(TRUE, NULL, TRUE),
(TRUE, TRUE, FALSE),
(TRUE, TRUE, NULL),
(TRUE, TRUE, TRUE) ;
Testing OR, XOR, AND
select A, B, A OR B, A XOR B, A AND B
from t1_30237_bool where C is null order by A, B;
A	B	A OR B	A XOR B	A AND B
NULL	NULL	NULL	NULL	NULL
NULL	0	NULL	NULL	0
NULL	1	1	NULL	NULL
0	NULL	NULL	NULL	0
0	0	0	0	0
0	1	1	1	0
1	NULL	1	NULL	NULL
1	0	1	1	0
1	1	1	0	1
Testing that OR is associative 
select A, B, C, (A OR B) OR C, A OR (B OR C), A OR B OR C
from t1_30237_bool order by A, B, C;
A	B	C	(A OR B) OR C	A OR (B OR C)	A OR B OR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	1	1	1
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	NULL	NULL	NULL
NULL	0	1	1	1	1
NULL	1	NULL	1	1	1
NULL	1	0	1	1	1
NULL	1	1	1	1	1
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	NULL	NULL	NULL
0	NULL	1	1	1	1
0	0	NULL	NULL	NULL	NULL
0	0	0	0	0	0
0	0	1	1	1	1
0	1	NULL	1	1	1
0	1	0	1	1	1
0	1	1	1	1	1
1	NULL	NULL	1	1	1
1	NULL	0	1	1	1
1	NULL	1	1	1	1
1	0	NULL	1	1	1
1	0	0	1	1	1
1	0	1	1	1	1
1	1	NULL	1	1	1
1	1	0	1	1	1
1	1	1	1	1	1
select count(*) from t1_30237_bool
where ((A OR B) OR C) != (A OR (B OR C));
count(*)
0
Testing that XOR is associative 
select A, B, C, (A XOR B) XOR C, A XOR (B XOR C), A XOR B XOR C
from t1_30237_bool order by A, B, C;
A	B	C	(A XOR B) XOR C	A XOR (B XOR C)	A XOR B XOR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	NULL	NULL	NULL
NULL	0	1	NULL	NULL	NULL
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	NULL	NULL	NULL
NULL	1	1	NULL	NULL	NULL
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	NULL	NULL	NULL
0	NULL	1	NULL	NULL	NULL
0	0	NULL	NULL	NULL	NULL
0	0	0	0	0	0
0	0	1	1	1	1
0	1	NULL	NULL	NULL	NULL
0	1	0	1	1	1
0	1	1	0	0	0
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	NULL	NULL	NULL
1	NULL	1	NULL	NULL	NULL
1	0	NULL	NULL	NULL	NULL
1	0	0	1	1	1
1	0	1	0	0	0
1	1	NULL	NULL	NULL	NULL
1	1	0	0	0	0
1	1	1	1	1	1
select count(*) from t1_30237_bool
where ((A XOR B) XOR C) != (A XOR (B XOR C));
count(*)
0
Testing that AND is associative 
select A, B, C, (A AND B) AND C, A AND (B AND C), A AND B AND C
from t1_30237_bool order by A, B, C;
A	B	C	(A AND B) AND C	A AND (B AND C)	A AND B AND C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	0	0	0
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	0	0	0
NULL	0	0	0	0	0
NULL	0	1	0	0	0
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	0	0	0
NULL	1	1	NULL	NULL	NULL
0	NULL	NULL	0	0	0
0	NULL	0	0	0	0
0	NULL	1	0	0	0
0	0	NULL	0	0	0
0	0	0	0	0	0
0	0	1	0	0	0
0	1	NULL	0	0	0
0	1	0	0	0	0
0	1	1	0	0	0
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	0	0	0
1	NULL	1	NULL	NULL	NULL
1	0	NULL	0	0	0
1	0	0	0	0	0
1	0	1	0	0	0
1	1	NULL	NULL	NULL	NULL
1	1	0	0	0	0
1	1	1	1	1	1
select count(*) from t1_30237_bool
where ((A AND B) AND C) != (A AND (B AND C));
count(*)
0
Testing that AND has precedence over OR
select A, B, C, (A OR B) AND C, A OR (B AND C), A OR B AND C
from t1_30237_bool order by A, B, C;
A	B	C	(A OR B) AND C	A OR (B AND C)	A OR B AND C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	0	NULL	NULL
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	0	NULL	NULL
NULL	0	1	NULL	NULL	NULL
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	0	NULL	NULL
NULL	1	1	1	1	1
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	0	0	0
0	NULL	1	NULL	NULL	NULL
0	0	NULL	0	0	0
0	0	0	0	0	0
0	0	1	0	0	0
0	1	NULL	NULL	NULL	NULL
0	1	0	0	0	0
0	1	1	1	1	1
1	NULL	NULL	NULL	1	1
1	NULL	0	0	1	1
1	NULL	1	1	1	1
1	0	NULL	NULL	1	1
1	0	0	0	1	1
1	0	1	1	1	1
1	1	NULL	NULL	1	1
1	1	0	0	1	1
1	1	1	1	1	1
select count(*) from t1_30237_bool
where (A OR (B AND C)) != (A OR B AND C);
count(*)
0
select A, B, C, (A AND B) OR C, A AND (B OR C), A AND B OR C
from t1_30237_bool order by A, B, C;
A	B	C	(A AND B) OR C	A AND (B OR C)	A AND B OR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	1	NULL	1
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	0	0	0
NULL	0	1	1	NULL	1
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	NULL	NULL	NULL
NULL	1	1	1	NULL	1
0	NULL	NULL	NULL	0	NULL
0	NULL	0	0	0	0
0	NULL	1	1	0	1
0	0	NULL	NULL	0	NULL
0	0	0	0	0	0
0	0	1	1	0	1
0	1	NULL	NULL	0	NULL
0	1	0	0	0	0
0	1	1	1	0	1
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	NULL	NULL	NULL
1	NULL	1	1	1	1
1	0	NULL	NULL	NULL	NULL
1	0	0	0	0	0
1	0	1	1	1	1
1	1	NULL	1	1	1
1	1	0	1	1	1
1	1	1	1	1	1
select count(*) from t1_30237_bool
where ((A AND B) OR C) != (A AND B OR C);
count(*)
0
Testing that AND has precedence over XOR
select A, B, C, (A XOR B) AND C, A XOR (B AND C), A XOR B AND C
from t1_30237_bool order by A, B, C;
A	B	C	(A XOR B) AND C	A XOR (B AND C)	A XOR B AND C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	0	NULL	NULL
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	0	NULL	NULL
NULL	0	1	NULL	NULL	NULL
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	0	NULL	NULL
NULL	1	1	NULL	NULL	NULL
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	0	0	0
0	NULL	1	NULL	NULL	NULL
0	0	NULL	0	0	0
0	0	0	0	0	0
0	0	1	0	0	0
0	1	NULL	NULL	NULL	NULL
0	1	0	0	0	0
0	1	1	1	1	1
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	0	1	1
1	NULL	1	NULL	NULL	NULL
1	0	NULL	NULL	1	1
1	0	0	0	1	1
1	0	1	1	1	1
1	1	NULL	0	NULL	NULL
1	1	0	0	1	1
1	1	1	0	0	0
select count(*) from t1_30237_bool
where (A XOR (B AND C)) != (A XOR B AND C);
count(*)
0
select A, B, C, (A AND B) XOR C, A AND (B XOR C), A AND B XOR C
from t1_30237_bool order by A, B, C;
A	B	C	(A AND B) XOR C	A AND (B XOR C)	A AND B XOR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	0	0	0
NULL	0	1	1	NULL	1
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	NULL	NULL	NULL
NULL	1	1	NULL	0	NULL
0	NULL	NULL	NULL	0	NULL
0	NULL	0	0	0	0
0	NULL	1	1	0	1
0	0	NULL	NULL	0	NULL
0	0	0	0	0	0
0	0	1	1	0	1
0	1	NULL	NULL	0	NULL
0	1	0	0	0	0
0	1	1	1	0	1
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	NULL	NULL	NULL
1	NULL	1	NULL	NULL	NULL
1	0	NULL	NULL	NULL	NULL
1	0	0	0	0	0
1	0	1	1	1	1
1	1	NULL	NULL	NULL	NULL
1	1	0	1	1	1
1	1	1	0	0	0
select count(*) from t1_30237_bool
where ((A AND B) XOR C) != (A AND B XOR C);
count(*)
0
Testing that XOR has precedence over OR
select A, B, C, (A XOR B) OR C, A XOR (B OR C), A XOR B OR C
from t1_30237_bool order by A, B, C;
A	B	C	(A XOR B) OR C	A XOR (B OR C)	A XOR B OR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	1	NULL	1
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	NULL	NULL	NULL
NULL	0	1	1	NULL	1
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	NULL	NULL	NULL
NULL	1	1	1	NULL	1
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	NULL	NULL	NULL
0	NULL	1	1	1	1
0	0	NULL	NULL	NULL	NULL
0	0	0	0	0	0
0	0	1	1	1	1
0	1	NULL	1	1	1
0	1	0	1	1	1
0	1	1	1	1	1
1	NULL	NULL	NULL	NULL	NULL
1	NULL	0	NULL	NULL	NULL
1	NULL	1	1	0	1
1	0	NULL	1	NULL	1
1	0	0	1	1	1
1	0	1	1	0	1
1	1	NULL	NULL	0	NULL
1	1	0	0	0	0
1	1	1	1	0	1
select count(*) from t1_30237_bool
where ((A XOR B) OR C) != (A XOR B OR C);
count(*)
0
select A, B, C, (A OR B) XOR C, A OR (B XOR C), A OR B XOR C
from t1_30237_bool order by A, B, C;
A	B	C	(A OR B) XOR C	A OR (B XOR C)	A OR B XOR C
NULL	NULL	NULL	NULL	NULL	NULL
NULL	NULL	0	NULL	NULL	NULL
NULL	NULL	1	NULL	NULL	NULL
NULL	0	NULL	NULL	NULL	NULL
NULL	0	0	NULL	NULL	NULL
NULL	0	1	NULL	1	1
NULL	1	NULL	NULL	NULL	NULL
NULL	1	0	1	1	1
NULL	1	1	0	NULL	NULL
0	NULL	NULL	NULL	NULL	NULL
0	NULL	0	NULL	NULL	NULL
0	NULL	1	NULL	NULL	NULL
0	0	NULL	NULL	NULL	NULL
0	0	0	0	0	0
0	0	1	1	1	1
0	1	NULL	NULL	NULL	NULL
0	1	0	1	1	1
0	1	1	0	0	0
1	NULL	NULL	NULL	1	1
1	NULL	0	1	1	1
1	NULL	1	0	1	1
1	0	NULL	NULL	1	1
1	0	0	1	1	1
1	0	1	0	1	1
1	1	NULL	NULL	1	1
1	1	0	1	1	1
1	1	1	0	1	1
select count(*) from t1_30237_bool
where (A OR (B XOR C)) != (A OR B XOR C);
count(*)
0
drop table t1_30237_bool;
Testing that NOT has precedence over OR
select (NOT FALSE) OR TRUE, NOT (FALSE OR TRUE), NOT FALSE OR TRUE;
(NOT FALSE) OR TRUE	NOT (FALSE OR TRUE)	NOT FALSE OR TRUE
1	0	1
Testing that NOT has precedence over XOR
select (NOT FALSE) XOR FALSE, NOT (FALSE XOR FALSE), NOT FALSE XOR FALSE;
(NOT FALSE) XOR FALSE	NOT (FALSE XOR FALSE)	NOT FALSE XOR FALSE
1	1	1
Testing that NOT has precedence over AND
select (NOT FALSE) AND FALSE, NOT (FALSE AND FALSE), NOT FALSE AND FALSE;
(NOT FALSE) AND FALSE	NOT (FALSE AND FALSE)	NOT FALSE AND FALSE
0	1	0
Testing that NOT is associative
select NOT NOT TRUE, NOT NOT NOT FALSE;
NOT NOT TRUE	NOT NOT NOT FALSE
1	1
Testing that IS has precedence over NOT
select (NOT NULL) IS TRUE, NOT (NULL IS TRUE), NOT NULL IS TRUE;
(NOT NULL) IS TRUE	NOT (NULL IS TRUE)	NOT NULL IS TRUE
0	1	1
select (NOT NULL) IS NOT TRUE, NOT (NULL IS NOT TRUE), NOT NULL IS NOT TRUE;
(NOT NULL) IS NOT TRUE	NOT (NULL IS NOT TRUE)	NOT NULL IS NOT TRUE
1	0	0
select (NOT NULL) IS FALSE, NOT (NULL IS FALSE), NOT NULL IS FALSE;
(NOT NULL) IS FALSE	NOT (NULL IS FALSE)	NOT NULL IS FALSE
0	1	1
select (NOT NULL) IS NOT FALSE, NOT (NULL IS NOT FALSE), NOT NULL IS NOT FALSE;
(NOT NULL) IS NOT FALSE	NOT (NULL IS NOT FALSE)	NOT NULL IS NOT FALSE
1	0	0
select (NOT TRUE) IS UNKNOWN, NOT (TRUE IS UNKNOWN), NOT TRUE IS UNKNOWN;
(NOT TRUE) IS UNKNOWN	NOT (TRUE IS UNKNOWN)	NOT TRUE IS UNKNOWN
0	1	1
select (NOT TRUE) IS NOT UNKNOWN, NOT (TRUE IS NOT UNKNOWN), NOT TRUE IS NOT UNKNOWN;
(NOT TRUE) IS NOT UNKNOWN	NOT (TRUE IS NOT UNKNOWN)	NOT TRUE IS NOT UNKNOWN
1	0	0
select (NOT TRUE) IS NULL, NOT (TRUE IS NULL), NOT TRUE IS NULL;
(NOT TRUE) IS NULL	NOT (TRUE IS NULL)	NOT TRUE IS NULL
0	1	1
select (NOT TRUE) IS NOT NULL, NOT (TRUE IS NOT NULL), NOT TRUE IS NOT NULL;
(NOT TRUE) IS NOT NULL	NOT (TRUE IS NOT NULL)	NOT TRUE IS NOT NULL
1	0	0
Testing that IS [NOT] TRUE/FALSE/UNKNOWN predicates are not associative
select TRUE IS TRUE IS TRUE IS TRUE;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS TRUE IS TRUE' at line 1
select FALSE IS NOT TRUE IS NOT TRUE IS NOT TRUE;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS NOT TRUE IS NOT TRUE' at line 1
select NULL IS FALSE IS FALSE IS FALSE;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS FALSE IS FALSE' at line 1
select TRUE IS NOT FALSE IS NOT FALSE IS NOT FALSE;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS NOT FALSE IS NOT FALSE' at line 1
select FALSE IS UNKNOWN IS UNKNOWN IS UNKNOWN;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS UNKNOWN IS UNKNOWN' at line 1
select TRUE IS NOT UNKNOWN IS NOT UNKNOWN IS NOT UNKNOWN;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS NOT UNKNOWN IS NOT UNKNOWN' at line 1
Testing that IS [NOT] NULL predicates are associative
select FALSE IS NULL IS NULL IS NULL;
FALSE IS NULL IS NULL IS NULL
0
select TRUE IS NOT NULL IS NOT NULL IS NOT NULL;
TRUE IS NOT NULL IS NOT NULL IS NOT NULL
1
Testing that comparison operators are left associative
select 1 <=> 2 <=> 2, (1 <=> 2) <=> 2, 1 <=> (2 <=> 2);
1 <=> 2 <=> 2	(1 <=> 2) <=> 2	1 <=> (2 <=> 2)
0	0	1
select 1 = 2 = 2, (1 = 2) = 2, 1 = (2 = 2);
1 = 2 = 2	(1 = 2) = 2	1 = (2 = 2)
0	0	1
select 1 != 2 != 3, (1 != 2) != 3, 1 != (2 != 3);
1 != 2 != 3	(1 != 2) != 3	1 != (2 != 3)
1	1	0
select 1 <> 2 <> 3, (1 <> 2) <> 3, 1 <> (2 <> 3);
1 <> 2 <> 3	(1 <> 2) <> 3	1 <> (2 <> 3)
1	1	0
select 1 < 2 < 3, (1 < 2) < 3, 1 < (2 < 3);
1 < 2 < 3	(1 < 2) < 3	1 < (2 < 3)
1	1	0
select 3 <= 2 <= 1, (3 <= 2) <= 1, 3 <= (2 <= 1);
3 <= 2 <= 1	(3 <= 2) <= 1	3 <= (2 <= 1)
1	1	0
select 1 > 2 > 3, (1 > 2) > 3, 1 > (2 > 3);
1 > 2 > 3	(1 > 2) > 3	1 > (2 > 3)
0	0	1
select 1 >= 2 >= 3, (1 >= 2) >= 3, 1 >= (2 >= 3);
1 >= 2 >= 3	(1 >= 2) >= 3	1 >= (2 >= 3)
0	0	1
Testing that | is associative
select 0xF0 | 0x0F | 0x55, (0xF0 | 0x0F) | 0x55, 0xF0 | (0x0F | 0x55);
0xF0 | 0x0F | 0x55	(0xF0 | 0x0F) | 0x55	0xF0 | (0x0F | 0x55)
255	255	255
Testing that & is associative
select 0xF5 & 0x5F & 0x55, (0xF5 & 0x5F) & 0x55, 0xF5 & (0x5F & 0x55);
0xF5 & 0x5F & 0x55	(0xF5 & 0x5F) & 0x55	0xF5 & (0x5F & 0x55)
85	85	85
Testing that << is left associative
select 4 << 3 << 2, (4 << 3) << 2, 4 << (3 << 2);
4 << 3 << 2	(4 << 3) << 2	4 << (3 << 2)
128	128	16384
Testing that >> is left associative
select 256 >> 3 >> 2, (256 >> 3) >> 2, 256 >> (3 >> 2);
256 >> 3 >> 2	(256 >> 3) >> 2	256 >> (3 >> 2)
8	8	256
Testing that & has precedence over |
select 0xF0 & 0x0F | 0x55, (0xF0 & 0x0F) | 0x55, 0xF0 & (0x0F | 0x55);
0xF0 & 0x0F | 0x55	(0xF0 & 0x0F) | 0x55	0xF0 & (0x0F | 0x55)
85	85	80
select 0x55 | 0xF0 & 0x0F, (0x55 | 0xF0) & 0x0F, 0x55 | (0xF0 & 0x0F);
0x55 | 0xF0 & 0x0F	(0x55 | 0xF0) & 0x0F	0x55 | (0xF0 & 0x0F)
85	5	85
Testing that << has precedence over |
select 0x0F << 4 | 0x0F, (0x0F << 4) | 0x0F, 0x0F << (4 | 0x0F);
0x0F << 4 | 0x0F	(0x0F << 4) | 0x0F	0x0F << (4 | 0x0F)
255	255	491520
select 0x0F | 0x0F << 4, (0x0F | 0x0F) << 4, 0x0F | (0x0F << 4);
0x0F | 0x0F << 4	(0x0F | 0x0F) << 4	0x0F | (0x0F << 4)
255	240	255
Testing that >> has precedence over |
select 0xF0 >> 4 | 0xFF, (0xF0 >> 4) | 0xFF, 0xF0 >> (4 | 0xFF);
0xF0 >> 4 | 0xFF	(0xF0 >> 4) | 0xFF	0xF0 >> (4 | 0xFF)
255	255	0
select 0xFF | 0xF0 >> 4, (0xFF | 0xF0) >> 4, 0xFF | (0xF0 >> 4);
0xFF | 0xF0 >> 4	(0xFF | 0xF0) >> 4	0xFF | (0xF0 >> 4)
255	15	255
Testing that << has precedence over &
select 0x0F << 4 & 0xF0, (0x0F << 4) & 0xF0, 0x0F << (4 & 0xF0);
0x0F << 4 & 0xF0	(0x0F << 4) & 0xF0	0x0F << (4 & 0xF0)
240	240	15
select 0xF0 & 0x0F << 4, (0xF0 & 0x0F) << 4, 0xF0 & (0x0F << 4);
0xF0 & 0x0F << 4	(0xF0 & 0x0F) << 4	0xF0 & (0x0F << 4)
240	0	240
Testing that >> has precedence over &
select 0xF0 >> 4 & 0x55, (0xF0 >> 4) & 0x55, 0xF0 >> (4 & 0x55);
0xF0 >> 4 & 0x55	(0xF0 >> 4) & 0x55	0xF0 >> (4 & 0x55)
5	5	15
select 0x0F & 0xF0 >> 4, (0x0F & 0xF0) >> 4, 0x0F & (0xF0 >> 4);
0x0F & 0xF0 >> 4	(0x0F & 0xF0) >> 4	0x0F & (0xF0 >> 4)
15	0	15
Testing that >> and << have the same precedence
select 0xFF >> 4 << 2, (0xFF >> 4) << 2, 0xFF >> (4 << 2);
0xFF >> 4 << 2	(0xFF >> 4) << 2	0xFF >> (4 << 2)
60	60	0
select 0x0F << 4 >> 2, (0x0F << 4) >> 2, 0x0F << (4 >> 2);
0x0F << 4 >> 2	(0x0F << 4) >> 2	0x0F << (4 >> 2)
60	60	30
Testing that binary + is associative
select 1 + 2 + 3, (1 + 2) + 3, 1 + (2 + 3);
1 + 2 + 3	(1 + 2) + 3	1 + (2 + 3)
6	6	6
Testing that binary - is left associative
select 1 - 2 - 3, (1 - 2) - 3, 1 - (2 - 3);
1 - 2 - 3	(1 - 2) - 3	1 - (2 - 3)
-4	-4	2
Testing that binary + and binary - have the same precedence
select 1 + 2 - 3, (1 + 2) - 3, 1 + (2 - 3);
1 + 2 - 3	(1 + 2) - 3	1 + (2 - 3)
0	0	0
select 1 - 2 + 3, (1 - 2) + 3, 1 - (2 + 3);
1 - 2 + 3	(1 - 2) + 3	1 - (2 + 3)
2	2	-4
Testing that binary + has precedence over |
select 0xF0 + 0x0F | 0x55, (0xF0 + 0x0F) | 0x55, 0xF0 + (0x0F | 0x55);
0xF0 + 0x0F | 0x55	(0xF0 + 0x0F) | 0x55	0xF0 + (0x0F | 0x55)
255	255	335
select 0x55 | 0xF0 + 0x0F, (0x55 | 0xF0) + 0x0F, 0x55 | (0xF0 + 0x0F);
0x55 | 0xF0 + 0x0F	(0x55 | 0xF0) + 0x0F	0x55 | (0xF0 + 0x0F)
255	260	255
Testing that binary + has precedence over &
select 0xF0 + 0x0F & 0x55, (0xF0 + 0x0F) & 0x55, 0xF0 + (0x0F & 0x55);
0xF0 + 0x0F & 0x55	(0xF0 + 0x0F) & 0x55	0xF0 + (0x0F & 0x55)
85	85	245
select 0x55 & 0xF0 + 0x0F, (0x55 & 0xF0) + 0x0F, 0x55 & (0xF0 + 0x0F);
0x55 & 0xF0 + 0x0F	(0x55 & 0xF0) + 0x0F	0x55 & (0xF0 + 0x0F)
85	95	85
Testing that binary + has precedence over <<
select 2 + 3 << 4, (2 + 3) << 4, 2 + (3 << 4);
2 + 3 << 4	(2 + 3) << 4	2 + (3 << 4)
80	80	50
select 3 << 4 + 2, (3 << 4) + 2, 3 << (4 + 2);
3 << 4 + 2	(3 << 4) + 2	3 << (4 + 2)
192	50	192
Testing that binary + has precedence over >>
select 4 + 3 >> 2, (4 + 3) >> 2, 4 + (3 >> 2);
4 + 3 >> 2	(4 + 3) >> 2	4 + (3 >> 2)
1	1	4
select 3 >> 2 + 1, (3 >> 2) + 1, 3 >> (2 + 1);
3 >> 2 + 1	(3 >> 2) + 1	3 >> (2 + 1)
0	1	0
Testing that binary - has precedence over |
select 0xFF - 0x0F | 0x55, (0xFF - 0x0F) | 0x55, 0xFF - (0x0F | 0x55);
0xFF - 0x0F | 0x55	(0xFF - 0x0F) | 0x55	0xFF - (0x0F | 0x55)
245	245	160
select 0x55 | 0xFF - 0xF0, (0x55 | 0xFF) - 0xF0, 0x55 | (0xFF - 0xF0);
0x55 | 0xFF - 0xF0	(0x55 | 0xFF) - 0xF0	0x55 | (0xFF - 0xF0)
95	15	95
Testing that binary - has precedence over &
select 0xFF - 0xF0 & 0x55, (0xFF - 0xF0) & 0x55, 0xFF - (0xF0 & 0x55);
0xFF - 0xF0 & 0x55	(0xFF - 0xF0) & 0x55	0xFF - (0xF0 & 0x55)
5	5	175
select 0x55 & 0xFF - 0xF0, (0x55 & 0xFF) - 0xF0, 0x55 & (0xFF - 0xF0);
0x55 & 0xFF - 0xF0	(0x55 & 0xFF) - 0xF0	0x55 & (0xFF - 0xF0)
5	-155	5
Testing that binary - has precedence over <<
select 16 - 3 << 2, (16 - 3) << 2, 16 - (3 << 2);
16 - 3 << 2	(16 - 3) << 2	16 - (3 << 2)
52	52	4
select 4 << 3 - 2, (4 << 3) - 2, 4 << (3 - 2);
4 << 3 - 2	(4 << 3) - 2	4 << (3 - 2)
8	30	8
Testing that binary - has precedence over >>
select 16 - 3 >> 2, (16 - 3) >> 2, 16 - (3 >> 2);
16 - 3 >> 2	(16 - 3) >> 2	16 - (3 >> 2)
3	3	16
select 16 >> 3 - 2, (16 >> 3) - 2, 16 >> (3 - 2);
16 >> 3 - 2	(16 >> 3) - 2	16 >> (3 - 2)
8	0	8
Testing that * is associative
select 2 * 3 * 4, (2 * 3) * 4, 2 * (3 * 4);
2 * 3 * 4	(2 * 3) * 4	2 * (3 * 4)
24	24	24
Testing that * has precedence over |
select 2 * 0x40 | 0x0F, (2 * 0x40) | 0x0F, 2 * (0x40 | 0x0F);
2 * 0x40 | 0x0F	(2 * 0x40) | 0x0F	2 * (0x40 | 0x0F)
143	143	158
select 0x0F | 2 * 0x40, (0x0F | 2) * 0x40, 0x0F | (2 * 0x40);
0x0F | 2 * 0x40	(0x0F | 2) * 0x40	0x0F | (2 * 0x40)
143	960	143
Testing that * has precedence over &
select 2 * 0x40 & 0x55, (2 * 0x40) & 0x55, 2 * (0x40 & 0x55);
2 * 0x40 & 0x55	(2 * 0x40) & 0x55	2 * (0x40 & 0x55)
0	0	128
select 0xF0 & 2 * 0x40, (0xF0 & 2) * 0x40, 0xF0 & (2 * 0x40);
0xF0 & 2 * 0x40	(0xF0 & 2) * 0x40	0xF0 & (2 * 0x40)
128	0	128
Testing that * has precedence over << 
select 5 * 3 << 4, (5 * 3) << 4, 5 * (3 << 4);
5 * 3 << 4	(5 * 3) << 4	5 * (3 << 4)
240	240	240
select 2 << 3 * 4, (2 << 3) * 4, 2 << (3 * 4);
2 << 3 * 4	(2 << 3) * 4	2 << (3 * 4)
8192	64	8192
Testing that * has precedence over >>
select 3 * 4 >> 2, (3 * 4) >> 2, 3 * (4 >> 2);
3 * 4 >> 2	(3 * 4) >> 2	3 * (4 >> 2)
3	3	3
select 4 >> 2 * 3, (4 >> 2) * 3, 4 >> (2 * 3);
4 >> 2 * 3	(4 >> 2) * 3	4 >> (2 * 3)
0	3	0
Testing that * has precedence over binary +
select 2 * 3 + 4, (2 * 3) + 4, 2 * (3 + 4);
2 * 3 + 4	(2 * 3) + 4	2 * (3 + 4)
10	10	14
select 2 + 3 * 4, (2 + 3) * 4, 2 + (3 * 4);
2 + 3 * 4	(2 + 3) * 4	2 + (3 * 4)
14	20	14
Testing that * has precedence over binary -
select 4 * 3 - 2, (4 * 3) - 2, 4 * (3 - 2);
4 * 3 - 2	(4 * 3) - 2	4 * (3 - 2)
10	10	4
select 4 - 3 * 2, (4 - 3) * 2, 4 - (3 * 2);
4 - 3 * 2	(4 - 3) * 2	4 - (3 * 2)
-2	2	-2
Testing that / is left associative
select 15 / 5 / 3, (15 / 5) / 3, 15 / (5 / 3);
15 / 5 / 3	(15 / 5) / 3	15 / (5 / 3)
1.00000000	1.00000000	9.0000
Testing that / has precedence over |
select 105 / 5 | 2, (105 / 5) | 2, 105 / (5 | 2);
105 / 5 | 2	(105 / 5) | 2	105 / (5 | 2)
23	23	15.0000
select 105 | 2 / 5, (105 | 2) / 5, 105 | (2 / 5);
105 | 2 / 5	(105 | 2) / 5	105 | (2 / 5)
105	21.4000	105
Testing that / has precedence over &
select 105 / 5 & 0x0F, (105 / 5) & 0x0F, 105 / (5 & 0x0F);
105 / 5 & 0x0F	(105 / 5) & 0x0F	105 / (5 & 0x0F)
5	5	21.0000
select 0x0F & 105 / 5, (0x0F & 105) / 5, 0x0F & (105 / 5);
0x0F & 105 / 5	(0x0F & 105) / 5	0x0F & (105 / 5)
5	1.8000	5
Testing that / has precedence over << 
select 0x80 / 4 << 2, (0x80 / 4) << 2, 0x80 / (4 << 2);
0x80 / 4 << 2	(0x80 / 4) << 2	0x80 / (4 << 2)
128	128	8.0000
select 0x80 << 4 / 2, (0x80 << 4) / 2, 0x80 << (4 / 2);
0x80 << 4 / 2	(0x80 << 4) / 2	0x80 << (4 / 2)
512	1024.0000	512
Testing that / has precedence over >>
select 0x80 / 4 >> 2, (0x80 / 4) >> 2, 0x80 / (4 >> 2);
0x80 / 4 >> 2	(0x80 / 4) >> 2	0x80 / (4 >> 2)
8	8	128.0000
select 0x80 >> 4 / 2, (0x80 >> 4) / 2, 0x80 >> (4 / 2);
0x80 >> 4 / 2	(0x80 >> 4) / 2	0x80 >> (4 / 2)
32	4.0000	32
Testing that / has precedence over binary +
select 0x80 / 2 + 2, (0x80 / 2) + 2, 0x80 / (2 + 2);
0x80 / 2 + 2	(0x80 / 2) + 2	0x80 / (2 + 2)
66.0000	66.0000	32.0000
select 0x80 + 2 / 2, (0x80 + 2) / 2, 0x80 + (2 / 2);
0x80 + 2 / 2	(0x80 + 2) / 2	0x80 + (2 / 2)
129.0000	65.0000	129.0000
Testing that / has precedence over binary -
select 0x80 / 4 - 2, (0x80 / 4) - 2, 0x80 / (4 - 2);
0x80 / 4 - 2	(0x80 / 4) - 2	0x80 / (4 - 2)
30.0000	30.0000	64.0000
select 0x80 - 4 / 2, (0x80 - 4) / 2, 0x80 - (4 / 2);
0x80 - 4 / 2	(0x80 - 4) / 2	0x80 - (4 / 2)
126.0000	62.0000	126.0000
Testing that ^ is associative
select 0xFF ^ 0xF0 ^ 0x0F, (0xFF ^ 0xF0) ^ 0x0F, 0xFF ^ (0xF0 ^ 0x0F);
0xFF ^ 0xF0 ^ 0x0F	(0xFF ^ 0xF0) ^ 0x0F	0xFF ^ (0xF0 ^ 0x0F)
0	0	0
select 0xFF ^ 0xF0 ^ 0x55, (0xFF ^ 0xF0) ^ 0x55, 0xFF ^ (0xF0 ^ 0x55);
0xFF ^ 0xF0 ^ 0x55	(0xFF ^ 0xF0) ^ 0x55	0xFF ^ (0xF0 ^ 0x55)
90	90	90
Testing that ^ has precedence over |
select 0xFF ^ 0xF0 | 0x0F, (0xFF ^ 0xF0) | 0x0F, 0xFF ^ (0xF0 | 0x0F);
0xFF ^ 0xF0 | 0x0F	(0xFF ^ 0xF0) | 0x0F	0xFF ^ (0xF0 | 0x0F)
15	15	0
select 0xF0 | 0xFF ^ 0xF0, (0xF0 | 0xFF) ^ 0xF0, 0xF0 | (0xFF ^ 0xF0);
0xF0 | 0xFF ^ 0xF0	(0xF0 | 0xFF) ^ 0xF0	0xF0 | (0xFF ^ 0xF0)
255	15	255
Testing that ^ has precedence over &
select 0xFF ^ 0xF0 & 0x0F, (0xFF ^ 0xF0) & 0x0F, 0xFF ^ (0xF0 & 0x0F);
0xFF ^ 0xF0 & 0x0F	(0xFF ^ 0xF0) & 0x0F	0xFF ^ (0xF0 & 0x0F)
15	15	255
select 0x0F & 0xFF ^ 0xF0, (0x0F & 0xFF) ^ 0xF0, 0x0F & (0xFF ^ 0xF0);
0x0F & 0xFF ^ 0xF0	(0x0F & 0xFF) ^ 0xF0	0x0F & (0xFF ^ 0xF0)
15	255	15
Testing that ^ has precedence over <<
select 0xFF ^ 0xF0 << 2, (0xFF ^ 0xF0) << 2, 0xFF ^ (0xF0 << 2);
0xFF ^ 0xF0 << 2	(0xFF ^ 0xF0) << 2	0xFF ^ (0xF0 << 2)
60	60	831
select 0x0F << 2 ^ 0xFF, (0x0F << 2) ^ 0xFF, 0x0F << (2 ^ 0xFF);
0x0F << 2 ^ 0xFF	(0x0F << 2) ^ 0xFF	0x0F << (2 ^ 0xFF)
0	195	0
Testing that ^ has precedence over >>
select 0xFF ^ 0xF0 >> 2, (0xFF ^ 0xF0) >> 2, 0xFF ^ (0xF0 >> 2);
0xFF ^ 0xF0 >> 2	(0xFF ^ 0xF0) >> 2	0xFF ^ (0xF0 >> 2)
3	3	195
select 0xFF >> 2 ^ 0xF0, (0xFF >> 2) ^ 0xF0, 0xFF >> (2 ^ 0xF0);
0xFF >> 2 ^ 0xF0	(0xFF >> 2) ^ 0xF0	0xFF >> (2 ^ 0xF0)
0	207	0
Testing that ^ has precedence over binary +
select 0xFF ^ 0xF0 + 0x0F, (0xFF ^ 0xF0) + 0x0F, 0xFF ^ (0xF0 + 0x0F);
0xFF ^ 0xF0 + 0x0F	(0xFF ^ 0xF0) + 0x0F	0xFF ^ (0xF0 + 0x0F)
30	30	0
select 0x0F + 0xFF ^ 0xF0, (0x0F + 0xFF) ^ 0xF0, 0x0F + (0xFF ^ 0xF0);
0x0F + 0xFF ^ 0xF0	(0x0F + 0xFF) ^ 0xF0	0x0F + (0xFF ^ 0xF0)
30	510	30
Testing that ^ has precedence over binary -
select 0xFF ^ 0xF0 - 1, (0xFF ^ 0xF0) - 1, 0xFF ^ (0xF0 - 1);
0xFF ^ 0xF0 - 1	(0xFF ^ 0xF0) - 1	0xFF ^ (0xF0 - 1)
14	14	16
select 0x55 - 0x0F ^ 0x55, (0x55 - 0x0F) ^ 0x55, 0x55 - (0x0F ^ 0x55);
0x55 - 0x0F ^ 0x55	(0x55 - 0x0F) ^ 0x55	0x55 - (0x0F ^ 0x55)
-5	19	-5
Testing that ^ has precedence over *
select 0xFF ^ 0xF0 * 2, (0xFF ^ 0xF0) * 2, 0xFF ^ (0xF0 * 2);
0xFF ^ 0xF0 * 2	(0xFF ^ 0xF0) * 2	0xFF ^ (0xF0 * 2)
30	30	287
select 2 * 0xFF ^ 0xF0, (2 * 0xFF) ^ 0xF0, 2 * (0xFF ^ 0xF0);
2 * 0xFF ^ 0xF0	(2 * 0xFF) ^ 0xF0	2 * (0xFF ^ 0xF0)
30	270	30
Testing that ^ has precedence over /
select 0xFF ^ 0xF0 / 2, (0xFF ^ 0xF0) / 2, 0xFF ^ (0xF0 / 2);
0xFF ^ 0xF0 / 2	(0xFF ^ 0xF0) / 2	0xFF ^ (0xF0 / 2)
7.5000	7.5000	135
select 0xF2 / 2 ^ 0xF0, (0xF2 / 2) ^ 0xF0, 0xF2 / (2 ^ 0xF0);
0xF2 / 2 ^ 0xF0	(0xF2 / 2) ^ 0xF0	0xF2 / (2 ^ 0xF0)
1.0000	137	1.0000
Testing that ^ has precedence over %
select 0xFF ^ 0xF0 % 0x20, (0xFF ^ 0xF0) % 0x20, 0xFF ^ (0xF0 % 0x20);
0xFF ^ 0xF0 % 0x20	(0xFF ^ 0xF0) % 0x20	0xFF ^ (0xF0 % 0x20)
15	15	239
select 0xFF % 0x20 ^ 0xF0, (0xFF % 0x20) ^ 0xF0, 0xFF % (0x20 ^ 0xF0);
0xFF % 0x20 ^ 0xF0	(0xFF % 0x20) ^ 0xF0	0xFF % (0x20 ^ 0xF0)
47	239	47
Testing that ^ has precedence over DIV
select 0xFF ^ 0xF0 DIV 2, (0xFF ^ 0xF0) DIV 2, 0xFF ^ (0xF0 DIV 2);
0xFF ^ 0xF0 DIV 2	(0xFF ^ 0xF0) DIV 2	0xFF ^ (0xF0 DIV 2)
7	7	135
select 0xF2 DIV 2 ^ 0xF0, (0xF2 DIV 2) ^ 0xF0, 0xF2 DIV (2 ^ 0xF0);
0xF2 DIV 2 ^ 0xF0	(0xF2 DIV 2) ^ 0xF0	0xF2 DIV (2 ^ 0xF0)
1	137	1
Testing that ^ has precedence over MOD
select 0xFF ^ 0xF0 MOD 0x20, (0xFF ^ 0xF0) MOD 0x20, 0xFF ^ (0xF0 MOD 0x20);
0xFF ^ 0xF0 MOD 0x20	(0xFF ^ 0xF0) MOD 0x20	0xFF ^ (0xF0 MOD 0x20)
15	15	239
select 0xFF MOD 0x20 ^ 0xF0, (0xFF MOD 0x20) ^ 0xF0, 0xFF MOD (0x20 ^ 0xF0);
0xFF MOD 0x20 ^ 0xF0	(0xFF MOD 0x20) ^ 0xF0	0xFF MOD (0x20 ^ 0xF0)
47	239	47
