where9.test 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. # 2008 December 30
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. # This file implements regression tests for SQLite library. The
  12. # focus of this file is testing the multi-index OR clause optimizer.
  13. #
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. ifcapable !or_opt||!compound {
  17. finish_test
  18. return
  19. }
  20. # Evaluate SQL. Return the result set followed by the
  21. # and the number of full-scan steps.
  22. #
  23. proc count_steps {sql} {
  24. set r [db eval $sql]
  25. lappend r scan [db status step] sort [db status sort]
  26. }
  27. # Construct test data.
  28. #
  29. do_test where9-1.1 {
  30. db eval {
  31. CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
  32. INSERT INTO t1 VALUES(1,11,1001,1.001,100.1,'bcdefghij','yxwvuts');
  33. INSERT INTO t1 VALUES(2,22,1001,2.002,100.1,'cdefghijk','yxwvuts');
  34. INSERT INTO t1 VALUES(3,33,1001,3.003,100.1,'defghijkl','xwvutsr');
  35. INSERT INTO t1 VALUES(4,44,2002,4.004,200.2,'efghijklm','xwvutsr');
  36. INSERT INTO t1 VALUES(5,55,2002,5.005,200.2,'fghijklmn','xwvutsr');
  37. INSERT INTO t1 VALUES(6,66,2002,6.006,200.2,'ghijklmno','xwvutsr');
  38. INSERT INTO t1 VALUES(7,77,3003,7.007,300.3,'hijklmnop','xwvutsr');
  39. INSERT INTO t1 VALUES(8,88,3003,8.008,300.3,'ijklmnopq','wvutsrq');
  40. INSERT INTO t1 VALUES(9,99,3003,9.009,300.3,'jklmnopqr','wvutsrq');
  41. INSERT INTO t1 VALUES(10,110,4004,10.01,400.4,'klmnopqrs','wvutsrq');
  42. INSERT INTO t1 VALUES(11,121,4004,11.011,400.4,'lmnopqrst','wvutsrq');
  43. INSERT INTO t1 VALUES(12,132,4004,12.012,400.4,'mnopqrstu','wvutsrq');
  44. INSERT INTO t1 VALUES(13,143,5005,13.013,500.5,'nopqrstuv','vutsrqp');
  45. INSERT INTO t1 VALUES(14,154,5005,14.014,500.5,'opqrstuvw','vutsrqp');
  46. INSERT INTO t1 VALUES(15,165,5005,15.015,500.5,'pqrstuvwx','vutsrqp');
  47. INSERT INTO t1 VALUES(16,176,6006,16.016,600.6,'qrstuvwxy','vutsrqp');
  48. INSERT INTO t1 VALUES(17,187,6006,17.017,600.6,'rstuvwxyz','vutsrqp');
  49. INSERT INTO t1 VALUES(18,198,6006,18.018,600.6,'stuvwxyza','utsrqpo');
  50. INSERT INTO t1 VALUES(19,209,7007,19.019,700.7,'tuvwxyzab','utsrqpo');
  51. INSERT INTO t1 VALUES(20,220,7007,20.02,700.7,'uvwxyzabc','utsrqpo');
  52. INSERT INTO t1 VALUES(21,231,7007,21.021,700.7,'vwxyzabcd','utsrqpo');
  53. INSERT INTO t1 VALUES(22,242,8008,22.022,800.8,'wxyzabcde','utsrqpo');
  54. INSERT INTO t1 VALUES(23,253,8008,23.023,800.8,'xyzabcdef','tsrqpon');
  55. INSERT INTO t1 VALUES(24,264,8008,24.024,800.8,'yzabcdefg','tsrqpon');
  56. INSERT INTO t1 VALUES(25,275,9009,25.025,900.9,'zabcdefgh','tsrqpon');
  57. INSERT INTO t1 VALUES(26,286,9009,26.026,900.9,'abcdefghi','tsrqpon');
  58. INSERT INTO t1 VALUES(27,297,9009,27.027,900.9,'bcdefghij','tsrqpon');
  59. INSERT INTO t1 VALUES(28,308,10010,28.028,1001.0,'cdefghijk','srqponm');
  60. INSERT INTO t1 VALUES(29,319,10010,29.029,1001.0,'defghijkl','srqponm');
  61. INSERT INTO t1 VALUES(30,330,10010,30.03,1001.0,'efghijklm','srqponm');
  62. INSERT INTO t1 VALUES(31,341,11011,31.031,1101.1,'fghijklmn','srqponm');
  63. INSERT INTO t1 VALUES(32,352,11011,32.032,1101.1,'ghijklmno','srqponm');
  64. INSERT INTO t1 VALUES(33,363,11011,33.033,1101.1,'hijklmnop','rqponml');
  65. INSERT INTO t1 VALUES(34,374,12012,34.034,1201.2,'ijklmnopq','rqponml');
  66. INSERT INTO t1 VALUES(35,385,12012,35.035,1201.2,'jklmnopqr','rqponml');
  67. INSERT INTO t1 VALUES(36,396,12012,36.036,1201.2,'klmnopqrs','rqponml');
  68. INSERT INTO t1 VALUES(37,407,13013,37.037,1301.3,'lmnopqrst','rqponml');
  69. INSERT INTO t1 VALUES(38,418,13013,38.038,1301.3,'mnopqrstu','qponmlk');
  70. INSERT INTO t1 VALUES(39,429,13013,39.039,1301.3,'nopqrstuv','qponmlk');
  71. INSERT INTO t1 VALUES(40,440,14014,40.04,1401.4,'opqrstuvw','qponmlk');
  72. INSERT INTO t1 VALUES(41,451,14014,41.041,1401.4,'pqrstuvwx','qponmlk');
  73. INSERT INTO t1 VALUES(42,462,14014,42.042,1401.4,'qrstuvwxy','qponmlk');
  74. INSERT INTO t1 VALUES(43,473,15015,43.043,1501.5,'rstuvwxyz','ponmlkj');
  75. INSERT INTO t1 VALUES(44,484,15015,44.044,1501.5,'stuvwxyza','ponmlkj');
  76. INSERT INTO t1 VALUES(45,495,15015,45.045,1501.5,'tuvwxyzab','ponmlkj');
  77. INSERT INTO t1 VALUES(46,506,16016,46.046,1601.6,'uvwxyzabc','ponmlkj');
  78. INSERT INTO t1 VALUES(47,517,16016,47.047,1601.6,'vwxyzabcd','ponmlkj');
  79. INSERT INTO t1 VALUES(48,528,16016,48.048,1601.6,'wxyzabcde','onmlkji');
  80. INSERT INTO t1 VALUES(49,539,17017,49.049,1701.7,'xyzabcdef','onmlkji');
  81. INSERT INTO t1 VALUES(50,550,17017,50.05,1701.7,'yzabcdefg','onmlkji');
  82. INSERT INTO t1 VALUES(51,561,17017,51.051,1701.7,'zabcdefgh','onmlkji');
  83. INSERT INTO t1 VALUES(52,572,18018,52.052,1801.8,'abcdefghi','onmlkji');
  84. INSERT INTO t1 VALUES(53,583,18018,53.053,1801.8,'bcdefghij','nmlkjih');
  85. INSERT INTO t1 VALUES(54,594,18018,54.054,1801.8,'cdefghijk','nmlkjih');
  86. INSERT INTO t1 VALUES(55,605,19019,55.055,1901.9,'defghijkl','nmlkjih');
  87. INSERT INTO t1 VALUES(56,616,19019,56.056,1901.9,'efghijklm','nmlkjih');
  88. INSERT INTO t1 VALUES(57,627,19019,57.057,1901.9,'fghijklmn','nmlkjih');
  89. INSERT INTO t1 VALUES(58,638,20020,58.058,2002.0,'ghijklmno','mlkjihg');
  90. INSERT INTO t1 VALUES(59,649,20020,59.059,2002.0,'hijklmnop','mlkjihg');
  91. INSERT INTO t1 VALUES(60,660,20020,60.06,2002.0,'ijklmnopq','mlkjihg');
  92. INSERT INTO t1 VALUES(61,671,21021,61.061,2102.1,'jklmnopqr','mlkjihg');
  93. INSERT INTO t1 VALUES(62,682,21021,62.062,2102.1,'klmnopqrs','mlkjihg');
  94. INSERT INTO t1 VALUES(63,693,21021,63.063,2102.1,'lmnopqrst','lkjihgf');
  95. INSERT INTO t1 VALUES(64,704,22022,64.064,2202.2,'mnopqrstu','lkjihgf');
  96. INSERT INTO t1 VALUES(65,715,22022,65.065,2202.2,'nopqrstuv','lkjihgf');
  97. INSERT INTO t1 VALUES(66,726,22022,66.066,2202.2,'opqrstuvw','lkjihgf');
  98. INSERT INTO t1 VALUES(67,737,23023,67.067,2302.3,'pqrstuvwx','lkjihgf');
  99. INSERT INTO t1 VALUES(68,748,23023,68.068,2302.3,'qrstuvwxy','kjihgfe');
  100. INSERT INTO t1 VALUES(69,759,23023,69.069,2302.3,'rstuvwxyz','kjihgfe');
  101. INSERT INTO t1 VALUES(70,770,24024,70.07,2402.4,'stuvwxyza','kjihgfe');
  102. INSERT INTO t1 VALUES(71,781,24024,71.071,2402.4,'tuvwxyzab','kjihgfe');
  103. INSERT INTO t1 VALUES(72,792,24024,72.072,2402.4,'uvwxyzabc','kjihgfe');
  104. INSERT INTO t1 VALUES(73,803,25025,73.073,2502.5,'vwxyzabcd','jihgfed');
  105. INSERT INTO t1 VALUES(74,814,25025,74.074,2502.5,'wxyzabcde','jihgfed');
  106. INSERT INTO t1 VALUES(75,825,25025,75.075,2502.5,'xyzabcdef','jihgfed');
  107. INSERT INTO t1 VALUES(76,836,26026,76.076,2602.6,'yzabcdefg','jihgfed');
  108. INSERT INTO t1 VALUES(77,847,26026,77.077,2602.6,'zabcdefgh','jihgfed');
  109. INSERT INTO t1 VALUES(78,858,26026,78.078,2602.6,'abcdefghi','ihgfedc');
  110. INSERT INTO t1 VALUES(79,869,27027,79.079,2702.7,'bcdefghij','ihgfedc');
  111. INSERT INTO t1 VALUES(80,880,27027,80.08,2702.7,'cdefghijk','ihgfedc');
  112. INSERT INTO t1 VALUES(81,891,27027,81.081,2702.7,'defghijkl','ihgfedc');
  113. INSERT INTO t1 VALUES(82,902,28028,82.082,2802.8,'efghijklm','ihgfedc');
  114. INSERT INTO t1 VALUES(83,913,28028,83.083,2802.8,'fghijklmn','hgfedcb');
  115. INSERT INTO t1 VALUES(84,924,28028,84.084,2802.8,'ghijklmno','hgfedcb');
  116. INSERT INTO t1 VALUES(85,935,29029,85.085,2902.9,'hijklmnop','hgfedcb');
  117. INSERT INTO t1 VALUES(86,946,29029,86.086,2902.9,'ijklmnopq','hgfedcb');
  118. INSERT INTO t1 VALUES(87,957,29029,87.087,2902.9,'jklmnopqr','hgfedcb');
  119. INSERT INTO t1 VALUES(88,968,30030,88.088,3003.0,'klmnopqrs','gfedcba');
  120. INSERT INTO t1 VALUES(89,979,30030,89.089,3003.0,'lmnopqrst','gfedcba');
  121. INSERT INTO t1 VALUES(90,NULL,30030,90.09,3003.0,'mnopqrstu','gfedcba');
  122. INSERT INTO t1 VALUES(91,1001,NULL,91.091,3103.1,'nopqrstuv','gfedcba');
  123. INSERT INTO t1 VALUES(92,1012,31031,NULL,3103.1,'opqrstuvw','gfedcba');
  124. INSERT INTO t1 VALUES(93,1023,31031,93.093,NULL,'pqrstuvwx','fedcbaz');
  125. INSERT INTO t1 VALUES(94,1034,32032,94.094,3203.2,NULL,'fedcbaz');
  126. INSERT INTO t1 VALUES(95,1045,32032,95.095,3203.2,'rstuvwxyz',NULL);
  127. INSERT INTO t1 VALUES(96,NULL,NULL,96.096,3203.2,'stuvwxyza','fedcbaz');
  128. INSERT INTO t1 VALUES(97,1067,33033,NULL,NULL,'tuvwxyzab','fedcbaz');
  129. INSERT INTO t1 VALUES(98,1078,33033,98.098,3303.3,NULL,NULL);
  130. INSERT INTO t1 VALUES(99,NULL,NULL,NULL,NULL,NULL,NULL);
  131. CREATE INDEX t1b ON t1(b);
  132. CREATE INDEX t1c ON t1(c);
  133. CREATE INDEX t1d ON t1(d);
  134. CREATE INDEX t1e ON t1(e);
  135. CREATE INDEX t1f ON t1(f);
  136. CREATE INDEX t1g ON t1(g);
  137. CREATE TABLE t2(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
  138. INSERT INTO t2 SELECT * FROM t1;
  139. CREATE INDEX t2b ON t2(b,c);
  140. CREATE INDEX t2c ON t2(c,e);
  141. CREATE INDEX t2d ON t2(d,g);
  142. CREATE INDEX t2e ON t2(e,f,g);
  143. CREATE INDEX t2f ON t2(f,b,d,c);
  144. CREATE INDEX t2g ON t2(g,f);
  145. CREATE TABLE t3(x,y);
  146. INSERT INTO t3 VALUES(1,80);
  147. INSERT INTO t3 VALUES(2,80);
  148. CREATE TABLE t4(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
  149. INSERT INTO t4 SELECT * FROM t1;
  150. CREATE INDEX t4b ON t4(b);
  151. CREATE INDEX t4c ON t4(c);
  152. }
  153. } {}
  154. do_test where9-1.2.1 {
  155. count_steps {
  156. SELECT a FROM t1
  157. WHERE b IS NULL
  158. OR c IS NULL
  159. OR d IS NULL
  160. ORDER BY a
  161. }
  162. } {90 91 92 96 97 99 scan 0 sort 1}
  163. do_test where9-1.2.2 {
  164. count_steps {
  165. SELECT a FROM t1
  166. WHERE +b IS NULL
  167. OR c IS NULL
  168. OR d IS NULL
  169. ORDER BY a
  170. }
  171. } {90 91 92 96 97 99 scan 98 sort 0}
  172. do_test where9-1.2.3 {
  173. count_steps {
  174. SELECT a FROM t1
  175. WHERE b IS NULL
  176. OR +c IS NULL
  177. OR d IS NULL
  178. ORDER BY a
  179. }
  180. } {90 91 92 96 97 99 scan 98 sort 0}
  181. do_test where9-1.2.4 {
  182. count_steps {
  183. SELECT a FROM t1
  184. WHERE b IS NULL
  185. OR c IS NULL
  186. OR +d IS NULL
  187. ORDER BY a
  188. }
  189. } {90 91 92 96 97 99 scan 98 sort 0}
  190. do_test where9-1.2.5 {
  191. count_steps {
  192. SELECT a FROM t4
  193. WHERE b IS NULL
  194. OR c IS NULL
  195. OR d IS NULL
  196. ORDER BY a
  197. }
  198. } {90 91 92 96 97 99 scan 98 sort 0}
  199. do_test where9-1.3.1 {
  200. count_steps {
  201. SELECT a FROM t1
  202. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  203. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  204. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  205. ORDER BY a
  206. }
  207. } {90 91 92 97 scan 0 sort 1}
  208. do_test where9-1.3.2 {
  209. count_steps {
  210. SELECT a FROM t4
  211. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  212. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  213. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  214. ORDER BY a
  215. }
  216. } {90 91 92 97 scan 98 sort 0}
  217. do_test where9-1.3.3 {
  218. count_steps {
  219. SELECT a FROM t4
  220. WHERE (b NOT NULL AND c NOT NULL AND d IS NULL)
  221. OR (b IS NULL AND c NOT NULL AND d NOT NULL)
  222. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  223. ORDER BY a
  224. }
  225. } {90 91 92 97 scan 98 sort 0}
  226. do_test where9-1.3.4 {
  227. count_steps {
  228. SELECT a FROM (t4)
  229. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  230. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  231. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  232. ORDER BY a
  233. }
  234. } {90 91 92 97 scan 98 sort 0}
  235. do_test where9-1.4 {
  236. count_steps {
  237. SELECT a FROM t1
  238. WHERE (b>=950 AND b<=1010) OR (b IS NULL AND c NOT NULL)
  239. ORDER BY a
  240. }
  241. } {87 88 89 90 91 scan 0 sort 1}
  242. do_test where9-1.5 {
  243. # When this test was originally written, SQLite used a rowset object
  244. # to optimize the "ORDER BY a" clause. Now that it is using a rowhash,
  245. # this is not possible. So we have to comment out one term of the OR
  246. # expression in order to prevent SQLite from deeming a full-table
  247. # scan to be a better strategy than using multiple indexes, which would
  248. # defeat the point of the test.
  249. count_steps {
  250. SELECT a FROM t1
  251. WHERE a=83
  252. OR b=913
  253. OR c=28028
  254. OR (d>=82 AND d<83)
  255. /* OR (e>2802 AND e<2803) */
  256. OR f='fghijklmn'
  257. OR g='hgfedcb'
  258. ORDER BY a
  259. }
  260. } {5 31 57 82 83 84 85 86 87 scan 0 sort 1}
  261. do_test where9-1.6 {
  262. count_steps {
  263. SELECT a FROM t1
  264. WHERE b=1012
  265. OR (d IS NULL AND e IS NOT NULL)
  266. }
  267. } {92 scan 0 sort 0}
  268. do_test where9-1.7 {
  269. count_steps {
  270. SELECT a FROM t1
  271. WHERE (b=1012 OR (d IS NULL AND e IS NOT NULL))
  272. AND f!=g
  273. }
  274. } {92 scan 0 sort 0}
  275. do_test where9-1.8 {
  276. count_steps {
  277. SELECT a FROM t1
  278. WHERE (b=1012 OR (d IS NULL AND e IS NOT NULL))
  279. AND f==g
  280. }
  281. } {scan 0 sort 0}
  282. do_test where9-2.1 {
  283. count_steps {
  284. SELECT t2.a FROM t1, t2
  285. WHERE t1.a=80
  286. AND (t1.c=t2.c OR t1.d=t2.d)
  287. ORDER BY 1
  288. }
  289. } {79 80 81 scan 0 sort 1}
  290. do_test where9-2.2 {
  291. count_steps {
  292. SELECT t2.a FROM t1, t2
  293. WHERE t1.a=80
  294. AND ((t1.c=t2.c AND t1.d=t2.d) OR t1.f=t2.f)
  295. ORDER BY 1
  296. }
  297. } {2 28 54 80 scan 0 sort 1}
  298. do_test where9-2.3 {
  299. count_steps {
  300. SELECT coalesce(t2.a,9999)
  301. FROM t1 LEFT JOIN t2 ON (t1.c=t2.c AND t1.d=t2.d) OR t1.f=t2.f
  302. WHERE t1.a=80
  303. ORDER BY 1
  304. }
  305. } {2 28 54 80 scan 0 sort 1}
  306. do_test where9-2.4 {
  307. count_steps {
  308. SELECT coalesce(t2.a,9999)
  309. FROM t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f
  310. WHERE t1.a=80
  311. ORDER BY 1
  312. }
  313. } {9999 scan 0 sort 1}
  314. do_test where9-2.5 {
  315. count_steps {
  316. SELECT t1.a, coalesce(t2.a,9999)
  317. FROM t1 LEFT JOIN t2 ON (t1.c=t2.c AND t1.d=t2.d) OR (t1.f)=t2.f
  318. WHERE t1.a=80 OR t1.b=880 OR (t1.c=27027 AND round(t1.d)==80)
  319. ORDER BY 1
  320. }
  321. } {80 80 80 2 80 28 80 54 scan 0 sort 1}
  322. do_test where9-2.6 {
  323. count_steps {
  324. SELECT t1.a, coalesce(t2.a,9999)
  325. FROM t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f
  326. WHERE t1.a=80 OR t1.b=880 OR (t1.c=27027 AND round(t1.d)==80)
  327. ORDER BY 1
  328. }
  329. } {80 9999 scan 0 sort 1}
  330. do_test where9-2.7 {
  331. count_steps {
  332. SELECT t3.x, t1.a, coalesce(t2.a,9999)
  333. FROM t3 JOIN
  334. t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f
  335. WHERE t1.a=t3.y OR t1.b=t3.y*11 OR (t1.c=27027 AND round(t1.d)==80)
  336. ORDER BY 1, 2
  337. }
  338. } {1 80 9999 2 80 9999 scan 1 sort 1}
  339. do_test where9-2.8 {
  340. count_steps {
  341. SELECT t3.x, t1.a, coalesce(t2.a,9999)
  342. FROM t3 JOIN
  343. t1 LEFT JOIN t2 ON (t1.c=t2.c AND t1.d=t2.d) OR (t1.f)=t2.f
  344. WHERE t1.a=t3.y OR t1.b=t3.y*11 OR (t1.c=27027 AND round(t1.d)==80)
  345. ORDER BY 1, 2, 3
  346. }
  347. } {1 80 2 1 80 28 1 80 54 1 80 80 2 80 2 2 80 28 2 80 54 2 80 80 scan 1 sort 1}
  348. ifcapable explain {
  349. do_execsql_test where9-3.1 {
  350. EXPLAIN QUERY PLAN
  351. SELECT t2.a FROM t1, t2
  352. WHERE t1.a=80 AND ((t1.c=t2.c AND t1.d=t2.d) OR t1.f=t2.f)
  353. } {
  354. 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)}
  355. 0 1 1 {SEARCH TABLE t2 USING INDEX t2d (d=?)}
  356. 0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)}
  357. }
  358. do_execsql_test where9-3.2 {
  359. EXPLAIN QUERY PLAN
  360. SELECT coalesce(t2.a,9999)
  361. FROM t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f
  362. WHERE t1.a=80
  363. } {
  364. 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)}
  365. 0 1 1 {SEARCH TABLE t2 USING INDEX t2d (d=?)}
  366. 0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)}
  367. }
  368. }
  369. # Make sure that INDEXED BY and multi-index OR clauses play well with
  370. # one another.
  371. #
  372. do_test where9-4.1 {
  373. count_steps {
  374. SELECT a FROM t1
  375. WHERE b>1000
  376. AND (c=31031 OR d IS NULL)
  377. ORDER BY +a
  378. }
  379. } {92 93 97 scan 0 sort 1}
  380. do_test where9-4.2 {
  381. count_steps {
  382. SELECT a FROM t1
  383. WHERE b>1000
  384. AND (c=31031 OR +d IS NULL)
  385. ORDER BY +a
  386. }
  387. } {92 93 97 scan 0 sort 1}
  388. do_test where9-4.3 {
  389. count_steps {
  390. SELECT a FROM t1
  391. WHERE +b>1000
  392. AND (c=31031 OR d IS NULL)
  393. ORDER BY +a
  394. }
  395. } {92 93 97 scan 0 sort 1}
  396. do_test where9-4.4 {
  397. count_steps {
  398. SELECT a FROM t1 INDEXED BY t1b
  399. WHERE b>1000
  400. AND (c=31031 OR d IS NULL)
  401. ORDER BY +a
  402. }
  403. } {92 93 97 scan 0 sort 1}
  404. do_test where9-4.5 {
  405. catchsql {
  406. SELECT a FROM t1 INDEXED BY t1b
  407. WHERE +b>1000
  408. AND (c=31031 OR d IS NULL)
  409. ORDER BY +a
  410. }
  411. } {1 {no query solution}}
  412. do_test where9-4.6 {
  413. count_steps {
  414. SELECT a FROM t1 NOT INDEXED
  415. WHERE b>1000
  416. AND (c=31031 OR d IS NULL)
  417. ORDER BY +a
  418. }
  419. } {92 93 97 scan 98 sort 1}
  420. do_test where9-4.7 {
  421. catchsql {
  422. SELECT a FROM t1 INDEXED BY t1c
  423. WHERE b>1000
  424. AND (c=31031 OR d IS NULL)
  425. ORDER BY +a
  426. }
  427. } {1 {no query solution}}
  428. do_test where9-4.8 {
  429. catchsql {
  430. SELECT a FROM t1 INDEXED BY t1d
  431. WHERE b>1000
  432. AND (c=31031 OR d IS NULL)
  433. ORDER BY +a
  434. }
  435. } {1 {no query solution}}
  436. ifcapable explain {
  437. # The (c=31031 OR d IS NULL) clause is preferred over b>1000 because
  438. # the former is an equality test which is expected to return fewer rows.
  439. #
  440. do_execsql_test where9-5.1 {
  441. EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>1000 AND (c=31031 OR d IS NULL)
  442. } {
  443. 0 0 0 {SEARCH TABLE t1 USING INDEX t1c (c=?)}
  444. 0 0 0 {SEARCH TABLE t1 USING INDEX t1d (d=?)}
  445. }
  446. # In contrast, b=1000 is preferred over any OR-clause.
  447. #
  448. do_execsql_test where9-5.2 {
  449. EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b=1000 AND (c=31031 OR d IS NULL)
  450. } {
  451. 0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?)}
  452. }
  453. # Likewise, inequalities in an AND are preferred over inequalities in
  454. # an OR.
  455. #
  456. do_execsql_test where9-5.3 {
  457. EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>1000 AND (c>=31031 OR d IS NULL)
  458. } {
  459. 0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b>?)}
  460. }
  461. }
  462. ############################################################################
  463. # Make sure OR-clauses work correctly on UPDATE and DELETE statements.
  464. do_test where9-6.2.1 {
  465. db eval {SELECT count(*) FROM t1 UNION ALL SELECT a FROM t1 WHERE a>=85}
  466. } {99 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99}
  467. do_test where9-6.2.2 { ;# Deletes entries 90 91 92 96 97 99
  468. count_steps {
  469. BEGIN;
  470. DELETE FROM t1
  471. WHERE b IS NULL
  472. OR c IS NULL
  473. OR d IS NULL
  474. }
  475. } {scan 0 sort 0}
  476. do_test where9-6.2.3 {
  477. db eval {
  478. SELECT count(*) FROM t1 UNION ALL
  479. SELECT a FROM t1 WHERE a>=85;
  480. ROLLBACK;
  481. }
  482. } {93 85 86 87 88 89 93 94 95 98}
  483. do_test where9-6.2.4 { ;# Deletes entries 90 91 92 96 97 99
  484. count_steps {
  485. BEGIN;
  486. DELETE FROM t1
  487. WHERE +b IS NULL
  488. OR c IS NULL
  489. OR d IS NULL
  490. }
  491. } {scan 98 sort 0}
  492. do_test where9-6.2.5 {
  493. db eval {
  494. SELECT count(*) FROM t1 UNION ALL
  495. SELECT a FROM t1 WHERE a>=85;
  496. ROLLBACK;
  497. }
  498. } {93 85 86 87 88 89 93 94 95 98}
  499. do_test where9-6.2.6 {
  500. count_steps {
  501. BEGIN;
  502. UPDATE t1 SET a=a+100
  503. WHERE (b IS NULL
  504. OR c IS NULL
  505. OR d IS NULL)
  506. AND a!=92
  507. AND a!=97
  508. }
  509. } {scan 0 sort 0} ;# Add 100 to entries 90 91 96 99
  510. do_test where9-6.2.7 {
  511. db eval {
  512. SELECT count(*) FROM t1 UNION ALL
  513. SELECT a FROM t1 WHERE a>=85;
  514. ROLLBACK
  515. }
  516. } {99 85 86 87 88 89 92 93 94 95 97 98 190 191 196 199}
  517. do_test where9-6.2.8 { ;# Deletes entries 90 91 92 97 99
  518. count_steps {
  519. BEGIN;
  520. DELETE FROM t1
  521. WHERE (b IS NULL
  522. OR c IS NULL
  523. OR d IS NULL)
  524. AND a!=96
  525. }
  526. } {scan 0 sort 0}
  527. do_test where9-6.2.9 {
  528. db eval {
  529. SELECT count(*) FROM t1 UNION ALL SELECT a FROM t1 WHERE a>=85;
  530. ROLLBACK;
  531. }
  532. } {94 85 86 87 88 89 93 94 95 96 98}
  533. do_test where9-6.3.1 {
  534. count_steps {
  535. BEGIN;
  536. DELETE FROM t1
  537. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  538. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  539. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  540. }
  541. } {scan 0 sort 0} ;# DELETEs rows 90 91 92 97
  542. do_test where9-6.3.2 {
  543. db eval {
  544. SELECT count(*) FROM t1 UNION ALL
  545. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  546. ROLLBACK;
  547. }
  548. } {95 85 86 87 88 89 93 94 95 96 98 99}
  549. do_test where9-6.3.3 {
  550. count_steps {
  551. BEGIN;
  552. UPDATE t1 SET a=a+100
  553. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  554. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  555. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  556. }
  557. } {scan 0 sort 0} ;# Add 100 to rowids 90 91 92 97
  558. do_test where9-6.3.4 {
  559. db eval {
  560. SELECT count(*) FROM t1 UNION ALL
  561. SELECT a FROM t1 WHERE a BETWEEN 85 AND 200;
  562. ROLLBACK;
  563. }
  564. } {99 85 86 87 88 89 93 94 95 96 98 99 190 191 192 197}
  565. do_test where9-6.3.5 {
  566. count_steps {
  567. BEGIN;
  568. DELETE FROM t1
  569. WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
  570. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  571. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  572. }
  573. } {scan 98 sort 0} ;# DELETEs rows 90 91 92 97
  574. do_test where9-6.3.6 {
  575. db eval {
  576. SELECT count(*) FROM t1 UNION ALL
  577. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  578. ROLLBACK;
  579. }
  580. } {95 85 86 87 88 89 93 94 95 96 98 99}
  581. do_test where9-6.3.7 {
  582. count_steps {
  583. BEGIN;
  584. UPDATE t1 SET a=a+100
  585. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  586. OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
  587. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  588. }
  589. } {scan 98 sort 0} ;# Add 100 to rowids 90 91 92 97
  590. do_test where9-6.3.8 {
  591. db eval {
  592. SELECT count(*) FROM t1 UNION ALL
  593. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  594. ROLLBACK;
  595. }
  596. } {99 85 86 87 88 89 93 94 95 96 98 99}
  597. do_test where9-6.4.1 {
  598. count_steps {
  599. BEGIN;
  600. DELETE FROM t1
  601. WHERE (b>=950 AND b<=1010) OR (b IS NULL AND c NOT NULL)
  602. }
  603. } {scan 0 sort 0} ;# DELETE rows 87 88 89 90 91
  604. do_test where9-6.4.2 {
  605. db eval {
  606. SELECT count(*) FROM t1 UNION ALL
  607. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  608. ROLLBACK;
  609. }
  610. } {94 85 86 92 93 94 95 96 97 98 99}
  611. do_test where9-6.4.3 {
  612. count_steps {
  613. BEGIN;
  614. UPDATE t1 SET a=a+100
  615. WHERE (b>=950 AND b<=1010) OR (b IS NULL AND c NOT NULL)
  616. }
  617. } {scan 0 sort 0} ;# Add 100 to rowids 87 88 89 90 91
  618. do_test where9-6.4.4 {
  619. db eval {
  620. SELECT count(*) FROM t1 UNION ALL
  621. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  622. ROLLBACK;
  623. }
  624. } {99 85 86 92 93 94 95 96 97 98 99}
  625. do_test where9-6.5.1 {
  626. count_steps {
  627. BEGIN;
  628. DELETE FROM t1
  629. WHERE a=83
  630. OR b=913
  631. OR c=28028
  632. OR (d>=82 AND d<83)
  633. OR (e>2802 AND e<2803)
  634. OR f='fghijklmn'
  635. OR g='hgfedcb'
  636. }
  637. } {scan 0 sort 0} ;# DELETE rows 5 31 57 82 83 84 85 86 87
  638. do_test where9-6.5.2 {
  639. db eval {
  640. SELECT count(*) FROM t1 UNION ALL
  641. SELECT a FROM t1 WHERE a IN (5,31,57,82,83,84,85,86,87);
  642. ROLLBACK;
  643. }
  644. } {90}
  645. do_test where9-6.5.3 {
  646. count_steps {
  647. BEGIN;
  648. UPDATE t1 SET a=a+100
  649. WHERE a=83
  650. OR b=913
  651. OR c=28028
  652. OR (d>=82 AND d<83)
  653. OR (e>2802 AND e<2803)
  654. OR f='fghijklmn'
  655. OR g='hgfedcb'
  656. }
  657. } {scan 0 sort 0} ;# Add 100 to rowids 5 31 57 82 83 84 85 86 87
  658. do_test where9-6.5.4 {
  659. db eval {
  660. SELECT count(*) FROM t1 UNION ALL
  661. SELECT a FROM t1 WHERE a%100 IN (5,31,57,82,83,84,85,86,87) ORDER BY rowid;
  662. ROLLBACK;
  663. }
  664. } {99 105 131 157 182 183 184 185 186 187}
  665. do_test where9-6.6.1 {
  666. count_steps {
  667. BEGIN;
  668. DELETE FROM t1
  669. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  670. OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
  671. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  672. }
  673. } {scan 98 sort 0} ;# DELETEs rows 90 91 92 97
  674. do_test where9-6.6.2 {
  675. db eval {
  676. SELECT count(*) FROM t1 UNION ALL
  677. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  678. ROLLBACK;
  679. }
  680. } {95 85 86 87 88 89 93 94 95 96 98 99}
  681. do_test where9-6.6.3 {
  682. count_steps {
  683. BEGIN;
  684. UPDATE t1 SET a=a+100
  685. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  686. OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
  687. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  688. }
  689. } {scan 98 sort 0} ;# Add 100 to rowids 90 91 92 97
  690. do_test where9-6.6.4 {
  691. db eval {
  692. SELECT count(*) FROM t1 UNION ALL
  693. SELECT a FROM t1 WHERE a BETWEEN 85 AND 200;
  694. ROLLBACK;
  695. }
  696. } {99 85 86 87 88 89 93 94 95 96 98 99 190 191 192 197}
  697. do_test where9-6.7.1 {
  698. count_steps {
  699. BEGIN;
  700. DELETE FROM t1 NOT INDEXED
  701. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  702. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  703. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  704. }
  705. } {scan 98 sort 0} ;# DELETEs rows 90 91 92 97
  706. do_test where9-6.7.2 {
  707. db eval {
  708. SELECT count(*) FROM t1 UNION ALL
  709. SELECT a FROM t1 WHERE a BETWEEN 85 AND 100;
  710. ROLLBACK;
  711. }
  712. } {95 85 86 87 88 89 93 94 95 96 98 99}
  713. do_test where9-6.7.3 {
  714. count_steps {
  715. BEGIN;
  716. UPDATE t1 NOT INDEXED SET a=a+100
  717. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  718. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  719. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  720. }
  721. } {scan 98 sort 0} ;# Add 100 to rowids 90 91 92 97
  722. do_test where9-6.7.4 {
  723. db eval {
  724. SELECT count(*) FROM t1 UNION ALL
  725. SELECT a FROM t1 WHERE a BETWEEN 85 AND 200;
  726. ROLLBACK;
  727. }
  728. } {99 85 86 87 88 89 93 94 95 96 98 99 190 191 192 197}
  729. do_test where9-6.8.1 {
  730. catchsql {
  731. DELETE FROM t1 INDEXED BY t1b
  732. WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
  733. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  734. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  735. }
  736. } {1 {no query solution}}
  737. do_test where9-6.8.2 {
  738. catchsql {
  739. UPDATE t1 INDEXED BY t1b SET a=a+100
  740. WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
  741. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  742. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  743. }
  744. } {1 {no query solution}}
  745. ifcapable stat4||stat3 {
  746. # When STAT3 is enabled, the "b NOT NULL" terms get translated
  747. # into b>NULL, which can be satified by the index t1b. It is a very
  748. # expensive way to do the query, but it works, and so a solution is possible.
  749. do_test where9-6.8.3-stat4 {
  750. catchsql {
  751. UPDATE t1 INDEXED BY t1b SET a=a+100
  752. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  753. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  754. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  755. }
  756. } {0 {}}
  757. do_test where9-6.8.4-stat4 {
  758. catchsql {
  759. DELETE FROM t1 INDEXED BY t1b
  760. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  761. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  762. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  763. }
  764. } {0 {}}
  765. } else {
  766. do_test where9-6.8.3 {
  767. catchsql {
  768. UPDATE t1 INDEXED BY t1b SET a=a+100
  769. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  770. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  771. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  772. }
  773. } {1 {no query solution}}
  774. do_test where9-6.8.4 {
  775. catchsql {
  776. DELETE FROM t1 INDEXED BY t1b
  777. WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
  778. OR (b NOT NULL AND c IS NULL AND d NOT NULL)
  779. OR (b NOT NULL AND c NOT NULL AND d IS NULL)
  780. }
  781. } {1 {no query solution}}
  782. }
  783. ############################################################################
  784. # Test cases where terms inside an OR series are combined with AND terms
  785. # external to the OR clause. In other words, cases where
  786. #
  787. # x AND (y OR z)
  788. #
  789. # is able to use indices on x,y and x,z, or indices y,x and z,x.
  790. #
  791. do_test where9-7.0 {
  792. execsql {
  793. CREATE TABLE t5(a, b, c, d, e, f, g, x, y);
  794. INSERT INTO t5
  795. SELECT a, b, c, e, d, f, g,
  796. CASE WHEN (a&1)!=0 THEN 'y' ELSE 'n' END,
  797. CASE WHEN (a&2)!=0 THEN 'y' ELSE 'n' END
  798. FROM t1;
  799. CREATE INDEX t5xb ON t5(x, b);
  800. CREATE INDEX t5xc ON t5(x, c);
  801. CREATE INDEX t5xd ON t5(x, d);
  802. CREATE INDEX t5xe ON t5(x, e);
  803. CREATE INDEX t5xf ON t5(x, f);
  804. CREATE INDEX t5xg ON t5(x, g);
  805. CREATE INDEX t5yb ON t5(y, b);
  806. CREATE INDEX t5yc ON t5(y, c);
  807. CREATE INDEX t5yd ON t5(y, d);
  808. CREATE INDEX t5ye ON t5(y, e);
  809. CREATE INDEX t5yf ON t5(y, f);
  810. CREATE INDEX t5yg ON t5(y, g);
  811. CREATE TABLE t6(a, b, c, e, d, f, g, x, y);
  812. INSERT INTO t6 SELECT * FROM t5;
  813. ANALYZE t5;
  814. }
  815. ifcapable stat3 {
  816. sqlite3 db2 test.db
  817. db2 eval { DROP TABLE IF EXISTS sqlite_stat3 }
  818. db2 close
  819. }
  820. } {}
  821. do_test where9-7.1.1 {
  822. count_steps {
  823. SELECT a FROM t5 WHERE x='y' AND (b=913 OR c=27027) ORDER BY a;
  824. }
  825. } {79 81 83 scan 0 sort 1}
  826. do_test where9-7.1.2 {
  827. execsql {
  828. SELECT a FROM t6 WHERE x='y' AND (b=913 OR c=27027) ORDER BY a;
  829. }
  830. } {79 81 83}
  831. do_test where9-7.1.3 {
  832. count_steps {
  833. SELECT a FROM t5 WHERE x='n' AND (b=913 OR c=27027) ORDER BY a;
  834. }
  835. } {80 scan 0 sort 1}
  836. do_test where9-7.1.4 {
  837. execsql {
  838. SELECT a FROM t6 WHERE x='n' AND (b=913 OR c=27027) ORDER BY a;
  839. }
  840. } {80}
  841. do_test where9-7.2.1 {
  842. count_steps {
  843. SELECT a FROM t5 WHERE (x='y' OR y='y') AND b=913 ORDER BY a;
  844. }
  845. } {83 scan 0 sort 1}
  846. do_test where9-7.2.2 {
  847. execsql {
  848. SELECT a FROM t6 WHERE (x='y' OR y='y') AND b=913 ORDER BY a;
  849. }
  850. } {83}
  851. do_test where9-7.3.1 {
  852. count_steps {
  853. SELECT a FROM t5 WHERE (x='y' OR y='y') AND c=27027 ORDER BY a;
  854. }
  855. } {79 81 scan 0 sort 1}
  856. do_test where9-7.3.2 {
  857. execsql {
  858. SELECT a FROM t6 WHERE (x='y' OR y='y') AND c=27027 ORDER BY a;
  859. }
  860. } {79 81}
  861. # Fix for ticket [b7c8682cc17f32903f03a610bd0d35ffd3c1e6e4]
  862. # "Incorrect result from LEFT JOIN with OR in the WHERE clause"
  863. #
  864. do_test where9-8.1 {
  865. db eval {
  866. CREATE TABLE t81(a INTEGER PRIMARY KEY, b, c, d);
  867. CREATE TABLE t82(x INTEGER PRIMARY KEY, y);
  868. CREATE TABLE t83(p INTEGER PRIMARY KEY, q);
  869. INSERT INTO t81 VALUES(2,3,4,5);
  870. INSERT INTO t81 VALUES(3,4,5,6);
  871. INSERT INTO t82 VALUES(2,4);
  872. INSERT INTO t83 VALUES(5,55);
  873. SELECT *
  874. FROM t81 LEFT JOIN t82 ON y=b JOIN t83
  875. WHERE c==p OR d==p
  876. ORDER BY +a;
  877. }
  878. } {2 3 4 5 {} {} 5 55 3 4 5 6 2 4 5 55}
  879. do_test where9-8.2 {
  880. db eval {
  881. SELECT *
  882. FROM t81 LEFT JOIN (t82) ON y=b JOIN t83
  883. WHERE c==p OR d==p
  884. ORDER BY +a;
  885. }
  886. } {2 3 4 5 {} {} 5 55 3 4 5 6 2 4 5 55}
  887. do_test where9-8.3 {
  888. db eval {
  889. SELECT *
  890. FROM (t81) LEFT JOIN (main.t82) ON y=b JOIN t83
  891. WHERE c==p OR d==p
  892. ORDER BY +a;
  893. }
  894. } {2 3 4 5 {} {} 5 55 3 4 5 6 2 4 5 55}
  895. # Fix for ticket [f2369304e47167e3e644e2f1fe9736063391d7b7]
  896. # Incorrect results when OR is used in the ON clause of a LEFT JOIN
  897. #
  898. do_test where9-9.1 {
  899. db eval {
  900. CREATE TABLE t91(x); INSERT INTO t91 VALUES(1);
  901. CREATE TABLE t92(y INTEGER PRIMARY KEY,a,b);
  902. INSERT INTO t92 VALUES(1,2,3);
  903. SELECT 1 FROM t91 LEFT JOIN t92 ON a=2 OR b=3;
  904. SELECT 2 FROM t91 LEFT JOIN t92 ON a=2 AND b=3;
  905. SELECT 3 FROM t91 LEFT JOIN t92 ON (a=2 OR b=3) AND y IS NULL;
  906. SELECT 4 FROM t91 LEFT JOIN t92 ON (a=2 AND b=3) AND y IS NULL;
  907. CREATE TEMP TABLE x9 AS SELECT * FROM t91 LEFT JOIN t92 ON a=2 OR b=3;
  908. SELECT 5 FROM x9 WHERE y IS NULL;
  909. SELECT 6 FROM t91 LEFT JOIN t92 ON a=2 OR b=3 WHERE y IS NULL;
  910. SELECT 7 FROM t91 LEFT JOIN t92 ON a=2 AND b=3 WHERE y IS NULL;
  911. SELECT 8 FROM t91 LEFT JOIN t92 ON a=22 OR b=33 WHERE y IS NULL;
  912. SELECT 9 FROM t91 LEFT JOIN t92 ON a=22 AND b=33 WHERE y IS NULL;
  913. }
  914. } {1 2 3 4 8 9}
  915. # Fix for ticket [bc878246eafe0f52c519e29049b2fe4a99491b27]
  916. # Incorrect result when OR is used in a join to the right of a LEFT JOIN
  917. #
  918. do_test where9-10.1 {
  919. db eval {
  920. CREATE TABLE t101 (id INTEGER PRIMARY KEY);
  921. INSERT INTO t101 VALUES (1);
  922. SELECT * FROM t101 AS t0
  923. LEFT JOIN t101 AS t1 ON t1.id BETWEEN 10 AND 20
  924. JOIN t101 AS t2 ON (t2.id = t0.id OR (t2.id<>555 AND t2.id=t1.id));
  925. }
  926. } {1 {} 1}
  927. do_test where9-10.2 {
  928. db eval {
  929. CREATE TABLE t102 (id TEXT UNIQUE NOT NULL);
  930. INSERT INTO t102 VALUES ('1');
  931. SELECT * FROM t102 AS t0
  932. LEFT JOIN t102 AS t1 ON t1.id GLOB 'abc%'
  933. JOIN t102 AS t2 ON (t2.id = t0.id OR (t2.id<>555 AND t2.id=t1.id));
  934. }
  935. } {1 {} 1}
  936. finish_test