CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
select3.test437 linesDownload Raw Back to test
1# 2001 September 152#3# The author disclaims copyright to this source code.  In place of4# 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.  The12# focus of this file is testing aggregate functions and the13# GROUP BY and HAVING clauses of SELECT statements.14#15# $Id: select3.test,v 1.23 2008/01/16 18:20:42 danielk1977 Exp $16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 20# Build some test data21#22do_test select3-1.0 {23  execsql {24    CREATE TABLE t1(n int, log int);25    BEGIN;26  }27  for {set i 1} {$i<32} {incr i} {28    for {set j 0} {(1<<$j)<$i} {incr j} {}29    execsql "INSERT INTO t1 VALUES($i,$j)"30  }31  execsql {32    COMMIT33  }34  execsql {SELECT DISTINCT log FROM t1 ORDER BY log}35} {0 1 2 3 4 5}36 37# Basic aggregate functions.38#39do_test select3-1.1 {40  execsql {SELECT count(*) FROM t1}41} {31}42do_test select3-1.2 {43  execsql {44    SELECT min(n),min(log),max(n),max(log),sum(n),sum(log),avg(n),avg(log)45    FROM t146  }47} {1 0 31 5 496 124 16.0 4.0}48do_test select3-1.3 {49  execsql {SELECT max(n)/avg(n), max(log)/avg(log) FROM t1}50} {1.9375 1.25}51 52# Try some basic GROUP BY clauses53#54do_test select3-2.1 {55  execsql {SELECT log, count(*) FROM t1 GROUP BY log ORDER BY log}56} {0 1 1 1 2 2 3 4 4 8 5 15}57do_test select3-2.2 {58  execsql {SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log}59} {0 1 1 2 2 3 3 5 4 9 5 17}60do_test select3-2.3.1 {61  execsql {SELECT log, avg(n) FROM t1 GROUP BY log ORDER BY log}62} {0 1.0 1 2.0 2 3.5 3 6.5 4 12.5 5 24.0}63do_test select3-2.3.2 {64  execsql {SELECT log, avg(n)+1 FROM t1 GROUP BY log ORDER BY log}65} {0 2.0 1 3.0 2 4.5 3 7.5 4 13.5 5 25.0}66do_test select3-2.4 {67  execsql {SELECT log, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log}68} {0 0.0 1 0.0 2 0.5 3 1.5 4 3.5 5 7.0}69do_test select3-2.5 {70  execsql {SELECT log*2+1, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log}71} {1 0.0 3 0.0 5 0.5 7 1.5 9 3.5 11 7.0}72do_test select3-2.6 {73  execsql {74    SELECT log*2+1 as x, count(*) FROM t1 GROUP BY x ORDER BY x75  }76} {1 1 3 1 5 2 7 4 9 8 11 15}77do_test select3-2.7 {78  execsql {79    SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY y, x80  }81} {1 1 3 1 5 2 7 4 9 8 11 15}82do_test select3-2.8 {83  execsql {84    SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY 10-(x+y)85  }86} {11 15 9 8 7 4 5 2 3 1 1 1}87#do_test select3-2.9 {88#  catchsql {89#    SELECT log, count(*) FROM t1 GROUP BY 'x' ORDER BY log;90#  }91#} {1 {GROUP BY terms must not be non-integer constants}}92do_test select3-2.10 {93  catchsql {94    SELECT log, count(*) FROM t1 GROUP BY 0 ORDER BY log;95  }96} {1 {1st GROUP BY term out of range - should be between 1 and 2}}97do_test select3-2.11 {98  catchsql {99    SELECT log, count(*) FROM t1 GROUP BY 3 ORDER BY log;100  }101} {1 {1st GROUP BY term out of range - should be between 1 and 2}}102do_test select3-2.12 {103  catchsql {104    SELECT log, count(*) FROM t1 GROUP BY 1 ORDER BY log;105  }106} {0 {0 1 1 1 2 2 3 4 4 8 5 15}}107 108# Cannot have an empty GROUP BY109do_test select3-2.13 {110  catchsql {111    SELECT log, count(*) FROM t1 GROUP BY ORDER BY log;112  }113} {1 {near "ORDER": syntax error}}114do_test select3-2.14 {115  catchsql {116    SELECT log, count(*) FROM t1 GROUP BY;117  }118} {1 {near ";": syntax error}}119 120# Cannot have a HAVING without a GROUP BY121# 122# Update: As of 3.39.0, you can.123#124do_execsql_test select3-3.1 {125  SELECT log, count(*) FROM t1 HAVING log>=4126} {}127do_execsql_test select3-3.2 {128  SELECT count(*) FROM t1 HAVING log>=4129} {}130do_execsql_test select3-3.3 {131  SELECT count(*) FROM t1 HAVING log!=400132} {31}133 134# Toss in some HAVING clauses135#136do_test select3-4.1 {137  execsql {SELECT log, count(*) FROM t1 GROUP BY log HAVING log>=4 ORDER BY log}138} {4 8 5 15}139do_test select3-4.2 {140  execsql {141    SELECT log, count(*) FROM t1 142    GROUP BY log 143    HAVING count(*)>=4 144    ORDER BY log145  }146} {3 4 4 8 5 15}147do_test select3-4.3 {148  execsql {149    SELECT log, count(*) FROM t1 150    GROUP BY log 151    HAVING count(*)>=4 152    ORDER BY max(n)+0153  }154} {3 4 4 8 5 15}155do_test select3-4.4 {156  execsql {157    SELECT log AS x, count(*) AS y FROM t1 158    GROUP BY x159    HAVING y>=4 160    ORDER BY max(n)+0161  }162} {3 4 4 8 5 15}163do_test select3-4.5 {164  execsql {165    SELECT log AS x FROM t1 166    GROUP BY x167    HAVING count(*)>=4 168    ORDER BY max(n)+0169  }170} {3 4 5}171 172do_test select3-5.1 {173  execsql {174    SELECT log, count(*), avg(n), max(n+log*2) FROM t1 175    GROUP BY log 176    ORDER BY max(n+log*2)+0, avg(n)+0177  }178} {0 1 1.0 1 1 1 2.0 4 2 2 3.5 8 3 4 6.5 14 4 8 12.5 24 5 15 24.0 41}179do_test select3-5.2 {180  execsql {181    SELECT log, count(*), avg(n), max(n+log*2) FROM t1 182    GROUP BY log 183    ORDER BY max(n+log*2)+0, min(log,avg(n))+0184  }185} {0 1 1.0 1 1 1 2.0 4 2 2 3.5 8 3 4 6.5 14 4 8 12.5 24 5 15 24.0 41}186 187# Test sorting of GROUP BY results in the presence of an index188# on the GROUP BY column.189#190do_test select3-6.1 {191  execsql {192    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log;193  }194} {0 1 1 2 2 3 3 5 4 9 5 17}195do_test select3-6.2 {196  execsql {197    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC;198  }199} {5 17 4 9 3 5 2 3 1 2 0 1}200do_test select3-6.3 {201  execsql {202    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1;203  }204} {0 1 1 2 2 3 3 5 4 9 5 17}205do_test select3-6.4 {206  execsql {207    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC;208  }209} {5 17 4 9 3 5 2 3 1 2 0 1}210do_test select3-6.5 {211  execsql {212    CREATE INDEX i1 ON t1(log);213    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log;214  }215} {0 1 1 2 2 3 3 5 4 9 5 17}216do_test select3-6.6 {217  execsql {218    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC;219  }220} {5 17 4 9 3 5 2 3 1 2 0 1}221do_test select3-6.7 {222  execsql {223    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1;224  }225} {0 1 1 2 2 3 3 5 4 9 5 17}226do_test select3-6.8 {227  execsql {228    SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC;229  }230} {5 17 4 9 3 5 2 3 1 2 0 1}231 232# Sometimes an aggregate query can return no rows at all.233#234do_test select3-7.1 {235  execsql {236    CREATE TABLE t2(a,b);237    INSERT INTO t2 VALUES(1,2);238    SELECT a, sum(b) FROM t2 WHERE b=5 GROUP BY a;239  }240} {}241do_test select3-7.2 {242  execsql {243    SELECT a, sum(b) FROM t2 WHERE b=5;244  }245} {{} {}}246 247# If a table column is of type REAL but we are storing integer values248# in it, the values are stored as integers to take up less space.  The249# values are converted by to REAL as they are read out of the table.250# Make sure the GROUP BY clause does this conversion correctly.251# Ticket #2251.252#253do_test select3-8.1 {254  execsql {255    CREATE TABLE A (256      A1 DOUBLE,257      A2 VARCHAR COLLATE NOCASE,258      A3 DOUBLE259    );260    INSERT INTO A VALUES(39136,'ABC',1201900000);261    INSERT INTO A VALUES(39136,'ABC',1207000000);262    SELECT typeof(sum(a3)) FROM a;263  }264} {real}265do_test select3-8.2 {266  execsql {267    SELECT typeof(sum(a3)) FROM a GROUP BY a1;268  }269} {real}270 271# 2019-05-09 ticket https://sqlite.org/src/tktview/6c1d3febc00b22d457c7272#273unset -nocomplain x274foreach {id x} {275  100 127276  101 128277  102 -127278  103 -128279  104 -129280  110 32767281  111 32768282  112 -32767283  113 -32768284  114 -32769285  120 2147483647286  121 2147483648287  122 -2147483647288  123 -2147483648289  124 -2147483649290  130 140737488355327291  131 140737488355328292  132 -140737488355327293  133 -140737488355328294  134 -140737488355329295  140 9223372036854775807296  141 -9223372036854775807297  142 -9223372036854775808298  143 9223372036854775806299  144 9223372036854775805300  145 -9223372036854775806301  146 -9223372036854775805302 303} {304  set x [expr {$x+0}]305  do_execsql_test select3-8.$id {306     DROP TABLE IF EXISTS t1;307     CREATE TABLE t1 (c0, c1 REAL PRIMARY KEY);308     INSERT INTO t1(c0, c1) VALUES (0, $x), (0, 0);309     UPDATE t1 SET c0 = NULL;310     UPDATE OR REPLACE t1 SET c1 = 1;311     SELECT DISTINCT * FROM t1 WHERE (t1.c0 IS NULL);312     PRAGMA integrity_check;313  } {{} 1.0 ok}314}315 316# 2020-03-10 ticket e0c2ad1aa8a9c691317reset_db318do_execsql_test select3-9.100 {319  CREATE TABLE t0(c0 REAL, c1 REAL GENERATED ALWAYS AS (c0));320  INSERT INTO t0(c0) VALUES (1);321  SELECT * FROM t0 GROUP BY c0;322} {1.0 1.0}323 324reset_db325do_execsql_test select3.10.100 {326  CREATE TABLE t1(a, b);327  CREATE TABLE t2(c, d);328  SELECT max(t1.a), 329         (SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1) 330  FROM t1;331} {{} {}}332 333#-------------------------------------------------------------------------334# dbsqlfuzz crash-8e17857db2c5a9294c975123ac807156a6559f13.txt335# Associated with the flatten-left-join branch circa 2022-06-23.336#337foreach {tn sql} {338  1 {339    CREATE TABLE t1(a TEXT);340    CREATE TABLE t2(x INT);341    CREATE INDEX t2x ON t2(x);342    INSERT INTO t1 VALUES('abc');343  }344  2 {345    CREATE TABLE t1(a TEXT);346    CREATE TABLE t2(x INT);347    INSERT INTO t1 VALUES('abc');348  }349  3 {350    CREATE TABLE t1(a TEXT);351    CREATE TABLE t2(x INT);352    INSERT INTO t1 VALUES('abc');353    PRAGMA automatic_index=OFF;354  }355} {356  reset_db357  do_execsql_test select3-11.$tn.1 $sql 358  do_execsql_test select3.11.$tn.2 {359    SELECT max(a), val FROM t1 LEFT JOIN (360        SELECT 'constant' AS val FROM t2 WHERE x=1234361    )362  } {abc {}}363  do_execsql_test select3.11.$tn.3 {364    INSERT INTO t2 VALUES(123);365    SELECT max(a), val FROM t1 LEFT JOIN (366        SELECT 'constant' AS val FROM t2 WHERE x=1234367    )368  } {abc {}}369  do_execsql_test select3.11.$tn.4 {370    INSERT INTO t2 VALUES(1234);371    SELECT max(a), val FROM t1 LEFT JOIN (372        SELECT 'constant' AS val FROM t2 WHERE x=1234373    )374  } {abc constant}375}376 377reset_db378do_execsql_test 12.0 {379  CREATE TABLE t1(a);380  CREATE TABLE t2(x);381}382do_execsql_test 12.1 {383  SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;384}385do_execsql_test 12.2 {386  INSERT INTO t1 VALUES(1), (1), (2), (3);387  SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;388} {389  0 {}390  0 {}391  0 {}392}393do_execsql_test 12.3 {394  INSERT INTO t2 VALUES(45);395  SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;396} {397  2 59398  1 59399  1 59400}401do_execsql_test 12.4 {402  INSERT INTO t2 VALUES(210);403  SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;404} {405  4 59406  2 59407  2 59408}409do_execsql_test 12.5 {410  INSERT INTO t2 VALUES(NULL);411  SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;412} {413  4 59414  2 59415  2 59416}417do_execsql_test 12.6 {418  DELETE FROM t2;419  DELETE FROM t1;420  INSERT INTO t1 VALUES('value');421  INSERT INTO t2 VALUES('hello');422} {}423do_execsql_test 12.7 {424  SELECT group_concat(x), m FROM t1 425    LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;426} {427  hello 59428}429do_execsql_test 12.8 {430  SELECT group_concat(x), m, n FROM t1 431    LEFT JOIN (SELECT x, 59 AS m, 60 AS n FROM t2) GROUP BY a;432} {433  hello 59 60434}435 436finish_test437