diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index c8e4ea2307..b6abeeb9f0 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1998,8 +1998,12 @@ static int SplitNode( goto splitnode_out; } - /* Ensure both child nodes have node numbers assigned to them. */ - if( (0==pRight->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pRight))) + /* Ensure both child nodes have node numbers assigned to them by calling + ** nodeWrite(). Node pRight always needs a node number, as it was created + ** by nodeNew() above. But node pLeft sometimes already has a node number. + ** In this case avoid the all to nodeWrite(). + */ + if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight)) || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft))) ){ goto splitnode_out; @@ -2064,14 +2068,19 @@ splitnode_out: static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ int rc = SQLITE_OK; if( pLeaf->iNode!=1 && pLeaf->pParent==0 ){ + int rc2; /* sqlite3_reset() return code */ sqlite3_bind_int64(pRtree->pReadParent, 1, pLeaf->iNode); - if( sqlite3_step(pRtree->pReadParent)==SQLITE_ROW ){ + rc = sqlite3_step(pRtree->pReadParent); + if( rc==SQLITE_ROW ){ i64 iNode = sqlite3_column_int64(pRtree->pReadParent, 0); rc = nodeAcquire(pRtree, iNode, 0, &pLeaf->pParent); - }else{ - rc = SQLITE_ERROR; + }else if( rc==SQLITE_DONE ){ + rc = SQLITE_CORRUPT; + } + rc2 = sqlite3_reset(pRtree->pReadParent); + if( rc==SQLITE_OK ){ + rc = rc2; } - sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ){ rc = fixLeafParent(pRtree, pLeaf->pParent); } @@ -2881,12 +2890,10 @@ static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ ** function "rtreenode". */ int sqlite3RtreeInit(sqlite3 *db){ - int rc = SQLITE_OK; + const int utf8 = SQLITE_UTF8; + int rc; - if( rc==SQLITE_OK ){ - int utf8 = SQLITE_UTF8; - rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0); - } + rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0); if( rc==SQLITE_OK ){ int utf8 = SQLITE_UTF8; rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0); diff --git a/ext/rtree/rtree3.test b/ext/rtree/rtree3.test index 5076908f91..ac61829a65 100644 --- a/ext/rtree/rtree3.test +++ b/ext/rtree/rtree3.test @@ -33,8 +33,6 @@ if {!$MEMDEBUG} { return } -if 1 { - do_faultsim_test rtree3-1 -faults oom* -prep { faultsim_delete_and_reopen } -body { @@ -96,8 +94,6 @@ do_faultsim_test rtree3-3b -faults oom* -prep { db eval COMMIT } -} - do_test rtree3-4.prep { faultsim_delete_and_reopen execsql { @@ -112,12 +108,19 @@ do_test rtree3-4.prep { faultsim_save_and_close } {} -do_faultsim_test rtree3-4 -faults oom-transient -prep { +do_faultsim_test rtree3-4a -faults oom-transient -prep { faultsim_restore_and_reopen } -body { db eval { SELECT count(*) FROM rt } } -test { faultsim_test_result {0 1500} } +do_faultsim_test rtree3-4b -faults oom-transient -prep { + faultsim_restore_and_reopen +} -body { + db eval { DELETE FROM rt WHERE ii BETWEEN 880 AND 920 } +} -test { + faultsim_test_result {0 {}} +} finish_test diff --git a/ext/rtree/rtree8.test b/ext/rtree/rtree8.test index e48dc12df8..7e24dd456d 100644 --- a/ext/rtree/rtree8.test +++ b/ext/rtree/rtree8.test @@ -104,13 +104,24 @@ do_catchsql_test rtree8-2.1.5 { } {1 {database disk image is malformed}} do_execsql_test rtree8-2.1.6 { - DELETE FROM t1_node; - DELETE FROM t1_parent; - DELETE FROM t1_rowid; DROP TABLE t1; CREATE VIRTUAL TABLE t1 USING rtree_i32(id, x1, x2); } {} + +populate_t1 50 +do_execsql_test rtree8-2.2.1 { + DELETE FROM t1_parent +} {} +do_catchsql_test rtree8-2.2.2 { + DELETE FROM t1 WHERE id=25 +} {1 {database disk image is malformed}} +do_execsql_test rtree8-2.2.3 { + DROP TABLE t1; + CREATE VIRTUAL TABLE t1 USING rtree_i32(id, x1, x2); +} {} + + #------------------------------------------------------------------------- # Test that trying to use the MATCH operator with the r-tree module does # not confuse it. @@ -119,7 +130,7 @@ breakpoint populate_t1 10 do_catchsql_test rtree8-3.1 { SELECT * FROM t1 WHERE x1 MATCH '1234' -} {1 {}} +} {1 {unable to use function MATCH in the requested context}} finish_test diff --git a/manifest b/manifest index ed16861ae1..fb00e1bc8c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scases\sto\simprove\scoverage\sof\srtree\smodule.\sFixes\sassociated\swith\sthe\ssame. -D 2010-08-25T17:53:17 +C Further\stest\scoverage\simprovements\sfor\srtree.c. +D 2010-08-25T19:04:38 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 543f91f24cd7fee774ecc0a61c19704c0c3e78fd F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -78,16 +78,16 @@ F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9 F ext/icu/icu.c 850e9a36567bbcce6bd85a4b68243cad8e3c2de2 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/rtree.c 73a4df9b61bfdb39e29d9d8a9927d811bb0f3389 +F ext/rtree/rtree.c 586c8d6a72ff67060e3850d3a9ef86a85caf38dc F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e F ext/rtree/rtree1.test 51bb0cd0405970501e63258401ae5ad235a4f468 F ext/rtree/rtree2.test 47b90f549a59e667e9fb01338956ead6f66c8d9d -F ext/rtree/rtree3.test 5ffcb3f44fe925e7a2e6e1960f3d2bf628683db3 +F ext/rtree/rtree3.test d2a408858ef14a2bf50ec2e7031c35782243b94d F ext/rtree/rtree4.test 2adce44dc544f6eb570898c8d5270bdf6ca64bd8 F ext/rtree/rtree5.test 92508f5152a50110af6551fa5b769d1bbd7c4ef3 F ext/rtree/rtree6.test 903720aaab819764c3693aaac0affe8174104ac8 F ext/rtree/rtree7.test 6fd29fb8e13795c822f4ceeea92ab5d61c96976d -F ext/rtree/rtree8.test d226534180f063924ee9d5500d43aebaeba28c7e +F ext/rtree/rtree8.test 7ba5d3b6ce7bb75fcce41a0a2da8796b99b69b5b F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea F ext/rtree/tkt3363.test 2bf324f7908084a5f463de3109db9c6e607feb1b @@ -847,7 +847,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 40526d8390896ccb883c45afa70e7adb568d174f -R 34bbfc350aec51a2c8611327e89641b5 +P 865cec04e4d814f63fb71feb67de7f06f8d54035 +R c8194745b3bd7fb8c0dc3d8838dec5f9 U dan -Z ca03a4a4ecb8f93f6b9fcda928df5c52 +Z 5bf1b8b670d95aa442bbc4a1f760237b diff --git a/manifest.uuid b/manifest.uuid index 6c1567bfc0..d88f1840b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -865cec04e4d814f63fb71feb67de7f06f8d54035 \ No newline at end of file +05f6c1aebbe757dd3b54fd027057b9db7ae3a990 \ No newline at end of file