You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

747 lines
24 KiB

Bug#30237 (Performance regression in boolean expressions) This is a performance bug, related to the parsing or 'OR' and 'AND' boolean expressions. Let N be the number of expressions involved in a OR (respectively AND). When N=1 For example, "select 1" involve only 1 term: there is no OR operator. In 4.0 and 4.1, parsing expressions not involving OR had no overhead. In 5.0, parsing adds some overhead, with Select->expr_list. With this patch, the overhead introduced in 5.0 has been removed, so that performances for N=1 should be identical to the 4.0 performances, which are optimal (there is no code executed at all) The overhead in 5.0 was in fact affecting significantly some operations. For example, loading 1 Million rows into a table with INSERTs, for a table that has 100 columns, leads to parsing 100 Millions of expressions, which means that the overhead related to Select->expr_list is executed 100 Million times ... Considering that N=1 is by far the most probable expression, this case should be optimal. When N=2 For example, "select a OR b" involves 2 terms in the OR operator. In 4.0 and 4.1, parsing expressions involving 2 terms created 1 Item_cond_or node, which is the expected result. In 5.0, parsing these expression also produced 1 node, but with some extra overhead related to Select->expr_list : creating 1 list in Select->expr_list and another in Item_cond::list is inefficient. With this patch, the overhead introduced in 5.0 has been removed so that performances for N=2 should be identical to the 4.0 performances. Note that the memory allocation uses the new (thd->mem_root) syntax directly. The cost of "is_cond_or" is estimated to be neglectable: the real problem of the performance degradation comes from unneeded memory allocations. When N>=3 For example, "select a OR b OR c ...", which involves 3 or more terms. In 4.0 and 4.1, the parser had no significant cost overhead, but produced an Item tree which is difficult to evaluate / optimize during runtime. In 5.0, the parser produces a better Item tree, using the Item_cond constructor that accepts a list of children directly, but at an extra cost related to Select->expr_list. With this patch, the code is implemented to take the best of the two implementations: - there is no overhead with Select->expr_list - the Item tree generated is optimized and flattened. This is achieved by adding children nodes into the Item tree directly, with Item_cond::add(), which avoids the need for temporary lists and memory allocation Note that this patch also provide an extra optimization, that the previous code in 5.0 did not provide: expressions are flattened in the Item tree, based on what the expression already parsed is, and not based on the order in which rules are reduced. For example : "(a OR b) OR c", "a OR (b OR c)" would both be represented with 2 Item_cond_or nodes before this patch, and with 1 node only with this patch. The logic used is based on the mathematical properties of the OR operator (it's associative), and produces a simpler tree. sql/item_cmpfunc.h: Improved performances for parsing boolean expressions sql/sql_yacc.yy: Improved performances for parsing boolean expressions mysql-test/r/parser_precedence.result: Added test cases to cover boolean operator precedence mysql-test/t/parser_precedence.test: Added test cases to cover boolean operator precedence
19 years ago
  1. drop table if exists t1_30237_bool;
  2. create table t1_30237_bool(A boolean, B boolean, C boolean);
  3. insert into t1_30237_bool values
  4. (FALSE, FALSE, FALSE),
  5. (FALSE, FALSE, NULL),
  6. (FALSE, FALSE, TRUE),
  7. (FALSE, NULL, FALSE),
  8. (FALSE, NULL, NULL),
  9. (FALSE, NULL, TRUE),
  10. (FALSE, TRUE, FALSE),
  11. (FALSE, TRUE, NULL),
  12. (FALSE, TRUE, TRUE),
  13. (NULL, FALSE, FALSE),
  14. (NULL, FALSE, NULL),
  15. (NULL, FALSE, TRUE),
  16. (NULL, NULL, FALSE),
  17. (NULL, NULL, NULL),
  18. (NULL, NULL, TRUE),
  19. (NULL, TRUE, FALSE),
  20. (NULL, TRUE, NULL),
  21. (NULL, TRUE, TRUE),
  22. (TRUE, FALSE, FALSE),
  23. (TRUE, FALSE, NULL),
  24. (TRUE, FALSE, TRUE),
  25. (TRUE, NULL, FALSE),
  26. (TRUE, NULL, NULL),
  27. (TRUE, NULL, TRUE),
  28. (TRUE, TRUE, FALSE),
  29. (TRUE, TRUE, NULL),
  30. (TRUE, TRUE, TRUE) ;
  31. Testing OR, XOR, AND
  32. select A, B, A OR B, A XOR B, A AND B
  33. from t1_30237_bool where C is null order by A, B;
  34. A B A OR B A XOR B A AND B
  35. NULL NULL NULL NULL NULL
  36. NULL 0 NULL NULL 0
  37. NULL 1 1 NULL NULL
  38. 0 NULL NULL NULL 0
  39. 0 0 0 0 0
  40. 0 1 1 1 0
  41. 1 NULL 1 NULL NULL
  42. 1 0 1 1 0
  43. 1 1 1 0 1
  44. Testing that OR is associative
  45. select A, B, C, (A OR B) OR C, A OR (B OR C), A OR B OR C
  46. from t1_30237_bool order by A, B, C;
  47. A B C (A OR B) OR C A OR (B OR C) A OR B OR C
  48. NULL NULL NULL NULL NULL NULL
  49. NULL NULL 0 NULL NULL NULL
  50. NULL NULL 1 1 1 1
  51. NULL 0 NULL NULL NULL NULL
  52. NULL 0 0 NULL NULL NULL
  53. NULL 0 1 1 1 1
  54. NULL 1 NULL 1 1 1
  55. NULL 1 0 1 1 1
  56. NULL 1 1 1 1 1
  57. 0 NULL NULL NULL NULL NULL
  58. 0 NULL 0 NULL NULL NULL
  59. 0 NULL 1 1 1 1
  60. 0 0 NULL NULL NULL NULL
  61. 0 0 0 0 0 0
  62. 0 0 1 1 1 1
  63. 0 1 NULL 1 1 1
  64. 0 1 0 1 1 1
  65. 0 1 1 1 1 1
  66. 1 NULL NULL 1 1 1
  67. 1 NULL 0 1 1 1
  68. 1 NULL 1 1 1 1
  69. 1 0 NULL 1 1 1
  70. 1 0 0 1 1 1
  71. 1 0 1 1 1 1
  72. 1 1 NULL 1 1 1
  73. 1 1 0 1 1 1
  74. 1 1 1 1 1 1
  75. select count(*) from t1_30237_bool
  76. where ((A OR B) OR C) != (A OR (B OR C));
  77. count(*)
  78. 0
  79. Testing that XOR is associative
  80. select A, B, C, (A XOR B) XOR C, A XOR (B XOR C), A XOR B XOR C
  81. from t1_30237_bool order by A, B, C;
  82. A B C (A XOR B) XOR C A XOR (B XOR C) A XOR B XOR C
  83. NULL NULL NULL NULL NULL NULL
  84. NULL NULL 0 NULL NULL NULL
  85. NULL NULL 1 NULL NULL NULL
  86. NULL 0 NULL NULL NULL NULL
  87. NULL 0 0 NULL NULL NULL
  88. NULL 0 1 NULL NULL NULL
  89. NULL 1 NULL NULL NULL NULL
  90. NULL 1 0 NULL NULL NULL
  91. NULL 1 1 NULL NULL NULL
  92. 0 NULL NULL NULL NULL NULL
  93. 0 NULL 0 NULL NULL NULL
  94. 0 NULL 1 NULL NULL NULL
  95. 0 0 NULL NULL NULL NULL
  96. 0 0 0 0 0 0
  97. 0 0 1 1 1 1
  98. 0 1 NULL NULL NULL NULL
  99. 0 1 0 1 1 1
  100. 0 1 1 0 0 0
  101. 1 NULL NULL NULL NULL NULL
  102. 1 NULL 0 NULL NULL NULL
  103. 1 NULL 1 NULL NULL NULL
  104. 1 0 NULL NULL NULL NULL
  105. 1 0 0 1 1 1
  106. 1 0 1 0 0 0
  107. 1 1 NULL NULL NULL NULL
  108. 1 1 0 0 0 0
  109. 1 1 1 1 1 1
  110. select count(*) from t1_30237_bool
  111. where ((A XOR B) XOR C) != (A XOR (B XOR C));
  112. count(*)
  113. 0
  114. Testing that AND is associative
  115. select A, B, C, (A AND B) AND C, A AND (B AND C), A AND B AND C
  116. from t1_30237_bool order by A, B, C;
  117. A B C (A AND B) AND C A AND (B AND C) A AND B AND C
  118. NULL NULL NULL NULL NULL NULL
  119. NULL NULL 0 0 0 0
  120. NULL NULL 1 NULL NULL NULL
  121. NULL 0 NULL 0 0 0
  122. NULL 0 0 0 0 0
  123. NULL 0 1 0 0 0
  124. NULL 1 NULL NULL NULL NULL
  125. NULL 1 0 0 0 0
  126. NULL 1 1 NULL NULL NULL
  127. 0 NULL NULL 0 0 0
  128. 0 NULL 0 0 0 0
  129. 0 NULL 1 0 0 0
  130. 0 0 NULL 0 0 0
  131. 0 0 0 0 0 0
  132. 0 0 1 0 0 0
  133. 0 1 NULL 0 0 0
  134. 0 1 0 0 0 0
  135. 0 1 1 0 0 0
  136. 1 NULL NULL NULL NULL NULL
  137. 1 NULL 0 0 0 0
  138. 1 NULL 1 NULL NULL NULL
  139. 1 0 NULL 0 0 0
  140. 1 0 0 0 0 0
  141. 1 0 1 0 0 0
  142. 1 1 NULL NULL NULL NULL
  143. 1 1 0 0 0 0
  144. 1 1 1 1 1 1
  145. select count(*) from t1_30237_bool
  146. where ((A AND B) AND C) != (A AND (B AND C));
  147. count(*)
  148. 0
  149. Testing that AND has precedence over OR
  150. select A, B, C, (A OR B) AND C, A OR (B AND C), A OR B AND C
  151. from t1_30237_bool order by A, B, C;
  152. A B C (A OR B) AND C A OR (B AND C) A OR B AND C
  153. NULL NULL NULL NULL NULL NULL
  154. NULL NULL 0 0 NULL NULL
  155. NULL NULL 1 NULL NULL NULL
  156. NULL 0 NULL NULL NULL NULL
  157. NULL 0 0 0 NULL NULL
  158. NULL 0 1 NULL NULL NULL
  159. NULL 1 NULL NULL NULL NULL
  160. NULL 1 0 0 NULL NULL
  161. NULL 1 1 1 1 1
  162. 0 NULL NULL NULL NULL NULL
  163. 0 NULL 0 0 0 0
  164. 0 NULL 1 NULL NULL NULL
  165. 0 0 NULL 0 0 0
  166. 0 0 0 0 0 0
  167. 0 0 1 0 0 0
  168. 0 1 NULL NULL NULL NULL
  169. 0 1 0 0 0 0
  170. 0 1 1 1 1 1
  171. 1 NULL NULL NULL 1 1
  172. 1 NULL 0 0 1 1
  173. 1 NULL 1 1 1 1
  174. 1 0 NULL NULL 1 1
  175. 1 0 0 0 1 1
  176. 1 0 1 1 1 1
  177. 1 1 NULL NULL 1 1
  178. 1 1 0 0 1 1
  179. 1 1 1 1 1 1
  180. select count(*) from t1_30237_bool
  181. where (A OR (B AND C)) != (A OR B AND C);
  182. count(*)
  183. 0
  184. select A, B, C, (A AND B) OR C, A AND (B OR C), A AND B OR C
  185. from t1_30237_bool order by A, B, C;
  186. A B C (A AND B) OR C A AND (B OR C) A AND B OR C
  187. NULL NULL NULL NULL NULL NULL
  188. NULL NULL 0 NULL NULL NULL
  189. NULL NULL 1 1 NULL 1
  190. NULL 0 NULL NULL NULL NULL
  191. NULL 0 0 0 0 0
  192. NULL 0 1 1 NULL 1
  193. NULL 1 NULL NULL NULL NULL
  194. NULL 1 0 NULL NULL NULL
  195. NULL 1 1 1 NULL 1
  196. 0 NULL NULL NULL 0 NULL
  197. 0 NULL 0 0 0 0
  198. 0 NULL 1 1 0 1
  199. 0 0 NULL NULL 0 NULL
  200. 0 0 0 0 0 0
  201. 0 0 1 1 0 1
  202. 0 1 NULL NULL 0 NULL
  203. 0 1 0 0 0 0
  204. 0 1 1 1 0 1
  205. 1 NULL NULL NULL NULL NULL
  206. 1 NULL 0 NULL NULL NULL
  207. 1 NULL 1 1 1 1
  208. 1 0 NULL NULL NULL NULL
  209. 1 0 0 0 0 0
  210. 1 0 1 1 1 1
  211. 1 1 NULL 1 1 1
  212. 1 1 0 1 1 1
  213. 1 1 1 1 1 1
  214. select count(*) from t1_30237_bool
  215. where ((A AND B) OR C) != (A AND B OR C);
  216. count(*)
  217. 0
  218. Testing that AND has precedence over XOR
  219. select A, B, C, (A XOR B) AND C, A XOR (B AND C), A XOR B AND C
  220. from t1_30237_bool order by A, B, C;
  221. A B C (A XOR B) AND C A XOR (B AND C) A XOR B AND C
  222. NULL NULL NULL NULL NULL NULL
  223. NULL NULL 0 0 NULL NULL
  224. NULL NULL 1 NULL NULL NULL
  225. NULL 0 NULL NULL NULL NULL
  226. NULL 0 0 0 NULL NULL
  227. NULL 0 1 NULL NULL NULL
  228. NULL 1 NULL NULL NULL NULL
  229. NULL 1 0 0 NULL NULL
  230. NULL 1 1 NULL NULL NULL
  231. 0 NULL NULL NULL NULL NULL
  232. 0 NULL 0 0 0 0
  233. 0 NULL 1 NULL NULL NULL
  234. 0 0 NULL 0 0 0
  235. 0 0 0 0 0 0
  236. 0 0 1 0 0 0
  237. 0 1 NULL NULL NULL NULL
  238. 0 1 0 0 0 0
  239. 0 1 1 1 1 1
  240. 1 NULL NULL NULL NULL NULL
  241. 1 NULL 0 0 1 1
  242. 1 NULL 1 NULL NULL NULL
  243. 1 0 NULL NULL 1 1
  244. 1 0 0 0 1 1
  245. 1 0 1 1 1 1
  246. 1 1 NULL 0 NULL NULL
  247. 1 1 0 0 1 1
  248. 1 1 1 0 0 0
  249. select count(*) from t1_30237_bool
  250. where (A XOR (B AND C)) != (A XOR B AND C);
  251. count(*)
  252. 0
  253. select A, B, C, (A AND B) XOR C, A AND (B XOR C), A AND B XOR C
  254. from t1_30237_bool order by A, B, C;
  255. A B C (A AND B) XOR C A AND (B XOR C) A AND B XOR C
  256. NULL NULL NULL NULL NULL NULL
  257. NULL NULL 0 NULL NULL NULL
  258. NULL NULL 1 NULL NULL NULL
  259. NULL 0 NULL NULL NULL NULL
  260. NULL 0 0 0 0 0
  261. NULL 0 1 1 NULL 1
  262. NULL 1 NULL NULL NULL NULL
  263. NULL 1 0 NULL NULL NULL
  264. NULL 1 1 NULL 0 NULL
  265. 0 NULL NULL NULL 0 NULL
  266. 0 NULL 0 0 0 0
  267. 0 NULL 1 1 0 1
  268. 0 0 NULL NULL 0 NULL
  269. 0 0 0 0 0 0
  270. 0 0 1 1 0 1
  271. 0 1 NULL NULL 0 NULL
  272. 0 1 0 0 0 0
  273. 0 1 1 1 0 1
  274. 1 NULL NULL NULL NULL NULL
  275. 1 NULL 0 NULL NULL NULL
  276. 1 NULL 1 NULL NULL NULL
  277. 1 0 NULL NULL NULL NULL
  278. 1 0 0 0 0 0
  279. 1 0 1 1 1 1
  280. 1 1 NULL NULL NULL NULL
  281. 1 1 0 1 1 1
  282. 1 1 1 0 0 0
  283. select count(*) from t1_30237_bool
  284. where ((A AND B) XOR C) != (A AND B XOR C);
  285. count(*)
  286. 0
  287. Testing that XOR has precedence over OR
  288. select A, B, C, (A XOR B) OR C, A XOR (B OR C), A XOR B OR C
  289. from t1_30237_bool order by A, B, C;
  290. A B C (A XOR B) OR C A XOR (B OR C) A XOR B OR C
  291. NULL NULL NULL NULL NULL NULL
  292. NULL NULL 0 NULL NULL NULL
  293. NULL NULL 1 1 NULL 1
  294. NULL 0 NULL NULL NULL NULL
  295. NULL 0 0 NULL NULL NULL
  296. NULL 0 1 1 NULL 1
  297. NULL 1 NULL NULL NULL NULL
  298. NULL 1 0 NULL NULL NULL
  299. NULL 1 1 1 NULL 1
  300. 0 NULL NULL NULL NULL NULL
  301. 0 NULL 0 NULL NULL NULL
  302. 0 NULL 1 1 1 1
  303. 0 0 NULL NULL NULL NULL
  304. 0 0 0 0 0 0
  305. 0 0 1 1 1 1
  306. 0 1 NULL 1 1 1
  307. 0 1 0 1 1 1
  308. 0 1 1 1 1 1
  309. 1 NULL NULL NULL NULL NULL
  310. 1 NULL 0 NULL NULL NULL
  311. 1 NULL 1 1 0 1
  312. 1 0 NULL 1 NULL 1
  313. 1 0 0 1 1 1
  314. 1 0 1 1 0 1
  315. 1 1 NULL NULL 0 NULL
  316. 1 1 0 0 0 0
  317. 1 1 1 1 0 1
  318. select count(*) from t1_30237_bool
  319. where ((A XOR B) OR C) != (A XOR B OR C);
  320. count(*)
  321. 0
  322. select A, B, C, (A OR B) XOR C, A OR (B XOR C), A OR B XOR C
  323. from t1_30237_bool order by A, B, C;
  324. A B C (A OR B) XOR C A OR (B XOR C) A OR B XOR C
  325. NULL NULL NULL NULL NULL NULL
  326. NULL NULL 0 NULL NULL NULL
  327. NULL NULL 1 NULL NULL NULL
  328. NULL 0 NULL NULL NULL NULL
  329. NULL 0 0 NULL NULL NULL
  330. NULL 0 1 NULL 1 1
  331. NULL 1 NULL NULL NULL NULL
  332. NULL 1 0 1 1 1
  333. NULL 1 1 0 NULL NULL
  334. 0 NULL NULL NULL NULL NULL
  335. 0 NULL 0 NULL NULL NULL
  336. 0 NULL 1 NULL NULL NULL
  337. 0 0 NULL NULL NULL NULL
  338. 0 0 0 0 0 0
  339. 0 0 1 1 1 1
  340. 0 1 NULL NULL NULL NULL
  341. 0 1 0 1 1 1
  342. 0 1 1 0 0 0
  343. 1 NULL NULL NULL 1 1
  344. 1 NULL 0 1 1 1
  345. 1 NULL 1 0 1 1
  346. 1 0 NULL NULL 1 1
  347. 1 0 0 1 1 1
  348. 1 0 1 0 1 1
  349. 1 1 NULL NULL 1 1
  350. 1 1 0 1 1 1
  351. 1 1 1 0 1 1
  352. select count(*) from t1_30237_bool
  353. where (A OR (B XOR C)) != (A OR B XOR C);
  354. count(*)
  355. 0
  356. drop table t1_30237_bool;
  357. Testing that NOT has precedence over OR
  358. select (NOT FALSE) OR TRUE, NOT (FALSE OR TRUE), NOT FALSE OR TRUE;
  359. (NOT FALSE) OR TRUE NOT (FALSE OR TRUE) NOT FALSE OR TRUE
  360. 1 0 1
  361. Testing that NOT has precedence over XOR
  362. select (NOT FALSE) XOR FALSE, NOT (FALSE XOR FALSE), NOT FALSE XOR FALSE;
  363. (NOT FALSE) XOR FALSE NOT (FALSE XOR FALSE) NOT FALSE XOR FALSE
  364. 1 1 1
  365. Testing that NOT has precedence over AND
  366. select (NOT FALSE) AND FALSE, NOT (FALSE AND FALSE), NOT FALSE AND FALSE;
  367. (NOT FALSE) AND FALSE NOT (FALSE AND FALSE) NOT FALSE AND FALSE
  368. 0 1 0
  369. Testing that NOT is associative
  370. select NOT NOT TRUE, NOT NOT NOT FALSE;
  371. NOT NOT TRUE NOT NOT NOT FALSE
  372. 1 1
  373. Testing that IS has precedence over NOT
  374. select (NOT NULL) IS TRUE, NOT (NULL IS TRUE), NOT NULL IS TRUE;
  375. (NOT NULL) IS TRUE NOT (NULL IS TRUE) NOT NULL IS TRUE
  376. 0 1 1
  377. select (NOT NULL) IS NOT TRUE, NOT (NULL IS NOT TRUE), NOT NULL IS NOT TRUE;
  378. (NOT NULL) IS NOT TRUE NOT (NULL IS NOT TRUE) NOT NULL IS NOT TRUE
  379. 1 0 0
  380. select (NOT NULL) IS FALSE, NOT (NULL IS FALSE), NOT NULL IS FALSE;
  381. (NOT NULL) IS FALSE NOT (NULL IS FALSE) NOT NULL IS FALSE
  382. 0 1 1
  383. select (NOT NULL) IS NOT FALSE, NOT (NULL IS NOT FALSE), NOT NULL IS NOT FALSE;
  384. (NOT NULL) IS NOT FALSE NOT (NULL IS NOT FALSE) NOT NULL IS NOT FALSE
  385. 1 0 0
  386. select (NOT TRUE) IS UNKNOWN, NOT (TRUE IS UNKNOWN), NOT TRUE IS UNKNOWN;
  387. (NOT TRUE) IS UNKNOWN NOT (TRUE IS UNKNOWN) NOT TRUE IS UNKNOWN
  388. 0 1 1
  389. select (NOT TRUE) IS NOT UNKNOWN, NOT (TRUE IS NOT UNKNOWN), NOT TRUE IS NOT UNKNOWN;
  390. (NOT TRUE) IS NOT UNKNOWN NOT (TRUE IS NOT UNKNOWN) NOT TRUE IS NOT UNKNOWN
  391. 1 0 0
  392. select (NOT TRUE) IS NULL, NOT (TRUE IS NULL), NOT TRUE IS NULL;
  393. (NOT TRUE) IS NULL NOT (TRUE IS NULL) NOT TRUE IS NULL
  394. 0 1 1
  395. select (NOT TRUE) IS NOT NULL, NOT (TRUE IS NOT NULL), NOT TRUE IS NOT NULL;
  396. (NOT TRUE) IS NOT NULL NOT (TRUE IS NOT NULL) NOT TRUE IS NOT NULL
  397. 1 0 0
  398. Testing that IS [NOT] TRUE/FALSE/UNKNOWN predicates are not associative
  399. select TRUE IS TRUE IS TRUE IS TRUE;
  400. 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
  401. select FALSE IS NOT TRUE IS NOT TRUE IS NOT TRUE;
  402. 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
  403. select NULL IS FALSE IS FALSE IS FALSE;
  404. 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
  405. select TRUE IS NOT FALSE IS NOT FALSE IS NOT FALSE;
  406. 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
  407. select FALSE IS UNKNOWN IS UNKNOWN IS UNKNOWN;
  408. 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
  409. select TRUE IS NOT UNKNOWN IS NOT UNKNOWN IS NOT UNKNOWN;
  410. 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
  411. Testing that IS [NOT] NULL predicates are associative
  412. select FALSE IS NULL IS NULL IS NULL;
  413. FALSE IS NULL IS NULL IS NULL
  414. 0
  415. select TRUE IS NOT NULL IS NOT NULL IS NOT NULL;
  416. TRUE IS NOT NULL IS NOT NULL IS NOT NULL
  417. 1
  418. Testing that comparison operators are left associative
  419. select 1 <=> 2 <=> 2, (1 <=> 2) <=> 2, 1 <=> (2 <=> 2);
  420. 1 <=> 2 <=> 2 (1 <=> 2) <=> 2 1 <=> (2 <=> 2)
  421. 0 0 1
  422. select 1 = 2 = 2, (1 = 2) = 2, 1 = (2 = 2);
  423. 1 = 2 = 2 (1 = 2) = 2 1 = (2 = 2)
  424. 0 0 1
  425. select 1 != 2 != 3, (1 != 2) != 3, 1 != (2 != 3);
  426. 1 != 2 != 3 (1 != 2) != 3 1 != (2 != 3)
  427. 1 1 0
  428. select 1 <> 2 <> 3, (1 <> 2) <> 3, 1 <> (2 <> 3);
  429. 1 <> 2 <> 3 (1 <> 2) <> 3 1 <> (2 <> 3)
  430. 1 1 0
  431. select 1 < 2 < 3, (1 < 2) < 3, 1 < (2 < 3);
  432. 1 < 2 < 3 (1 < 2) < 3 1 < (2 < 3)
  433. 1 1 0
  434. select 3 <= 2 <= 1, (3 <= 2) <= 1, 3 <= (2 <= 1);
  435. 3 <= 2 <= 1 (3 <= 2) <= 1 3 <= (2 <= 1)
  436. 1 1 0
  437. select 1 > 2 > 3, (1 > 2) > 3, 1 > (2 > 3);
  438. 1 > 2 > 3 (1 > 2) > 3 1 > (2 > 3)
  439. 0 0 1
  440. select 1 >= 2 >= 3, (1 >= 2) >= 3, 1 >= (2 >= 3);
  441. 1 >= 2 >= 3 (1 >= 2) >= 3 1 >= (2 >= 3)
  442. 0 0 1
  443. Testing that | is associative
  444. select 0xF0 | 0x0F | 0x55, (0xF0 | 0x0F) | 0x55, 0xF0 | (0x0F | 0x55);
  445. 0xF0 | 0x0F | 0x55 (0xF0 | 0x0F) | 0x55 0xF0 | (0x0F | 0x55)
  446. 255 255 255
  447. Testing that & is associative
  448. select 0xF5 & 0x5F & 0x55, (0xF5 & 0x5F) & 0x55, 0xF5 & (0x5F & 0x55);
  449. 0xF5 & 0x5F & 0x55 (0xF5 & 0x5F) & 0x55 0xF5 & (0x5F & 0x55)
  450. 85 85 85
  451. Testing that << is left associative
  452. select 4 << 3 << 2, (4 << 3) << 2, 4 << (3 << 2);
  453. 4 << 3 << 2 (4 << 3) << 2 4 << (3 << 2)
  454. 128 128 16384
  455. Testing that >> is left associative
  456. select 256 >> 3 >> 2, (256 >> 3) >> 2, 256 >> (3 >> 2);
  457. 256 >> 3 >> 2 (256 >> 3) >> 2 256 >> (3 >> 2)
  458. 8 8 256
  459. Testing that & has precedence over |
  460. select 0xF0 & 0x0F | 0x55, (0xF0 & 0x0F) | 0x55, 0xF0 & (0x0F | 0x55);
  461. 0xF0 & 0x0F | 0x55 (0xF0 & 0x0F) | 0x55 0xF0 & (0x0F | 0x55)
  462. 85 85 80
  463. select 0x55 | 0xF0 & 0x0F, (0x55 | 0xF0) & 0x0F, 0x55 | (0xF0 & 0x0F);
  464. 0x55 | 0xF0 & 0x0F (0x55 | 0xF0) & 0x0F 0x55 | (0xF0 & 0x0F)
  465. 85 5 85
  466. Testing that << has precedence over |
  467. select 0x0F << 4 | 0x0F, (0x0F << 4) | 0x0F, 0x0F << (4 | 0x0F);
  468. 0x0F << 4 | 0x0F (0x0F << 4) | 0x0F 0x0F << (4 | 0x0F)
  469. 255 255 491520
  470. select 0x0F | 0x0F << 4, (0x0F | 0x0F) << 4, 0x0F | (0x0F << 4);
  471. 0x0F | 0x0F << 4 (0x0F | 0x0F) << 4 0x0F | (0x0F << 4)
  472. 255 240 255
  473. Testing that >> has precedence over |
  474. select 0xF0 >> 4 | 0xFF, (0xF0 >> 4) | 0xFF, 0xF0 >> (4 | 0xFF);
  475. 0xF0 >> 4 | 0xFF (0xF0 >> 4) | 0xFF 0xF0 >> (4 | 0xFF)
  476. 255 255 0
  477. select 0xFF | 0xF0 >> 4, (0xFF | 0xF0) >> 4, 0xFF | (0xF0 >> 4);
  478. 0xFF | 0xF0 >> 4 (0xFF | 0xF0) >> 4 0xFF | (0xF0 >> 4)
  479. 255 15 255
  480. Testing that << has precedence over &
  481. select 0x0F << 4 & 0xF0, (0x0F << 4) & 0xF0, 0x0F << (4 & 0xF0);
  482. 0x0F << 4 & 0xF0 (0x0F << 4) & 0xF0 0x0F << (4 & 0xF0)
  483. 240 240 15
  484. select 0xF0 & 0x0F << 4, (0xF0 & 0x0F) << 4, 0xF0 & (0x0F << 4);
  485. 0xF0 & 0x0F << 4 (0xF0 & 0x0F) << 4 0xF0 & (0x0F << 4)
  486. 240 0 240
  487. Testing that >> has precedence over &
  488. select 0xF0 >> 4 & 0x55, (0xF0 >> 4) & 0x55, 0xF0 >> (4 & 0x55);
  489. 0xF0 >> 4 & 0x55 (0xF0 >> 4) & 0x55 0xF0 >> (4 & 0x55)
  490. 5 5 15
  491. select 0x0F & 0xF0 >> 4, (0x0F & 0xF0) >> 4, 0x0F & (0xF0 >> 4);
  492. 0x0F & 0xF0 >> 4 (0x0F & 0xF0) >> 4 0x0F & (0xF0 >> 4)
  493. 15 0 15
  494. Testing that >> and << have the same precedence
  495. select 0xFF >> 4 << 2, (0xFF >> 4) << 2, 0xFF >> (4 << 2);
  496. 0xFF >> 4 << 2 (0xFF >> 4) << 2 0xFF >> (4 << 2)
  497. 60 60 0
  498. select 0x0F << 4 >> 2, (0x0F << 4) >> 2, 0x0F << (4 >> 2);
  499. 0x0F << 4 >> 2 (0x0F << 4) >> 2 0x0F << (4 >> 2)
  500. 60 60 30
  501. Testing that binary + is associative
  502. select 1 + 2 + 3, (1 + 2) + 3, 1 + (2 + 3);
  503. 1 + 2 + 3 (1 + 2) + 3 1 + (2 + 3)
  504. 6 6 6
  505. Testing that binary - is left associative
  506. select 1 - 2 - 3, (1 - 2) - 3, 1 - (2 - 3);
  507. 1 - 2 - 3 (1 - 2) - 3 1 - (2 - 3)
  508. -4 -4 2
  509. Testing that binary + and binary - have the same precedence
  510. select 1 + 2 - 3, (1 + 2) - 3, 1 + (2 - 3);
  511. 1 + 2 - 3 (1 + 2) - 3 1 + (2 - 3)
  512. 0 0 0
  513. select 1 - 2 + 3, (1 - 2) + 3, 1 - (2 + 3);
  514. 1 - 2 + 3 (1 - 2) + 3 1 - (2 + 3)
  515. 2 2 -4
  516. Testing that binary + has precedence over |
  517. select 0xF0 + 0x0F | 0x55, (0xF0 + 0x0F) | 0x55, 0xF0 + (0x0F | 0x55);
  518. 0xF0 + 0x0F | 0x55 (0xF0 + 0x0F) | 0x55 0xF0 + (0x0F | 0x55)
  519. 255 255 335
  520. select 0x55 | 0xF0 + 0x0F, (0x55 | 0xF0) + 0x0F, 0x55 | (0xF0 + 0x0F);
  521. 0x55 | 0xF0 + 0x0F (0x55 | 0xF0) + 0x0F 0x55 | (0xF0 + 0x0F)
  522. 255 260 255
  523. Testing that binary + has precedence over &
  524. select 0xF0 + 0x0F & 0x55, (0xF0 + 0x0F) & 0x55, 0xF0 + (0x0F & 0x55);
  525. 0xF0 + 0x0F & 0x55 (0xF0 + 0x0F) & 0x55 0xF0 + (0x0F & 0x55)
  526. 85 85 245
  527. select 0x55 & 0xF0 + 0x0F, (0x55 & 0xF0) + 0x0F, 0x55 & (0xF0 + 0x0F);
  528. 0x55 & 0xF0 + 0x0F (0x55 & 0xF0) + 0x0F 0x55 & (0xF0 + 0x0F)
  529. 85 95 85
  530. Testing that binary + has precedence over <<
  531. select 2 + 3 << 4, (2 + 3) << 4, 2 + (3 << 4);
  532. 2 + 3 << 4 (2 + 3) << 4 2 + (3 << 4)
  533. 80 80 50
  534. select 3 << 4 + 2, (3 << 4) + 2, 3 << (4 + 2);
  535. 3 << 4 + 2 (3 << 4) + 2 3 << (4 + 2)
  536. 192 50 192
  537. Testing that binary + has precedence over >>
  538. select 4 + 3 >> 2, (4 + 3) >> 2, 4 + (3 >> 2);
  539. 4 + 3 >> 2 (4 + 3) >> 2 4 + (3 >> 2)
  540. 1 1 4
  541. select 3 >> 2 + 1, (3 >> 2) + 1, 3 >> (2 + 1);
  542. 3 >> 2 + 1 (3 >> 2) + 1 3 >> (2 + 1)
  543. 0 1 0
  544. Testing that binary - has precedence over |
  545. select 0xFF - 0x0F | 0x55, (0xFF - 0x0F) | 0x55, 0xFF - (0x0F | 0x55);
  546. 0xFF - 0x0F | 0x55 (0xFF - 0x0F) | 0x55 0xFF - (0x0F | 0x55)
  547. 245 245 160
  548. select 0x55 | 0xFF - 0xF0, (0x55 | 0xFF) - 0xF0, 0x55 | (0xFF - 0xF0);
  549. 0x55 | 0xFF - 0xF0 (0x55 | 0xFF) - 0xF0 0x55 | (0xFF - 0xF0)
  550. 95 15 95
  551. Testing that binary - has precedence over &
  552. select 0xFF - 0xF0 & 0x55, (0xFF - 0xF0) & 0x55, 0xFF - (0xF0 & 0x55);
  553. 0xFF - 0xF0 & 0x55 (0xFF - 0xF0) & 0x55 0xFF - (0xF0 & 0x55)
  554. 5 5 175
  555. select 0x55 & 0xFF - 0xF0, (0x55 & 0xFF) - 0xF0, 0x55 & (0xFF - 0xF0);
  556. 0x55 & 0xFF - 0xF0 (0x55 & 0xFF) - 0xF0 0x55 & (0xFF - 0xF0)
  557. 5 -155 5
  558. Testing that binary - has precedence over <<
  559. select 16 - 3 << 2, (16 - 3) << 2, 16 - (3 << 2);
  560. 16 - 3 << 2 (16 - 3) << 2 16 - (3 << 2)
  561. 52 52 4
  562. select 4 << 3 - 2, (4 << 3) - 2, 4 << (3 - 2);
  563. 4 << 3 - 2 (4 << 3) - 2 4 << (3 - 2)
  564. 8 30 8
  565. Testing that binary - has precedence over >>
  566. select 16 - 3 >> 2, (16 - 3) >> 2, 16 - (3 >> 2);
  567. 16 - 3 >> 2 (16 - 3) >> 2 16 - (3 >> 2)
  568. 3 3 16
  569. select 16 >> 3 - 2, (16 >> 3) - 2, 16 >> (3 - 2);
  570. 16 >> 3 - 2 (16 >> 3) - 2 16 >> (3 - 2)
  571. 8 0 8
  572. Testing that * is associative
  573. select 2 * 3 * 4, (2 * 3) * 4, 2 * (3 * 4);
  574. 2 * 3 * 4 (2 * 3) * 4 2 * (3 * 4)
  575. 24 24 24
  576. Testing that * has precedence over |
  577. select 2 * 0x40 | 0x0F, (2 * 0x40) | 0x0F, 2 * (0x40 | 0x0F);
  578. 2 * 0x40 | 0x0F (2 * 0x40) | 0x0F 2 * (0x40 | 0x0F)
  579. 143 143 158
  580. select 0x0F | 2 * 0x40, (0x0F | 2) * 0x40, 0x0F | (2 * 0x40);
  581. 0x0F | 2 * 0x40 (0x0F | 2) * 0x40 0x0F | (2 * 0x40)
  582. 143 960 143
  583. Testing that * has precedence over &
  584. select 2 * 0x40 & 0x55, (2 * 0x40) & 0x55, 2 * (0x40 & 0x55);
  585. 2 * 0x40 & 0x55 (2 * 0x40) & 0x55 2 * (0x40 & 0x55)
  586. 0 0 128
  587. select 0xF0 & 2 * 0x40, (0xF0 & 2) * 0x40, 0xF0 & (2 * 0x40);
  588. 0xF0 & 2 * 0x40 (0xF0 & 2) * 0x40 0xF0 & (2 * 0x40)
  589. 128 0 128
  590. Testing that * has precedence over <<
  591. select 5 * 3 << 4, (5 * 3) << 4, 5 * (3 << 4);
  592. 5 * 3 << 4 (5 * 3) << 4 5 * (3 << 4)
  593. 240 240 240
  594. select 2 << 3 * 4, (2 << 3) * 4, 2 << (3 * 4);
  595. 2 << 3 * 4 (2 << 3) * 4 2 << (3 * 4)
  596. 8192 64 8192
  597. Testing that * has precedence over >>
  598. select 3 * 4 >> 2, (3 * 4) >> 2, 3 * (4 >> 2);
  599. 3 * 4 >> 2 (3 * 4) >> 2 3 * (4 >> 2)
  600. 3 3 3
  601. select 4 >> 2 * 3, (4 >> 2) * 3, 4 >> (2 * 3);
  602. 4 >> 2 * 3 (4 >> 2) * 3 4 >> (2 * 3)
  603. 0 3 0
  604. Testing that * has precedence over binary +
  605. select 2 * 3 + 4, (2 * 3) + 4, 2 * (3 + 4);
  606. 2 * 3 + 4 (2 * 3) + 4 2 * (3 + 4)
  607. 10 10 14
  608. select 2 + 3 * 4, (2 + 3) * 4, 2 + (3 * 4);
  609. 2 + 3 * 4 (2 + 3) * 4 2 + (3 * 4)
  610. 14 20 14
  611. Testing that * has precedence over binary -
  612. select 4 * 3 - 2, (4 * 3) - 2, 4 * (3 - 2);
  613. 4 * 3 - 2 (4 * 3) - 2 4 * (3 - 2)
  614. 10 10 4
  615. select 4 - 3 * 2, (4 - 3) * 2, 4 - (3 * 2);
  616. 4 - 3 * 2 (4 - 3) * 2 4 - (3 * 2)
  617. -2 2 -2
  618. Testing that / is left associative
  619. select 15 / 5 / 3, (15 / 5) / 3, 15 / (5 / 3);
  620. 15 / 5 / 3 (15 / 5) / 3 15 / (5 / 3)
  621. 1.00000000 1.00000000 9.0000
  622. Testing that / has precedence over |
  623. select 105 / 5 | 2, (105 / 5) | 2, 105 / (5 | 2);
  624. 105 / 5 | 2 (105 / 5) | 2 105 / (5 | 2)
  625. 23 23 15.0000
  626. select 105 | 2 / 5, (105 | 2) / 5, 105 | (2 / 5);
  627. 105 | 2 / 5 (105 | 2) / 5 105 | (2 / 5)
  628. 105 21.4000 105
  629. Testing that / has precedence over &
  630. select 105 / 5 & 0x0F, (105 / 5) & 0x0F, 105 / (5 & 0x0F);
  631. 105 / 5 & 0x0F (105 / 5) & 0x0F 105 / (5 & 0x0F)
  632. 5 5 21.0000
  633. select 0x0F & 105 / 5, (0x0F & 105) / 5, 0x0F & (105 / 5);
  634. 0x0F & 105 / 5 (0x0F & 105) / 5 0x0F & (105 / 5)
  635. 5 1.8000 5
  636. Testing that / has precedence over <<
  637. select 0x80 / 4 << 2, (0x80 / 4) << 2, 0x80 / (4 << 2);
  638. 0x80 / 4 << 2 (0x80 / 4) << 2 0x80 / (4 << 2)
  639. 128 128 8.0000
  640. select 0x80 << 4 / 2, (0x80 << 4) / 2, 0x80 << (4 / 2);
  641. 0x80 << 4 / 2 (0x80 << 4) / 2 0x80 << (4 / 2)
  642. 512 1024.0000 512
  643. Testing that / has precedence over >>
  644. select 0x80 / 4 >> 2, (0x80 / 4) >> 2, 0x80 / (4 >> 2);
  645. 0x80 / 4 >> 2 (0x80 / 4) >> 2 0x80 / (4 >> 2)
  646. 8 8 128.0000
  647. select 0x80 >> 4 / 2, (0x80 >> 4) / 2, 0x80 >> (4 / 2);
  648. 0x80 >> 4 / 2 (0x80 >> 4) / 2 0x80 >> (4 / 2)
  649. 32 4.0000 32
  650. Testing that / has precedence over binary +
  651. select 0x80 / 2 + 2, (0x80 / 2) + 2, 0x80 / (2 + 2);
  652. 0x80 / 2 + 2 (0x80 / 2) + 2 0x80 / (2 + 2)
  653. 66.0000 66.0000 32.0000
  654. select 0x80 + 2 / 2, (0x80 + 2) / 2, 0x80 + (2 / 2);
  655. 0x80 + 2 / 2 (0x80 + 2) / 2 0x80 + (2 / 2)
  656. 129.0000 65.0000 129.0000
  657. Testing that / has precedence over binary -
  658. select 0x80 / 4 - 2, (0x80 / 4) - 2, 0x80 / (4 - 2);
  659. 0x80 / 4 - 2 (0x80 / 4) - 2 0x80 / (4 - 2)
  660. 30.0000 30.0000 64.0000
  661. select 0x80 - 4 / 2, (0x80 - 4) / 2, 0x80 - (4 / 2);
  662. 0x80 - 4 / 2 (0x80 - 4) / 2 0x80 - (4 / 2)
  663. 126.0000 62.0000 126.0000
  664. Testing that ^ is associative
  665. select 0xFF ^ 0xF0 ^ 0x0F, (0xFF ^ 0xF0) ^ 0x0F, 0xFF ^ (0xF0 ^ 0x0F);
  666. 0xFF ^ 0xF0 ^ 0x0F (0xFF ^ 0xF0) ^ 0x0F 0xFF ^ (0xF0 ^ 0x0F)
  667. 0 0 0
  668. select 0xFF ^ 0xF0 ^ 0x55, (0xFF ^ 0xF0) ^ 0x55, 0xFF ^ (0xF0 ^ 0x55);
  669. 0xFF ^ 0xF0 ^ 0x55 (0xFF ^ 0xF0) ^ 0x55 0xFF ^ (0xF0 ^ 0x55)
  670. 90 90 90
  671. Testing that ^ has precedence over |
  672. select 0xFF ^ 0xF0 | 0x0F, (0xFF ^ 0xF0) | 0x0F, 0xFF ^ (0xF0 | 0x0F);
  673. 0xFF ^ 0xF0 | 0x0F (0xFF ^ 0xF0) | 0x0F 0xFF ^ (0xF0 | 0x0F)
  674. 15 15 0
  675. select 0xF0 | 0xFF ^ 0xF0, (0xF0 | 0xFF) ^ 0xF0, 0xF0 | (0xFF ^ 0xF0);
  676. 0xF0 | 0xFF ^ 0xF0 (0xF0 | 0xFF) ^ 0xF0 0xF0 | (0xFF ^ 0xF0)
  677. 255 15 255
  678. Testing that ^ has precedence over &
  679. select 0xFF ^ 0xF0 & 0x0F, (0xFF ^ 0xF0) & 0x0F, 0xFF ^ (0xF0 & 0x0F);
  680. 0xFF ^ 0xF0 & 0x0F (0xFF ^ 0xF0) & 0x0F 0xFF ^ (0xF0 & 0x0F)
  681. 15 15 255
  682. select 0x0F & 0xFF ^ 0xF0, (0x0F & 0xFF) ^ 0xF0, 0x0F & (0xFF ^ 0xF0);
  683. 0x0F & 0xFF ^ 0xF0 (0x0F & 0xFF) ^ 0xF0 0x0F & (0xFF ^ 0xF0)
  684. 15 255 15
  685. Testing that ^ has precedence over <<
  686. select 0xFF ^ 0xF0 << 2, (0xFF ^ 0xF0) << 2, 0xFF ^ (0xF0 << 2);
  687. 0xFF ^ 0xF0 << 2 (0xFF ^ 0xF0) << 2 0xFF ^ (0xF0 << 2)
  688. 60 60 831
  689. select 0x0F << 2 ^ 0xFF, (0x0F << 2) ^ 0xFF, 0x0F << (2 ^ 0xFF);
  690. 0x0F << 2 ^ 0xFF (0x0F << 2) ^ 0xFF 0x0F << (2 ^ 0xFF)
  691. 0 195 0
  692. Testing that ^ has precedence over >>
  693. select 0xFF ^ 0xF0 >> 2, (0xFF ^ 0xF0) >> 2, 0xFF ^ (0xF0 >> 2);
  694. 0xFF ^ 0xF0 >> 2 (0xFF ^ 0xF0) >> 2 0xFF ^ (0xF0 >> 2)
  695. 3 3 195
  696. select 0xFF >> 2 ^ 0xF0, (0xFF >> 2) ^ 0xF0, 0xFF >> (2 ^ 0xF0);
  697. 0xFF >> 2 ^ 0xF0 (0xFF >> 2) ^ 0xF0 0xFF >> (2 ^ 0xF0)
  698. 0 207 0
  699. Testing that ^ has precedence over binary +
  700. select 0xFF ^ 0xF0 + 0x0F, (0xFF ^ 0xF0) + 0x0F, 0xFF ^ (0xF0 + 0x0F);
  701. 0xFF ^ 0xF0 + 0x0F (0xFF ^ 0xF0) + 0x0F 0xFF ^ (0xF0 + 0x0F)
  702. 30 30 0
  703. select 0x0F + 0xFF ^ 0xF0, (0x0F + 0xFF) ^ 0xF0, 0x0F + (0xFF ^ 0xF0);
  704. 0x0F + 0xFF ^ 0xF0 (0x0F + 0xFF) ^ 0xF0 0x0F + (0xFF ^ 0xF0)
  705. 30 510 30
  706. Testing that ^ has precedence over binary -
  707. select 0xFF ^ 0xF0 - 1, (0xFF ^ 0xF0) - 1, 0xFF ^ (0xF0 - 1);
  708. 0xFF ^ 0xF0 - 1 (0xFF ^ 0xF0) - 1 0xFF ^ (0xF0 - 1)
  709. 14 14 16
  710. select 0x55 - 0x0F ^ 0x55, (0x55 - 0x0F) ^ 0x55, 0x55 - (0x0F ^ 0x55);
  711. 0x55 - 0x0F ^ 0x55 (0x55 - 0x0F) ^ 0x55 0x55 - (0x0F ^ 0x55)
  712. -5 19 -5
  713. Testing that ^ has precedence over *
  714. select 0xFF ^ 0xF0 * 2, (0xFF ^ 0xF0) * 2, 0xFF ^ (0xF0 * 2);
  715. 0xFF ^ 0xF0 * 2 (0xFF ^ 0xF0) * 2 0xFF ^ (0xF0 * 2)
  716. 30 30 287
  717. select 2 * 0xFF ^ 0xF0, (2 * 0xFF) ^ 0xF0, 2 * (0xFF ^ 0xF0);
  718. 2 * 0xFF ^ 0xF0 (2 * 0xFF) ^ 0xF0 2 * (0xFF ^ 0xF0)
  719. 30 270 30
  720. Testing that ^ has precedence over /
  721. select 0xFF ^ 0xF0 / 2, (0xFF ^ 0xF0) / 2, 0xFF ^ (0xF0 / 2);
  722. 0xFF ^ 0xF0 / 2 (0xFF ^ 0xF0) / 2 0xFF ^ (0xF0 / 2)
  723. 7.5000 7.5000 135
  724. select 0xF2 / 2 ^ 0xF0, (0xF2 / 2) ^ 0xF0, 0xF2 / (2 ^ 0xF0);
  725. 0xF2 / 2 ^ 0xF0 (0xF2 / 2) ^ 0xF0 0xF2 / (2 ^ 0xF0)
  726. 1.0000 137 1.0000
  727. Testing that ^ has precedence over %
  728. select 0xFF ^ 0xF0 % 0x20, (0xFF ^ 0xF0) % 0x20, 0xFF ^ (0xF0 % 0x20);
  729. 0xFF ^ 0xF0 % 0x20 (0xFF ^ 0xF0) % 0x20 0xFF ^ (0xF0 % 0x20)
  730. 15 15 239
  731. select 0xFF % 0x20 ^ 0xF0, (0xFF % 0x20) ^ 0xF0, 0xFF % (0x20 ^ 0xF0);
  732. 0xFF % 0x20 ^ 0xF0 (0xFF % 0x20) ^ 0xF0 0xFF % (0x20 ^ 0xF0)
  733. 47 239 47
  734. Testing that ^ has precedence over DIV
  735. select 0xFF ^ 0xF0 DIV 2, (0xFF ^ 0xF0) DIV 2, 0xFF ^ (0xF0 DIV 2);
  736. 0xFF ^ 0xF0 DIV 2 (0xFF ^ 0xF0) DIV 2 0xFF ^ (0xF0 DIV 2)
  737. 7 7 135
  738. select 0xF2 DIV 2 ^ 0xF0, (0xF2 DIV 2) ^ 0xF0, 0xF2 DIV (2 ^ 0xF0);
  739. 0xF2 DIV 2 ^ 0xF0 (0xF2 DIV 2) ^ 0xF0 0xF2 DIV (2 ^ 0xF0)
  740. 1 137 1
  741. Testing that ^ has precedence over MOD
  742. select 0xFF ^ 0xF0 MOD 0x20, (0xFF ^ 0xF0) MOD 0x20, 0xFF ^ (0xF0 MOD 0x20);
  743. 0xFF ^ 0xF0 MOD 0x20 (0xFF ^ 0xF0) MOD 0x20 0xFF ^ (0xF0 MOD 0x20)
  744. 15 15 239
  745. select 0xFF MOD 0x20 ^ 0xF0, (0xFF MOD 0x20) ^ 0xF0, 0xFF MOD (0x20 ^ 0xF0);
  746. 0xFF MOD 0x20 ^ 0xF0 (0xFF MOD 0x20) ^ 0xF0 0xFF MOD (0x20 ^ 0xF0)
  747. 47 239 47