From f406481849b7acf289257fce40153e0c72cbf9aa Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:56:06 +0900 Subject: [PATCH 1/6] Explain why it fails --- core/storage/sqlite3_ondisk.rs | 2 ++ database.db | Bin 0 -> 8192 bytes 2 files changed, 2 insertions(+) create mode 100644 database.db diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index e03e29729..d085128d4 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -495,6 +495,7 @@ fn finish_read_page( pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result<()> { let page_source = &pager.page_io; let page_finish = page.clone(); + // page.borrow() returns RefCell which remains active for the entire begin_write_btree_page function let page = page.borrow(); let contents = page.contents.read().unwrap(); @@ -505,6 +506,7 @@ pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result Box::new(move |bytes_written: i32| { let buf_copy = buf_copy.clone(); let buf_len = buf_copy.borrow().len(); + // requires a mutable borrow of the page_finish's RefCell page_finish.borrow_mut().clear_dirty(); if bytes_written < buf_len as i32 { log::error!("wrote({bytes_written}) less than expected({buf_len})"); diff --git a/database.db b/database.db new file mode 100644 index 0000000000000000000000000000000000000000..51f2d758f1c9cf49ae717efca7e4bc502cc793c6 GIT binary patch literal 8192 zcmeI#u?oU45C-78R@@}w(!u3M1#$5O)RI9ELCxUWVidtvY3u8`=tKArK7?t}NkQBk z{+}er9T~#6WjUYj3M-pKmPCaNs7cH;6d@vZ+jIMsvah`wSIhoenEK(R;cl@ylUoP` zAOHafKmY;|fB*y_009U<00KV?47nZz0Y^m?@9inKSzaApxX>e`#f-*NE!9XmyR}Sa zrdPFTlvpu(WxD0x+*empcXe|GfdB*`009U<00Izz00bZa0SG|gPX$`OUvEF(#z&jR NHruwm4>NwBJpjV&Dc1l1 literal 0 HcmV?d00001 From 78817d38044acf500d4ed3ba9510406c7763b75a Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Fri, 16 Aug 2024 20:03:03 +0900 Subject: [PATCH 2/6] Fix insert error --- core/storage/sqlite3_ondisk.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index d085128d4..6bd0333f3 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -495,18 +495,21 @@ fn finish_read_page( pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result<()> { let page_source = &pager.page_io; let page_finish = page.clone(); - // page.borrow() returns RefCell which remains active for the entire begin_write_btree_page function - let page = page.borrow(); - let contents = page.contents.read().unwrap(); - let contents = contents.as_ref().unwrap(); - let buffer = contents.buffer.clone(); + let page_id = page.borrow().id; + let buffer = { + let page = page.borrow(); + let contents = page.contents.read().unwrap(); + let contents = contents.as_ref().unwrap(); + contents.buffer.clone() + }; + let write_complete = { let buf_copy = buffer.clone(); Box::new(move |bytes_written: i32| { let buf_copy = buf_copy.clone(); let buf_len = buf_copy.borrow().len(); - // requires a mutable borrow of the page_finish's RefCell + page_finish.borrow_mut().clear_dirty(); if bytes_written < buf_len as i32 { log::error!("wrote({bytes_written}) less than expected({buf_len})"); @@ -514,7 +517,7 @@ pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result }) }; let c = Rc::new(Completion::Write(WriteCompletion::new(write_complete))); - page_source.write_page(page.id, buffer.clone(), c)?; + page_source.write_page(page_id, buffer.clone(), c)?; Ok(()) } From c6402aa341f5ebc8f55b33208497d13cdcb51368 Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Sat, 17 Aug 2024 21:56:35 +0900 Subject: [PATCH 3/6] Add tcl --- testing/all.test | 14 ++++++++------ testing/insert.test | 17 +++++++++++++++++ testing/tester.tcl | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100755 testing/insert.test diff --git a/testing/all.test b/testing/all.test index 67d07870a..72da94c65 100755 --- a/testing/all.test +++ b/testing/all.test @@ -6,10 +6,12 @@ source $testdir/cmdlineshell.test source $testdir/agg-functions.test source $testdir/coalesce.test source $testdir/join.test -source $testdir/pragma.test -source $testdir/select.test -source $testdir/where.test -source $testdir/like.test -source $testdir/scalar-functions.test -source $testdir/orderby.test +source $testdir/insert.test +source $testdir/join.test source $testdir/json.test +source $testdir/like.test +source $testdir/orderby.test +source $testdir/pragma.test +source $testdir/scalar-functions.test +source $testdir/select.test +source $testdir/where.test \ No newline at end of file diff --git a/testing/insert.test b/testing/insert.test new file mode 100755 index 000000000..5a4967e83 --- /dev/null +++ b/testing/insert.test @@ -0,0 +1,17 @@ +#!/usr/bin/env tclsh + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_execsql_check_err_msg insert-1.1 { + INSERT INTO test1 VALUES(1,2,3); +} {Error: in prepare, no such table: test1} + +do_execsql_with_cleanup_test insert-1.2 { + CREATE TABLE test1(one int, two int, three int); + INSERT INTO test1 VALUES(1, 2, 3); + SELECT * FROM test1; +} {1|2|3} { + DROP TABLE IF EXISTS test1; +} + diff --git a/testing/tester.tcl b/testing/tester.tcl index 5a9eaab30..d8a715c8f 100644 --- a/testing/tester.tcl +++ b/testing/tester.tcl @@ -16,9 +16,45 @@ proc run_test {sqlite_exec sql expected_output} { } } +proc run_failing_test {sqlite_exec sql expected_err_msg} { + set actual_output [catch {set actual_output [evaluate_sql $sqlite_exec $sql]} err_msg] + if {$err_msg ne $expected_err_msg} { + puts "Test FAILED: '$sql'" + puts "returned '$err_msg'" + puts "expected '$expected_err_msg'" + exit 1 + } +} + +proc run_test_with_cleanup {sqlite_exec sql expected_output cleanup_sql} { + set actual_output [evaluate_sql $sqlite_exec $sql] + if {$actual_output ne $expected_output} { + puts "Test FAILED: '$sql'" + puts "returned '$actual_output'" + puts "expected '$expected_output'" + evaluate_sql $sqlite_exec $cleanup_sql + exit 1 + } + evaluate_sql $sqlite_exec $cleanup_sql +} + proc do_execsql_test {test_name sql_statements expected_outputs} { puts "Running test: $test_name" set combined_sql [string trim $sql_statements] set combined_expected_output [join $expected_outputs "\n"] run_test $::sqlite_exec $combined_sql $combined_expected_output } + +proc do_execsql_check_err_msg {test_name sql_statements expected_err_msg} { + puts "Running test: $test_name" + set combined_sql [string trim $sql_statements] + run_failing_test $::sqlite_exec $combined_sql $expected_err_msg +} + +proc do_execsql_with_cleanup_test {test_name sql_statements expected_outputs cleanup_statements} { + puts "Running test: $test_name" + set combined_sql [string trim $sql_statements] + set combined_expected_output [join $expected_outputs "\n"] + set combined_cleanup [string trim $cleanup_statements] + run_test_with_cleanup $::sqlite_exec $combined_sql $combined_expected_output $combined_cleanup +} \ No newline at end of file From 98f32b6182538529d3324193ff2e2ad9b2e6c776 Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Sat, 17 Aug 2024 23:23:30 +0200 Subject: [PATCH 4/6] Remove database.db --- database.db | Bin 8192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 database.db diff --git a/database.db b/database.db deleted file mode 100644 index 51f2d758f1c9cf49ae717efca7e4bc502cc793c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeI#u?oU45C-78R@@}w(!u3M1#$5O)RI9ELCxUWVidtvY3u8`=tKArK7?t}NkQBk z{+}er9T~#6WjUYj3M-pKmPCaNs7cH;6d@vZ+jIMsvah`wSIhoenEK(R;cl@ylUoP` zAOHafKmY;|fB*y_009U<00KV?47nZz0Y^m?@9inKSzaApxX>e`#f-*NE!9XmyR}Sa zrdPFTlvpu(WxD0x+*empcXe|GfdB*`009U<00Izz00bZa0SG|gPX$`OUvEF(#z&jR NHruwm4>NwBJpjV&Dc1l1 From a95fcc0fc1bcae8befc7d36264d0398764c6d31b Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Sun, 18 Aug 2024 06:08:08 +0200 Subject: [PATCH 5/6] Fix test to check whether error message is included --- testing/tester.tcl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testing/tester.tcl b/testing/tester.tcl index d8a715c8f..de3d9683d 100644 --- a/testing/tester.tcl +++ b/testing/tester.tcl @@ -16,9 +16,9 @@ proc run_test {sqlite_exec sql expected_output} { } } -proc run_failing_test {sqlite_exec sql expected_err_msg} { +proc run_test_check_err_msg {sqlite_exec sql expected_err_msg} { set actual_output [catch {set actual_output [evaluate_sql $sqlite_exec $sql]} err_msg] - if {$err_msg ne $expected_err_msg} { + if {[string first $expected_err_msg $err_msg] == -1} { puts "Test FAILED: '$sql'" puts "returned '$err_msg'" puts "expected '$expected_err_msg'" @@ -48,7 +48,7 @@ proc do_execsql_test {test_name sql_statements expected_outputs} { proc do_execsql_check_err_msg {test_name sql_statements expected_err_msg} { puts "Running test: $test_name" set combined_sql [string trim $sql_statements] - run_failing_test $::sqlite_exec $combined_sql $expected_err_msg + run_test_check_err_msg $::sqlite_exec $combined_sql $expected_err_msg } proc do_execsql_with_cleanup_test {test_name sql_statements expected_outputs cleanup_statements} { From 9d878fda55bed71f7b73d3e8a39579ccb6eb13be Mon Sep 17 00:00:00 2001 From: Kim Seon Woo <69591622+seonwoo960000@users.noreply.github.com> Date: Sun, 18 Aug 2024 21:05:01 +0200 Subject: [PATCH 6/6] Remove failing test for now --- testing/insert.test | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/testing/insert.test b/testing/insert.test index 5a4967e83..46656928b 100755 --- a/testing/insert.test +++ b/testing/insert.test @@ -2,16 +2,3 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl - -do_execsql_check_err_msg insert-1.1 { - INSERT INTO test1 VALUES(1,2,3); -} {Error: in prepare, no such table: test1} - -do_execsql_with_cleanup_test insert-1.2 { - CREATE TABLE test1(one int, two int, three int); - INSERT INTO test1 VALUES(1, 2, 3); - SELECT * FROM test1; -} {1|2|3} { - DROP TABLE IF EXISTS test1; -} -