From 5a80050dd33e46cc70ac2ecfb30b52f39dce8363 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Feb 2022 16:43:30 +0000 Subject: [PATCH 01/56] Allow ALTER TABLE RENAME COLUMN to proceed even if there are errors in the schema, as long as PRAGMA writable_schema=ON is active. FossilOrigin-Name: 197cbabf1767d0603928462fb75cf8100f6999f725e0db60d096c7ca20e3da28 --- manifest | 17 +++++++------ manifest.uuid | 2 +- src/alter.c | 48 ++++++++++++++++++++++++------------ test/altercol.test | 61 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 104 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 4eafb3043f..eff80ce005 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\svarious\sharmless\scompiler\swarnings. -D 2022-02-04T13:15:01.508 +C Allow\sALTER\sTABLE\sRENAME\sCOLUMN\sto\sproceed\seven\sif\sthere\sare\serrors\sin\nthe\sschema,\sas\slong\sas\sPRAGMA\swritable_schema=ON\sis\sactive. +D 2022-02-04T16:43:30.569 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c e8ac1df663bf4ec74920edd1299435f2a616d2404de0ac4013c151ea4e7a11f2 +F src/alter.c 11c8e4d382632a024c19fa09131d271c8c36f5b520023066e08408973a20e82d F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c f26d400f3ffe2cdca01406bca70e5f58c5488bf165b4fc37c228136dfcf1b583 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -657,7 +657,7 @@ F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680f F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test 48967abae0494d9a300d1c92473d99fcb66edfcc23579c89322f033f49410adc -F test/altercol.test 9471187fe155d9c4211ae185e104ff48ce8f114262ee1256cf1e110b339c725f +F test/altercol.test d4f25038a7a72c38267f99ff7c0153d720c0a908321bbbf0639c301e6ea1c57c F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12 F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 @@ -1943,8 +1943,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9f67ad00cd38b7c5ec6d14b379e1a611777bbdf6901d843a80712ba7d94d6d33 -R ed2fd6b08e6120318ad847a61dee5a51 +P 70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf +R ade5a35b1c4e6334138f31a1e28c7fb0 +T *branch * relaxed-alter-table +T *sym-relaxed-alter-table * +T -sym-trunk * U drh -Z 871646465b8062211df8c4f3cf586a8c +Z 7858525677fe7d863fef5513c510c7f5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2dd02dd9db..dd1dfb7900 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf \ No newline at end of file +197cbabf1767d0603928462fb75cf8100f6999f725e0db60d096c7ca20e3da28 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 4de7cc51d3..5cf28147c2 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1427,7 +1427,7 @@ static void renameParseCleanup(Parse *pParse){ /* ** SQL function: ** -** sqlite_rename_column(zSql, iCol, bQuote, zNew, zTable, zOld) +** sqlite_rename_column(SQL,TYPE,OBJ,DB,TABLE,COL,NEWNAME,QUOTE,TEMP) ** ** 0. zSql: SQL statement to rewrite ** 1. type: Type of object ("table", "view" etc.) @@ -1445,7 +1445,8 @@ static void renameParseCleanup(Parse *pParse){ ** ** This function is used internally by the ALTER TABLE RENAME COLUMN command. ** It is only accessible to SQL created using sqlite3NestedParse(). It is -** not reachable from ordinary SQL passed into sqlite3_prepare(). +** not reachable from ordinary SQL passed into sqlite3_prepare() unless the +** SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test setting is enabled. */ static void renameColumnFunc( sqlite3_context *context, @@ -1594,7 +1595,9 @@ static void renameColumnFunc( renameColumnFunc_done: if( rc!=SQLITE_OK ){ - if( sParse.zErrMsg ){ + if( sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[0]); + }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); }else{ sqlite3_result_error_code(context, rc); @@ -1818,10 +1821,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } -/* -** The implementation of an SQL scalar function that rewrites DDL statements -** so that any string literals that use double-quotes are modified so that -** they use single quotes. +/* SQL function: sqlite_rename_quotefix(DB,SQL) +** +** Rewrite the DDL statement "SQL" so that any string literals that use +** double-quotes use single quotes instead. ** ** Two arguments must be passed: ** @@ -1840,6 +1843,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ ** returns the string: ** ** CREATE VIEW v1 AS SELECT "a", 'string' FROM t1 +** +** If there is a error in the input SQL, then raise an error, except +** if PRAGMA writable_schema=ON, then just return the input string +** unmodified following an error. */ static void renameQuotefixFunc( sqlite3_context *context, @@ -1914,7 +1921,11 @@ static void renameQuotefixFunc( renameTokenFree(db, sCtx.pList); } if( rc!=SQLITE_OK ){ - sqlite3_result_error_code(context, rc); + if( sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[1]); + }else{ + sqlite3_result_error_code(context, rc); + } } renameParseCleanup(&sParse); } @@ -1926,7 +1937,8 @@ static void renameQuotefixFunc( sqlite3BtreeLeaveAll(db); } -/* +/* Function: sqlite_rename_test(DB,SQL,TYPE,NAME,ISTEMP,WHEN,DQS) +** ** An SQL user function that checks that there are no parse or symbol ** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement. ** After an ALTER TABLE .. RENAME operation is performed and the schema @@ -1941,11 +1953,13 @@ static void renameQuotefixFunc( ** 5: "when" part of error message. ** 6: True to disable the DQS quirk when parsing SQL. ** -** Unless it finds an error, this function normally returns NULL. However, it -** returns integer value 1 if: +** The return value is computed as follows: ** -** * the SQL argument creates a trigger, and -** * the table that the trigger is attached to is in database zDb. +** A. If an error is seen and not in PRAGMA writable_schema=ON mode, +** then raise the error. +** B. Else if a trigger is created and the the table that the trigger is +** attached to is in database zDb, then return 1. +** C. Otherwise return NULL. */ static void renameTableTest( sqlite3_context *context, @@ -1990,12 +2004,16 @@ static void renameTableTest( if( rc==SQLITE_OK ){ int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema); int i2 = sqlite3FindDbName(db, zDb); - if( i1==i2 ) sqlite3_result_int(context, 1); + if( i1==i2 ){ + /* Handle output case B */ + sqlite3_result_int(context, 1); + } } } } - if( rc!=SQLITE_OK && zWhen ){ + if( rc!=SQLITE_OK && !sqlite3WritableSchema(db) ){ + /* Output case A */ renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse); } renameParseCleanup(&sParse); diff --git a/test/altercol.test b/test/altercol.test index 10ff9e773f..1d31e4ec06 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -553,8 +553,9 @@ do_execsql_test 13.1.3 { sqlite3_db_config db DEFENSIVE 0 do_execsql_test 13.1.4 { - PRAGMA writable_schema = 1; + PRAGMA writable_schema = ON; UPDATE sqlite_master SET sql = 'CREATE INDEX x1i ON x1(j)' WHERE name='x1i'; + PRAGMA writable_schema = OFF; } {} do_catchsql_test 13.1.5 { @@ -562,7 +563,9 @@ do_catchsql_test 13.1.5 { } {1 {error in index x1i: no such column: j}} do_execsql_test 13.1.6 { + PRAGMA writable_schema = ON; UPDATE sqlite_master SET sql = '' WHERE name='x1i'; + PRAGMA writable_schema = OFF; } {} do_catchsql_test 13.1.7 { @@ -570,7 +573,9 @@ do_catchsql_test 13.1.7 { } {1 {error in index x1i: }} do_execsql_test 13.1.8 { + PRAGMA writable_schema = ON; DELETE FROM sqlite_master WHERE name = 'x1i'; + PRAGMA writable_schema = OFF; } do_execsql_test 13.2.0 { @@ -861,5 +866,59 @@ do_execsql_test 23.0 { } {ok {CREATE TABLE t1("x" "b",c)}} +# 2022-02-04 +# Do not complain about syntax errors in the schema if +# in PRAGMA writable_schema=ON mode. +# +reset_db +do_execsql_test 23.0 { + CREATE TABLE t1(a INT, b REAL, c TEXT, d BLOB, e ANY); + CREATE INDEX t1abx ON t1(a, b, a+b) WHERE c IS NOT NULL; + CREATE VIEW t2 AS SELECT a+10, b*5.0, xyz FROM t1; -- unknown column "xyz" + CREATE TABLE schema_copy(name TEXT, sql TEXT); + INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; +} {} +do_catchsql_test 23.1 { + ALTER TABLE t1 RENAME COLUMN e TO eeee; +} {1 {error in view t2: no such column: xyz}} +do_execsql_test 23.2 { + SELECT name, sql FROM sqlite_master + EXCEPT SELECT name, sql FROM schema_copy; +} {} +do_execsql_test 23.3 { + BEGIN; + PRAGMA writable_schema=ON; + ALTER TABLE t1 RENAME COLUMN e TO eeee; + PRAGMA writable_schema=OFF; + SELECT name FROM sqlite_master + WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); + ROLLBACK; +} {t1} +do_execsql_test 23.10 { + DROP VIEW t2; + CREATE TRIGGER r3 AFTER INSERT ON t1 BEGIN + INSERT INTO t3(x,y) VALUES(new.a, new.b); + INSERT INTO t4(p) VALUES(new.c); -- no such table "t4" + END; + DELETE FROM schema_copy; + INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; +} {} +do_catchsql_test 23.11 { + ALTER TABLE t1 RENAME COLUMN e TO eeee; +} {1 {error in trigger r3: no such table: main.t3}} +do_execsql_test 23.12 { + SELECT name, sql FROM sqlite_master + EXCEPT SELECT name, sql FROM schema_copy; +} {} +do_execsql_test 23.13 { + BEGIN; + PRAGMA writable_schema=ON; + ALTER TABLE t1 RENAME COLUMN e TO eeee; + PRAGMA writable_schema=OFF; + SELECT name FROM sqlite_master + WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); + ROLLBACK; +} {t1} + finish_test From 0fab10991bdfae73129e5b664248c945deb967c9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Feb 2022 19:13:18 +0000 Subject: [PATCH 02/56] Add a compile-time option to include vt02.c in fuzzcheck. FossilOrigin-Name: c404c8c72600c11b181519d269bf949aff304eaafb90a50d1415c6fe84d2b092 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 12 ++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4eafb3043f..83f6203255 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\svarious\sharmless\scompiler\swarnings. -D 2022-02-04T13:15:01.508 +C Add\sa\scompile-time\soption\sto\sinclude\svt02.c\sin\sfuzzcheck. +D 2022-02-04T19:13:18.472 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1063,7 +1063,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c bdb852815048a0beebbe5768bca61e75295324a811a8d7216f97b96501befd1e +F test/fuzzcheck.c e34696a5db46738118b2efd14fb71f8458ecf0f482df8bbae18fa1d64db9ab7b F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1943,8 +1943,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 9f67ad00cd38b7c5ec6d14b379e1a611777bbdf6901d843a80712ba7d94d6d33 -R ed2fd6b08e6120318ad847a61dee5a51 +P 70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf +R 7698284cef9bf4071c753bc4d6dcc55e U drh -Z 871646465b8062211df8c4f3cf586a8c +Z f337e6cf2658096055fbff9c10758499 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2dd02dd9db..9c11d7db6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf \ No newline at end of file +c404c8c72600c11b181519d269bf949aff304eaafb90a50d1415c6fe84d2b092 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index f5a7b092e3..2ea0898efa 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -156,6 +156,14 @@ static struct GlobalVars { char zTestName[100]; /* Name of current test */ } g; +/* +** Include the external vt02.c module, if requested by compile-time +** options. +*/ +#ifdef VT02_SOURCES +# include "vt02.c" +#endif + /* ** Print an error message and quit. */ @@ -1052,6 +1060,10 @@ int runCombinedDbSqlInput( ** deserialize to do this because deserialize depends on ATTACH */ sqlite3_set_authorizer(cx.db, block_troublesome_sql, 0); +#ifdef VT02_SOURCES + sqlite3_vt02_init(cx.db, 0, 0); +#endif + /* Consistent PRNG seed */ #ifdef SQLITE_TESTCTRL_PRNG_SEED sqlite3_table_column_metadata(cx.db, 0, "x", 0, 0, 0, 0, 0, 0); From 10d29c7a94f1634a7d8a95490340e863ad7220d6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Feb 2022 20:07:24 +0000 Subject: [PATCH 03/56] One more case of disabling errors for ALTER TABLE RENAME when writable_schema=ON. FossilOrigin-Name: c52d0dd8f4f8fab4c3f33cbd26b4012569e76562282e85654018c836dca7b564 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/alter.c | 4 +++- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index eff80ce005..5b12553cad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sALTER\sTABLE\sRENAME\sCOLUMN\sto\sproceed\seven\sif\sthere\sare\serrors\sin\nthe\sschema,\sas\slong\sas\sPRAGMA\swritable_schema=ON\sis\sactive. -D 2022-02-04T16:43:30.569 +C One\smore\scase\sof\sdisabling\serrors\sfor\sALTER\sTABLE\sRENAME\swhen\nwritable_schema=ON. +D 2022-02-04T20:07:24.664 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 11c8e4d382632a024c19fa09131d271c8c36f5b520023066e08408973a20e82d +F src/alter.c 1cf8dfe6d87b4af6e3c2113e08b483f2e92ea9303a70daf75ddc244be3aa7dd7 F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c f26d400f3ffe2cdca01406bca70e5f58c5488bf165b4fc37c228136dfcf1b583 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1943,11 +1943,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 70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf -R ade5a35b1c4e6334138f31a1e28c7fb0 -T *branch * relaxed-alter-table -T *sym-relaxed-alter-table * -T -sym-trunk * +P 197cbabf1767d0603928462fb75cf8100f6999f725e0db60d096c7ca20e3da28 +R 6e6953a314ca3fd9224d68be73afce7b U drh -Z 7858525677fe7d863fef5513c510c7f5 +Z 4d8bc85d83a2c54196b606a1a5f7ecb7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dd1dfb7900..07f28dbf26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -197cbabf1767d0603928462fb75cf8100f6999f725e0db60d096c7ca20e3da28 \ No newline at end of file +c52d0dd8f4f8fab4c3f33cbd26b4012569e76562282e85654018c836dca7b564 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 5cf28147c2..fa4fcb3c0d 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1796,7 +1796,9 @@ static void renameTableFunc( rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); } if( rc!=SQLITE_OK ){ - if( sParse.zErrMsg ){ + if( sqlite3WritableSchema(db) ){ + sqlite3_result_value(context, argv[3]); + }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); }else{ sqlite3_result_error_code(context, rc); From bcd60d20a3a2a5133be00a3197ae12718ad92bc0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Feb 2022 20:16:00 +0000 Subject: [PATCH 04/56] Test case for permissive ALTER TABLE RENAME when writable_schema=ON. FossilOrigin-Name: 7ee44f66c896cdc7b6980811e8e4537dbd63b23060ead0104f25132d955890af --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/altercol.test | 12 +++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5b12553cad..e75d36cda5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C One\smore\scase\sof\sdisabling\serrors\sfor\sALTER\sTABLE\sRENAME\swhen\nwritable_schema=ON. -D 2022-02-04T20:07:24.664 +C Test\scase\sfor\spermissive\sALTER\sTABLE\sRENAME\swhen\swritable_schema=ON. +D 2022-02-04T20:16:00.842 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -657,7 +657,7 @@ F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680f F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test 48967abae0494d9a300d1c92473d99fcb66edfcc23579c89322f033f49410adc -F test/altercol.test d4f25038a7a72c38267f99ff7c0153d720c0a908321bbbf0639c301e6ea1c57c +F test/altercol.test 8465ca659c2c55a359cf16cc261df4fcb5c45a5f104a50827c337ae66c09dc15 F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12 F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 @@ -1943,8 +1943,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 197cbabf1767d0603928462fb75cf8100f6999f725e0db60d096c7ca20e3da28 -R 6e6953a314ca3fd9224d68be73afce7b +P c52d0dd8f4f8fab4c3f33cbd26b4012569e76562282e85654018c836dca7b564 +R 1c6dd2835590d26c0e3077ae9f27c2cc U drh -Z 4d8bc85d83a2c54196b606a1a5f7ecb7 +Z 70501401ac6ff085442e81208283c214 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 07f28dbf26..bc6b1fdec1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c52d0dd8f4f8fab4c3f33cbd26b4012569e76562282e85654018c836dca7b564 \ No newline at end of file +7ee44f66c896cdc7b6980811e8e4537dbd63b23060ead0104f25132d955890af \ No newline at end of file diff --git a/test/altercol.test b/test/altercol.test index 1d31e4ec06..e39793aa9f 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -919,6 +919,16 @@ do_execsql_test 23.13 { WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); ROLLBACK; } {t1} - +do_execsql_test 23.20 { + CREATE TABLE t4(id INTEGER PRIMARY KEY, c1 INT, c2 INT); + CREATE VIEW t4v1 AS SELECT id, c1, c99 FROM t4; + DELETE FROM schema_copy; + INSERT INTO schema_copy SELECT name, sql FROM sqlite_schema; + BEGIN; + PRAGMA writable_schema=ON; + ALTER TABLE t4 RENAME to t4new; + SELECT name FROM sqlite_schema WHERE (name,sql) NOT IN (SELECT * FROM schema_copy); + ROLLBACK; +} {t4new} finish_test From d515ea5b560b676709b417b1da18d4a57d0070c6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 01:01:07 +0000 Subject: [PATCH 05/56] Typo fixes in documentation. FossilOrigin-Name: 1ec747d1c34ced9877709dd306e674376e79145de08b9c316d12bc5e06efc03e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 83f6203255..eb199a32b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\scompile-time\soption\sto\sinclude\svt02.c\sin\sfuzzcheck. -D 2022-02-04T19:13:18.472 +C Typo\sfixes\sin\sdocumentation. +D 2022-02-05T01:01:07.934 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/resolve.c 0dd8e23fda88411d63b2e6650f2380fdb08e88112e9a095fc23d5a08de4b2641 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c a6d2d4bed279d7fe4fcedaf297eaf6441e8e17c6e3947a32d24d23be52ac02f2 F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 -F src/sqlite.h.in d4daed3b2deb2e43df7f12be119b1b17a2954feadc33d521565bacbd072bfcb6 +F src/sqlite.h.in 5299fd65b0adbc1564c5b9577c3f7c2c5b76ac30d15de66513c87dfa97da69f6 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 F src/sqliteInt.h 838df3e9ba9390058076d2f50c7efde9e0e8747303e788cf5bbe05402ab10924 @@ -1943,8 +1943,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 70049342d5ad57ea3e863bba19253934b868bacdd1c26c9371bac024a829badf -R 7698284cef9bf4071c753bc4d6dcc55e +P c404c8c72600c11b181519d269bf949aff304eaafb90a50d1415c6fe84d2b092 +R d5f3752b899689a9bd8557b55cf80474 U drh -Z f337e6cf2658096055fbff9c10758499 +Z 2780746ce8640dfd4abd7ce98a4b92f4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9c11d7db6b..9c79c0ee09 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c404c8c72600c11b181519d269bf949aff304eaafb90a50d1415c6fe84d2b092 \ No newline at end of file +1ec747d1c34ced9877709dd306e674376e79145de08b9c316d12bc5e06efc03e \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 42cc332962..34894ad49a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -9642,7 +9642,7 @@ int sqlite3_vtab_distinct(sqlite3_index_info*); ** to SQLite that the virtual table does or does not want to process ** the IN operator all-at-once, respectively. ^Thus when the third ** parameter (F) is non-negative, this interface is the mechanism by -** which the virtual table tells SQLite how it wants to process in +** which the virtual table tells SQLite how it wants to process the ** IN operator. ** ** @@ -9668,7 +9668,7 @@ int sqlite3_vtab_distinct(sqlite3_index_info*); ** )^ ** ** ^If either or both of the conditions above are false, then SQLite uses -** the traditional one-at-a-time processing strategy for IN constraint. +** the traditional one-at-a-time processing strategy for the IN constraint. ** ^If both conditions are true, then the argvIndex-th parameter to the ** xFilter method will be an [sqlite3_value] that appears to be NULL, ** but which can be passed to [sqlite3_vtab_in_first()] and From 6c758900c2729d2ae5e6784cd2d761c0be79179e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 11:13:26 +0000 Subject: [PATCH 06/56] Fix documentation typo. FossilOrigin-Name: 1a7d8bb5ea0d0e0c250312f89a701c0274cfbcaef9cd71995fb83bf939668504 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index eb199a32b3..6fb2c72e8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Typo\sfixes\sin\sdocumentation. -D 2022-02-05T01:01:07.934 +C Fix\sdocumentation\stypo. +D 2022-02-05T11:13:26.863 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/resolve.c 0dd8e23fda88411d63b2e6650f2380fdb08e88112e9a095fc23d5a08de4b2641 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c a6d2d4bed279d7fe4fcedaf297eaf6441e8e17c6e3947a32d24d23be52ac02f2 F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 -F src/sqlite.h.in 5299fd65b0adbc1564c5b9577c3f7c2c5b76ac30d15de66513c87dfa97da69f6 +F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 F src/sqliteInt.h 838df3e9ba9390058076d2f50c7efde9e0e8747303e788cf5bbe05402ab10924 @@ -1943,8 +1943,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 c404c8c72600c11b181519d269bf949aff304eaafb90a50d1415c6fe84d2b092 -R d5f3752b899689a9bd8557b55cf80474 +P 1ec747d1c34ced9877709dd306e674376e79145de08b9c316d12bc5e06efc03e +R 95f25f88b2d33e679a50c06f4f2d2bb8 U drh -Z 2780746ce8640dfd4abd7ce98a4b92f4 +Z 3c08ad79df7ce58c2d82d934ab4c1b9f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9c79c0ee09..b3b0890ddf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ec747d1c34ced9877709dd306e674376e79145de08b9c316d12bc5e06efc03e \ No newline at end of file +1a7d8bb5ea0d0e0c250312f89a701c0274cfbcaef9cd71995fb83bf939668504 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 34894ad49a..a72af1c15b 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -7211,7 +7211,7 @@ struct sqlite3_index_info { ** destructor. ** ** ^If the third parameter (the pointer to the sqlite3_module object) is -** NULL then no new module is create and any existing modules with the +** NULL then no new module is created and any existing modules with the ** same name are dropped. ** ** See also: [sqlite3_drop_modules()] From 569c10566e6c24ecd27274149598c0aed801aa1a Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 12:05:43 +0000 Subject: [PATCH 07/56] Fix a NULL pointer dereference that can occur after OOM. Problem introduced by check-in [197cbabf1767d060]. FossilOrigin-Name: d4e6b9f0f7567b76760a667a701bca4d6158ade39f9a69d205b583c5a1c0c7f4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e75d36cda5..c27138ac77 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scase\sfor\spermissive\sALTER\sTABLE\sRENAME\swhen\swritable_schema=ON. -D 2022-02-04T20:16:00.842 +C Fix\sa\sNULL\spointer\sdereference\sthat\scan\soccur\safter\sOOM.\s\sProblem\nintroduced\sby\scheck-in\s[197cbabf1767d060]. +D 2022-02-05T12:05:43.330 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 1cf8dfe6d87b4af6e3c2113e08b483f2e92ea9303a70daf75ddc244be3aa7dd7 +F src/alter.c af5606a4d7f35a13ce577d96f222d5e6a3c0c23de5b903dd53f28f5a4f57a064 F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c f26d400f3ffe2cdca01406bca70e5f58c5488bf165b4fc37c228136dfcf1b583 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1943,8 +1943,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 c52d0dd8f4f8fab4c3f33cbd26b4012569e76562282e85654018c836dca7b564 -R 1c6dd2835590d26c0e3077ae9f27c2cc +P 7ee44f66c896cdc7b6980811e8e4537dbd63b23060ead0104f25132d955890af +R c65f0ed686c23b08347808d1932a2ebf U drh -Z 70501401ac6ff085442e81208283c214 +Z 037e4354fb3fdd9950f1ae80dccf8a0d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bc6b1fdec1..bdb43d96f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ee44f66c896cdc7b6980811e8e4537dbd63b23060ead0104f25132d955890af \ No newline at end of file +d4e6b9f0f7567b76760a667a701bca4d6158ade39f9a69d205b583c5a1c0c7f4 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index fa4fcb3c0d..dfffcc9b80 100644 --- a/src/alter.c +++ b/src/alter.c @@ -2014,7 +2014,7 @@ static void renameTableTest( } } - if( rc!=SQLITE_OK && !sqlite3WritableSchema(db) ){ + if( rc!=SQLITE_OK && zWhen && !sqlite3WritableSchema(db) ){ /* Output case A */ renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse); } From 4734b3f9b741a6d744dd20338e515c4fdfe9a00c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 13:27:52 +0000 Subject: [PATCH 08/56] Update stale evidence marks on sqlite3_vtab_rhs_value() test cases. FossilOrigin-Name: 46744b83d5e1335bcbc59f9625e8ade3f360469d17f34e8d996f077ba9afa89e --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/vtabrhs1.test | 12 ++++++------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 080e8c8787..2c7f8ab2ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sPRAGMA\swritable_schema=ON,\sallow\sALTER\sTABLE\sto\sproceed\seven\sif\sthere\nare\sentries\sin\sthe\ssqlite_schema\stable\sthat\sdo\snot\sparse. -D 2022-02-05T12:39:17.862 +C Update\sstale\sevidence\smarks\son\ssqlite3_vtab_rhs_value()\stest\scases. +D 2022-02-05T13:27:52.187 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1728,7 +1728,7 @@ F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bd F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad F test/vtabdistinct.test 7688f0889358f849fd60bbfde1ded38b014b18066076d4bfbb75395804dfe072 F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/vtabrhs1.test c138346be341916ecc9d918dcfc2657d27bce211a350a82b01d62d224b167b56 +F test/vtabrhs1.test 9b5ecbc74a689500c33a4b2b36761f9bcc22fcc4e3f9d21066ee0c9c74cf5f6c F test/wal.test b7cc6984709f54afbf8441747ced1f646af120bf0c1b1d847bfa39306fbea089 F test/wal2.test 31f6e2c404b9f2cdf9ca19b105a1742fdc19653c2c936da39e3658c617524046 F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 @@ -1943,9 +1943,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 1a7d8bb5ea0d0e0c250312f89a701c0274cfbcaef9cd71995fb83bf939668504 d4e6b9f0f7567b76760a667a701bca4d6158ade39f9a69d205b583c5a1c0c7f4 -R d0cb6fe0638aaa24f3c3d36cba7c33ac -T +closed d4e6b9f0f7567b76760a667a701bca4d6158ade39f9a69d205b583c5a1c0c7f4 +P fc4c82e5694cbdae13f2cb90e5368ba9f6b826a220a81de32ead2ffe1bc5f31f +R 77f0ae55ad3d60a43a54eedbd1ba900e U drh -Z 7b88963ec7e0e977f5bbe33c546cedf5 +Z 7f71ba7f9f59dcc236766823f2cedb34 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 36b3ddf94f..3b2d46eca0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc4c82e5694cbdae13f2cb90e5368ba9f6b826a220a81de32ead2ffe1bc5f31f \ No newline at end of file +46744b83d5e1335bcbc59f9625e8ade3f360469d17f34e8d996f077ba9afa89e \ No newline at end of file diff --git a/test/vtabrhs1.test b/test/vtabrhs1.test index 48fb6f1f6f..0476a36f90 100644 --- a/test/vtabrhs1.test +++ b/test/vtabrhs1.test @@ -22,13 +22,13 @@ ifcapable !vtab { } load_static_extension db qpvtab -# EVIDENCE-OF: R-12211-29175 When the sqlite3_vtab_rhs_value(P,J,V) +# EVIDENCE-OF: R-60223-49197 When the sqlite3_vtab_rhs_value(P,J,V) # interface is invoked from within the xBestIndex method of a virtual # table implementation, with P being a copy of the sqlite3_index_info # object pointer passed into xBestIndex and J being a 0-based index into -# P->aConstraint[], then this routine attempts to set *V to be the -# value on the right-hand side of that constraint if the right-hand side -# is a known constant. +# P->aConstraint[], then this routine attempts to set *V to the value +# of the right-hand operand of that constraint if the right-hand operand +# is known. # do_execsql_test 1.1 { SELECT rhs FROM qpvtab @@ -56,8 +56,8 @@ do_execsql_test 1.5 { AND a GLOB x'0123' } {x'0123'} -# EVIDENCE-OF: R-29440-53190 If the right-hand side of the constraint is -# not known, then *V is set to a NULL pointer. +# EVIDENCE-OF: R-37799-62852 If the right-hand operand is not known, +# then *V is set to a NULL pointer. # do_execsql_test 2.1 { SELECT typeof(rhs) FROM qpvtab WHERE cn='a' AND a=format('abc'); From 796588ae07590acbd57fcd1509aa4c9706149a7d Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 21:49:47 +0000 Subject: [PATCH 09/56] Record the position of many identifiers in the parse using the new Expr.w.iOfst field. This is done with the idea of providing offset results for sqlite3_error_offset() for a more kinds of errors, though that part is not yet implemented. FossilOrigin-Name: 32a3a53b62ab09ac2212905e7f42fe6f1b09d891e015203e5caf4cb16262f18e --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/parse.y | 28 +++++++++------------------- src/select.c | 28 +++++++++++++++------------- src/sqliteInt.h | 5 ++++- src/treeview.c | 2 +- src/where.c | 4 ++-- src/wherecode.c | 2 +- src/whereexpr.c | 6 +++--- 9 files changed, 48 insertions(+), 53 deletions(-) diff --git a/manifest b/manifest index 2c7f8ab2ab..de3dcd2159 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sstale\sevidence\smarks\son\ssqlite3_vtab_rhs_value()\stest\scases. -D 2022-02-05T13:27:52.187 +C Record\sthe\sposition\sof\smany\sidentifiers\sin\sthe\sparse\susing\sthe\snew\nExpr.w.iOfst\sfield.\s\sThis\sis\sdone\swith\sthe\sidea\sof\sproviding\soffset\nresults\sfor\ssqlite3_error_offset()\sfor\sa\smore\skinds\sof\serrors,\sthough\sthat\npart\sis\snot\syet\simplemented. +D 2022-02-05T21:49:47.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -541,7 +541,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c f6183fb7370425cd8642759693d9994649217cf7111caef89bc2c4946afbc36d F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 04f61db1cdd7036c6d74baad1c342d3e3110cb0765c48fcfd3bdf4e974a1e5bb +F src/parse.y 0b8d621453e18ac2ea15c237c14bd5451478b3f4e13a5a4020153bbb14ec34ee F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -552,12 +552,12 @@ F src/printf.c 975f1f5417f2526365b6e6d7f22332e3e11806dad844701d92846292b654ba9a F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 0dd8e23fda88411d63b2e6650f2380fdb08e88112e9a095fc23d5a08de4b2641 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c a6d2d4bed279d7fe4fcedaf297eaf6441e8e17c6e3947a32d24d23be52ac02f2 +F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 -F src/sqliteInt.h 838df3e9ba9390058076d2f50c7efde9e0e8747303e788cf5bbe05402ab10924 +F src/sqliteInt.h 763162b933c7498d3bd9181688957ca6e7bdd37c5f2000bc08e2ef1c4a2f68a3 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -617,7 +617,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c b74d878aa7c82ec8460779468061a96185e22257f68ab785b69abce354b70446 -F src/treeview.c 9dfdb7ff7f6645d0a6458dbdf4ffac041c071c4533a6db8bb6e502b979ac67bc +F src/treeview.c a84b57d15e46007d8b1ae249344b3f0b7f3c62def908b98baaa54935a57c8476 F src/trigger.c 692972e4393dfc8017a1a527c1ea1b96ce3d101e84584cd832fcfb83d22b50b2 F src/update.c f875b0d59da5c3055a0b2ac20560e1650229c6787e78de5e9836267b5cbb8359 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -639,10 +639,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 31bc1f43b0bf679e93c3e7a7d67cbcaddc7ae746694b149b282427d337b06caa +F src/where.c 4e8f27c9829818a3210e8c97b5c23f7c2fb67e68a5750a3e40384bbed24ce69e F src/whereInt.h 15d2975c3b4c193c78c26674400a840da8647fe1777ae3b026e2d15937b38a03 -F src/wherecode.c 4a0dd0403e1c9b628a420eefbe1d60da0003356de6ee18e6707480c9b995bae7 -F src/whereexpr.c 2da56404a024dc8dc41a31d8b498eed2c7c6b0bb412150d88cb3327516aa3b9f +F src/wherecode.c 6150f51c0368be941fad90a736ce37cc1e2a719876750a3183a516ed256a4cbb +F src/whereexpr.c ee4b962c8f8613afb8cd656b3a470130c42c952dd4af2ad1d2294d37a47bb1f1 F src/window.c dfaec4abc6012cbc18e4a202ca3a5d5a0efcc4011d86a06d882ddaab8aedee4d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1943,8 +1943,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 fc4c82e5694cbdae13f2cb90e5368ba9f6b826a220a81de32ead2ffe1bc5f31f -R 77f0ae55ad3d60a43a54eedbd1ba900e +P 46744b83d5e1335bcbc59f9625e8ade3f360469d17f34e8d996f077ba9afa89e +R 0a4aa7afd9e04bf279efc53c3cded45e U drh -Z 7f71ba7f9f59dcc236766823f2cedb34 +Z 533fa15e28ce8e0df54f074f779eaaaf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3b2d46eca0..5f7530a331 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46744b83d5e1335bcbc59f9625e8ade3f360469d17f34e8d996f077ba9afa89e \ No newline at end of file +32a3a53b62ab09ac2212905e7f42fe6f1b09d891e015203e5caf4cb16262f18e \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 5b83b16b60..b1c50d750d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -659,7 +659,7 @@ selcollist(A) ::= sclp(A) scanpt STAR. { } selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. { Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); - Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); + Expr *pLeft = tokenExpr(pParse, TK_ID, X); Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); A = sqlite3ExprListAppend(pParse,A, pDot); } @@ -1025,10 +1025,7 @@ idlist(A) ::= nm(Y). %include { - /* Construct a new Expr object from a single identifier. Use the - ** new Expr to populate pOut. Set the span of pOut to be the identifier - ** that created the expression. - */ + /* Construct a new Expr object from a single token */ static Expr *tokenExpr(Parse *pParse, int op, Token t){ Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); if( p ){ @@ -1048,6 +1045,7 @@ idlist(A) ::= nm(Y). p->u.zToken = (char*)&p[1]; memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; + p->w.iOfst = (int)(t.z - pParse->zTail); if( sqlite3Isquote(p->u.zToken[0]) ){ sqlite3DequoteExpr(p); } @@ -1068,23 +1066,15 @@ expr(A) ::= LP expr(X) RP. {A = X;} expr(A) ::= id(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} expr(A) ::= JOIN_KW(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} expr(A) ::= nm(X) DOT nm(Y). { - Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); - Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); - if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)temp2, &Y); - sqlite3RenameTokenMap(pParse, (void*)temp1, &X); - } + Expr *temp1 = tokenExpr(pParse,TK_ID,X); + Expr *temp2 = tokenExpr(pParse,TK_ID,Y); A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { - Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); - Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); - Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1); + Expr *temp1 = tokenExpr(pParse,TK_ID,X); + Expr *temp2 = tokenExpr(pParse,TK_ID,Y); + Expr *temp3 = tokenExpr(pParse,TK_ID,Z); Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); - if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)temp3, &Z); - sqlite3RenameTokenMap(pParse, (void*)temp2, &Y); - } A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} @@ -1593,7 +1583,7 @@ expr(A) ::= RAISE LP IGNORE RP. { } } expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP. { - A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); + A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); if( A ) { A->affExpr = (char)T; } diff --git a/src/select.c b/src/select.c index a3985b70af..6719d47471 100644 --- a/src/select.c +++ b/src/select.c @@ -354,14 +354,14 @@ static void addWhereTerm( ExprSetProperty(pEq, EP_FromJoin); assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(pEq, EP_NoReduce); - pEq->iRightJoinTable = pE2->iTable; + pEq->w.iRightJoinTable = pE2->iTable; } *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); } /* ** Set the EP_FromJoin property on all terms of the given expression. -** And set the Expr.iRightJoinTable to iTable for every term in the +** And set the Expr.w.iRightJoinTable to iTable for every term in the ** expression. ** ** The EP_FromJoin property is used on terms of an expression to tell @@ -371,8 +371,8 @@ static void addWhereTerm( ** WHERE clause during join processing but we need to remember that they ** originated in the ON or USING clause. ** -** The Expr.iRightJoinTable tells the WHERE clause processing that the -** expression depends on table iRightJoinTable even if that table is not +** The Expr.w.iRightJoinTable tells the WHERE clause processing that the +** expression depends on table w.iRightJoinTable even if that table is not ** explicitly mentioned in the expression. That information is needed ** for cases like this: ** @@ -390,7 +390,7 @@ void sqlite3SetJoinExpr(Expr *p, int iTable){ ExprSetProperty(p, EP_FromJoin); assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); - p->iRightJoinTable = iTable; + p->w.iRightJoinTable = iTable; if( p->op==TK_FUNCTION ){ assert( ExprUseXList(p) ); if( p->x.pList ){ @@ -406,7 +406,7 @@ void sqlite3SetJoinExpr(Expr *p, int iTable){ } /* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every -** term that is marked with EP_FromJoin and iRightJoinTable==iTable into +** term that is marked with EP_FromJoin and w.iRightJoinTable==iTable into ** an ordinary term that omits the EP_FromJoin mark. ** ** This happens when a LEFT JOIN is simplified into an ordinary JOIN. @@ -414,7 +414,7 @@ void sqlite3SetJoinExpr(Expr *p, int iTable){ static void unsetJoinExpr(Expr *p, int iTable){ while( p ){ if( ExprHasProperty(p, EP_FromJoin) - && (iTable<0 || p->iRightJoinTable==iTable) ){ + && (iTable<0 || p->w.iRightJoinTable==iTable) ){ ExprClearProperty(p, EP_FromJoin); } if( p->op==TK_COLUMN && p->iTable==iTable ){ @@ -3648,9 +3648,9 @@ static Expr *substExpr( ){ if( pExpr==0 ) return 0; if( ExprHasProperty(pExpr, EP_FromJoin) - && pExpr->iRightJoinTable==pSubst->iTable + && pExpr->w.iRightJoinTable==pSubst->iTable ){ - pExpr->iRightJoinTable = pSubst->iNewTable; + pExpr->w.iRightJoinTable = pSubst->iNewTable; } if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable @@ -3689,7 +3689,7 @@ static Expr *substExpr( ExprSetProperty(pNew, EP_CanBeNull); } if( ExprHasProperty(pExpr,EP_FromJoin) ){ - sqlite3SetJoinExpr(pNew, pExpr->iRightJoinTable); + sqlite3SetJoinExpr(pNew, pExpr->w.iRightJoinTable); } sqlite3ExprDelete(db, pExpr); pExpr = pNew; @@ -3854,7 +3854,7 @@ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ renumberCursorDoMapping(pWalker, &pExpr->iTable); } if( ExprHasProperty(pExpr, EP_FromJoin) ){ - renumberCursorDoMapping(pWalker, &pExpr->iRightJoinTable); + renumberCursorDoMapping(pWalker, &pExpr->w.iRightJoinTable); } return WRC_Continue; } @@ -4864,11 +4864,13 @@ static int pushDownWhereTerms( } if( isLeftJoin && (ExprHasProperty(pWhere,EP_FromJoin)==0 - || pWhere->iRightJoinTable!=iCursor) + || pWhere->w.iRightJoinTable!=iCursor) ){ return 0; /* restriction (4) */ } - if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){ + if( ExprHasProperty(pWhere,EP_FromJoin) + && pWhere->w.iRightJoinTable!=iCursor + ){ return 0; /* restriction (5) */ } if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 374fc95541..58fe64ea0a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2824,7 +2824,10 @@ struct Expr { ** TK_VARIABLE: variable number (always >= 1). ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ - int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + union { + int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + int iOfst; /* else: start of token from start of statement */ + } w; AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ union { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL diff --git a/src/treeview.c b/src/treeview.c index 1b19ea6797..86f06e8323 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -412,7 +412,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3_str_appendf(&x, " fg.af=%x.%c", pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); + sqlite3_str_appendf(&x, " iRJT=%d", pExpr->w.iRightJoinTable); } if( ExprHasProperty(pExpr, EP_FromDDL) ){ sqlite3_str_appendf(&x, " DDL"); diff --git a/src/where.c b/src/where.c index bd42789770..41acbe39d6 100644 --- a/src/where.c +++ b/src/where.c @@ -3166,7 +3166,7 @@ static int whereUsablePartialIndex( for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; pExpr = pTerm->pExpr; - if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->w.iRightJoinTable==iTab) && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) && (pTerm->wtFlags & TERM_VNULL)==0 @@ -5146,7 +5146,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - || pTerm->pExpr->iRightJoinTable!=pItem->iCursor + || pTerm->pExpr->w.iRightJoinTable!=pItem->iCursor ){ break; } diff --git a/src/wherecode.c b/src/wherecode.c index 603fcdfd76..79504159a6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1062,7 +1062,7 @@ static void codeCursorHint( if( pTabItem->fg.jointype & JT_LEFT ){ Expr *pExpr = pTerm->pExpr; if( !ExprHasProperty(pExpr, EP_FromJoin) - || pExpr->iRightJoinTable!=pTabItem->iCursor + || pExpr->w.iRightJoinTable!=pTabItem->iCursor ){ sWalker.eCode = 0; sWalker.xExprCallback = codeCursorHintIsOrFunction; diff --git a/src/whereexpr.c b/src/whereexpr.c index ac4f2e1fbe..bcc7bebeb4 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -466,7 +466,7 @@ static int isAuxiliaryVtabOperator( static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ if( pDerived ){ pDerived->flags |= pBase->flags & EP_FromJoin; - pDerived->iRightJoinTable = pBase->iRightJoinTable; + pDerived->w.iRightJoinTable = pBase->w.iRightJoinTable; } } @@ -1111,7 +1111,7 @@ static void exprAnalyze( #endif if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iRightJoinTable); prereqAll |= x; extraRight = x-1; /* ON clause terms may not be used with an index ** on left table of a LEFT JOIN. Ticket #3015 */ @@ -1462,7 +1462,7 @@ static void exprAnalyze( 0, sqlite3ExprDup(db, pRight, 0)); if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ ExprSetProperty(pNewExpr, EP_FromJoin); - pNewExpr->iRightJoinTable = pExpr->iRightJoinTable; + pNewExpr->w.iRightJoinTable = pExpr->w.iRightJoinTable; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); From 4f77c9208a6d9099aafd3406faebdf2b259a35f0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 5 Feb 2022 23:11:19 +0000 Subject: [PATCH 10/56] Enhance sqlite3_error_offset() to report the position of unresolved identifiers. FossilOrigin-Name: 5b8d2577907abda10de29884716bacc10bff0df1451228a0ac40342dbea6d589 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/printf.c | 13 +++++++++++++ src/resolve.c | 1 + src/sqliteInt.h | 1 + 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index de3dcd2159..20ba549bd0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Record\sthe\sposition\sof\smany\sidentifiers\sin\sthe\sparse\susing\sthe\snew\nExpr.w.iOfst\sfield.\s\sThis\sis\sdone\swith\sthe\sidea\sof\sproviding\soffset\nresults\sfor\ssqlite3_error_offset()\sfor\sa\smore\skinds\sof\serrors,\sthough\sthat\npart\sis\snot\syet\simplemented. -D 2022-02-05T21:49:47.746 +C Enhance\ssqlite3_error_offset()\sto\sreport\sthe\sposition\sof\sunresolved\nidentifiers. +D 2022-02-05T23:11:19.818 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -548,16 +548,16 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 7c024d690a3dc93f61830f11f900e4af2357f31d081b0c79099ca5e28919cba7 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c a187dade741c1f09ae118fcbbf0302511807bfc0355880927d7152eb75b8260d -F src/printf.c 975f1f5417f2526365b6e6d7f22332e3e11806dad844701d92846292b654ba9a +F src/printf.c ceadf2ee3ad2f4bb22d4557611b514f51be3ac0ce2b6ebd1d17aed26ce023dc9 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 0dd8e23fda88411d63b2e6650f2380fdb08e88112e9a095fc23d5a08de4b2641 +F src/resolve.c 868a88d47b11f4f6b8b413db72c9290c211972ee91316c1ece318846600ff725 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 -F src/sqliteInt.h 763162b933c7498d3bd9181688957ca6e7bdd37c5f2000bc08e2ef1c4a2f68a3 +F src/sqliteInt.h b6619030ed13b2a8d49c0b5cb0525db1f727966b65ab1ec40b5f11102af7254d F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1943,8 +1943,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 46744b83d5e1335bcbc59f9625e8ade3f360469d17f34e8d996f077ba9afa89e -R 0a4aa7afd9e04bf279efc53c3cded45e +P 32a3a53b62ab09ac2212905e7f42fe6f1b09d891e015203e5caf4cb16262f18e +R d206266e8d498e68ec7df6cacd558558 U drh -Z 533fa15e28ce8e0df54f074f779eaaaf +Z 7fce1180d98a65f136fd63cea97bcf69 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5f7530a331..37dc90b4d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32a3a53b62ab09ac2212905e7f42fe6f1b09d891e015203e5caf4cb16262f18e \ No newline at end of file +5b8d2577907abda10de29884716bacc10bff0df1451228a0ac40342dbea6d589 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 9fea2d6ef0..a8cfc19315 100644 --- a/src/printf.c +++ b/src/printf.c @@ -934,6 +934,19 @@ void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ } } +/* +** If pExpr has a byte offset for the start of a token, record that as +** as the error offset. +*/ +void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ + if( db->errByteOffset>=0 ) return; + while( pExpr && (ExprHasProperty(pExpr,EP_FromJoin) || pExpr->w.iOfst<=0) ){ + pExpr = pExpr->pLeft; + } + if( pExpr==0 ) return; + db->errByteOffset = pExpr->w.iOfst; +} + /* ** Enlarge the memory allocation on a StrAccum object so that it is ** able to accept at least N more bytes of text. diff --git a/src/resolve.c b/src/resolve.c index 78135cf3b4..8250ce9efd 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -620,6 +620,7 @@ static int lookupName( }else{ sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); } + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); pParse->checkSchema = 1; pTopNC->nNcErr++; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 58fe64ea0a..1ed600f4dd 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4995,6 +4995,7 @@ void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*); void sqlite3SelectDestInit(SelectDest*,int,int); Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); void sqlite3RecordErrorByteOffset(sqlite3*,const char*); +void sqlite3RecordErrorOffsetOfExpr(sqlite3*,const Expr*); void sqlite3BackupRestart(sqlite3_backup *); void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); From 62fc069eb490acdd5712be29831bca9da52e5334 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 00:30:04 +0000 Subject: [PATCH 11/56] Further improvements to localization of errors in input SQL. FossilOrigin-Name: fa34676042720161ca03f3926814152eb1d144ec12fd2b44e5429408ea4ad5b0 --- manifest | 18 +++++++-------- manifest.uuid | 2 +- src/expr.c | 14 +++++++----- src/printf.c | 21 +++++++++++++----- src/resolve.c | 53 ++++++++++++++++++++++++--------------------- test/altertab2.test | 2 +- 6 files changed, 63 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index 20ba549bd0..b6e55db69d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\ssqlite3_error_offset()\sto\sreport\sthe\sposition\sof\sunresolved\nidentifiers. -D 2022-02-05T23:11:19.818 +C Further\simprovements\sto\slocalization\sof\serrors\sin\sinput\sSQL. +D 2022-02-06T00:30:04.400 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -503,7 +503,7 @@ F src/date.c 41627dec396f3d33e2c317a065f9d59bb535982b2ea3a561c96e4d4cf1137b65 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d -F src/expr.c 31d23e6b57827b4cb8f0054f44e2ed86feb1dfcaa9b0c4d6c960b42536a17ca0 +F src/expr.c ddb6a18fcb231bd246c5570bc32b888ecfcccf4a145b141f63285b198205e84a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 06e4ac33031b02dde7130c12e79cddf4dc5cfa72b23d8e63a3c26878fc9c1d3c F src/func.c 5a0379450bd19ca5cb2d65327b0df6466a14fa0f06f9355329c3e0eec483519a @@ -548,9 +548,9 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 7c024d690a3dc93f61830f11f900e4af2357f31d081b0c79099ca5e28919cba7 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c a187dade741c1f09ae118fcbbf0302511807bfc0355880927d7152eb75b8260d -F src/printf.c ceadf2ee3ad2f4bb22d4557611b514f51be3ac0ce2b6ebd1d17aed26ce023dc9 +F src/printf.c 88a96f8d7bedee6fa73f6be21a70c21089e772d88d32994b04d50e0bf0f38066 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 868a88d47b11f4f6b8b413db72c9290c211972ee91316c1ece318846600ff725 +F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 @@ -668,7 +668,7 @@ F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cc F test/altermalloc3.test 4660ac6240a8c82ba3947b927612dcc7c05a8eec3fe3c9f38e047ca69a789a33 F test/alterqf.test 3008318ba9e16b4ac0b5f83cf7683caa4b0a3154aafe3b4099838a250d4ba74a F test/altertab.test 7273b8506eab46342be016af78028df49f3bd99037412f997a8f1011b37a6912 -F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b +F test/altertab2.test 62597b6fd08feaba1b6bfe7d31dac6117c67e06dc9ce9c478a3abe75b5926de0 F test/altertab3.test 5929f522fd6fd708396ad9f317d4af9ff1a93e460df85bb1d54d4499eeb94960 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 @@ -1943,8 +1943,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 32a3a53b62ab09ac2212905e7f42fe6f1b09d891e015203e5caf4cb16262f18e -R d206266e8d498e68ec7df6cacd558558 +P 5b8d2577907abda10de29884716bacc10bff0df1451228a0ac40342dbea6d589 +R 62d673014722dadc6f145e57ea78193f U drh -Z 7fce1180d98a65f136fd63cea97bcf69 +Z 3fc4758d5d812a2bf659475da12b12d5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 37dc90b4d6..2dd503b284 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b8d2577907abda10de29884716bacc10bff0df1451228a0ac40342dbea6d589 \ No newline at end of file +fa34676042720161ca03f3926814152eb1d144ec12fd2b44e5429408ea4ad5b0 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index af28fd6d29..4c47f6fe6c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1070,6 +1070,7 @@ Expr *sqlite3ExprFunction( sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } + pNew->w.iOfst = (int)(pToken->z - pParse->zTail); if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] && !pParse->nested @@ -1113,7 +1114,7 @@ void sqlite3ExprFunctionUsable( ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning ** that the schema is possibly tainted). */ - sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName); + sqlite3ErrorMsg(pParse, "unsafe use of %#T()", pExpr); } } } @@ -1169,6 +1170,7 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); return; } x = (ynVar)i; @@ -1196,6 +1198,7 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ pExpr->iColumn = x; if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "too many SQL variables"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); } } @@ -3637,11 +3640,12 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ c = sqlite3DecOrHexToI64(z, &value); if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ #ifdef SQLITE_OMIT_FLOATING_POINT - sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); + sqlite3ErrorMsg(pParse, "oversized integer: %s%#T", negFlag?"-":"",pExpr); #else #ifndef SQLITE_OMIT_HEX_INTEGER if( sqlite3_strnicmp(z,"0x",2)==0 ){ - sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z); + sqlite3ErrorMsg(pParse, "hex literal too big: %s%#T", + negFlag?"-":"",pExpr); }else #endif { @@ -4317,7 +4321,7 @@ expr_code_doover: || NEVER(pExpr->iAgg>=pInfo->nFunc) ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); - sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); + sqlite3ErrorMsg(pParse, "misuse of aggregate: %#T()", pExpr); }else{ return pInfo->aFunc[pExpr->iAgg].iMem; } @@ -4358,7 +4362,7 @@ expr_code_doover: } #endif if( pDef==0 || pDef->xFinalize!=0 ){ - sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); + sqlite3ErrorMsg(pParse, "unknown function: %#T()", pExpr); break; } if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ diff --git a/src/printf.c b/src/printf.c index a8cfc19315..ef9f3f2b5b 100644 --- a/src/printf.c +++ b/src/printf.c @@ -849,13 +849,22 @@ void sqlite3_str_vappendf( goto adjust_width_for_utf8; } case etTOKEN: { - Token *pToken; if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; - pToken = va_arg(ap, Token*); - assert( bArgList==0 ); - if( pToken && pToken->n ){ - sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); - sqlite3RecordErrorByteOffset(pAccum->db, pToken->z); + if( flag_alternateform ){ + /* %#T means an Expr pointer that uses Expr.u.zToken */ + Expr *pExpr = va_arg(ap,Expr*); + if( pExpr && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){ + sqlite3_str_appendall(pAccum, (const char*)pExpr->u.zToken); + sqlite3RecordErrorOffsetOfExpr(pAccum->db, pExpr); + } + }else{ + /* %T means a Token pointer */ + Token *pToken = va_arg(ap, Token*); + assert( bArgList==0 ); + if( pToken && pToken->n ){ + sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); + sqlite3RecordErrorByteOffset(pAccum->db, pToken->z); + } } length = width = 0; break; diff --git a/src/resolve.c b/src/resolve.c index 8250ce9efd..480694f6f5 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -729,7 +729,8 @@ static void notValidImpl( Parse *pParse, /* Leave error message here */ NameContext *pNC, /* The name context */ const char *zMsg, /* Type of error */ - Expr *pExpr /* Invalidate this expression on error */ + Expr *pExpr, /* Invalidate this expression on error */ + Expr *pError /* Associate error with this expression */ ){ const char *zIn = "partial index WHERE clauses"; if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; @@ -741,10 +742,11 @@ static void notValidImpl( #endif sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); if( pExpr ) pExpr->op = TK_NULL; + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); } -#define sqlite3ResolveNotValid(P,N,M,X,E) \ +#define sqlite3ResolveNotValid(P,N,M,X,E,R) \ assert( ((X)&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); \ - if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E); + if( ((N)->ncFlags & (X))!=0 ) notValidImpl(P,N,M,E,R); /* ** Expression p should encode a floating point value between 1.0 and 0.0. @@ -879,7 +881,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); sqlite3ResolveNotValid(pParse, pNC, "the \".\" operator", - NC_IdxExpr|NC_GenCol, 0); + NC_IdxExpr|NC_GenCol, 0, pExpr); pRight = pExpr->pRight; if( pRight->op==TK_ID ){ zDb = 0; @@ -910,7 +912,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int no_such_func = 0; /* True if no such function exists */ int wrong_num_args = 0; /* True if wrong number of arguments */ int is_agg = 0; /* True if is an aggregate function */ - int nId; /* Number of characters in function name */ const char *zId; /* The function name. */ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ @@ -920,7 +921,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); zId = pExpr->u.zToken; - nId = sqlite3Strlen30(zId); pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); if( pDef==0 ){ pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); @@ -937,8 +937,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->iTable = exprProbability(pList->a[1].pExpr); if( pExpr->iTable<0 ){ sqlite3ErrorMsg(pParse, - "second argument to likelihood() must be a " - "constant between 0.0 and 1.0"); + "second argument to %#T() must be a " + "constant between 0.0 and 1.0", pExpr); pNC->nNcErr++; } }else{ @@ -959,8 +959,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); if( auth!=SQLITE_OK ){ if( auth==SQLITE_DENY ){ - sqlite3ErrorMsg(pParse, "not authorized to use function: %s", - pDef->zName); + sqlite3ErrorMsg(pParse, "not authorized to use function: %#T", + pExpr); pNC->nNcErr++; } pExpr->op = TK_NULL; @@ -983,7 +983,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** in a CHECK constraint. SQLServer, MySQL, and PostgreSQL all ** all this. */ sqlite3ResolveNotValid(pParse, pNC, "non-deterministic functions", - NC_IdxExpr|NC_PartIdx|NC_GenCol, 0); + NC_IdxExpr|NC_PartIdx|NC_GenCol, 0, pExpr); }else{ assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ pExpr->op2 = pNC->ncFlags & NC_SelfRef; @@ -1015,7 +1015,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ); if( pDef && pDef->xValue==0 && pWin ){ sqlite3ErrorMsg(pParse, - "%.*s() may not be used as a window function", nId, zId + "%#T() may not be used as a window function", pExpr ); pNC->nNcErr++; }else if( @@ -1029,13 +1029,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ zType = "aggregate"; } - sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); + sqlite3ErrorMsg(pParse, "misuse of %s function %#T()",zType,pExpr); pNC->nNcErr++; is_agg = 0; } #else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ - sqlite3ErrorMsg(pParse,"misuse of aggregate function %.*s()",nId,zId); + sqlite3ErrorMsg(pParse,"misuse of aggregate function %#T()",pExpr); pNC->nNcErr++; is_agg = 0; } @@ -1045,18 +1045,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ && pParse->explain==0 #endif ){ - sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); + sqlite3ErrorMsg(pParse, "no such function: %#T", pExpr); pNC->nNcErr++; }else if( wrong_num_args ){ - sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", - nId, zId); + sqlite3ErrorMsg(pParse,"wrong number of arguments to function %#T()", + pExpr); pNC->nNcErr++; } #ifndef SQLITE_OMIT_WINDOWFUNC else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ sqlite3ErrorMsg(pParse, - "FILTER may not be used with non-aggregate %.*s()", - nId, zId + "FILTER may not be used with non-aggregate %#T()", + pExpr ); pNC->nNcErr++; } @@ -1141,7 +1141,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); if( pNC->ncFlags & NC_SelfRef ){ - notValidImpl(pParse, pNC, "subqueries", pExpr); + notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr); }else{ sqlite3WalkSelect(pWalker, pExpr->x.pSelect); } @@ -1159,7 +1159,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); sqlite3ResolveNotValid(pParse, pNC, "parameters", - NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr); + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol, pExpr, pExpr); break; } case TK_IS: @@ -1211,6 +1211,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_BETWEEN ); sqlite3ErrorMsg(pParse, "row value misused"); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); } break; } @@ -1324,11 +1325,13 @@ static void resolveOutOfRangeError( Parse *pParse, /* The error context into which to write the error */ const char *zType, /* "ORDER" or "GROUP" */ int i, /* The index (1-based) of the term out of range */ - int mx /* Largest permissible value of i */ + int mx, /* Largest permissible value of i */ + Expr *pError /* Associate the error with the expression */ ){ sqlite3ErrorMsg(pParse, "%r %s BY term out of range - should be " "between 1 and %d", i, zType, mx); + sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); } /* @@ -1384,7 +1387,7 @@ static int resolveCompoundOrderBy( if( NEVER(pE==0) ) continue; if( sqlite3ExprIsInteger(pE, &iCol) ){ if( iCol<=0 || iCol>pEList->nExpr ){ - resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); + resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE); return 1; } }else{ @@ -1480,7 +1483,7 @@ int sqlite3ResolveOrderGroupBy( for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ if( pItem->u.x.iOrderByCol ){ if( pItem->u.x.iOrderByCol>pEList->nExpr ){ - resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); + resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr, 0); return 1; } resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr,0); @@ -1572,7 +1575,7 @@ static int resolveOrderGroupBy( ** number so that sqlite3ResolveOrderGroupBy() will convert the ** order-by term to a copy of the result-set expression */ if( iCol<1 || iCol>0xffff ){ - resolveOutOfRangeError(pParse, zType, i+1, nResult); + resolveOutOfRangeError(pParse, zType, i+1, nResult, pE2); return 1; } pItem->u.x.iOrderByCol = (u16)iCol; diff --git a/test/altertab2.test b/test/altertab2.test index 9c1ad58134..def9e56686 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -355,7 +355,7 @@ do_execsql_test 8.5 { reset_db do_catchsql_test 8.6 { CREATE TABLE t0(c0); - CREATE INDEX i0 ON t0(LIKELIHOOD(1,2) AND 0); + CREATE INDEX i0 ON t0(likelihood(1,2) AND 0); ALTER TABLE t0 RENAME TO t1; SELECT sql FROM sqlite_master WHERE name='i0'; } {1 {error in index i0: second argument to likelihood() must be a constant between 0.0 and 1.0}} From 17a93ae1b8a6c7c5ffa76e42037e8ac2d9c5c322 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 11:26:51 +0000 Subject: [PATCH 12/56] Record the error offset on INTEGER tokens. FossilOrigin-Name: 38e057a580613be176552e230e40b4434a9ed57a82d407e92a23c7b8e62c0b0e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b6e55db69d..85470bd719 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\simprovements\sto\slocalization\sof\serrors\sin\sinput\sSQL. -D 2022-02-06T00:30:04.400 +C Record\sthe\serror\soffset\son\sINTEGER\stokens. +D 2022-02-06T11:26:51.988 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -541,7 +541,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c f6183fb7370425cd8642759693d9994649217cf7111caef89bc2c4946afbc36d F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 0b8d621453e18ac2ea15c237c14bd5451478b3f4e13a5a4020153bbb14ec34ee +F src/parse.y b34d4eb8105271ea0d577ef165bb7b2a2b70e03b2e694e68e2e43b76389bf660 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -1943,8 +1943,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 5b8d2577907abda10de29884716bacc10bff0df1451228a0ac40342dbea6d589 -R 62d673014722dadc6f145e57ea78193f +P fa34676042720161ca03f3926814152eb1d144ec12fd2b44e5429408ea4ad5b0 +R de0e48e53f07c512f38151ad31733e2d U drh -Z 3fc4758d5d812a2bf659475da12b12d5 +Z 167cf3ec599a445193cb6da353ab517a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2dd503b284..f17e0956da 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa34676042720161ca03f3926814152eb1d144ec12fd2b44e5429408ea4ad5b0 \ No newline at end of file +38e057a580613be176552e230e40b4434a9ed57a82d407e92a23c7b8e62c0b0e \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index b1c50d750d..6474024b61 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1081,6 +1081,7 @@ term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} term(A) ::= STRING(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} term(A) ::= INTEGER(X). { A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1); + if( A ) A->w.iOfst = (int)(X.z - pParse->zTail); } expr(A) ::= VARIABLE(X). { if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){ From 2ef111168f03f90970ea17c3584efd654d8bff83 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 11:51:23 +0000 Subject: [PATCH 13/56] Faster computation of Expr.nHeight. FossilOrigin-Name: a7a5af327ba8bafcd58b828e3e7a10d0008bb780d55a6c573aa15896dcc8ab89 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 85470bd719..ce8fcb65ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Record\sthe\serror\soffset\son\sINTEGER\stokens. -D 2022-02-06T11:26:51.988 +C Faster\scomputation\sof\sExpr.nHeight. +D 2022-02-06T11:51:23.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -503,7 +503,7 @@ F src/date.c 41627dec396f3d33e2c317a065f9d59bb535982b2ea3a561c96e4d4cf1137b65 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d -F src/expr.c ddb6a18fcb231bd246c5570bc32b888ecfcccf4a145b141f63285b198205e84a +F src/expr.c b90a029105a93a93a0ed5e5f8c5eaed8f19043a3b62e4c4d235a4611d9ada178 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 06e4ac33031b02dde7130c12e79cddf4dc5cfa72b23d8e63a3c26878fc9c1d3c F src/func.c 5a0379450bd19ca5cb2d65327b0df6466a14fa0f06f9355329c3e0eec483519a @@ -1943,8 +1943,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 fa34676042720161ca03f3926814152eb1d144ec12fd2b44e5429408ea4ad5b0 -R de0e48e53f07c512f38151ad31733e2d +P 38e057a580613be176552e230e40b4434a9ed57a82d407e92a23c7b8e62c0b0e +R 17ee54b746725bb2605da7bcf56f32eb U drh -Z 167cf3ec599a445193cb6da353ab517a +Z 610e035a1e7d6996a44dc02d2b1f002f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f17e0956da..a3dab576b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38e057a580613be176552e230e40b4434a9ed57a82d407e92a23c7b8e62c0b0e \ No newline at end of file +a7a5af327ba8bafcd58b828e3e7a10d0008bb780d55a6c573aa15896dcc8ab89 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4c47f6fe6c..271f06bc6a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -769,9 +769,8 @@ static void heightOfSelect(const Select *pSelect, int *pnHeight){ ** if appropriate. */ static void exprSetHeight(Expr *p){ - int nHeight = 0; - heightOfExpr(p->pLeft, &nHeight); - heightOfExpr(p->pRight, &nHeight); + int nHeight = p->pLeft ? p->pLeft->nHeight : 0; + if( p->pRight && p->pRight->nHeight>nHeight ) nHeight = p->pRight->nHeight; if( ExprUseXSelect(p) ){ heightOfSelect(p->x.pSelect, &nHeight); }else if( p->x.pList ){ From 89e9baa2ca81d181442762499fd730b320063937 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 21:13:59 +0000 Subject: [PATCH 14/56] With the new ALTER TABLE under PRAGMA writable_schema=ON processing, do not ignore non-parser errors such as OOMs. FossilOrigin-Name: 36653ccef68cf61b6001000a713b06e951cb6fddced6b6a906c3b17d70a8af87 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index ce8fcb65ca..8e9a9edd5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Faster\scomputation\sof\sExpr.nHeight. -D 2022-02-06T11:51:23.635 +C With\sthe\snew\sALTER\sTABLE\sunder\sPRAGMA\swritable_schema=ON\sprocessing,\sdo\snot\nignore\snon-parser\serrors\ssuch\sas\sOOMs. +D 2022-02-06T21:13:59.488 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c af5606a4d7f35a13ce577d96f222d5e6a3c0c23de5b903dd53f28f5a4f57a064 +F src/alter.c b62636548008957337b73ff9f1f5294ca9793e5b01e986ecb56cfafd58ba78f2 F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c f26d400f3ffe2cdca01406bca70e5f58c5488bf165b4fc37c228136dfcf1b583 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1943,8 +1943,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 38e057a580613be176552e230e40b4434a9ed57a82d407e92a23c7b8e62c0b0e -R 17ee54b746725bb2605da7bcf56f32eb +P a7a5af327ba8bafcd58b828e3e7a10d0008bb780d55a6c573aa15896dcc8ab89 +R 9e12eaf92c400a1abbda125c72539642 U drh -Z 610e035a1e7d6996a44dc02d2b1f002f +Z 5efe5ab9e96534fa8b62087cb17d4d0d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a3dab576b9..8341445ecf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7a5af327ba8bafcd58b828e3e7a10d0008bb780d55a6c573aa15896dcc8ab89 \ No newline at end of file +36653ccef68cf61b6001000a713b06e951cb6fddced6b6a906c3b17d70a8af87 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index dfffcc9b80..20827deacf 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1061,12 +1061,12 @@ static void renameColumnParseError( const char *zN = (const char*)sqlite3_value_text(pObject); char *zErr; - zErr = sqlite3_mprintf("error in %s %s%s%s: %s", + zErr = sqlite3MPrintf(pParse->db, "error in %s %s%s%s: %s", zT, zN, (zWhen[0] ? " " : ""), zWhen, pParse->zErrMsg ); sqlite3_result_error(pCtx, zErr, -1); - sqlite3_free(zErr); + sqlite3DbFree(pParse->db, zErr); } /* @@ -1595,7 +1595,7 @@ static void renameColumnFunc( renameColumnFunc_done: if( rc!=SQLITE_OK ){ - if( sqlite3WritableSchema(db) ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ sqlite3_result_value(context, argv[0]); }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); @@ -1796,7 +1796,7 @@ static void renameTableFunc( rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); } if( rc!=SQLITE_OK ){ - if( sqlite3WritableSchema(db) ){ + if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ sqlite3_result_value(context, argv[3]); }else if( sParse.zErrMsg ){ renameColumnParseError(context, "", argv[1], argv[2], &sParse); @@ -1923,7 +1923,7 @@ static void renameQuotefixFunc( renameTokenFree(db, sCtx.pList); } if( rc!=SQLITE_OK ){ - if( sqlite3WritableSchema(db) ){ + if( sqlite3WritableSchema(db) && rc==SQLITE_ERROR ){ sqlite3_result_value(context, argv[1]); }else{ sqlite3_result_error_code(context, rc); From 51896e6fd714769604a3f22cc564767aa5c0db48 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 22:13:35 +0000 Subject: [PATCH 15/56] The sqlite3_vtab_in() interface should return false for a vector IN constraint. FossilOrigin-Name: 245d0241c78870c6a41af3e02b82b13151472e2102fbd62989672f8122feca73 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 4 +++- src/whereexpr.c | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8e9a9edd5b..e763bd2da3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C With\sthe\snew\sALTER\sTABLE\sunder\sPRAGMA\swritable_schema=ON\sprocessing,\sdo\snot\nignore\snon-parser\serrors\ssuch\sas\sOOMs. -D 2022-02-06T21:13:59.488 +C The\ssqlite3_vtab_in()\sinterface\sshould\sreturn\sfalse\sfor\sa\svector\sIN\sconstraint. +D 2022-02-06T22:13:35.128 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -639,10 +639,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 4e8f27c9829818a3210e8c97b5c23f7c2fb67e68a5750a3e40384bbed24ce69e +F src/where.c 0d75d7514764726409ea945520fe9fb515e7d9ae52a5a3c0a136142cfaa19087 F src/whereInt.h 15d2975c3b4c193c78c26674400a840da8647fe1777ae3b026e2d15937b38a03 F src/wherecode.c 6150f51c0368be941fad90a736ce37cc1e2a719876750a3183a516ed256a4cbb -F src/whereexpr.c ee4b962c8f8613afb8cd656b3a470130c42c952dd4af2ad1d2294d37a47bb1f1 +F src/whereexpr.c 40ce462631e652a210c2d144516c16e9a8af8c9612b3f7db18d58d586080a98b F src/window.c dfaec4abc6012cbc18e4a202ca3a5d5a0efcc4011d86a06d882ddaab8aedee4d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1943,8 +1943,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 a7a5af327ba8bafcd58b828e3e7a10d0008bb780d55a6c573aa15896dcc8ab89 -R 9e12eaf92c400a1abbda125c72539642 +P 36653ccef68cf61b6001000a713b06e951cb6fddced6b6a906c3b17d70a8af87 +R 2c6e3c8c02d87fe3f6bdd0197c360efb U drh -Z 5efe5ab9e96534fa8b62087cb17d4d0d +Z 3c1d1faab1829af80ee7493bf7d43807 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8341445ecf..95e6c105de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36653ccef68cf61b6001000a713b06e951cb6fddced6b6a906c3b17d70a8af87 \ No newline at end of file +245d0241c78870c6a41af3e02b82b13151472e2102fbd62989672f8122feca73 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 41acbe39d6..c1a2f0595e 100644 --- a/src/where.c +++ b/src/where.c @@ -1243,7 +1243,9 @@ static sqlite3_index_info *allocateIndexInfo( pIdxCons[j].iTermOffset = i; op = pTerm->eOperator & WO_ALL; if( op==WO_IN ){ - pHidden->mIn |= SMASKBIT32(j); + if( (pTerm->wtFlags & TERM_SLICE)==0 ){ + pHidden->mIn |= SMASKBIT32(j); + } op = WO_EQ; } if( op==WO_AUX ){ diff --git a/src/whereexpr.c b/src/whereexpr.c index bcc7bebeb4..bd0cf5f0ac 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1429,7 +1429,7 @@ static void exprAnalyze( int i; for(i=0; ipLeft); i++){ int idxNew; - idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL); + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL|TERM_SLICE); pWC->a[idxNew].u.x.iField = i+1; exprAnalyze(pSrc, pWC, idxNew); markTermAsChild(pWC, idxNew, idxTerm); From 5d20a21814e57a707577e3ef8e275cf7465e0e7f Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 6 Feb 2022 23:54:41 +0000 Subject: [PATCH 16/56] Fix unreachable branches in the sqlite3_error_offset() logic. FossilOrigin-Name: 031381aea371892a35737e550121846af41241711a36c1a2086af3b0c11bf7b6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/printf.c | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e763bd2da3..ef470a3d8d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3_vtab_in()\sinterface\sshould\sreturn\sfalse\sfor\sa\svector\sIN\sconstraint. -D 2022-02-06T22:13:35.128 +C Fix\sunreachable\sbranches\sin\sthe\ssqlite3_error_offset()\slogic. +D 2022-02-06T23:54:41.225 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -548,7 +548,7 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 F src/pragma.c 7c024d690a3dc93f61830f11f900e4af2357f31d081b0c79099ca5e28919cba7 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c a187dade741c1f09ae118fcbbf0302511807bfc0355880927d7152eb75b8260d -F src/printf.c 88a96f8d7bedee6fa73f6be21a70c21089e772d88d32994b04d50e0bf0f38066 +F src/printf.c 05d8dfd2018bc4fc3ddb8b37eb97ccef7abf985643fa1caebdcf2916ca90fa32 F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 @@ -1943,8 +1943,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 36653ccef68cf61b6001000a713b06e951cb6fddced6b6a906c3b17d70a8af87 -R 2c6e3c8c02d87fe3f6bdd0197c360efb +P 245d0241c78870c6a41af3e02b82b13151472e2102fbd62989672f8122feca73 +R f27f31134c575573feedb0c68f8b8983 U drh -Z 3c1d1faab1829af80ee7493bf7d43807 +Z d799ecdde692015cac6cb18f2e6222d0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 95e6c105de..e2437e2857 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -245d0241c78870c6a41af3e02b82b13151472e2102fbd62989672f8122feca73 \ No newline at end of file +031381aea371892a35737e550121846af41241711a36c1a2086af3b0c11bf7b6 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index ef9f3f2b5b..7bf6f2aebb 100644 --- a/src/printf.c +++ b/src/printf.c @@ -853,7 +853,7 @@ void sqlite3_str_vappendf( if( flag_alternateform ){ /* %#T means an Expr pointer that uses Expr.u.zToken */ Expr *pExpr = va_arg(ap,Expr*); - if( pExpr && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){ + if( ALWAYS(pExpr) && ALWAYS(!ExprHasProperty(pExpr,EP_IntValue)) ){ sqlite3_str_appendall(pAccum, (const char*)pExpr->u.zToken); sqlite3RecordErrorOffsetOfExpr(pAccum->db, pExpr); } @@ -948,7 +948,6 @@ void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ ** as the error offset. */ void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ - if( db->errByteOffset>=0 ) return; while( pExpr && (ExprHasProperty(pExpr,EP_FromJoin) || pExpr->w.iOfst<=0) ){ pExpr = pExpr->pLeft; } From 6e85b27cbb57f8fa4496576e7cf5bc437c98e16c Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 7 Feb 2022 01:09:49 +0000 Subject: [PATCH 17/56] When create table/view fails due to name taken, say which took it. FossilOrigin-Name: 9a206e37fb49a203a7b5fdc93c41acc39e9ceb37144c78432a235e2f0d54a210 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 3 ++- src/whereexpr.c | 2 +- test/e_createtable.test | 4 ++-- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index ef470a3d8d..23ccae7683 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sunreachable\sbranches\sin\sthe\ssqlite3_error_offset()\slogic. -D 2022-02-06T23:54:41.225 +C When\screate\stable/view\sfails\sdue\sto\sname\staken,\ssay\swhich\stook\sit. +D 2022-02-07T01:09:49.988 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c ddab31c38d5f16114bc68392430556b1063fe14e0020f9a56d2c35ddd58ba7e3 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 -F src/build.c 9329120c4522d1ad881b9e62108870c8a5e994e31f4d813d0eb3de323d25e362 +F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 2cce39df1a13e05b7633e6d21b651f21492471f991dd7b323a4ee4e7b7f0b7f1 @@ -642,7 +642,7 @@ F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 0d75d7514764726409ea945520fe9fb515e7d9ae52a5a3c0a136142cfaa19087 F src/whereInt.h 15d2975c3b4c193c78c26674400a840da8647fe1777ae3b026e2d15937b38a03 F src/wherecode.c 6150f51c0368be941fad90a736ce37cc1e2a719876750a3183a516ed256a4cbb -F src/whereexpr.c 40ce462631e652a210c2d144516c16e9a8af8c9612b3f7db18d58d586080a98b +F src/whereexpr.c 2a71f5491798460c9590317329234d332d9eb1717cba4f3403122189a75c465e F src/window.c dfaec4abc6012cbc18e4a202ca3a5d5a0efcc4011d86a06d882ddaab8aedee4d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -866,7 +866,7 @@ F test/e_blobclose.test 692fc02a058476c2222a63d97e3f3b2b809c1842e5525ded7f854d54 F test/e_blobopen.test 29f6055ee453b8e679fe9570c4d3acfedbef821622c5dad16875148c5952ef50 F test/e_blobwrite.test 3075ff539827576d9a34cbb5a2ac75eb65fb49cd5aadc27686b0719fbf99c156 F test/e_changes.test 0f8c3e6aab7335cb772d5a3ea34ca4c82f98d0eb896e2eb3add971c16984b405 -F test/e_createtable.test 04c50b7fe41c12ed9cd88fbbc09b4900bcfc66f98ad198874fc993a2771f3913 +F test/e_createtable.test e3b9782e80c0cf2898ac0eb1d9cd058412955ff53a8e47307a60c8289d62ff9c F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 @@ -1943,8 +1943,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 245d0241c78870c6a41af3e02b82b13151472e2102fbd62989672f8122feca73 -R f27f31134c575573feedb0c68f8b8983 -U drh -Z d799ecdde692015cac6cb18f2e6222d0 +P 031381aea371892a35737e550121846af41241711a36c1a2086af3b0c11bf7b6 +R 606368899dca878552b4f7d1d7489e66 +U larrybr +Z 563df92cd5328919a56efe7627786d87 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e2437e2857..537184b02b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -031381aea371892a35737e550121846af41241711a36c1a2086af3b0c11bf7b6 \ No newline at end of file +9a206e37fb49a203a7b5fdc93c41acc39e9ceb37144c78432a235e2f0d54a210 \ No newline at end of file diff --git a/src/build.c b/src/build.c index cfff85cf9e..8b1a8009d6 100644 --- a/src/build.c +++ b/src/build.c @@ -1293,7 +1293,8 @@ void sqlite3StartTable( pTable = sqlite3FindTable(db, zName, zDb); if( pTable ){ if( !noErr ){ - sqlite3ErrorMsg(pParse, "table %T already exists", pName); + sqlite3ErrorMsg(pParse, "%s %T already exists", + (IsView(pTable)? "view" : "table"), pName); }else{ assert( !db->init.busy || CORRUPT_DB ); sqlite3CodeVerifySchema(pParse, iDb); diff --git a/src/whereexpr.c b/src/whereexpr.c index bd0cf5f0ac..19dd886de5 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1536,7 +1536,7 @@ void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ ** TK_INTEGER so that it will be available to sqlite3_vtab_rhs_value(). ** If not, then it codes as a TK_REGISTER expression. */ -void whereAddLimitExpr( +static void whereAddLimitExpr( WhereClause *pWC, /* Add the constraint to this WHERE clause */ int iReg, /* Register that will hold value of the limit/offset */ Expr *pExpr, /* Expression that defines the limit/offset */ diff --git a/test/e_createtable.test b/test/e_createtable.test index fa43d94b54..3ecffae5c6 100644 --- a/test/e_createtable.test +++ b/test/e_createtable.test @@ -493,10 +493,10 @@ do_execsql_test e_createtable-1.7.0 { do_createtable_tests 1.7.1 -error { %s } { 1 "CREATE TABLE t1(a, b)" {{table t1 already exists}} 2 "CREATE TABLE i1(a, b)" {{there is already an index named i1}} - 3 "CREATE TABLE v1(a, b)" {{table v1 already exists}} + 3 "CREATE TABLE v1(a, b)" {{view v1 already exists}} 4 "CREATE TABLE auxa.tbl1(a, b)" {{table tbl1 already exists}} 5 "CREATE TABLE auxa.idx1(a, b)" {{there is already an index named idx1}} - 6 "CREATE TABLE auxa.view1(a, b)" {{table view1 already exists}} + 6 "CREATE TABLE auxa.view1(a, b)" {{view view1 already exists}} } do_createtable_tests 1.7.2 { 1 "CREATE TABLE auxa.t1(a, b)" {} From e1c47431214cc456b133a99919e02f210c6e648f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Feb 2022 18:52:56 +0000 Subject: [PATCH 18/56] Disable the sqlite3_error_offset() when the error occurs in a trigger or view or some other bit of text that is not part of the original statement. FossilOrigin-Name: 0e909e34fa74e7b9b7954e4ed4c39dd293c1d413b58fda03607faab74aa382ad --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/trigger.c | 1 + src/vdbeaux.c | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 23ccae7683..5ddfeb2e8c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\screate\stable/view\sfails\sdue\sto\sname\staken,\ssay\swhich\stook\sit. -D 2022-02-07T01:09:49.988 +C Disable\sthe\ssqlite3_error_offset()\swhen\sthe\serror\soccurs\sin\sa\strigger\sor\nview\sor\ssome\sother\sbit\sof\stext\sthat\sis\snot\spart\sof\sthe\soriginal\sstatement. +D 2022-02-07T18:52:56.839 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c b74d878aa7c82ec8460779468061a96185e22257f68ab785b69abce354b70446 F src/treeview.c a84b57d15e46007d8b1ae249344b3f0b7f3c62def908b98baaa54935a57c8476 -F src/trigger.c 692972e4393dfc8017a1a527c1ea1b96ce3d101e84584cd832fcfb83d22b50b2 +F src/trigger.c 19fc6fe696a2409b04496df1ff044e6a942dad6ed3b6e897b1c9093b88cc2c62 F src/update.c f875b0d59da5c3055a0b2ac20560e1650229c6787e78de5e9836267b5cbb8359 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 @@ -628,7 +628,7 @@ F src/vdbe.c 13a4de20ee07bdfb3dc74ab49b7912208e309caf762a8d1678fb111e2223af35 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h b45599a2b59f1ce042512ab6786b0b82a8cf3002f6b0fa60b4834e2cd3ac61d8 F src/vdbeapi.c 06bff35393ca5daa3e02e38fb516df320bd52720a2781eb70c2db23ea1c746dd -F src/vdbeaux.c e761b8011baec7a4773f0a7594783f2cd71f699ab187c4aad917529ab8acd3fe +F src/vdbeaux.c 0d7659fe8cb38ce86092b9bc5131c99a834a04eb78745e54acb77d79d7af2fb5 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c eb6042667c02c3ef1f968235b4a170e31b23a4b6a57f65a8454eab4d36f14b7f F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 @@ -1943,8 +1943,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 031381aea371892a35737e550121846af41241711a36c1a2086af3b0c11bf7b6 -R 606368899dca878552b4f7d1d7489e66 -U larrybr -Z 563df92cd5328919a56efe7627786d87 +P 9a206e37fb49a203a7b5fdc93c41acc39e9ceb37144c78432a235e2f0d54a210 +R 0bec0c5635c3eb23a485bd776e87820e +U drh +Z 0f4df12d4ecf241bfbf3b48f4a3650a9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 537184b02b..82f8c808d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a206e37fb49a203a7b5fdc93c41acc39e9ceb37144c78432a235e2f0d54a210 \ No newline at end of file +0e909e34fa74e7b9b7954e4ed4c39dd293c1d413b58fda03607faab74aa382ad \ No newline at end of file diff --git a/src/trigger.c b/src/trigger.c index 420ef7061c..8f096a05c6 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -1236,6 +1236,7 @@ static TriggerPrg *getRowTrigger( /* If an existing TriggerPrg could not be located, create a new one. */ if( !pPrg ){ pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); + pParse->db->errByteOffset = -1; } return pPrg; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e586df64d4..0f3d0eb877 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3249,6 +3249,7 @@ int sqlite3VdbeTransferError(Vdbe *p){ sqlite3ValueSetNull(db->pErr); } db->errCode = rc; + db->errByteOffset = -1; return rc; } From 3e46db21d4334baea71bebe43350cad8eb0f740c Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Feb 2022 11:52:45 +0000 Subject: [PATCH 19/56] Improved error message formatting in the shell. Distinguish between "Parse errors" and "Runtime errors". FossilOrigin-Name: ae3e322a029952f575e49c73fb50b46bbea55be6792cc225cb94f5e0cbd046d9 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 29 ++++++++++++++++++++--------- test/shell2.test | 2 +- test/shell3.test | 2 +- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 5ddfeb2e8c..1cc676fd7e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\ssqlite3_error_offset()\swhen\sthe\serror\soccurs\sin\sa\strigger\sor\nview\sor\ssome\sother\sbit\sof\stext\sthat\sis\snot\spart\sof\sthe\soriginal\sstatement. -D 2022-02-07T18:52:56.839 +C Improved\serror\smessage\sformatting\sin\sthe\sshell.\s\sDistinguish\sbetween\n"Parse\serrors"\sand\s"Runtime\serrors". +D 2022-02-08T11:52:45.141 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 2f58e6aa6b3d2012db32f1c5fa4591e9d12fd582904632b4fc8f57a382b98fd3 +F src/shell.c.in 0ea8af78103ea178a91be97c75c3ee6b9d78144bccb52909e17d1fa3a0f356cb F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1388,8 +1388,8 @@ F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test ce2f370886645f38fabdde44976c14a004400f166edea8fdd9741079b645fef6 -F test/shell2.test f00a0501c00583cbc46f7510e1d713366326b2b3e63d06d15937284171a8787c -F test/shell3.test cb4b835a901742c9719437a89171172ecc4a8823ad97349af8e4e841e6f82566 +F test/shell2.test c9d6b6d6577662290aa9786ae3862133f257d9505573ef67147b2717eefce05a +F test/shell3.test 4d8658a6b3f5541663a4d6047612e39210df16f0f0594c888d132fa272ccdec5 F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 F test/shell5.test b85069bfcf3159b225228629ab2c3e69aa923d098fea8ea074b5dcd743522e2c F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 @@ -1943,8 +1943,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 9a206e37fb49a203a7b5fdc93c41acc39e9ceb37144c78432a235e2f0d54a210 -R 0bec0c5635c3eb23a485bd776e87820e +P 0e909e34fa74e7b9b7954e4ed4c39dd293c1d413b58fda03607faab74aa382ad +R d18f19d6b0d587687fe303ed881a44cc U drh -Z 0f4df12d4ecf241bfbf3b48f4a3650a9 +Z e5c99d42cfc720230961c3936a9ada21 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 82f8c808d8..e05d3989a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e909e34fa74e7b9b7954e4ed4c39dd293c1d413b58fda03607faab74aa382ad \ No newline at end of file +ae3e322a029952f575e49c73fb50b46bbea55be6792cc225cb94f5e0cbd046d9 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ef8afe026d..dd4c848c51 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -11179,19 +11179,30 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ END_TIMER; if( rc || zErrMsg ){ char zPrefix[100]; + const char *zErrorTail; + const char *zErrorType; + if( zErrMsg==0 ){ + zErrorType = "Error"; + zErrorTail = sqlite3_errmsg(p->db); + }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){ + zErrorType = "Parse error"; + zErrorTail = &zErrMsg[12]; + }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){ + zErrorType = "Runtime error"; + zErrorTail = &zErrMsg[10]; + }else{ + zErrorType = "Error"; + zErrorTail = zErrMsg; + } if( in!=0 || !stdin_is_interactive ){ sqlite3_snprintf(sizeof(zPrefix), zPrefix, - "Error: near line %d:", startline); + "%s near line %d:", zErrorType, startline); }else{ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); - } - if( zErrMsg!=0 ){ - utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); - sqlite3_free(zErrMsg); - zErrMsg = 0; - }else{ - utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType); } + utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail); + sqlite3_free(zErrMsg); + zErrMsg = 0; return 1; }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ char zLineBuf[2000]; diff --git a/test/shell2.test b/test/shell2.test index 6b4dff515e..620b80a484 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -63,7 +63,7 @@ do_test shell2-1.3 { UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1; } -} {1 {Error: near line 9: stepping, too many levels of trigger recursion (1)}} +} {1 {Runtime error near line 9: too many levels of trigger recursion (1)}} diff --git a/test/shell3.test b/test/shell3.test index 243da976fa..f854ea82fd 100644 --- a/test/shell3.test +++ b/test/shell3.test @@ -98,7 +98,7 @@ do_test shell3-2.6 { } {0 {}} do_test shell3-2.7 { catchcmd "foo.db" "CREATE TABLE" -} {1 {Error: near line 1: in prepare, incomplete input (1)}} +} {1 {Parse error near line 1: incomplete input (1)}} #---------------------------------------------------------------------------- From 633c7982831833e00e5287d3fe261dd49725e5e6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Feb 2022 12:13:16 +0000 Subject: [PATCH 20/56] Do not show the error code number of CLI error messages unless the error is something other than 1 (SQLITE_ERROR). FossilOrigin-Name: b471601892df98c5103bb55132bbdecf3e4dfc428aaecc47bfec1e1d51e583c7 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 19 +++++++++++++------ test/shell1.test | 4 ++-- test/shell2.test | 2 +- test/shell3.test | 4 ++-- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 1cc676fd7e..11cfbc4c13 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\serror\smessage\sformatting\sin\sthe\sshell.\s\sDistinguish\sbetween\n"Parse\serrors"\sand\s"Runtime\serrors". -D 2022-02-08T11:52:45.141 +C Do\snot\sshow\sthe\serror\scode\snumber\sof\sCLI\serror\smessages\sunless\sthe\serror\nis\ssomething\sother\sthan\s1\s(SQLITE_ERROR). +D 2022-02-08T12:13:16.921 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 0ea8af78103ea178a91be97c75c3ee6b9d78144bccb52909e17d1fa3a0f356cb +F src/shell.c.in b800bf8e02d9b4fd97078b68ca4371048f7196fc63accaa99c3c5943f72c80a0 F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1387,9 +1387,9 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test ce2f370886645f38fabdde44976c14a004400f166edea8fdd9741079b645fef6 -F test/shell2.test c9d6b6d6577662290aa9786ae3862133f257d9505573ef67147b2717eefce05a -F test/shell3.test 4d8658a6b3f5541663a4d6047612e39210df16f0f0594c888d132fa272ccdec5 +F test/shell1.test ce2f66ba87b2f0dbd71fe55b97e189feb28767aab788c9f1fbfdfc5bce11fca2 +F test/shell2.test 89e4b2db062d52baed75022227b462d085cff495809de1699652779d8e0257d6 +F test/shell3.test a50628ab1d78d90889d9d3f32fb2c084ee15674771e96afe954aaa0accd1de3c F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 F test/shell5.test b85069bfcf3159b225228629ab2c3e69aa923d098fea8ea074b5dcd743522e2c F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 @@ -1943,8 +1943,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 0e909e34fa74e7b9b7954e4ed4c39dd293c1d413b58fda03607faab74aa382ad -R d18f19d6b0d587687fe303ed881a44cc +P ae3e322a029952f575e49c73fb50b46bbea55be6792cc225cb94f5e0cbd046d9 +R 87f651304c9febbc8861f72f292abe86 U drh -Z e5c99d42cfc720230961c3936a9ada21 +Z 33838eb60d9004449371bb9d3b4fb696 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e05d3989a4..aaa33bb245 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae3e322a029952f575e49c73fb50b46bbea55be6792cc225cb94f5e0cbd046d9 \ No newline at end of file +b471601892df98c5103bb55132bbdecf3e4dfc428aaecc47bfec1e1d51e583c7 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index dd4c848c51..35e99989f5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2637,17 +2637,24 @@ static int run_table_dump_query( */ static char *save_err_msg( sqlite3 *db, /* Database to query */ - const char *zWhen, /* Qualifier (format) wrapper */ + const char *zPhase, /* When the error occcurs */ int rc, /* Error code returned from API */ const char *zSql /* SQL string, or NULL */ ){ char *zErr; char *zContext; - if( zWhen==0 ) zWhen = "%s (%d)%s"; + sqlite3_str *pStr = sqlite3_str_new(0); + sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db)); + if( rc>1 ){ + sqlite3_str_appendf(pStr, " (%d)", rc); + } zContext = shell_error_context(zSql, db); - zErr = sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc, zContext); + if( zContext ){ + sqlite3_str_appendall(pStr, zContext); + sqlite3_free(zContext); + } + zErr = sqlite3_str_finish(pStr); shell_check_oom(zErr); - sqlite3_free(zContext); return zErr; } @@ -3778,7 +3785,7 @@ static int shell_exec( rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); if( SQLITE_OK != rc ){ if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)%s", rc, zSql); + *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql); } }else{ if( !pStmt ){ @@ -3894,7 +3901,7 @@ static int shell_exec( zSql = zLeftover; while( IsSpace(zSql[0]) ) zSql++; }else if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc, 0); + *pzErrMsg = save_err_msg(db, "stepping", rc, 0); } /* clear saved stmt handle */ diff --git a/test/shell1.test b/test/shell1.test index 745990a7c9..f59330cd1d 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -53,7 +53,7 @@ do_test shell1-1.1.2 { # error on extra options do_test shell1-1.1.3 { catchcmd "test.db FOO test.db BAD" ".quit" -} {/1 .Error: in prepare, near "FOO": syntax error (1)*/} +} {/1 .Error: in prepare, near "FOO": syntax error*/} # -help do_test shell1-1.2.1 { @@ -78,7 +78,7 @@ do_test shell1-1.3.2 { } {0 {}} do_test shell1-1.3.3 { catchcmd "-init FOO test.db BAD .quit" "" -} {/1 .Error: in prepare, near "BAD": syntax error (1)*/} +} {/1 .Error: in prepare, near "BAD": syntax error*/} # -echo print commands before execution do_test shell1-1.4.1 { diff --git a/test/shell2.test b/test/shell2.test index 620b80a484..db8cd96ab8 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -63,7 +63,7 @@ do_test shell2-1.3 { UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1; } -} {1 {Runtime error near line 9: too many levels of trigger recursion (1)}} +} {1 {Runtime error near line 9: too many levels of trigger recursion}} diff --git a/test/shell3.test b/test/shell3.test index f854ea82fd..e5a0c124e0 100644 --- a/test/shell3.test +++ b/test/shell3.test @@ -68,7 +68,7 @@ do_test shell3-1.6 { } {0 {}} do_test shell3-1.7 { catchcmd "foo.db \"CREATE TABLE\"" -} {1 {Error: in prepare, incomplete input (1)}} +} {1 {Error: in prepare, incomplete input}} #---------------------------------------------------------------------------- # shell3-2.*: Basic tests for running SQL file from command line. @@ -98,7 +98,7 @@ do_test shell3-2.6 { } {0 {}} do_test shell3-2.7 { catchcmd "foo.db" "CREATE TABLE" -} {1 {Parse error near line 1: incomplete input (1)}} +} {1 {Parse error near line 1: incomplete input}} #---------------------------------------------------------------------------- From 07fc85a2bfbeb381b75948102c75b1903d5e3729 Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 8 Feb 2022 12:24:43 +0000 Subject: [PATCH 21/56] comment-only change to sqlite3.h FossilOrigin-Name: f815cf4a5f97778f177d373814700e8f2f6429dc467b68b799b5b349cc00b7a2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 11cfbc4c13..4cbfae7803 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sshow\sthe\serror\scode\snumber\sof\sCLI\serror\smessages\sunless\sthe\serror\nis\ssomething\sother\sthan\s1\s(SQLITE_ERROR). -D 2022-02-08T12:13:16.921 +C comment-only\schange\sto\ssqlite3.h +D 2022-02-08T12:24:43.731 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 F src/shell.c.in b800bf8e02d9b4fd97078b68ca4371048f7196fc63accaa99c3c5943f72c80a0 -F src/sqlite.h.in 800d6509517d383d38188e71bb5f1802c7db097a1282af7bf5d6c9a6da5a15ed +F src/sqlite.h.in b07c70b7f3b9363aeb59ead2c2ceb2748b890c0012eb8a399987331baae09d1c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 F src/sqliteInt.h b6619030ed13b2a8d49c0b5cb0525db1f727966b65ab1ec40b5f11102af7254d @@ -1943,8 +1943,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 ae3e322a029952f575e49c73fb50b46bbea55be6792cc225cb94f5e0cbd046d9 -R 87f651304c9febbc8861f72f292abe86 -U drh -Z 33838eb60d9004449371bb9d3b4fb696 +P b471601892df98c5103bb55132bbdecf3e4dfc428aaecc47bfec1e1d51e583c7 +R 216a9e9f0137c027640b115510205767 +U larrybr +Z ba0661aaf8ad11d442f297a11f155ebe # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index aaa33bb245..cdb64a3ca7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b471601892df98c5103bb55132bbdecf3e4dfc428aaecc47bfec1e1d51e583c7 \ No newline at end of file +f815cf4a5f97778f177d373814700e8f2f6429dc467b68b799b5b349cc00b7a2 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index a72af1c15b..f408ab4abc 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -566,7 +566,7 @@ int sqlite3_exec( #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) #define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) #define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) -#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) +#define SQLITE_OK_SYMLINK (SQLITE_OK | (2<<8)) /* internal use only */ /* ** CAPI3REF: Flags For File Open Operations From 4e532958c1c19204e66c9f7f673dadf629d9b03a Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Feb 2022 13:41:23 +0000 Subject: [PATCH 22/56] Provide sqlite3_error_offset() data for some new errors. FossilOrigin-Name: 1269206db810460e55a52e178ba3332add42a11f66c5f292f8f0d29ccd61a4b8 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 4 ++-- src/tokenize.c | 5 ++++- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4cbfae7803..470dcedb3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C comment-only\schange\sto\ssqlite3.h -D 2022-02-08T12:24:43.731 +C Provide\ssqlite3_error_offset()\sdata\sfor\ssome\snew\serrors. +D 2022-02-08T13:41:23.557 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c b62636548008957337b73ff9f1f5294ca9793e5b01e986ecb56cfafd58ba78f2 +F src/alter.c e31cae888bc3077e34f9a82c6b4a96e4e44d37861eeb6472d68a378f1e8e46ba F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c f26d400f3ffe2cdca01406bca70e5f58c5488bf165b4fc37c228136dfcf1b583 F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -616,7 +616,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c b74d878aa7c82ec8460779468061a96185e22257f68ab785b69abce354b70446 +F src/tokenize.c 6661a9fa660ecbd3ac0df1acd2ec788b3a8122b4316022bcdaf476ea6754a8de F src/treeview.c a84b57d15e46007d8b1ae249344b3f0b7f3c62def908b98baaa54935a57c8476 F src/trigger.c 19fc6fe696a2409b04496df1ff044e6a942dad6ed3b6e897b1c9093b88cc2c62 F src/update.c f875b0d59da5c3055a0b2ac20560e1650229c6787e78de5e9836267b5cbb8359 @@ -1943,8 +1943,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 b471601892df98c5103bb55132bbdecf3e4dfc428aaecc47bfec1e1d51e583c7 -R 216a9e9f0137c027640b115510205767 -U larrybr -Z ba0661aaf8ad11d442f297a11f155ebe +P f815cf4a5f97778f177d373814700e8f2f6429dc467b68b799b5b349cc00b7a2 +R fd8b14f575f1729559b78f644e2a52b1 +U drh +Z 80dfb50ad6c629f674e4115839a969e6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cdb64a3ca7..cb2fe21731 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f815cf4a5f97778f177d373814700e8f2f6429dc467b68b799b5b349cc00b7a2 \ No newline at end of file +1269206db810460e55a52e178ba3332add42a11f66c5f292f8f0d29ccd61a4b8 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 20827deacf..59b3bf0303 100644 --- a/src/alter.c +++ b/src/alter.c @@ -631,7 +631,7 @@ void sqlite3AlterRenameColumn( if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break; } if( iCol==pTab->nCol ){ - sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld); + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld); goto exit_rename_column; } @@ -2131,7 +2131,7 @@ void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const Token *pName){ } iCol = sqlite3ColumnIndex(pTab, zCol); if( iCol<0 ){ - sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zCol); + sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pName); goto exit_drop_column; } diff --git a/src/tokenize.c b/src/tokenize.c index 347fd57323..a727078ba7 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -657,7 +657,10 @@ int sqlite3RunParser(Parse *pParse, const char *zSql){ tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); #endif /* SQLITE_OMIT_WINDOWFUNC */ }else{ - sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql); + Token x; + x.z = zSql; + x.n = n; + sqlite3ErrorMsg(pParse, "unrecognized token: \"%T\"", &x); break; } } From 9f4ce3b19f2c27382dbf13feac9ed84fc4cfee79 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Feb 2022 15:14:18 +0000 Subject: [PATCH 23/56] Writes to the subjournal should be all-or-nothing. Fix for dbsqlfuzz fe3c397fb90029313446c4e0f4a6cd0c81dd9621. FossilOrigin-Name: 22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 6 ++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 470dcedb3a..31a7cb395e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\ssqlite3_error_offset()\sdata\sfor\ssome\snew\serrors. -D 2022-02-08T13:41:23.557 +C Writes\sto\sthe\ssubjournal\sshould\sbe\sall-or-nothing.\s\sFix\sfor\ndbsqlfuzz\sfe3c397fb90029313446c4e0f4a6cd0c81dd9621. +D 2022-02-08T15:14:18.391 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 f6183fb7370425cd8642759693d9994649217cf7111caef89bc2c4946afbc36d +F src/pager.c 29e4d6d8e0a6d092644c58109a36293d1ea6fd2e1e7a26042f5462fd819493b7 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y b34d4eb8105271ea0d577ef165bb7b2a2b70e03b2e694e68e2e43b76389bf660 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1943,8 +1943,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 f815cf4a5f97778f177d373814700e8f2f6429dc467b68b799b5b349cc00b7a2 -R fd8b14f575f1729559b78f644e2a52b1 +P 1269206db810460e55a52e178ba3332add42a11f66c5f292f8f0d29ccd61a4b8 +R 152bd288ae589530fc2745d322f45fd2 U drh -Z 80dfb50ad6c629f674e4115839a969e6 +Z b4c4dbfb44e2c416fb7b7bc180b39619 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cb2fe21731..ec14e4c49e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1269206db810460e55a52e178ba3332add42a11f66c5f292f8f0d29ccd61a4b8 \ No newline at end of file +22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 97e6ddb62a..cdab937e74 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4497,6 +4497,12 @@ static int subjournalPage(PgHdr *pPg){ if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); } + if( rc!=SQLITE_OK ){ + /* Subjournal writes should be "atomic" in the sense that we should + ** never allow a partial write. If anything goes wrong, make sure + ** to roll back any partial writes that may have occurred */ + (void)sqlite3OsTruncate(pPager->sjfd, offset); + } } } if( rc==SQLITE_OK ){ From 252fe67bdd459b52e06287ac7fb5a47f4ea79562 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 9 Feb 2022 18:42:15 +0000 Subject: [PATCH 24/56] Fix a problem with using sqlite3_bind_value() with sqlite3_value objects obtained from sqlite3_preupdate_new() when an integer value is written to a column with real affinity. FossilOrigin-Name: c006515ae6faff6525d589827d99092b06004472e32b7f586845c00c4732d695 --- manifest | 17 ++++----- manifest.uuid | 2 +- src/test1.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ src/vdbeapi.c | 2 +- test/bind2.test | 58 ++++++++++++++++++++++++++++++ 5 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 test/bind2.test diff --git a/manifest b/manifest index 31a7cb395e..7231913607 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Writes\sto\sthe\ssubjournal\sshould\sbe\sall-or-nothing.\s\sFix\sfor\ndbsqlfuzz\sfe3c397fb90029313446c4e0f4a6cd0c81dd9621. -D 2022-02-08T15:14:18.391 +C Fix\sa\sproblem\swith\susing\ssqlite3_bind_value()\swith\ssqlite3_value\sobjects\sobtained\sfrom\ssqlite3_preupdate_new()\swhen\san\sinteger\svalue\sis\swritten\sto\sa\scolumn\swith\sreal\saffinity. +D 2022-02-09T18:42:15.785 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 9287559cc1f7c5a25f927aa172e69778237f0e037960dbcdb4257d0bea500114 +F src/test1.c ac0e7eeea18230c9c315abedd5a91db7bea91743880d9371b60d3bf2b40c9796 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -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 06bff35393ca5daa3e02e38fb516df320bd52720a2781eb70c2db23ea1c746dd +F src/vdbeapi.c c38f1642bb2e31a3e2f1bbd185984455e277022bdd618698a036557686721e8a F src/vdbeaux.c 0d7659fe8cb38ce86092b9bc5131c99a834a04eb78745e54acb77d79d7af2fb5 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c eb6042667c02c3ef1f968235b4a170e31b23a4b6a57f65a8454eab4d36f14b7f @@ -739,6 +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/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 @@ -1943,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 1269206db810460e55a52e178ba3332add42a11f66c5f292f8f0d29ccd61a4b8 -R 152bd288ae589530fc2745d322f45fd2 -U drh -Z b4c4dbfb44e2c416fb7b7bc180b39619 +P 22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 +R 17abaf30f93ccdc5511b2021ebdd531b +U dan +Z a19c7c2fd597f947d750ad2fbbbad2d2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ec14e4c49e..99d9bcae54 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 \ No newline at end of file +c006515ae6faff6525d589827d99092b06004472e32b7f586845c00c4732d695 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index b5787f0874..bcf63db62a 100644 --- a/src/test1.c +++ b/src/test1.c @@ -3977,6 +3977,100 @@ static int SQLITE_TCLAPI test_bind_blob( return TCL_OK; } +/* +** Usage: sqlite3_bind_value_from_preupdate STMT N NEW|OLD IDX +** +** Test the sqlite3_bind_value interface using sqlite3_value objects +** obtained from either sqlite3_preupdate_new() (if arg[3]=="new") or +** sqlite3_preupdate_old() if (arg[3]=="old"). IDX is the index to +** pass to the sqlite3_preupdate_xxx() function. +*/ +static int SQLITE_TCLAPI test_bind_value_from_preupdate( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int idx; + int bidx; + const char *z3 = 0; + sqlite3 *db = 0; + sqlite3_value *pVal = 0; + + if( objc!=5 ){ + Tcl_WrongNumArgs(interp, 1, objv, "STMT N NEW|OLD IDX"); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; + z3 = Tcl_GetString(objv[3]); + if( Tcl_GetIntFromObj(interp, objv[4], &bidx) ) return TCL_ERROR; + db = sqlite3_db_handle(pStmt); + + if( z3[0]=='n' ){ + sqlite3_preupdate_new(db, bidx, &pVal); + }else if( z3[0]=='o' ){ + sqlite3_preupdate_old(db, bidx, &pVal); + }else{ + Tcl_AppendResult(interp, "expected new or old, got: ", z3, (char*)0); + return TCL_ERROR; + } + sqlite3_bind_value(pStmt, idx, pVal); + + return TCL_OK; +} + +/* +** Usage: sqlite3_bind_value_from_select STMT N SELECT +** +** Test the sqlite3_bind_value interface. STMT is a prepared statement. +** N is the index of a wildcard in the prepared statement. +*/ +static int SQLITE_TCLAPI test_bind_value_from_select( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + sqlite3_stmt *pStmt2; + int idx; + const char *zSql = 0; + sqlite3 *db = 0; + int rc = SQLITE_OK; + + if( objc!=4 ){ + Tcl_WrongNumArgs(interp, 1, objv, "STMT N SELECT"); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; + zSql = Tcl_GetString(objv[3]); + db = sqlite3_db_handle(pStmt); + + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt2, 0); + if( rc!=SQLITE_OK ){ + Tcl_AppendResult(interp, "error in SQL: ", sqlite3_errmsg(db), (char*)0); + return TCL_ERROR; + } + if( sqlite3_step(pStmt2)==SQLITE_ROW ){ + sqlite3_value *pVal = sqlite3_column_value(pStmt2, 0); + sqlite3_bind_value(pStmt, idx, pVal); + } + rc = sqlite3_finalize(pStmt2); + if( rc!=SQLITE_OK ){ + Tcl_AppendResult(interp, + "error runnning SQL: ", sqlite3_errmsg(db), (char*)0 + ); + return TCL_ERROR; + } + + return TCL_OK; +} + #ifndef SQLITE_OMIT_VIRTUALTABLE /* @@ -8442,6 +8536,8 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_bind_text", test_bind_text ,0 }, { "sqlite3_bind_text16", test_bind_text16 ,0 }, { "sqlite3_bind_blob", test_bind_blob ,0 }, + { "sqlite3_bind_value_from_select",test_bind_value_from_select ,0 }, + { "sqlite3_bind_value_from_preupdate",test_bind_value_from_preupdate ,0 }, #ifndef SQLITE_OMIT_VIRTUALTABLE { "sqlite3_carray_bind", test_carray_bind ,0 }, #endif diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 9cc200298e..68d2d283d8 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1594,7 +1594,7 @@ int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ break; } case SQLITE_FLOAT: { - rc = sqlite3_bind_double(pStmt, i, pValue->u.r); + rc = sqlite3_bind_double(pStmt, i, sqlite3VdbeRealValue((Mem*)pValue)); break; } case SQLITE_BLOB: { diff --git a/test/bind2.test b/test/bind2.test new file mode 100644 index 0000000000..26dac0af6f --- /dev/null +++ b/test/bind2.test @@ -0,0 +1,58 @@ +# 2022 Feb 10 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix bind2 + + +# Test that using bind_value() on a REAL sqlite3_value that was stored +# as an INTEGER works properly. +# +# 1.1: An IntReal value read from a table, +# 1.2: IntReal values obtained via the sqlite3_preupdate_old|new() +# interfaces. +# +do_execsql_test 1.0 { + CREATE TABLE t1(a REAL); + INSERT INTO t1 VALUES(42.0); + SELECT * FROM t1; +} {42.0} + +do_test 1.1 { + set stmt [sqlite3_prepare db "SELECT ?" -1 tail] + sqlite3_bind_value_from_select $stmt 1 "SELECT a FROM t1" + sqlite3_step $stmt + sqlite3_column_text $stmt 0 +} {42.0} +sqlite3_finalize $stmt + +proc preup {args} { + set stmt [sqlite3_prepare db "SELECT ?" -1 tail] + sqlite3_bind_value_from_preupdate $stmt 1 old 0 + sqlite3_step $stmt + lappend ::reslist [sqlite3_column_text $stmt 0] + sqlite3_reset $stmt + sqlite3_bind_value_from_preupdate $stmt 1 new 0 + sqlite3_step $stmt + lappend ::reslist [sqlite3_column_text $stmt 0] + sqlite3_finalize $stmt +} +db preupdate hook preup + +do_test 1.2 { + set ::reslist [list] + execsql { UPDATE t1 SET a=43; } + set ::reslist +} {42.0 43.0} + +finish_test From e2adc0eea17219474a7fd022083e1ef4af440904 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 9 Feb 2022 18:47:09 +0000 Subject: [PATCH 25/56] When process first moves a database into WAL mode and then tries to run sqlite3_wal_checkpoint() without first performing a transaction, first try to run a synthesized transaction to get the Pager caught up before attemptingn the checkpoint. [forum:/forumpost/fd0f19d229156939|forum post fd0f19d229156939]. FossilOrigin-Name: eee6de1967609f0b590ee4dbec088c3e7b03b08753267ed2909c5b03d60a0e18 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 12 ++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7231913607..c9fbb6c1da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\susing\ssqlite3_bind_value()\swith\ssqlite3_value\sobjects\sobtained\sfrom\ssqlite3_preupdate_new()\swhen\san\sinteger\svalue\sis\swritten\sto\sa\scolumn\swith\sreal\saffinity. -D 2022-02-09T18:42:15.785 +C When\sprocess\sfirst\smoves\sa\sdatabase\sinto\sWAL\smode\sand\sthen\stries\sto\srun\nsqlite3_wal_checkpoint()\swithout\sfirst\sperforming\sa\stransaction,\sfirst\ntry\sto\srun\sa\ssynthesized\stransaction\sto\sget\sthe\sPager\scaught\sup\sbefore\nattemptingn\sthe\scheckpoint.\n[forum:/forumpost/fd0f19d229156939|forum\spost\sfd0f19d229156939]. +D 2022-02-09T18:47:09.644 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 29e4d6d8e0a6d092644c58109a36293d1ea6fd2e1e7a26042f5462fd819493b7 +F src/pager.c 0c028c10e73b496ed9f5ecda50e814e99999e97c9e483b3d6d5be54cc39ddffc 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 22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 -R 17abaf30f93ccdc5511b2021ebdd531b -U dan -Z a19c7c2fd597f947d750ad2fbbbad2d2 +P c006515ae6faff6525d589827d99092b06004472e32b7f586845c00c4732d695 +R c1881e04118d51a511fc401c0e6b0886 +U drh +Z 5678d609cce97b340251791cc3933b65 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 99d9bcae54..be4c45ed36 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c006515ae6faff6525d589827d99092b06004472e32b7f586845c00c4732d695 \ No newline at end of file +eee6de1967609f0b590ee4dbec088c3e7b03b08753267ed2909c5b03d60a0e18 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index cdab937e74..b657bf5c31 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7431,6 +7431,18 @@ int sqlite3PagerCheckpoint( int *pnCkpt /* OUT: Final number of checkpointed frames */ ){ int rc = SQLITE_OK; + if( pPager->pWal==0 && pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + /* This only happens when a database file is zero bytes in size opened and + ** then "PRAGMA journal_mode=WAL" is run and then sqlite3_wal_checkpoint() + ** is invoked without any intervening transactions. We need to start + ** a transaction to initialize pWal. The PRAGMA table_list statement is + ** used for this since it starts transactions on every database file, + ** including all ATTACHed databases. This seems expensive for a single + ** sqlite3_wal_checkpoint() call, but it happens very rarely. + ** https://sqlite.org/forum/forumpost/fd0f19d229156939 + */ + sqlite3_exec(db, "PRAGMA table_list",0,0,0); + } if( pPager->pWal ){ rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), From 0d3636860134a762af52a76174f17e4c5148a656 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 01:01:31 +0000 Subject: [PATCH 26/56] Fix a typo in documentation. No code changes. FossilOrigin-Name: e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c9fbb6c1da..959fb658c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sprocess\sfirst\smoves\sa\sdatabase\sinto\sWAL\smode\sand\sthen\stries\sto\srun\nsqlite3_wal_checkpoint()\swithout\sfirst\sperforming\sa\stransaction,\sfirst\ntry\sto\srun\sa\ssynthesized\stransaction\sto\sget\sthe\sPager\scaught\sup\sbefore\nattemptingn\sthe\scheckpoint.\n[forum:/forumpost/fd0f19d229156939|forum\spost\sfd0f19d229156939]. -D 2022-02-09T18:47:09.644 +C Fix\sa\stypo\sin\sdocumentation.\s\sNo\scode\schanges. +D 2022-02-10T01:01:31.410 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 F src/shell.c.in b800bf8e02d9b4fd97078b68ca4371048f7196fc63accaa99c3c5943f72c80a0 -F src/sqlite.h.in b07c70b7f3b9363aeb59ead2c2ceb2748b890c0012eb8a399987331baae09d1c +F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 F src/sqliteInt.h b6619030ed13b2a8d49c0b5cb0525db1f727966b65ab1ec40b5f11102af7254d @@ -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 c006515ae6faff6525d589827d99092b06004472e32b7f586845c00c4732d695 -R c1881e04118d51a511fc401c0e6b0886 +P eee6de1967609f0b590ee4dbec088c3e7b03b08753267ed2909c5b03d60a0e18 +R 8f64a3cecc6fb60a0d94c857cb63d5b6 U drh -Z 5678d609cce97b340251791cc3933b65 +Z 2035d73285acce911b104c752355bc0e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index be4c45ed36..e58234b970 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eee6de1967609f0b590ee4dbec088c3e7b03b08753267ed2909c5b03d60a0e18 \ No newline at end of file +e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f408ab4abc..ca9d5e6f41 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3850,7 +3850,7 @@ void sqlite3_free_filename(char*); ** SQL, the sqlite3_error_offset() interface returns the byte offset ** of the start of that token. ^The byte offset returned by ** sqlite3_error_offset() assumes that the input SQL is UTF8. -** ^If the most error does not reference a specific token in the input +** ^If the most recent error does not reference a specific token in the input ** SQL, then the sqlite3_error_offset() function returns -1. ** ** When the serialized [threading mode] is in use, it might be the From 208b7141d0c27e13c8ee72bd2a23bd4b90fdf9de Mon Sep 17 00:00:00 2001 From: larrybr Date: Thu, 10 Feb 2022 02:09:43 +0000 Subject: [PATCH 27/56] Create new branch named "auto-column" FossilOrigin-Name: 066febe8931c5d90c009f05fe9ad0924ad35ec25a61ab42db63a9b9dbb1cecce --- manifest | 13 ++++++++----- manifest.uuid | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index 959fb658c7..5d981c565e 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 Create\snew\sbranch\snamed\s"auto-column" +D 2022-02-10T02:09:43.272 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1944,8 +1944,11 @@ 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 +P e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad R 8f64a3cecc6fb60a0d94c857cb63d5b6 -U drh -Z 2035d73285acce911b104c752355bc0e +T *branch * auto-column +T *sym-auto-column * +T -sym-trunk * +U larrybr +Z ac5c8b1c3b5d3e8ba3b923c1ff1fbc55 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e58234b970..fdbdde5960 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e97c6ad4c915c82c2f0b347a0cdc8f80942c345194675a88174047ce0d0a43ad \ No newline at end of file +066febe8931c5d90c009f05fe9ad0924ad35ec25a61ab42db63a9b9dbb1cecce \ No newline at end of file From 58a53d6e7b80baebd314da41ffe300ff90ffef1e Mon Sep 17 00:00:00 2001 From: larrybr Date: Thu, 10 Feb 2022 03:21:48 +0000 Subject: [PATCH 28/56] A CLI feature. auto .import (new table) columns. WIP FossilOrigin-Name: 7e3be36dfcb65c87a87344cf91c0c8f8d1aff0f2e4bcc23444a8f6b8ddcdae69 --- manifest | 15 +++--- manifest.uuid | 2 +- src/shell.c.in | 144 +++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 142 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 5d981c565e..1fde8afbbd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Create\snew\sbranch\snamed\s"auto-column" -D 2022-02-10T02:09:43.272 +C A\sCLI\sfeature.\sauto\s.import\s(new\stable)\scolumns.\sWIP +D 2022-02-10T03:21:48.442 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in b800bf8e02d9b4fd97078b68ca4371048f7196fc63accaa99c3c5943f72c80a0 +F src/shell.c.in 90d01dff5c235191ee478436859026251e192b4312c8eb6b25f94c86c7915027 F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1944,11 +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 8f64a3cecc6fb60a0d94c857cb63d5b6 -T *branch * auto-column -T *sym-auto-column * -T -sym-trunk * +P 066febe8931c5d90c009f05fe9ad0924ad35ec25a61ab42db63a9b9dbb1cecce +R 49051b07ca9d50a8b27652a5a6f09819 U larrybr -Z ac5c8b1c3b5d3e8ba3b923c1ff1fbc55 +Z c8e184e7bf6093d05c70b6f7f22f08a4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fdbdde5960..3f2ecc8915 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -066febe8931c5d90c009f05fe9ad0924ad35ec25a61ab42db63a9b9dbb1cecce \ No newline at end of file +7e3be36dfcb65c87a87344cf91c0c8f8d1aff0f2e4bcc23444a8f6b8ddcdae69 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 35e99989f5..4ded08981c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -5751,10 +5751,10 @@ static void output_reset(ShellState *p){ /* ** Run an SQL command and return the single integer result. */ -static int db_int(ShellState *p, const char *zSql){ +static int db_int(sqlite3 *db, const char *zSql){ sqlite3_stmt *pStmt; int res = 0; - sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ res = sqlite3_column_int(pStmt,0); } @@ -5859,7 +5859,7 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ } for(i=0; idb, zSql); sqlite3_free(zSql); utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); } @@ -7223,6 +7223,130 @@ static char *shellMPrintf(int *pRc, const char *zFmt, ...){ return z; } + +/* + * zAutoColumn(zCol, &db) => Maybe init db, add column zCol to it. + * zAutoColumn(0, &db) => (db!=0) Form columns spec for CREATE TABLE, + * close db and set it to 0, and return the columns spec, to later + * be sqlite3_free()'ed by the caller. + * The return is 0 when either: + * (a) The db was not initialized and zCol==0 (There are no columns.) + * (b) zCol!=0 (Column was added, db initialized as needed.) + */ +#ifdef SHELL_DEBUG +#define rc_err_oom_die(rc) \ + if( rc==SQLITE_NOMEM ) shell_check_oom(0); \ + else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \ + fprintf(stderr,"E:%d\n",rc), assert(0) +#else +static void rc_err_oom_die(int rc){ + if( rc==SQLITE_NOMEM ) shell_check_oom(0); + assert(rc==SQLITE_OK||rc==SQLITE_DONE); +} +#endif + +static const char *zCOL_DB = ":memory:"; + +static char *zAutoColumn(const char *zColNew, sqlite3 **pDb){ + /* Queries and D{D,M}L used here */ + static const char const *zTabMake = "\ +CREATE TABLE ColNames(\ + rank INTEGER PRIMARY KEY,\ + name TEXT, nlen INT, suff TEXT, reps INT)\ +"; + static const char const *zTabFill = "\ +INSERT INTO ColNames(name,nlen,suff,reps) VALUES(?1,length(?1),'',0)\ +"; + static const char const *zHasDupes = "\ +SELECT count(DISTINCT name||suff)db))==0 ){ char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", zSchema, zTable); - char cSep = '('; + sqlite3 *dbCols = 0; + char *zColDefs; while( xRead(&sCtx) ){ - zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); - cSep = ','; + zAutoColumn(sCtx.z, &dbCols); if( sCtx.cTerm!=sCtx.cColSep ) break; - } - if( cSep=='(' ){ + } + zColDefs = zAutoColumn(0, &dbCols); + assert(dbCols==0); + if( zColDefs==0 ){ sqlite3_free(zCreate); import_cleanup(&sCtx); utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); rc = 1; goto meta_command_exit; } - zCreate = sqlite3_mprintf("%z\n)", zCreate); + zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs); if( eVerbose>=1 ){ utf8_printf(p->out, "%s\n", zCreate); } From ddd3fe6fc4798c6a063018eece24385261e80418 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Feb 2022 12:31:37 +0000 Subject: [PATCH 29/56] 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 30/56] 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 31/56] 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 32/56] 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 33/56] 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 4c5c6214b15bc085b684aa357ab652f414a7d03f Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 11 Feb 2022 01:21:09 +0000 Subject: [PATCH 34/56] CLI auto-column rename revamped after forum discussion. FossilOrigin-Name: 2da1f8e45eb0cb1ead6049df6a31a903bfad5a7abd27e92cd3dac25fe355aec3 --- manifest | 14 +++++----- manifest.uuid | 2 +- src/shell.c.in | 68 ++++++++++++++++++++++++++++++++++++------------ test/shell1.test | 3 ++- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 1fde8afbbd..fbf77b3de8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sCLI\sfeature.\sauto\s.import\s(new\stable)\scolumns.\sWIP -D 2022-02-10T03:21:48.442 +C CLI\sauto-column\srename\srevamped\safter\sforum\sdiscussion. +D 2022-02-11T01:21:09.366 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 90d01dff5c235191ee478436859026251e192b4312c8eb6b25f94c86c7915027 +F src/shell.c.in 14c6c05a25042873ebb011e78158d98ee360ca1564490e28c7295367c4b6dfac F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1388,7 +1388,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test ce2f66ba87b2f0dbd71fe55b97e189feb28767aab788c9f1fbfdfc5bce11fca2 +F test/shell1.test b224e0793c5f48aa3749e65d8c64b93a30731bd206f2e41e6c5f1bee1bdb16c6 F test/shell2.test 89e4b2db062d52baed75022227b462d085cff495809de1699652779d8e0257d6 F test/shell3.test a50628ab1d78d90889d9d3f32fb2c084ee15674771e96afe954aaa0accd1de3c F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 @@ -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 066febe8931c5d90c009f05fe9ad0924ad35ec25a61ab42db63a9b9dbb1cecce -R 49051b07ca9d50a8b27652a5a6f09819 +P 7e3be36dfcb65c87a87344cf91c0c8f8d1aff0f2e4bcc23444a8f6b8ddcdae69 +R ea4a830aa3e422eb65f0e056f130ef8f U larrybr -Z c8e184e7bf6093d05c70b6f7f22f08a4 +Z 218fbe1e74345194717208c07bd21226 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3f2ecc8915..36412660e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7e3be36dfcb65c87a87344cf91c0c8f8d1aff0f2e4bcc23444a8f6b8ddcdae69 \ No newline at end of file +2da1f8e45eb0cb1ead6049df6a31a903bfad5a7abd27e92cd3dac25fe355aec3 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 4ded08981c..3fb0b6dc37 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7245,24 +7245,57 @@ static void rc_err_oom_die(int rc){ } #endif +#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */ +static char zCOL_DB[] = SHELL_COLFIX_DB; +#else /* Otherwise, memory is faster/better for the transient DB. */ static const char *zCOL_DB = ":memory:"; +#endif static char *zAutoColumn(const char *zColNew, sqlite3 **pDb){ /* Queries and D{D,M}L used here */ static const char const *zTabMake = "\ CREATE TABLE ColNames(\ - rank INTEGER PRIMARY KEY,\ - name TEXT, nlen INT, suff TEXT, reps INT)\ + cpos INTEGER PRIMARY KEY,\ + name TEXT, nlen INT, chop INT, reps INT, suff TEXT)\ "; static const char const *zTabFill = "\ -INSERT INTO ColNames(name,nlen,suff,reps) VALUES(?1,length(?1),'',0)\ +INSERT INTO ColNames(name,nlen,chop,reps,suff)\ + VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\ "; static const char const *zHasDupes = "\ -SELECT count(DISTINCT name||suff) Date: Fri, 11 Feb 2022 11:37:12 +0000 Subject: [PATCH 35/56] 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 36/56] 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 a03372745e75baf390e5915829107b933ce782dc Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 11 Feb 2022 13:40:25 +0000 Subject: [PATCH 37/56] Upon .import column renaming, issue message saying so. Test this. FossilOrigin-Name: 8b6ca9304bff9a5b2897a6517ce77e4cd32f337b6c849b73ead5f757228d8ac8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 20 +++++++++++++++----- test/shell5.test | 23 +++++++++++++++++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index fbf77b3de8..855f924c60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C CLI\sauto-column\srename\srevamped\safter\sforum\sdiscussion. -D 2022-02-11T01:21:09.366 +C Upon\s.import\scolumn\srenaming,\sissue\smessage\ssaying\sso.\sTest\sthis. +D 2022-02-11T13:40:25.959 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 14c6c05a25042873ebb011e78158d98ee360ca1564490e28c7295367c4b6dfac +F src/shell.c.in 4368f3d2a0e7866ed86c2877a4d839b8eb9b855142677b26356bb0003b656ef8 F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1392,7 +1392,7 @@ F test/shell1.test b224e0793c5f48aa3749e65d8c64b93a30731bd206f2e41e6c5f1bee1bdb1 F test/shell2.test 89e4b2db062d52baed75022227b462d085cff495809de1699652779d8e0257d6 F test/shell3.test a50628ab1d78d90889d9d3f32fb2c084ee15674771e96afe954aaa0accd1de3c F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 -F test/shell5.test b85069bfcf3159b225228629ab2c3e69aa923d098fea8ea074b5dcd743522e2c +F test/shell5.test c164da8b5e397b1ad2fae6ac8daee0697f064f7c0ea0882086a28860b88af182 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 388471d16e4de767333107e30653983f186232c0e863f4490bb230419e830aae @@ -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 7e3be36dfcb65c87a87344cf91c0c8f8d1aff0f2e4bcc23444a8f6b8ddcdae69 -R ea4a830aa3e422eb65f0e056f130ef8f +P 2da1f8e45eb0cb1ead6049df6a31a903bfad5a7abd27e92cd3dac25fe355aec3 +R 3c587522ab1009a0f304c6f4fc9291c2 U larrybr -Z 218fbe1e74345194717208c07bd21226 +Z 6eda7b7abac4cc7637f7063a4d303de3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 36412660e5..3b9c4fbbf2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2da1f8e45eb0cb1ead6049df6a31a903bfad5a7abd27e92cd3dac25fe355aec3 \ No newline at end of file +8b6ca9304bff9a5b2897a6517ce77e4cd32f337b6c849b73ead5f757228d8ac8 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3fb0b6dc37..6bd271c206 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7225,13 +7225,16 @@ static char *shellMPrintf(int *pRc, const char *zFmt, ...){ /* - * zAutoColumn(zCol, &db) => Maybe init db, add column zCol to it. - * zAutoColumn(0, &db) => (db!=0) Form columns spec for CREATE TABLE, + * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it. + * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE, * close db and set it to 0, and return the columns spec, to later * be sqlite3_free()'ed by the caller. * The return is 0 when either: * (a) The db was not initialized and zCol==0 (There are no columns.) * (b) zCol!=0 (Column was added, db initialized as needed.) + * The 3rd argument, pRenamed, references an out parameter. If the + * pointer is non-zero, its referent will be set to 1 if renaming was + * necessary, or set to 0 if none was done. */ #ifdef SHELL_DEBUG #define rc_err_oom_die(rc) \ @@ -7251,7 +7254,7 @@ static char zCOL_DB[] = SHELL_COLFIX_DB; static const char *zCOL_DB = ":memory:"; #endif -static char *zAutoColumn(const char *zColNew, sqlite3 **pDb){ +static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, int *pRenamed){ /* Queries and D{D,M}L used here */ static const char const *zTabMake = "\ CREATE TABLE ColNames(\ @@ -7373,6 +7376,7 @@ FROM (\ }else{ zColsSpec = 0; } + if( pRenamed!=0 ) *pRenamed = hasDupes; sqlite3_finalize(pStmt); sqlite3_close(*pDb); *pDb = 0; @@ -8926,12 +8930,18 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", zSchema, zTable); sqlite3 *dbCols = 0; + int renamed = 0; char *zColDefs; while( xRead(&sCtx) ){ - zAutoColumn(sCtx.z, &dbCols); + zAutoColumn(sCtx.z, &dbCols, 0); if( sCtx.cTerm!=sCtx.cColSep ) break; } - zColDefs = zAutoColumn(0, &dbCols); + zColDefs = zAutoColumn(0, &dbCols, &renamed); + if( renamed!=0 ){ + utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr, + "Columns renamed during .import %s due to duplicates.\n", + sCtx.zFile); + } assert(dbCols==0); if( zColDefs==0 ){ sqlite3_free(zCreate); diff --git a/test/shell5.test b/test/shell5.test index 1e0038d9d5..a0a10eeb4d 100644 --- a/test/shell5.test +++ b/test/shell5.test @@ -476,4 +476,27 @@ CREATE TABLE t8(a, b, c); db eval { SELECT * FROM t8 } } {1 2 3} +#---------------------------------------------------------------------------- +# Tests for the shell automatic column rename. +# + +# Import columns containing duplicates +do_test shell5-5.1 { + set out [open shell5.csv w] + fconfigure $out -translation lf + puts $out {"","x","x","y","z","z_0"} + puts $out {0,"ex2","ex3","wye4","zee5","zee6"} + close $out + forcedelete test.db + catchcmd test.db {.import -csv shell5.csv t1 +.mode line +SELECT * FROM t1;} +} {1 { ? = 0 + x_2 = ex2 + x_3 = ex3 + y = wye4 + z_5 = zee5 + z_6 = zee6 +Columns renamed during .import shell5.csv due to duplicates.}} + finish_test From 85548fac8d11c6e5b2922bdea95d169852342e13 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Feb 2022 14:08:05 +0000 Subject: [PATCH 38/56] 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 39/56] 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 40/56] 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 41/56] 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 42/56] 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 43/56] 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 44/56] 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 From 0a704c314555093549d11a898830d3d99228850c Mon Sep 17 00:00:00 2001 From: larrybr Date: Sat, 12 Feb 2022 10:48:42 +0000 Subject: [PATCH 45/56] Fix auto-column bug noted by post https://sqlite.org/forum/forumpost/d102c15d63 FossilOrigin-Name: 689137e1b5bc78b0f16e5db86d16415b9fa77d22ded59e93d75e7033b465e673 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 3 ++- test/shell5.test | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 9 deletions(-) mode change 100644 => 100755 src/shell.c.in mode change 100644 => 100755 test/shell5.test diff --git a/manifest b/manifest index 505325b6ec..65424ef168 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Sync\sw/trunk,\sallow\sbuild-time\soverride\sof\sauto-column\sdecorating\scharacter -D 2022-02-12T02:15:37.064 +C Fix\sauto-column\sbug\snoted\sby\spost\shttps://sqlite.org/forum/forumpost/d102c15d63 +D 2022-02-12T10:48:42.243 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 910aa363580f8e75c9d62c03baef2dcec25d077b9f04dacfe61df33f85b0107d +F src/shell.c.in b4ef80a729f82ad5cedda0e283e551d879412eb5009b10f45072293fdaa31c78 x F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1392,7 +1392,7 @@ F test/shell1.test b224e0793c5f48aa3749e65d8c64b93a30731bd206f2e41e6c5f1bee1bdb1 F test/shell2.test 89e4b2db062d52baed75022227b462d085cff495809de1699652779d8e0257d6 F test/shell3.test a50628ab1d78d90889d9d3f32fb2c084ee15674771e96afe954aaa0accd1de3c F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 -F test/shell5.test c164da8b5e397b1ad2fae6ac8daee0697f064f7c0ea0882086a28860b88af182 +F test/shell5.test 1be5454b8376e363f99cd0947ab43e1121e5b802c067d1fe7089e3461de1421d x F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 388471d16e4de767333107e30653983f186232c0e863f4490bb230419e830aae @@ -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 8b6ca9304bff9a5b2897a6517ce77e4cd32f337b6c849b73ead5f757228d8ac8 ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 -R f2657b8c4f3b23824e6168670f3c28c6 +P caaef4c592c980889efb349fa73b61303ec493172d90cd67d54ffde0855e4138 +R eb64a5c15c31ec1dd30354269699f3b9 U larrybr -Z 72b6123e2f6f8261fe59a92cab260c52 +Z da19ff331b971aff319325862b93569d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1a92c95aa0..d186199d04 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -caaef4c592c980889efb349fa73b61303ec493172d90cd67d54ffde0855e4138 \ No newline at end of file +689137e1b5bc78b0f16e5db86d16415b9fa77d22ded59e93d75e7033b465e673 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in old mode 100644 new mode 100755 index 65b842db9a..70567361d7 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7277,7 +7277,7 @@ INSERT INTO ColNames(name,nlen,chop,reps,suff)\ VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\ "; static const char const *zHasDupes = "\ -SELECT count(DISTINCT substring(name,1,nlen-chop)||suff)\ +SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\ Date: Sat, 12 Feb 2022 13:12:03 +0000 Subject: [PATCH 46/56] For .import auto-column, aid build-time override of rename decoration. FossilOrigin-Name: 433e5ead2b711d1e3b0b62cf8cb5a8a65e2474c68ef2173317ed4323fc8bdc58 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 12 ++++++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 65424ef168..d5fca950d3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sauto-column\sbug\snoted\sby\spost\shttps://sqlite.org/forum/forumpost/d102c15d63 -D 2022-02-12T10:48:42.243 +C For\s.import\sauto-column,\said\sbuild-time\soverride\sof\srename\sdecoration. +D 2022-02-12T13:12:03.134 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in b4ef80a729f82ad5cedda0e283e551d879412eb5009b10f45072293fdaa31c78 x +F src/shell.c.in c2a03469e2f6f694878bdbee0e99f428c7bd2db104d54bd818f8834419ed666a x F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -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 caaef4c592c980889efb349fa73b61303ec493172d90cd67d54ffde0855e4138 -R eb64a5c15c31ec1dd30354269699f3b9 +P 689137e1b5bc78b0f16e5db86d16415b9fa77d22ded59e93d75e7033b465e673 +R c9aa492d97b18dedc9e846ae1794f2b1 U larrybr -Z da19ff331b971aff319325862b93569d +Z f9350e44002aa6905f87e93f2aa43b9c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d186199d04..f0f8d99eda 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -689137e1b5bc78b0f16e5db86d16415b9fa77d22ded59e93d75e7033b465e673 \ No newline at end of file +433e5ead2b711d1e3b0b62cf8cb5a8a65e2474c68ef2173317ed4323fc8bdc58 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 70567361d7..fba748bc96 100755 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7319,10 +7319,14 @@ UPDATE ColNames AS t SET reps=\ SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \ "; #endif - static const char const *zRenameRank = "\ -UPDATE ColNames AS t SET \ - suff=iif(reps>1, printf('"AUTOCOLUMN_SEP"%0*d', $1, cpos), '')\ -"; + static const char const *zRenameRank = +#ifndef SHELL_COLUMN_RENAME_DML + "UPDATE ColNames AS t SET suff=" + "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')" +#else + SHELL_COLUMN_RENAME_DML +#endif + ; static const char const *zCollectVar = "\ SELECT\ '('||\ From af7b8dcb585399c91514e266150c64262999614a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Feb 2022 13:37:27 +0000 Subject: [PATCH 47/56] Avoid dropping SQLITE_TOOBIG errors in the quote() function. FossilOrigin-Name: 115c3051a1ff7567e84f14fc4c49efe61bc2850248533449b0195c305ab6516e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/func.c | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 903db79b3e..21928f5b4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 +C Avoid\sdropping\sSQLITE_TOOBIG\serrors\sin\sthe\squote()\sfunction. +D 2022-02-12T13:37:27.925 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -506,7 +506,7 @@ F src/delete.c b5f1716b4d723db48254ee0f896e362cd029e865e05414139ea7f539f3884e1d F src/expr.c b90a029105a93a93a0ed5e5f8c5eaed8f19043a3b62e4c4d235a4611d9ada178 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 06e4ac33031b02dde7130c12e79cddf4dc5cfa72b23d8e63a3c26878fc9c1d3c -F src/func.c 5a0379450bd19ca5cb2d65327b0df6466a14fa0f06f9355329c3e0eec483519a +F src/func.c f801c6bc8b30afea51817d86a6c46259d3cca180c612cfa0a30b18d661e9c8df F src/global.c a3daa18a1696aadd94f18d37cbbdebf0bbdb827b8397a534f021cd56c15cd0f9 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -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 3409fd4150df059d7308f79fa3672a330af9cefe2ad9120c3da5ef1413921e96 -R 11d69b7df4beb804da28e670c98327ec -U drh -Z 9996eb8f83b13066aef559fa4b83d323 +P ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 +R 2e6d581fd6e56ff441925392bf096f8f +U dan +Z 130ae51273ca1e2d6d860abf05c086cc # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 476053a91b..8d5035b3a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 \ No newline at end of file +115c3051a1ff7567e84f14fc4c49efe61bc2850248533449b0195c305ab6516e \ No newline at end of file diff --git a/src/func.c b/src/func.c index d7ca756de8..c15f5c73e7 100644 --- a/src/func.c +++ b/src/func.c @@ -1120,8 +1120,9 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ sqlite3QuoteValue(&str,argv[0]); sqlite3_result_text(context, sqlite3StrAccumFinish(&str), str.nChar, SQLITE_DYNAMIC); - if( str.accError==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); + if( str.accError!=SQLITE_OK ){ + sqlite3_result_null(context); + sqlite3_result_error_code(context, str.accError); } } From 8443505dc9da09e3e0680f1ae6595fb211f4e27d Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Feb 2022 13:45:02 +0000 Subject: [PATCH 48/56] Update fuzz.test to account for a change in error message made in the core. FossilOrigin-Name: c57601b51f9b59e9d8f0eb06580fa14f49525e56bd0190c02865e478bd1f48e7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzz.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 21928f5b4f..da2c35c751 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sdropping\sSQLITE_TOOBIG\serrors\sin\sthe\squote()\sfunction. -D 2022-02-12T13:37:27.925 +C Update\sfuzz.test\sto\saccount\sfor\sa\schange\sin\serror\smessage\smade\sin\sthe\score. +D 2022-02-12T13:45:02.416 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1058,7 +1058,7 @@ F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d8 F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c F test/func7.test b9e2a1a30a8562b00841b4a21a5d2d81754fa3ab99275fd71fd5279287b44b1c F test/fuzz-oss1.test 514dcabb24687818ea949fa6760229eaacad74ca70157743ef36d35bbe01ffb0 -F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 +F test/fuzz.test 4608c1310cff4c3014a84bcced6278139743e080046e5f6784b0de7b069371d8 F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 @@ -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 ca22a64e6f05a6688974f4cff1a0ff2c873aad1947f3cf6ffaeee8bb074b2627 -R 2e6d581fd6e56ff441925392bf096f8f +P 115c3051a1ff7567e84f14fc4c49efe61bc2850248533449b0195c305ab6516e +R 1731f084452458b9d05eee60f181d7b7 U dan -Z 130ae51273ca1e2d6d860abf05c086cc +Z 9b6392ca101801cd901345406912d710 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8d5035b3a3..8548887425 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -115c3051a1ff7567e84f14fc4c49efe61bc2850248533449b0195c305ab6516e \ No newline at end of file +c57601b51f9b59e9d8f0eb06580fa14f49525e56bd0190c02865e478bd1f48e7 \ No newline at end of file diff --git a/test/fuzz.test b/test/fuzz.test index 0deed3b636..83dc79bc78 100644 --- a/test/fuzz.test +++ b/test/fuzz.test @@ -372,7 +372,7 @@ integrity_check fuzz-7.5.integrity #---------------------------------------------------------------- # Many CREATE and DROP TABLE statements: # -set E [list table duplicate {no such col} {ambiguous column name} {use DROP}] +set E [list table view duplicate {no such col} {ambiguous column name} {use DROP}] do_fuzzy_test fuzz-8.1 -template {[CreateOrDropTableOrView]} -errorlist $E close $::log From 02ede43da28dd61766dbdaf43a4c1230809210b7 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Feb 2022 16:02:37 +0000 Subject: [PATCH 49/56] Fix a possible user-after-free in ALTER TABLE found by asan. FossilOrigin-Name: 9252619d410293ddefd108f5cf81b6fb4932bd3f2ceaaa92abb7542e34f66111 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index da2c35c751..7b39b60427 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfuzz.test\sto\saccount\sfor\sa\schange\sin\serror\smessage\smade\sin\sthe\score. -D 2022-02-12T13:45:02.416 +C Fix\sa\spossible\suser-after-free\sin\sALTER\sTABLE\sfound\sby\sasan. +D 2022-02-12T16:02:37.221 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -541,7 +541,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 66bc54c37448c562950e28783e49c7697ea79d1e85136d0e4a915d3a7f9feb5b F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y b34d4eb8105271ea0d577ef165bb7b2a2b70e03b2e694e68e2e43b76389bf660 +F src/parse.y 0f02b27cdaa334441463153fff3ceb780fea006ab53ffd6ef566d4468f93e924 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -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 115c3051a1ff7567e84f14fc4c49efe61bc2850248533449b0195c305ab6516e -R 1731f084452458b9d05eee60f181d7b7 +P c57601b51f9b59e9d8f0eb06580fa14f49525e56bd0190c02865e478bd1f48e7 +R d2a62b8276aa68cab3c9ab07a64e195d U dan -Z 9b6392ca101801cd901345406912d710 +Z 7c02332c554dccceaabe14199f7f2d03 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8548887425..0d02fd32fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c57601b51f9b59e9d8f0eb06580fa14f49525e56bd0190c02865e478bd1f48e7 \ No newline at end of file +9252619d410293ddefd108f5cf81b6fb4932bd3f2ceaaa92abb7542e34f66111 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 6474024b61..2680e640a0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1075,6 +1075,9 @@ expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { Expr *temp2 = tokenExpr(pParse,TK_ID,Y); Expr *temp3 = tokenExpr(pParse,TK_ID,Z); Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); + if( IN_RENAME_OBJECT ){ + sqlite3RenameTokenRemap(pParse, 0, temp1); + } A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} From dfcb11de1843b5b72930bffe3e92f6eb66ea44b1 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Feb 2022 18:56:24 +0000 Subject: [PATCH 50/56] Do not run merge1.test with SQLITE_OMIT_VIRTUALTABLE builds. FossilOrigin-Name: bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/merge1.test | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7b39b60427..99c4299462 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spossible\suser-after-free\sin\sALTER\sTABLE\sfound\sby\sasan. -D 2022-02-12T16:02:37.221 +C Do\snot\srun\smerge1.test\swith\sSQLITE_OMIT_VIRTUALTABLE\sbuilds. +D 2022-02-12T18:56:24.181 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1212,7 +1212,7 @@ F test/memjournal2.test 89a4e0d1084170a281efa4d54c2677599f986f44227f98f7dfae2828 F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/merge1.test c5abf7d4eca25b3d5ee96927efff18efc3cee5a8af54b8415cbddd6d4471fd70 +F test/merge1.test 0ade470d77b689c4a64dc7f736527fcd893140bcafa70af8f7b98523cfb83f16 F test/minmax.test fe638b55d77d2375531a8f549b338eafcd9adfbd2f72df37ed77d9b26ca0a71a F test/minmax2.test cf9311babb6f0518d04e42fd6a42c619531c4309a9dd790a2c4e9b3bc595e0de F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 @@ -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 c57601b51f9b59e9d8f0eb06580fa14f49525e56bd0190c02865e478bd1f48e7 -R d2a62b8276aa68cab3c9ab07a64e195d +P 9252619d410293ddefd108f5cf81b6fb4932bd3f2ceaaa92abb7542e34f66111 +R 80e8eecaf7636ea102822137f451668f U dan -Z 7c02332c554dccceaabe14199f7f2d03 +Z 534ed5fc79f3b9c855702c93bc92827c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0d02fd32fc..17e7501d4c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9252619d410293ddefd108f5cf81b6fb4932bd3f2ceaaa92abb7542e34f66111 \ No newline at end of file +bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 \ No newline at end of file diff --git a/test/merge1.test b/test/merge1.test index e4a7d657b3..36969e8fc8 100644 --- a/test/merge1.test +++ b/test/merge1.test @@ -16,6 +16,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix merge1 +ifcapable !vtab { + finish_test + return +} + load_static_extension db series From 33633861453b3c891ad8f48ca4cc24eb1638a71c Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 14 Feb 2022 01:12:46 +0000 Subject: [PATCH 51/56] CLI's .import column rename made more minimal, and reports renames. FossilOrigin-Name: c626cff7f99ec502ebd46f9cdafc3d088697544ef5d6559b6b3ae85679b4f9fa --- manifest | 14 ++++---- manifest.uuid | 2 +- src/shell.c.in | 86 +++++++++++++++++++++++++++++++++++++++--------- test/shell5.test | 28 +++++++++++----- 4 files changed, 98 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index c8b221ba39..057eff3777 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Sync\sw/trunk,\sfix\szAutoColumns\splacement\sblunder,\sall\sto\spass\sall\sTCL\stests -D 2022-02-13T22:18:22.163 +C CLI's\s.import\scolumn\srename\smade\smore\sminimal,\sand\sreports\srenames. +D 2022-02-14T01:12:46.316 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 233a5c7f0ee9a9d1b88f1caed538d813390bb474082d9d74504d846ccb49f31e x +F src/shell.c.in 1289a2e10f48e75956700f61aac63beff7f05988ac7a4c701800b9f0e9adad4e x F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -1392,7 +1392,7 @@ F test/shell1.test b224e0793c5f48aa3749e65d8c64b93a30731bd206f2e41e6c5f1bee1bdb1 F test/shell2.test 89e4b2db062d52baed75022227b462d085cff495809de1699652779d8e0257d6 F test/shell3.test a50628ab1d78d90889d9d3f32fb2c084ee15674771e96afe954aaa0accd1de3c F test/shell4.test 8f6c0fce4abed19a8a7f7262517149812a04caa905d01bdc8f5e92573504b759 -F test/shell5.test 1be5454b8376e363f99cd0947ab43e1121e5b802c067d1fe7089e3461de1421d x +F test/shell5.test 3be444397eb1e91619ce289a6216a8df9ac690cc45d5e9595f60e750a944161f x F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 388471d16e4de767333107e30653983f186232c0e863f4490bb230419e830aae @@ -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 433e5ead2b711d1e3b0b62cf8cb5a8a65e2474c68ef2173317ed4323fc8bdc58 bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 -R d0a4f648a76dcc064c4b8040fefbc80a +P 67dc59f46d742ad69742fb34540a3074af163a3f1a0f9093f83db2276bf944ca +R ef7ea611e7a4e14ff938dd85400a84e0 U larrybr -Z 9500253e6d614600afa73cc694266a23 +Z 0a705a46f17a261142cf326cb58d0cbc # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 505f134e8f..3fdeeb0533 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67dc59f46d742ad69742fb34540a3074af163a3f1a0f9093f83db2276bf944ca \ No newline at end of file +c626cff7f99ec502ebd46f9cdafc3d088697544ef5d6559b6b3ae85679b4f9fa \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 66428b72b6..dba42e817f 100755 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7830,8 +7830,9 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ * (a) The db was not initialized and zCol==0 (There are no columns.) * (b) zCol!=0 (Column was added, db initialized as needed.) * The 3rd argument, pRenamed, references an out parameter. If the - * pointer is non-zero, its referent will be set to 1 if renaming was - * necessary, or set to 0 if none was done. + * pointer is non-zero, its referent will be set to a summary of renames + * done if renaming was necessary, or set to 0 if none was done. The out + * string (if any) must be sqlite3_free()'ed by the caller. */ #ifdef SHELL_DEBUG #define rc_err_oom_die(rc) \ @@ -7862,12 +7863,17 @@ static const char *zCOL_DB = ":memory:"; # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP) #endif -static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, int *pRenamed){ +static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){ /* Queries and D{D,M}L used here */ static const char * const zTabMake = "\ CREATE TABLE ColNames(\ cpos INTEGER PRIMARY KEY,\ - name TEXT, nlen INT, chop INT, reps INT, suff TEXT)\ + name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\ +CREATE VIEW RepeatedNames AS \ +SELECT DISTINCT t.name FROM ColNames t \ +WHERE t.name COLLATE NOCASE IN (\ + SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\ +);\ "; static const char * const zTabFill = "\ INSERT INTO ColNames(name,nlen,chop,reps,suff)\ @@ -7877,6 +7883,7 @@ INSERT INTO ColNames(name,nlen,chop,reps,suff)\ SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\ 1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')" -#else - SHELL_COLUMN_RENAME_DML +#else /* ...RENAME_MINIMAL_ONE_PASS */ +"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */ +" SELECT 0 AS nlz" +" UNION" +" SELECT nlz+1 AS nlz FROM Lzn" +" WHERE EXISTS(" +" SELECT 1" +" FROM ColNames t, ColNames o" +" WHERE" +" iif(t.name IN (SELECT * FROM RepeatedNames)," +" printf('%s"AUTOCOLUMN_SEP"%s'," +" t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2))," +" t.name" +" )" +" =" +" iif(o.name IN (SELECT * FROM RepeatedNames)," +" printf('%s"AUTOCOLUMN_SEP"%s'," +" o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2))," +" o.name" +" )" +" COLLATE NOCASE" +" AND o.cpos<>t.cpos" +" GROUP BY t.cpos" +" )" +") UPDATE Colnames AS t SET" +" chop = 0," /* No chopping, never touch incoming names. */ +" suff = iif(name IN (SELECT * FROM RepeatedNames)," +" printf('"AUTOCOLUMN_SEP"%s', substring(" +" printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2))," +" ''" +" )" #endif ; static const char * const zCollectVar = "\ @@ -7916,7 +7953,12 @@ FROM (\ SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \ FROM ColNames ORDER BY cpos\ )"; - + static const char * const zRenamesDone = + "SELECT group_concat(" + " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff))," + " ','||x'0a')" + "FROM ColNames WHERE suff<>'' OR chop!=0" + ; int rc; sqlite3_stmt *pStmt = 0; assert(pDb!=0); @@ -7926,7 +7968,8 @@ FROM (\ if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0; #ifdef SHELL_COLFIX_DB if(*zCOL_DB!=':') - sqlite3_exec(*pDb,"drop table if exists ColNames",0,0,0); + sqlite3_exec(*pDb,"drop table if exists ColNames;" + "drop view if exists RepeatedNames;",0,0,0); #endif rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0); rc_err_oom_die(rc); @@ -7952,8 +7995,10 @@ FROM (\ # define nDigits 2 #endif if( hasDupes ){ +#ifdef SHELL_COLUMN_RENAME_CLEAN rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0); rc_err_oom_die(rc); +#endif rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0); rc_err_oom_die(rc); rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0); @@ -7972,7 +8017,17 @@ FROM (\ }else{ zColsSpec = 0; } - if( pRenamed!=0 ) *pRenamed = hasDupes; + if( pzRenamed!=0 ){ + if( !hasDupes ) *pzRenamed = 0; + else{ + sqlite3_finalize(pStmt); + if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0) + && SQLITE_ROW==sqlite3_step(pStmt) ){ + *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); + }else + *pzRenamed = 0; + } + } sqlite3_finalize(pStmt); sqlite3_close(*pDb); *pDb = 0; @@ -8929,17 +8984,18 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", zSchema, zTable); sqlite3 *dbCols = 0; - int renamed = 0; + char *zRenames = 0; char *zColDefs; while( xRead(&sCtx) ){ zAutoColumn(sCtx.z, &dbCols, 0); if( sCtx.cTerm!=sCtx.cColSep ) break; } - zColDefs = zAutoColumn(0, &dbCols, &renamed); - if( renamed!=0 ){ + zColDefs = zAutoColumn(0, &dbCols, &zRenames); + if( zRenames!=0 ){ utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr, - "Columns renamed during .import %s due to duplicates.\n", - sCtx.zFile); + "Columns renamed during .import %s due to duplicates:\n" + "%s\n", sCtx.zFile, zRenames); + sqlite3_free(zRenames); } assert(dbCols==0); if( zColDefs==0 ){ diff --git a/test/shell5.test b/test/shell5.test index 55fce187fa..7599edbbe2 100755 --- a/test/shell5.test +++ b/test/shell5.test @@ -484,20 +484,26 @@ CREATE TABLE t8(a, b, c); do_test shell5-5.1 { set out [open shell5.csv w] fconfigure $out -translation lf - puts $out {"","x","x","y","z","z_0"} - puts $out {0,"ex2","ex3","wye4","zee5","zee6"} + puts $out {"","x","x","y","z","z_0","z_5","z"} + puts $out {0,"x2","x3","y4","z5","z6","z7","z8"} close $out forcedelete test.db catchcmd test.db {.import -csv shell5.csv t1 .mode line SELECT * FROM t1;} } {1 { ? = 0 - x_2 = ex2 - x_3 = ex3 - y = wye4 - z_5 = zee5 - z_6 = zee6 -Columns renamed during .import shell5.csv due to duplicates.}} + x_02 = x2 + x_03 = x3 + y = y4 + z_05 = z5 + z_0 = z6 + z_5 = z7 + z_08 = z8 +Columns renamed during .import shell5.csv due to duplicates: +"x" to "x_02", +"x" to "x_03", +"z" to "z_05", +"z" to "z_08"}} do_test shell5-5.1 { set out [open shell5.csv w] @@ -513,6 +519,10 @@ SELECT * FROM t1;} cow_2 = lll CoW_3 = ulu cOw_4 = lul -Columns renamed during .import shell5.csv due to duplicates.}} +Columns renamed during .import shell5.csv due to duplicates: +"COW" to "COW_1", +"cow" to "cow_2", +"CoW" to "CoW_3", +"cOw" to "cOw_4"}} finish_test From 0aa0945111373a6926c6bb3d42be9720c41f0553 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 14 Feb 2022 13:53:49 +0000 Subject: [PATCH 52/56] Fix a bad assert() (it needs an "||CORRUPT_DB" term) in b-tree, discovered by dbsqlfuzz. FossilOrigin-Name: f5f263cc626d6a8bea3e85e28bb716e3eac0d9cd199cc060c0c8b0c77b280a45 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 8 +++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 99c4299462..c00d80c42e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\smerge1.test\swith\sSQLITE_OMIT_VIRTUALTABLE\sbuilds. -D 2022-02-12T18:56:24.181 +C Fix\sa\sbad\sassert()\s(it\sneeds\san\s"||CORRUPT_DB"\sterm)\sin\sb-tree,\sdiscovered\nby\sdbsqlfuzz. +D 2022-02-14T13:53:49.894 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c ddab31c38d5f16114bc68392430556b1063fe14e0020f9a56d2c35ddd58ba7e3 +F src/btree.c 36171a7ac65de459a46fc5c058469e312675b6607c77ae352720f29a4c3aec99 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 @@ -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 9252619d410293ddefd108f5cf81b6fb4932bd3f2ceaaa92abb7542e34f66111 -R 80e8eecaf7636ea102822137f451668f -U dan -Z 534ed5fc79f3b9c855702c93bc92827c +P bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 +R eb064779415a6eb9ec1638908fc5d28d +U drh +Z 1f402c75824ae1ac218e657bf4bc7a68 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 17e7501d4c..a1b8b44c4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 \ No newline at end of file +f5f263cc626d6a8bea3e85e28bb716e3eac0d9cd199cc060c0c8b0c77b280a45 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fdf0ac22c9..d54adafe2e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1782,7 +1782,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( iFreeBlk>pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ return SQLITE_CORRUPT_PAGE(pPage); } - assert( iFreeBlk>iPtr || iFreeBlk==0 ); + assert( iFreeBlk>iPtr || iFreeBlk==0 || CORRUPT_DB ); /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none @@ -6846,6 +6846,12 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ assert( pPage->pBt->usableSize > (u32)(ptr-data) ); pc = get2byte(ptr); hdr = pPage->hdrOffset; +#if 0 /* Not required. Omit for efficiency */ + if( pcnCell*2 ){ + *pRC = SQLITE_CORRUPT_BKPT; + return; + } +#endif testcase( pc==(u32)get2byte(&data[hdr+5]) ); testcase( pc+sz==pPage->pBt->usableSize ); if( pc+sz > pPage->pBt->usableSize ){ From 9a4e88604cc89fdcdaa4b9c761b1fb96f8cef458 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 14 Feb 2022 18:18:56 +0000 Subject: [PATCH 53/56] Minor correction to the early corruption detection added by [a6fda39e81d0da98|check-in a6fda39e81d0da98] so that it works even if the page being cleared in page 1 of the database. FossilOrigin-Name: a5ec16907ef6ab50e041101d87c5756c71469923872a86c3ab383f188673d7a5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c00d80c42e..7cb6b95e30 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbad\sassert()\s(it\sneeds\san\s"||CORRUPT_DB"\sterm)\sin\sb-tree,\sdiscovered\nby\sdbsqlfuzz. -D 2022-02-14T13:53:49.894 +C Minor\scorrection\sto\sthe\searly\scorruption\sdetection\sadded\sby\n[a6fda39e81d0da98|check-in\sa6fda39e81d0da98]\sso\sthat\sit\sworks\seven\sif\nthe\spage\sbeing\scleared\sin\spage\s1\sof\sthe\sdatabase. +D 2022-02-14T18:18:56.749 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7 F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 36171a7ac65de459a46fc5c058469e312675b6607c77ae352720f29a4c3aec99 +F src/btree.c 117808943727d27e38c69de4e79237e52c89ee40f6f1a70de4e6e14b5e596cbc F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c b59ff41525c10b429adc277d3bca6e433b09d055b0df8c1529385763cea8bb04 @@ -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 bf8dbfd499e732f14c7a8efee527e8ce155937dbb2a3e85213f8aa64ac497189 -R eb064779415a6eb9ec1638908fc5d28d +P f5f263cc626d6a8bea3e85e28bb716e3eac0d9cd199cc060c0c8b0c77b280a45 +R f1974ee7ab7b76ebb9cb6d119b1ea037 U drh -Z 1f402c75824ae1ac218e657bf4bc7a68 +Z 9c489509c54e68b7fa1df2f79cfd8e24 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a1b8b44c4f..06bf8320ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5f263cc626d6a8bea3e85e28bb716e3eac0d9cd199cc060c0c8b0c77b280a45 \ No newline at end of file +a5ec16907ef6ab50e041101d87c5756c71469923872a86c3ab383f188673d7a5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d54adafe2e..fb7f025a16 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6411,7 +6411,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ assert( CORRUPT_DB || iPage>1 ); assert( !pMemPage || pMemPage->pgno==iPage ); - if( NEVER(iPage<2) || iPage>pBt->nPage ){ + if( iPage<2 || iPage>pBt->nPage ){ return SQLITE_CORRUPT_BKPT; } if( pMemPage ){ @@ -9622,7 +9622,7 @@ static int clearDatabasePage( rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); if( rc ) return rc; if( (pBt->openFlags & BTREE_SINGLE)==0 - && sqlite3PagerPageRefcount(pPage->pDbPage)!=1 + && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1)) ){ rc = SQLITE_CORRUPT_BKPT; goto cleardatabasepage_out; From e63b7bdac8f0afde9dc63e2c74d014308102f643 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 14 Feb 2022 21:11:17 +0000 Subject: [PATCH 54/56] Generalize the in-memory journal so that it is able to accept writes that begin at any offset less than or equal to the current file size. FossilOrigin-Name: c039d5476e0836c16d8c1ad99a2620f7fd04eb4b0e5dcb2246b42dde2ae1f95a --- manifest | 17 +++++++++-------- manifest.uuid | 2 +- src/memjournal.c | 18 +++++++++--------- src/pager.c | 6 ------ 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index b65bd3bae4..bae4aed5e0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C CLI\s.import\scan\sauto-rename\snon-unique\scolumn\snames\swhen\sit\screates\sa\snew\stable -D 2022-02-14T18:55:19.467 +C Generalize\sthe\sin-memory\sjournal\sso\sthat\sit\sis\sable\sto\saccept\swrites\sthat\nbegin\sat\sany\soffset\sless\sthan\sor\sequal\sto\sthe\scurrent\sfile\ssize. +D 2022-02-14T21:11:17.224 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c c2dc88f97c410eb68a24468344b65526685e18354ddfd15906750c1eaf9dc2dd -F src/memjournal.c ff4336a98b05ede2adee7595f22d6f7d1cdc6bf0f0a5c3d77b0acdf017b2e8b2 +F src/memjournal.c 8e7e9a2acfbf221a48a48b9fea3020e8a397c748aec1c68fe42cd9c59b6e2e7d F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a @@ -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 66bc54c37448c562950e28783e49c7697ea79d1e85136d0e4a915d3a7f9feb5b +F src/pager.c cda9e2d1df7c5fb4d777d09e23e69d78c518550d8873ed08b4a66c41d8cf2543 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 0f02b27cdaa334441463153fff3ceb780fea006ab53ffd6ef566d4468f93e924 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1944,8 +1944,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a5ec16907ef6ab50e041101d87c5756c71469923872a86c3ab383f188673d7a5 c626cff7f99ec502ebd46f9cdafc3d088697544ef5d6559b6b3ae85679b4f9fa -R fc0b65531de2bbc57c9c5e7f31f08c34 -U larrybr -Z 8dea9c58dd0e5cd023b89765b4d0e4ae +P 4b5d07ea7e6f5d6f1279c88bc474ee4bc8bd2cebe38a268f211f47e44569e4b1 +Q -22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 +R 2cd64e949014532c1efa0ff8ea4a6e54 +U drh +Z 2566cca627eb8b963ea71c4eec4c4180 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5f9f2f120e..30d3b12488 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b5d07ea7e6f5d6f1279c88bc474ee4bc8bd2cebe38a268f211f47e44569e4b1 \ No newline at end of file +c039d5476e0836c16d8c1ad99a2620f7fd04eb4b0e5dcb2246b42dde2ae1f95a \ No newline at end of file diff --git a/src/memjournal.c b/src/memjournal.c index 63ef2ad7b9..d9a5a70049 100644 --- a/src/memjournal.c +++ b/src/memjournal.c @@ -178,6 +178,9 @@ static int memjrnlCreateFile(MemJournal *p){ } +/* Forward reference */ +static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size); + /* ** Write data to the file. */ @@ -207,18 +210,15 @@ static int memjrnlWrite( ** access writes are not required. The only exception to this is when ** the in-memory journal is being used by a connection using the ** atomic-write optimization. In this case the first 28 bytes of the - ** journal file may be written as part of committing the transaction. */ - assert( iOfst==p->endpoint.iOffset || iOfst==0 ); -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + ** journal file may be written as part of committing the transaction. */ + assert( iOfst<=p->endpoint.iOffset ); + if( iOfst>0 && iOfst!=p->endpoint.iOffset ){ + memjrnlTruncate(pJfd, iOfst); + } if( iOfst==0 && p->pFirst ){ assert( p->nChunkSize>iAmt ); memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); - }else -#else - assert( iOfst>0 || p->pFirst==0 ); -#endif - { + }else{ while( nWrite>0 ){ FileChunk *pChunk = p->endpoint.pChunk; int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); diff --git a/src/pager.c b/src/pager.c index 7ac0689178..15bd9a22fe 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4497,12 +4497,6 @@ static int subjournalPage(PgHdr *pPg){ if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); } - if( rc!=SQLITE_OK ){ - /* Subjournal writes should be "atomic" in the sense that we should - ** never allow a partial write. If anything goes wrong, make sure - ** to roll back any partial writes that may have occurred */ - (void)sqlite3OsTruncate(pPager->sjfd, offset); - } } } if( rc==SQLITE_OK ){ From 0ca0988355d91cb50277ccb33f1a7c88d60fb091 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 15 Feb 2022 11:46:31 +0000 Subject: [PATCH 55/56] New assert() statements to help prove correctness of memjournal.c. FossilOrigin-Name: d74ec88c2f9b9e056988add8322186750229e14a609d1a6969ba393a5b8c5174 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/memjournal.c | 6 ++++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index bae4aed5e0..e685cc2ec5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Generalize\sthe\sin-memory\sjournal\sso\sthat\sit\sis\sable\sto\saccept\swrites\sthat\nbegin\sat\sany\soffset\sless\sthan\sor\sequal\sto\sthe\scurrent\sfile\ssize. -D 2022-02-14T21:11:17.224 +C New\sassert()\sstatements\sto\shelp\sprove\scorrectness\sof\smemjournal.c. +D 2022-02-15T11:46:31.084 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c c2dc88f97c410eb68a24468344b65526685e18354ddfd15906750c1eaf9dc2dd -F src/memjournal.c 8e7e9a2acfbf221a48a48b9fea3020e8a397c748aec1c68fe42cd9c59b6e2e7d +F src/memjournal.c 8bd50ae6d9c6d34b3a96cc3b4f567f9935dc358444d872ab48901a8c11ad82a6 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a @@ -1944,9 +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 4b5d07ea7e6f5d6f1279c88bc474ee4bc8bd2cebe38a268f211f47e44569e4b1 -Q -22cc55e84f67f6f39b7dba07a4ef7ae958b2d926633faec91a278922053e50c6 -R 2cd64e949014532c1efa0ff8ea4a6e54 +P c039d5476e0836c16d8c1ad99a2620f7fd04eb4b0e5dcb2246b42dde2ae1f95a +R 9bfcbea3e2cc10033819aafa59cb37db U drh -Z 2566cca627eb8b963ea71c4eec4c4180 +Z 45576672f2f8bed09c321631de66d99f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 30d3b12488..95ed510956 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c039d5476e0836c16d8c1ad99a2620f7fd04eb4b0e5dcb2246b42dde2ae1f95a \ No newline at end of file +d74ec88c2f9b9e056988add8322186750229e14a609d1a6969ba393a5b8c5174 \ No newline at end of file diff --git a/src/memjournal.c b/src/memjournal.c index d9a5a70049..a4c17eedd4 100644 --- a/src/memjournal.c +++ b/src/memjournal.c @@ -224,6 +224,7 @@ static int memjrnlWrite( int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + assert( pChunk!=0 || iChunkOffset==0 ); if( iChunkOffset==0 ){ /* New chunk is required to extend the file. */ FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); @@ -238,10 +239,11 @@ static int memjrnlWrite( assert( !p->pFirst ); p->pFirst = pNew; } - p->endpoint.pChunk = pNew; + pChunk = p->endpoint.pChunk = pNew; } - memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace); + assert( pChunk!=0 ); + memcpy((u8*)pChunk->zChunk + iChunkOffset, zWrite, iSpace); zWrite += iSpace; nWrite -= iSpace; p->endpoint.iOffset += iSpace; From 537a6bf1899942db02d83da4db9023f40fcfb1d5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 15 Feb 2022 13:23:09 +0000 Subject: [PATCH 56/56] Improved rendering of floating point numbers without a fractional part in ".dump" output from the CLI. [forum:/forumpost/550d877659f37cb2|Forum post 550d877659f37cb2]. FossilOrigin-Name: 9edaeed56f2282fd4da935454178c38ab49d259aed96d4e720aae09050a53006 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e685cc2ec5..220535e5db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sstatements\sto\shelp\sprove\scorrectness\sof\smemjournal.c. -D 2022-02-15T11:46:31.084 +C Improved\srendering\sof\sfloating\spoint\snumbers\swithout\sa\sfractional\spart\sin\n".dump"\soutput\sfrom\sthe\sCLI.\n[forum:/forumpost/550d877659f37cb2|Forum\spost\s550d877659f37cb2]. +D 2022-02-15T13:23:09.386 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -553,7 +553,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3baa9dd8cf240654773c7974e2bcce398ac9dd24419c36684156963defe43b35 -F src/shell.c.in 1289a2e10f48e75956700f61aac63beff7f05988ac7a4c701800b9f0e9adad4e +F src/shell.c.in b5b44c2ebfd3942e60dbcc47b94a74337a482a5f1c3766fbfb9f578a605ecf50 F src/sqlite.h.in 7047c4b60fa550264d6363bb1d983540e7828fb19d2d1e5aa43b52ca13144807 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 @@ -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 c039d5476e0836c16d8c1ad99a2620f7fd04eb4b0e5dcb2246b42dde2ae1f95a -R 9bfcbea3e2cc10033819aafa59cb37db +P d74ec88c2f9b9e056988add8322186750229e14a609d1a6969ba393a5b8c5174 +R d44a4dfcecd9d59ae3b06dca8b590f27 U drh -Z 45576672f2f8bed09c321631de66d99f +Z 28d22f7919d651ae0bfc81a1c20dfd1c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 95ed510956..cf24b67f55 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d74ec88c2f9b9e056988add8322186750229e14a609d1a6969ba393a5b8c5174 \ No newline at end of file +9edaeed56f2282fd4da935454178c38ab49d259aed96d4e720aae09050a53006 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index dba42e817f..3ff1f62c72 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2311,7 +2311,12 @@ static int shell_callback( }else if( ur==0xfff0000000000000LL ){ raw_printf(p->out, "-1e999"); }else{ - sqlite3_snprintf(50,z,"%!.20g", r); + sqlite3_int64 ir = (sqlite3_int64)r; + if( r==(double)ir ){ + sqlite3_snprintf(50,z,"%lld.0", ir); + }else{ + sqlite3_snprintf(50,z,"%!.20g", r); + } raw_printf(p->out, "%s", z); } }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){