xref: /sqlite-3.40.0/test/count.test (revision b9294de1)
1abcc1941Sdrh# 2009-02-24
24d9c1dd2Sdanielk1977#
34d9c1dd2Sdanielk1977# The author disclaims copyright to this source code.  In place of
44d9c1dd2Sdanielk1977# a legal notice, here is a blessing:
54d9c1dd2Sdanielk1977#
64d9c1dd2Sdanielk1977#    May you do good and not evil.
74d9c1dd2Sdanielk1977#    May you find forgiveness for yourself and forgive others.
84d9c1dd2Sdanielk1977#    May you share freely, never taking more than you give.
94d9c1dd2Sdanielk1977#
104d9c1dd2Sdanielk1977#***********************************************************************
114d9c1dd2Sdanielk1977# This file implements regression tests for SQLite library.  The
124d9c1dd2Sdanielk1977# focus of this file is testing "SELECT count(*)" statements.
134d9c1dd2Sdanielk1977#
144d9c1dd2Sdanielk1977
154d9c1dd2Sdanielk1977set testdir [file dirname $argv0]
164d9c1dd2Sdanielk1977source $testdir/tester.tcl
174d9c1dd2Sdanielk1977
187a895a80Sdanielk1977# Test plan:
197a895a80Sdanielk1977#
20818e39adSdrh#  count-0.*: Make sure count(*) works on an empty database.  (Ticket #3774)
21818e39adSdrh#
227a895a80Sdanielk1977#  count-1.*: Test that the OP_Count instruction appears to work on both
237a895a80Sdanielk1977#             tables and indexes. Test both when they contain 0 entries,
247a895a80Sdanielk1977#             when all entries are on the root page, and when the b-tree
257a895a80Sdanielk1977#             forms a structure 2 and 3 levels deep.
267a895a80Sdanielk1977#
277a895a80Sdanielk1977#
287a895a80Sdanielk1977
29818e39adSdrhdo_test count-0.1 {
30818e39adSdrh  db eval {
31818e39adSdrh     SELECT count(*) FROM sqlite_master;
32818e39adSdrh  }
33818e39adSdrh} {0}
34818e39adSdrh
354d9c1dd2Sdanielk1977set iTest 0
364d9c1dd2Sdanielk1977foreach zIndex [list {
374d9c1dd2Sdanielk1977  /* no-op */
384d9c1dd2Sdanielk1977} {
394d9c1dd2Sdanielk1977  CREATE INDEX i1 ON t1(a);
404d9c1dd2Sdanielk1977}] {
414d9c1dd2Sdanielk1977  incr iTest
424d9c1dd2Sdanielk1977  do_test count-1.$iTest.1 {
434d9c1dd2Sdanielk1977    execsql {
444d9c1dd2Sdanielk1977      DROP TABLE IF EXISTS t1;
454d9c1dd2Sdanielk1977      CREATE TABLE t1(a, b);
464d9c1dd2Sdanielk1977    }
474d9c1dd2Sdanielk1977    execsql $zIndex
487a895a80Sdanielk1977    execsql { SELECT count(*) FROM t1 }
497a895a80Sdanielk1977  } {0}
507a895a80Sdanielk1977
517a895a80Sdanielk1977  do_test count-1.$iTest.2 {
524d9c1dd2Sdanielk1977    execsql {
534d9c1dd2Sdanielk1977      INSERT INTO t1 VALUES(1, 2);
544d9c1dd2Sdanielk1977      INSERT INTO t1 VALUES(3, 4);
554d9c1dd2Sdanielk1977      SELECT count(*) FROM t1;
564d9c1dd2Sdanielk1977    }
574d9c1dd2Sdanielk1977  } {2}
584d9c1dd2Sdanielk1977
597a895a80Sdanielk1977  do_test count-1.$iTest.3 {
604d9c1dd2Sdanielk1977    execsql {
614d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --   4
624d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --   8
634d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --  16
644d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --  32
654d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --  64
664d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 128
674d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 256
684d9c1dd2Sdanielk1977      SELECT count(*) FROM t1;
694d9c1dd2Sdanielk1977    }
704d9c1dd2Sdanielk1977  } {256}
714d9c1dd2Sdanielk1977
727a895a80Sdanielk1977  do_test count-1.$iTest.4 {
734d9c1dd2Sdanielk1977    execsql {
744d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --  512
754d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 1024
764d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 2048
774d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 4096
784d9c1dd2Sdanielk1977      SELECT count(*) FROM t1;
794d9c1dd2Sdanielk1977    }
804d9c1dd2Sdanielk1977  } {4096}
814d9c1dd2Sdanielk1977
827a895a80Sdanielk1977  do_test count-1.$iTest.5 {
834d9c1dd2Sdanielk1977    execsql {
844d9c1dd2Sdanielk1977      BEGIN;
854d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          --  8192
864d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 16384
874d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 32768
884d9c1dd2Sdanielk1977      INSERT INTO t1 SELECT * FROM t1;          -- 65536
894d9c1dd2Sdanielk1977      COMMIT;
904d9c1dd2Sdanielk1977      SELECT count(*) FROM t1;
914d9c1dd2Sdanielk1977    }
924d9c1dd2Sdanielk1977  } {65536}
934d9c1dd2Sdanielk1977}
944d9c1dd2Sdanielk1977
957a895a80Sdanielk1977proc uses_op_count {sql} {
967a895a80Sdanielk1977  if {[lsearch [execsql "EXPLAIN $sql"] Count]>=0} {
977a895a80Sdanielk1977    return 1;
987a895a80Sdanielk1977  }
997a895a80Sdanielk1977  return 0
1007a895a80Sdanielk1977}
1017a895a80Sdanielk1977
1027a895a80Sdanielk1977do_test count-2.1 {
1037a895a80Sdanielk1977  execsql {
1047a895a80Sdanielk1977    CREATE TABLE t2(a, b);
1057a895a80Sdanielk1977  }
1067a895a80Sdanielk1977  uses_op_count {SELECT count(*) FROM t2}
1077a895a80Sdanielk1977} {1}
1087a895a80Sdanielk1977do_test count-2.2 {
1097a895a80Sdanielk1977  catchsql {SELECT count(DISTINCT *) FROM t2}
1107a895a80Sdanielk1977} {1 {near "*": syntax error}}
1117a895a80Sdanielk1977do_test count-2.3 {
1127a895a80Sdanielk1977  uses_op_count {SELECT count(DISTINCT a) FROM t2}
1137a895a80Sdanielk1977} {0}
1147a895a80Sdanielk1977do_test count-2.4 {
1157a895a80Sdanielk1977  uses_op_count {SELECT count(a) FROM t2}
1167a895a80Sdanielk1977} {0}
1177a895a80Sdanielk1977do_test count-2.5 {
1187a895a80Sdanielk1977  uses_op_count {SELECT count() FROM t2}
1197a895a80Sdanielk1977} {1}
1207a895a80Sdanielk1977do_test count-2.6 {
1217a895a80Sdanielk1977  catchsql {SELECT count(DISTINCT) FROM t2}
1227a895a80Sdanielk1977} {1 {DISTINCT aggregates must have exactly one argument}}
1237a895a80Sdanielk1977do_test count-2.7 {
1247a895a80Sdanielk1977  uses_op_count {SELECT count(*)+1 FROM t2}
1257a895a80Sdanielk1977} {0}
1267a895a80Sdanielk1977do_test count-2.8 {
1277a895a80Sdanielk1977  uses_op_count {SELECT count(*) FROM t2 WHERE a IS NOT NULL}
1287a895a80Sdanielk1977} {0}
129*b9294de1Sdrhdo_execsql_test count-2.9a {
130*b9294de1Sdrh  SELECT count(*) FROM t2 HAVING count(*)>1;
131*b9294de1Sdrh} {}
132*b9294de1Sdrhdo_execsql_test count-2.9b {
133*b9294de1Sdrh  SELECT count(*) FROM t2 HAVING count(*)<10;
134*b9294de1Sdrh} {0}
1357a895a80Sdanielk1977do_test count-2.10 {
1367a895a80Sdanielk1977  uses_op_count {SELECT count(*) FROM (SELECT 1)}
1377a895a80Sdanielk1977} {0}
1387a895a80Sdanielk1977do_test count-2.11 {
1397a895a80Sdanielk1977  execsql { CREATE VIEW v1 AS SELECT 1 AS a }
1407a895a80Sdanielk1977  uses_op_count {SELECT count(*) FROM v1}
1417a895a80Sdanielk1977} {0}
1427a895a80Sdanielk1977do_test count-2.12 {
1437a895a80Sdanielk1977  uses_op_count {SELECT count(*), max(a) FROM t2}
1447a895a80Sdanielk1977} {0}
1457a895a80Sdanielk1977do_test count-2.13 {
1467a895a80Sdanielk1977  uses_op_count {SELECT count(*) FROM t1, t2}
1477a895a80Sdanielk1977} {0}
1487a895a80Sdanielk1977
14902f33725Sdanielk1977ifcapable vtab {
15002f33725Sdanielk1977  register_echo_module [sqlite3_connection_pointer db]
15102f33725Sdanielk1977  do_test count-2.14 {
15202f33725Sdanielk1977    execsql { CREATE VIRTUAL TABLE techo USING echo(t1); }
15302f33725Sdanielk1977    uses_op_count {SELECT count(*) FROM techo}
15402f33725Sdanielk1977  } {0}
15502f33725Sdanielk1977}
15602f33725Sdanielk1977
1577a895a80Sdanielk1977do_test count-3.1 {
1587a895a80Sdanielk1977  execsql {
1597a895a80Sdanielk1977    CREATE TABLE t3(a, b);
1607a895a80Sdanielk1977    SELECT a FROM (SELECT count(*) AS a FROM t3) WHERE a==0;
1617a895a80Sdanielk1977  }
1627a895a80Sdanielk1977} {0}
1637a895a80Sdanielk1977do_test count-3.2 {
1647a895a80Sdanielk1977  execsql {
1657a895a80Sdanielk1977    SELECT a FROM (SELECT count(*) AS a FROM t3) WHERE a==1;
1667a895a80Sdanielk1977  }
1677a895a80Sdanielk1977} {}
1687a895a80Sdanielk1977
16902f33725Sdanielk1977do_test count-4.1 {
17002f33725Sdanielk1977  execsql {
17102f33725Sdanielk1977    CREATE TABLE t4(a, b);
17202f33725Sdanielk1977    INSERT INTO t4 VALUES('a', 'b');
17302f33725Sdanielk1977    CREATE INDEX t4i1 ON t4(b, a);
17402f33725Sdanielk1977    SELECT count(*) FROM t4;
17502f33725Sdanielk1977  }
17602f33725Sdanielk1977} {1}
17702f33725Sdanielk1977do_test count-4.2 {
17802f33725Sdanielk1977  execsql {
17902f33725Sdanielk1977    CREATE INDEX t4i2 ON t4(b);
18002f33725Sdanielk1977    SELECT count(*) FROM t4;
18102f33725Sdanielk1977  }
18202f33725Sdanielk1977} {1}
18302f33725Sdanielk1977do_test count-4.3 {
18402f33725Sdanielk1977  execsql {
18502f33725Sdanielk1977    DROP INDEX t4i1;
18602f33725Sdanielk1977    CREATE INDEX t4i1 ON t4(b, a);
18702f33725Sdanielk1977    SELECT count(*) FROM t4;
18802f33725Sdanielk1977  }
18902f33725Sdanielk1977} {1}
19002f33725Sdanielk1977
191abcc1941Sdrhdo_execsql_test count-5.1 {
192abcc1941Sdrh  CREATE TABLE t5(a TEXT PRIMARY KEY, b VARCHAR(50)) WITHOUT ROWID;
193abcc1941Sdrh  INSERT INTO t5 VALUES('bison','jazz');
194abcc1941Sdrh  SELECT count(*) FROM t5;
195abcc1941Sdrh} {1}
19602f33725Sdanielk1977
1977c052da5Sdrhdo_catchsql_test count-6.1 {
1987c052da5Sdrh  CREATE TABLE t6(x);
1997c052da5Sdrh  SELECT count(DISTINCT) FROM t6 GROUP BY x;
2007c052da5Sdrh} {1 {DISTINCT aggregates must have exactly one argument}}
2017c052da5Sdrh
20298aa1d73Sdrh# 2020-05-08.
20398aa1d73Sdrh# The count() optimization should honor the NOT INDEXED clause
20498aa1d73Sdrh#
20598aa1d73Sdrhreset_db
20698aa1d73Sdrhdo_execsql_test count-7.1 {
20798aa1d73Sdrh  CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c VARCHAR(1000));
20898aa1d73Sdrh  CREATE INDEX t1b ON t1(b);
20998aa1d73Sdrh  INSERT INTO t1(a,b,c) values(1,2,'count.test cases for NOT INDEXED');
21098aa1d73Sdrh  ANALYZE;
21198aa1d73Sdrh  UPDATE sqlite_stat1 SET stat='1000000 10' WHERE idx='t1b';
21298aa1d73Sdrh  ANALYZE sqlite_master;
21398aa1d73Sdrh}
21498aa1d73Sdrhdo_eqp_test count-7.2 {
21598aa1d73Sdrh  SELECT count(1) FROM t1;
21698aa1d73Sdrh} {
21798aa1d73Sdrh  QUERY PLAN
2188210233cSdrh  `--SCAN t1 USING COVERING INDEX t1b
21998aa1d73Sdrh}
22098aa1d73Sdrhdo_eqp_test count-7.3 {
22198aa1d73Sdrh  SELECT count(1) FROM t1 NOT INDEXED
22298aa1d73Sdrh} {
22398aa1d73Sdrh  QUERY PLAN
2248210233cSdrh  `--SCAN t1
22598aa1d73Sdrh}
22698aa1d73Sdrhdo_eqp_test count-7.3 {
22798aa1d73Sdrh  SELECT count(*) FROM t1;
22898aa1d73Sdrh} {
22998aa1d73Sdrh  QUERY PLAN
2308210233cSdrh  `--SCAN t1 USING COVERING INDEX t1b
23198aa1d73Sdrh}
23298aa1d73Sdrhdo_eqp_test count-7.4 {
23398aa1d73Sdrh  SELECT count(*) FROM t1 NOT INDEXED
23498aa1d73Sdrh} {
23598aa1d73Sdrh  QUERY PLAN
2368210233cSdrh  `--SCAN t1
23798aa1d73Sdrh}
23898aa1d73Sdrh
2398745f8a3Sdando_execsql_test count-8.0 {
2408745f8a3Sdan  CREATE TABLE t7(a INT,b TEXT,c BLOB,d REAL);
2418745f8a3Sdan  CREATE TABLE t8(a INT,b TEXT,c BLOB,d REAL);
2428745f8a3Sdan  CREATE INDEX t8a ON t8(a);
2438745f8a3Sdan}
2448745f8a3Sdando_catchsql_test count-8.1 {
2458745f8a3Sdan  SELECT * FROM t8 WHERE (a, b) IN (
2468745f8a3Sdan      SELECT count(t8.b), count(*) FROM t7 AS ra0 ORDER BY count(*)
2478745f8a3Sdan  ) AND t8.b=0;
2488745f8a3Sdan} {1 {misuse of aggregate: count()}}
2498745f8a3Sdan
25098aa1d73Sdrh
2514d9c1dd2Sdanielk1977finish_test
252