1
0

minmax3.test 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. # 2008 January 5
  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. # $Id: minmax3.test,v 1.5 2008/07/12 14:52:20 drh Exp $
  12. set testdir [file dirname $argv0]
  13. source $testdir/tester.tcl
  14. # Do not use a codec for tests in this file, as the database file is
  15. # manipulated directly using tcl scripts (using the [hexio_write] command).
  16. #
  17. do_not_use_codec
  18. # Do an SQL statement. Append the search count to the end of the result.
  19. #
  20. proc count sql {
  21. set ::sqlite_search_count 0
  22. return [concat [execsql $sql] $::sqlite_search_count]
  23. }
  24. # This procedure sets the value of the file-format in file 'test.db'
  25. # to $newval. Also, the schema cookie is incremented.
  26. #
  27. proc set_file_format {newval} {
  28. hexio_write test.db 44 [hexio_render_int32 $newval]
  29. set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
  30. incr schemacookie
  31. hexio_write test.db 40 [hexio_render_int32 $schemacookie]
  32. return {}
  33. }
  34. do_test minmax3-1.0 {
  35. execsql {
  36. CREATE TABLE t1(x, y, z);
  37. }
  38. db close
  39. set_file_format 4
  40. sqlite3 db test.db
  41. execsql {
  42. BEGIN;
  43. INSERT INTO t1 VALUES('1', 'I', 'one');
  44. INSERT INTO t1 VALUES('2', 'IV', 'four');
  45. INSERT INTO t1 VALUES('2', NULL, 'three');
  46. INSERT INTO t1 VALUES('2', 'II', 'two');
  47. INSERT INTO t1 VALUES('2', 'V', 'five');
  48. INSERT INTO t1 VALUES('3', 'VI', 'six');
  49. COMMIT;
  50. PRAGMA automatic_index=OFF;
  51. }
  52. } {}
  53. do_test minmax3-1.1.1 {
  54. # Linear scan.
  55. count { SELECT max(y) FROM t1 WHERE x = '2'; }
  56. } {V 5}
  57. do_test minmax3-1.1.2 {
  58. # Index optimizes the WHERE x='2' constraint.
  59. execsql { CREATE INDEX i1 ON t1(x) }
  60. count { SELECT max(y) FROM t1 WHERE x = '2'; }
  61. } {V 9}
  62. do_test minmax3-1.1.3 {
  63. # Index optimizes the WHERE x='2' constraint and the MAX(y).
  64. execsql { CREATE INDEX i2 ON t1(x,y) }
  65. count { SELECT max(y) FROM t1 WHERE x = '2'; }
  66. } {V 1}
  67. do_test minmax3-1.1.4 {
  68. # Index optimizes the WHERE x='2' constraint and the MAX(y).
  69. execsql { DROP INDEX i2 ; CREATE INDEX i2 ON t1(x, y DESC) }
  70. count { SELECT max(y) FROM t1 WHERE x = '2'; }
  71. } {V 1}
  72. do_test minmax3-1.1.5 {
  73. count { SELECT max(y) FROM t1 WHERE x = '2' AND y != 'V'; }
  74. } {IV 2}
  75. do_test minmax3-1.1.6 {
  76. count { SELECT max(y) FROM t1 WHERE x = '2' AND y < 'V'; }
  77. } {IV 1}
  78. do_test minmax3-1.1.6 {
  79. count { SELECT max(y) FROM t1 WHERE x = '2' AND z != 'five'; }
  80. } {IV 4}
  81. do_test minmax3-1.2.1 {
  82. # Linear scan of t1.
  83. execsql { DROP INDEX i1 ; DROP INDEX i2 }
  84. count { SELECT min(y) FROM t1 WHERE x = '2'; }
  85. } {II 5}
  86. do_test minmax3-1.2.2 {
  87. # Index i1 optimizes the WHERE x='2' constraint.
  88. execsql { CREATE INDEX i1 ON t1(x) }
  89. count { SELECT min(y) FROM t1 WHERE x = '2'; }
  90. } {II 9}
  91. do_test minmax3-1.2.3 {
  92. # Index i2 optimizes the WHERE x='2' constraint and the min(y).
  93. execsql { CREATE INDEX i2 ON t1(x,y) }
  94. count { SELECT min(y) FROM t1 WHERE x = '2'; }
  95. } {II 1}
  96. do_test minmax3-1.2.4 {
  97. # Index optimizes the WHERE x='2' constraint and the MAX(y).
  98. execsql { DROP INDEX i2 ; CREATE INDEX i2 ON t1(x, y DESC) }
  99. count { SELECT min(y) FROM t1 WHERE x = '2'; }
  100. } {II 1}
  101. do_test minmax3-1.3.1 {
  102. # Linear scan
  103. execsql { DROP INDEX i1 ; DROP INDEX i2 }
  104. count { SELECT min(y) FROM t1; }
  105. } {I 5}
  106. do_test minmax3-1.3.2 {
  107. # Index i1 optimizes the min(y)
  108. execsql { CREATE INDEX i1 ON t1(y) }
  109. count { SELECT min(y) FROM t1; }
  110. } {I 1}
  111. do_test minmax3-1.3.3 {
  112. # Index i1 optimizes the min(y)
  113. execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t1(y DESC) }
  114. count { SELECT min(y) FROM t1; }
  115. } {I 1}
  116. do_test minmax3-1.4.1 {
  117. # Linear scan
  118. execsql { DROP INDEX i1 }
  119. count { SELECT max(y) FROM t1; }
  120. } {VI 5}
  121. do_test minmax3-1.4.2 {
  122. # Index i1 optimizes the max(y)
  123. execsql { CREATE INDEX i1 ON t1(y) }
  124. count { SELECT max(y) FROM t1; }
  125. } {VI 0}
  126. do_test minmax3-1.4.3 {
  127. # Index i1 optimizes the max(y)
  128. execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t1(y DESC) }
  129. execsql { SELECT y from t1}
  130. count { SELECT max(y) FROM t1; }
  131. } {VI 0}
  132. do_test minmax3-1.4.4 {
  133. execsql { DROP INDEX i1 }
  134. } {}
  135. do_test minmax3-2.1 {
  136. execsql {
  137. CREATE TABLE t2(a, b);
  138. CREATE INDEX i3 ON t2(a, b);
  139. INSERT INTO t2 VALUES(1, NULL);
  140. INSERT INTO t2 VALUES(1, 1);
  141. INSERT INTO t2 VALUES(1, 2);
  142. INSERT INTO t2 VALUES(1, 3);
  143. INSERT INTO t2 VALUES(2, NULL);
  144. INSERT INTO t2 VALUES(2, 1);
  145. INSERT INTO t2 VALUES(2, 2);
  146. INSERT INTO t2 VALUES(2, 3);
  147. INSERT INTO t2 VALUES(3, 1);
  148. INSERT INTO t2 VALUES(3, 2);
  149. INSERT INTO t2 VALUES(3, 3);
  150. }
  151. } {}
  152. do_test minmax3-2.2 {
  153. execsql { SELECT min(b) FROM t2 WHERE a = 1; }
  154. } {1}
  155. do_test minmax3-2.3 {
  156. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>1; }
  157. } {2}
  158. do_test minmax3-2.4 {
  159. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>-1; }
  160. } {1}
  161. do_test minmax3-2.5 {
  162. execsql { SELECT min(b) FROM t2 WHERE a = 1; }
  163. } {1}
  164. do_test minmax3-2.6 {
  165. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<2; }
  166. } {1}
  167. do_test minmax3-2.7 {
  168. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<1; }
  169. } {{}}
  170. do_test minmax3-2.8 {
  171. execsql { SELECT min(b) FROM t2 WHERE a = 3 AND b<1; }
  172. } {{}}
  173. do_test minmax3-3.1 {
  174. execsql {
  175. DROP TABLE t2;
  176. CREATE TABLE t2(a, b);
  177. CREATE INDEX i3 ON t2(a, b DESC);
  178. INSERT INTO t2 VALUES(1, NULL);
  179. INSERT INTO t2 VALUES(1, 1);
  180. INSERT INTO t2 VALUES(1, 2);
  181. INSERT INTO t2 VALUES(1, 3);
  182. INSERT INTO t2 VALUES(2, NULL);
  183. INSERT INTO t2 VALUES(2, 1);
  184. INSERT INTO t2 VALUES(2, 2);
  185. INSERT INTO t2 VALUES(2, 3);
  186. INSERT INTO t2 VALUES(3, 1);
  187. INSERT INTO t2 VALUES(3, 2);
  188. INSERT INTO t2 VALUES(3, 3);
  189. }
  190. } {}
  191. do_test minmax3-3.2 {
  192. execsql { SELECT min(b) FROM t2 WHERE a = 1; }
  193. } {1}
  194. do_test minmax3-3.3 {
  195. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>1; }
  196. } {2}
  197. do_test minmax3-3.4 {
  198. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>-1; }
  199. } {1}
  200. do_test minmax3-3.5 {
  201. execsql { SELECT min(b) FROM t2 WHERE a = 1; }
  202. } {1}
  203. do_test minmax3-3.6 {
  204. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<2; }
  205. } {1}
  206. do_test minmax3-3.7 {
  207. execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<1; }
  208. } {{}}
  209. do_test minmax3-3.8 {
  210. execsql { SELECT min(b) FROM t2 WHERE a = 3 AND b<1; }
  211. } {{}}
  212. do_test minmax3-4.1 {
  213. execsql {
  214. CREATE TABLE t4(x);
  215. INSERT INTO t4 VALUES('abc');
  216. INSERT INTO t4 VALUES('BCD');
  217. SELECT max(x) FROM t4;
  218. }
  219. } {abc}
  220. do_test minmax3-4.2 {
  221. execsql {
  222. SELECT max(x COLLATE nocase) FROM t4;
  223. }
  224. } {BCD}
  225. do_test minmax3-4.3 {
  226. execsql {
  227. SELECT max(x), max(x COLLATE nocase) FROM t4;
  228. }
  229. } {abc BCD}
  230. do_test minmax3-4.4 {
  231. execsql {
  232. SELECT max(x COLLATE binary), max(x COLLATE nocase) FROM t4;
  233. }
  234. } {abc BCD}
  235. do_test minmax3-4.5 {
  236. execsql {
  237. SELECT max(x COLLATE nocase), max(x COLLATE rtrim) FROM t4;
  238. }
  239. } {BCD abc}
  240. do_test minmax3-4.6 {
  241. execsql {
  242. SELECT max(x COLLATE nocase), max(x) FROM t4;
  243. }
  244. } {BCD abc}
  245. do_test minmax3-4.10 {
  246. execsql {
  247. SELECT min(x) FROM t4;
  248. }
  249. } {BCD}
  250. do_test minmax3-4.11 {
  251. execsql {
  252. SELECT min(x COLLATE nocase) FROM t4;
  253. }
  254. } {abc}
  255. do_test minmax3-4.12 {
  256. execsql {
  257. SELECT min(x), min(x COLLATE nocase) FROM t4;
  258. }
  259. } {BCD abc}
  260. do_test minmax3-4.13 {
  261. execsql {
  262. SELECT min(x COLLATE binary), min(x COLLATE nocase) FROM t4;
  263. }
  264. } {BCD abc}
  265. do_test minmax3-4.14 {
  266. execsql {
  267. SELECT min(x COLLATE nocase), min(x COLLATE rtrim) FROM t4;
  268. }
  269. } {abc BCD}
  270. do_test minmax3-4.15 {
  271. execsql {
  272. SELECT min(x COLLATE nocase), min(x) FROM t4;
  273. }
  274. } {abc BCD}
  275. finish_test