mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Merge latest trunk changes with this branch.
FossilOrigin-Name: 5ee3c27e20d12a126fb773b428bb864102b949a5b26a8d5c523753dcedf4be10
This commit is contained in:
@ -17,6 +17,7 @@
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix aggnested
|
||||
|
||||
do_test aggnested-1.1 {
|
||||
db eval {
|
||||
@ -259,6 +260,52 @@ do_execsql_test aggnested-4.4 {
|
||||
SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx;
|
||||
} {3}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 5.0 {
|
||||
CREATE TABLE x1(a, b);
|
||||
INSERT INTO x1 VALUES(1, 2);
|
||||
CREATE TABLE x2(x);
|
||||
INSERT INTO x2 VALUES(NULL), (NULL), (NULL);
|
||||
}
|
||||
|
||||
# At one point, aggregate "total()" in the query below was being processed
|
||||
# as part of the outer SELECT, not as part of the sub-select with no FROM
|
||||
# clause.
|
||||
do_execsql_test 5.1 {
|
||||
SELECT ( SELECT total( (SELECT b FROM x1) ) ) FROM x2;
|
||||
} {2.0 2.0 2.0}
|
||||
|
||||
do_execsql_test 5.2 {
|
||||
SELECT ( SELECT total( (SELECT 2 FROM x1) ) ) FROM x2;
|
||||
} {2.0 2.0 2.0}
|
||||
|
||||
do_execsql_test 5.3 {
|
||||
CREATE TABLE t1(a);
|
||||
CREATE TABLE t2(b);
|
||||
}
|
||||
|
||||
do_execsql_test 5.4 {
|
||||
SELECT(
|
||||
SELECT max(b) LIMIT (
|
||||
SELECT total( (SELECT a FROM t1) )
|
||||
)
|
||||
)
|
||||
FROM t2;
|
||||
} {{}}
|
||||
|
||||
do_execsql_test 5.5 {
|
||||
CREATE TABLE a(b);
|
||||
WITH c AS(SELECT a)
|
||||
SELECT(SELECT(SELECT group_concat(b, b)
|
||||
LIMIT(SELECT 0.100000 *
|
||||
AVG(DISTINCT(SELECT 0 FROM a ORDER BY b, b, b))))
|
||||
FROM a GROUP BY b,
|
||||
b, b) FROM a EXCEPT SELECT b FROM a ORDER BY b,
|
||||
b, b;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -840,6 +840,7 @@ do_test alter-13.3 {
|
||||
do_test alter-14.1 {
|
||||
catchsql {
|
||||
CREATE TABLE t3651(a UNIQUE);
|
||||
INSERT INTO t3651 VALUES(5);
|
||||
ALTER TABLE t3651 ADD COLUMN b UNIQUE;
|
||||
}
|
||||
} {1 {Cannot add a UNIQUE column}}
|
||||
|
@ -116,6 +116,7 @@ do_test alter3-1.99 {
|
||||
do_test alter3-2.1 {
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b);
|
||||
INSERT INTO t1 VALUES(1,2);
|
||||
}
|
||||
catchsql {
|
||||
ALTER TABLE t1 ADD c PRIMARY KEY;
|
||||
|
@ -123,6 +123,7 @@ do_test alter4-1.99 {
|
||||
do_test alter4-2.1 {
|
||||
execsql {
|
||||
CREATE TABLE temp.t1(a, b);
|
||||
INSERT INTO t1 VALUES(1,2);
|
||||
}
|
||||
catchsql {
|
||||
ALTER TABLE t1 ADD c PRIMARY KEY;
|
||||
@ -397,6 +398,7 @@ do_test alter4-10.1 {
|
||||
reset_db
|
||||
do_execsql_test alter4-11.0 {
|
||||
CREATE TABLE t1(c INTEGER PRIMARY KEY, d);
|
||||
INSERT INTO t1(c,d) VALUES(1,2);
|
||||
PRAGMA foreign_keys = on;
|
||||
ALTER TABLE t1 ADD COLUMN e;
|
||||
}
|
||||
|
@ -658,5 +658,23 @@ do_catchsql_test 21.3 {
|
||||
ALTER TABLE a RENAME TO e;
|
||||
} {1 {error in view c: 1st ORDER BY term does not match any column in the result set}}
|
||||
|
||||
# After forum thread https://sqlite.org/forum/forumpost/ddbe1c7efa
|
||||
# Ensure that PRAGMA schema_version=N causes a full schema reload.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 22.0 {
|
||||
CREATE TABLE t1(a INT, b TEXT NOT NULL);
|
||||
INSERT INTO t1 VALUES(1,2),('a','b');
|
||||
BEGIN;
|
||||
PRAGMA writable_schema=ON;
|
||||
UPDATE sqlite_schema SET sql='CREATE TABLE t1(a INT, b TEXT)' WHERE name LIKE 't1';
|
||||
PRAGMA schema_version=1234;
|
||||
COMMIT;
|
||||
PRAGMA integrity_check;
|
||||
} {ok}
|
||||
do_execsql_test 22.1 {
|
||||
ALTER TABLE t1 ADD COLUMN c INT DEFAULT 78;
|
||||
SELECT * FROM t1;
|
||||
} {1 2 78 a b 78}
|
||||
|
||||
finish_test
|
||||
|
@ -75,7 +75,7 @@ int rename_all_tables(
|
||||
int cnt = 0;
|
||||
|
||||
rc = sqlite3_prepare_v2(db,
|
||||
"SELECT name FROM sqlite_master WHERE type='table'"
|
||||
"SELECT name FROM sqlite_schema WHERE type='table'"
|
||||
" AND name NOT LIKE 'sqlite_%';",
|
||||
-1, &pStmt, 0);
|
||||
if( rc ) return rc;
|
||||
|
132
test/busy2.test
Normal file
132
test/busy2.test
Normal file
@ -0,0 +1,132 @@
|
||||
# 2020 June 30
|
||||
#
|
||||
# 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 test the busy handler
|
||||
#
|
||||
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
set testprefix busy2
|
||||
|
||||
do_multiclient_test tn {
|
||||
do_test 1.$tn.0 {
|
||||
sql2 {
|
||||
CREATE TABLE t1(a, b);
|
||||
PRAGMA journal_mode = wal;
|
||||
INSERT INTO t1 VALUES('A', 'B');
|
||||
}
|
||||
} {wal}
|
||||
|
||||
do_test 1.$tn.1 {
|
||||
code1 { db timeout 1000 }
|
||||
sql1 { SELECT * FROM t1 }
|
||||
} {A B}
|
||||
|
||||
do_test 1.$tn.2 {
|
||||
sql2 {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES('C', 'D');
|
||||
}
|
||||
} {}
|
||||
|
||||
do_test 1.$tn.3 {
|
||||
set us [lindex [time { catch { sql1 { BEGIN EXCLUSIVE } } }] 0]
|
||||
expr {$us>950000 && $us<1500000}
|
||||
} {1}
|
||||
|
||||
do_test 1.$tn.4 {
|
||||
sql2 {
|
||||
COMMIT
|
||||
}
|
||||
} {}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
do_multiclient_test tn {
|
||||
# Make the db a WAL mode db. And add a table and a row to it. Then open
|
||||
# a second connection within process 1. Process 1 now has connections
|
||||
# [db] and [db1.2], process 2 has connection [db2] only.
|
||||
#
|
||||
# Configure all connections to use a 1000 ms timeout.
|
||||
#
|
||||
do_test 2.$tn.0 {
|
||||
sql1 {
|
||||
PRAGMA journal_mode = wal;
|
||||
CREATE TABLE t1(a, b);
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
}
|
||||
code2 {
|
||||
db2 timeout 1000
|
||||
}
|
||||
code1 {
|
||||
sqlite3 db1.2 test.db
|
||||
db1.2 timeout 1000
|
||||
db timeout 1000
|
||||
db1.2 eval {SELECT * FROM t1}
|
||||
}
|
||||
} {1 2}
|
||||
|
||||
# Take a read lock with [db] in process 1.
|
||||
#
|
||||
do_test 2.$tn.1 {
|
||||
sql1 {
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
} {1 2}
|
||||
|
||||
# Insert a row using [db2] in process 2. Then try a passive checkpoint.
|
||||
# It fails to checkpoint the final frame (due to the readlock taken by
|
||||
# [db]), and returns in less than 250ms.
|
||||
do_test 2.$tn.2 {
|
||||
sql2 { INSERT INTO t1 VALUES(3, 4) }
|
||||
set us [lindex [time {
|
||||
set res [code2 { db2 eval { PRAGMA wal_checkpoint } }]
|
||||
}] 0]
|
||||
list [expr $us < 250000] $res
|
||||
} {1 {0 4 3}}
|
||||
|
||||
# Now try a FULL checkpoint with [db2]. It returns SQLITE_BUSY. And takes
|
||||
# over 950ms to do so.
|
||||
do_test 2.$tn.3 {
|
||||
set us [lindex [time {
|
||||
set res [code2 { db2 eval { PRAGMA wal_checkpoint = FULL } }]
|
||||
}] 0]
|
||||
list [expr $us > 950000] $res
|
||||
} {1 {1 4 3}}
|
||||
|
||||
# Passive checkpoint with [db1.2] (process 1). No SQLITE_BUSY, returns
|
||||
# in under 250ms.
|
||||
do_test 2.$tn.4 {
|
||||
set us [lindex [time {
|
||||
set res [code1 { db1.2 eval { PRAGMA wal_checkpoint } }]
|
||||
}] 0]
|
||||
list [expr $us < 250000] $res
|
||||
} {1 {0 4 3}}
|
||||
|
||||
# Full checkpoint with [db1.2] (process 1). SQLITE_BUSY returned in
|
||||
# a bit over 950ms.
|
||||
do_test 2.$tn.5 {
|
||||
set us [lindex [time {
|
||||
set res [code1 { db1.2 eval { PRAGMA wal_checkpoint = FULL } }]
|
||||
}] 0]
|
||||
list [expr $us > 950000] $res
|
||||
} {1 {1 4 3}}
|
||||
|
||||
code1 {
|
||||
db1.2 close
|
||||
}
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
@ -1182,5 +1182,114 @@ do_catchsql_test 14.2 {
|
||||
ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s;
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_test 15.0 {
|
||||
sqlite3 db {}
|
||||
db deserialize [decode_hexdb {
|
||||
| size 28672 pagesize 4096 filename crash-3afa1ca9e9c1bd.db
|
||||
| page 1 offset 0
|
||||
| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
|
||||
| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........
|
||||
| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................
|
||||
| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................
|
||||
| 96: 00 00 00 00 0d 00 00 00 06 0e 88 00 0f b8 0f 6d ...............m
|
||||
| 112: 0f 3a 0f 0b 0e d5 0e 88 01 00 00 00 00 00 00 00 .:..............
|
||||
| 3712: 00 00 00 00 00 00 00 00 4b 06 06 17 25 25 01 5b ........K...%%.[
|
||||
| 3728: 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 74 61 74 tablesqlite_stat
|
||||
| 3744: 31 73 71 6c 69 74 65 5f 73 74 61 74 31 07 43 52 1sqlite_stat1.CR
|
||||
| 3760: 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 EATE TABLE sqlit
|
||||
| 3776: 65 5f 73 74 61 74 31 28 74 62 6c 2c 69 64 78 2c e_stat1(tbl,idx,
|
||||
| 3792: 73 74 61 74 29 34 05 06 17 13 11 01 53 69 6e 64 stat)4......Sind
|
||||
| 3808: 65 78 63 31 63 63 31 06 43 52 45 41 54 45 20 55 exc1cc1.CREATE U
|
||||
| 3824: 4e 49 51 55 45 20 49 4e 44 45 58 20 63 31 63 20 NIQUE INDEX c1c
|
||||
| 3840: 4f 4e 20 63 31 28 63 2c 20 62 29 2d 04 06 17 13 ON c1(c, b)-....
|
||||
| 3856: 11 01 45 69 6e 64 65 78 63 31 64 63 31 05 43 52 ..Eindexc1dc1.CR
|
||||
| 3872: 45 41 54 45 20 49 4e 44 45 58 20 63 31 64 20 4f EATE INDEX c1d O
|
||||
| 3888: 4e 20 63 31 28 64 2c 20 62 29 31 03 06 17 13 11 N c1(d, b)1.....
|
||||
| 3904: 01 4d 69 6e 64 65 78 62 31 63 62 31 05 43 52 45 .Mindexb1cb1.CRE
|
||||
| 3920: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 ATE UNIQUE INDEX
|
||||
| 3936: 20 62 31 63 20 4f 4e 20 62 31 28 63 29 49 02 06 b1c ON b1(c)I..
|
||||
| 3952: 17 11 11 0f 7f 74 61 62 6c 65 63 31 63 31 03 43 .....tablec1c1.C
|
||||
| 3968: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 REATE TABLE c1(a
|
||||
| 3984: 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59 INT PRIMARY KEY
|
||||
| 4000: 2c 20 62 2c 20 63 2c 20 64 29 20 57 49 54 48 4f , b, c, d) WITHO
|
||||
| 4016: 55 54 20 52 4f 57 49 44 46 01 06 17 11 11 01 79 UT ROWIDF......y
|
||||
| 4032: 74 61 62 6c 65 62 31 62 31 02 43 52 45 41 54 45 tableb1b1.CREATE
|
||||
| 4048: 20 54 41 42 4c 45 20 62 31 28 61 20 49 4e 54 20 TABLE b1(a INT
|
||||
| 4064: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 PRIMARY KEY, b,
|
||||
| 4080: 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 c) WITHOUT ROWID
|
||||
| page 2 offset 4096
|
||||
| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f e2 ................
|
||||
| 16: 0f da 00 00 00 01 00 00 00 00 00 00 00 00 00 00 ................
|
||||
| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 06 ................
|
||||
| 4048: 67 07 07 04 01 0f 01 06 66 06 07 04 01 0f 01 05 g.......f.......
|
||||
| 4064: 65 05 07 04 01 0f 01 04 64 04 07 04 01 0f 01 03 e.......d.......
|
||||
| 4080: 63 03 07 04 01 0f 01 02 62 0f 05 04 09 0f 09 61 c.......b......a
|
||||
| page 3 offset 8192
|
||||
| 0: 0a 00 00 00 07 0f bd 00 0f f9 0f ef 0f e5 0f db ................
|
||||
| 16: 0f d1 0f c7 0f bd 00 00 00 00 01 00 00 00 00 00 ................
|
||||
| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 09 05 01 ................
|
||||
| 4032: 0f 01 01 07 61 07 07 09 05 01 0f 01 01 06 61 06 ....a.........a.
|
||||
| 4048: 06 09 05 01 0f 01 01 05 61 05 05 09 05 01 0f 01 ........a.......
|
||||
| 4064: 01 04 61 04 04 09 05 01 0f 01 01 03 61 03 03 09 ..a.........a...
|
||||
| 4080: 05 01 0f 01 01 02 61 0f 02 06 05 09 0f 09 09 61 ......a........a
|
||||
| page 4 offset 12288
|
||||
| 0: 0a 00 00 00 07 0f d8 00 0f fc 0f f0 0f ea 0f e4 ................
|
||||
| 16: 0f de 0f d8 0f f6 00 00 00 00 00 00 00 00 00 00 ................
|
||||
| 4048: 00 00 00 00 00 00 00 00 05 03 01 01 07 07 05 03 ................
|
||||
| 4064: 01 01 06 06 05 03 01 01 05 05 05 03 01 01 04 04 ................
|
||||
| 4080: 05 03 01 01 03 03 05 03 01 01 0f 02 03 03 09 09 ................
|
||||
| page 5 offset 16384
|
||||
| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f 00 ................
|
||||
| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................
|
||||
| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a.......
|
||||
| 4064: 61 05 07 04 01 1f 01 04 61 04 07 04 01 0f 01 03 a.......a.......
|
||||
| 4080: 61 03 07 04 01 0f 01 02 61 02 05 04 09 0f 09 61 a.......a......a
|
||||
| page 6 offset 20480
|
||||
| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f ea 0f e2 00 00 ................
|
||||
| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................
|
||||
| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a.......
|
||||
| 4064: 61 05 07 04 01 0f 01 04 61 04 07 04 01 0f 01 03 a.......a.......
|
||||
| 4080: 61 03 07 04 01 0f 01 0f 61 02 05 04 09 0f 09 61 a.......a......a
|
||||
| page 7 offset 24576
|
||||
| 0: 0d 00 00 00 05 0f 1c 00 0f f0 0f e0 0f d3 0f c5 ................
|
||||
| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
| 4016: 00 00 00 00 00 00 00 00 0b 05 04 11 11 13 62 31 ..............b1
|
||||
| 4032: 62 31 37 20 31 0c 04 04 11 13 13 62 31 62 31 63 b17 1......b1b1c
|
||||
| 4048: 37 20 31 0b 03 04 11 11 13 63 31 63 31 37 20 31 7 1......c1c17 1
|
||||
| 4064: 0e 02 04 11 13 07 63 31 63 31 64 37 20 31 20 31 ......c1c1d7 1 1
|
||||
| 4080: 0e 01 04 11 13 17 63 31 63 31 63 37 20 31 00 00 ......c1c1c7 1..
|
||||
| end crash-3afa1ca9e9c1bd.db
|
||||
}]} {}
|
||||
|
||||
do_execsql_test 15.1 {
|
||||
UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7;
|
||||
} {}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 16.0 {
|
||||
CREATE TABLE t1(w, x, y, z, UNIQUE(w, x), UNIQUE(y, z));
|
||||
INSERT INTO t1 VALUES(1, 1, 1, 1);
|
||||
|
||||
CREATE TABLE t1idx(x, y, i INTEGER, PRIMARY KEY(x)) WITHOUT ROWID;
|
||||
INSERT INTO t1idx VALUES(10, NULL, 5);
|
||||
|
||||
PRAGMA writable_schema = 1;
|
||||
UPDATE sqlite_master SET rootpage = (
|
||||
SELECT rootpage FROM sqlite_master WHERE name='t1idx'
|
||||
) WHERE type = 'index';
|
||||
}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
|
||||
do_catchsql_test 16.1 {
|
||||
PRAGMA writable_schema = ON;
|
||||
INSERT INTO t1(rowid, w, x, y, z) VALUES(5, 10, 11, 10, NULL);
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
finish_test
|
||||
|
||||
|
||||
|
@ -230,10 +230,10 @@ do_test 9.2 {
|
||||
set L [list a=? b=? c=? d=? e=? f=? g=? h=? i=? j=?]
|
||||
foreach {tn nTerm nRow} {
|
||||
1 1 10
|
||||
2 2 9
|
||||
2 2 10
|
||||
3 3 8
|
||||
4 4 7
|
||||
5 5 6
|
||||
5 5 7
|
||||
6 6 5
|
||||
7 7 5
|
||||
8 8 5
|
||||
|
@ -196,4 +196,42 @@ do_catchsql_test count-6.1 {
|
||||
SELECT count(DISTINCT) FROM t6 GROUP BY x;
|
||||
} {1 {DISTINCT aggregates must have exactly one argument}}
|
||||
|
||||
# 2020-05-08.
|
||||
# The count() optimization should honor the NOT INDEXED clause
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test count-7.1 {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c VARCHAR(1000));
|
||||
CREATE INDEX t1b ON t1(b);
|
||||
INSERT INTO t1(a,b,c) values(1,2,'count.test cases for NOT INDEXED');
|
||||
ANALYZE;
|
||||
UPDATE sqlite_stat1 SET stat='1000000 10' WHERE idx='t1b';
|
||||
ANALYZE sqlite_master;
|
||||
}
|
||||
do_eqp_test count-7.2 {
|
||||
SELECT count(1) FROM t1;
|
||||
} {
|
||||
QUERY PLAN
|
||||
`--SCAN TABLE t1 USING COVERING INDEX t1b
|
||||
}
|
||||
do_eqp_test count-7.3 {
|
||||
SELECT count(1) FROM t1 NOT INDEXED
|
||||
} {
|
||||
QUERY PLAN
|
||||
`--SCAN TABLE t1
|
||||
}
|
||||
do_eqp_test count-7.3 {
|
||||
SELECT count(*) FROM t1;
|
||||
} {
|
||||
QUERY PLAN
|
||||
`--SCAN TABLE t1 USING COVERING INDEX t1b
|
||||
}
|
||||
do_eqp_test count-7.4 {
|
||||
SELECT count(*) FROM t1 NOT INDEXED
|
||||
} {
|
||||
QUERY PLAN
|
||||
`--SCAN TABLE t1
|
||||
}
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -69,7 +69,7 @@ do_test 1.2 {
|
||||
p5_of_opcode db OpenRead {
|
||||
SELECT * FROM t1 CROSS JOIN t2 WHERE a=x
|
||||
}
|
||||
} {00 00}
|
||||
} {0 0}
|
||||
|
||||
# Do the same test the other way around.
|
||||
#
|
||||
@ -82,7 +82,7 @@ do_test 2.2 {
|
||||
p5_of_opcode db OpenRead {
|
||||
SELECT * FROM t2 CROSS JOIN t1 WHERE a=x
|
||||
}
|
||||
} {00 00}
|
||||
} {0 0}
|
||||
|
||||
# Various expressions captured by CursorHint
|
||||
#
|
||||
@ -117,7 +117,7 @@ do_test 4.2 {
|
||||
p5_of_opcode db OpenRead {
|
||||
SELECT * FROM t1 WHERE b>11;
|
||||
}
|
||||
} {02 00}
|
||||
} {2 0}
|
||||
do_test 4.3asc {
|
||||
p4_of_opcode db CursorHint {
|
||||
SELECT c FROM t1 WHERE b<11 ORDER BY b ASC;
|
||||
@ -132,7 +132,7 @@ do_test 4.4 {
|
||||
p5_of_opcode db OpenRead {
|
||||
SELECT c FROM t1 WHERE b<11;
|
||||
}
|
||||
} {00}
|
||||
} {0}
|
||||
|
||||
do_test 4.5asc {
|
||||
p4_of_opcode db CursorHint {
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
static const char *azSql[] = {
|
||||
"PRAGMA integrity_check;",
|
||||
"SELECT * FROM sqlite_master;",
|
||||
"SELECT * FROM sqlite_schema;",
|
||||
"SELECT sum(length(name)) FROM dbstat;",
|
||||
"UPDATE t1 SET b=a, a=b WHERE a<b;",
|
||||
"ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s;",
|
||||
|
142
test/decimal.test
Normal file
142
test/decimal.test
Normal file
@ -0,0 +1,142 @@
|
||||
# 2017 December 9
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix decimal
|
||||
|
||||
if {[catch {load_static_extension db decimal} error]} {
|
||||
puts "Skipping zipfile tests, hit load error: $error"
|
||||
finish_test; return
|
||||
}
|
||||
|
||||
do_execsql_test 1000 {
|
||||
SELECT decimal(1);
|
||||
} {1}
|
||||
do_execsql_test 1010 {
|
||||
SELECT decimal(1.0);
|
||||
} {1.0}
|
||||
do_execsql_test 1020 {
|
||||
SELECT decimal(0001.0);
|
||||
} {1.0}
|
||||
do_execsql_test 1030 {
|
||||
SELECT decimal(+0001.0);
|
||||
} {1.0}
|
||||
do_execsql_test 1040 {
|
||||
SELECT decimal(-0001.0);
|
||||
} {-1.0}
|
||||
do_execsql_test 1050 {
|
||||
SELECT decimal(1.0e72);
|
||||
} {1000000000000000000000000000000000000000000000000000000000000000000000000}
|
||||
# 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123
|
||||
do_execsql_test 1060 {
|
||||
SELECT decimal(1.0e-72);
|
||||
} {0.0000000000000000000000000000000000000000000000000000000000000000000000010}
|
||||
# 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123
|
||||
do_execsql_test 1070 {
|
||||
SELECT decimal(-123e-4);
|
||||
} {-0.0123}
|
||||
do_execsql_test 1080 {
|
||||
SELECT decimal(+123e+4);
|
||||
} {1230000.0}
|
||||
|
||||
|
||||
do_execsql_test 2000 {
|
||||
CREATE TABLE t1(seq INTEGER PRIMARY KEY, val TEXT);
|
||||
INSERT INTO t1 VALUES
|
||||
(1, '-9999e99'),
|
||||
(2, '-9998.000e+99'),
|
||||
(3, '-9999.0'),
|
||||
(4, '-1'),
|
||||
(5, '-9999e-20'),
|
||||
(6, '0'),
|
||||
(7, '1e-30'),
|
||||
(8, '1e-29'),
|
||||
(9, '1'),
|
||||
(10,'1.00000000000000001'),
|
||||
(11,'+1.00001'),
|
||||
(12,'99e+99');
|
||||
SELECT *, '|'
|
||||
FROM t1 AS a, t1 AS b
|
||||
WHERE a.seq<b.seq
|
||||
AND decimal_cmp(a.val,b.val)>=0;
|
||||
} {}
|
||||
do_execsql_test 2010 {
|
||||
SELECT *, '|'
|
||||
FROM t1 AS a, t1 AS b
|
||||
WHERE a.seq<>b.seq
|
||||
AND decimal_cmp(a.val,b.val)==0;
|
||||
} {}
|
||||
do_execsql_test 2020 {
|
||||
SELECT *, '|'
|
||||
FROM t1 AS a, t1 AS b
|
||||
WHERE a.seq>b.seq
|
||||
AND decimal_cmp(a.val,b.val)<=0;
|
||||
} {}
|
||||
do_execsql_test 2030 {
|
||||
SELECT seq FROM t1 ORDER BY val COLLATE decimal;
|
||||
} {1 2 3 4 5 6 7 8 9 10 11 12}
|
||||
do_execsql_test 2040 {
|
||||
SELECT seq FROM t1 ORDER BY val COLLATE decimal DESC;
|
||||
} {12 11 10 9 8 7 6 5 4 3 2 1}
|
||||
|
||||
do_execsql_test 3000 {
|
||||
CREATE TABLE t3(seq INTEGER PRIMARY KEY, val TEXT);
|
||||
WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<10)
|
||||
INSERT INTO t3(seq, val) SELECT x, x FROM c;
|
||||
WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<5)
|
||||
INSERT INTO t3(seq, val) SELECT x+10, x*1000 FROM c;
|
||||
SELECT decimal(val) FROM t3 ORDER BY seq;
|
||||
} {1 2 3 4 5 6 7 8 9 10 1000 2000 3000 4000 5000}
|
||||
do_execsql_test 3020 {
|
||||
SELECT decimal_add(val,'0.5') FROM t3 WHERE seq>5 ORDER BY seq
|
||||
} {6.5 7.5 8.5 9.5 10.5 1000.5 2000.5 3000.5 4000.5 5000.5}
|
||||
do_execsql_test 3030 {
|
||||
SELECT decimal_add(val,'-10') FROM t3 ORDER BY seq;
|
||||
} {-9 -8 -7 -6 -5 -4 -3 -2 -1 0 990 1990 2990 3990 4990}
|
||||
|
||||
do_execsql_test 4000 {
|
||||
SELECT decimal_sum(val) FROM t3;
|
||||
} {15055}
|
||||
do_execsql_test 4010 {
|
||||
SELECT decimal_sum(decimal_add(val,val||'e+10')) FROM t3;
|
||||
} {150550000015055}
|
||||
do_execsql_test 4010 {
|
||||
SELECT decimal_sum(decimal_add(val||'e+20',decimal_add(val,val||'e-20')))
|
||||
FROM t3;
|
||||
} {1505500000000000000015055.00000000000000015055}
|
||||
|
||||
do_execsql_test 5000 {
|
||||
WITH RECURSIVE c(x,y,z) AS (
|
||||
VALUES(0,'1','1')
|
||||
UNION ALL
|
||||
SELECT x+1, decimal_mul(y,'2'), decimal_mul(z,'0.5')
|
||||
FROM c WHERE x<32
|
||||
)
|
||||
SELECT count(*) FROM c WHERE decimal_mul(y,z)='1';
|
||||
} {33}
|
||||
|
||||
do_execsql_test 5100 {
|
||||
SELECT decimal_mul('1234.00','2.00');
|
||||
} {2468.00}
|
||||
do_execsql_test 5101 {
|
||||
SELECT decimal_mul('1234.00','2.0000');
|
||||
} {2468.00}
|
||||
do_execsql_test 5102 {
|
||||
SELECT decimal_mul('1234.0000','2.000');
|
||||
} {2468.000}
|
||||
do_execsql_test 5103 {
|
||||
SELECT decimal_mul('1234.0000','2');
|
||||
} {2468}
|
||||
|
||||
|
||||
finish_test
|
@ -51,8 +51,8 @@ proc do_temptables_test {tn sql temptables} {
|
||||
set ret ""
|
||||
db eval "EXPLAIN [set sql]" {
|
||||
if {$opcode == "OpenEphemeral" || $opcode == "SorterOpen"} {
|
||||
if {$p5 != "08" && $p5!="00"} { error "p5 = $p5" }
|
||||
if {$p5 == "08"} {
|
||||
if {$p5!=8 && $p5!=0} { error "p5 = $p5" }
|
||||
if {$p5==8} {
|
||||
lappend ret hash
|
||||
} else {
|
||||
lappend ret btree
|
||||
|
@ -1139,7 +1139,7 @@ sqlite3 db test.db
|
||||
#-------------------------------------------------------------------------
|
||||
# Test cases for the testable statements related to the CASE expression.
|
||||
#
|
||||
# EVIDENCE-OF: R-15199-61389 There are two basic forms of the CASE
|
||||
# EVIDENCE-OF: R-57495-24088 There are two fundamental forms of the CASE
|
||||
# expression: those with a base expression and those without.
|
||||
#
|
||||
do_execsql_test e_expr-20.1 {
|
||||
@ -1235,11 +1235,11 @@ db nullvalue {}
|
||||
# evaluating WHEN terms.
|
||||
#
|
||||
do_execsql_test e_expr-21.4.1 {
|
||||
SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END
|
||||
} {B}
|
||||
SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, iif(NULL,8,99);
|
||||
} {B 99}
|
||||
do_execsql_test e_expr-21.4.2 {
|
||||
SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END
|
||||
} {C}
|
||||
SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, iif(0,8,99);
|
||||
} {C 99}
|
||||
|
||||
# EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base
|
||||
# expression is evaluated just once and the result is compared against
|
||||
@ -1952,39 +1952,39 @@ foreach {tn expr} {
|
||||
# 'english' and '0' are all considered to be false.
|
||||
#
|
||||
do_execsql_test e_expr-37.1 {
|
||||
SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END;
|
||||
} {false}
|
||||
SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END, iif(NULL,'true','false');
|
||||
} {false false}
|
||||
do_execsql_test e_expr-37.2 {
|
||||
SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END;
|
||||
} {false}
|
||||
SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END, iif(0.0,'true','false');
|
||||
} {false false}
|
||||
do_execsql_test e_expr-37.3 {
|
||||
SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END;
|
||||
} {false}
|
||||
SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END, iif(0,'true','false');
|
||||
} {false false}
|
||||
do_execsql_test e_expr-37.4 {
|
||||
SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END;
|
||||
} {false}
|
||||
SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END, iif('engligh','true','false');
|
||||
} {false false}
|
||||
do_execsql_test e_expr-37.5 {
|
||||
SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END;
|
||||
} {false}
|
||||
SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END, iif('0','true','false');
|
||||
} {false false}
|
||||
|
||||
# EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are
|
||||
# considered to be true.
|
||||
#
|
||||
do_execsql_test e_expr-37.6 {
|
||||
SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END;
|
||||
} {true}
|
||||
SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, iif(1,'true','false');
|
||||
} {true true}
|
||||
do_execsql_test e_expr-37.7 {
|
||||
SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END;
|
||||
} {true}
|
||||
SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END, iif(1.0,'true','false');
|
||||
} {true true}
|
||||
do_execsql_test e_expr-37.8 {
|
||||
SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END;
|
||||
} {true}
|
||||
SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END, iif(0.1,'true','false');
|
||||
} {true true}
|
||||
do_execsql_test e_expr-37.9 {
|
||||
SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END;
|
||||
} {true}
|
||||
SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END, iif(-0.1,'true','false');
|
||||
} {true true}
|
||||
do_execsql_test e_expr-37.10 {
|
||||
SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END;
|
||||
} {true}
|
||||
SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END, iif('1engl','true','false');
|
||||
} {true true}
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -2507,7 +2507,7 @@ proc test_efkey_6 {tn zAlter isError} {
|
||||
drop_all_tables
|
||||
|
||||
do_test e_fkey-56.$tn.1 "
|
||||
execsql { CREATE TABLE tbl(a, b) }
|
||||
execsql { CREATE TABLE tbl(a, b); INSERT INTO tbl VALUES(1, 2); }
|
||||
[list catchsql $zAlter]
|
||||
" [lindex {{0 {}} {1 {Cannot add a REFERENCES column with non-NULL default value}}} $isError]
|
||||
|
||||
@ -2771,7 +2771,7 @@ do_test e_fkey-60.6 {
|
||||
#
|
||||
do_test e_fkey-61.1.1 {
|
||||
drop_all_tables
|
||||
execsql { CREATE TABLE t1(a, b) }
|
||||
execsql { CREATE TABLE t1(a, b) ; INSERT INTO t1 VALUES(1, 2) }
|
||||
catchsql { ALTER TABLE t1 ADD COLUMN c DEFAULT 'xxx' REFERENCES t2 }
|
||||
} {1 {Cannot add a REFERENCES column with non-NULL default value}}
|
||||
do_test e_fkey-61.1.2 {
|
||||
|
@ -204,4 +204,22 @@ do_execsql_test 6.3 {
|
||||
SELECT (SELECT COUNT(a) FROM t2) FROM t1;
|
||||
} {2}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 7.0 {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
|
||||
INSERT INTO t1 VALUES(321, 100000);
|
||||
INSERT INTO t1 VALUES(111, 110000);
|
||||
INSERT INTO t1 VALUES(444, 120000);
|
||||
INSERT INTO t1 VALUES(222, 130000);
|
||||
}
|
||||
|
||||
do_execsql_test 7.1 {
|
||||
SELECT max(a), max(a) FILTER (WHERE b<12345), b FROM t1;
|
||||
} {
|
||||
444 {} 120000
|
||||
}
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -955,6 +955,7 @@ ifcapable altertable {
|
||||
execsql {
|
||||
CREATE TABLE t1(a PRIMARY KEY);
|
||||
CREATE TABLE t2(a, b);
|
||||
INSERT INTO t2 VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
@ -1046,6 +1047,7 @@ ifcapable altertable {
|
||||
execsql {
|
||||
CREATE TEMP TABLE t1(a PRIMARY KEY);
|
||||
CREATE TEMP TABLE t2(a, b);
|
||||
INSERT INTO temp.t2 VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
@ -1130,6 +1132,7 @@ ifcapable altertable {
|
||||
ATTACH ':memory:' AS aux;
|
||||
CREATE TABLE aux.t1(a PRIMARY KEY);
|
||||
CREATE TABLE aux.t2(a, b);
|
||||
INSERT INTO aux.t2(a,b) VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
|
@ -430,4 +430,59 @@ do_catchsql_test 11.1 {
|
||||
PRAGMA foreign_key_check;
|
||||
} {1 {foreign key mismatch - "c11" referencing "tt"}}
|
||||
|
||||
# 2020-07-03 Bug in foreign_key_check discovered while working on the
|
||||
# forum reports that pragma_foreign_key_check does not accept an argument:
|
||||
# If two separate schemas seem to reference one another, that causes
|
||||
# problems for foreign_key_check.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 12.0 {
|
||||
ATTACH ':memory:' as aux;
|
||||
CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2);
|
||||
CREATE TABLE main.t2(x TEXT PRIMARY KEY, y INT);
|
||||
INSERT INTO main.t2 VALUES('abc',11),('def',22),('xyz',99);
|
||||
INSERT INTO aux.t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops');
|
||||
PRAGMA foreign_key_check=t1;
|
||||
} {t1 5 t2 0 t1 7 t2 0 t1 9 t2 0}
|
||||
do_execsql_test 12.1 {
|
||||
CREATE TABLE aux.t2(x TEXT PRIMARY KEY, y INT);
|
||||
INSERT INTO aux.t2 VALUES('abc',11),('def',22),('xyz',99);
|
||||
PRAGMA foreign_key_check=t1;
|
||||
} {t1 9 t2 0}
|
||||
|
||||
# 2020-07-03: the pragma_foreign_key_check virtual table should
|
||||
# accept arguments for the table name and/or schema name.
|
||||
#
|
||||
do_execsql_test 13.0 {
|
||||
SELECT *, 'x' FROM pragma_foreign_key_check('t1');
|
||||
} {t1 9 t2 0 x}
|
||||
do_catchsql_test 13.1 {
|
||||
SELECT *, 'x' FROM pragma_foreign_key_check('t1','main');
|
||||
} {1 {no such table: main.t1}}
|
||||
do_execsql_test 13.2 {
|
||||
SELECT *, 'x' FROM pragma_foreign_key_check('t1','aux');
|
||||
} {t1 9 t2 0 x}
|
||||
|
||||
reset_db
|
||||
do_execsql_test 13.10 {
|
||||
PRAGMA foreign_keys=OFF;
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2);
|
||||
CREATE TABLE t2(x TEXT PRIMARY KEY, y INT);
|
||||
CREATE TABLE t3(w TEXT, z INT REFERENCES t1);
|
||||
INSERT INTO t2 VALUES('abc',11),('def',22),('xyz',99);
|
||||
INSERT INTO t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops');
|
||||
INSERT INTO t3 VALUES(11,7),(22,19);
|
||||
} {}
|
||||
do_execsql_test 13.11 {
|
||||
SELECT x.*, '|'
|
||||
FROM sqlite_schema, pragma_foreign_key_check(name) AS x
|
||||
WHERE type='table'
|
||||
ORDER BY x."table";
|
||||
} {t1 9 t2 0 | t3 2 t1 0 |}
|
||||
do_execsql_test 13.12 {
|
||||
SELECT *, '|'
|
||||
FROM pragma_foreign_key_check AS x
|
||||
ORDER BY x."table";
|
||||
} {t1 9 t2 0 | t3 2 t1 0 |}
|
||||
|
||||
finish_test
|
||||
|
@ -48,7 +48,7 @@ proc analyze_delete_program {sql} {
|
||||
|
||||
set obj $T($root)
|
||||
set O($obj) ""
|
||||
if {"0x$R(p5)" & 0x08} {
|
||||
if {$R(p5) & 0x08} {
|
||||
set O($obj) *
|
||||
} else {
|
||||
set O($obj) ""
|
||||
|
@ -16,6 +16,7 @@ source $testdir/tester.tcl
|
||||
ifcapable !fts3 { finish_test ; return }
|
||||
|
||||
set ::testprefix fts3corrupt2
|
||||
sqlite3_fts3_may_be_corrupt 1
|
||||
|
||||
set data [list]
|
||||
lappend data {*}{
|
||||
@ -107,5 +108,4 @@ foreach c {50 100 150 200 250} {
|
||||
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -5847,4 +5847,439 @@ do_catchsql_test 37.1 {
|
||||
INSERT INTO f VALUES (0,x'00');
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_test 38.0 {
|
||||
sqlite3 db {}
|
||||
db deserialize [decode_hexdb {
|
||||
.open --hexdb
|
||||
| size 24576 pagesize 4096 filename crash-1cc4f8a70485ce.db
|
||||
| page 1 offset 0
|
||||
| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
|
||||
| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........
|
||||
| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............!
|
||||
| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~..........
|
||||
| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl
|
||||
| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB
|
||||
| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3......
|
||||
| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir
|
||||
| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE
|
||||
| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi
|
||||
| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER
|
||||
| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta
|
||||
| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER
|
||||
| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc
|
||||
| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl
|
||||
| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root
|
||||
| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE
|
||||
| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1.
|
||||
| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit
|
||||
| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s
|
||||
| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir
|
||||
| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##.
|
||||
| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen
|
||||
| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR
|
||||
| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s
|
||||
| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid
|
||||
| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY
|
||||
| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB
|
||||
| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet
|
||||
| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont
|
||||
| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE
|
||||
| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do
|
||||
| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM
|
||||
| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a',
|
||||
| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8..
|
||||
| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR
|
||||
| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB
|
||||
| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3
|
||||
| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c).........
|
||||
| page 3 offset 8192
|
||||
| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t
|
||||
| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./..........
|
||||
| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 00 00 ...t.[.@.$......
|
||||
| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7e f0 .........?%...~.
|
||||
| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5.
|
||||
| 2912: 34 23 00 20 42 30 31 36 2f 36 30 39 20 44 45 42 4#. B016/609 DEB
|
||||
| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT
|
||||
| 2944: 20 56 54 41 42 20 45 4e 42 92 4c 45 20 46 54 53 VTAB ENB.LE FTS
|
||||
| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN
|
||||
| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA
|
||||
| 2992: 42 5c 45 1f 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 B.E.JSON1 ENABLE
|
||||
| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE
|
||||
| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY
|
||||
| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L
|
||||
| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH
|
||||
| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%.
|
||||
| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI
|
||||
| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA
|
||||
| 3120: 44 53 41 46 45 3d 30 88 4e 4f 43 41 53 45 17 22 DSAFE=0.NOCASE..
|
||||
| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE=
|
||||
| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM
|
||||
| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO
|
||||
| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O
|
||||
| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI
|
||||
| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3..
|
||||
| 3232: 4f 4d 49 54 20 4c 4f 41 54 20 45 58 54 45 4e 53 OMIT LOAT EXTENS
|
||||
| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 04 00 33 0f 19 IONXRTRIM....3..
|
||||
| 3264: 82 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 .AX MEMORY=50000
|
||||
| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3.
|
||||
| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000
|
||||
| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3
|
||||
| 3328: 0f 17 4d 41 58 20 4d 45 4d fa 52 59 3d 35 30 20 ..MAX MEM.RY=50
|
||||
| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....%
|
||||
| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB
|
||||
| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB
|
||||
| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE.
|
||||
| 3408: 19 05 00 25 0f 17 45 4e 42 42 4c 45 20 52 54 52 ...%..ENBBLE RTR
|
||||
| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E
|
||||
| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI
|
||||
| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 3c NARY....)..ENAB<
|
||||
| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE
|
||||
| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME
|
||||
| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....%
|
||||
| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB
|
||||
| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB
|
||||
| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE.
|
||||
| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO
|
||||
| 3584: 4e 31 58 52 54 52 49 4d 95 12 05 00 29 0f 19 45 N1XRTRIM....)..E
|
||||
| 3600: 4e 31 42 4c 45 20 47 45 4e 50 4f 4c 59 58 42 49 N1BLE GENPOLYXBI
|
||||
| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 3e f2 1e 4c NARY....)..E>..L
|
||||
| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE
|
||||
| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE
|
||||
| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....#
|
||||
| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI
|
||||
| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 3c NARY....#..ENAB<
|
||||
| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE...
|
||||
| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X
|
||||
| 3744: 5d 24 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 ]$RIM....#..ENAB
|
||||
| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY..
|
||||
| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5
|
||||
| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN
|
||||
| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM.
|
||||
| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS
|
||||
| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY.
|
||||
| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS
|
||||
| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE.
|
||||
| 3888: 07 05 00 31 0f 17 45 4e 41 42 4b 45 20 44 42 53 ...1..ENABKE DBS
|
||||
| 3904: 54 41 54 20 56 53 41 42 58 52 54 62 49 4d 11 06 TAT VSABXRTbIM..
|
||||
| 3920: 05 00 17 0f 19 44 45 42 54 47 58 42 49 4e 41 52 .....DEBTGXBINAR
|
||||
| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO
|
||||
| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG
|
||||
| 3968: 68 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d hRTRIM'...C..COM
|
||||
| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0
|
||||
| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY'
|
||||
| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g
|
||||
| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060
|
||||
| 4048: 39 58 4f 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XOOCASE&...C..C
|
||||
| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4.
|
||||
| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM
|
||||
| page 4 offset 12288
|
||||
| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
| page 5 offset 16384
|
||||
| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................
|
||||
| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253
|
||||
| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 8c 36 ..0.%.....2016.6
|
||||
| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5
|
||||
| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%.
|
||||
| 3040: 00 00 08 63 6f 5d 70 69 6c 65 72 03 25 02 00 00 ...co]piler.%...
|
||||
| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu
|
||||
| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%.
|
||||
| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 7e 73 69 6f .........xte~sio
|
||||
| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%...
|
||||
| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%...
|
||||
| 3136: 06 65 6f 70 7f 6c 79 03 25 11 00 00 05 6a 73 6f .eop.ly.%....jso
|
||||
| 3152: 6e 31 03 25 14 00 e8 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%..
|
||||
| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory
|
||||
| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%....
|
||||
| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree.
|
||||
| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe.
|
||||
| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P.
|
||||
| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0
|
||||
| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................
|
||||
| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609...
|
||||
| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4......
|
||||
| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5.........
|
||||
| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000......
|
||||
| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<...
|
||||
| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................
|
||||
| 3376: 00 03 01 02 c2 00 03 01 02 02 00 03 01 04 82 00 ................
|
||||
| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................
|
||||
| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi
|
||||
| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d
|
||||
| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat...........
|
||||
| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug...........
|
||||
| 3472: 06 65 6e 60 62 6c 65 3f 07 02 00 01 02 92 e1 a4 .en`ble?........
|
||||
| 3488: ff fc a2 8c 95 b2 3f 01 01 f0 f1 02 00 57 02 00 ......?......W..
|
||||
| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................
|
||||
| 3520: 02 00 01 02 00 01 02 00 01 02 01 01 02 00 01 02 ................
|
||||
| 3536: 00 01 02 00 00 f2 00 01 08 78 74 65 6e 73 69 6f .........xtensio
|
||||
| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts
|
||||
| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5..
|
||||
| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc...
|
||||
| 3600: 00 01 03 00 01 03 00 01 06 65 5f 70 6f 6c 79 09 .........e_poly.
|
||||
| 3616: 10 03 00 01 03 00 01 03 00 00 b3 6a 73 6f 6e 31 ...........json1
|
||||
| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load
|
||||
| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max.
|
||||
| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory
|
||||
| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5
|
||||
| 3696: 09 16 03 00 01 03 00 01 03 cc 00 06 6e 6f 63 61 ............noca
|
||||
| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<.............
|
||||
| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................
|
||||
| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................
|
||||
| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................
|
||||
| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit...........
|
||||
| 3792: 05 72 74 62 65 65 09 19 03 00 01 03 00 01 03 00 .rtbee..........
|
||||
| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<...........
|
||||
| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................
|
||||
| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................
|
||||
| 3856: 02 00 03 01 02 02 00 03 01 02 01 00 03 01 02 02 ................
|
||||
| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe...
|
||||
| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab...
|
||||
| 3904: 00 01 03 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x......
|
||||
| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................
|
||||
| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................
|
||||
| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................
|
||||
| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................
|
||||
| 3984: 02 01 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................
|
||||
| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................
|
||||
| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................
|
||||
| 4032: 01 01 02 00 01 01 01 da 00 00 f1 01 02 00 01 01 ................
|
||||
| 4048: 01 02 00 01 01 01 01 ff ff 01 01 02 00 01 01 01 ................
|
||||
| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................
|
||||
| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................
|
||||
| page 6 offset 20480
|
||||
| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 01 00 00 00 ................
|
||||
| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................
|
||||
| end crash-1cc4f8a70485ce.db
|
||||
}]} {}
|
||||
|
||||
do_execsql_test 38.1 {
|
||||
UPDATE t1 SET b=a;
|
||||
}
|
||||
|
||||
do_catchsql_test 38.2 {
|
||||
SELECT b FROM t1 WHERE a MATCH 'e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*e*'
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
set saved $sqlite_fts3_enable_parentheses
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
do_execsql_test 39.0 {
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(
|
||||
col0 INTEGER PRIMARY KEY,
|
||||
col1 VARCHAR(8),
|
||||
col2 BINARY,
|
||||
col3 BINARY
|
||||
);
|
||||
INSERT INTO t0_content VALUES(1,1,'1234','aaaa','bbbb');
|
||||
INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'000131030782000103323334050101010200000461616161050101020200000462626262050101030200');
|
||||
}
|
||||
|
||||
do_test 39.1 {
|
||||
catch {
|
||||
db eval { SELECT rowid FROM t0 WHERE t0 MATCH '1 NEAR 1' }
|
||||
}
|
||||
} 0
|
||||
|
||||
do_test 39.2 {
|
||||
catch {
|
||||
db eval {
|
||||
SELECT matchinfo(t0,'yxy') FROM t0 WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
|
||||
}
|
||||
}
|
||||
} 0
|
||||
set sqlite_fts3_enable_parentheses $saved
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
set saved $sqlite_fts3_enable_parentheses
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
|
||||
do_execsql_test 40.1 {
|
||||
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY, col1, col2 ,col3 );
|
||||
INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',
|
||||
X'0001310301020001033233340500010102000004616161bc050101020200000462626262050101030200'
|
||||
);
|
||||
}
|
||||
|
||||
do_execsql_test 40.2 {
|
||||
SELECT 0==matchinfo(t0,'sx') FROM t0 WHERE t0 MATCH '1* 2 3 4 5 6 OR 1';
|
||||
} 0
|
||||
|
||||
set sqlite_fts3_enable_parentheses $saved
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 41.1 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts3(a,b,c);
|
||||
INSERT INTO t1_segdir VALUES(0,0,0,0,'0 835',X'000130120106000106000106001f030001030001030000083230313630363039090107000107000107000001340901050001050001050000013509010400010400010400010730303030303030091c0400010400010400000662696e6172793c0301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000008636f3870696c657209010200010200010200000664627374617409070300010300010300010465627567090402000102000102000006656e61626c653f07020001020001020001020001020001020001020001020001020001030001010002020001020001020001020001120001020001020001020001020001020001087874656e73696f6e091f0400010400010400000466747334090a0300010300010400030135090d03000103000103000003676363090103000103000103000106656f706f6c790910030001030001030000056a736f6e310913030001030001030000046c6f6164091f030001030001030000036d6178091c02000102000102000105656d6f7279091c03000103000103000304737973350916030001030001030000066e6f636173653c02010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020000046f6d6974091f020001020001020000057274726565091903000103000103000302696d3c010102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200000a746872656164736166650922020001020001020000047674616209070400010400010400000178b401010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200');
|
||||
}
|
||||
|
||||
do_execsql_test 41.2 {
|
||||
SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'rtree ner "json1^enable"';
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
do_execsql_test 42.1 {
|
||||
CREATE VIRTUAL TABLE f USING fts3(a, b);
|
||||
}
|
||||
do_execsql_test 42.2 {
|
||||
INSERT INTO f_segdir VALUES(0,2,1111,0,0,X'00');
|
||||
INSERT INTO f_segdir VALUES(0,3,0 ,0,0,X'00013003010200');
|
||||
}
|
||||
do_execsql_test 42.3 {
|
||||
INSERT INTO f(f) VALUES ('merge=107,2');
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
set saved $sqlite_fts3_enable_parentheses
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
do_execsql_test 43.1 {
|
||||
CREATE VIRTUAL TABLE def USING fts3(xyz);
|
||||
INSERT INTO def_segdir VALUES(0,0,0,0,0, X'0001310301c9000103323334050d81');
|
||||
} {}
|
||||
|
||||
do_execsql_test 43.2 {
|
||||
SELECT rowid FROM def WHERE def MATCH '1 NEAR 1'
|
||||
} {1}
|
||||
|
||||
set sqlite_fts3_enable_parentheses $saved
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 44.1 {
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
|
||||
INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
|
||||
INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'00013103010200010332333405010201ba00000461616161050101020200000462626262050101030200');
|
||||
}
|
||||
|
||||
do_execsql_test 44.2 {
|
||||
SELECT matchinfo(t0, t0) IS NULL FROM t0 WHERE t0 MATCH '1*'
|
||||
} {0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
reset_db
|
||||
do_test 45.0 {
|
||||
sqlite3 db {}
|
||||
db deserialize [decode_hexdb {
|
||||
.open --hexdb
|
||||
| size 24576 pagesize 4096 filename crash-65c98512cc9e49.db
|
||||
| page 1 offset 0
|
||||
| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
|
||||
| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........
|
||||
| 96: 00 00 00 00 0d 0e fc 00 06 0d bc 00 0f ca 0f 6c ...............l
|
||||
| 112: 0f 04 0e 13 0e c9 0d bc 00 00 00 00 00 00 00 00 ................
|
||||
| 3504: 00 00 00 00 00 00 00 00 00 00 00 00 55 06 07 17 ............U...
|
||||
| 3520: 1b 1b 01 81 01 74 61 62 6c 65 78 31 5f 73 74 61 .....tablex1_sta
|
||||
| 3536: 74 78 31 5f 73 74 61 74 06 43 52 45 41 54 45 20 tx1_stat.CREATE
|
||||
| 3552: 54 41 42 4c 45 20 27 78 31 5f 73 74 61 74 27 28 TABLE 'x1_stat'(
|
||||
| 3568: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA
|
||||
| 3584: 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 4c RY KEY, value BL
|
||||
| 3600: 41 82 29 81 33 04 07 17 1f 1f 01 82 35 74 61 62 A.).3.......5tab
|
||||
| 3616: 6c 65 78 31 5f 73 65 67 64 69 72 78 31 5f 73 65 lex1_segdirx1_se
|
||||
| 3632: 67 64 69 72 04 43 52 45 41 54 45 20 54 41 42 4c gdir.CREATE TABL
|
||||
| 3648: 45 20 27 78 31 5f 73 65 67 64 69 72 27 28 6c 65 E 'x1_segdir'(le
|
||||
| 3664: 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 64 78 20 vel INTEGER,idx
|
||||
| 3680: 49 4e 54 45 47 45 52 2c 73 74 61 72 74 5f 62 6c INTEGER,start_bl
|
||||
| 3696: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c 65 61 76 ock INTEGER,leav
|
||||
| 3712: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 es_end_block INT
|
||||
| 3728: 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 6b 20 49 EGER,end_block I
|
||||
| 3744: 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 4c 4f 42 NTEGER,root BLOB
|
||||
| 3760: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 ,PRIMARY KEY(lev
|
||||
| 3776: 65 6c 2c 20 69 64 78 29 29 31 05 06 17 45 1f 01 el, idx))1...E..
|
||||
| 3792: 00 69 6e 64 65 78 73 71 6c 69 74 65 5f 61 75 74 .indexsqlite_aut
|
||||
| 3808: 6f 69 6e 64 65 78 5f 78 31 5f 73 65 67 64 69 72 oindex_x1_segdir
|
||||
| 3824: 5f 31 78 31 5f 73 65 67 64 69 72 05 00 00 00 08 _1x1_segdir.....
|
||||
| 3840: 60 00 00 00 66 03 07 17 23 23 01 81 13 74 61 62 `...f...##...tab
|
||||
| 3856: 6c 65 78 31 5f 73 65 67 6d 65 6e 74 73 78 31 5f lex1_segmentsx1_
|
||||
| 3872: 73 65 67 6d 65 6e 74 73 03 43 52 45 41 54 45 20 segments.CREATE
|
||||
| 3888: 54 41 42 4c 45 20 27 78 31 5f 73 65 67 6d 65 6e TABLE 'x1_segmen
|
||||
| 3904: 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 ts'(blockid INTE
|
||||
| 3920: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
|
||||
| 3936: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c 02 07 17 block BLOB)....
|
||||
| 3952: 21 21 01 81 03 74 61 62 6c 65 78 31 5f 63 6f 6e !!...tablex1_con
|
||||
| 3968: 74 65 6e 74 78 31 5f 63 6f 6e 74 65 6e 74 02 43 tentx1_content.C
|
||||
| 3984: 52 45 41 54 45 20 54 41 42 4c 45 20 27 78 31 5f REATE TABLE 'x1_
|
||||
| 4000: 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 64 20 49 content'(docid I
|
||||
| 4016: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
|
||||
| 4032: 45 59 2c 20 27 63 30 78 27 29 34 01 06 17 11 11 EY, 'c0x')4.....
|
||||
| 4048: 08 57 74 61 62 6c 65 78 31 78 31 43 52 45 41 54 .Wtablex1x1CREAT
|
||||
| 4064: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 E VIRTUAL TABLE
|
||||
| 4080: 78 31 20 55 53 49 4e 47 20 66 74 73 33 28 78 29 x1 USING fts3(x)
|
||||
| page 2 offset 4096
|
||||
| 0: 0d 00 00 00 11 0f 77 f0 0f f8 0f f0 0f e8 0f e0 ......w.........
|
||||
| 16: 0f d8 0f d0 0f c8 0f c0 00 00 00 00 00 00 00 00 ................
|
||||
| 3952: 00 00 00 00 00 00 00 00 06 11 03 00 13 77 78 79 .............wxy
|
||||
| 3968: 06 10 03 00 13 74 75 76 06 0f 03 00 13 71 33 73 .....tuv.....q3s
|
||||
| 3984: 06 0e 03 00 13 6e 6f 70 06 0d 03 00 13 6b 6c 6d .....nop.....klm
|
||||
| 4000: 06 0c 03 04 c3 68 69 6a 06 0b 03 00 13 65 66 67 .....hij.....efg
|
||||
| 4016: 06 0a 03 00 13 62 63 64 06 09 03 00 13 79 7a 61 .....bcd.....yza
|
||||
| 4032: 06 08 03 00 13 76 77 78 06 07 03 00 13 73 74 75 .....vwx.....stu
|
||||
| 4048: 06 06 03 00 13 70 71 72 06 05 03 00 13 6d 6e 6f .....pqr.....mno
|
||||
| 4064: 06 03 03 00 13 6a 6b 6c 06 03 03 00 13 67 68 69 .....jkl.....ghi
|
||||
| 4080: 06 02 02 00 03 64 65 66 06 01 03 00 13 61 52 63 .....def.....aRc
|
||||
| page 3 offset 8192
|
||||
| 0: 0d 00 00 00 03 0f a7 00 0f b5 0f a7 0f fa 01 00 ................
|
||||
| 4000: 00 00 00 00 00 00 00 0c 02 03 00 1e 00 03 6b 6c ..............kl
|
||||
| 4016: 6d 03 0d 02 00 43 01 04 00 81 0a 00 03 61 62 63 m....C.......abc
|
||||
| 4032: 03 0b 32 00 00 03 62 63 64 03 0a 02 00 00 03 64 ..2...bcd......d
|
||||
| 4048: 69 26 03 02 02 00 00 03 65 66 67 03 0b 02 00 00 i&......efg.....
|
||||
| 4064: 03 67 68 69 03 03 02 00 00 03 68 69 6a 03 0c 02 .ghi......hij...
|
||||
| 4080: 00 00 03 6a 6a 2c 03 04 02 00 03 81 00 03 00 00 ...jj,..........
|
||||
| page 4 offset 12288
|
||||
| 0: 0d 0f 3a 00 05 0f 25 00 0f 9e 0f 88 0f 43 0f 25 ..:...%......C.%
|
||||
| 16: 0f 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .r..............
|
||||
| 3856: 00 00 00 00 00 00 00 00 00 56 01 08 08 13 1e 03 .........V......
|
||||
| 3872: 30 20 39 00 03 13 05 07 08 08 18 08 13 1e 30 20 0 9...........0
|
||||
| 3888: 39 00 03 77 78 79 03 11 02 00 0f 6c 00 09 01 08 9..wxy.....l....
|
||||
| 3904: 08 15 54 27 04 07 09 01 08 08 15 42 02 30 20 33 ..T'.......B.0 3
|
||||
| 3920: 36 00 03 6e 6f 70 03 0e 02 00 00 03 71 72 73 03 6..nop......qrs.
|
||||
| 3936: 0f 02 00 00 03 74 75 76 03 10 02 00 0f cf b1 06 .....tuv........
|
||||
| 3952: 01 08 14 06 07 01 08 09 01 1b 14 02 02 31 32 38 .............128
|
||||
| 3968: 20 2d 37 32 10 01 01 6b 14 03 07 09 09 08 08 15 -72...k........
|
||||
| 3984: 1e 30 20 33 36 00 03 79 7a 61 03 09 02 00 2f 02 .0 36..yza..../.
|
||||
| 4000: 07 09 08 08 08 15 54 30 20 33 36 00 03 6d 6e 6f ......T0 36..mno
|
||||
| 4016: 03 05 02 00 00 03 70 71 72 03 06 02 00 00 03 73 ......pqr......s
|
||||
| 4032: 74 75 03 07 02 00 00 03 76 77 78 03 08 02 00 00 tu......vwx.....
|
||||
| 4048: 00 00 4a 08 08 08 15 54 30 20 33 36 00 03 61 62 ..J....T0 36..ab
|
||||
| 4064: 63 03 01 02 00 00 03 64 65 66 03 02 02 00 00 03 c......def......
|
||||
| 4080: 67 68 69 03 03 67 00 00 03 6a 6b 6c 03 04 02 00 ghi..g...jkl....
|
||||
| page 5 offset 16384
|
||||
| 0: 0a 0f e7 00 05 0f da 00 0f e1 0f fa 0f f4 0f ed ................
|
||||
| 16: 0f da 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
| 4048: 00 00 00 00 00 00 00 1a 01 03 06 04 01 08 01 02 ................
|
||||
| 4064: 06 05 04 08 08 01 05 00 00 00 06 01 03 06 04 09 ................
|
||||
| 4080: 02 01 02 04 05 04 09 09 01 03 05 04 09 08 01 02 ................
|
||||
| page 6 offset 20480
|
||||
| 0: 0d 00 10 00 01 0f f9 00 0f f9 00 00 00 00 00 00 ................
|
||||
| 4080: 00 00 00 00 00 00 00 00 00 05 01 03 00 10 01 03 ................
|
||||
| end crash-65c98512cc9e49.db
|
||||
}]} {}
|
||||
|
||||
do_catchsql_test 45.2 {
|
||||
INSERT INTO x1(x1) VALUES( 'merge=1' )
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
set saved $sqlite_fts3_enable_parentheses
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
do_execsql_test 46.1 {
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(a INTEGER PRIMARY KEY,b,c,d);
|
||||
INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'0001310301c9000103323334050d8000f200000461616161050101020200000462626262050101030200');
|
||||
} {}
|
||||
|
||||
do_catchsql_test 46.2 {
|
||||
SELECT * FROM t0
|
||||
WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
|
||||
} {1 {database disk image is malformed}}
|
||||
|
||||
set sqlite_fts3_enable_parentheses $saved
|
||||
|
||||
finish_test
|
||||
|
60
test/fts3corrupt6.test
Normal file
60
test/fts3corrupt6.test
Normal file
@ -0,0 +1,60 @@
|
||||
# 2020 June 8
|
||||
#
|
||||
# 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. The
|
||||
# focus of this script is testing the FTS3 module.
|
||||
#
|
||||
# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/fts3_common.tcl
|
||||
set testprefix fts3corrupt6
|
||||
|
||||
# If SQLITE_ENABLE_FTS3 is defined, omit this file.
|
||||
ifcapable !fts3 {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
set ::saved_sqlite_fts3_enable_parentheses $::sqlite_fts3_enable_parentheses
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
sqlite3_fts3_may_be_corrupt 1
|
||||
database_may_be_corrupt
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t_content(col0 INTEGER);
|
||||
PRAGMA writable_schema=ON;
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
|
||||
INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
|
||||
INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
|
||||
COMMIT;
|
||||
}
|
||||
|
||||
do_execsql_test 1.1 {
|
||||
SELECT 0+matchinfo(t0,'yxyyxy') FROM t0 WHERE t0 MATCH CAST( x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d' AS TEXT);
|
||||
} {0}
|
||||
|
||||
do_execsql_test 1.2 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
|
||||
INSERT INTO t1_content VALUES(0,NULL,NULL,NULL,NULL);
|
||||
INSERT INTO t1_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
|
||||
}
|
||||
|
||||
do_execsql_test 1.3 {
|
||||
SELECT 42+matchinfo(t1,'yxyyxy') FROM t1 WHERE t1 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
|
||||
} {42}
|
||||
|
||||
set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses
|
||||
finish_test
|
||||
|
||||
|
35
test/fts3matchinfo2.test
Normal file
35
test/fts3matchinfo2.test
Normal file
@ -0,0 +1,35 @@
|
||||
# 2020-05-14
|
||||
#
|
||||
# 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 the FTS3 module. The focus
|
||||
# of this file is tables created with the "matchinfo=fts3" option.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
|
||||
ifcapable !fts3 { finish_test ; return }
|
||||
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
|
||||
# Crash case found by cyg0810 at gmail.com 2020-05-14. Reported to
|
||||
# chromium (which is not vulnerable) who kindly referred it to us.
|
||||
#
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t_content(col0 INTEGER);
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
|
||||
INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb');
|
||||
SELECT hex(matchinfo(t0,'yxy')) FROM t0 WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
|
||||
} {/000000.*0000000/}
|
||||
|
||||
|
||||
set sqlite_fts3_enable_parentheses 0
|
||||
finish_test
|
@ -588,18 +588,5 @@ do_execsql_test 5.1 {
|
||||
{[a70] [a71] [a72]}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Request a snippet from a query with more than 64 phrases.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 6.0 {
|
||||
CREATE VIRTUAL TABLE f USING fts3(b);
|
||||
INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218');
|
||||
}
|
||||
|
||||
do_execsql_test 6.1 {
|
||||
SELECT length(snippet(f))>0 FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42';
|
||||
} {1}
|
||||
|
||||
set sqlite_fts3_enable_parentheses 0
|
||||
finish_test
|
||||
|
60
test/fts3snippet2.test
Normal file
60
test/fts3snippet2.test
Normal file
@ -0,0 +1,60 @@
|
||||
# 2020-05-14
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#*************************************************************************
|
||||
#
|
||||
# The tests in this file test the FTS3 auxillary functions offsets(),
|
||||
# snippet() and matchinfo() work. At time of writing, running this file
|
||||
# provides full coverage of fts3_snippet.c.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix fts3snippet
|
||||
|
||||
# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
|
||||
ifcapable !fts3 { finish_test ; return }
|
||||
source $testdir/fts3_common.tcl
|
||||
|
||||
set sqlite_fts3_enable_parentheses 1
|
||||
#-------------------------------------------------------------------------
|
||||
# Request a snippet from a query with more than 64 phrases.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 1.0 {
|
||||
CREATE VIRTUAL TABLE f USING fts3(b);
|
||||
INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218');
|
||||
}
|
||||
|
||||
do_execsql_test 1.1 {
|
||||
SELECT length(snippet(f))>0 FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42';
|
||||
} {1}
|
||||
|
||||
reset_db
|
||||
do_execsql_test 2.0 {
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
|
||||
INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb');
|
||||
SELECT snippet(t0) FROM t0 WHERE t0 MATCH x'0a4d4d4d4d320a4f52d70a310a310a4e4541520a0a31f6ce0a4f520a0a310a310a310a4f520a75fc2a242424' ;
|
||||
} {<b>1</b>}
|
||||
|
||||
reset_db
|
||||
do_execsql_test 2.1 {
|
||||
CREATE VIRTUAL TABLE t0 USING fts3(
|
||||
col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY
|
||||
);
|
||||
INSERT INTO t0 VALUES ('one', '1234','aaaa','bbbb');
|
||||
}
|
||||
do_execsql_test 2.2 {
|
||||
SELECT snippet(t0) FROM t0 WHERE t0 MATCH
|
||||
'(def AND (one NEAR abc)) OR one'
|
||||
} {<b>one</b>}
|
||||
|
||||
set sqlite_fts3_enable_parentheses 0
|
||||
finish_test
|
||||
|
Binary file not shown.
@ -560,4 +560,30 @@ do_catchsql_test gencol1-19.10 {
|
||||
INSERT INTO t0(c1) VALUES(0.16334143182538696), (0);
|
||||
} {1 {UNIQUE constraint failed: t0.c0}}
|
||||
|
||||
# 2020-06-29 forum bug report.
|
||||
# https://sqlite.org/forum/forumpost/73b9a8ccfb
|
||||
#
|
||||
do_execsql_test gencol1-20.1 {
|
||||
CREATE TEMPORARY TABLE tab (
|
||||
prim DATE PRIMARY KEY,
|
||||
a INTEGER,
|
||||
comp INTEGER AS (a),
|
||||
b INTEGER,
|
||||
x INTEGER
|
||||
);
|
||||
-- Add some data
|
||||
INSERT INTO tab (prim, a, b) VALUES ('2001-01-01', 0, 0);
|
||||
-- Check that each column is 0 like I expect
|
||||
SELECT * FROM tab;
|
||||
} {2001-01-01 0 0 0 {}}
|
||||
do_execsql_test gencol1-20.2 {
|
||||
-- Do an UPSERT on the b column
|
||||
INSERT INTO tab (prim, b)
|
||||
VALUES ('2001-01-01',5)
|
||||
ON CONFLICT(prim) DO UPDATE SET b=excluded.b;
|
||||
-- Now b is NULL rather than 5
|
||||
SELECT * FROM tab;
|
||||
} {2001-01-01 0 0 5 {}}
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -23,8 +23,8 @@ foreach {id float rep} {
|
||||
3 0.5 1,-1
|
||||
4 1.5 3,-1
|
||||
5 0.0 0,-1075
|
||||
6 4.9406564584124654e-324 4503599627370497,-1075
|
||||
7 2.2250738585072009e-308 9007199254740991,-1075
|
||||
6 4.9406564584124654e-324 1,-1074
|
||||
7 2.2250738585072009e-308 4503599627370495,-1074
|
||||
8 2.2250738585072014e-308 1,-1022
|
||||
} {
|
||||
do_test ieee754-100-$id-1 {
|
||||
|
@ -339,5 +339,17 @@ do_execsql_test index7-7.1 {
|
||||
SELECT * FROM t6 WHERE y IS TRUE ORDER BY x;
|
||||
} {1 1}
|
||||
|
||||
# 2020-05-27. tag-20200527-1.
|
||||
# Incomplete stat1 information on a table with few rows should still use the
|
||||
# index.
|
||||
reset_db
|
||||
do_execsql_test index7-8.1 {
|
||||
CREATE TABLE t1(x INTEGER PRIMARY KEY, y);
|
||||
CREATE INDEX t1y ON t1(y) WHERE y IS NOT NULL;
|
||||
INSERT INTO t1(x) VALUES(1),(2);
|
||||
ANALYZE;
|
||||
EXPLAIN QUERY PLAN SELECT 1 FROM t1 WHERE y=5;
|
||||
} {/SEARCH TABLE t1 USING COVERING INDEX t1y/}
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -95,7 +95,7 @@ do_test indexedby-2.4 {
|
||||
# an error.
|
||||
do_test indexedby-2.4.1 {
|
||||
catchsql { SELECT b FROM t1 INDEXED BY i1 WHERE b = 'two' }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
do_test indexedby-2.5 {
|
||||
catchsql { SELECT * FROM t1 INDEXED BY i5 WHERE a = 'one' AND b = 'two'}
|
||||
@ -135,10 +135,10 @@ do_eqp_test indexedby-3.3 {
|
||||
} {SEARCH TABLE t1 USING INDEX i2 (b=?)}
|
||||
do_test indexedby-3.4 {
|
||||
catchsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-3.5 {
|
||||
catchsql { SELECT * FROM t1 INDEXED BY i2 ORDER BY a }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-3.6 {
|
||||
catchsql { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' }
|
||||
} {0 {}}
|
||||
@ -154,7 +154,7 @@ do_eqp_test indexedby-3.9 {
|
||||
} {SEARCH TABLE t3 USING INDEX sqlite_autoindex_t3_1 (e=?)}
|
||||
do_test indexedby-3.10 {
|
||||
catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE f = 10 }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-3.11 {
|
||||
catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_2 WHERE f = 10 }
|
||||
} {1 {no such index: sqlite_autoindex_t3_2}}
|
||||
@ -172,19 +172,19 @@ do_eqp_test indexedby-4.2 {
|
||||
SELECT * FROM t1 INDEXED BY i1, t2 WHERE a = c
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE t2
|
||||
`--SEARCH TABLE t1 USING INDEX i1 (a=?)
|
||||
|--SCAN TABLE t1 USING INDEX i1
|
||||
`--SEARCH TABLE t2 USING INDEX i3 (c=?)
|
||||
}
|
||||
do_test indexedby-4.3 {
|
||||
catchsql {
|
||||
SELECT * FROM t1 INDEXED BY i1, t2 INDEXED BY i3 WHERE a=c
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-4.4 {
|
||||
catchsql {
|
||||
SELECT * FROM t2 INDEXED BY i3, t1 INDEXED BY i1 WHERE a=c
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
# Test embedding an INDEXED BY in a CREATE VIEW statement. This block
|
||||
# also tests that nothing bad happens if an index refered to by
|
||||
@ -205,7 +205,7 @@ do_test indexedby-5.4 {
|
||||
# Recreate index i1 in such a way as it cannot be used by the view query.
|
||||
execsql { CREATE INDEX i1 ON t1(b) }
|
||||
catchsql { SELECT * FROM v2 }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-5.5 {
|
||||
# Drop and recreate index i1 again. This time, create it so that it can
|
||||
# be used by the query.
|
||||
@ -245,7 +245,7 @@ do_eqp_test indexedby-7.5 {
|
||||
} {SEARCH TABLE t1 USING INDEX i2 (b=?)}
|
||||
do_test indexedby-7.6 {
|
||||
catchsql { DELETE FROM t1 INDEXED BY i2 WHERE a = 5}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
# Test that "INDEXED BY" can be used in an UPDATE statement.
|
||||
#
|
||||
@ -266,7 +266,7 @@ do_eqp_test indexedby-8.5 {
|
||||
} {SEARCH TABLE t1 USING INDEX i2 (b=?)}
|
||||
do_test indexedby-8.6 {
|
||||
catchsql { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
# Test that bug #3560 is fixed.
|
||||
#
|
||||
@ -284,10 +284,10 @@ do_test indexedby-9.2 {
|
||||
joinme as j indexed by joinme_id_text_idx
|
||||
on ( m.id = j.id_int)
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test indexedby-9.3 {
|
||||
catchsql { select * from maintable, joinme INDEXED by joinme_id_text_idx }
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
# Make sure we can still create tables, indices, and columns whose name
|
||||
# is "indexed".
|
||||
|
@ -172,4 +172,33 @@ do_execsql_test istrue-710 {
|
||||
SELECT 0.0 IS FALSE COLLATE BINARY;
|
||||
} {1 1 1 1 1 1 1 1 1}
|
||||
|
||||
# 2020-06-12 bug report from Chromium
|
||||
# https://bugs.chromium.org/p/chromium/issues/detail?id=1094247
|
||||
do_catchsql_test istrue-800 {
|
||||
SELECT 9 IN (false.false);
|
||||
} {1 {no such column: false.false}}
|
||||
do_execsql_test istrue-810 {
|
||||
CREATE TABLE t8(a INT, true INT, false INT, d INT);
|
||||
INSERT INTO t8(a,true,false,d) VALUES(5,6,7,8),(4,3,2,1),('a','b','c','d');
|
||||
SELECT * FROM t8 ORDER BY false;
|
||||
} {4 3 2 1 5 6 7 8 a b c d}
|
||||
do_catchsql_test istrue-820 {
|
||||
SELECT 9 IN (false.false) FROM t8;
|
||||
} {1 {no such column: false.false}}
|
||||
do_execsql_test istrue-830 {
|
||||
CREATE TABLE false(true INT, false INT, x INT CHECK (5 IN (false.false)));
|
||||
} {}
|
||||
do_execsql_test istrue-840 {
|
||||
INSERT INTO False VALUES(4,5,6);
|
||||
} {}
|
||||
do_catchsql_test istrue-841 {
|
||||
INSERT INTO False VALUES(5,6,7);
|
||||
} {1 {CHECK constraint failed: false}}
|
||||
do_execsql_test istrue-850 {
|
||||
SELECT 9 IN (false.false) FROM false;
|
||||
} {0}
|
||||
do_execsql_test istrue-851 {
|
||||
SELECT 5 IN (false.false) FROM false;
|
||||
} {1}
|
||||
|
||||
finish_test
|
||||
|
@ -907,7 +907,7 @@ static int runMain(int argc, char **argv){
|
||||
if( eType==PATH_DB ){
|
||||
/* Recover any prior crashes prior to starting the timer */
|
||||
sqlite3_open(zDb, &db);
|
||||
sqlite3_exec(db, "SELECT rowid FROM sqlite_master LIMIT 1", 0, 0, 0);
|
||||
sqlite3_exec(db, "SELECT rowid FROM sqlite_schema LIMIT 1", 0, 0, 0);
|
||||
sqlite3_close(db);
|
||||
db = 0;
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ proc mutex_counters {varname} {
|
||||
#-------------------------------------------------------------------------
|
||||
# Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if
|
||||
# is called at the wrong time. And that the first time sqlite3_initialize
|
||||
# is called it obtains the 'static_master' mutex 3 times and a recursive
|
||||
# is called it obtains the 'static_main' mutex 3 times and a recursive
|
||||
# mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops
|
||||
# that do not require any mutexes.
|
||||
#
|
||||
@ -75,7 +75,7 @@ do_test mutex1-1.6 {
|
||||
|
||||
do_test mutex1-1.7 {
|
||||
mutex_counters counters
|
||||
# list $counters(total) $counters(static_master)
|
||||
# list $counters(total) $counters(static_main)
|
||||
expr {$counters(total)>0}
|
||||
} {1}
|
||||
|
||||
@ -86,7 +86,7 @@ do_test mutex1-1.8 {
|
||||
|
||||
do_test mutex1-1.9 {
|
||||
mutex_counters counters
|
||||
list $counters(total) $counters(static_master)
|
||||
list $counters(total) $counters(static_main)
|
||||
} {0 0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -103,13 +103,13 @@ ifcapable threadsafe1&&shared_cache {
|
||||
singlethread {}
|
||||
multithread {
|
||||
fast static_app1 static_app2 static_app3
|
||||
static_lru static_master static_mem static_open
|
||||
static_lru static_main static_mem static_open
|
||||
static_prng static_pmem static_vfs1 static_vfs2
|
||||
static_vfs3
|
||||
}
|
||||
serialized {
|
||||
fast recursive static_app1 static_app2
|
||||
static_app3 static_lru static_master static_mem
|
||||
static_app3 static_lru static_main static_mem
|
||||
static_open static_prng static_pmem static_vfs1
|
||||
static_vfs2 static_vfs3
|
||||
}
|
||||
|
@ -945,4 +945,3 @@ unsigned char data001[] = {
|
||||
78, 32,116, 49, 32, 79, 78, 32, 40,116, 49, 46, 97, 61, 53, 48, 45, 99, 48,
|
||||
46,120, 41,
|
||||
};
|
||||
|
||||
|
@ -171,6 +171,12 @@ test_suite "veryquick" -prefix "" -description {
|
||||
*fts5corrupt* *fts5big* *fts5aj*
|
||||
]
|
||||
|
||||
test_suite "shell" -prefix "" -description {
|
||||
Run tests of the command-line shell
|
||||
} -files [
|
||||
test_set [glob $testdir/shell*.test]
|
||||
]
|
||||
|
||||
test_suite "extraquick" -prefix "" -description {
|
||||
"Extra" quick test suite. Runs in a few minutes on a workstation.
|
||||
This test suite is the same as the "veryquick" tests, except that
|
||||
|
@ -538,9 +538,11 @@ do_test printf-2.1.2.8 {
|
||||
do_test printf-2.1.2.9 {
|
||||
sqlite3_mprintf_double {abc: %d %d (%1.1g) :xyz} 1 1 1.0e-20
|
||||
} {abc: 1 1 (1e-20) :xyz}
|
||||
do_test printf-2.1.2.10 {
|
||||
sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20
|
||||
} {}
|
||||
if {$SQLITE_MAX_LENGTH<=[expr 1000*1000*1000]} {
|
||||
do_test printf-2.1.2.10 {
|
||||
sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20
|
||||
} {}
|
||||
}
|
||||
do_test printf-2.1.3.1 {
|
||||
sqlite3_mprintf_double {abc: (%*.*f) :xyz} 1 1 1.0
|
||||
} {abc: (1.0) :xyz}
|
||||
@ -3777,4 +3779,11 @@ foreach ::iRepeat {0 1} {
|
||||
}
|
||||
}
|
||||
|
||||
# 2020-05-23
|
||||
# ticket 23439ea582241138
|
||||
#
|
||||
do_execsql_test printf-16.1 {
|
||||
SELECT printf('%.*g',2147483647,0.01);
|
||||
} {0.01}
|
||||
|
||||
finish_test
|
||||
|
@ -314,4 +314,13 @@ do_execsql_test select3-9.100 {
|
||||
SELECT * FROM t0 GROUP BY c0;
|
||||
} {1.0 1.0}
|
||||
|
||||
reset_db
|
||||
do_execsql_test select3.10.100 {
|
||||
CREATE TABLE t1(a, b);
|
||||
CREATE TABLE t2(c, d);
|
||||
SELECT max(t1.a),
|
||||
(SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1)
|
||||
FROM t1;
|
||||
} {{} {}}
|
||||
|
||||
finish_test
|
||||
|
@ -1446,5 +1446,26 @@ do_execsql_test 6.1 {
|
||||
SELECT * FROM (SELECT a FROM t1 UNION SELECT b FROM t2) WHERE a=a;
|
||||
} {12345}
|
||||
|
||||
# 2020-06-15 ticket 8f157e8010b22af0
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 7.1 {
|
||||
CREATE TABLE t1(c1); INSERT INTO t1 VALUES(12),(123),(1234),(NULL),('abc');
|
||||
CREATE TABLE t2(c2); INSERT INTO t2 VALUES(44),(55),(123);
|
||||
CREATE TABLE t3(c3,c4); INSERT INTO t3 VALUES(66,1),(123,2),(77,3);
|
||||
CREATE VIEW t4 AS SELECT c3 FROM t3;
|
||||
CREATE VIEW t5 AS SELECT c3 FROM t3 ORDER BY c4;
|
||||
}
|
||||
do_execsql_test 7.2 {
|
||||
SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t4) AND c1=123;
|
||||
} {123 123}
|
||||
do_execsql_test 7.3 {
|
||||
SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t5) AND c1=123;
|
||||
} {123 123}
|
||||
do_execsql_test 7.4 {
|
||||
CREATE TABLE a(b);
|
||||
CREATE VIEW c(d) AS SELECT b FROM a ORDER BY b;
|
||||
SELECT sum(d) OVER( PARTITION BY(SELECT 0 FROM c JOIN a WHERE b =(SELECT b INTERSECT SELECT d FROM c) AND b = 123)) FROM c;
|
||||
} {}
|
||||
|
||||
finish_test
|
||||
|
@ -199,10 +199,10 @@ do_test shell1-2.2.4 {
|
||||
} {0 {}}
|
||||
do_test shell1-2.2.5 {
|
||||
catchcmd "test.db" ".mode \"insert FOO"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
do_test shell1-2.2.6 {
|
||||
catchcmd "test.db" ".mode \'insert FOO"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
|
||||
# check multiple tokens, and quoted tokens
|
||||
do_test shell1-2.3.1 {
|
||||
@ -230,7 +230,7 @@ do_test shell1-2.3.7 {
|
||||
# check quoted args are unquoted
|
||||
do_test shell1-2.4.1 {
|
||||
catchcmd "test.db" ".mode FOO"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
do_test shell1-2.4.2 {
|
||||
catchcmd "test.db" ".mode csv"
|
||||
} {0 {}}
|
||||
@ -430,7 +430,7 @@ do_test shell1-3.13.1 {
|
||||
} {0 {current output mode: list}}
|
||||
do_test shell1-3.13.2 {
|
||||
catchcmd "test.db" ".mode FOO"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
do_test shell1-3.13.3 {
|
||||
catchcmd "test.db" ".mode csv"
|
||||
} {0 {}}
|
||||
@ -463,10 +463,10 @@ do_test shell1-3.13.11 {
|
||||
# don't allow partial mode type matches
|
||||
do_test shell1-3.13.12 {
|
||||
catchcmd "test.db" ".mode l"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
do_test shell1-3.13.13 {
|
||||
catchcmd "test.db" ".mode li"
|
||||
} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}}
|
||||
} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}}
|
||||
do_test shell1-3.13.14 {
|
||||
catchcmd "test.db" ".mode lin"
|
||||
} {0 {}}
|
||||
@ -709,11 +709,11 @@ do_test shell1-3.26.4 {
|
||||
# this should be treated the same as a '1' width for col 1 and 2
|
||||
} {0 {}}
|
||||
do_test shell1-3.26.5 {
|
||||
catchcmd "test.db" ".mode column\n.width 10 -10\nSELECT 'abcdefg', 123456;"
|
||||
catchcmd "test.db" ".mode column\n.header off\n.width 10 -10\nSELECT 'abcdefg', 123456;"
|
||||
# this should be treated the same as a '1' width for col 1 and 2
|
||||
} {0 {abcdefg 123456}}
|
||||
do_test shell1-3.26.6 {
|
||||
catchcmd "test.db" ".mode column\n.width -10 10\nSELECT 'abcdefg', 123456;"
|
||||
catchcmd "test.db" ".mode column\n.header off\n.width -10 10\nSELECT 'abcdefg', 123456;"
|
||||
# this should be treated the same as a '1' width for col 1 and 2
|
||||
} {0 { abcdefg 123456 }}
|
||||
|
||||
|
@ -7,7 +7,7 @@ static const char zHelp[] =
|
||||
"Usage: %s [--options] DATABASE\n"
|
||||
"Options:\n"
|
||||
" --autovacuum Enable AUTOVACUUM mode\n"
|
||||
" --cachesize N Set the cache size to N\n"
|
||||
" --cachesize N Set the cache size to N\n"
|
||||
" --exclusive Enable locking_mode=EXCLUSIVE\n"
|
||||
" --explain Like --sqlonly but with added EXPLAIN keywords\n"
|
||||
" --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n"
|
||||
@ -15,11 +15,13 @@ static const char zHelp[] =
|
||||
" --journal M Set the journal_mode to M\n"
|
||||
" --key KEY Set the encryption key to KEY\n"
|
||||
" --lookaside N SZ Configure lookaside for N slots of SZ bytes each\n"
|
||||
" --memdb Use an in-memory database\n"
|
||||
" --mmap SZ MMAP the first SZ bytes of the database file\n"
|
||||
" --multithread Set multithreaded mode\n"
|
||||
" --nomemstat Disable memory statistics\n"
|
||||
" --nosync Set PRAGMA synchronous=OFF\n"
|
||||
" --notnull Add NOT NULL constraints to table columns\n"
|
||||
" --output FILE Store SQL output in FILE\n"
|
||||
" --pagesize N Set the page size to N\n"
|
||||
" --pcache N SZ Configure N pages of pagecache each of size SZ bytes\n"
|
||||
" --primarykey Use PRIMARY KEY instead of UNIQUE where appropriate\n"
|
||||
@ -41,7 +43,6 @@ static const char zHelp[] =
|
||||
" --without-rowid Use WITHOUT ROWID where appropriate\n"
|
||||
;
|
||||
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
@ -61,6 +62,20 @@ static const char zHelp[] =
|
||||
# define sqlite3_int64 sqlite_int64
|
||||
#endif
|
||||
|
||||
typedef sqlite3_uint64 u64;
|
||||
|
||||
/*
|
||||
** State structure for a Hash hash in progress
|
||||
*/
|
||||
typedef struct HashContext HashContext;
|
||||
struct HashContext {
|
||||
unsigned char isInit; /* True if initialized */
|
||||
unsigned char i, j; /* State variables */
|
||||
unsigned char s[256]; /* State variables */
|
||||
unsigned char r[32]; /* Result */
|
||||
};
|
||||
|
||||
|
||||
/* All global state is held in this structure */
|
||||
static struct Global {
|
||||
sqlite3 *db; /* The open database connection */
|
||||
@ -80,8 +95,13 @@ static struct Global {
|
||||
const char *zNN; /* Might be NOT NULL */
|
||||
const char *zPK; /* Might be UNIQUE or PRIMARY KEY */
|
||||
unsigned int x, y; /* Pseudo-random number generator state */
|
||||
u64 nResByte; /* Total number of result bytes */
|
||||
int nResult; /* Size of the current result */
|
||||
char zResult[3000]; /* Text of the current result */
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
FILE *hashFile; /* Store all hash results in this file */
|
||||
HashContext hash; /* Hash of all output */
|
||||
#endif
|
||||
} g;
|
||||
|
||||
/* Return " TEMP" or "", as appropriate for creating a table.
|
||||
@ -90,7 +110,6 @@ static const char *isTemp(int N){
|
||||
return g.eTemp>=N ? " TEMP" : "";
|
||||
}
|
||||
|
||||
|
||||
/* Print an error message and exit */
|
||||
static void fatal_error(const char *zMsg, ...){
|
||||
va_list ap;
|
||||
@ -100,6 +119,72 @@ static void fatal_error(const char *zMsg, ...){
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
/****************************************************************************
|
||||
** Hash algorithm used to verify that compilation is not miscompiled
|
||||
** in such a was as to generate an incorrect result.
|
||||
*/
|
||||
|
||||
/*
|
||||
** Initialize a new hash. iSize determines the size of the hash
|
||||
** in bits and should be one of 224, 256, 384, or 512. Or iSize
|
||||
** can be zero to use the default hash size of 256 bits.
|
||||
*/
|
||||
static void HashInit(void){
|
||||
unsigned int k;
|
||||
g.hash.i = 0;
|
||||
g.hash.j = 0;
|
||||
for(k=0; k<256; k++) g.hash.s[k] = k;
|
||||
}
|
||||
|
||||
/*
|
||||
** Make consecutive calls to the HashUpdate function to add new content
|
||||
** to the hash
|
||||
*/
|
||||
static void HashUpdate(
|
||||
const unsigned char *aData,
|
||||
unsigned int nData
|
||||
){
|
||||
unsigned char t;
|
||||
unsigned char i = g.hash.i;
|
||||
unsigned char j = g.hash.j;
|
||||
unsigned int k;
|
||||
if( g.hashFile ) fwrite(aData, 1, nData, g.hashFile);
|
||||
for(k=0; k<nData; k++){
|
||||
j += g.hash.s[i] + aData[k];
|
||||
t = g.hash.s[j];
|
||||
g.hash.s[j] = g.hash.s[i];
|
||||
g.hash.s[i] = t;
|
||||
i++;
|
||||
}
|
||||
g.hash.i = i;
|
||||
g.hash.j = j;
|
||||
}
|
||||
|
||||
/*
|
||||
** After all content has been added, invoke HashFinal() to compute
|
||||
** the final hash. The hash result is stored in g.hash.r[].
|
||||
*/
|
||||
static void HashFinal(void){
|
||||
unsigned int k;
|
||||
unsigned char t, i, j;
|
||||
i = g.hash.i;
|
||||
j = g.hash.j;
|
||||
for(k=0; k<32; k++){
|
||||
i++;
|
||||
t = g.hash.s[i];
|
||||
j += t;
|
||||
g.hash.s[i] = g.hash.s[j];
|
||||
g.hash.s[j] = t;
|
||||
t += g.hash.s[i];
|
||||
g.hash.r[k] = g.hash.s[t];
|
||||
}
|
||||
}
|
||||
|
||||
/* End of the Hash hashing logic
|
||||
*****************************************************************************/
|
||||
#endif /* SPEEDTEST_OMIT_HASH */
|
||||
|
||||
/*
|
||||
** Return the value of a hexadecimal digit. Return -1 if the input
|
||||
** is not a hex digit.
|
||||
@ -324,6 +409,21 @@ void speedtest1_final(void){
|
||||
printf(" TOTAL%.*s %4d.%03ds\n", NAMEWIDTH-5, zDots,
|
||||
(int)(g.iTotal/1000), (int)(g.iTotal%1000));
|
||||
}
|
||||
if( g.bVerify ){
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
int i;
|
||||
#endif
|
||||
printf("Verification Hash: %llu ", g.nResByte);
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
HashUpdate((const unsigned char*)"\n", 1);
|
||||
HashFinal();
|
||||
for(i=0; i<24; i++){
|
||||
printf("%02x", g.hash.r[i]);
|
||||
}
|
||||
if( g.hashFile && g.hashFile!=stdout ) fclose(g.hashFile);
|
||||
#endif
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Print an SQL statement to standard output */
|
||||
@ -372,6 +472,36 @@ void speedtest1_exec(const char *zFormat, ...){
|
||||
speedtest1_shrink_memory();
|
||||
}
|
||||
|
||||
/* Run SQL and return the first column of the first row as a string. The
|
||||
** returned string is obtained from sqlite_malloc() and must be freed by
|
||||
** the caller.
|
||||
*/
|
||||
char *speedtest1_once(const char *zFormat, ...){
|
||||
va_list ap;
|
||||
char *zSql;
|
||||
sqlite3_stmt *pStmt;
|
||||
char *zResult = 0;
|
||||
va_start(ap, zFormat);
|
||||
zSql = sqlite3_vmprintf(zFormat, ap);
|
||||
va_end(ap);
|
||||
if( g.bSqlOnly ){
|
||||
printSql(zSql);
|
||||
}else{
|
||||
int rc = sqlite3_prepare_v2(g.db, zSql, -1, &pStmt, 0);
|
||||
if( rc ){
|
||||
fatal_error("SQL error: %s\n", sqlite3_errmsg(g.db));
|
||||
}
|
||||
if( sqlite3_step(pStmt)==SQLITE_ROW ){
|
||||
const char *z = (const char*)sqlite3_column_text(pStmt, 0);
|
||||
if( z ) zResult = sqlite3_mprintf("%s", z);
|
||||
}
|
||||
sqlite3_finalize(pStmt);
|
||||
}
|
||||
sqlite3_free(zSql);
|
||||
speedtest1_shrink_memory();
|
||||
return zResult;
|
||||
}
|
||||
|
||||
/* Prepare an SQL statement */
|
||||
void speedtest1_prepare(const char *zFormat, ...){
|
||||
va_list ap;
|
||||
@ -404,6 +534,39 @@ void speedtest1_run(void){
|
||||
const char *z = (const char*)sqlite3_column_text(g.pStmt, i);
|
||||
if( z==0 ) z = "nil";
|
||||
len = (int)strlen(z);
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
if( g.bVerify ){
|
||||
int eType = sqlite3_column_type(g.pStmt, i);
|
||||
unsigned char zPrefix[2];
|
||||
zPrefix[0] = '\n';
|
||||
zPrefix[1] = "-IFTBN"[eType];
|
||||
if( g.nResByte ){
|
||||
HashUpdate(zPrefix, 2);
|
||||
}else{
|
||||
HashUpdate(zPrefix+1, 1);
|
||||
}
|
||||
if( eType==SQLITE_FLOAT ){
|
||||
/* Omit the value of floating-point results from the verification
|
||||
** hash. The only thing we record is the fact that the result was
|
||||
** a floating-point value. */
|
||||
g.nResByte += 2;
|
||||
}else if( eType==SQLITE_BLOB ){
|
||||
int nBlob = sqlite3_column_bytes(g.pStmt, i);
|
||||
int iBlob;
|
||||
unsigned char zChar[2];
|
||||
const unsigned char *aBlob = sqlite3_column_blob(g.pStmt, i);
|
||||
for(iBlob=0; iBlob<nBlob; iBlob++){
|
||||
zChar[0] = "0123456789abcdef"[aBlob[iBlob]>>4];
|
||||
zChar[1] = "0123456789abcdef"[aBlob[iBlob]&15];
|
||||
HashUpdate(zChar,2);
|
||||
}
|
||||
g.nResByte += nBlob*2 + 2;
|
||||
}else{
|
||||
HashUpdate((unsigned char*)z, len);
|
||||
g.nResByte += len + 2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if( g.nResult+len<sizeof(g.zResult)-2 ){
|
||||
if( g.nResult>0 ) g.zResult[g.nResult++] = ' ';
|
||||
memcpy(g.zResult + g.nResult, z, len+1);
|
||||
@ -1987,7 +2150,8 @@ int main(int argc, char **argv){
|
||||
int showStats = 0; /* True for --stats */
|
||||
int nThread = 0; /* --threads value */
|
||||
int mmapSize = 0; /* How big of a memory map to use */
|
||||
const char *zTSet = "main"; /* Which --testset torun */
|
||||
int memDb = 0; /* --memdb. Use an in-memory database */
|
||||
char *zTSet = "main"; /* Which --testset torun */
|
||||
int doTrace = 0; /* True for --trace */
|
||||
const char *zEncoding = 0; /* --utf16be or --utf16le */
|
||||
const char *zDbName = 0; /* Name of the test database */
|
||||
@ -2000,7 +2164,7 @@ int main(int argc, char **argv){
|
||||
int rc; /* API return code */
|
||||
|
||||
/* Display the version of SQLite being tested */
|
||||
printf("-- Speedtest1 for SQLite %s %.50s\n",
|
||||
printf("-- Speedtest1 for SQLite %s %.48s\n",
|
||||
sqlite3_libversion(), sqlite3_sourceid());
|
||||
|
||||
/* Process command-line arguments */
|
||||
@ -2042,6 +2206,8 @@ int main(int argc, char **argv){
|
||||
nLook = integerValue(argv[i+1]);
|
||||
szLook = integerValue(argv[i+2]);
|
||||
i += 2;
|
||||
}else if( strcmp(z,"memdb")==0 ){
|
||||
memDb = 1;
|
||||
#if SQLITE_VERSION_NUMBER>=3006000
|
||||
}else if( strcmp(z,"multithread")==0 ){
|
||||
sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
|
||||
@ -2057,6 +2223,22 @@ int main(int argc, char **argv){
|
||||
noSync = 1;
|
||||
}else if( strcmp(z,"notnull")==0 ){
|
||||
g.zNN = "NOT NULL";
|
||||
}else if( strcmp(z,"output")==0 ){
|
||||
#ifdef SPEEDTEST_OMIT_HASH
|
||||
fatal_error("The --output option is not supported with"
|
||||
" -DSPEEDTEST_OMIT_HASH\n");
|
||||
#else
|
||||
if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
||||
i++;
|
||||
if( strcmp(argv[i],"-")==0 ){
|
||||
g.hashFile = stdout;
|
||||
}else{
|
||||
g.hashFile = fopen(argv[i], "wb");
|
||||
if( g.hashFile==0 ){
|
||||
fatal_error("cannot open \"%s\" for writing\n", argv[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}else if( strcmp(z,"pagesize")==0 ){
|
||||
if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
||||
pageSize = integerValue(argv[++i]);
|
||||
@ -2110,6 +2292,9 @@ int main(int argc, char **argv){
|
||||
zEncoding = "utf16be";
|
||||
}else if( strcmp(z,"verify")==0 ){
|
||||
g.bVerify = 1;
|
||||
#ifndef SPEEDTEST_OMIT_HASH
|
||||
HashInit();
|
||||
#endif
|
||||
}else if( strcmp(z,"without-rowid")==0 ){
|
||||
g.zWR = "WITHOUT ROWID";
|
||||
g.zPK = "PRIMARY KEY";
|
||||
@ -2151,13 +2336,13 @@ int main(int argc, char **argv){
|
||||
sqlite3_initialize();
|
||||
|
||||
/* Open the database and the input file */
|
||||
if( sqlite3_open(zDbName, &g.db) ){
|
||||
if( sqlite3_open(memDb ? ":memory:" : zDbName, &g.db) ){
|
||||
fatal_error("Cannot open database file: %s\n", zDbName);
|
||||
}
|
||||
#if SQLITE_VERSION_NUMBER>=3006001
|
||||
if( nLook>0 && szLook>0 ){
|
||||
pLook = malloc( nLook*szLook );
|
||||
rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE, pLook, szLook,nLook);
|
||||
rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE,pLook,szLook,nLook);
|
||||
if( rc ) fatal_error("lookaside configuration failed: %d\n", rc);
|
||||
}
|
||||
#endif
|
||||
@ -2167,6 +2352,9 @@ int main(int argc, char **argv){
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
if( doTrace ) sqlite3_trace(g.db, traceCallback, 0);
|
||||
#endif
|
||||
if( memDb>0 ){
|
||||
speedtest1_exec("PRAGMA temp_store=memory");
|
||||
}
|
||||
if( mmapSize>0 ){
|
||||
speedtest1_exec("PRAGMA mmap_size=%d", mmapSize);
|
||||
}
|
||||
@ -2197,30 +2385,68 @@ int main(int argc, char **argv){
|
||||
}
|
||||
|
||||
if( g.bExplain ) printf(".explain\n.echo on\n");
|
||||
if( strcmp(zTSet,"main")==0 ){
|
||||
testset_main();
|
||||
}else if( strcmp(zTSet,"debug1")==0 ){
|
||||
testset_debug1();
|
||||
}else if( strcmp(zTSet,"orm")==0 ){
|
||||
testset_orm();
|
||||
}else if( strcmp(zTSet,"cte")==0 ){
|
||||
testset_cte();
|
||||
}else if( strcmp(zTSet,"fp")==0 ){
|
||||
testset_fp();
|
||||
}else if( strcmp(zTSet,"trigger")==0 ){
|
||||
testset_trigger();
|
||||
}else if( strcmp(zTSet,"rtree")==0 ){
|
||||
do{
|
||||
char *zThisTest = zTSet;
|
||||
char *zComma = strchr(zThisTest,',');
|
||||
if( zComma ){
|
||||
*zComma = 0;
|
||||
zTSet = zComma+1;
|
||||
}else{
|
||||
zTSet = "";
|
||||
}
|
||||
if( g.iTotal>0 || zComma!=0 ){
|
||||
printf(" Begin testset \"%s\"\n", zThisTest);
|
||||
}
|
||||
if( strcmp(zThisTest,"main")==0 ){
|
||||
testset_main();
|
||||
}else if( strcmp(zThisTest,"debug1")==0 ){
|
||||
testset_debug1();
|
||||
}else if( strcmp(zThisTest,"orm")==0 ){
|
||||
testset_orm();
|
||||
}else if( strcmp(zThisTest,"cte")==0 ){
|
||||
testset_cte();
|
||||
}else if( strcmp(zThisTest,"fp")==0 ){
|
||||
testset_fp();
|
||||
}else if( strcmp(zThisTest,"trigger")==0 ){
|
||||
testset_trigger();
|
||||
}else if( strcmp(zThisTest,"rtree")==0 ){
|
||||
#ifdef SQLITE_ENABLE_RTREE
|
||||
testset_rtree(6, 147);
|
||||
testset_rtree(6, 147);
|
||||
#else
|
||||
fatal_error("compile with -DSQLITE_ENABLE_RTREE to enable "
|
||||
"the R-Tree tests\n");
|
||||
fatal_error("compile with -DSQLITE_ENABLE_RTREE to enable "
|
||||
"the R-Tree tests\n");
|
||||
#endif
|
||||
}else{
|
||||
fatal_error("unknown testset: \"%s\"\n"
|
||||
"Choices: cte debug1 fp main orm rtree trigger\n",
|
||||
zTSet);
|
||||
}
|
||||
}else{
|
||||
fatal_error("unknown testset: \"%s\"\n"
|
||||
"Choices: cte debug1 fp main orm rtree trigger\n",
|
||||
zThisTest);
|
||||
}
|
||||
if( zTSet[0] ){
|
||||
char *zSql, *zObj;
|
||||
speedtest1_begin_test(999, "Reset the database");
|
||||
while( 1 ){
|
||||
zObj = speedtest1_once(
|
||||
"SELECT name FROM main.sqlite_master"
|
||||
" WHERE sql LIKE 'CREATE %%TABLE%%'");
|
||||
if( zObj==0 ) break;
|
||||
zSql = sqlite3_mprintf("DROP TABLE main.\"%w\"", zObj);
|
||||
speedtest1_exec(zSql);
|
||||
sqlite3_free(zSql);
|
||||
sqlite3_free(zObj);
|
||||
}
|
||||
while( 1 ){
|
||||
zObj = speedtest1_once(
|
||||
"SELECT name FROM temp.sqlite_master"
|
||||
" WHERE sql LIKE 'CREATE %%TABLE%%'");
|
||||
if( zObj==0 ) break;
|
||||
zSql = sqlite3_mprintf("DROP TABLE main.\"%w\"", zObj);
|
||||
speedtest1_exec(zSql);
|
||||
sqlite3_free(zSql);
|
||||
sqlite3_free(zObj);
|
||||
}
|
||||
speedtest1_end_test();
|
||||
}
|
||||
}while( zTSet[0] );
|
||||
speedtest1_final();
|
||||
|
||||
if( showStats ){
|
||||
|
@ -59,7 +59,7 @@ if {[wal_is_capable]} {
|
||||
PRAGMA journal_mode = delete;
|
||||
SELECT name, path, pageno, pagetype, ncell, payload, unused, mx_payload
|
||||
FROM stat;
|
||||
} {wal delete sqlite_master / 1 leaf 0 0 916 0}
|
||||
} {wal delete sqlite_schema / 1 leaf 0 0 916 0}
|
||||
}
|
||||
|
||||
do_test stat-1.0 {
|
||||
@ -85,9 +85,9 @@ do_test stat-1.2 {
|
||||
do_test stat-1.3 {
|
||||
execsql {
|
||||
SELECT name, path, pageno, pagetype, ncell, payload, unused, mx_payload
|
||||
FROM stat WHERE name = 'sqlite_master';
|
||||
FROM stat WHERE name = 'sqlite_schema';
|
||||
}
|
||||
} {sqlite_master / 1 leaf 2 77 831 40}
|
||||
} {sqlite_schema / 1 leaf 2 77 831 40}
|
||||
do_test stat-1.4 {
|
||||
execsql {
|
||||
DROP TABLE t1;
|
||||
@ -108,7 +108,7 @@ do_execsql_test stat-2.1 {
|
||||
INSERT INTO t3 SELECT a_string(110+rowid), a_string(221+rowid) FROM t3
|
||||
ORDER BY rowid;
|
||||
SELECT name, path, pageno, pagetype, ncell, payload, unused, mx_payload
|
||||
FROM stat WHERE name != 'sqlite_master' ORDER BY name;
|
||||
FROM stat WHERE name != 'sqlite_schema' ORDER BY name;
|
||||
} [list \
|
||||
sqlite_autoindex_t3_1 / 3 internal 3 368 623 125 \
|
||||
sqlite_autoindex_t3_1 /000/ 8 leaf 8 946 46 123 \
|
||||
@ -138,7 +138,7 @@ do_execsql_test stat-2.1agg {
|
||||
SELECT * FROM dbstat WHERE aggregate=TRUE ORDER BY name;
|
||||
} [list \
|
||||
sqlite_autoindex_t3_1 {} 5 {} 32 3898 1065 132 {} 5120 \
|
||||
sqlite_master {} 1 {} 2 84 824 49 {} 1024 \
|
||||
sqlite_schema {} 1 {} 2 84 824 49 {} 1024 \
|
||||
t3 {} 17 {} 47 11188 5815 370 {} 17408 \
|
||||
]
|
||||
|
||||
@ -158,7 +158,7 @@ do_execsql_test stat-3.1 {
|
||||
CREATE INDEX i4 ON t4(x);
|
||||
INSERT INTO t4(rowid, x) VALUES(2, a_string(7777));
|
||||
SELECT name, path, pageno, pagetype, ncell, payload, unused, mx_payload
|
||||
FROM stat WHERE name != 'sqlite_master' ORDER BY name;
|
||||
FROM stat WHERE name != 'sqlite_schema' ORDER BY name;
|
||||
} [list \
|
||||
i4 / 3 leaf 1 103 905 7782 \
|
||||
i4 /000+000000 4 overflow 0 1020 0 0 \
|
||||
@ -183,7 +183,7 @@ do_execsql_test stat-3.2 {
|
||||
SELECT *, '|' FROM dbstat WHERE aggregate=TRUE ORDER BY name;
|
||||
} [list \
|
||||
i4 {} 9 {} 1 7782 1386 7782 {} 9216 | \
|
||||
sqlite_master {} 1 {} 2 74 834 40 {} 1024 | \
|
||||
sqlite_schema {} 1 {} 2 74 834 40 {} 1024 | \
|
||||
t4 {} 8 {} 1 7780 367 7780 {} 8192 | \
|
||||
]
|
||||
|
||||
@ -221,11 +221,11 @@ do_execsql_test stat-5.1 {
|
||||
do_execsql_test stat-5.20 {
|
||||
SELECT name, quote(path), pageno, quote(pagetype), ncell, payload,
|
||||
unused, mx_payload, '|' FROM dbstat('main',1);
|
||||
} {sqlite_master NULL 1 NULL 1 34 878 34 | tx NULL 1 NULL 0 0 1016 0 |}
|
||||
} {sqlite_schema NULL 1 NULL 1 34 878 34 | tx NULL 1 NULL 0 0 1016 0 |}
|
||||
do_execsql_test stat-5.21 {
|
||||
SELECT name, quote(path), pageno, quote(pagetype), ncell, payload,
|
||||
unused, mx_payload, '|' FROM dbstat('aux1',1);
|
||||
} {sqlite_master NULL 1 NULL 1 34 878 34 | t1 NULL 3 NULL 2 3033 5 1517 |}
|
||||
} {sqlite_schema NULL 1 NULL 1 34 878 34 | t1 NULL 3 NULL 2 3033 5 1517 |}
|
||||
|
||||
|
||||
do_catchsql_test stat-6.1 {
|
||||
@ -247,27 +247,27 @@ do_execsql_test 7.1 {
|
||||
do_execsql_test 7.1.1 {
|
||||
SELECT * FROM dbstat('123');
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
do_execsql_test 7.1.2 {
|
||||
SELECT * FROM dbstat(123);
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
do_execsql_test 7.1.3 {
|
||||
CREATE VIRTUAL TABLE x2 USING dbstat('123');
|
||||
SELECT * FROM x2;
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
do_execsql_test 7.1.4 {
|
||||
CREATE VIRTUAL TABLE x3 USING dbstat(123);
|
||||
SELECT * FROM x3;
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ do_execsql_test 7.2 {
|
||||
do_execsql_test 7.2.1 {
|
||||
SELECT * FROM dbstat('123corp');
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
do_catchsql_test 7.2.2 {
|
||||
@ -290,7 +290,7 @@ do_execsql_test 7.2.3 {
|
||||
CREATE VIRTUAL TABLE x2 USING dbstat('123corp');
|
||||
SELECT * FROM x2;
|
||||
} {
|
||||
sqlite_master / 1 leaf 1 37 875 37 0 1024
|
||||
sqlite_schema / 1 leaf 1 37 875 37 0 1024
|
||||
x1 / 2 leaf 1 4 1008 4 1024 1024
|
||||
}
|
||||
do_catchsql_test 7.2.4 {
|
||||
|
@ -33,28 +33,28 @@ do_test tkt-3fe89-1.1 {
|
||||
INSERT INTO t1 VALUES(hex_to_utf16be('D800'));
|
||||
SELECT hex(x) FROM t1;
|
||||
}
|
||||
} {EFBFBD}
|
||||
} {EDA080}
|
||||
do_test tkt-3fe89-1.2 {
|
||||
db eval {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(hex_to_utf16le('00D8'));
|
||||
SELECT hex(x) FROM t1;
|
||||
}
|
||||
} {EFBFBD}
|
||||
} {EDA080}
|
||||
do_test tkt-3fe89-1.3 {
|
||||
db eval {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(hex_to_utf16be('DFFF'));
|
||||
SELECT hex(x) FROM t1;
|
||||
}
|
||||
} {EFBFBD}
|
||||
} {EDBFBF}
|
||||
do_test tkt-3fe89-1.4 {
|
||||
db eval {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(hex_to_utf16le('FFDF'));
|
||||
SELECT hex(x) FROM t1;
|
||||
}
|
||||
} {EFBFBD}
|
||||
} {EDBFBF}
|
||||
|
||||
|
||||
finish_test
|
||||
|
@ -41,7 +41,7 @@ static char *stress_thread_2(int iTid, void *pArg){
|
||||
Sqlite db = {0}; /* SQLite database connection */
|
||||
while( !timetostop(&err) ){
|
||||
opendb(&err, &db, "test.db", 0);
|
||||
sql_script(&err, &db, "SELECT * FROM sqlite_master;");
|
||||
sql_script(&err, &db, "SELECT * FROM sqlite_schema;");
|
||||
clear_error(&err, SQLITE_LOCKED);
|
||||
closedb(&err, &db);
|
||||
}
|
||||
@ -266,7 +266,7 @@ static char *stress2_workload19(int iTid, void *pArg){
|
||||
const char *zDb = (const char*)pArg;
|
||||
while( !timetostop(&err) ){
|
||||
opendb(&err, &db, zDb, 0);
|
||||
sql_script(&err, &db, "SELECT * FROM sqlite_master;");
|
||||
sql_script(&err, &db, "SELECT * FROM sqlite_schema;");
|
||||
clear_error(&err, SQLITE_LOCKED);
|
||||
closedb(&err, &db);
|
||||
}
|
||||
@ -362,7 +362,3 @@ static void stress2(int nMs){
|
||||
sqlite3_enable_shared_cache(0);
|
||||
print_and_free_err(&err);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -43,6 +43,7 @@ proc sqlite3_wal {args} {
|
||||
[lindex $args 0] eval { PRAGMA journal_mode = wal }
|
||||
[lindex $args 0] eval { PRAGMA synchronous = normal }
|
||||
[lindex $args 0] function blob blob
|
||||
db timeout 1000
|
||||
}
|
||||
|
||||
proc log_deleted {logfile} {
|
||||
|
198
test/walsetlk.test
Normal file
198
test/walsetlk.test
Normal file
@ -0,0 +1,198 @@
|
||||
# 2020 May 06
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
set testprefix walsetlk
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
db timeout 1000
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# 1.*: Test that nothing goes wrong if recovery is forced while opening
|
||||
# a write transaction or performing a checkpoint with blocking locks.
|
||||
#
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t1(x, y);
|
||||
PRAGMA journal_mode = wal;
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
INSERT INTO t1 VALUES(5, 6);
|
||||
INSERT INTO t1 VALUES(7, 8);
|
||||
} {wal}
|
||||
|
||||
sqlite3 db2 test.db
|
||||
db2 timeout 1000
|
||||
|
||||
do_execsql_test -db db2 1.1 {
|
||||
SELECT * FROM t1
|
||||
} {1 2 3 4 5 6 7 8}
|
||||
|
||||
set fd [open test.db-shm r+]
|
||||
puts $fd "blahblahblahblah"
|
||||
flush $fd
|
||||
|
||||
do_execsql_test 1.2 {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(9, 10);
|
||||
}
|
||||
|
||||
do_execsql_test -db db2 1.3 {
|
||||
SELECT * FROM t1
|
||||
} {1 2 3 4 5 6 7 8}
|
||||
|
||||
do_test 1.4 {
|
||||
list [catch {db2 eval { BEGIN EXCLUSIVE }} msg] $msg
|
||||
} {1 {database is locked}}
|
||||
|
||||
do_execsql_test 1.5 { COMMIT }
|
||||
do_execsql_test -db db2 1.6 {
|
||||
SELECT * FROM t1
|
||||
} {1 2 3 4 5 6 7 8 9 10}
|
||||
|
||||
puts $fd "blahblahblahblah"
|
||||
flush $fd
|
||||
|
||||
do_execsql_test -db db2 1.7 {
|
||||
PRAGMA wal_checkpoint = TRUNCATE
|
||||
} {0 0 0}
|
||||
|
||||
do_test 1.8 {
|
||||
file size test.db-wal
|
||||
} 0
|
||||
|
||||
close $fd
|
||||
db close
|
||||
db2 close
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
do_multiclient_test tn {
|
||||
do_test 2.$tn.1 {
|
||||
sql1 {
|
||||
PRAGMA journal_mode = wal;
|
||||
CREATE TABLE t1(s, v);
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
INSERT INTO t1 VALUES(3, 4);
|
||||
INSERT INTO t1 VALUES(5, 6);
|
||||
}
|
||||
code1 { db timeout 2000 }
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.2 {
|
||||
sql2 {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(7, 8);
|
||||
}
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.3 {
|
||||
set us [lindex [time { catch {db eval "BEGIN EXCLUSIVE"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
do_test 2.$tn.4 {
|
||||
sql2 { COMMIT }
|
||||
sql1 { SELECT * FROM t1 }
|
||||
} {1 2 3 4 5 6 7 8}
|
||||
|
||||
do_test 2.$tn.5 {
|
||||
sql2 {
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES(9, 10);
|
||||
}
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.6 {
|
||||
set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
do_test 2.$tn.7 {
|
||||
sql2 {
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
} {1 2 3 4 5 6 7 8 9 10}
|
||||
|
||||
do_test 2.$tn.8 {
|
||||
set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
do_test 2.$tn.9 {
|
||||
sql3 {
|
||||
INSERT INTO t1 VALUES(11, 12);
|
||||
}
|
||||
sql2 {
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
sql3 {
|
||||
INSERT INTO t1 VALUES(13, 14);
|
||||
}
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.10 {
|
||||
set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
do_test 2.$tn.11 {
|
||||
sql3 {
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
sql1 { INSERT INTO t1 VALUES(15, 16); }
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.12 {
|
||||
set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
do_test 2.$tn.13 {
|
||||
sql2 {
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
sql1 { INSERT INTO t1 VALUES(17, 18); }
|
||||
} {}
|
||||
|
||||
do_test 2.$tn.14 {
|
||||
set us [lindex [time { catch {db eval "PRAGMA wal_checkpoint=RESTART"} }] 0]
|
||||
expr $us>1000000 && $us<4000000
|
||||
} {1}
|
||||
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
sqlite3 db2 test.db
|
||||
db2 timeout 1000
|
||||
do_execsql_test 3.0 {
|
||||
PRAGMA journal_mode = wal;
|
||||
CREATE TABLE x1(x, y);
|
||||
BEGIN;
|
||||
INSERT INTO x1 VALUES(1, 2);
|
||||
} {wal}
|
||||
|
||||
do_test 3.1 {
|
||||
list [catch { db2 eval {BEGIN EXCLUSIVE} } msg] $msg
|
||||
} {1 {database is locked}}
|
||||
|
||||
finish_test
|
||||
|
@ -1496,8 +1496,8 @@ do_execsql_test where-25.0 {
|
||||
INSERT INTO t2 VALUES(3, 'three', 'iii');
|
||||
|
||||
PRAGMA writable_schema = 1;
|
||||
UPDATE sqlite_master SET rootpage = (
|
||||
SELECT rootpage FROM sqlite_master WHERE name = 'i2'
|
||||
UPDATE sqlite_schema SET rootpage = (
|
||||
SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
|
||||
) WHERE name = 'i1';
|
||||
}
|
||||
db close
|
||||
@ -1524,8 +1524,8 @@ do_execsql_test where-25.3 {
|
||||
INSERT INTO t2 VALUES(3, 'three', 'iii');
|
||||
|
||||
PRAGMA writable_schema = 1;
|
||||
UPDATE sqlite_master SET rootpage = (
|
||||
SELECT rootpage FROM sqlite_master WHERE name = 'i2'
|
||||
UPDATE sqlite_schema SET rootpage = (
|
||||
SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
|
||||
) WHERE name = 'i1';
|
||||
}
|
||||
db close
|
||||
|
@ -426,7 +426,7 @@ do_test where9-4.5 {
|
||||
AND (c=31031 OR d IS NULL)
|
||||
ORDER BY +a
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {92 93 97}}
|
||||
do_test where9-4.6 {
|
||||
count_steps {
|
||||
SELECT a FROM t1 NOT INDEXED
|
||||
@ -442,7 +442,7 @@ do_test where9-4.7 {
|
||||
AND (c=31031 OR d IS NULL)
|
||||
ORDER BY +a
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {92 93 97}}
|
||||
do_test where9-4.8 {
|
||||
catchsql {
|
||||
SELECT a FROM t1 INDEXED BY t1d
|
||||
@ -450,7 +450,7 @@ do_test where9-4.8 {
|
||||
AND (c=31031 OR d IS NULL)
|
||||
ORDER BY +a
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {92 93 97}}
|
||||
|
||||
# The (c=31031 OR d IS NULL) clause is preferred over b>1000 because
|
||||
# the former is an equality test which is expected to return fewer rows.
|
||||
@ -776,7 +776,7 @@ do_test where9-6.8.1 {
|
||||
OR (b NOT NULL AND c IS NULL AND d NOT NULL)
|
||||
OR (b NOT NULL AND c NOT NULL AND d IS NULL)
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test where9-6.8.2 {
|
||||
catchsql {
|
||||
UPDATE t1 INDEXED BY t1b SET a=a+100
|
||||
@ -784,7 +784,7 @@ do_test where9-6.8.2 {
|
||||
OR (b NOT NULL AND c IS NULL AND d NOT NULL)
|
||||
OR (b NOT NULL AND c NOT NULL AND d IS NULL)
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
|
||||
set solution_possible 0
|
||||
ifcapable stat4 {
|
||||
@ -818,7 +818,7 @@ if $solution_possible {
|
||||
OR (b NOT NULL AND c IS NULL AND d NOT NULL)
|
||||
OR (b NOT NULL AND c NOT NULL AND d IS NULL)
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
do_test where9-6.8.4 {
|
||||
catchsql {
|
||||
DELETE FROM t1 INDEXED BY t1b
|
||||
@ -826,7 +826,7 @@ if $solution_possible {
|
||||
OR (b NOT NULL AND c IS NULL AND d NOT NULL)
|
||||
OR (b NOT NULL AND c NOT NULL AND d IS NULL)
|
||||
}
|
||||
} {1 {no query solution}}
|
||||
} {0 {}}
|
||||
}
|
||||
############################################################################
|
||||
# Test cases where terms inside an OR series are combined with AND terms
|
||||
|
@ -317,4 +317,15 @@ do_execsql_test 9.10 {
|
||||
SELECT coalesce(max(quote(a)),10) FROM t1 GROUP BY a;
|
||||
} {NULL '' 'X'}
|
||||
|
||||
# 2020-06-14: assert() changed back into testcase()
|
||||
# ticket 9fb26d37cefaba40
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 10.1 {
|
||||
CREATE TABLE a(b TEXT); INSERT INTO a VALUES(0),(4),(9);
|
||||
CREATE TABLE c(d NUM);
|
||||
CREATE VIEW f(g, h) AS SELECT b, 0 FROM a UNION SELECT d, d FROM c;
|
||||
SELECT g = g FROM f GROUP BY h;
|
||||
} {1}
|
||||
|
||||
finish_test
|
||||
|
@ -24,7 +24,8 @@ do_test 1.0 {
|
||||
} win32
|
||||
|
||||
db close
|
||||
set path [file nativename [get_pwd]]
|
||||
set rawPath [get_pwd]
|
||||
set path [file nativename $rawPath]
|
||||
sqlite3 db [file join $path test.db] -vfs win32-longpath
|
||||
|
||||
do_test 1.1 {
|
||||
@ -45,16 +46,32 @@ do_test 1.2 {
|
||||
} {1 2 3 4}
|
||||
|
||||
set longPath(1) \\\\?\\$path\\[pid]
|
||||
set uriPath(1a) %5C%5C%3F%5C$path\\[pid]
|
||||
set uriPath(1b) %5C%5C%3F%5C$rawPath/[pid]
|
||||
|
||||
make_win32_dir $longPath(1)
|
||||
|
||||
set longPath(2) $longPath(1)\\[string repeat X 255]
|
||||
set uriPath(2a) $uriPath(1a)\\[string repeat X 255]
|
||||
set uriPath(2b) $uriPath(1b)/[string repeat X 255]
|
||||
|
||||
make_win32_dir $longPath(2)
|
||||
|
||||
set longPath(3) $longPath(2)\\[string repeat Y 255]
|
||||
set uriPath(3a) $uriPath(2a)\\[string repeat Y 255]
|
||||
set uriPath(3b) $uriPath(2b)/[string repeat Y 255]
|
||||
|
||||
make_win32_dir $longPath(3)
|
||||
|
||||
set fileName $longPath(3)\\test.db
|
||||
|
||||
set uri(1a) file:$uriPath(3a)\\test.db
|
||||
set uri(1b) file:$uriPath(3b)/test.db
|
||||
set uri(1c) file:///$uriPath(3a)\\test.db
|
||||
set uri(1d) file:///$uriPath(3b)/test.db
|
||||
set uri(1e) file://localhost/$uriPath(3a)\\test.db
|
||||
set uri(1f) file://localhost/$uriPath(3b)/test.db
|
||||
|
||||
do_test 1.3 {
|
||||
list [catch {sqlite3 db2 [string range $fileName 4 end]} msg] $msg
|
||||
} {1 {unable to open database file}}
|
||||
@ -100,6 +117,18 @@ do_test 1.6 {
|
||||
db3 close
|
||||
# puts " Database exists \{[exists_win32_path $fileName]\}"
|
||||
|
||||
foreach tn {1a 1b 1c 1d 1e 1f} {
|
||||
sqlite3 db3 $uri($tn) -vfs win32-longpath -uri 1 -translatefilename 0
|
||||
|
||||
do_test 1.7.$tn {
|
||||
db3 eval {
|
||||
SELECT x FROM t1 ORDER BY x;
|
||||
}
|
||||
} {5 6 7 8 9 10 11 12}
|
||||
|
||||
db3 close
|
||||
}
|
||||
|
||||
do_delete_win32_file $fileName
|
||||
# puts " Files remaining \{[find_win32_file $longPath(3)\\*]\}"
|
||||
|
||||
|
@ -1663,4 +1663,342 @@ do_catchsql_test 51.1 {
|
||||
sum(b) OVER(PARTITION BY min(DISTINCT c), c ORDER BY b)));
|
||||
} {1 {row value misused}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 52.1 {
|
||||
CREATE TABLE t1(a, b, c);
|
||||
INSERT INTO t1 VALUES('AA','bb',356);
|
||||
INSERT INTO t1 VALUES('CC','aa',158);
|
||||
INSERT INTO t1 VALUES('BB','aa',399);
|
||||
INSERT INTO t1 VALUES('FF','bb',938);
|
||||
}
|
||||
|
||||
do_execsql_test 52.2 {
|
||||
SELECT
|
||||
count() OVER win1,
|
||||
sum(c) OVER win2,
|
||||
first_value(c) OVER win2,
|
||||
count(a) OVER (ORDER BY b)
|
||||
FROM t1
|
||||
WINDOW
|
||||
win1 AS (ORDER BY a),
|
||||
win2 AS (PARTITION BY 6 ORDER BY a
|
||||
RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
|
||||
} {
|
||||
1 356 356 4
|
||||
2 399 399 2
|
||||
3 158 158 2
|
||||
4 938 938 4
|
||||
}
|
||||
|
||||
do_execsql_test 52.3 {
|
||||
SELECT
|
||||
count() OVER (),
|
||||
sum(c) OVER win2,
|
||||
first_value(c) OVER win2,
|
||||
count(a) OVER (ORDER BY b)
|
||||
FROM t1
|
||||
WINDOW
|
||||
win1 AS (ORDER BY a),
|
||||
win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
|
||||
RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
|
||||
} {
|
||||
4 356 356 4
|
||||
4 399 399 2
|
||||
4 158 158 2
|
||||
4 938 938 4
|
||||
}
|
||||
|
||||
do_execsql_test 52.4 {
|
||||
SELECT
|
||||
count() OVER win1,
|
||||
sum(c) OVER win2,
|
||||
first_value(c) OVER win2,
|
||||
count(a) OVER (ORDER BY b)
|
||||
FROM t1
|
||||
WINDOW
|
||||
win1 AS (ORDER BY a),
|
||||
win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
|
||||
RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
|
||||
} {
|
||||
1 356 356 4
|
||||
2 399 399 2
|
||||
3 158 158 2
|
||||
4 938 938 4
|
||||
}
|
||||
|
||||
# 2020-05-23
|
||||
# ticket 7a5279a25c57adf1
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 53.0 {
|
||||
CREATE TABLE a(c UNIQUE);
|
||||
INSERT INTO a VALUES(4),(0),(9),(-9);
|
||||
SELECT a.c
|
||||
FROM a
|
||||
JOIN a AS b ON a.c=4
|
||||
JOIN a AS e ON a.c=e.c
|
||||
WHERE a.c=(SELECT (SELECT coalesce(lead(2) OVER(),0) + sum(d.c))
|
||||
FROM a AS d
|
||||
WHERE a.c);
|
||||
} {4 4 4 4}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 54.1 {
|
||||
CREATE TABLE t1(a VARCHAR(20), b FLOAT);
|
||||
INSERT INTO t1 VALUES('1',10.0);
|
||||
}
|
||||
|
||||
do_catchsql_test 54.2 {
|
||||
SELECT * FROM (
|
||||
SELECT sum(b) OVER() AS c FROM t1
|
||||
UNION
|
||||
SELECT b AS c FROM t1
|
||||
) WHERE c>10;
|
||||
} {0 {}}
|
||||
|
||||
do_execsql_test 54.3 {
|
||||
INSERT INTO t1 VALUES('2',5.0);
|
||||
INSERT INTO t1 VALUES('3',15.0);
|
||||
}
|
||||
|
||||
do_catchsql_test 54.4 {
|
||||
SELECT * FROM (
|
||||
SELECT sum(b) OVER() AS c FROM t1
|
||||
UNION
|
||||
SELECT b AS c FROM t1
|
||||
) WHERE c>10;
|
||||
} {0 {15.0 30.0}}
|
||||
|
||||
# 2020-06-05 ticket c8d3b9f0a750a529
|
||||
reset_db
|
||||
do_execsql_test 55.1 {
|
||||
CREATE TABLE a(b);
|
||||
SELECT
|
||||
(SELECT b FROM a
|
||||
GROUP BY b
|
||||
HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b))
|
||||
)
|
||||
FROM a
|
||||
UNION
|
||||
SELECT 99
|
||||
ORDER BY 1;
|
||||
} {99}
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 56.1 {
|
||||
CREATE TABLE t1(a, b INTEGER);
|
||||
CREATE TABLE t2(c, d);
|
||||
}
|
||||
do_catchsql_test 56.2 {
|
||||
SELECT avg(b) FROM t1
|
||||
UNION ALL
|
||||
SELECT min(c) OVER () FROM t2
|
||||
ORDER BY nosuchcolumn;
|
||||
} {1 {1st ORDER BY term does not match any column in the result set}}
|
||||
|
||||
reset_db
|
||||
do_execsql_test 57.1 {
|
||||
CREATE TABLE t4(a, b, c, d, e);
|
||||
}
|
||||
|
||||
do_catchsql_test 57.2 {
|
||||
SELECT b FROM t4
|
||||
UNION
|
||||
SELECT a FROM t4
|
||||
ORDER BY (
|
||||
SELECT sum(x) OVER() FROM (
|
||||
SELECT c AS x FROM t4
|
||||
UNION
|
||||
SELECT d FROM t4
|
||||
ORDER BY (SELECT e FROM t4)
|
||||
)
|
||||
);
|
||||
} {1 {1st ORDER BY term does not match any column in the result set}}
|
||||
|
||||
# 2020-06-06 various dbsqlfuzz finds and
|
||||
# ticket 0899cf62f597d7e7
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 57.1 {
|
||||
CREATE TABLE t1(a, b, c);
|
||||
INSERT INTO t1 VALUES(NULL,NULL,NULL);
|
||||
SELECT
|
||||
sum(a),
|
||||
min(b) OVER (),
|
||||
count(c) OVER (ORDER BY b)
|
||||
FROM t1;
|
||||
} {{} {} 0}
|
||||
do_execsql_test 57.2 {
|
||||
CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ;
|
||||
INSERT INTO v0 VALUES ( 10 ) ;
|
||||
SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2;
|
||||
} {10 {}}
|
||||
do_catchsql_test 57.3 {
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1(a) VALUES(22);
|
||||
CREATE TABLE t3(y);
|
||||
INSERT INTO t3(y) VALUES(5),(11),(-9);
|
||||
SELECT (
|
||||
SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1)))
|
||||
)
|
||||
FROM t3;
|
||||
} {1 {misuse of aggregate: sum()}}
|
||||
|
||||
# 2020-06-06 ticket 1f6f353b684fc708
|
||||
reset_db
|
||||
do_execsql_test 58.1 {
|
||||
CREATE TABLE a(a, b, c);
|
||||
INSERT INTO a VALUES(1, 2, 3);
|
||||
INSERT INTO a VALUES(4, 5, 6);
|
||||
SELECT sum(345+b) OVER (ORDER BY b),
|
||||
sum(avg(678)) OVER (ORDER BY c) FROM a;
|
||||
} {347 678.0}
|
||||
|
||||
# 2020-06-06 ticket e5504e987e419fb0
|
||||
do_catchsql_test 59.1 {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(x INTEGER PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (123);
|
||||
SELECT
|
||||
ntile( (SELECT sum(x)) ) OVER(ORDER BY x),
|
||||
min(x) OVER(ORDER BY x)
|
||||
FROM t1;
|
||||
} {1 {misuse of aggregate: sum()}}
|
||||
|
||||
# 2020-06-07 ticket f7d890858f361402
|
||||
do_execsql_test 60.1 {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (x INTEGER PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (99);
|
||||
SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER());
|
||||
} {1}
|
||||
|
||||
# 2020-06-07 test case generated by dbsqlfuzz showing how an AggInfo
|
||||
# object might be referenced after the sqlite3Select() call that created
|
||||
# it returns. This proves the need to persist all AggInfo objects until
|
||||
# the Parse object is destroyed.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 61.1 {
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1 VALUES(5),(NULL),('seventeen');
|
||||
SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1);
|
||||
} {{} {} {}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 62.1 {
|
||||
CREATE TABLE t1(a VARCHAR(20), b FLOAT);
|
||||
INSERT INTO t1 VALUES('1',10.0);
|
||||
}
|
||||
|
||||
do_execsql_test 62.2 {
|
||||
SELECT * FROM (
|
||||
SELECT sum(b) OVER() AS c FROM t1
|
||||
UNION
|
||||
SELECT b AS c FROM t1
|
||||
) WHERE c>10;
|
||||
}
|
||||
|
||||
do_execsql_test 62.3 {
|
||||
INSERT INTO t1 VALUES('2',5.0);
|
||||
INSERT INTO t1 VALUES('3',15.0);
|
||||
}
|
||||
|
||||
do_execsql_test 62.4 {
|
||||
SELECT * FROM (
|
||||
SELECT sum(b) OVER() AS c FROM t1
|
||||
UNION
|
||||
SELECT b AS c FROM t1
|
||||
) WHERE c>10;
|
||||
} {15.0 30.0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 63.1 {
|
||||
CREATE TABLE t1(b, x);
|
||||
CREATE TABLE t2(c, d);
|
||||
CREATE TABLE t3(e, f);
|
||||
}
|
||||
|
||||
do_execsql_test 63.2 {
|
||||
SELECT max(b) OVER(
|
||||
ORDER BY SUM(
|
||||
(SELECT c FROM t2 UNION SELECT x ORDER BY c)
|
||||
)
|
||||
) FROM t1;
|
||||
} {{}}
|
||||
|
||||
do_execsql_test 63.3 {
|
||||
SELECT sum(b) over(
|
||||
ORDER BY (
|
||||
SELECT max(b) OVER(
|
||||
ORDER BY sum(
|
||||
(SELECT x AS c UNION SELECT 1234 ORDER BY c)
|
||||
)
|
||||
) AS e
|
||||
ORDER BY e
|
||||
)
|
||||
)
|
||||
FROM t1;
|
||||
} {{}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 64.1 {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
|
||||
INSERT INTO t1 VALUES(1, 'abcd');
|
||||
INSERT INTO t1 VALUES(2, 'BCDE');
|
||||
INSERT INTO t1 VALUES(3, 'cdef');
|
||||
INSERT INTO t1 VALUES(4, 'DEFG');
|
||||
}
|
||||
|
||||
do_execsql_test 64.2 {
|
||||
SELECT rowid, max(b COLLATE nocase)||''
|
||||
FROM t1
|
||||
GROUP BY rowid
|
||||
ORDER BY max(b COLLATE nocase)||'';
|
||||
} {1 abcd 2 BCDE 3 cdef 4 DEFG}
|
||||
|
||||
do_execsql_test 64.3 {
|
||||
SELECT count() OVER (), rowid, max(b COLLATE nocase)||''
|
||||
FROM t1
|
||||
GROUP BY rowid
|
||||
ORDER BY max(b COLLATE nocase)||'';
|
||||
} {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
|
||||
|
||||
do_execsql_test 64.4 {
|
||||
SELECT count() OVER (), rowid, max(b COLLATE nocase)
|
||||
FROM t1
|
||||
GROUP BY rowid
|
||||
ORDER BY max(b COLLATE nocase);
|
||||
} {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 65.1 {
|
||||
CREATE TABLE t1(c1);
|
||||
INSERT INTO t1 VALUES('abcd');
|
||||
}
|
||||
do_execsql_test 65.2 {
|
||||
SELECT max(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
|
||||
} {1}
|
||||
|
||||
do_execsql_test 65.3 {
|
||||
SELECT
|
||||
count() OVER (),
|
||||
group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
|
||||
} {1 1}
|
||||
|
||||
do_execsql_test 65.4 {
|
||||
SELECT COUNT() OVER () LIKE lead(102030) OVER(
|
||||
ORDER BY sum('abcdef' COLLATE nocase) IN (SELECT 54321)
|
||||
)
|
||||
FROM t1;
|
||||
} {{}}
|
||||
|
||||
finish_test
|
||||
|
@ -255,7 +255,7 @@ do_execsql_test 8.2 {
|
||||
|
||||
do_catchsql_test 8.3 {
|
||||
SELECT min( max((SELECT x FROM v1)) ) OVER()
|
||||
} {1 {misuse of aggregate: max()}}
|
||||
} {0 0}
|
||||
|
||||
do_execsql_test 8.4 {
|
||||
SELECT(
|
||||
@ -263,6 +263,6 @@ do_execsql_test 8.4 {
|
||||
SELECT sum( avg((SELECT x FROM v1)) ) OVER()
|
||||
)
|
||||
FROM v1;
|
||||
} {0.0}
|
||||
} {0.0 0.0}
|
||||
|
||||
finish_test
|
||||
|
@ -921,6 +921,7 @@ ifcapable altertable {
|
||||
execsql {
|
||||
CREATE TABLE t1(a PRIMARY KEY) WITHOUT rowid;
|
||||
CREATE TABLE t2(a, b);
|
||||
INSERT INTO t2(a,b) VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
@ -941,7 +942,7 @@ ifcapable altertable {
|
||||
PRAGMA foreign_keys = off;
|
||||
ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
|
||||
PRAGMA foreign_keys = on;
|
||||
SELECT sql FROM sqlite_master WHERE name='t2';
|
||||
SELECT sql FROM sqlite_schema WHERE name='t2';
|
||||
}
|
||||
} {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
|
||||
|
||||
@ -975,7 +976,7 @@ ifcapable altertable {
|
||||
WITHOUT rowid;
|
||||
CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
|
||||
}
|
||||
execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
|
||||
@ -984,7 +985,7 @@ ifcapable altertable {
|
||||
]
|
||||
do_test without_rowid3-14.2.2.2 {
|
||||
execsql { ALTER TABLE t1 RENAME TO t4 }
|
||||
execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
|
||||
@ -1015,6 +1016,7 @@ ifcapable altertable {
|
||||
execsql {
|
||||
CREATE TEMP TABLE t1(a PRIMARY KEY) WITHOUT rowid;
|
||||
CREATE TEMP TABLE t2(a, b);
|
||||
INSERT INTO temp.t2(a,b) VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
@ -1035,7 +1037,7 @@ ifcapable altertable {
|
||||
PRAGMA foreign_keys = off;
|
||||
ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
|
||||
PRAGMA foreign_keys = on;
|
||||
SELECT sql FROM temp.sqlite_master WHERE name='t2';
|
||||
SELECT sql FROM temp.sqlite_schema WHERE name='t2';
|
||||
}
|
||||
} {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
|
||||
|
||||
@ -1061,7 +1063,7 @@ ifcapable altertable {
|
||||
WITHOUT rowid;
|
||||
CREATE TEMP TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
|
||||
}
|
||||
execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM sqlite_temp_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
|
||||
@ -1070,7 +1072,7 @@ ifcapable altertable {
|
||||
]
|
||||
do_test without_rowid3-14.2tmp.2.2 {
|
||||
execsql { ALTER TABLE t1 RENAME TO t4 }
|
||||
execsql { SELECT sql FROM temp.sqlite_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM temp.sqlite_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
|
||||
@ -1102,6 +1104,7 @@ ifcapable altertable {
|
||||
ATTACH ':memory:' AS aux;
|
||||
CREATE TABLE aux.t1(a PRIMARY KEY) WITHOUT rowid;
|
||||
CREATE TABLE aux.t2(a, b);
|
||||
INSERT INTO aux.t2(a,b) VALUES(1,2);
|
||||
}
|
||||
catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
|
||||
} {0 {}}
|
||||
@ -1122,7 +1125,7 @@ ifcapable altertable {
|
||||
PRAGMA foreign_keys = off;
|
||||
ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
|
||||
PRAGMA foreign_keys = on;
|
||||
SELECT sql FROM aux.sqlite_master WHERE name='t2';
|
||||
SELECT sql FROM aux.sqlite_schema WHERE name='t2';
|
||||
}
|
||||
} {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
|
||||
|
||||
@ -1148,7 +1151,7 @@ ifcapable altertable {
|
||||
WITHOUT rowid;
|
||||
CREATE TABLE aux.t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
|
||||
}
|
||||
execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
|
||||
@ -1157,7 +1160,7 @@ ifcapable altertable {
|
||||
]
|
||||
do_test without_rowid3-14.2aux.2.2 {
|
||||
execsql { ALTER TABLE t1 RENAME TO t4 }
|
||||
execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'}
|
||||
execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'}
|
||||
} [list \
|
||||
{CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
|
||||
{CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
|
||||
|
Reference in New Issue
Block a user