AryaWu/sqlite
0
1# 2015-08-262#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.12# 13# This file seeks to verify that expressions (and especially functions)14# that are in both the ORDER BY clause and the result set are only15# evaluated once.16#17 18set testdir [file dirname $argv0]19source $testdir/tester.tcl20set ::testprefix orderby921 22 23do_execsql_test setup {24 -- create a table with many entries25 CREATE TABLE t1(x);26 WITH RECURSIVE27 c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)28 INSERT INTO t1 SELECT x FROM c;29}30 31# Some versions of TCL are unable to [lsort -int] for32# 64-bit integers. So we write our own comparison33# routine.34proc bigintcompare {a b} {35 set x [expr {$a-$b}]36 if {$x<0} {return -1}37 if {$x>0} {return +1}38 return 039}40do_test 1.0 {41 set l1 {}42 # If random() is only evaluated once and then reused for each row, then43 # the output should appear in sorted order. If random() is evaluated 44 # separately for the result set and the ORDER BY clause, then the output45 # order will be random.46 db eval {SELECT random() AS y FROM t1 ORDER BY 1;} {lappend l1 $y}47 expr {$l1==[lsort -command bigintcompare $l1]}48} {1}49 50do_test 1.1 {51 set l1 {}52 db eval {SELECT random() AS y FROM t1 ORDER BY random();} {lappend l1 $y}53 expr {$l1==[lsort -command bigintcompare $l1]}54} {1}55 56do_test 1.2 {57 set l1 {}58 db eval {SELECT random() AS y FROM t1 ORDER BY +random();} {lappend l1 $y}59 expr {$l1==[lsort -command bigintcompare $l1]}60} {0}61 62finish_test63 