aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authordrh <>2025-01-02 15:03:13 +0000
committerdrh <>2025-01-02 15:03:13 +0000
commita683b055fbecd8a9e78602003bad558eb1a61420 (patch)
tree6c39531cb0dba051dfe3d9be71df5f193323070c /test
parente0b6ee51859720138fcaafd042eb605a2ecdeeb4 (diff)
downloadsqlite-a683b055fbecd8a9e78602003bad558eb1a61420.tar.gz
sqlite-a683b055fbecd8a9e78602003bad558eb1a61420.zip
Improvements to the way that truncation is implemented in sqlite_dbpage().
FossilOrigin-Name: ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056
Diffstat (limited to 'test')
-rw-r--r--test/dbpage.test92
-rw-r--r--test/dbpagefault.test26
2 files changed, 118 insertions, 0 deletions
diff --git a/test/dbpage.test b/test/dbpage.test
index 0646a70b0..2c0725307 100644
--- a/test/dbpage.test
+++ b/test/dbpage.test
@@ -108,4 +108,96 @@ do_execsql_test 300 {
SELECT * FROM sqlite_temp_schema, sqlite_dbpage;
} {}
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 400 {
+ ATTACH ':memory:' AS aux1;
+ BEGIN;
+ CREATE VIRTUAL TABLE aux1.t1 USING sqlite_dbpage;
+ INSERT INTO t1 VALUES(17, NULL);
+ COMMIT;
+}
+
+#-------------------------------------------------------------------------
+reset_db
+forcedelete test.db2
+sqlite3 db2 test.db2
+db2 eval {
+ CREATE TABLE t1(x, y);
+}
+
+do_execsql_test 500 {
+ CREATE TABLE x1(a);
+ INSERT INTO x1 VALUES( hex(randomblob(2000)) );
+ INSERT INTO x1 VALUES( hex(randomblob(2000)) );
+ INSERT INTO x1 VALUES( hex(randomblob(2000)) );
+ INSERT INTO x1 VALUES( hex(randomblob(2000)) );
+ PRAGMA page_count;
+} {18}
+
+do_test 510 {
+ db eval BEGIN
+ db2 eval { PRAGMA page_count } {
+ db eval {
+ INSERT INTO sqlite_dbpage values($page_count, NULL);
+ }
+ }
+ db2 eval { SELECT pgno, data FROM sqlite_dbpage } {
+ db eval {
+ INSERT INTO sqlite_dbpage values($pgno, $data);
+ }
+ }
+
+ db eval COMMIT
+} {}
+
+db close
+sqlite3 db test.db
+
+do_execsql_test 520 {
+ PRAGMA page_count;
+ SELECT * FROM t1;
+} {2}
+
+#-------------------------------------------------------------------------
+reset_db
+forcedelete test.db2
+do_execsql_test 610 {
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE t1(x);
+ CREATE TABLE t2(y);
+ INSERT INTO t1 VALUES(1234);
+ CREATE TABLE aux.x1(z);
+}
+
+set pgno [db one {SELECT max(rootpage) FROM sqlite_schema}]
+sqlite3 db2 test.db2
+db2 eval {
+ BEGIN;
+ SELECT * FROM x1;
+}
+
+do_catchsql_test 620 {
+ UPDATE sqlite_dbpage SET data = (
+ SELECT data FROM sqlite_dbpage WHERE pgno=$pgno-1
+ ) WHERE pgno = $pgno;
+} {1 {database is locked}}
+
+db2 eval {
+ COMMIT;
+}
+
+do_catchsql_test 630 {
+ UPDATE sqlite_dbpage SET data = (
+ SELECT data FROM sqlite_dbpage WHERE pgno=$pgno-1
+ ) WHERE pgno = $pgno;
+} {0 {}}
+
+db close
+sqlite3 db test.db
+
+do_execsql_test 640 {
+ SELECT * FROM t2;
+} {1234}
+
finish_test
diff --git a/test/dbpagefault.test b/test/dbpagefault.test
index f27741cba..e5b246fc9 100644
--- a/test/dbpagefault.test
+++ b/test/dbpagefault.test
@@ -82,5 +82,31 @@ do_catchsql_test 3.2 {
# faultsim_test_result {0 {}}
#}
+reset_db
+forcedelete test.db2
+do_execsql_test 4.0 {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES('one');
+ CREATE TABLE t2(x);
+ INSERT INTO t2 VALUES('two');
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE aux.x1(x);
+}
+
+set pgno [db one {SELECT max(rootpage) FROM sqlite_schema}]
+
+faultsim_save_and_close
+do_faultsim_test 4 -prep {
+ faultsim_restore_and_reopen
+ execsql { ATTACH 'test.db2' AS aux; }
+} -body {
+ execsql {
+ UPDATE sqlite_dbpage SET data = (
+ SELECT data FROM sqlite_dbpage WHERE pgno=($pgno-1)
+ ) WHERE pgno = $pgno;
+ }
+} -test {
+ faultsim_test_result {0 {}} {1 {unable to open a temporary database file for storing temporary tables}}
+}
finish_test