1b19a2bc6Sdrh# 2001 September 15 2da93281eSdrh# 3b19a2bc6Sdrh# The author disclaims copyright to this source code. In place of 4b19a2bc6Sdrh# a legal notice, here is a blessing: 5da93281eSdrh# 6b19a2bc6Sdrh# May you do good and not evil. 7b19a2bc6Sdrh# May you find forgiveness for yourself and forgive others. 8b19a2bc6Sdrh# May you share freely, never taking more than you give. 9da93281eSdrh# 10da93281eSdrh#*********************************************************************** 11da93281eSdrh# This file implements regression tests for SQLite library. The 12da93281eSdrh# focus of this file is testing aggregate functions and the 13da93281eSdrh# GROUP BY and HAVING clauses of SELECT statements. 14da93281eSdrh# 1524acd8f9Sdanielk1977# $Id: select3.test,v 1.23 2008/01/16 18:20:42 danielk1977 Exp $ 16da93281eSdrh 17da93281eSdrhset testdir [file dirname $argv0] 18da93281eSdrhsource $testdir/tester.tcl 19da93281eSdrh 20da93281eSdrh# Build some test data 21da93281eSdrh# 22da93281eSdrhdo_test select3-1.0 { 23da93281eSdrh execsql { 24da93281eSdrh CREATE TABLE t1(n int, log int); 255f3b4ab5Sdrh BEGIN; 26da93281eSdrh } 275f3b4ab5Sdrh for {set i 1} {$i<32} {incr i} { 2824acd8f9Sdanielk1977 for {set j 0} {(1<<$j)<$i} {incr j} {} 295f3b4ab5Sdrh execsql "INSERT INTO t1 VALUES($i,$j)" 305f3b4ab5Sdrh } 315f3b4ab5Sdrh execsql { 325f3b4ab5Sdrh COMMIT 335f3b4ab5Sdrh } 34da93281eSdrh execsql {SELECT DISTINCT log FROM t1 ORDER BY log} 35da93281eSdrh} {0 1 2 3 4 5} 36da93281eSdrh 37da93281eSdrh# Basic aggregate functions. 38da93281eSdrh# 39da93281eSdrhdo_test select3-1.1 { 40da93281eSdrh execsql {SELECT count(*) FROM t1} 41da93281eSdrh} {31} 42da93281eSdrhdo_test select3-1.2 { 43da93281eSdrh execsql { 44da93281eSdrh SELECT min(n),min(log),max(n),max(log),sum(n),sum(log),avg(n),avg(log) 45da93281eSdrh FROM t1 46da93281eSdrh } 473d1d95e6Sdrh} {1 0 31 5 496 124 16.0 4.0} 48da93281eSdrhdo_test select3-1.3 { 49da93281eSdrh execsql {SELECT max(n)/avg(n), max(log)/avg(log) FROM t1} 50da93281eSdrh} {1.9375 1.25} 51da93281eSdrh 52da93281eSdrh# Try some basic GROUP BY clauses 53da93281eSdrh# 54da93281eSdrhdo_test select3-2.1 { 55da93281eSdrh execsql {SELECT log, count(*) FROM t1 GROUP BY log ORDER BY log} 56da93281eSdrh} {0 1 1 1 2 2 3 4 4 8 5 15} 57da93281eSdrhdo_test select3-2.2 { 58da93281eSdrh execsql {SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log} 59da93281eSdrh} {0 1 1 2 2 3 3 5 4 9 5 17} 608df447f0Sdrhdo_test select3-2.3.1 { 61da93281eSdrh execsql {SELECT log, avg(n) FROM t1 GROUP BY log ORDER BY log} 6292febd92Sdrh} {0 1.0 1 2.0 2 3.5 3 6.5 4 12.5 5 24.0} 638df447f0Sdrhdo_test select3-2.3.2 { 64da93281eSdrh execsql {SELECT log, avg(n)+1 FROM t1 GROUP BY log ORDER BY log} 658a51256cSdrh} {0 2.0 1 3.0 2 4.5 3 7.5 4 13.5 5 25.0} 66da93281eSdrhdo_test select3-2.4 { 67da93281eSdrh execsql {SELECT log, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log} 688a51256cSdrh} {0 0.0 1 0.0 2 0.5 3 1.5 4 3.5 5 7.0} 69da93281eSdrhdo_test select3-2.5 { 70da93281eSdrh execsql {SELECT log*2+1, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log} 718a51256cSdrh} {1 0.0 3 0.0 5 0.5 7 1.5 9 3.5 11 7.0} 72a2e00042Sdrhdo_test select3-2.6 { 73a2e00042Sdrh execsql { 74a2e00042Sdrh SELECT log*2+1 as x, count(*) FROM t1 GROUP BY x ORDER BY x 75a2e00042Sdrh } 76a2e00042Sdrh} {1 1 3 1 5 2 7 4 9 8 11 15} 77a2e00042Sdrhdo_test select3-2.7 { 78a2e00042Sdrh execsql { 79495c09a4Sdrh SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY y, x 80a2e00042Sdrh } 81495c09a4Sdrh} {1 1 3 1 5 2 7 4 9 8 11 15} 82a2e00042Sdrhdo_test select3-2.8 { 83a2e00042Sdrh execsql { 84a2e00042Sdrh SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY 10-(x+y) 85a2e00042Sdrh } 86a2e00042Sdrh} {11 15 9 8 7 4 5 2 3 1 1 1} 8718e87cffSdrh#do_test select3-2.9 { 8818e87cffSdrh# catchsql { 8918e87cffSdrh# SELECT log, count(*) FROM t1 GROUP BY 'x' ORDER BY log; 9018e87cffSdrh# } 9118e87cffSdrh#} {1 {GROUP BY terms must not be non-integer constants}} 9288eee38aSdrhdo_test select3-2.10 { 9388eee38aSdrh catchsql { 9488eee38aSdrh SELECT log, count(*) FROM t1 GROUP BY 0 ORDER BY log; 9588eee38aSdrh } 9601874bfcSdanielk1977} {1 {1st GROUP BY term out of range - should be between 1 and 2}} 9788eee38aSdrhdo_test select3-2.11 { 9888eee38aSdrh catchsql { 9988eee38aSdrh SELECT log, count(*) FROM t1 GROUP BY 3 ORDER BY log; 10088eee38aSdrh } 10101874bfcSdanielk1977} {1 {1st GROUP BY term out of range - should be between 1 and 2}} 10288eee38aSdrhdo_test select3-2.12 { 10388eee38aSdrh catchsql { 10488eee38aSdrh SELECT log, count(*) FROM t1 GROUP BY 1 ORDER BY log; 10588eee38aSdrh } 10688eee38aSdrh} {0 {0 1 1 1 2 2 3 4 4 8 5 15}} 1079245c243Sdrh 1089245c243Sdrh# Cannot have an empty GROUP BY 1099245c243Sdrhdo_test select3-2.13 { 1109245c243Sdrh catchsql { 1119245c243Sdrh SELECT log, count(*) FROM t1 GROUP BY ORDER BY log; 1129245c243Sdrh } 1139245c243Sdrh} {1 {near "ORDER": syntax error}} 1149245c243Sdrhdo_test select3-2.14 { 1159245c243Sdrh catchsql { 1169245c243Sdrh SELECT log, count(*) FROM t1 GROUP BY; 1179245c243Sdrh } 1189245c243Sdrh} {1 {near ";": syntax error}} 119da93281eSdrh 120da93281eSdrh# Cannot have a HAVING without a GROUP BY 121da93281eSdrh# 1222c1b1ddcSdan# Update: As of 3.39.0, you can. 1232c1b1ddcSdan# 124b9294de1Sdrhdo_execsql_test select3-3.1 { 125b9294de1Sdrh SELECT log, count(*) FROM t1 HAVING log>=4 126b9294de1Sdrh} {} 1272c1b1ddcSdando_execsql_test select3-3.2 { 1282c1b1ddcSdan SELECT count(*) FROM t1 HAVING log>=4 1292c1b1ddcSdan} {} 1302c1b1ddcSdando_execsql_test select3-3.3 { 1312c1b1ddcSdan SELECT count(*) FROM t1 HAVING log!=400 1322c1b1ddcSdan} {31} 133da93281eSdrh 134da93281eSdrh# Toss in some HAVING clauses 135da93281eSdrh# 136da93281eSdrhdo_test select3-4.1 { 137da93281eSdrh execsql {SELECT log, count(*) FROM t1 GROUP BY log HAVING log>=4 ORDER BY log} 138da93281eSdrh} {4 8 5 15} 139da93281eSdrhdo_test select3-4.2 { 140da93281eSdrh execsql { 141da93281eSdrh SELECT log, count(*) FROM t1 142da93281eSdrh GROUP BY log 143da93281eSdrh HAVING count(*)>=4 144da93281eSdrh ORDER BY log 145da93281eSdrh } 146da93281eSdrh} {3 4 4 8 5 15} 147da93281eSdrhdo_test select3-4.3 { 148da93281eSdrh execsql { 149da93281eSdrh SELECT log, count(*) FROM t1 150da93281eSdrh GROUP BY log 151da93281eSdrh HAVING count(*)>=4 152736c22b8Sdrh ORDER BY max(n)+0 153da93281eSdrh } 154da93281eSdrh} {3 4 4 8 5 15} 155a2e00042Sdrhdo_test select3-4.4 { 156a2e00042Sdrh execsql { 157a2e00042Sdrh SELECT log AS x, count(*) AS y FROM t1 158a2e00042Sdrh GROUP BY x 159a2e00042Sdrh HAVING y>=4 160736c22b8Sdrh ORDER BY max(n)+0 161a2e00042Sdrh } 162a2e00042Sdrh} {3 4 4 8 5 15} 163c66c5a26Sdrhdo_test select3-4.5 { 164c66c5a26Sdrh execsql { 165c66c5a26Sdrh SELECT log AS x FROM t1 166c66c5a26Sdrh GROUP BY x 167c66c5a26Sdrh HAVING count(*)>=4 168736c22b8Sdrh ORDER BY max(n)+0 169c66c5a26Sdrh } 170c66c5a26Sdrh} {3 4 5} 171da93281eSdrh 1724cfa7934Sdrhdo_test select3-5.1 { 1734cfa7934Sdrh execsql { 1744cfa7934Sdrh SELECT log, count(*), avg(n), max(n+log*2) FROM t1 1754cfa7934Sdrh GROUP BY log 176736c22b8Sdrh ORDER BY max(n+log*2)+0, avg(n)+0 1774cfa7934Sdrh } 17892febd92Sdrh} {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} 1794cfa7934Sdrhdo_test select3-5.2 { 1804cfa7934Sdrh execsql { 1814cfa7934Sdrh SELECT log, count(*), avg(n), max(n+log*2) FROM t1 1824cfa7934Sdrh GROUP BY log 183736c22b8Sdrh ORDER BY max(n+log*2)+0, min(log,avg(n))+0 1844cfa7934Sdrh } 18592febd92Sdrh} {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} 1864cfa7934Sdrh 18768d2e591Sdrh# Test sorting of GROUP BY results in the presence of an index 18868d2e591Sdrh# on the GROUP BY column. 18968d2e591Sdrh# 19068d2e591Sdrhdo_test select3-6.1 { 19168d2e591Sdrh execsql { 19268d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log; 19368d2e591Sdrh } 19468d2e591Sdrh} {0 1 1 2 2 3 3 5 4 9 5 17} 19568d2e591Sdrhdo_test select3-6.2 { 19668d2e591Sdrh execsql { 19768d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC; 19868d2e591Sdrh } 19968d2e591Sdrh} {5 17 4 9 3 5 2 3 1 2 0 1} 20068d2e591Sdrhdo_test select3-6.3 { 20168d2e591Sdrh execsql { 20268d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1; 20368d2e591Sdrh } 20468d2e591Sdrh} {0 1 1 2 2 3 3 5 4 9 5 17} 20568d2e591Sdrhdo_test select3-6.4 { 20668d2e591Sdrh execsql { 20768d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC; 20868d2e591Sdrh } 20968d2e591Sdrh} {5 17 4 9 3 5 2 3 1 2 0 1} 21068d2e591Sdrhdo_test select3-6.5 { 21168d2e591Sdrh execsql { 21268d2e591Sdrh CREATE INDEX i1 ON t1(log); 21368d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log; 21468d2e591Sdrh } 21568d2e591Sdrh} {0 1 1 2 2 3 3 5 4 9 5 17} 21668d2e591Sdrhdo_test select3-6.6 { 21768d2e591Sdrh execsql { 21868d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC; 21968d2e591Sdrh } 22068d2e591Sdrh} {5 17 4 9 3 5 2 3 1 2 0 1} 22168d2e591Sdrhdo_test select3-6.7 { 22268d2e591Sdrh execsql { 22368d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1; 22468d2e591Sdrh } 22568d2e591Sdrh} {0 1 1 2 2 3 3 5 4 9 5 17} 22668d2e591Sdrhdo_test select3-6.8 { 22768d2e591Sdrh execsql { 22868d2e591Sdrh SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC; 22968d2e591Sdrh } 23068d2e591Sdrh} {5 17 4 9 3 5 2 3 1 2 0 1} 23168d2e591Sdrh 23297571957Sdrh# Sometimes an aggregate query can return no rows at all. 23397571957Sdrh# 23497571957Sdrhdo_test select3-7.1 { 23597571957Sdrh execsql { 23697571957Sdrh CREATE TABLE t2(a,b); 23797571957Sdrh INSERT INTO t2 VALUES(1,2); 23897571957Sdrh SELECT a, sum(b) FROM t2 WHERE b=5 GROUP BY a; 23997571957Sdrh } 24097571957Sdrh} {} 24197571957Sdrhdo_test select3-7.2 { 24297571957Sdrh execsql { 24397571957Sdrh SELECT a, sum(b) FROM t2 WHERE b=5; 24497571957Sdrh } 245c2bd913aSdrh} {{} {}} 24668d2e591Sdrh 247945498f3Sdrh# If a table column is of type REAL but we are storing integer values 248945498f3Sdrh# in it, the values are stored as integers to take up less space. The 249945498f3Sdrh# values are converted by to REAL as they are read out of the table. 250945498f3Sdrh# Make sure the GROUP BY clause does this conversion correctly. 251945498f3Sdrh# Ticket #2251. 252945498f3Sdrh# 253945498f3Sdrhdo_test select3-8.1 { 254945498f3Sdrh execsql { 255945498f3Sdrh CREATE TABLE A ( 256945498f3Sdrh A1 DOUBLE, 257945498f3Sdrh A2 VARCHAR COLLATE NOCASE, 258945498f3Sdrh A3 DOUBLE 259945498f3Sdrh ); 260945498f3Sdrh INSERT INTO A VALUES(39136,'ABC',1201900000); 261945498f3Sdrh INSERT INTO A VALUES(39136,'ABC',1207000000); 262945498f3Sdrh SELECT typeof(sum(a3)) FROM a; 263945498f3Sdrh } 264945498f3Sdrh} {real} 265945498f3Sdrhdo_test select3-8.2 { 266945498f3Sdrh execsql { 267945498f3Sdrh SELECT typeof(sum(a3)) FROM a GROUP BY a1; 268945498f3Sdrh } 269945498f3Sdrh} {real} 27068d2e591Sdrh 2716bab6f2bSdrh# 2019-05-09 ticket https://www.sqlite.org/src/tktview/6c1d3febc00b22d457c7 2726bab6f2bSdrh# 2736bab6f2bSdrhunset -nocomplain x 2746bab6f2bSdrhforeach {id x} { 2756bab6f2bSdrh 100 127 2766bab6f2bSdrh 101 128 2776bab6f2bSdrh 102 -127 2786bab6f2bSdrh 103 -128 2796bab6f2bSdrh 104 -129 2806bab6f2bSdrh 110 32767 2816bab6f2bSdrh 111 32768 2826bab6f2bSdrh 112 -32767 2836bab6f2bSdrh 113 -32768 2846bab6f2bSdrh 114 -32769 2856bab6f2bSdrh 120 2147483647 2866bab6f2bSdrh 121 2147483648 2876bab6f2bSdrh 122 -2147483647 2886bab6f2bSdrh 123 -2147483648 2896bab6f2bSdrh 124 -2147483649 2906bab6f2bSdrh 130 140737488355327 2916bab6f2bSdrh 131 140737488355328 2926bab6f2bSdrh 132 -140737488355327 2936bab6f2bSdrh 133 -140737488355328 2946bab6f2bSdrh 134 -140737488355329 2956bab6f2bSdrh 140 9223372036854775807 2966bab6f2bSdrh 141 -9223372036854775807 2976bab6f2bSdrh 142 -9223372036854775808 2986bab6f2bSdrh 143 9223372036854775806 2996bab6f2bSdrh 144 9223372036854775805 3006bab6f2bSdrh 145 -9223372036854775806 3016bab6f2bSdrh 146 -9223372036854775805 3026bab6f2bSdrh 3036bab6f2bSdrh} { 3046bab6f2bSdrh set x [expr {$x+0}] 3056bab6f2bSdrh do_execsql_test select3-8.$id { 3066bab6f2bSdrh DROP TABLE IF EXISTS t1; 3076bab6f2bSdrh CREATE TABLE t1 (c0, c1 REAL PRIMARY KEY); 3086bab6f2bSdrh INSERT INTO t1(c0, c1) VALUES (0, $x), (0, 0); 3096bab6f2bSdrh UPDATE t1 SET c0 = NULL; 3106bab6f2bSdrh UPDATE OR REPLACE t1 SET c1 = 1; 3116bab6f2bSdrh SELECT DISTINCT * FROM t1 WHERE (t1.c0 IS NULL); 3126bab6f2bSdrh PRAGMA integrity_check; 3136bab6f2bSdrh } {{} 1.0 ok} 3146bab6f2bSdrh} 3156bab6f2bSdrh 3160c76e892Sdrh# 2020-03-10 ticket e0c2ad1aa8a9c691 3170c76e892Sdrhreset_db 3180c76e892Sdrhdo_execsql_test select3-9.100 { 3190c76e892Sdrh CREATE TABLE t0(c0 REAL, c1 REAL GENERATED ALWAYS AS (c0)); 3200c76e892Sdrh INSERT INTO t0(c0) VALUES (1); 3210c76e892Sdrh SELECT * FROM t0 GROUP BY c0; 3220c76e892Sdrh} {1.0 1.0} 3230c76e892Sdrh 324cd653a32Sdanreset_db 325cd653a32Sdando_execsql_test select3.10.100 { 326cd653a32Sdan CREATE TABLE t1(a, b); 327cd653a32Sdan CREATE TABLE t2(c, d); 328cd653a32Sdan SELECT max(t1.a), 329cd653a32Sdan (SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1) 330cd653a32Sdan FROM t1; 331cd653a32Sdan} {{} {}} 332cd653a32Sdan 3336b6d6c6bSdrh#------------------------------------------------------------------------- 3346b6d6c6bSdrh# dbsqlfuzz crash-8e17857db2c5a9294c975123ac807156a6559f13.txt 3356b6d6c6bSdrh# Associated with the flatten-left-join branch circa 2022-06-23. 3366b6d6c6bSdrh# 3376b6d6c6bSdrhforeach {tn sql} { 3386b6d6c6bSdrh 1 { 3396b6d6c6bSdrh CREATE TABLE t1(a TEXT); 3406b6d6c6bSdrh CREATE TABLE t2(x INT); 3416b6d6c6bSdrh CREATE INDEX t2x ON t2(x); 3426b6d6c6bSdrh INSERT INTO t1 VALUES('abc'); 3436b6d6c6bSdrh } 3446b6d6c6bSdrh 2 { 3456b6d6c6bSdrh CREATE TABLE t1(a TEXT); 3466b6d6c6bSdrh CREATE TABLE t2(x INT); 3476b6d6c6bSdrh INSERT INTO t1 VALUES('abc'); 3486b6d6c6bSdrh } 3496b6d6c6bSdrh 3 { 3506b6d6c6bSdrh CREATE TABLE t1(a TEXT); 3516b6d6c6bSdrh CREATE TABLE t2(x INT); 3526b6d6c6bSdrh INSERT INTO t1 VALUES('abc'); 3536b6d6c6bSdrh PRAGMA automatic_index=OFF; 3546b6d6c6bSdrh } 3556b6d6c6bSdrh} { 3566b6d6c6bSdrh reset_db 3576b6d6c6bSdrh do_execsql_test select3-11.$tn.1 $sql 3586b6d6c6bSdrh do_execsql_test select3.11.$tn.2 { 3596b6d6c6bSdrh SELECT max(a), val FROM t1 LEFT JOIN ( 3606b6d6c6bSdrh SELECT 'constant' AS val FROM t2 WHERE x=1234 3616b6d6c6bSdrh ) 3626b6d6c6bSdrh } {abc {}} 3636b6d6c6bSdrh do_execsql_test select3.11.$tn.3 { 3646b6d6c6bSdrh INSERT INTO t2 VALUES(123); 3656b6d6c6bSdrh SELECT max(a), val FROM t1 LEFT JOIN ( 3666b6d6c6bSdrh SELECT 'constant' AS val FROM t2 WHERE x=1234 3676b6d6c6bSdrh ) 3686b6d6c6bSdrh } {abc {}} 3696b6d6c6bSdrh do_execsql_test select3.11.$tn.4 { 3706b6d6c6bSdrh INSERT INTO t2 VALUES(1234); 3716b6d6c6bSdrh SELECT max(a), val FROM t1 LEFT JOIN ( 3726b6d6c6bSdrh SELECT 'constant' AS val FROM t2 WHERE x=1234 3736b6d6c6bSdrh ) 3746b6d6c6bSdrh } {abc constant} 3756b6d6c6bSdrh} 3766b6d6c6bSdrh 377*4784a78dSdanreset_db 378*4784a78dSdando_execsql_test 12.0 { 379*4784a78dSdan CREATE TABLE t1(a); 380*4784a78dSdan CREATE TABLE t2(x); 381*4784a78dSdan} 382*4784a78dSdando_execsql_test 12.1 { 383*4784a78dSdan SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 384*4784a78dSdan} 385*4784a78dSdando_execsql_test 12.2 { 386*4784a78dSdan INSERT INTO t1 VALUES(1), (1), (2), (3); 387*4784a78dSdan SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 388*4784a78dSdan} { 389*4784a78dSdan 0 {} 390*4784a78dSdan 0 {} 391*4784a78dSdan 0 {} 392*4784a78dSdan} 393*4784a78dSdando_execsql_test 12.3 { 394*4784a78dSdan INSERT INTO t2 VALUES(45); 395*4784a78dSdan SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 396*4784a78dSdan} { 397*4784a78dSdan 2 59 398*4784a78dSdan 1 59 399*4784a78dSdan 1 59 400*4784a78dSdan} 401*4784a78dSdando_execsql_test 12.4 { 402*4784a78dSdan INSERT INTO t2 VALUES(210); 403*4784a78dSdan SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 404*4784a78dSdan} { 405*4784a78dSdan 4 59 406*4784a78dSdan 2 59 407*4784a78dSdan 2 59 408*4784a78dSdan} 409*4784a78dSdando_execsql_test 12.5 { 410*4784a78dSdan INSERT INTO t2 VALUES(NULL); 411*4784a78dSdan SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 412*4784a78dSdan} { 413*4784a78dSdan 4 59 414*4784a78dSdan 2 59 415*4784a78dSdan 2 59 416*4784a78dSdan} 417*4784a78dSdando_execsql_test 12.6 { 418*4784a78dSdan DELETE FROM t2; 419*4784a78dSdan DELETE FROM t1; 420*4784a78dSdan INSERT INTO t1 VALUES('value'); 421*4784a78dSdan INSERT INTO t2 VALUES('hello'); 422*4784a78dSdan} {} 423*4784a78dSdando_execsql_test 12.7 { 424*4784a78dSdan SELECT group_concat(x), m FROM t1 425*4784a78dSdan LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a; 426*4784a78dSdan} { 427*4784a78dSdan hello 59 428*4784a78dSdan} 429*4784a78dSdando_execsql_test 12.8 { 430*4784a78dSdan SELECT group_concat(x), m, n FROM t1 431*4784a78dSdan LEFT JOIN (SELECT x, 59 AS m, 60 AS n FROM t2) GROUP BY a; 432*4784a78dSdan} { 433*4784a78dSdan hello 59 60 434*4784a78dSdan} 4356b6d6c6bSdrh 436da93281eSdrhfinish_test 437*4784a78dSdan 438