]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests for "DISTINCT" and "ALL" to e_select.test.
authordan <dan@noemail.net>
Sat, 11 Sep 2010 17:37:52 +0000 (17:37 +0000)
committerdan <dan@noemail.net>
Sat, 11 Sep 2010 17:37:52 +0000 (17:37 +0000)
FossilOrigin-Name: 43a99d9a88b1c3a6978e79ca21d49de6be2c9def

manifest
manifest.uuid
test/e_select.test

index 008e550d62e3caadcf52926e5224c0fcde3761d2..dd47abb3fc1619f4ce14ef41fe6bcc9e1de6eb70 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,5 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Fix\sa\scouple\sof\sincorrect\sevidence\smarks\son\smalloc().
-D 2010-09-11T16:25:43
+C Add\stests\sfor\s"DISTINCT"\sand\s"ALL"\sto\se_select.test.
+D 2010-09-11T17:37:52
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in c599a15d268b1db2aeadea19df2adc3bf2eb6bee
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -353,7 +350,7 @@ F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
 F test/e_expr.test 164e87c1d7b40ceb47c57c3bffa384c81d009aa7
 F test/e_fkey.test 6721a741c6499b3ab7e5385923233343c8f1ad05
 F test/e_fts3.test 75bb0aee26384ef586165e21018a17f7cd843469
-F test/e_select.test ea3648d04736bc8dace68b2599a409c6fca6ba06
+F test/e_select.test b033fb107c7f8becd68b688ec9c98329142de68d
 F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
 F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398
 F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041
@@ -860,14 +857,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 42b4bf9e72501cf228b4086437c7660443933f74
-R 02842908c71434dfd48b3d12f71c7ce4
-U drh
-Z 89e17357ae4594472aa1432bdf4145bd
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.10 (Darwin)
-
-iEYEARECAAYFAkyLrYcACgkQoxKgR168RlGFEgCghibqg9PjE+oX345EOAHijLn6
-iVEAnA4DX4kEG/ViEAgOvP/d6Ckpzf6B
-=HUXW
------END PGP SIGNATURE-----
+P f9b5c5cb135f3d0bb2b64b4d3f8d77bbd8d2ae98
+R 8bec58c36f0aa8c81025ec7235b0afd7
+U dan
+Z 84efd3bd5ec86af449989ea81cf00ac2
index 163c5dbccb23413c94d509e673b1a0b0ab4aff4f..310e33ab751961fcd8ef062666e5acc21d5551d4 100644 (file)
@@ -1 +1 @@
-f9b5c5cb135f3d0bb2b64b4d3f8d77bbd8d2ae98
\ No newline at end of file
+43a99d9a88b1c3a6978e79ca21d49de6be2c9def
\ No newline at end of file
index f5e5b381c73b5f6b0b4bb345e0a038583bd56f44..3b2359b3087f6af8935dac1167434259b5fdfe42 100644 (file)
@@ -1455,22 +1455,180 @@ do_execsql_test e_select-4.13.0 {
   INSERT INTO c1 VALUES('x', 8);
   INSERT INTO c1 VALUES('y', 16);
   INSERT INTO c1 VALUES('y', 32);
+
+  CREATE TABLE c2(i, j);
+  INSERT INTO c2 VALUES(1, 0);
+  INSERT INTO c2 VALUES(2, 1);
+  INSERT INTO c2 VALUES(3, 3);
+  INSERT INTO c2 VALUES(4, 6);
+  INSERT INTO c2 VALUES(5, 10);
+  INSERT INTO c2 VALUES(6, 15);
+  INSERT INTO c2 VALUES(7, 21);
+  INSERT INTO c2 VALUES(8, 28);
+  INSERT INTO c2 VALUES(9, 36);
+
+  CREATE TABLE c3(i PRIMARY KEY, k TEXT);
+  INSERT INTO c3 VALUES(1,  'hydrogen');
+  INSERT INTO c3 VALUES(2,  'helium');
+  INSERT INTO c3 VALUES(3,  'lithium');
+  INSERT INTO c3 VALUES(4,  'beryllium');
+  INSERT INTO c3 VALUES(5,  'boron');
+  INSERT INTO c3 VALUES(94, 'plutonium');
 } {}
 
 foreach {tn select res} {
   13.1.1  "SELECT up FROM c1 GROUP BY up HAVING count(*)>3" {x}
   13.1.2  "SELECT up FROM c1 GROUP BY up HAVING sum(down)>16" {y}
   13.1.3  "SELECT up FROM c1 GROUP BY up HAVING sum(down)<16" {x}
-  13.1.3  "SELECT up||down FROM c1 GROUP BY (down<5) HAVING max(down)<10" {x4}
+  13.1.4  "SELECT up||down FROM c1 GROUP BY (down<5) HAVING max(down)<10" {x4}
 
   13.2.1  "SELECT up FROM c1 GROUP BY up HAVING down>10" {y}
   13.2.2  "SELECT up FROM c1 GROUP BY up HAVING up='y'"  {y}
+
+  13.2.3  "SELECT i, j FROM c2 GROUP BY i>4 HAVING i>6"  {9 36}
 } {
   do_execsql_test e_select-4.$tn $select [list {*}$res]
 }
 
+# EVIDENCE-OF: R-23927-54081 Each expression in the result-set is then
+# evaluated once for each group of rows.
+#
+# EVIDENCE-OF: R-53735-47017 If the expression is an aggregate
+# expression, it is evaluated across all rows in the group.
+#
+foreach {tn select res} {
+  14.1  "SELECT sum(down) FROM c1 GROUP BY up" {15 48}
+  14.2  "SELECT sum(j), max(j) FROM c2 GROUP BY (i%3)"     {54 36 27 21 39 28}
+  14.3  "SELECT sum(j), max(j) FROM c2 GROUP BY (j%2)"     {80 36 40 21}
+  14.4  "SELECT 1+sum(j), max(j)+1 FROM c2 GROUP BY (j%2)" {81 37 41 22}
+  14.5  "SELECT count(*), round(avg(i),2) FROM c1, c2 ON (i=down) GROUP BY j%2"
+        {3 4.33 1 2.0}
+} {
+  do_execsql_test e_select-4.$tn $select [list {*}$res]
+}
 
+# EVIDENCE-OF: R-62913-19830 Otherwise, it is evaluated against a single
+# arbitrarily chosen row from within the group.
+#
+# EVIDENCE-OF: R-53924-08809 If there is more than one non-aggregate
+# expression in the result-set, then all such expressions are evaluated
+# for the same row.
+#
+foreach {tn select res} {
+  15.1  "SELECT i, j FROM c2 GROUP BY i%2"             {8 28   9 36}
+  15.2  "SELECT i, j FROM c2 GROUP BY i%2 HAVING j<30" {8 28}
+  15.3  "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {9 36}
+  15.4  "SELECT i, j FROM c2 GROUP BY i%2 HAVING j>30" {9 36}
+  15.5  "SELECT count(*), i, k FROM c2 NATURAL JOIN c3 GROUP BY substr(k, 1, 1)"
+        {2 5 boron   2 2 helium   1 3 lithium}
+} {
+  do_execsql_test e_select-4.$tn $select [list {*}$res]
+}
 
-finish_test
+# EVIDENCE-OF: R-19334-12811 Each group of input dataset rows
+# contributes a single row to the set of result rows.
+#
+# EVIDENCE-OF: R-02223-49279 Subject to filtering associated with the
+# DISTINCT keyword, the number of rows returned by an aggregate query
+# with a GROUP BY clause is the same as the number of groups of rows
+# produced by applying the GROUP BY and HAVING clauses to the filtered
+# input dataset.
+#
+foreach {tn select nRow} {
+  16.1  "SELECT i, j FROM c2 GROUP BY i%2"          2
+  16.2  "SELECT i, j FROM c2 GROUP BY i"            9
+  16.3  "SELECT i, j FROM c2 GROUP BY i HAVING i<5" 4
+} {
+  set rows 0
+  db eval $select {incr rows}
+  do_test e_select-4.$tn [list set rows] $nRow
+}
+
+#-------------------------------------------------------------------------
+# The following tests attempt to verify statements made regarding the ALL
+# and DISTINCT keywords.
+#
+drop_all_tables
+do_execsql_test e_select-5.1.0 {
+  CREATE TABLE h1(a, b);
+  INSERT INTO h1 VALUES(1, 'one');
+  INSERT INTO h1 VALUES(1, 'I');
+  INSERT INTO h1 VALUES(1, 'i');
+  INSERT INTO h1 VALUES(4, 'four');
+  INSERT INTO h1 VALUES(4, 'IV');
+  INSERT INTO h1 VALUES(4, 'iv');
+
+  CREATE TABLE h2(x COLLATE nocase);
+  INSERT INTO h2 VALUES('One');
+  INSERT INTO h2 VALUES('Two');
+  INSERT INTO h2 VALUES('Three');
+  INSERT INTO h2 VALUES('Four');
+  INSERT INTO h2 VALUES('one');
+  INSERT INTO h2 VALUES('two');
+  INSERT INTO h2 VALUES('three');
+  INSERT INTO h2 VALUES('four');
+
+  CREATE TABLE h3(c, d);
+  INSERT INTO h3 VALUES(1, NULL);
+  INSERT INTO h3 VALUES(2, NULL);
+  INSERT INTO h3 VALUES(3, NULL);
+  INSERT INTO h3 VALUES(4, '2');
+  INSERT INTO h3 VALUES(5, NULL);
+  INSERT INTO h3 VALUES(6, '2,3');
+  INSERT INTO h3 VALUES(7, NULL);
+  INSERT INTO h3 VALUES(8, '2,4');
+  INSERT INTO h3 VALUES(9, '3');
+} {}
+
+# EVIDENCE-OF: R-60770-10612 One of the ALL or DISTINCT keywords may
+# follow the SELECT keyword in a simple SELECT statement.
+#
+do_execsql_test e_select-5.1.1 { SELECT ALL a FROM h1      } {1 1 1 4 4 4}
+do_execsql_test e_select-5.1.2 { SELECT DISTINCT a FROM h1 } {1 4}
+
+# EVIDENCE-OF: R-08861-34280 If the simple SELECT is a SELECT ALL, then
+# the entire set of result rows are returned by the SELECT.
+#
+# EVIDENCE-OF: R-47911-02086 If neither ALL or DISTINCT are present,
+# then the behaviour is as if ALL were specified.
+#
+# EVIDENCE-OF: R-14442-41305 If the simple SELECT is a SELECT DISTINCT,
+# then duplicate rows are removed from the set of result rows before it
+# is returned.
+#
+#   The three testable statements above are tested by e_select-5.2.*,
+#   5.3.* and 5.4.* respectively.
+#
+foreach {tn select res} {
+  3.1 "SELECT ALL x FROM h2" {One Two Three Four one two three four}
+  3.2 "SELECT ALL x FROM h1, h2 ON (x=b)" {One one Four four}
 
+  3.1 "SELECT x FROM h2" {One Two Three Four one two three four}
+  3.2 "SELECT x FROM h1, h2 ON (x=b)" {One one Four four}
 
+  4.1 "SELECT DISTINCT x FROM h2" {four one three two}
+  4.2 "SELECT DISTINCT x FROM h1, h2 ON (x=b)" {four one}
+} {
+  do_execsql_test e_select-5.$tn $select [list {*}$res]
+}
+
+# EVIDENCE-OF: R-02054-15343 For the purposes of detecting duplicate
+# rows, two NULL values are considered to be equal.
+#
+do_execsql_test e_select-5.5.1 { SELECT DISTINCT d FROM h3 } {{} 2 2,3 2,4 3}
+
+# EVIDENCE-OF: R-58359-52112 The normal rules for selecting a collation
+# sequence to compare text values with apply.
+#
+foreach {tn select res} {
+  6.1  "SELECT DISTINCT b FROM h1"                  {I IV four i iv one}
+  6.2  "SELECT DISTINCT b COLLATE nocase FROM h1"   {four i iv one}
+  6.3  "SELECT DISTINCT x FROM h2"                  {four one three two}
+  6.4  "SELECT DISTINCT x COLLATE binary FROM h2"   {
+    Four One Three Two four one three two
+  }
+} {
+  do_execsql_test e_select-5.$tn $select [list {*}$res]
+}
+
+finish_test