000001 hash-threshold 8
000002
000003 statement ok
000004 CREATE TABLE t1( x INTEGER, y VARCHAR(8) )
000005
000006 statement ok
000007 INSERT INTO t1 VALUES(1,'true')
000008
000009 statement ok
000010 INSERT INTO t1 VALUES(0,'false')
000011
000012 statement ok
000013 INSERT INTO t1 VALUES(NULL,'NULL')
000014
000015 statement ok
000016 CREATE INDEX t1i1 ON t1(x)
000017
000018 skipif sqlite
000019 halt
000020
000021 # count(x), avg(x), sum(x), total(x), min(x), max(x)
000022 # group_concat(x), group_concat(x,y)
000023
000024 # EVIDENCE-OF: R-00466-56349 In any aggregate function that takes a
000025 # single argument, that argument can be preceded by the keyword
000026 # DISTINCT.
000027
000028 query I nosort
000029 SELECT count(DISTINCT x) FROM t1
000030 ----
000031 2
000032
000033 query I nosort
000034 SELECT avg(DISTINCT x) FROM t1
000035 ----
000036 0
000037
000038 query I nosort
000039 SELECT sum(DISTINCT x) FROM t1
000040 ----
000041 1
000042
000043 query I nosort
000044 SELECT total(DISTINCT x) FROM t1
000045 ----
000046 1
000047
000048 query I nosort
000049 SELECT min(DISTINCT x) FROM t1
000050 ----
000051 0
000052
000053 query I nosort
000054 SELECT max(DISTINCT x) FROM t1
000055 ----
000056 1
000057
000058 query T nosort
000059 SELECT group_concat(DISTINCT x) FROM t1 NOT INDEXED
000060 ----
000061 1,0
000062
000063
000064 # EVIDENCE-OF: R-00171-59428 In such cases, duplicate elements are
000065 # filtered before being passed into the aggregate function.
000066
000067 # EVIDENCE-OF: R-31453-41389 For example, the function "count(distinct
000068 # X)" will return the number of distinct values of column X instead of
000069 # the total number of non-null values in column X.
000070
000071 statement ok
000072 INSERT INTO t1 VALUES(2,'true')
000073
000074 statement ok
000075 INSERT INTO t1 VALUES(2,'true')
000076
000077 query I nosort
000078 SELECT count(DISTINCT x) FROM t1
000079 ----
000080 3
000081
000082
000083 # EVIDENCE-OF: R-20409-33051 The avg() function returns the average
000084 # value of all non-NULL X within a group.
000085
000086 query I nosort
000087 SELECT avg(x) FROM t1
000088 ----
000089 1
000090
000091
000092 # EVIDENCE-OF: R-29052-00975 String and BLOB values that do not look
000093 # like numbers are interpreted as 0.
000094
000095 query I nosort
000096 SELECT count(y) FROM t1
000097 ----
000098 5
000099
000100 query I nosort
000101 SELECT avg(y) FROM t1
000102 ----
000103 0
000104
000105 query I nosort
000106 SELECT sum(y) FROM t1
000107 ----
000108 0
000109
000110 query I nosort
000111 SELECT total(y) FROM t1
000112 ----
000113 0
000114
000115 query I nosort
000116 SELECT min(y) FROM t1
000117 ----
000118 0
000119
000120 query I nosort
000121 SELECT max(y) FROM t1
000122 ----
000123 0
000124
000125 query T nosort
000126 SELECT group_concat(y) FROM t1
000127 ----
000128 true,false,NULL,true,true
000129
000130 # repeat with DISTINCT
000131
000132 query I nosort
000133 SELECT count(DISTINCT y) FROM t1
000134 ----
000135 3
000136
000137 query I nosort
000138 SELECT avg(DISTINCT y) FROM t1
000139 ----
000140 0
000141
000142 query I nosort
000143 SELECT sum(DISTINCT y) FROM t1
000144 ----
000145 0
000146
000147 query I nosort
000148 SELECT total(DISTINCT y) FROM t1
000149 ----
000150 0
000151
000152 query I nosort
000153 SELECT min(DISTINCT y) FROM t1
000154 ----
000155 0
000156
000157 query I nosort
000158 SELECT max(DISTINCT y) FROM t1
000159 ----
000160 0
000161
000162 query T nosort
000163 SELECT group_concat(DISTINCT y) FROM t1
000164 ----
000165 true,false,NULL
000166
000167
000168 # EVIDENCE-OF: R-17177-10067 The result of avg() is always a floating
000169 # point value whenever there is at least one non-NULL input even if all
000170 # inputs are integers.
000171
000172
000173 query R nosort
000174 SELECT avg(x) FROM t1
000175 ----
000176 1.250
000177
000178 query R nosort
000179 SELECT avg(DISTINCT x) FROM t1
000180 ----
000181 1.000
000182
000183
000184 # EVIDENCE-OF: R-40597-22164 The result of avg() is NULL if and only if
000185 # there are no non-NULL inputs.
000186
000187 query I nosort label-NULL
000188 SELECT avg(x) FROM t1 WHERE y='null'
000189 ----
000190 NULL
000191
000192 query I nosort label-NULL
000193 SELECT avg(DISTINCT x) FROM t1 WHERE y='null'
000194 ----
000195 NULL
000196
000197
000198 # EVIDENCE-OF: R-34280-42283 The count(X) function returns a count of
000199 # the number of times that X is not NULL in a group.
000200
000201 query I nosort
000202 SELECT count(x) FROM t1 WHERE y='null'
000203 ----
000204 0
000205
000206 query I nosort
000207 SELECT count(DISTINCT x) FROM t1 WHERE y='null'
000208 ----
000209 0
000210
000211 query I nosort
000212 SELECT count(x) FROM t1 WHERE y='false'
000213 ----
000214 1
000215
000216 query I nosort
000217 SELECT count(DISTINCT x) FROM t1 WHERE y='false'
000218 ----
000219 1
000220
000221
000222 # EVIDENCE-OF: R-13776-21310 The count(*) function (with no arguments)
000223 # returns the total number of rows in the group.
000224
000225 query I nosort
000226 SELECT count(*) FROM t1 WHERE y='false'
000227 ----
000228 1
000229
000230 # TBD: can DISTINCT be used with *?
000231
000232 statement error
000233 SELECT count(DISTINCT *) FROM t1 WHERE y='false'
000234
000235
000236 # EVIDENCE-OF: R-56088-25150 The group_concat() function returns a
000237 # string which is the concatenation of all non-NULL values of X.
000238
000239 query T nosort
000240 SELECT group_concat(x) FROM t1 NOT INDEXED
000241 ----
000242 1,0,2,2
000243
000244 query T nosort
000245 SELECT group_concat(DISTINCT x) FROM t1 NOT INDEXED
000246 ----
000247 1,0,2
000248
000249
000250 # EVIDENCE-OF: R-08600-21007 If parameter Y is present then it is used
000251 # as the separator between instances of X.
000252
000253 query T nosort
000254 SELECT group_concat(x,':') FROM t1 NOT INDEXED
000255 ----
000256 1:0:2:2
000257
000258 # TBD: DISTINCT can only be used with single parameters
000259 statement error
000260 SELECT group_concat(DISTINCT x,':') FROM t1
000261
000262
000263 # EVIDENCE-OF: R-39910-14723 A comma (",") is used as the separator if Y
000264 # is omitted.
000265
000266 query T nosort
000267 SELECT group_concat(x) FROM t1 NOT INDEXED
000268 ----
000269 1,0,2,2
000270
000271 query T nosort
000272 SELECT group_concat(DISTINCT x) FROM t1 NOT INDEXED
000273 ----
000274 1,0,2
000275
000276
000277 # EVIDENCE-OF: R-52585-35928 The max() aggregate function returns the
000278 # maximum value of all values in the group.
000279
000280 query I nosort
000281 SELECT max(x) FROM t1
000282 ----
000283 2
000284
000285 query I nosort
000286 SELECT max(DISTINCT x) FROM t1
000287 ----
000288 2
000289
000290
000291 # TBD: last non-NULL value
000292 # EVIDENCE-OF: R-13053-11096 The maximum value is the value that would
000293 # be returned last in an ORDER BY on the same column.
000294
000295 query I nosort
000296 SELECT x FROM t1 WHERE x NOT NULL ORDER BY x
000297 ----
000298 0
000299 1
000300 2
000301 2
000302
000303 query I nosort
000304 SELECT DISTINCT x FROM t1 WHERE x NOT NULL ORDER BY x
000305 ----
000306 0
000307 1
000308 2
000309
000310
000311 # EVIDENCE-OF: R-50775-16353 Aggregate max() returns NULL if and only if
000312 # there are no non-NULL values in the group.
000313
000314 query I nosort label-NULL
000315 SELECT max(x) FROM t1 WHERE y='null'
000316 ----
000317 NULL
000318
000319 query I nosort label-NULL
000320 SELECT max(DISTINCT x) FROM t1 WHERE y='null'
000321 ----
000322 NULL
000323
000324
000325 # EVIDENCE-OF: R-16028-39081 The min() aggregate function returns the
000326 # minimum non-NULL value of all values in the group.
000327
000328 query I nosort
000329 SELECT min(x) FROM t1
000330 ----
000331 0
000332
000333 query I nosort
000334 SELECT min(DISTINCT x) FROM t1
000335 ----
000336 0
000337
000338
000339 # EVIDENCE-OF: R-30311-39793 The minimum value is the first non-NULL
000340 # value that would appear in an ORDER BY of the column.
000341
000342 query I nosort
000343 SELECT x FROM t1 WHERE x NOT NULL ORDER BY x
000344 ----
000345 0
000346 1
000347 2
000348 2
000349
000350 query I nosort
000351 SELECT DISTINCT x FROM t1 WHERE x NOT NULL ORDER BY x
000352 ----
000353 0
000354 1
000355 2
000356
000357
000358 # EVIDENCE-OF: R-10396-30188 Aggregate min() returns NULL if and only if
000359 # there are no non-NULL values in the group.
000360
000361 query I nosort label-NULL
000362 SELECT min(x) FROM t1 WHERE y='null'
000363 ----
000364 NULL
000365
000366 query I nosort label-NULL
000367 SELECT min(DISTINCT x) FROM t1 WHERE y='null'
000368 ----
000369 NULL
000370
000371
000372 # EVIDENCE-OF: R-24943-34514 The sum() and total() aggregate functions
000373 # return the sum of all non-NULL values in the group.
000374
000375 query I nosort label-sum
000376 SELECT sum(x) FROM t1
000377 ----
000378 5
000379
000380 query I nosort label-sum
000381 SELECT total(x) FROM t1
000382 ----
000383 5
000384
000385 query I nosort label-sum-distinct
000386 SELECT sum(DISTINCT x) FROM t1
000387 ----
000388 3
000389
000390 query I nosort label-sum-distinct
000391 SELECT total(DISTINCT x) FROM t1
000392 ----
000393 3
000394
000395
000396 # EVIDENCE-OF: R-44223-43966 If there are no non-NULL input rows then
000397 # sum() returns NULL but total() returns 0.
000398
000399 query I nosort label-NULL
000400 SELECT sum(x) FROM t1 WHERE y='null'
000401 ----
000402 NULL
000403
000404 query I nosort label-NULL
000405 SELECT sum(DISTINCT x) FROM t1 WHERE y='null'
000406 ----
000407 NULL
000408
000409 query I nosort label-zero
000410 SELECT total(x) FROM t1 WHERE y='null'
000411 ----
000412 0
000413
000414 query I nosort label-zero
000415 SELECT total(DISTINCT x) FROM t1 WHERE y='null'
000416 ----
000417 0
000418
000419
000420 # EVIDENCE-OF: R-07734-01023 The result of total() is always a floating
000421 # point value.
000422
000423 query R nosort
000424 SELECT total(x) FROM t1
000425 ----
000426 5.000
000427
000428 query R nosort
000429 SELECT total(DISTINCT x) FROM t1
000430 ----
000431 3.000
000432
000433
000434 # EVIDENCE-OF: R-19660-56479 The result of sum() is an integer value if
000435 # all non-NULL inputs are integers.
000436
000437 query I nosort label-sum
000438 SELECT sum(x) FROM t1
000439 ----
000440 5
000441
000442 query I nosort label-sum-distinct
000443 SELECT sum(DISTINCT x) FROM t1
000444 ----
000445 3
000446
000447
000448 # EVIDENCE-OF: R-33611-59266 If any input to sum() is neither an integer
000449 # nor a NULL, then sum() returns a floating point value which is an
000450 # approximation of the mathematical sum.
000451
000452 statement ok
000453 INSERT INTO t1 VALUES(4.0,'true')
000454
000455 query R nosort
000456 SELECT sum(x) FROM t1
000457 ----
000458 9.000
000459
000460 query R nosort
000461 SELECT sum(DISTINCT x) FROM t1
000462 ----
000463 7.000
000464
000465
000466 # TBD-EVIDENCE-OF: R-08904-24719 Sum() will throw an "integer overflow"
000467 # exception if all inputs are integers or NULL and an integer overflow
000468 # occurs at any point during the computation.
000469
000470 statement ok
000471 INSERT INTO t1 VALUES(1<<63,'true');
000472
000473 statement ok
000474 INSERT INTO t1 VALUES(1<<63,'true');
000475
000476 statement ok
000477 INSERT INTO t1 VALUES(-1,'true');
000478 DROP INDEX t1i1;
000479
000480 query R nosort
000481 SELECT sum(x) FROM t1
000482 ----
000483
000484 query R nosort
000485 SELECT sum(DISTINCT x) FROM t1
000486 ----
000487 -9223372036854776000.000
000488
000489 # TBD-EVIDENCE-OF: R-19553-64528 Total() never throws an integer overflow.
000490
000491 query R nosort
000492 SELECT total(x) FROM t1
000493 ----
000494 -18446744073709550000.000
000495
000496 query R nosort
000497 SELECT total(DISTINCT x) FROM t1
000498 ----
000499 -9223372036854776000.000