# 2005 Mar 16 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. # # This file implements tests for miscellanous features that were # left out of other test files. # # $Id: misc5.test,v 1.17 2007/09/12 17:01:45 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Build records using the MakeRecord opcode such that the size of the # header is at the transition point in the size of a varint. # # This test causes an assertion failure or a buffer overrun in version # 3.1.5 and earlier. # for {set i 120} {$i<140} {incr i} { do_test misc5-1.$i { catchsql {DROP TABLE t1} set sql1 {CREATE TABLE t1} set sql2 {INSERT INTO t1 VALUES} set sep ( for {set j 0} {$j<$i} {incr j} { append sql1 ${sep}a$j append sql2 ${sep}$j set sep , } append sql1 {);} append sql2 {);} execsql $sql1$sql2 } {} } # Make sure large integers are stored correctly. # ifcapable conflict { do_test misc5-2.1 { execsql { create table t2(x unique); insert into t2 values(1); insert or ignore into t2 select x*2 from t2; insert or ignore into t2 select x*4 from t2; insert or ignore into t2 select x*16 from t2; insert or ignore into t2 select x*256 from t2; insert or ignore into t2 select x*65536 from t2; insert or ignore into t2 select x*2147483648 from t2; insert or ignore into t2 select x-1 from t2; insert or ignore into t2 select x+1 from t2; insert or ignore into t2 select -x from t2; select count(*) from t2; } } 371 } else { do_test misc5-2.1 { execsql { BEGIN; create table t2(x unique); create table t2_temp(x); insert into t2_temp values(1); insert into t2_temp select x*2 from t2_temp; insert into t2_temp select x*4 from t2_temp; insert into t2_temp select x*16 from t2_temp; insert into t2_temp select x*256 from t2_temp; insert into t2_temp select x*65536 from t2_temp; insert into t2_temp select x*2147483648 from t2_temp; insert into t2_temp select x-1 from t2_temp; insert into t2_temp select x+1 from t2_temp; insert into t2_temp select -x from t2_temp; INSERT INTO t2 SELECT DISTINCT(x) FROM t2_temp; DROP TABLE t2_temp; COMMIT; select count(*) from t2; } } 371 } do_test misc5-2.2 { execsql { select x from t2 order by x; } } \ "-4611686018427387905\ -4611686018427387904\ -4611686018427387903\ -2305843009213693953\ -2305843009213693952\ -2305843009213693951\ -1152921504606846977\ -1152921504606846976\ -1152921504606846975\ -576460752303423489\ -576460752303423488\ -576460752303423487\ -288230376151711745\ -288230376151711744\ -288230376151711743\ -144115188075855873\ -144115188075855872\ -144115188075855871\ -72057594037927937\ -72057594037927936\ -72057594037927935\ -36028797018963969\ -36028797018963968\ -36028797018963967\ -18014398509481985\ -18014398509481984\ -18014398509481983\ -9007199254740993\ -9007199254740992\ -9007199254740991\ -4503599627370497\ -4503599627370496\ -4503599627370495\ -2251799813685249\ -2251799813685248\ -2251799813685247\ -1125899906842625\ -1125899906842624\ -1125899906842623\ -562949953421313\ -562949953421312\ -562949953421311\ -281474976710657\ -281474976710656\ -281474976710655\ -140737488355329\ -140737488355328\ -140737488355327\ -70368744177665\ -70368744177664\ -70368744177663\ -35184372088833\ -35184372088832\ -35184372088831\ -17592186044417\ -17592186044416\ -17592186044415\ -8796093022209\ -8796093022208\ -8796093022207\ -4398046511105\ -4398046511104\ -4398046511103\ -2199023255553\ -2199023255552\ -2199023255551\ -1099511627777\ -1099511627776\ -1099511627775\ -549755813889\ -549755813888\ -549755813887\ -274877906945\ -274877906944\ -274877906943\ -137438953473\ -137438953472\ -137438953471\ -68719476737\ -68719476736\ -68719476735\ -34359738369\ -34359738368\ -34359738367\ -17179869185\ -17179869184\ -17179869183\ -8589934593\ -8589934592\ -8589934591\ -4294967297\ -4294967296\ -4294967295\ -2147483649\ -2147483648\ -2147483647\ -1073741825\ -1073741824\ -1073741823\ -536870913\ -536870912\ -536870911\ -268435457\ -268435456\ -268435455\ -134217729\ -134217728\ -134217727\ -67108865\ -67108864\ -67108863\ -33554433\ -33554432\ -33554431\ -16777217\ -16777216\ -16777215\ -8388609\ -8388608\ -8388607\ -4194305\ -4194304\ -4194303\ -2097153\ -2097152\ -2097151\ -1048577\ -1048576\ -1048575\ -524289\ -524288\ -524287\ -262145\ -262144\ -262143\ -131073\ -131072\ -131071\ -65537\ -65536\ -65535\ -32769\ -32768\ -32767\ -16385\ -16384\ -16383\ -8193\ -8192\ -8191\ -4097\ -4096\ -4095\ -2049\ -2048\ -2047\ -1025\ -1024\ -1023\ -513\ -512\ -511\ -257\ -256\ -255\ -129\ -128\ -127\ -65\ -64\ -63\ -33\ -32\ -31\ -17\ -16\ -15\ -9\ -8\ -7\ -5\ -4\ -3\ -2\ -1\ 0\ 1\ 2\ 3\ 4\ 5\ 7\ 8\ 9\ 15\ 16\ 17\ 31\ 32\ 33\ 63\ 64\ 65\ 127\ 128\ 129\ 255\ 256\ 257\ 511\ 512\ 513\ 1023\ 1024\ 1025\ 2047\ 2048\ 2049\ 4095\ 4096\ 4097\ 8191\ 8192\ 8193\ 16383\ 16384\ 16385\ 32767\ 32768\ 32769\ 65535\ 65536\ 65537\ 131071\ 131072\ 131073\ 262143\ 262144\ 262145\ 524287\ 524288\ 524289\ 1048575\ 1048576\ 1048577\ 2097151\ 2097152\ 2097153\ 4194303\ 4194304\ 4194305\ 8388607\ 8388608\ 8388609\ 16777215\ 16777216\ 16777217\ 33554431\ 33554432\ 33554433\ 67108863\ 67108864\ 67108865\ 134217727\ 134217728\ 134217729\ 268435455\ 268435456\ 268435457\ 536870911\ 536870912\ 536870913\ 1073741823\ 1073741824\ 1073741825\ 2147483647\ 2147483648\ 2147483649\ 4294967295\ 4294967296\ 4294967297\ 8589934591\ 8589934592\ 8589934593\ 17179869183\ 17179869184\ 17179869185\ 34359738367\ 34359738368\ 34359738369\ 68719476735\ 68719476736\ 68719476737\ 137438953471\ 137438953472\ 137438953473\ 274877906943\ 274877906944\ 274877906945\ 549755813887\ 549755813888\ 549755813889\ 1099511627775\ 1099511627776\ 1099511627777\ 2199023255551\ 2199023255552\ 2199023255553\ 4398046511103\ 4398046511104\ 4398046511105\ 8796093022207\ 8796093022208\ 8796093022209\ 17592186044415\ 17592186044416\ 17592186044417\ 35184372088831\ 35184372088832\ 35184372088833\ 70368744177663\ 70368744177664\ 70368744177665\ 140737488355327\ 140737488355328\ 140737488355329\ 281474976710655\ 281474976710656\ 281474976710657\ 562949953421311\ 562949953421312\ 562949953421313\ 1125899906842623\ 1125899906842624\ 1125899906842625\ 2251799813685247\ 2251799813685248\ 2251799813685249\ 4503599627370495\ 4503599627370496\ 4503599627370497\ 9007199254740991\ 9007199254740992\ 9007199254740993\ 18014398509481983\ 18014398509481984\ 18014398509481985\ 36028797018963967\ 36028797018963968\ 36028797018963969\ 72057594037927935\ 72057594037927936\ 72057594037927937\ 144115188075855871\ 144115188075855872\ 144115188075855873\ 288230376151711743\ 288230376151711744\ 288230376151711745\ 576460752303423487\ 576460752303423488\ 576460752303423489\ 1152921504606846975\ 1152921504606846976\ 1152921504606846977\ 2305843009213693951\ 2305843009213693952\ 2305843009213693953\ 4611686018427387903\ 4611686018427387904\ 4611686018427387905" # Ticket #1210. Do proper reference counting of Table structures # so that deeply nested SELECT statements can be flattened correctly. # ifcapable subquery { do_test misc5-3.1 { execsql { CREATE TABLE songs(songid, artist, timesplayed); INSERT INTO songs VALUES(1,'one',1); INSERT INTO songs VALUES(2,'one',2); INSERT INTO songs VALUES(3,'two',3); INSERT INTO songs VALUES(4,'three',5); INSERT INTO songs VALUES(5,'one',7); INSERT INTO songs VALUES(6,'two',11); SELECT DISTINCT artist FROM ( SELECT DISTINCT artist FROM songs WHERE songid IN ( SELECT songid FROM songs WHERE LOWER(artist) = ( SELECT DISTINCT LOWER(artist) FROM ( SELECT DISTINCT artist,sum(timesplayed) AS total FROM songs GROUP BY LOWER(artist) ORDER BY total DESC LIMIT 10 ) WHERE artist <> '' ) ) ) ORDER BY LOWER(artist) ASC; } } {two} } # Ticket #1370. Do not overwrite small files (less than 1024 bytes) # when trying to open them as a database. # do_test misc5-4.1 { db close file delete -force test.db set fd [open test.db w] puts $fd "This is not really a database" close $fd sqlite3 db test.db catchsql { CREATE TABLE t1(a,b,c); } } {1 {file is encrypted or is not a database}} # Ticket #1371. Allow floating point numbers of the form .N or N. # do_test misc5-5.1 { execsql {SELECT .1 } } 0.1 do_test misc5-5.2 { execsql {SELECT 2. } } 2.0 do_test misc5-5.3 { execsql {SELECT 3.e0 } } 3.0 do_test misc5-5.4 { execsql {SELECT .4e+1} } 4.0 # Ticket #1582. Ensure that an unknown table in a LIMIT clause applied to # a UNION ALL query causes an error, not a crash. # db close file delete -force test.db sqlite3 db test.db ifcapable subquery&&compound { do_test misc5-6.1 { catchsql { SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_master LIMIT (SELECT count(*) FROM blah); } } {1 {no such table: blah}} do_test misc5-6.2 { execsql { CREATE TABLE logs(msg TEXT, timestamp INTEGER, dbtime TEXT); } catchsql { SELECT * FROM logs WHERE logs.id >= (SELECT head FROM logs_base) UNION ALL SELECT * FROM logs LIMIT (SELECT lmt FROM logs_base) ; } } {1 {no such column: logs.id}} } # Overflow the lemon parser stack by providing an overly complex # expression. Make sure that the overflow is detected and reported. # do_test misc5-7.1 { execsql {CREATE TABLE t1(x)} set sql "INSERT INTO t1 VALUES(" set tail "" for {set i 0} {$i<200} {incr i} { append sql "(1+" append tail ")" } append sql 2$tail catchsql $sql } {1 {parser stack overflow}} # Check the MISUSE return from sqlitee3_busy_timeout # do_test misc5-8.1-misuse { set DB [sqlite3_connection_pointer db] db close sqlite3_busy_timeout $DB 1000 } SQLITE_MISUSE sqlite3 db test.db # Ticket #1911 # ifcapable compound { do_test misc5-9.1 { execsql { SELECT name, type FROM sqlite_master WHERE name IS NULL UNION SELECT type, name FROM sqlite_master WHERE type IS NULL ORDER BY 1, 2, 1, 2, 1, 2 } } {} do_test misc5-9.2 { execsql { SELECT name, type FROM sqlite_master WHERE name IS NULL UNION SELECT type, name FROM sqlite_master WHERE type IS NULL ORDER BY 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 } } {} } # Ticket #1912. Make the tokenizer require a space after a numeric # literal. # do_test misc5-10.1 { catchsql { SELECT 123abc } } {1 {unrecognized token: "123abc"}} do_test misc5-10.2 { catchsql { SELECT 1*123.4e5ghi; } } {1 {unrecognized token: "123.4e5ghi"}} finish_test