18b213899Sdrh# 2008 August 28 28b213899Sdrh# 38b213899Sdrh# The author disclaims copyright to this source code. In place of 48b213899Sdrh# a legal notice, here is a blessing: 58b213899Sdrh# 68b213899Sdrh# May you do good and not evil. 78b213899Sdrh# May you find forgiveness for yourself and forgive others. 88b213899Sdrh# May you share freely, never taking more than you give. 98b213899Sdrh# 108b213899Sdrh#*********************************************************************** 118b213899Sdrh# 128b213899Sdrh# This file implements regression tests for SQLite library. The 138b213899Sdrh# focus of this script is correct code generation of aliased result-set 148b213899Sdrh# values. See ticket #3343. 158b213899Sdrh# 16*ceea3321Sdrh# $Id: alias.test,v 1.3 2009/04/23 13:22:44 drh Exp $ 178b213899Sdrh# 188b213899Sdrhset testdir [file dirname $argv0] 198b213899Sdrhsource $testdir/tester.tcl 208b213899Sdrh 21*ceea3321Sdrh# Aliases are currently evaluated twice. We might try to change this 22*ceea3321Sdrh# in the future. But not now. 23*ceea3321Sdrhreturn 24*ceea3321Sdrh 258b213899Sdrh# A procedure to return a sequence of increasing integers. 268b213899Sdrh# 278b213899Sdrhnamespace eval ::seq { 288b213899Sdrh variable counter 0 298b213899Sdrh proc value {args} { 308b213899Sdrh variable counter 318b213899Sdrh incr counter 328b213899Sdrh return $counter 338b213899Sdrh } 348b213899Sdrh proc reset {} { 358b213899Sdrh variable counter 368b213899Sdrh set counter 0 378b213899Sdrh } 388b213899Sdrh} 398b213899Sdrh 408b213899Sdrh 418b213899Sdrhdo_test alias-1.1 { 428b213899Sdrh db function sequence ::seq::value 438b213899Sdrh db eval { 448b213899Sdrh CREATE TABLE t1(x); 458b213899Sdrh INSERT INTO t1 VALUES(9); 468b213899Sdrh INSERT INTO t1 VALUES(8); 478b213899Sdrh INSERT INTO t1 VALUES(7); 488b213899Sdrh SELECT x, sequence() FROM t1; 498b213899Sdrh } 508b213899Sdrh} {9 1 8 2 7 3} 518b213899Sdrhdo_test alias-1.2 { 528b213899Sdrh ::seq::reset 538b213899Sdrh db eval { 548b213899Sdrh SELECT x, sequence() AS y FROM t1 WHERE y>0 558b213899Sdrh } 568b213899Sdrh} {9 1 8 2 7 3} 578b213899Sdrhdo_test alias-1.3 { 588b213899Sdrh ::seq::reset 598b213899Sdrh db eval { 608b213899Sdrh SELECT x, sequence() AS y FROM t1 WHERE y>0 AND y<99 618b213899Sdrh } 628b213899Sdrh} {9 1 8 2 7 3} 638b213899Sdrhdo_test alias-1.4 { 648b213899Sdrh ::seq::reset 658b213899Sdrh db eval { 668b213899Sdrh SELECT x, sequence() AS y FROM t1 WHERE y>0 AND y<99 AND y!=55 678b213899Sdrh } 688b213899Sdrh} {9 1 8 2 7 3} 698b213899Sdrhdo_test alias-1.5 { 708b213899Sdrh ::seq::reset 718b213899Sdrh db eval { 728b213899Sdrh SELECT x, sequence() AS y FROM t1 738b213899Sdrh WHERE y>0 AND y<99 AND y!=55 AND y NOT IN (56,57,58) 748b213899Sdrh AND y NOT LIKE 'abc%' AND y%10==2 758b213899Sdrh } 768b213899Sdrh} {8 2} 778b213899Sdrhdo_test alias-1.6 { 788b213899Sdrh ::seq::reset 798b213899Sdrh db eval { 808b213899Sdrh SELECT x, sequence() AS y FROM t1 WHERE y BETWEEN 0 AND 99 818b213899Sdrh } 828b213899Sdrh} {9 1 8 2 7 3} 8331daa63fSdrh#do_test alias-1.7 { 8431daa63fSdrh# ::seq::reset 8531daa63fSdrh# db eval { 8631daa63fSdrh# SELECT x, sequence() AS y FROM t1 WHERE y IN (55,66,3) 8731daa63fSdrh# } 8831daa63fSdrh#} {7 3} 898b213899Sdrhdo_test alias-1.8 { 908b213899Sdrh ::seq::reset 918b213899Sdrh db eval { 928b213899Sdrh SELECT x, 1-sequence() AS y FROM t1 ORDER BY y 938b213899Sdrh } 948b213899Sdrh} {7 -2 8 -1 9 0} 958b213899Sdrhdo_test alias-1.9 { 968b213899Sdrh ::seq::reset 978b213899Sdrh db eval { 988b213899Sdrh SELECT x, sequence() AS y FROM t1 ORDER BY -y 998b213899Sdrh } 1008b213899Sdrh} {7 3 8 2 9 1} 1018b213899Sdrhdo_test alias-1.10 { 1028b213899Sdrh ::seq::reset 1038b213899Sdrh db eval { 1048b213899Sdrh SELECT x, sequence() AS y FROM t1 ORDER BY x%2, y 1058b213899Sdrh } 1068b213899Sdrh} {8 2 9 1 7 3} 1078b213899Sdrh 1088b213899Sdrhunset -nocomplain random_int_list 1098b213899Sdrhset random_int_list [db eval { 1108b213899Sdrh SELECT random()&2147483647 AS r FROM t1, t1, t1, t1 ORDER BY r 1118b213899Sdrh}] 1128b213899Sdrhdo_test alias-1.11 { 1138b213899Sdrh lsort -integer $::random_int_list 1148b213899Sdrh} $random_int_list 1158b213899Sdrh 1168b213899Sdrh 1178b213899Sdrhdo_test alias-2.1 { 1188b213899Sdrh db eval { 1198b213899Sdrh SELECT 4 UNION SELECT 1 ORDER BY 1 1208b213899Sdrh } 1218b213899Sdrh} {1 4} 1228b213899Sdrhdo_test alias-2.2 { 1238b213899Sdrh db eval { 1248b213899Sdrh SELECT 4 UNION SELECT 1 UNION SELECT 9 ORDER BY 1 1258b213899Sdrh } 1268b213899Sdrh} {1 4 9} 1278b213899Sdrh 1288b213899Sdrhif 0 { 1298b213899Sdrh # Aliases in the GROUP BY clause cause the expression to be evaluated 1308b213899Sdrh # twice in the current implementation. This might change in the future. 1318b213899Sdrh # 1328b213899Sdrh do_test alias-3.1 { 1338b213899Sdrh ::seq::reset 1348b213899Sdrh db eval { 1358b213899Sdrh SELECT sequence(*) AS y, count(*) AS z FROM t1 GROUP BY y ORDER BY z, y 1368b213899Sdrh } 1378b213899Sdrh } {1 1 2 1 3 1} 1388b213899Sdrh} 1398b213899Sdrh 1408b213899Sdrhfinish_test 141