From ddd3fe6fc4798c6a063018eece24385261e80418 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 12:31:37 +0000 Subject: [PATCH 01/14] Fix the test harness so that it builds without SQLITE_ENABLE_PREUPDATE_HOOK. Has been broken since [c006515ae6faff65]. FossilOrigin-Name: 4565f711291bae5daaff6dd2b7b2991b17e139a576b1b73bb1f81f08a4c1a13f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test1.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 959fb658c7..c1d90aab06 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sdocumentation.\s\sNo\scode\schanges. -D 2022-02-10T01:01:31.410 +C Fix\sthe\stest\sharness\sso\sthat\sit\sbuilds\swithout\sSQLITE_ENABLE_PREUPDATE_HOOK.\nHas\sbeen\sbroken\ssince\s[c006515ae6faff65]. +D 2022-02-10T12:31:37.892 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -562,7 +562,7 @@ F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a3 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 48f291e1a7e672a7204884d4c164a8ed3a522ff087c361ada2991f5d54e987f6 -F src/test1.c ac0e7eeea18230c9c315abedd5a91db7bea91743880d9371b60d3bf2b40c9796 +F src/test1.c ce2a866f6977d4016e5801ab58b21dc06459a4c304d95961a662645e7364361f F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eee6de1967609f0b590ee4dbec088c3e7b03b08753267ed2909c5b03d60a0e18 -R 8f64a3cecc6fb60a0d94c857cb63d5b6 +P e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad +R d61adca3b531e3867be427e74f9a778b U drh -Z 2035d73285acce911b104c752355bc0e +Z 34460101605bb1e673848aeae36b08e4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e58234b970..aae7271160 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad \ No newline at end of file +4565f711291bae5daaff6dd2b7b2991b17e139a576b1b73bb1f81f08a4c1a13f \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index bcf63db62a..05aa97539a 100644 --- a/src/test1.c +++ b/src/test1.c @@ -4009,6 +4009,7 @@ static int SQLITE_TCLAPI test_bind_value_from_preupdate( if( Tcl_GetIntFromObj(interp, objv[4], &bidx) ) return TCL_ERROR; db = sqlite3_db_handle(pStmt); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( z3[0]=='n' ){ sqlite3_preupdate_new(db, bidx, &pVal); }else if( z3[0]=='o' ){ @@ -4018,6 +4019,7 @@ static int SQLITE_TCLAPI test_bind_value_from_preupdate( return TCL_ERROR; } sqlite3_bind_value(pStmt, idx, pVal); +#endif return TCL_OK; } From 522608d3a2d6fc378c9db217480e947228adbf3c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 12:57:53 +0000 Subject: [PATCH 02/14] Faster implementation of the date(), time(), and datetime() functions. FossilOrigin-Name: fa1b393bdb66b985f6552190a8242ed878f91d653a03352f65aa8d750de3cec4 --- manifest | 12 ++++----- manifest.uuid | 2 +- src/date.c | 75 ++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index c1d90aab06..a69fef3bd2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\stest\sharness\sso\sthat\sit\sbuilds\swithout\sSQLITE_ENABLE_PREUPDATE_HOOK.\nHas\sbeen\sbroken\ssince\s[c006515ae6faff65]. -D 2022-02-10T12:31:37.892 +C Faster\simplementation\sof\sthe\sdate(),\stime(),\sand\sdatetime()\sfunctions. +D 2022-02-10T12:57:53.736 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2cce39df1a13e05b7633e6d21b651f21492471f991dd7b323a4ee4e7b7f0b7f1 -F src/date.c 41627dec396f3d33e2c317a065f9d59bb535982b2ea3a561c96e4d4cf1137b65 +F src/date.c c9275705b097fe875ad4d194ed20e0af115f6d50058038e03ac8f8e417ee06eb F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad -R d61adca3b531e3867be427e74f9a778b +P 4565f711291bae5daaff6dd2b7b2991b17e139a576b1b73bb1f81f08a4c1a13f +R 83b35984d6e76589cbc31defad98bf4a U drh -Z 34460101605bb1e673848aeae36b08e4 +Z f2060761086c3825d641957e607d18e2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index aae7271160..f9285f75ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4565f711291bae5daaff6dd2b7b2991b17e139a576b1b73bb1f81f08a4c1a13f \ No newline at end of file +fa1b393bdb66b985f6552190a8242ed878f91d653a03352f65aa8d750de3cec4 \ No newline at end of file diff --git a/src/date.c b/src/date.c index ef4442aad5..2001d50ab4 100644 --- a/src/date.c +++ b/src/date.c @@ -1002,11 +1002,38 @@ static void datetimeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int Y, s; + char zBuf[24]; computeYMD_HMS(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d", - x.Y, x.M, x.D, x.h, x.m, (int)(x.s)); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = ' '; + zBuf[12] = '0' + (x.h/10)%10; + zBuf[13] = '0' + (x.h)%10; + zBuf[14] = ':'; + zBuf[15] = '0' + (x.m/10)%10; + zBuf[16] = '0' + (x.m)%10; + zBuf[17] = ':'; + s = (int)x.s; + zBuf[18] = '0' + (s/10)%10; + zBuf[19] = '0' + (s)%10; + zBuf[20] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 20, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 19, SQLITE_TRANSIENT); + } } } @@ -1022,10 +1049,20 @@ static void timeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int s; + char zBuf[16]; computeHMS(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + zBuf[0] = '0' + (x.h/10)%10; + zBuf[1] = '0' + (x.h)%10; + zBuf[2] = ':'; + zBuf[3] = '0' + (x.m/10)%10; + zBuf[4] = '0' + (x.m)%10; + zBuf[5] = ':'; + s = (int)x.s; + zBuf[6] = '0' + (s/10)%10; + zBuf[7] = '0' + (s)%10; + zBuf[8] = 0; + sqlite3_result_text(context, zBuf, 8, SQLITE_TRANSIENT); } } @@ -1041,10 +1078,28 @@ static void dateFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - char zBuf[100]; + int Y; + char zBuf[16]; computeYMD(&x); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D); - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); + Y = x.Y; + if( Y<0 ) Y = -Y; + zBuf[1] = '0' + (Y/1000)%10; + zBuf[2] = '0' + (Y/100)%10; + zBuf[3] = '0' + (Y/10)%10; + zBuf[4] = '0' + (Y)%10; + zBuf[5] = '-'; + zBuf[6] = '0' + (x.M/10)%10; + zBuf[7] = '0' + (x.M)%10; + zBuf[8] = '-'; + zBuf[9] = '0' + (x.D/10)%10; + zBuf[10] = '0' + (x.D)%10; + zBuf[11] = 0; + if( x.Y<0 ){ + zBuf[0] = '-'; + sqlite3_result_text(context, zBuf, 11, SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(context, &zBuf[1], 10, SQLITE_TRANSIENT); + } } } From eadccaa9269560e567b4ae0440de6e24745e6142 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 15:40:40 +0000 Subject: [PATCH 03/14] Performance improve to the 'localtime' and 'utc' modifiers for date/time functions. FossilOrigin-Name: 85cb6014751a0572d28ebd839331d5d7a78de45c9e522adcd834a8a85746f32e --- manifest | 14 +++---- manifest.uuid | 2 +- src/date.c | 112 ++++++++++++++++++++++++------------------------- test/date.test | 14 +++---- 4 files changed, 71 insertions(+), 71 deletions(-) diff --git a/manifest b/manifest index a69fef3bd2..36eecc3606 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Faster\simplementation\sof\sthe\sdate(),\stime(),\sand\sdatetime()\sfunctions. -D 2022-02-10T12:57:53.736 +C Performance\simprove\sto\sthe\s'localtime'\sand\s'utc'\smodifiers\sfor\sdate/time\nfunctions. +D 2022-02-10T15:40:40.522 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2cce39df1a13e05b7633e6d21b651f21492471f991dd7b323a4ee4e7b7f0b7f1 -F src/date.c c9275705b097fe875ad4d194ed20e0af115f6d50058038e03ac8f8e417ee06eb +F src/date.c 9d865dac4a796035a8cfb027c7c8450bc7ec54f8b51ebedbc5b8369e032e1cb9 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d @@ -837,7 +837,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47 F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 +F test/date.test 7e1da08fca5492081605a2bf445370b06be6a95db1150f3133b70eb672b33cb3 F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1 F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5 F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4565f711291bae5daaff6dd2b7b2991b17e139a576b1b73bb1f81f08a4c1a13f -R 83b35984d6e76589cbc31defad98bf4a +P fa1b393bdb66b985f6552190a8242ed878f91d653a03352f65aa8d750de3cec4 +R 67dc667c505ca83a0a8211aab2594ab6 U drh -Z f2060761086c3825d641957e607d18e2 +Z f3fee6ce5a9f7a29390c33b813554b1e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f9285f75ac..6a69ddd7b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa1b393bdb66b985f6552190a8242ed878f91d653a03352f65aa8d750de3cec4 \ No newline at end of file +85cb6014751a0572d28ebd839331d5d7a78de45c9e522adcd834a8a85746f32e \ No newline at end of file diff --git a/src/date.c b/src/date.c index 2001d50ab4..3225a5528d 100644 --- a/src/date.c +++ b/src/date.c @@ -544,67 +544,56 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #ifndef SQLITE_OMIT_LOCALTIME /* -** Compute the difference (in milliseconds) between localtime and UTC -** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs, -** return this value and set *pRc to SQLITE_OK. -** -** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value -** is undefined in this case. +** Assuming the input DateTime is UTC, move it to its localtime equivalent. */ -static sqlite3_int64 localtimeOffset( - DateTime *p, /* Date at which to calculate offset */ - sqlite3_context *pCtx, /* Write error here if one occurs */ - int *pRc /* OUT: Error code. SQLITE_OK or ERROR */ +static int toLocaltime( + DateTime *p, /* Date at which to calculate offset */ + sqlite3_context *pCtx /* Write error here if one occurs */ ){ - DateTime x, y; time_t t; struct tm sLocal; + int iYearDiff; /* Initialize the contents of sLocal to avoid a compiler warning. */ memset(&sLocal, 0, sizeof(sLocal)); - x = *p; - computeYMD_HMS(&x); - if( x.Y<1971 || x.Y>=2038 ){ + computeJD(p); + if( p->iJD<21086676000*(i64)10000 /* 1970-01-01 */ + || p->iJD>21301414560*(i64)10000 /* 2038-01-18 */ + ){ /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only ** works for years between 1970 and 2037. For dates outside this range, ** SQLite attempts to map the year into an equivalent year within this ** range, do the calculation, then map the year back. */ - x.Y = 2000; - x.M = 1; - x.D = 1; - x.h = 0; - x.m = 0; - x.s = 0.0; - } else { - int s = (int)(x.s + 0.5); - x.s = s; + DateTime x = *p; + computeYMD_HMS(&x); + iYearDiff = (2000 + x.Y%4) - x.Y; + x.Y += iYearDiff; + x.validJD = 0; + computeJD(&x); + t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); + }else{ + iYearDiff = 0; + t = (time_t)(p->iJD/1000 - 21086676*(i64)10000); } - x.tz = 0; - x.validJD = 0; - computeJD(&x); - t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); if( osLocaltime(&t, &sLocal) ){ sqlite3_result_error(pCtx, "local time unavailable", -1); - *pRc = SQLITE_ERROR; - return 0; + return SQLITE_ERROR; } - y.Y = sLocal.tm_year + 1900; - y.M = sLocal.tm_mon + 1; - y.D = sLocal.tm_mday; - y.h = sLocal.tm_hour; - y.m = sLocal.tm_min; - y.s = sLocal.tm_sec; - y.validYMD = 1; - y.validHMS = 1; - y.validJD = 0; - y.rawS = 0; - y.validTZ = 0; - y.isError = 0; - computeJD(&y); - *pRc = SQLITE_OK; - return y.iJD - x.iJD; + p->Y = sLocal.tm_year + 1900 - iYearDiff; + p->M = sLocal.tm_mon + 1; + p->D = sLocal.tm_mday; + p->h = sLocal.tm_hour; + p->m = sLocal.tm_min; + p->s = sLocal.tm_sec; + p->validYMD = 1; + p->validHMS = 1; + p->validJD = 0; + p->rawS = 0; + p->validTZ = 0; + p->isError = 0; + return SQLITE_OK; } #endif /* SQLITE_OMIT_LOCALTIME */ @@ -713,9 +702,7 @@ static int parseModifier( ** show local time. */ if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ - computeJD(p); - p->iJD += localtimeOffset(p, pCtx, &rc); - clearYMD_HMS_TZ(p); + rc = toLocaltime(p, pCtx); } break; } @@ -741,18 +728,31 @@ static int parseModifier( #ifndef SQLITE_OMIT_LOCALTIME else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ if( p->tzSet==0 ){ - sqlite3_int64 c1; + i64 iOrigJD; /* Original localtime */ + i64 iGuess; /* Guess at the corresponding utc time */ + int cnt = 0; /* Safety to prevent infinite loop */ + int iErr; /* Guess is off by this much */ + computeJD(p); - c1 = localtimeOffset(p, pCtx, &rc); - if( rc==SQLITE_OK ){ - p->iJD -= c1; - clearYMD_HMS_TZ(p); - p->iJD += c1 - localtimeOffset(p, pCtx, &rc); - } + iGuess = iOrigJD = p->iJD; + iErr = 0; + do{ + DateTime new; + memset(&new, 0, sizeof(new)); + iGuess -= iErr; + new.iJD = iGuess; + new.validJD = 1; + rc = toLocaltime(&new, pCtx); + if( rc ) return rc; + computeJD(&new); + iErr = new.iJD - iOrigJD; + }while( iErr && cnt++<3 ); + memset(p, 0, sizeof(*p)); + p->iJD = iGuess; + p->validJD = 1; p->tzSet = 1; - }else{ - rc = SQLITE_OK; } + rc = SQLITE_OK; } #endif break; diff --git a/test/date.test b/test/date.test index f002334d17..2e5859ad29 100644 --- a/test/date.test +++ b/test/date.test @@ -332,9 +332,9 @@ if {$tzoffset_new==4} { } datetest 6.7.2 {datetime('2007-03-11 01:59:00','utc')} {2007-03-11 06:59:00} - datetest 6.8 {datetime('2000-04-02 02:00:00','utc')} {2000-04-02 06:00:00} - datetest 6.8.1 {datetime('2006-04-02 02:00:00','utc')} {2006-04-02 06:00:00} - datetest 6.8.2 {datetime('2007-03-11 02:00:00','utc')} {2007-03-11 06:00:00} + datetest 6.8 {datetime('2000-04-02 02:00:00','utc')} {2000-04-02 07:00:00} + datetest 6.8.1 {datetime('2006-04-02 02:00:00','utc')} {2006-04-02 07:00:00} + datetest 6.8.2 {datetime('2007-03-11 02:00:00','utc')} {2007-03-11 07:00:00} # The 'utc' modifier is a no-op if the LHS is known to already be in UTC datetest 6.9.1 {datetime('2015-12-23 12:00:00','utc')} {2015-12-23 17:00:00} @@ -353,10 +353,10 @@ if {$tzoffset_new==4} { {2039-01-01 07:00:00} datetest 6.13 {datetime('2000-07-01 12:00:00','localtime')} \ {2000-07-01 08:00:00} - datetest 6.14 {datetime('1969-07-01 12:00:00','localtime')} \ - {1969-07-01 07:00:00} - datetest 6.15 {datetime('2039-07-01 12:00:00','localtime')} \ - {2039-07-01 07:00:00} + datetest 6.14 {datetime('1969-11-01 12:00:00','localtime')} \ + {1969-11-01 07:00:00} + datetest 6.15 {datetime('2039-02-01 12:00:00','localtime')} \ + {2039-02-01 07:00:00} set sqlite_current_time \ [db eval {SELECT strftime('%s','2000-07-01 12:34:56')}] datetest 6.16 {datetime('now','localtime')} {2000-07-01 08:34:56} From d7e185ce5d6699e94db1f8431b38c809ac204a6c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 21:26:53 +0000 Subject: [PATCH 04/14] Enhance SQLITE_TESTCTRL_LOCALTIME_FAULT so that is able to install an alternative localtime() interface so that the localtime logic an be better tested. FossilOrigin-Name: 6e25cb0890e8cdc63c9a21e841844d066267fc32ad143527843f7c8d05612b53 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/date.c | 22 ++++++++++++++++++---- src/global.c | 1 + src/main.c | 20 +++++++++++++++++--- src/sqliteInt.h | 1 + src/test1.c | 2 +- 7 files changed, 49 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 36eecc3606..2843e573ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprove\sto\sthe\s'localtime'\sand\s'utc'\smodifiers\sfor\sdate/time\nfunctions. -D 2022-02-10T15:40:40.522 +C Enhance\sSQLITE_TESTCTRL_LOCALTIME_FAULT\sso\sthat\sis\sable\sto\sinstall\san\nalternative\slocaltime()\sinterface\sso\sthat\sthe\slocaltime\slogic\san\sbe\sbetter\ntested. +D 2022-02-10T21:26:53.735 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2cce39df1a13e05b7633e6d21b651f21492471f991dd7b323a4ee4e7b7f0b7f1 -F src/date.c 9d865dac4a796035a8cfb027c7c8450bc7ec54f8b51ebedbc5b8369e032e1cb9 +F src/date.c 4088c042680ecc5ea1b7d5bfa67b91e7d0f48e91de2d2c5244852250ae86a2cb F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d @@ -507,7 +507,7 @@ F src/expr.c b90a029105a93a93a0ed5e5f8c5eaed8f19043a3b62e4c4d235a4611d9ada178 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 06e4ac33031b02dde7130c12e79cddf4dc5cfa72b23d8e63a3c26878fc9c1d3c F src/func.c 5a0379450bd19ca5cb2d65327b0df6466a14fa0f06f9355329c3e0eec483519a -F src/global.c 1f56aead86e8a18c4415638f5e6c4d0a0550427f4b3f5d065ba5164cc09c22e8 +F src/global.c a3daa18a1696aadd94f18d37cbbdebf0bbdb827b8397a534f021cd56c15cd0f9 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -516,7 +516,7 @@ F src/insert.c 1eea44389de3768ac98588c1410171cd53e7c6ad1af74049983dcbac82093de0 F src/json.c 225b00422112ecd7094a555f3ace16b25d7d5894062b823269ed03899907c2a2 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c aa919a6a7884f8b34d7b791841b24d14b1b0ab43f45b3940f4851043b2855c0c -F src/main.c 2b6b0dbfeb14d4bb57e368604b0736b2aa42b51b00339d399b01d6b1fc9b4960 +F src/main.c 911a4d673782df8f53838f779291de9059f1d00adb506a3c2c758bbd6231a5d3 F src/malloc.c fec841aa0a0400a6f7d20706178a5d8e8219a6bf562b6fe712c17f6c26813266 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -557,12 +557,12 @@ F src/shell.c.in b800bf8e02d9b4fd97078b68ca4371048f7196fc63accaa99c3c5943f72c80a F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 -F src/sqliteInt.h b6619030ed13b2a8d49c0b5cb0525db1f727966b65ab1ec40b5f11102af7254d +F src/sqliteInt.h f8814239fb1f95056555e2d7fa475750e64681cac4221fb03610d1fde0b79d53 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 48f291e1a7e672a7204884d4c164a8ed3a522ff087c361ada2991f5d54e987f6 -F src/test1.c ce2a866f6977d4016e5801ab58b21dc06459a4c304d95961a662645e7364361f +F src/test1.c a5d93408dfc5d91f35af12a9c6e90562cc1713f435a8642c9dbd3ffdb4d39ad2 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa1b393bdb66b985f6552190a8242ed878f91d653a03352f65aa8d750de3cec4 -R 67dc667c505ca83a0a8211aab2594ab6 +P 85cb6014751a0572d28ebd839331d5d7a78de45c9e522adcd834a8a85746f32e +R 223a6ad4591810b91660311766f1accb U drh -Z f3fee6ce5a9f7a29390c33b813554b1e +Z aed68e242e6b8ba2c978ed50de469779 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6a69ddd7b7..2560a392e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85cb6014751a0572d28ebd839331d5d7a78de45c9e522adcd834a8a85746f32e \ No newline at end of file +6e25cb0890e8cdc63c9a21e841844d066267fc32ad143527843f7c8d05612b53 \ No newline at end of file diff --git a/src/date.c b/src/date.c index 3225a5528d..1306847f89 100644 --- a/src/date.c +++ b/src/date.c @@ -503,8 +503,10 @@ static void clearYMD_HMS_TZ(DateTime *p){ ** is available. This routine returns 0 on success and ** non-zero on any kind of error. ** -** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this -** routine will always fail. +** If the sqlite3GlobalConfig.bLocaltimeFault variable is non-zero then this +** routine will always fail. If bLocaltimeFault is nonzero and +** sqlite3GlobalConfig.xAltLocaltime is not NULL, then xAltLocaltime() is +** invoked in place of the OS-defined localtime() function. ** ** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C ** library function localtime_r() is used to assist in the calculation of @@ -520,7 +522,13 @@ static int osLocaltime(time_t *t, struct tm *pTm){ sqlite3_mutex_enter(mutex); pX = localtime(t); #ifndef SQLITE_UNTESTABLE - if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ + return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); + }else{ + pX = 0; + } + } #endif if( pX ) *pTm = *pX; #if SQLITE_THREADSAFE>0 @@ -529,7 +537,13 @@ static int osLocaltime(time_t *t, struct tm *pTm){ rc = pX==0; #else #ifndef SQLITE_UNTESTABLE - if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; + if( sqlite3GlobalConfig.bLocaltimeFault ){ + if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ + return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); + }else{ + return 1; + } + } #endif #if HAVE_LOCALTIME_R rc = localtime_r(t, pTm)==0; diff --git a/src/global.c b/src/global.c index 34b7d9583b..6ad3bb4654 100644 --- a/src/global.c +++ b/src/global.c @@ -286,6 +286,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ + 0, /* xAltLocaltime */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ diff --git a/src/main.c b/src/main.c index e8b775a219..f34e981d51 100644 --- a/src/main.c +++ b/src/main.c @@ -4161,13 +4161,27 @@ int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt); ** - ** If parameter onoff is non-zero, subsequent calls to localtime() - ** and its variants fail. If onoff is zero, undo this setting. + ** If parameter onoff is 1, subsequent calls to localtime() fail. + ** If 2, then invoke xAlt() instead of localtime(). If 0, normal + ** processing. + ** + ** xAlt arguments are void pointers, but they really want to be: + ** + ** int xAlt(const time_t*, struct tm*); + ** + ** xAlt should write results in to struct tm object of its 2nd argument + ** and return zero on success, or return non-zero on failure. */ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); + if( sqlite3GlobalConfig.bLocaltimeFault==2 ){ + sqlite3GlobalConfig.xAltLocaltime = + va_arg(ap, int(*)(const void*,void*)); + }else{ + sqlite3GlobalConfig.xAltLocaltime = 0; + } break; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1ed600f4dd..c8dbec2f15 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3936,6 +3936,7 @@ struct Sqlite3Config { int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ + int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ diff --git a/src/test1.c b/src/test1.c index 05aa97539a..3eba084497 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7258,7 +7258,7 @@ static int SQLITE_TCLAPI test_test_control( return TCL_ERROR; } if( Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR; - sqlite3_test_control(iFlag, val); + sqlite3_test_control(iFlag, val!=0); break; } From b30af022da72ad79a9085af758ff3a3b5751c8fc Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 23:12:58 +0000 Subject: [PATCH 05/14] Fix SQLITE_TESTCTRL_LOCALTIME_FAULT so that it works even if mutexes are enabled. FossilOrigin-Name: 64537a0669553e8a6b610b9e9703ec084472516c86cfc22a7a6c73b6c66131ee --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/date.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2843e573ae..9ca4fcd72a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sSQLITE_TESTCTRL_LOCALTIME_FAULT\sso\sthat\sis\sable\sto\sinstall\san\nalternative\slocaltime()\sinterface\sso\sthat\sthe\slocaltime\slogic\san\sbe\sbetter\ntested. -D 2022-02-10T21:26:53.735 +C Fix\sSQLITE_TESTCTRL_LOCALTIME_FAULT\sso\sthat\sit\sworks\seven\sif\smutexes\sare\nenabled. +D 2022-02-10T23:12:58.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2cce39df1a13e05b7633e6d21b651f21492471f991dd7b323a4ee4e7b7f0b7f1 -F src/date.c 4088c042680ecc5ea1b7d5bfa67b91e7d0f48e91de2d2c5244852250ae86a2cb +F src/date.c 1fcc64294b0e81cc9fa05cf8f773e862dd004f74d023544d43edeeacbcfde7e5 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 85cb6014751a0572d28ebd839331d5d7a78de45c9e522adcd834a8a85746f32e -R 223a6ad4591810b91660311766f1accb +P 6e25cb0890e8cdc63c9a21e841844d066267fc32ad143527843f7c8d05612b53 +R b4c18325e5e30dde4c5cbc5a73cdd599 U drh -Z aed68e242e6b8ba2c978ed50de469779 +Z b3ec0930c208b299317e22009860377e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2560a392e3..a440eb5e9d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e25cb0890e8cdc63c9a21e841844d066267fc32ad143527843f7c8d05612b53 \ No newline at end of file +64537a0669553e8a6b610b9e9703ec084472516c86cfc22a7a6c73b6c66131ee \ No newline at end of file diff --git a/src/date.c b/src/date.c index 1306847f89..a510d62750 100644 --- a/src/date.c +++ b/src/date.c @@ -523,8 +523,10 @@ static int osLocaltime(time_t *t, struct tm *pTm){ pX = localtime(t); #ifndef SQLITE_UNTESTABLE if( sqlite3GlobalConfig.bLocaltimeFault ){ - if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ - return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); + if( sqlite3GlobalConfig.xAltLocaltime!=0 + && 0==sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm) + ){ + pX = pTm; }else{ pX = 0; } From 0d58ae010c386d628ded9db0774dce236b128e9a Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 11:37:12 +0000 Subject: [PATCH 06/14] Work around the MSVC bug that prevents the use of function pointer types in the second argument of va_arg() by adding a typedef. FossilOrigin-Name: eae3ab0a050079d050f339b2510eebd55afe4464e9b410ddacb7523f89981144 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 14 ++++++++------ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9ca4fcd72a..e2c859c324 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sSQLITE_TESTCTRL_LOCALTIME_FAULT\sso\sthat\sit\sworks\seven\sif\smutexes\sare\nenabled. -D 2022-02-10T23:12:58.018 +C Work\saround\sthe\sMSVC\sbug\sthat\sprevents\sthe\suse\sof\sfunction\spointer\stypes\sin\nthe\ssecond\sargument\sof\sva_arg()\sby\sadding\sa\stypedef. +D 2022-02-11T11:37:12.491 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -516,7 +516,7 @@ F src/insert.c 1eea44389de3768ac98588c1410171cd53e7c6ad1af74049983dcbac82093de0 F src/json.c 225b00422112ecd7094a555f3ace16b25d7d5894062b823269ed03899907c2a2 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c aa919a6a7884f8b34d7b791841b24d14b1b0ab43f45b3940f4851043b2855c0c -F src/main.c 911a4d673782df8f53838f779291de9059f1d00adb506a3c2c758bbd6231a5d3 +F src/main.c b2a12cd5866c588e94759578306dd9dccfce7952a09c42c88aacb7a124f31fd1 F src/malloc.c fec841aa0a0400a6f7d20706178a5d8e8219a6bf562b6fe712c17f6c26813266 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6e25cb0890e8cdc63c9a21e841844d066267fc32ad143527843f7c8d05612b53 -R b4c18325e5e30dde4c5cbc5a73cdd599 +P 64537a0669553e8a6b610b9e9703ec084472516c86cfc22a7a6c73b6c66131ee +R 69d39cc2a2c0b0bff918307a67a5ff96 U drh -Z b3ec0930c208b299317e22009860377e +Z 143ea0bc38b583b5551b8d361444e012 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a440eb5e9d..ee7cb9da61 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -64537a0669553e8a6b610b9e9703ec084472516c86cfc22a7a6c73b6c66131ee \ No newline at end of file +eae3ab0a050079d050f339b2510eebd55afe4464e9b410ddacb7523f89981144 \ No newline at end of file diff --git a/src/main.c b/src/main.c index f34e981d51..7ff524c9af 100644 --- a/src/main.c +++ b/src/main.c @@ -4029,12 +4029,14 @@ int sqlite3_test_control(int op, ...){ ** sqlite3_test_control(). */ case SQLITE_TESTCTRL_FAULT_INSTALL: { - /* MSVC is picky about pulling func ptrs from va lists. - ** http://support.microsoft.com/kb/47961 + /* A bug in MSVC prevents it from understanding pointers to functions + ** types in the second argument to va_arg(). Work around the problem + ** using a typedef. + ** http://support.microsoft.com/kb/47961 <-- dead hyperlink ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); */ - typedef int(*TESTCALLBACKFUNC_t)(int); - sqlite3GlobalConfig.xTestCallback = va_arg(ap, TESTCALLBACKFUNC_t); + typedef int(*sqlite3FaultFuncType)(int); + sqlite3GlobalConfig.xTestCallback = va_arg(ap, sqlite3FaultFuncType); rc = sqlite3FaultSim(0); break; } @@ -4177,8 +4179,8 @@ int sqlite3_test_control(int op, ...){ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); if( sqlite3GlobalConfig.bLocaltimeFault==2 ){ - sqlite3GlobalConfig.xAltLocaltime = - va_arg(ap, int(*)(const void*,void*)); + typedef int(*sqlite3LocaltimeType)(const void*,void*); + sqlite3GlobalConfig.xAltLocaltime = va_arg(ap, sqlite3LocaltimeType); }else{ sqlite3GlobalConfig.xAltLocaltime = 0; } From fa3ee3b10ba74267bf9da4971bc14ab69ab70ec0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 12:06:37 +0000 Subject: [PATCH 07/14] Fix the bind2.test test script so that it works even if SQLITE_ENABLE_PREUPDATE_HOOK is not defined. Fix for test-case breakage from check-in [c006515ae6faff65]. FossilOrigin-Name: 937d3a45b3fef354dbdea2085fbb7d9c752a96e8ebb62f61931deb5a64132946 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/bind2.test | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e2c859c324..1210bd4cf0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\saround\sthe\sMSVC\sbug\sthat\sprevents\sthe\suse\sof\sfunction\spointer\stypes\sin\nthe\ssecond\sargument\sof\sva_arg()\sby\sadding\sa\stypedef. -D 2022-02-11T11:37:12.491 +C Fix\sthe\sbind2.test\stest\sscript\sso\sthat\sit\sworks\seven\sif\nSQLITE_ENABLE_PREUPDATE_HOOK\sis\snot\sdefined.\nFix\sfor\stest-case\sbreakage\sfrom\scheck-in\s[c006515ae6faff65]. +D 2022-02-11T12:06:37.779 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -739,7 +739,7 @@ F test/bigmmap.test b820c234daa56d24bc3bf006e3ac7aa9d9623c8ac656a38f59063b444a2d F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2 F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483 -F test/bind2.test ce26f19475c933e59e80028fc44073b84c2aba8650dadfdfbd057a4c5adbeb3a +F test/bind2.test 918bc35135f4141809ead7585909cde57d44db90a7a62aef540127148f91aab7 F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 64537a0669553e8a6b610b9e9703ec084472516c86cfc22a7a6c73b6c66131ee -R 69d39cc2a2c0b0bff918307a67a5ff96 +P eae3ab0a050079d050f339b2510eebd55afe4464e9b410ddacb7523f89981144 +R 79f6972005a4c1979207db9e22e0082a U drh -Z 143ea0bc38b583b5551b8d361444e012 +Z da1ae444693eca5c95a17e499729f262 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ee7cb9da61..5d68a80c5c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eae3ab0a050079d050f339b2510eebd55afe4464e9b410ddacb7523f89981144 \ No newline at end of file +937d3a45b3fef354dbdea2085fbb7d9c752a96e8ebb62f61931deb5a64132946 \ No newline at end of file diff --git a/test/bind2.test b/test/bind2.test index 26dac0af6f..1ebf35c2e0 100644 --- a/test/bind2.test +++ b/test/bind2.test @@ -36,6 +36,11 @@ do_test 1.1 { } {42.0} sqlite3_finalize $stmt +ifcapable !preupdate { + finish_test + return +} + proc preup {args} { set stmt [sqlite3_prepare db "SELECT ?" -1 tail] sqlite3_bind_value_from_preupdate $stmt 1 old 0 From 85548fac8d11c6e5b2922bdea95d169852342e13 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 14:08:05 +0000 Subject: [PATCH 08/14] Use the enhanced SQLITE_TESTCTRL_LOCALTIME_FAULT (2) capability to do better testing of the 'localtime' and 'utc' modifiers to date/time functions. FossilOrigin-Name: f38071946ac2e5bb61e6c0620507e4c94464999ac700d86c1a704b94eb1c009a --- manifest | 14 ++-- manifest.uuid | 2 +- src/test1.c | 55 ++++++++++++++- test/date.test | 180 +++++++++++++++---------------------------------- 4 files changed, 116 insertions(+), 135 deletions(-) diff --git a/manifest b/manifest index 1210bd4cf0..bc6b62935d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbind2.test\stest\sscript\sso\sthat\sit\sworks\seven\sif\nSQLITE_ENABLE_PREUPDATE_HOOK\sis\snot\sdefined.\nFix\sfor\stest-case\sbreakage\sfrom\scheck-in\s[c006515ae6faff65]. -D 2022-02-11T12:06:37.779 +C Use\sthe\senhanced\sSQLITE_TESTCTRL_LOCALTIME_FAULT\s(2)\scapability\sto\sdo\sbetter\ntesting\sof\sthe\s'localtime'\sand\s'utc'\smodifiers\sto\sdate/time\sfunctions. +D 2022-02-11T14:08:05.256 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -562,7 +562,7 @@ F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a3 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 48f291e1a7e672a7204884d4c164a8ed3a522ff087c361ada2991f5d54e987f6 -F src/test1.c a5d93408dfc5d91f35af12a9c6e90562cc1713f435a8642c9dbd3ffdb4d39ad2 +F src/test1.c 87fda59eea3ac1eba1baef37c1967565cb1b8d6d264649f2e57f252ca5989914 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -837,7 +837,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47 F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 7e1da08fca5492081605a2bf445370b06be6a95db1150f3133b70eb672b33cb3 +F test/date.test 50d5b1eeec57041c000d2be5e9ab995026ded4255507f0206c81c1ca3b34b840 F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1 F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5 F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eae3ab0a050079d050f339b2510eebd55afe4464e9b410ddacb7523f89981144 -R 79f6972005a4c1979207db9e22e0082a +P 937d3a45b3fef354dbdea2085fbb7d9c752a96e8ebb62f61931deb5a64132946 +R a16f91be526745131b2dd2bc3f00c944 U drh -Z da1ae444693eca5c95a17e499729f262 +Z 614bb1714108c365812b64395ec64ab7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5d68a80c5c..910522f286 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -937d3a45b3fef354dbdea2085fbb7d9c752a96e8ebb62f61931deb5a64132946 \ No newline at end of file +f38071946ac2e5bb61e6c0620507e4c94464999ac700d86c1a704b94eb1c009a \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index 3eba084497..455c4b2579 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7207,6 +7207,55 @@ static int SQLITE_TCLAPI test_print_eqp( } #endif /* SQLITE_OMIT_EXPLAIN */ +#include +/* +** This is an alternative localtime_r() implementation used for testing +** the 'localtime' and 'utc' modifiers of date-time functions. Because +** the OS-supplied localtime_r() is locale-dependent, this alternative is +** provided as a stable test platform. +** +** Operation: +** +** (1) Localtime is 30 minutes earlier than (west of) UTC on +** even days (counting from 1970-01-01) +** +** (2) Localtime is 30 minutes later than (east of) UTC on odd days. +** +** (3) The function fails for the specific date/time value +** of 2000-05-29 14:16:00 in order to test the ability of +** SQLite to deal with localtime_r() failures. +*/ +static int testLocaltime(const void *aliasT, void *aliasTM){ + const time_t t = *(const time_t*)aliasT; + struct tm *pTm = (struct tm *)aliasTM; + time_t altT; + sqlite3_int64 iJD; + int Z, A, B, C, D, E, X1, S; + + if( (t/86400) & 1 ){ + altT = t + 1800; /* 30 minutes later on odd days */ + }else{ + altT = t - 1800; /* 30 minutes earlier on even days */ + } + iJD = (sqlite3_int64)(altT + 210866760000); + Z = (int)((iJD + 43200)/86400); + A = (int)((Z - 1867216.25)/36524.25); + A = Z + 1 + A - (A/4); + B = A + 1524; + C = (int)((B - 122.1)/365.25); + D = (36525*(C&32767))/100; + E = (int)((B-D)/30.6001); + X1 = (int)(30.6001*E); + pTm->tm_mday = B - D - X1; + pTm->tm_mon = E<14 ? E-2 : E-14; + pTm->tm_year = (pTm->tm_mon>1 ? C - 4716 : C - 4715) - 1900; + S = (int)((iJD + 43200)%86400); + pTm->tm_hour = S/3600; + pTm->tm_min = (S/60)%60; + pTm->tm_sec = S % 60; + return t==959609760; /* Special case: 2000-05-29 14:16:00 fails */ +} + /* ** sqlite3_test_control VERB ARGS... */ @@ -7254,11 +7303,11 @@ static int SQLITE_TCLAPI test_test_control( case SQLITE_TESTCTRL_LOCALTIME_FAULT: { int val; if( objc!=3 ){ - Tcl_WrongNumArgs(interp, 2, objv, "ONOFF"); + Tcl_WrongNumArgs(interp, 2, objv, "0|1|2"); return TCL_ERROR; } - if( Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR; - sqlite3_test_control(iFlag, val!=0); + if( Tcl_GetIntFromObj(interp, objv[2], &val) ) return TCL_ERROR; + sqlite3_test_control(iFlag, val, testLocaltime); break; } diff --git a/test/date.test b/test/date.test index 2e5859ad29..a9a34065c1 100644 --- a/test/date.test +++ b/test/date.test @@ -239,138 +239,70 @@ datetest 5.13 {datetime('1994-04-16 14:00:00Zulu')} NULL datetest 5.14 {datetime('1994-04-16 14:00:00Z +05:00')} NULL datetest 5.15 {datetime('1994-04-16 14:00:00 +05:00 Z')} NULL -# localtime->utc and utc->localtime conversions. These tests only work -# if the localtime is in the US Eastern Time (the time in Charlotte, NC -# and in New York.) +# localtime->utc and utc->localtime conversions. # -# On non-Vista Windows platform, '2006-03-31' is treated incorrectly as being -# in DST giving a 4 hour offset instead of 5. In 2007, DST was extended to -# start three weeks earlier (second Sunday in March) and end one week -# later (first Sunday in November). Older Windows systems apply this -# new rule incorrectly to dates prior to 2007. +# Use SQLITE_TESTCTRL_LOCALTIME_FAULT=2 to set an alternative localtime_r() +# implementation that is not locale-dependent. This testing localtime_r() +# operates as follows: # -# It might be argued that this is masking a problem on non-Vista Windows -# platform. A ticket has already been opened for this issue -# (http://www.sqlite.org/cvstrac/tktview?tn=2322). This is just to prevent -# more confusion/reports of the issue. +# (1) Localtime is 30 minutes earlier than (west of) UTC on +# even days (counting from 1970-01-01) # - -# $tzoffset_old should be 5 if DST is working correctly. -set tzoffset_old [db one { - SELECT CAST(24*(julianday('2006-03-31') - - julianday('2006-03-31','localtime'))+0.5 - AS INT) -}] - -# $tzoffset_new should be 4 if DST is working correctly. -set tzoffset_new [db one { - SELECT CAST(24*(julianday('2007-03-31') - - julianday('2007-03-31','localtime'))+0.5 - AS INT) -}] - -# Warn about possibly broken Windows DST implementations. -if {$::tcl_platform(platform)=="windows" && $tzoffset_new==4 && $tzoffset_old==4} { - puts "******************************************************************" - puts "N.B.: The DST support provided by your current O/S seems to be" - puts "suspect in that it is reporting incorrect DST values for dates" - puts "prior to 2007. This is the known case for most (all?) non-Vista" - puts "Windows versions. Please see ticket #2322 for more information." - puts "******************************************************************" +# (2) Localtime is 30 minutes later than (east of) UTC on odd days. +# +# (3) The function fails for the specific date/time value +# of 2000-05-29 14:16:00 in order to test the ability of +# SQLite to deal with localtime_r() failures. +# +proc local_to_utc {tn utc local} { + do_execsql_test date-$tn "SELECT datetime('$utc','localtime')" [list $local] +} +proc utc_to_local {tn local utc} { + do_execsql_test date-$tn "SELECT datetime('$local','utc')" [list $utc] } -if {$tzoffset_new==4} { - datetest 6.1 {datetime('2000-10-29 05:59:00','localtime')}\ - {2000-10-29 01:59:00} - datetest 6.1.1 {datetime('2006-10-29 05:59:00','localtime')}\ - {2006-10-29 01:59:00} - datetest 6.1.2 {datetime('2007-11-04 05:59:00','localtime')}\ - {2007-11-04 01:59:00} +sqlite3_test_control SQLITE_TESTCTRL_LOCALTIME_FAULT 2 +local_to_utc 6.1 {2000-10-29 12:00:00} {2000-10-29 12:30:00} +utc_to_local 6.2 {2000-10-29 12:30:00} {2000-10-29 12:00:00} +local_to_utc 6.3 {2000-10-30 12:00:00} {2000-10-30 11:30:00} +utc_to_local 6.4 {2000-10-30 11:30:00} {2000-10-30 12:00:00} - # If the new and old DST rules seem to be working correctly... - if {$tzoffset_new==4 && $tzoffset_old==5} { - datetest 6.2 {datetime('2000-10-29 06:00:00','localtime')}\ - {2000-10-29 01:00:00} - datetest 6.2.1 {datetime('2006-10-29 06:00:00','localtime')}\ - {2006-10-29 01:00:00} - } - datetest 6.2.2 {datetime('2007-11-04 06:00:00','localtime')}\ - {2007-11-04 01:00:00} +local_to_utc 6.5 {2000-10-28 23:59:59} {2000-10-28 23:29:59} +local_to_utc 6.6 {2000-10-29 00:00:00} {2000-10-29 00:30:00} - # If the new and old DST rules seem to be working correctly... - if {$tzoffset_new==4 && $tzoffset_old==5} { - datetest 6.3 {datetime('2000-04-02 06:59:00','localtime')}\ - {2000-04-02 01:59:00} - datetest 6.3.1 {datetime('2006-04-02 06:59:00','localtime')}\ - {2006-04-02 01:59:00} - } - datetest 6.3.2 {datetime('2007-03-11 07:00:00','localtime')}\ - {2007-03-11 03:00:00} - - datetest 6.4 {datetime('2000-04-02 07:00:00','localtime')}\ - {2000-04-02 03:00:00} - datetest 6.4.1 {datetime('2006-04-02 07:00:00','localtime')}\ - {2006-04-02 03:00:00} - datetest 6.4.2 {datetime('2007-03-11 07:00:00','localtime')}\ - {2007-03-11 03:00:00} - - datetest 6.5 {datetime('2000-10-29 01:59:00','utc')} {2000-10-29 05:59:00} - datetest 6.5.1 {datetime('2006-10-29 01:59:00','utc')} {2006-10-29 05:59:00} - datetest 6.5.2 {datetime('2007-11-04 01:59:00','utc')} {2007-11-04 05:59:00} - - # If the new and old DST rules seem to be working correctly... - if {$tzoffset_new==4 && $tzoffset_old==5} { - datetest 6.6 {datetime('2000-10-29 02:00:00','utc')} {2000-10-29 07:00:00} - datetest 6.6.1 {datetime('2006-10-29 02:00:00','utc')} {2006-10-29 07:00:00} - } - datetest 6.6.2 {datetime('2007-11-04 02:00:00','utc')} {2007-11-04 07:00:00} - - # If the new and old DST rules seem to be working correctly... - if {$tzoffset_new==4 && $tzoffset_old==5} { - datetest 6.7 {datetime('2000-04-02 01:59:00','utc')} {2000-04-02 06:59:00} - datetest 6.7.1 {datetime('2006-04-02 01:59:00','utc')} {2006-04-02 06:59:00} - } - datetest 6.7.2 {datetime('2007-03-11 01:59:00','utc')} {2007-03-11 06:59:00} - - datetest 6.8 {datetime('2000-04-02 02:00:00','utc')} {2000-04-02 07:00:00} - datetest 6.8.1 {datetime('2006-04-02 02:00:00','utc')} {2006-04-02 07:00:00} - datetest 6.8.2 {datetime('2007-03-11 02:00:00','utc')} {2007-03-11 07:00:00} - - # The 'utc' modifier is a no-op if the LHS is known to already be in UTC - datetest 6.9.1 {datetime('2015-12-23 12:00:00','utc')} {2015-12-23 17:00:00} - datetest 6.9.2 {datetime('2015-12-23 12:00:00z','utc')} {2015-12-23 12:00:00} - datetest 6.9.3 {datetime('2015-12-23 12:00:00-03:00','utc')} \ - {2015-12-23 15:00:00} - datetest 6.9.4 {datetime('2015-12-23 12:00:00','utc','utc','utc')} \ - {2015-12-23 17:00:00} - - - datetest 6.10 {datetime('2000-01-01 12:00:00','localtime')} \ - {2000-01-01 07:00:00} - datetest 6.11 {datetime('1969-01-01 12:00:00','localtime')} \ - {1969-01-01 07:00:00} - datetest 6.12 {datetime('2039-01-01 12:00:00','localtime')} \ - {2039-01-01 07:00:00} - datetest 6.13 {datetime('2000-07-01 12:00:00','localtime')} \ - {2000-07-01 08:00:00} - datetest 6.14 {datetime('1969-11-01 12:00:00','localtime')} \ - {1969-11-01 07:00:00} - datetest 6.15 {datetime('2039-02-01 12:00:00','localtime')} \ - {2039-02-01 07:00:00} - set sqlite_current_time \ - [db eval {SELECT strftime('%s','2000-07-01 12:34:56')}] - datetest 6.16 {datetime('now','localtime')} {2000-07-01 08:34:56} - datetest 6.17 {datetime('now','localtimex')} NULL - datetest 6.18 {datetime('now','localtim')} NULL - set sqlite_current_time 0 -} - -# These two are a bit of a scam. They are added to ensure that 100% of -# the date.c file is covered by testing, even when the time-zone -# is not -0400 (the condition for running of the block of tests above). +# The previous two cases establish that no such localtime as +# 2000-10-29 00:10:00 exists. Verify that we get a reasonable +# answer if we try to convert this non-existant localtime to utc? # -datetest 6.19 {datetime('2039-07-01 12:00:00','localtime',null)} NULL -datetest 6.20 {datetime('2039-07-01 12:00:00','utc',null)} NULL +utc_to_local 6.7 {2000-10-29 00:10:00} {2000-10-28 23:40:00} + +local_to_utc 6.8 {2022-02-10 23:59:59} {2022-02-11 00:29:59} +local_to_utc 6.9 {2022-02-11 00:00:00} {2022-02-10 23:30:00} +local_to_utc 6.10 {2022-02-10 23:45:00} {2022-02-11 00:15:00} +local_to_utc 6.11 {2022-02-11 00:45:00} {2022-02-11 00:15:00} + +# The previous two cases show that two different UTC values give +# the same localtime of 2022-02-11 00:15:00. When converting from +# that localtime back to UTC, we should get one or the other of +# the two UTC values. +# +utc_to_local 6.12 {2022-02-11 00:15:00} {2022-02-11 00:45:00} + +# If localtime_r() fails, the datetime() SQL function should raise an error +# +do_catchsql_test date-6.20 { + SELECT datetime('2000-05-29 14:16:00','localtime'); +} {1 {local time unavailable}} + +# Modifiers work for dates that are way out of band for localtime_r() +# +local_to_utc 6.21 {1800-10-29 12:00:00} {1800-10-29 12:30:00} +utc_to_local 6.22 {1800-10-29 12:30:00} {1800-10-29 12:00:00} +local_to_utc 6.23 {3000-10-30 12:00:00} {3000-10-30 11:30:00} +utc_to_local 6.24 {3000-10-30 11:30:00} {3000-10-30 12:00:00} + +# Restore the use of the OS localtime_r() before going on... +sqlite3_test_control SQLITE_TESTCTRL_LOCALTIME_FAULT 0 # Date-time functions that contain NULL arguments return a NULL # result. From 63a47336afb8ae8f3e4a48b5f5a19201b1f04e13 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Feb 2022 16:10:18 +0000 Subject: [PATCH 09/14] Fix a problem in [c006515ae6faff65] causing an assert() to fail with some build configurations. FossilOrigin-Name: d7ff262d6d1fd8b855bcb8f6f54ab1833663a4d8187701ddf045f6b5a62a5d1d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bc6b62935d..d9bd6649bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\senhanced\sSQLITE_TESTCTRL_LOCALTIME_FAULT\s(2)\scapability\sto\sdo\sbetter\ntesting\sof\sthe\s'localtime'\sand\s'utc'\smodifiers\sto\sdate/time\sfunctions. -D 2022-02-11T14:08:05.256 +C Fix\sa\sproblem\sin\s[c006515ae6faff65]\scausing\san\sassert()\sto\sfail\swith\ssome\sbuild\sconfigurations. +D 2022-02-11T16:10:18.625 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -627,7 +627,7 @@ F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 F src/vdbe.c 13a4de20ee07bdfb3dc74ab49b7912208e309caf762a8d1678fb111e2223af35 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h b45599a2b59f1ce042512ab6786b0b82a8cf3002f6b0fa60b4834e2cd3ac61d8 -F src/vdbeapi.c c38f1642bb2e31a3e2f1bbd185984455e277022bdd618698a036557686721e8a +F src/vdbeapi.c 8863ffb5a7bac42fe9a68aaa3526ee29fc18fb02a9b27188b756de41e33856e9 F src/vdbeaux.c 0d7659fe8cb38ce86092b9bc5131c99a834a04eb78745e54acb77d79d7af2fb5 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c eb6042667c02c3ef1f968235b4a170e31b23a4b6a57f65a8454eab4d36f14b7f @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 937d3a45b3fef354dbdea2085fbb7d9c752a96e8ebb62f61931deb5a64132946 -R a16f91be526745131b2dd2bc3f00c944 -U drh -Z 614bb1714108c365812b64395ec64ab7 +P f38071946ac2e5bb61e6c0620507e4c94464999ac700d86c1a704b94eb1c009a +R c307ea0ca335d4fa864c98350426e969 +U dan +Z 7c3d6912f6e9bdfd9499001351fd962e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 910522f286..e4fa015dfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f38071946ac2e5bb61e6c0620507e4c94464999ac700d86c1a704b94eb1c009a \ No newline at end of file +d7ff262d6d1fd8b855bcb8f6f54ab1833663a4d8187701ddf045f6b5a62a5d1d \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 68d2d283d8..6939813a27 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1594,7 +1594,10 @@ int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ break; } case SQLITE_FLOAT: { - rc = sqlite3_bind_double(pStmt, i, sqlite3VdbeRealValue((Mem*)pValue)); + assert( pValue->flags & (MEM_Real|MEM_IntReal) ); + rc = sqlite3_bind_double(pStmt, i, + (pValue->flags & MEM_Real) ? pValue->u.r : (double)pValue->u.i + ); break; } case SQLITE_BLOB: { From 4ba1c5cc49b9b524e9065ae4d3b21ee52ff30008 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 17:33:02 +0000 Subject: [PATCH 10/14] Fix an assert() in the pager by adding "|| CORRUPT_DB", in as much as the assert() is not necessarily true if the database size in the header is wrong. dbsqlfuzz f2f996065b90988aa9b0ae425b66dbb296546a08. FossilOrigin-Name: a51402e8c29fad2b24e32de55b10691fb0ebd6c2cebac941e43e54be211d5d39 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d9bd6649bf..5926a0a320 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\s[c006515ae6faff65]\scausing\san\sassert()\sto\sfail\swith\ssome\sbuild\sconfigurations. -D 2022-02-11T16:10:18.625 +C Fix\san\sassert()\sin\sthe\spager\sby\sadding\s"||\sCORRUPT_DB",\sin\sas\smuch\sas\sthe\nassert()\sis\snot\snecessarily\strue\sif\sthe\sdatabase\ssize\sin\sthe\sheader\sis\nwrong.\s\sdbsqlfuzz\sf2f996065b90988aa9b0ae425b66dbb296546a08. +D 2022-02-11T17:33:02.377 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -539,7 +539,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c f5ad51cfd024116db8531feab9efd831c2621436dca1464e4ff1e8af9bf3252e F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 0c028c10e73b496ed9f5ecda50e814e99999e97c9e483b3d6d5be54cc39ddffc +F src/pager.c 66bc54c37448c562950e28783e49c7697ea79d1e85136d0e4a915d3a7f9feb5b F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y b34d4eb8105271ea0d577ef165bb7b2a2b70e03b2e694e68e2e43b76389bf660 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f38071946ac2e5bb61e6c0620507e4c94464999ac700d86c1a704b94eb1c009a -R c307ea0ca335d4fa864c98350426e969 -U dan -Z 7c3d6912f6e9bdfd9499001351fd962e +P d7ff262d6d1fd8b855bcb8f6f54ab1833663a4d8187701ddf045f6b5a62a5d1d +R 8dcab2cca72428ec970e074771a6a6a7 +U drh +Z 1c09cebab751522ea60e263c3cff16f3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e4fa015dfe..ee9075eea5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7ff262d6d1fd8b855bcb8f6f54ab1833663a4d8187701ddf045f6b5a62a5d1d \ No newline at end of file +a51402e8c29fad2b24e32de55b10691fb0ebd6c2cebac941e43e54be211d5d39 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index b657bf5c31..7ac0689178 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3945,7 +3945,7 @@ static void assertTruncateConstraint(Pager *pPager){ ** then continue writing to the database. */ void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ - assert( pPager->dbSize>=nPage ); + assert( pPager->dbSize>=nPage || CORRUPT_DB ); assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); pPager->dbSize = nPage; From 11fc3c0fa7cc39436290684d6a04254be639dcfe Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 17:47:25 +0000 Subject: [PATCH 11/14] Reference the wayback machine for the dead hyperlink to the MS support page in the comments about why the extra typedef for va_arg(). No code changes. FossilOrigin-Name: ab1a9b5b78de7c00b38357b1df08e82ce5608a14f8c675ac20c5f2dad5212f50 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5926a0a320..ac8d7e47bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sthe\spager\sby\sadding\s"||\sCORRUPT_DB",\sin\sas\smuch\sas\sthe\nassert()\sis\snot\snecessarily\strue\sif\sthe\sdatabase\ssize\sin\sthe\sheader\sis\nwrong.\s\sdbsqlfuzz\sf2f996065b90988aa9b0ae425b66dbb296546a08. -D 2022-02-11T17:33:02.377 +C Reference\sthe\swayback\smachine\sfor\sthe\sdead\shyperlink\sto\sthe\sMS\ssupport\npage\sin\sthe\scomments\sabout\swhy\sthe\sextra\stypedef\sfor\sva_arg().\s\sNo\scode\nchanges. +D 2022-02-11T17:47:25.368 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -516,7 +516,7 @@ F src/insert.c 1eea44389de3768ac98588c1410171cd53e7c6ad1af74049983dcbac82093de0 F src/json.c 225b00422112ecd7094a555f3ace16b25d7d5894062b823269ed03899907c2a2 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c aa919a6a7884f8b34d7b791841b24d14b1b0ab43f45b3940f4851043b2855c0c -F src/main.c b2a12cd5866c588e94759578306dd9dccfce7952a09c42c88aacb7a124f31fd1 +F src/main.c 0840cee6984034c7e73cc747a1562c7eaed4673694bf20b00980aaa0672c0405 F src/malloc.c fec841aa0a0400a6f7d20706178a5d8e8219a6bf562b6fe712c17f6c26813266 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d7ff262d6d1fd8b855bcb8f6f54ab1833663a4d8187701ddf045f6b5a62a5d1d -R 8dcab2cca72428ec970e074771a6a6a7 +P a51402e8c29fad2b24e32de55b10691fb0ebd6c2cebac941e43e54be211d5d39 +R 20eead42bad3445f6e92d102d7410997 U drh -Z 1c09cebab751522ea60e263c3cff16f3 +Z adcaf83dd936d55d3827cdbf801eb9c8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ee9075eea5..34dc85f5a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a51402e8c29fad2b24e32de55b10691fb0ebd6c2cebac941e43e54be211d5d39 \ No newline at end of file +ab1a9b5b78de7c00b38357b1df08e82ce5608a14f8c675ac20c5f2dad5212f50 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7ff524c9af..8747f07b56 100644 --- a/src/main.c +++ b/src/main.c @@ -4033,6 +4033,8 @@ int sqlite3_test_control(int op, ...){ ** types in the second argument to va_arg(). Work around the problem ** using a typedef. ** http://support.microsoft.com/kb/47961 <-- dead hyperlink + ** Search at http://web.archive.org/ to find the 2015-03-16 archive + ** of the link above to see the original text. ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); */ typedef int(*sqlite3FaultFuncType)(int); From eba21cd4bee8d8b8a30a4183553dbc2d45747797 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 17:47:58 +0000 Subject: [PATCH 12/14] Load recent dbsqlfuzz finds into test/fuzzdata8.db. FossilOrigin-Name: b275ad250d8aa286829647967ab7e75fcd2b5674caab1a34eab59d8486a34cd5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 3113984 -> 3283968 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ac8d7e47bf..8ee0b412bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reference\sthe\swayback\smachine\sfor\sthe\sdead\shyperlink\sto\sthe\sMS\ssupport\npage\sin\sthe\scomments\sabout\swhy\sthe\sextra\stypedef\sfor\sva_arg().\s\sNo\scode\nchanges. -D 2022-02-11T17:47:25.368 +C Load\srecent\sdbsqlfuzz\sfinds\sinto\stest/fuzzdata8.db. +D 2022-02-11T17:47:58.782 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1072,7 +1072,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 738ed275638f2423cdef240a44eba3b9bc272eec619e68b00429d4575a15e50b +F test/fuzzdata8.db ca9a97f401b06b0d5376139ec7e1f9e773e13345a9a2d9ccc0032cdbfedea230 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a51402e8c29fad2b24e32de55b10691fb0ebd6c2cebac941e43e54be211d5d39 -R 20eead42bad3445f6e92d102d7410997 +P ab1a9b5b78de7c00b38357b1df08e82ce5608a14f8c675ac20c5f2dad5212f50 +R 3c0b7fe68f1994f5b25e0793fbe9ed85 U drh -Z adcaf83dd936d55d3827cdbf801eb9c8 +Z 1a8e88290e38fd7fb987aae4e5fe24f2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 34dc85f5a9..71e47ab492 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ab1a9b5b78de7c00b38357b1df08e82ce5608a14f8c675ac20c5f2dad5212f50 \ No newline at end of file +b275ad250d8aa286829647967ab7e75fcd2b5674caab1a34eab59d8486a34cd5 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 46112fff5f035e2387a28177aaf1c7a80e4a0fa9..de7799f945f521444c9788aa2f933692ca84a6ba 100644 GIT binary patch delta 72426 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 delta 53230 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 M#p}Wfc_F9%3yqTt`~Uy| From 7b57aa3da924b0d6da57237a4535607308631cb7 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Feb 2022 19:41:03 +0000 Subject: [PATCH 13/14] Update some OOM tests of the ALTER TABLE command to account for an error message which may be returned if opening the temp db fails. FossilOrigin-Name: 3409fd4150df059d7308f79fa3672a330af9cefe2ad9120c3da5ef1413921e96 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/altermalloc2.test | 15 ++++++++++----- test/altermalloc3.test | 8 ++++++-- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 8ee0b412bc..3ffebc56b5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\srecent\sdbsqlfuzz\sfinds\sinto\stest/fuzzdata8.db. -D 2022-02-11T17:47:58.782 +C Update\ssome\sOOM\stests\sof\sthe\sALTER\sTABLE\scommand\sto\saccount\sfor\san\serror\smessage\swhich\smay\sbe\sreturned\sif\sopening\sthe\stemp\sdb\sfails. +D 2022-02-11T19:41:03.848 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -664,8 +664,8 @@ F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a54328 F test/alterfault.test 289067108947bedca27534edd4ff251bcd298cf84402d7b24eaa3749305418c6 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 -F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca69a789a33 +F test/altermalloc2.test 17fb3724c4b004c469c27dc4ef181608aa644555fbd3f3236767584f73747c81 +F test/altermalloc3.test 55e606edf4b0acfbbd851ddfe93cfdddfae43d103644dcfd6008ae4ab3c44adf F test/alterqf.test 3008318ba9e16b4ac0b5f83cf7683caa4b0a3154aafe3b4099838a250d4ba74a F test/altertab.test 7273b8506eab46342be016af78028df49f3bd99037412f997a8f1011b37a6912 F test/altertab2.test 62597b6fd08feaba1b6bfe7d31dac6117c67e06dc9ce9c478a3abe75b5926de0 @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ab1a9b5b78de7c00b38357b1df08e82ce5608a14f8c675ac20c5f2dad5212f50 -R 3c0b7fe68f1994f5b25e0793fbe9ed85 -U drh -Z 1a8e88290e38fd7fb987aae4e5fe24f2 +P b275ad250d8aa286829647967ab7e75fcd2b5674caab1a34eab59d8486a34cd5 +R ab60919561ef0e99edc2361b1091371b +U dan +Z 0db8909dc048078c264e1babf0e1620f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 71e47ab492..9f31c4ac6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b275ad250d8aa286829647967ab7e75fcd2b5674caab1a34eab59d8486a34cd5 \ No newline at end of file +3409fd4150df059d7308f79fa3672a330af9cefe2ad9120c3da5ef1413921e96 \ No newline at end of file diff --git a/test/altermalloc2.test b/test/altermalloc2.test index 3d22ad9453..a90be88cf5 100644 --- a/test/altermalloc2.test +++ b/test/altermalloc2.test @@ -26,6 +26,11 @@ do_execsql_test 1.0 { } faultsim_save_and_close +set ::TMPDBERROR [list 1 \ + {unable to open a temporary database file for storing temporary tables} +] + + do_faultsim_test 1 -prep { faultsim_restore_and_reopen } -body { @@ -33,7 +38,7 @@ do_faultsim_test 1 -prep { ALTER TABLE t1 RENAME abcd TO dcba } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } catch {db close} @@ -52,7 +57,7 @@ do_faultsim_test 2 -prep { ALTER TABLE t1 RENAME abcd TO dcba } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } @@ -70,7 +75,7 @@ do_faultsim_test 3 -prep { ALTER TABLE t1 RENAME abcd TO dcba } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } reset_db @@ -95,7 +100,7 @@ do_faultsim_test 4 -faults oom-* -prep { ALTER TABLE rr RENAME a TO c; } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } reset_db @@ -116,7 +121,7 @@ do_faultsim_test 5 -faults oom-* -prep { ALTER TABLE rr RENAME TO c; } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } finish_test diff --git a/test/altermalloc3.test b/test/altermalloc3.test index 4c10f48fed..7023b1c0f6 100644 --- a/test/altermalloc3.test +++ b/test/altermalloc3.test @@ -21,6 +21,10 @@ ifcapable !altertable { return } +set ::TMPDBERROR [list 1 \ + {unable to open a temporary database file for storing temporary tables} +] + do_execsql_test 1.0 { CREATE TABLE x1( one, two, three, PRIMARY KEY(one), @@ -40,7 +44,7 @@ do_faultsim_test 1 -prep { } -body { execsql { ALTER TABLE t1 DROP COLUMN c } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } #------------------------------------------------------------------------- @@ -72,7 +76,7 @@ do_faultsim_test 2.2 -prep { ALTER TABLE t2 RENAME TO t2x; } } -test { - faultsim_test_result {0 {}} + faultsim_test_result {0 {}} $::TMPDBERROR } finish_test From f17f60755625e934036ff0b3243fd579fe0359af Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 21:20:46 +0000 Subject: [PATCH 14/14] Fix a test in without_rowid1.test so that it is disabled without ALTER TABLE support, as it uses ALTER TABLE. FossilOrigin-Name: ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/without_rowid1.test | 23 ++++++++++++----------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 3ffebc56b5..903db79b3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\ssome\sOOM\stests\sof\sthe\sALTER\sTABLE\scommand\sto\saccount\sfor\san\serror\smessage\swhich\smay\sbe\sreturned\sif\sopening\sthe\stemp\sdb\sfails. -D 2022-02-11T19:41:03.848 +C Fix\sa\stest\sin\swithout_rowid1.test\sso\sthat\sit\sis\sdisabled\swithout\nALTER\sTABLE\ssupport,\sas\sit\suses\sALTER\sTABLE. +D 2022-02-11T21:20:46.962 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1826,7 +1826,7 @@ F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f1982 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 F test/with6.test 661d7e416bef6c0a2556b2c9f0c8178a5b15932bed65246abed99723a8d4e7c0 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 78fd9b437f4cdb46f76e6a510d545334e4f58e3e4ce37aaf19384eda5b27de8c +F test/without_rowid1.test a5210b8770dc4736bca4e74bc96588f43025ad03ad6a80f885afd36d9890e217 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a @@ -1944,8 +1944,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b275ad250d8aa286829647967ab7e75fcd2b5674caab1a34eab59d8486a34cd5 -R ab60919561ef0e99edc2361b1091371b -U dan -Z 0db8909dc048078c264e1babf0e1620f +P 3409fd4150df059d7308f79fa3672a330af9cefe2ad9120c3da5ef1413921e96 +R 11d69b7df4beb804da28e670c98327ec +U drh +Z 9996eb8f83b13066aef559fa4b83d323 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9f31c4ac6d..476053a91b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3409fd4150df059d7308f79fa3672a330af9cefe2ad9120c3da5ef1413921e96 \ No newline at end of file +ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 \ No newline at end of file diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 1191115527..3c33f733a1 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -475,15 +475,16 @@ ifcapable altertable { # Omit an assert() from 2013 that no longer serves any purpose and # is no longer always true. # -reset_db -do_execsql_test 15.1 { - PRAGMA writable_schema=ON; - CREATE TABLE sqlite_sequence (name PRIMARY KEY) WITHOUT ROWID; - PRAGMA writable_schema=OFF; - CREATE TABLE c1(x); - INSERT INTO sqlite_sequence(name) VALUES('c0'),('c1'),('c2'); - ALTER TABLE c1 RENAME TO a; - SELECT name FROM sqlite_sequence ORDER BY +name; -} {a c0 c2} - +ifcapable altertable { + reset_db + do_execsql_test 15.1 { + PRAGMA writable_schema=ON; + CREATE TABLE sqlite_sequence (name PRIMARY KEY) WITHOUT ROWID; + PRAGMA writable_schema=OFF; + CREATE TABLE c1(x); + INSERT INTO sqlite_sequence(name) VALUES('c0'),('c1'),('c2'); + ALTER TABLE c1 RENAME TO a; + SELECT name FROM sqlite_sequence ORDER BY +name; + } {a c0 c2} +} finish_test