aggnested.test 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. # 2012 August 23
  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. # This file implements tests for processing aggregate queries with
  14. # subqueries in which the subqueries hold the aggregate functions
  15. # or in which the subqueries are themselves aggregate queries
  16. #
  17. set testdir [file dirname $argv0]
  18. source $testdir/tester.tcl
  19. do_test aggnested-1.1 {
  20. db eval {
  21. CREATE TABLE t1(a1 INTEGER);
  22. INSERT INTO t1 VALUES(1), (2), (3);
  23. CREATE TABLE t2(b1 INTEGER);
  24. INSERT INTO t2 VALUES(4), (5);
  25. SELECT (SELECT group_concat(a1,'x') FROM t2) FROM t1;
  26. }
  27. } {1x2x3}
  28. do_test aggnested-1.2 {
  29. db eval {
  30. SELECT
  31. (SELECT group_concat(a1,'x') || '-' || group_concat(b1,'y') FROM t2)
  32. FROM t1;
  33. }
  34. } {1x2x3-4y5}
  35. do_test aggnested-1.3 {
  36. db eval {
  37. SELECT (SELECT group_concat(b1,a1) FROM t2) FROM t1;
  38. }
  39. } {415 425 435}
  40. do_test aggnested-1.4 {
  41. db eval {
  42. SELECT (SELECT group_concat(a1,b1) FROM t2) FROM t1;
  43. }
  44. } {151 252 353}
  45. # This test case is a copy of the one in
  46. # http://www.mail-archive.com/sqlite-users@sqlite.org/msg70787.html
  47. #
  48. do_test aggnested-2.0 {
  49. sqlite3 db2 :memory:
  50. db2 eval {
  51. CREATE TABLE t1 (A1 INTEGER NOT NULL,A2 INTEGER NOT NULL,A3 INTEGER NOT
  52. NULL,A4 INTEGER NOT NULL,PRIMARY KEY(A1));
  53. REPLACE INTO t1 VALUES(1,11,111,1111);
  54. REPLACE INTO t1 VALUES(2,22,222,2222);
  55. REPLACE INTO t1 VALUES(3,33,333,3333);
  56. CREATE TABLE t2 (B1 INTEGER NOT NULL,B2 INTEGER NOT NULL,B3 INTEGER NOT
  57. NULL,B4 INTEGER NOT NULL,PRIMARY KEY(B1));
  58. REPLACE INTO t2 VALUES(1,88,888,8888);
  59. REPLACE INTO t2 VALUES(2,99,999,9999);
  60. SELECT (SELECT GROUP_CONCAT(CASE WHEN a1=1 THEN'A' ELSE 'B' END) FROM t2),
  61. t1.*
  62. FROM t1;
  63. }
  64. } {A,B,B 3 33 333 3333}
  65. db2 close
  66. ##################### Test cases for ticket [bfbf38e5e9956ac69f] ############
  67. #
  68. # This first test case is the original problem report:
  69. do_test aggnested-3.0 {
  70. db eval {
  71. CREATE TABLE AAA (
  72. aaa_id INTEGER PRIMARY KEY AUTOINCREMENT
  73. );
  74. CREATE TABLE RRR (
  75. rrr_id INTEGER PRIMARY KEY AUTOINCREMENT,
  76. rrr_date INTEGER NOT NULL,
  77. rrr_aaa INTEGER
  78. );
  79. CREATE TABLE TTT (
  80. ttt_id INTEGER PRIMARY KEY AUTOINCREMENT,
  81. target_aaa INTEGER NOT NULL,
  82. source_aaa INTEGER NOT NULL
  83. );
  84. insert into AAA (aaa_id) values (2);
  85. insert into TTT (ttt_id, target_aaa, source_aaa)
  86. values (4469, 2, 2);
  87. insert into TTT (ttt_id, target_aaa, source_aaa)
  88. values (4476, 2, 1);
  89. insert into RRR (rrr_id, rrr_date, rrr_aaa)
  90. values (0, 0, NULL);
  91. insert into RRR (rrr_id, rrr_date, rrr_aaa)
  92. values (2, 4312, 2);
  93. SELECT i.aaa_id,
  94. (SELECT sum(CASE WHEN (t.source_aaa == i.aaa_id) THEN 1 ELSE 0 END)
  95. FROM TTT t
  96. ) AS segfault
  97. FROM
  98. (SELECT curr.rrr_aaa as aaa_id
  99. FROM RRR curr
  100. -- you also can comment out the next line
  101. -- it causes segfault to happen after one row is outputted
  102. INNER JOIN AAA a ON (curr.rrr_aaa = aaa_id)
  103. LEFT JOIN RRR r ON (r.rrr_id <> 0 AND r.rrr_date < curr.rrr_date)
  104. GROUP BY curr.rrr_id
  105. HAVING r.rrr_date IS NULL
  106. ) i;
  107. }
  108. } {2 1}
  109. # Further variants of the test case, as found in the ticket
  110. #
  111. do_test aggnested-3.1 {
  112. db eval {
  113. DROP TABLE IF EXISTS t1;
  114. DROP TABLE IF EXISTS t2;
  115. CREATE TABLE t1 (
  116. id1 INTEGER PRIMARY KEY AUTOINCREMENT,
  117. value1 INTEGER
  118. );
  119. INSERT INTO t1 VALUES(4469,2),(4476,1);
  120. CREATE TABLE t2 (
  121. id2 INTEGER PRIMARY KEY AUTOINCREMENT,
  122. value2 INTEGER
  123. );
  124. INSERT INTO t2 VALUES(0,1),(2,2);
  125. SELECT
  126. (SELECT sum(value2==xyz) FROM t2)
  127. FROM
  128. (SELECT curr.value1 as xyz
  129. FROM t1 AS curr LEFT JOIN t1 AS other
  130. GROUP BY curr.id1);
  131. }
  132. } {1 1}
  133. do_test aggnested-3.2 {
  134. db eval {
  135. DROP TABLE IF EXISTS t1;
  136. DROP TABLE IF EXISTS t2;
  137. CREATE TABLE t1 (
  138. id1 INTEGER,
  139. value1 INTEGER,
  140. x1 INTEGER
  141. );
  142. INSERT INTO t1 VALUES(4469,2,98),(4469,1,99),(4469,3,97);
  143. CREATE TABLE t2 (
  144. value2 INTEGER
  145. );
  146. INSERT INTO t2 VALUES(1);
  147. SELECT
  148. (SELECT sum(value2==xyz) FROM t2)
  149. FROM
  150. (SELECT value1 as xyz, max(x1) AS pqr
  151. FROM t1
  152. GROUP BY id1);
  153. }
  154. } {0}
  155. do_test aggnested-3.3 {
  156. db eval {
  157. DROP TABLE IF EXISTS t1;
  158. DROP TABLE IF EXISTS t2;
  159. CREATE TABLE t1(id1, value1);
  160. INSERT INTO t1 VALUES(4469,2),(4469,1);
  161. CREATE TABLE t2 (value2);
  162. INSERT INTO t2 VALUES(1);
  163. SELECT (SELECT sum(value2=value1) FROM t2), max(value1)
  164. FROM t1
  165. GROUP BY id1;
  166. }
  167. } {0 2}
  168. # A batch of queries all doing approximately the same operation involving
  169. # two nested aggregate queries.
  170. #
  171. do_test aggnested-3.11 {
  172. db eval {
  173. DROP TABLE IF EXISTS t1;
  174. DROP TABLE IF EXISTS t2;
  175. CREATE TABLE t1(id1, value1);
  176. INSERT INTO t1 VALUES(4469,12),(4469,11),(4470,34);
  177. CREATE INDEX t1id1 ON t1(id1);
  178. CREATE TABLE t2 (value2);
  179. INSERT INTO t2 VALUES(12),(34),(34);
  180. INSERT INTO t2 SELECT value2 FROM t2;
  181. SELECT max(value1), (SELECT count(*) FROM t2 WHERE value2=max(value1))
  182. FROM t1
  183. GROUP BY id1;
  184. }
  185. } {12 2 34 4}
  186. do_test aggnested-3.12 {
  187. db eval {
  188. SELECT max(value1), (SELECT count(*) FROM t2 WHERE value2=value1)
  189. FROM t1
  190. GROUP BY id1;
  191. }
  192. } {12 2 34 4}
  193. do_test aggnested-3.13 {
  194. db eval {
  195. SELECT value1, (SELECT sum(value2=value1) FROM t2)
  196. FROM t1;
  197. }
  198. } {12 2 11 0 34 4}
  199. do_test aggnested-3.14 {
  200. db eval {
  201. SELECT value1, (SELECT sum(value2=value1) FROM t2)
  202. FROM t1
  203. WHERE value1 IN (SELECT max(value1) FROM t1 GROUP BY id1);
  204. }
  205. } {12 2 34 4}
  206. do_test aggnested-3.15 {
  207. # FIXME: If case 3.16 works, then this case really ought to work too...
  208. catchsql {
  209. SELECT max(value1), (SELECT sum(value2=max(value1)) FROM t2)
  210. FROM t1
  211. GROUP BY id1;
  212. }
  213. } {1 {misuse of aggregate function max()}}
  214. do_test aggnested-3.16 {
  215. db eval {
  216. SELECT max(value1), (SELECT sum(value2=value1) FROM t2)
  217. FROM t1
  218. GROUP BY id1;
  219. }
  220. } {12 2 34 4}
  221. finish_test