sqlite/test/misc5.test
drh 67dd9011fc Require whitespace or punctuation between a numeric literal and an
identifier or keyword.  Ticket #1912. (CVS 3345)

FossilOrigin-Name: 0f667c4abd73bbb806a5efb31b0aba6efaf40fb8
2006-08-12 12:33:14 +00:00

619 lines
11 KiB
Plaintext

# 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.15 2006/08/12 12:33:15 drh 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 {
set DB [sqlite3_connection_pointer db]
db close
sqlite3_busy_timeout $DB 1000
} SQLITE_MISUSE
sqlite3 db test.db
# Ticket #1911
#
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