xref: /sqlite-3.40.0/test/alias.test (revision ceea3321)
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