Merge updates from trunk.
FossilOrigin-Name: 4ab1ffd45d4c25368b9b393a3336068b747d8b22
This commit is contained in:
+15
-1
@@ -50,7 +50,7 @@ proc do_insert_tests {args} {
|
||||
uplevel do_select_tests $args
|
||||
}
|
||||
|
||||
# EVIDENCE-OF: R-55375-41353 -- syntax diagram insert-stmt
|
||||
# EVIDENCE-OF: R-21350-31508 -- syntax diagram insert-stmt
|
||||
#
|
||||
do_insert_tests e_insert-0 {
|
||||
1 "INSERT INTO a1 DEFAULT VALUES" {}
|
||||
@@ -123,6 +123,20 @@ do_insert_tests e_insert-0 {
|
||||
68 "INSERT OR IGNORE INTO a1 (b, a) SELECT c, b FROM a2" {}
|
||||
69 "REPLACE INTO a1 (b, a) SELECT c, b FROM a2" {}
|
||||
70 "REPLACE INTO main.a1 (b, a) SELECT c, b FROM a2" {}
|
||||
71 "INSERT INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
72 "INSERT INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
73 "INSERT OR ROLLBACK INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
74 "INSERT OR ROLLBACK INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
75 "INSERT OR ABORT INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
76 "INSERT OR ABORT INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
77 "INSERT OR REPLACE INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
78 "INSERT OR REPLACE INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
79 "INSERT OR FAIL INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
80 "INSERT OR FAIL INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
81 "INSERT OR FAIL INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
82 "INSERT OR IGNORE INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
83 "REPLACE INTO a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
84 "REPLACE INTO main.a1 (b, a) VALUES(1, 2),(3,4)" {}
|
||||
}
|
||||
|
||||
delete_all_data
|
||||
|
||||
@@ -382,4 +382,105 @@ do_catchsql_test 4.1.5 {
|
||||
INSERT INTO t4(content, lid) VALUES('hello world', 101)
|
||||
} {1 {SQL logic error or missing database}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test cases 5.*
|
||||
#
|
||||
# The following test cases are designed to detect a 32-bit overflow bug
|
||||
# that existed at one point.
|
||||
#
|
||||
proc build_multilingual_db_3 {db} {
|
||||
$db eval {
|
||||
CREATE VIRTUAL TABLE t5 USING fts4(languageid=lid);
|
||||
}
|
||||
set languages [list 0 1 2 [expr 1<<30]]
|
||||
|
||||
foreach lid $languages {
|
||||
execsql {
|
||||
INSERT INTO t5(docid, content, lid) VALUES(
|
||||
$lid, 'My language is ' || $lid, $lid
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
do_test 5.1.0 {
|
||||
reset_db
|
||||
build_multilingual_db_3 db
|
||||
} {}
|
||||
|
||||
do_execsql_test 5.1.1 {
|
||||
SELECT level FROM t5_segdir;
|
||||
} [list 0 1024 2048 [expr 1<<40]]
|
||||
|
||||
do_execsql_test 5.1.2 {SELECT docid FROM t5 WHERE t5 MATCH 'language'} 0
|
||||
foreach langid [list 0 1 2 [expr 1<<30]] {
|
||||
do_execsql_test 5.2.$langid {
|
||||
SELECT docid FROM t5 WHERE t5 MATCH 'language' AND lid = $langid
|
||||
} $langid
|
||||
}
|
||||
|
||||
set lid [expr 1<<30]
|
||||
do_execsql_test 5.3.1 {
|
||||
CREATE VIRTUAL TABLE t6 USING fts4(languageid=lid);
|
||||
INSERT INTO t6 VALUES('I belong to language 0!');
|
||||
}
|
||||
do_test 5.3.2 {
|
||||
for {set i 0} {$i < 20} {incr i} {
|
||||
execsql {
|
||||
INSERT INTO t6(content, lid) VALUES(
|
||||
'I (row '||$i||') belong to langauge N!', $lid
|
||||
);
|
||||
}
|
||||
}
|
||||
execsql { SELECT docid FROM t6 WHERE t6 MATCH 'belong' }
|
||||
} {1}
|
||||
|
||||
do_test 5.3.3 {
|
||||
execsql { SELECT docid FROM t6 WHERE t6 MATCH 'belong' AND lid=$lid}
|
||||
} {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21}
|
||||
|
||||
do_execsql_test 5.3.4 { INSERT INTO t6(t6) VALUES('optimize') } {}
|
||||
do_execsql_test 5.3.5 { SELECT docid FROM t6 WHERE t6 MATCH 'belong' } {1}
|
||||
do_execsql_test 5.3.6 {
|
||||
SELECT docid FROM t6 WHERE t6 MATCH 'belong' AND lid=$lid
|
||||
} {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21}
|
||||
|
||||
|
||||
set lid [expr 1<<30]
|
||||
foreach lid [list 4 [expr 1<<30]] {
|
||||
do_execsql_test 5.4.$lid.1 {
|
||||
DELETE FROM t6;
|
||||
SELECT count(*) FROM t6_segdir;
|
||||
SELECT count(*) FROM t6_segments;
|
||||
} {0 0}
|
||||
do_execsql_test 5.4.$lid.2 {
|
||||
INSERT INTO t6(content, lid) VALUES('zero zero zero', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('zero zero one', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('zero one zero', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('zero one one', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('one zero zero', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('one zero one', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('one one zero', $lid);
|
||||
INSERT INTO t6(content, lid) VALUES('one one one', $lid);
|
||||
|
||||
SELECT docid FROM t6 WHERE t6 MATCH '"zero zero"' AND lid=$lid;
|
||||
} {1 2 5}
|
||||
|
||||
do_execsql_test 5.4.$lid.3 {
|
||||
SELECT count(*) FROM t6_segdir;
|
||||
SELECT count(*) FROM t6_segments;
|
||||
} {8 0}
|
||||
|
||||
do_execsql_test 5.4.$lid.4 {
|
||||
INSERT INTO t6(t6) VALUES('optimize');
|
||||
SELECT docid FROM t6 WHERE t6 MATCH '"zero zero"' AND lid=$lid;
|
||||
} {1 2 5}
|
||||
|
||||
do_execsql_test 5.4.$lid.5 {
|
||||
SELECT count(*) FROM t6_segdir;
|
||||
SELECT count(*) FROM t6_segments;
|
||||
} {1 0}
|
||||
}
|
||||
|
||||
|
||||
finish_test
|
||||
|
||||
+1
-1
@@ -130,7 +130,7 @@ do_test ioerr2-5 {
|
||||
}
|
||||
} msg]
|
||||
list $rc $msg
|
||||
} {1 {callback requested query abort}}
|
||||
} {1 {abort due to ROLLBACK}}
|
||||
|
||||
if {$::tcl_platform(platform) == "unix"} {
|
||||
# Cause the call to xAccess used by [pragma temp_store_directory] to
|
||||
|
||||
@@ -896,6 +896,24 @@ do_test pager1.4.7.3 {
|
||||
delete_file test.db-journal
|
||||
file exists test.db-journal
|
||||
} {0}
|
||||
do_test pager1.4.8.1 {
|
||||
catch {file attributes test.db -permissions r--------}
|
||||
catch {file attributes test.db -readonly 1}
|
||||
sqlite3 db test.db
|
||||
db eval { SELECT * FROM t1 }
|
||||
sqlite3_db_readonly db main
|
||||
} {1}
|
||||
do_test pager1.4.8.2 {
|
||||
sqlite3_db_readonly db xyz
|
||||
} {-1}
|
||||
do_test pager1.4.8.3 {
|
||||
db close
|
||||
catch {file attributes test.db -readonly 0}
|
||||
catch {file attributes test.db -permissions rw-rw-rw-} msg
|
||||
sqlite3 db test.db
|
||||
db eval { SELECT * FROM t1 }
|
||||
sqlite3_db_readonly db main
|
||||
} {0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# The following tests deal with multi-file commits.
|
||||
|
||||
+1
-1
@@ -23339,7 +23339,7 @@ do_execsql_test where7-3.1 {
|
||||
OR t301.c8 = 1407424651264000)
|
||||
ORDER BY t302.c5 LIMIT 200;
|
||||
} {
|
||||
0 0 1 {SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) (~5 rows)}
|
||||
0 0 1 {SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) (~10 rows)}
|
||||
0 0 1 {SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
|
||||
0 1 0 {SEARCH TABLE t302 USING INDEX t302_c8_c3 (c8=? AND c3>?) (~2 rows)}
|
||||
0 0 0 {USE TEMP B-TREE FOR ORDER BY}
|
||||
|
||||
+24
-4
@@ -364,7 +364,7 @@ ifcapable explain {
|
||||
} {
|
||||
0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING INDEX t2d (d=?) (~2 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) (~5 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) (~10 rows)}
|
||||
}
|
||||
do_execsql_test where9-3.2 {
|
||||
EXPLAIN QUERY PLAN
|
||||
@@ -374,7 +374,7 @@ ifcapable explain {
|
||||
} {
|
||||
0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING INDEX t2d (d=?) (~2 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) (~5 rows)}
|
||||
0 1 1 {SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) (~10 rows)}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,8 +453,8 @@ ifcapable explain {
|
||||
do_execsql_test where9-5.1 {
|
||||
EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>1000 AND (c=31031 OR d IS NULL)
|
||||
} {
|
||||
0 0 0 {SEARCH TABLE t1 USING INDEX t1c (c=?) (~2 rows)}
|
||||
0 0 0 {SEARCH TABLE t1 USING INDEX t1d (d=?) (~2 rows)}
|
||||
0 0 0 {SEARCH TABLE t1 USING INDEX t1c (c=?) (~3 rows)}
|
||||
0 0 0 {SEARCH TABLE t1 USING INDEX t1d (d=?) (~3 rows)}
|
||||
}
|
||||
|
||||
# In contrast, b=1000 is preferred over any OR-clause.
|
||||
@@ -856,5 +856,25 @@ do_test where9-7.3.2 {
|
||||
}
|
||||
} {79 81}
|
||||
|
||||
# Fix for ticket [b7c8682cc17f32903f03a610bd0d35ffd3c1e6e4]
|
||||
# "Incorrect result from LEFT JOIN with OR in the WHERE clause"
|
||||
#
|
||||
do_test where9-8.1 {
|
||||
db eval {
|
||||
CREATE TABLE t81(a INTEGER PRIMARY KEY, b, c, d);
|
||||
CREATE TABLE t82(x INTEGER PRIMARY KEY, y);
|
||||
CREATE TABLE t83(p INTEGER PRIMARY KEY, q);
|
||||
|
||||
INSERT INTO t81 VALUES(2,3,4,5);
|
||||
INSERT INTO t81 VALUES(3,4,5,6);
|
||||
INSERT INTO t82 VALUES(2,4);
|
||||
INSERT INTO t83 VALUES(5,55);
|
||||
|
||||
SELECT *
|
||||
FROM t81 LEFT JOIN t82 ON y=b JOIN t83
|
||||
WHERE c==p OR d==p
|
||||
ORDER BY +a;
|
||||
}
|
||||
} {2 3 4 5 {} {} 5 55 3 4 5 6 2 4 5 55}
|
||||
|
||||
finish_test
|
||||
|
||||
Reference in New Issue
Block a user