selectC.test 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # 2008 September 16
  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: selectC.test,v 1.5 2009/05/17 15:26:21 drh Exp $
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. # Ticket #
  17. do_test selectC-1.1 {
  18. execsql {
  19. CREATE TABLE t1(a, b, c);
  20. INSERT INTO t1 VALUES(1,'aaa','bbb');
  21. INSERT INTO t1 SELECT * FROM t1;
  22. INSERT INTO t1 VALUES(2,'ccc','ddd');
  23. SELECT DISTINCT a AS x, b||c AS y
  24. FROM t1
  25. WHERE y IN ('aaabbb','xxx');
  26. }
  27. } {1 aaabbb}
  28. do_test selectC-1.2 {
  29. execsql {
  30. SELECT DISTINCT a AS x, b||c AS y
  31. FROM t1
  32. WHERE b||c IN ('aaabbb','xxx');
  33. }
  34. } {1 aaabbb}
  35. do_test selectC-1.3 {
  36. execsql {
  37. SELECT DISTINCT a AS x, b||c AS y
  38. FROM t1
  39. WHERE y='aaabbb'
  40. }
  41. } {1 aaabbb}
  42. do_test selectC-1.4 {
  43. execsql {
  44. SELECT DISTINCT a AS x, b||c AS y
  45. FROM t1
  46. WHERE b||c='aaabbb'
  47. }
  48. } {1 aaabbb}
  49. do_test selectC-1.5 {
  50. execsql {
  51. SELECT DISTINCT a AS x, b||c AS y
  52. FROM t1
  53. WHERE x=2
  54. }
  55. } {2 cccddd}
  56. do_test selectC-1.6 {
  57. execsql {
  58. SELECT DISTINCT a AS x, b||c AS y
  59. FROM t1
  60. WHERE a=2
  61. }
  62. } {2 cccddd}
  63. do_test selectC-1.7 {
  64. execsql {
  65. SELECT DISTINCT a AS x, b||c AS y
  66. FROM t1
  67. WHERE +y='aaabbb'
  68. }
  69. } {1 aaabbb}
  70. do_test selectC-1.8 {
  71. execsql {
  72. SELECT a AS x, b||c AS y
  73. FROM t1
  74. GROUP BY x, y
  75. HAVING y='aaabbb'
  76. }
  77. } {1 aaabbb}
  78. do_test selectC-1.9 {
  79. execsql {
  80. SELECT a AS x, b||c AS y
  81. FROM t1
  82. GROUP BY x, y
  83. HAVING b||c='aaabbb'
  84. }
  85. } {1 aaabbb}
  86. do_test selectC-1.10 {
  87. execsql {
  88. SELECT a AS x, b||c AS y
  89. FROM t1
  90. WHERE y='aaabbb'
  91. GROUP BY x, y
  92. }
  93. } {1 aaabbb}
  94. do_test selectC-1.11 {
  95. execsql {
  96. SELECT a AS x, b||c AS y
  97. FROM t1
  98. WHERE b||c='aaabbb'
  99. GROUP BY x, y
  100. }
  101. } {1 aaabbb}
  102. proc longname_toupper x {return [string toupper $x]}
  103. db function uppercaseconversionfunctionwithaverylongname longname_toupper
  104. do_test selectC-1.12.1 {
  105. execsql {
  106. SELECT DISTINCT upper(b) AS x
  107. FROM t1
  108. ORDER BY x
  109. }
  110. } {AAA CCC}
  111. do_test selectC-1.12.2 {
  112. execsql {
  113. SELECT DISTINCT uppercaseconversionfunctionwithaverylongname(b) AS x
  114. FROM t1
  115. ORDER BY x
  116. }
  117. } {AAA CCC}
  118. do_test selectC-1.13.1 {
  119. execsql {
  120. SELECT upper(b) AS x
  121. FROM t1
  122. GROUP BY x
  123. ORDER BY x
  124. }
  125. } {AAA CCC}
  126. do_test selectC-1.13.2 {
  127. execsql {
  128. SELECT uppercaseconversionfunctionwithaverylongname(b) AS x
  129. FROM t1
  130. GROUP BY x
  131. ORDER BY x
  132. }
  133. } {AAA CCC}
  134. do_test selectC-1.14.1 {
  135. execsql {
  136. SELECT upper(b) AS x
  137. FROM t1
  138. ORDER BY x DESC
  139. }
  140. } {CCC AAA AAA}
  141. do_test selectC-1.14.2 {
  142. execsql {
  143. SELECT uppercaseconversionfunctionwithaverylongname(b) AS x
  144. FROM t1
  145. ORDER BY x DESC
  146. }
  147. } {CCC AAA AAA}
  148. # The following query used to leak memory. Verify that has been fixed.
  149. #
  150. ifcapable trigger&&compound {
  151. do_test selectC-2.1 {
  152. catchsql {
  153. CREATE TABLE t21a(a,b);
  154. INSERT INTO t21a VALUES(1,2);
  155. CREATE TABLE t21b(n);
  156. CREATE TRIGGER r21 AFTER INSERT ON t21b BEGIN
  157. SELECT a FROM t21a WHERE a>new.x UNION ALL
  158. SELECT b FROM t21a WHERE b>new.x ORDER BY 1 LIMIT 2;
  159. END;
  160. INSERT INTO t21b VALUES(6);
  161. }
  162. } {1 {no such column: new.x}}
  163. }
  164. # Check that ticket [883034dcb5] is fixed.
  165. #
  166. do_test selectC-3.1 {
  167. execsql {
  168. CREATE TABLE person (
  169. org_id TEXT NOT NULL,
  170. nickname TEXT NOT NULL,
  171. license TEXT,
  172. CONSTRAINT person_pk PRIMARY KEY (org_id, nickname),
  173. CONSTRAINT person_license_uk UNIQUE (license)
  174. );
  175. INSERT INTO person VALUES('meyers', 'jack', '2GAT123');
  176. INSERT INTO person VALUES('meyers', 'hill', 'V345FMP');
  177. INSERT INTO person VALUES('meyers', 'jim', '2GAT138');
  178. INSERT INTO person VALUES('smith', 'maggy', '');
  179. INSERT INTO person VALUES('smith', 'jose', 'JJZ109');
  180. INSERT INTO person VALUES('smith', 'jack', 'THX138');
  181. INSERT INTO person VALUES('lakeside', 'dave', '953OKG');
  182. INSERT INTO person VALUES('lakeside', 'amy', NULL);
  183. INSERT INTO person VALUES('lake-apts', 'tom', NULL);
  184. INSERT INTO person VALUES('acorn', 'hideo', 'CQB421');
  185. SELECT
  186. org_id,
  187. count((NOT (org_id IS NULL)) AND (NOT (nickname IS NULL)))
  188. FROM person
  189. WHERE (CASE WHEN license != '' THEN 1 ELSE 0 END)
  190. GROUP BY 1;
  191. }
  192. } {acorn 1 lakeside 1 meyers 3 smith 2}
  193. do_test selectC-3.2 {
  194. execsql {
  195. CREATE TABLE t2(a PRIMARY KEY, b);
  196. INSERT INTO t2 VALUES('abc', 'xxx');
  197. INSERT INTO t2 VALUES('def', 'yyy');
  198. SELECT a, max(b || a) FROM t2 WHERE (b||b||b)!='value' GROUP BY a;
  199. }
  200. } {abc xxxabc def yyydef}
  201. do_test selectC-3.3 {
  202. execsql {
  203. SELECT b, max(a || b) FROM t2 WHERE (b||b||b)!='value' GROUP BY a;
  204. }
  205. } {xxx abcxxx yyy defyyy}
  206. proc udf {} { incr ::udf }
  207. set ::udf 0
  208. db function udf udf
  209. do_execsql_test selectC-4.1 {
  210. create table t_distinct_bug (a, b, c);
  211. insert into t_distinct_bug values ('1', '1', 'a');
  212. insert into t_distinct_bug values ('1', '2', 'b');
  213. insert into t_distinct_bug values ('1', '3', 'c');
  214. insert into t_distinct_bug values ('1', '1', 'd');
  215. insert into t_distinct_bug values ('1', '2', 'e');
  216. insert into t_distinct_bug values ('1', '3', 'f');
  217. } {}
  218. do_execsql_test selectC-4.2 {
  219. select a from (select distinct a, b from t_distinct_bug)
  220. } {1 1 1}
  221. do_execsql_test selectC-4.3 {
  222. select a, udf() from (select distinct a, b from t_distinct_bug)
  223. } {1 1 1 2 1 3}
  224. finish_test