selectB.test 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. # 2008 June 24
  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.
  12. #
  13. # $Id: selectB.test,v 1.10 2009/04/02 16:59:47 drh Exp $
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. ifcapable !compound {
  17. finish_test
  18. return
  19. }
  20. proc test_transform {testname sql1 sql2 results} {
  21. set ::vdbe1 [list]
  22. set ::vdbe2 [list]
  23. db eval "explain $sql1" { lappend ::vdbe1 $opcode }
  24. db eval "explain $sql2" { lappend ::vdbe2 $opcode }
  25. do_test $testname.transform {
  26. set ::vdbe1
  27. } $::vdbe2
  28. set ::sql1 $sql1
  29. do_test $testname.sql1 {
  30. execsql $::sql1
  31. } $results
  32. set ::sql2 $sql2
  33. do_test $testname.sql2 {
  34. execsql $::sql2
  35. } $results
  36. }
  37. do_test selectB-1.1 {
  38. execsql {
  39. CREATE TABLE t1(a, b, c);
  40. CREATE TABLE t2(d, e, f);
  41. INSERT INTO t1 VALUES( 2, 4, 6);
  42. INSERT INTO t1 VALUES( 8, 10, 12);
  43. INSERT INTO t1 VALUES(14, 16, 18);
  44. INSERT INTO t2 VALUES(3, 6, 9);
  45. INSERT INTO t2 VALUES(12, 15, 18);
  46. INSERT INTO t2 VALUES(21, 24, 27);
  47. }
  48. } {}
  49. for {set ii 1} {$ii <= 2} {incr ii} {
  50. if {$ii == 2} {
  51. do_test selectB-2.1 {
  52. execsql {
  53. CREATE INDEX i1 ON t1(a);
  54. CREATE INDEX i2 ON t2(d);
  55. }
  56. } {}
  57. }
  58. test_transform selectB-$ii.2 {
  59. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  60. } {
  61. SELECT a FROM t1 UNION ALL SELECT d FROM t2
  62. } {2 8 14 3 12 21}
  63. test_transform selectB-$ii.3 {
  64. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
  65. } {
  66. SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
  67. } {2 3 8 12 14 21}
  68. test_transform selectB-$ii.4 {
  69. SELECT * FROM
  70. (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  71. WHERE a>10 ORDER BY 1
  72. } {
  73. SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
  74. } {12 14 21}
  75. test_transform selectB-$ii.5 {
  76. SELECT * FROM
  77. (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  78. WHERE a>10 ORDER BY a
  79. } {
  80. SELECT a FROM t1 WHERE a>10
  81. UNION ALL
  82. SELECT d FROM t2 WHERE d>10
  83. ORDER BY a
  84. } {12 14 21}
  85. test_transform selectB-$ii.6 {
  86. SELECT * FROM
  87. (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12)
  88. WHERE a>10 ORDER BY a
  89. } {
  90. SELECT a FROM t1 WHERE a>10
  91. UNION ALL
  92. SELECT d FROM t2 WHERE d>12 AND d>10
  93. ORDER BY a
  94. } {14 21}
  95. test_transform selectB-$ii.7 {
  96. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
  97. LIMIT 2
  98. } {
  99. SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
  100. } {2 3}
  101. test_transform selectB-$ii.8 {
  102. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
  103. LIMIT 2 OFFSET 3
  104. } {
  105. SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
  106. } {12 14}
  107. test_transform selectB-$ii.9 {
  108. SELECT * FROM (
  109. SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
  110. )
  111. } {
  112. SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
  113. } {2 8 14 3 12 21 6 12 18}
  114. test_transform selectB-$ii.10 {
  115. SELECT * FROM (
  116. SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
  117. ) ORDER BY 1
  118. } {
  119. SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
  120. ORDER BY 1
  121. } {2 3 6 8 12 12 14 18 21}
  122. test_transform selectB-$ii.11 {
  123. SELECT * FROM (
  124. SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
  125. ) WHERE a>=10 ORDER BY 1 LIMIT 3
  126. } {
  127. SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10
  128. UNION ALL SELECT c FROM t1 WHERE c>=10
  129. ORDER BY 1 LIMIT 3
  130. } {12 12 14}
  131. test_transform selectB-$ii.12 {
  132. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2)
  133. } {
  134. SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2
  135. } {2 8}
  136. # An ORDER BY in a compound subqueries defeats flattening. Ticket #3773
  137. # test_transform selectB-$ii.13 {
  138. # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a ASC)
  139. # } {
  140. # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC
  141. # } {2 3 8 12 14 21}
  142. #
  143. # test_transform selectB-$ii.14 {
  144. # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC)
  145. # } {
  146. # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
  147. # } {21 14 12 8 3 2}
  148. #
  149. # test_transform selectB-$ii.14 {
  150. # SELECT * FROM (
  151. # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC
  152. # ) LIMIT 2 OFFSET 2
  153. # } {
  154. # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
  155. # LIMIT 2 OFFSET 2
  156. # } {12 8}
  157. #
  158. # test_transform selectB-$ii.15 {
  159. # SELECT * FROM (
  160. # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
  161. # )
  162. # } {
  163. # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
  164. # } {2 4 3 6 8 10 12 15 14 16 21 24}
  165. }
  166. do_test selectB-3.0 {
  167. execsql {
  168. DROP INDEX i1;
  169. DROP INDEX i2;
  170. }
  171. } {}
  172. for {set ii 3} {$ii <= 6} {incr ii} {
  173. switch $ii {
  174. 4 {
  175. optimization_control db query-flattener off
  176. }
  177. 5 {
  178. optimization_control db query-flattener on
  179. do_test selectB-5.0 {
  180. execsql {
  181. CREATE INDEX i1 ON t1(a);
  182. CREATE INDEX i2 ON t1(b);
  183. CREATE INDEX i3 ON t1(c);
  184. CREATE INDEX i4 ON t2(d);
  185. CREATE INDEX i5 ON t2(e);
  186. CREATE INDEX i6 ON t2(f);
  187. }
  188. } {}
  189. }
  190. 6 {
  191. optimization_control db query-flattener off
  192. }
  193. }
  194. do_test selectB-$ii.1 {
  195. execsql {
  196. SELECT DISTINCT * FROM
  197. (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
  198. ORDER BY 1;
  199. }
  200. } {6 12 15 18 24}
  201. do_test selectB-$ii.2 {
  202. execsql {
  203. SELECT c, count(*) FROM
  204. (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
  205. GROUP BY c ORDER BY 1;
  206. }
  207. } {6 2 12 1 15 1 18 1 24 1}
  208. do_test selectB-$ii.3 {
  209. execsql {
  210. SELECT c, count(*) FROM
  211. (SELECT c FROM t1 UNION ALL SELECT e FROM t2)
  212. GROUP BY c HAVING count(*)>1;
  213. }
  214. } {6 2}
  215. do_test selectB-$ii.4 {
  216. execsql {
  217. SELECT t4.c, t3.a FROM
  218. (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
  219. WHERE t3.a=14
  220. ORDER BY 1
  221. }
  222. } {6 14 6 14 12 14 15 14 18 14 24 14}
  223. do_test selectB-$ii.5 {
  224. execsql {
  225. SELECT d FROM t2
  226. EXCEPT
  227. SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  228. }
  229. } {}
  230. do_test selectB-$ii.6 {
  231. execsql {
  232. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  233. EXCEPT
  234. SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
  235. }
  236. } {}
  237. do_test selectB-$ii.7 {
  238. execsql {
  239. SELECT c FROM t1
  240. EXCEPT
  241. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  242. }
  243. } {12}
  244. do_test selectB-$ii.8 {
  245. execsql {
  246. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  247. EXCEPT
  248. SELECT c FROM t1
  249. }
  250. } {9 15 24 27}
  251. do_test selectB-$ii.9 {
  252. execsql {
  253. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  254. EXCEPT
  255. SELECT c FROM t1
  256. ORDER BY c DESC
  257. }
  258. } {27 24 15 9}
  259. do_test selectB-$ii.10 {
  260. execsql {
  261. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  262. UNION
  263. SELECT c FROM t1
  264. ORDER BY c DESC
  265. }
  266. } {27 24 18 15 12 9 6}
  267. do_test selectB-$ii.11 {
  268. execsql {
  269. SELECT c FROM t1
  270. UNION
  271. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  272. ORDER BY c
  273. }
  274. } {6 9 12 15 18 24 27}
  275. do_test selectB-$ii.12 {
  276. execsql {
  277. SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2
  278. ORDER BY c
  279. }
  280. } {6 9 12 15 18 18 24 27}
  281. do_test selectB-$ii.13 {
  282. execsql {
  283. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  284. UNION
  285. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  286. ORDER BY 1
  287. }
  288. } {6 9 15 18 24 27}
  289. do_test selectB-$ii.14 {
  290. execsql {
  291. SELECT c FROM t1
  292. INTERSECT
  293. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  294. ORDER BY 1
  295. }
  296. } {6 18}
  297. do_test selectB-$ii.15 {
  298. execsql {
  299. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  300. INTERSECT
  301. SELECT c FROM t1
  302. ORDER BY 1
  303. }
  304. } {6 18}
  305. do_test selectB-$ii.16 {
  306. execsql {
  307. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  308. INTERSECT
  309. SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
  310. ORDER BY 1
  311. }
  312. } {6 9 15 18 24 27}
  313. do_test selectB-$ii.17 {
  314. execsql {
  315. SELECT * FROM (
  316. SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4
  317. ) LIMIT 2
  318. }
  319. } {2 8}
  320. do_test selectB-$ii.18 {
  321. execsql {
  322. SELECT * FROM (
  323. SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2
  324. ) LIMIT 2
  325. }
  326. } {14 3}
  327. do_test selectB-$ii.19 {
  328. execsql {
  329. SELECT * FROM (
  330. SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
  331. )
  332. }
  333. } {0 1 1 0}
  334. do_test selectB-$ii.20 {
  335. execsql {
  336. SELECT DISTINCT * FROM (
  337. SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
  338. )
  339. }
  340. } {0 1}
  341. do_test selectB-$ii.21 {
  342. execsql {
  343. SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b
  344. }
  345. } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27}
  346. do_test selectB-$ii.22 {
  347. execsql {
  348. SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1;
  349. }
  350. } {3 12 21 345}
  351. do_test selectB-$ii.23 {
  352. execsql {
  353. SELECT x, y FROM (
  354. SELECT a AS x, b AS y FROM t1
  355. UNION ALL
  356. SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 JOIN t2 ON (c=d)
  357. UNION ALL
  358. SELECT a*100, b*100 FROM t1
  359. ) ORDER BY 1;
  360. }
  361. } {2 4 8 10 14 16 80.1 180.1 200 400 800 1000 1400 1600}
  362. do_test selectB-$ii.24 {
  363. execsql {
  364. SELECT x, y FROM (
  365. SELECT a AS x, b AS y FROM t1
  366. UNION ALL
  367. SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
  368. UNION ALL
  369. SELECT a*100, b*100 FROM t1
  370. ) ORDER BY 1;
  371. }
  372. } {2 4 8 10 14 16 20.1 {} 80.1 180.1 140.1 {} 200 400 800 1000 1400 1600}
  373. do_test selectB-$ii.25 {
  374. execsql {
  375. SELECT x+y FROM (
  376. SELECT a AS x, b AS y FROM t1
  377. UNION ALL
  378. SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
  379. UNION ALL
  380. SELECT a*100, b*100 FROM t1
  381. ) WHERE y+x NOT NULL ORDER BY 1;
  382. }
  383. } {6 18 30 260.2 600 1800 3000}
  384. }
  385. finish_test