From 58eaf763551db55e78bce1c9f99ba291e29b92eb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 15 May 2019 10:16:34 +0000 Subject: [PATCH 01/96] Simplify the "Verifying Code Authenticity" section of the README.md file. No code changes. FossilOrigin-Name: adebffc18e6165672947a6bda5ca23ea7723cca7ab8da4feb81fca8f83e4fcaf --- README.md | 27 +++++---------------------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 6f9510a59f..c12b77c1b9 100644 --- a/README.md +++ b/README.md @@ -306,30 +306,13 @@ describes its purpose and role within the larger system. ## Verifying Code Authenticity -If you obtained an SQLite source tree from a secondary source, such as a -GitHub mirror, and you want to verify that it has not been altered, there -are a couple of ways to do that. - -If you have a release version of SQLite, and you are using the -`sqlite3.c` amalgamation, then SHA3-256 hashes for the amalgamation are -available in the [change log](https://www.sqlite.org/changes.html) on -the official website. After building the `sqlite3.c` file, you can check -that it is authentic by comparing the hash. This does not ensure that the -test scripts are unaltered, but it does validate the deliverable part of -the code and the verification process only involves computing and -comparing a single hash. - -For versions other than an official release, or if you are building the -`sqlite3.c` amalgamation using non-standard build options, the verification -process is a little more involved. The `manifest` file at the root directory -of the source tree +The `manifest` file at the root directory of the source tree contains either a SHA3-256 hash (for newer files) or a SHA1 hash (for -older files) for every source file in the repository. You can write a script -to extracts hashes from `manifest` and verifies the hashes against the -corresponding files in the source tree. The SHA3-256 hash of the `manifest` +older files) for every source file in the repository. +The SHA3-256 hash of the `manifest` file itself is the official name of the version of the source tree that you -have. The `manifest.uuid` file should contain the SHA3-256 hash of the -`manifest` file. If all of the above hash comparisons are correct, then +have. The `manifest.uuid` file should contain the SHA3-256 hash of the +`manifest` file. If all of the above hash comparisons are correct, then you can be confident that your source tree is authentic and unadulterated. The format of the `manifest` file should be mostly self-explanatory, but diff --git a/manifest b/manifest index 5cd70b117f..bda11e9707 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Fix\sa\sproblem\swith\sthe\sfix\sfor\s[9cf6c9bb51]\s(commit\s[658b84d7])\sthat\scould\scause\sa\scursor\sto\sbe\sleft\sin\san\sinvalid\sstate\sfollowing\sa\s(rowid\s<\stext-value)\ssearch. -D 2019-05-14T20:25:22.199 +C Simplify\sthe\s"Verifying\sCode\sAuthenticity"\ssection\sof\sthe\sREADME.md\sfile.\nNo\scode\schanges. +D 2019-05-15T10:16:34.190 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 4640daf826b80947a924ac44275c451ffc13007c7c866a5730c8ce5cf9e1dc74 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 26957950b2b4f3b26e311eeea70437f85a77765f71d3a06489466d66ee321100 -F README.md 74745e53db87fdc86f571dd7ec1bd18e154d0abd6d37d2292a1062e931318a29 +F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION cc8cd90333c65cdf4cb346f356a2ce1eb0f5b7fa1d17a34d7350103e7320af1f F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 228e1087c0602470e450586499de5a3e87e266c688bc828f20e3bad2fdc65ff1 -R d132bb7525b36863c7f0dbefbbac4ccc -U dan -Z 61ab05a485e7c528107861afc63f60a9 +P bc7d2c1656396bb4f5f1f814e60dbf816cc91c5a521b54ad593cd3da0fe8dcb4 +R 0f2b565ac9807e36fc0a9e8a572b8c12 +U drh +Z 08150d30a9865a1ab89213245d21f470 diff --git a/manifest.uuid b/manifest.uuid index a58fb53a14..ff1239dc96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc7d2c1656396bb4f5f1f814e60dbf816cc91c5a521b54ad593cd3da0fe8dcb4 \ No newline at end of file +adebffc18e6165672947a6bda5ca23ea7723cca7ab8da4feb81fca8f83e4fcaf \ No newline at end of file From 73c53b39c9656c5bf8cd6a1758b055d806dd7dcc Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 15 May 2019 18:42:15 +0000 Subject: [PATCH 02/96] Fix the count-of-view optimization so that it is (correctly) disabled for a query that includes a WHERE clause or a GROUP BY clause. FossilOrigin-Name: 05897ca48a40c6771ff83ba8ecc3a5c60dafddf58651c222dd8cf89b9fc7b077 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 5 ++++- test/countofview.test | 13 +++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bda11e9707..d7144649d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\s"Verifying\sCode\sAuthenticity"\ssection\sof\sthe\sREADME.md\sfile.\nNo\scode\schanges. -D 2019-05-15T10:16:34.190 +C Fix\sthe\scount-of-view\soptimization\sso\sthat\sit\sis\s(correctly)\sdisabled\sfor\na\squery\sthat\sincludes\sa\sWHERE\sclause\sor\sa\sGROUP\sBY\sclause. +D 2019-05-15T18:42:15.232 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 408632d9531ca8f1df8591f00530797daaa7bde3fe0d3211de4d431cbb99347e F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c ef860c7e5882c89c030432a6d2cf13c67d1d51fd511cf45cbdfd5c2faf44d51d +F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in 0605c88d98c85fbcba8bbd9716e7cc10b361e7b21cf2375171130f577388c943 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -768,7 +768,7 @@ F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01a F test/corruptL.test b6ea0f657b26a8fe10405a9f5970f94de47fdfcc02fce2a635954aef13e55a88 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c -F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf +F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc7d2c1656396bb4f5f1f814e60dbf816cc91c5a521b54ad593cd3da0fe8dcb4 -R 0f2b565ac9807e36fc0a9e8a572b8c12 +P adebffc18e6165672947a6bda5ca23ea7723cca7ab8da4feb81fca8f83e4fcaf +R b7271620cbaccc77f5dc0740795c22dc U drh -Z 08150d30a9865a1ab89213245d21f470 +Z c38fee2bcfbeb4ee3d8baed90d28d7e4 diff --git a/manifest.uuid b/manifest.uuid index ff1239dc96..eab2a2b2b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -adebffc18e6165672947a6bda5ca23ea7723cca7ab8da4feb81fca8f83e4fcaf \ No newline at end of file +05897ca48a40c6771ff83ba8ecc3a5c60dafddf58651c222dd8cf89b9fc7b077 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 3754419092..0b72cd3d22 100644 --- a/src/select.c +++ b/src/select.c @@ -5508,7 +5508,8 @@ static struct SrcList_item *isSelfJoinView( ** * The subquery is a UNION ALL of two or more terms ** * The subquery does not have a LIMIT clause ** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries -** * The outer query is a simple count(*) +** * The outer query is a simple count(*) with no WHERE clause or other +** extraneous syntax. ** ** Return TRUE if the optimization is undertaken. */ @@ -5519,6 +5520,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ sqlite3 *db; if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ + if( p->pWhere ) return 0; + if( p->pGroupBy ) return 0; pExpr = p->pEList->a[0].pExpr; if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ diff --git a/test/countofview.test b/test/countofview.test index 5f892ee274..0ee511ff34 100644 --- a/test/countofview.test +++ b/test/countofview.test @@ -40,4 +40,17 @@ do_execsql_test 1.3 { ) } {3} +# 2019-05-15 +do_execsql_test 2.0 { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1),(99),('abc'); + CREATE VIEW v1(x,y) AS SELECT x,1 FROM t1 UNION ALL SELECT x,2 FROM t1; + SELECT count(*) FROM v1 WHERE x<>1; +} {4} +do_execsql_test 2.1 { + SELECT count(*) FROM v1 GROUP BY y; +} {3 3} + + + finish_test From df82afc04efbf269f3d4663cec04147421310f56 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 16 May 2019 01:22:21 +0000 Subject: [PATCH 03/96] Make sure the OP_Concat opcode always correctly zero-terminates a UTF16 string, even if the input strings are ill-formed. This is a followup to check-in [3a16ddf91f0c9c516a7] that fixes a case the previous check-in missed. Also add assert()s to prove correct zero termination. FossilOrigin-Name: d612fb7873cf59dfda18cabe45f674c37aa78a4587de3378b1840c99465a0269 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 3 ++- src/vdbemem.c | 22 ++++++++++++++++++---- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index d7144649d4..39ca99b218 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scount-of-view\soptimization\sso\sthat\sit\sis\s(correctly)\sdisabled\sfor\na\squery\sthat\sincludes\sa\sWHERE\sclause\sor\sa\sGROUP\sBY\sclause. -D 2019-05-15T18:42:15.232 +C Make\ssure\sthe\sOP_Concat\sopcode\salways\scorrectly\szero-terminates\sa\sUTF16\nstring,\seven\sif\sthe\sinput\sstrings\sare\sill-formed.\s\sThis\sis\sa\sfollowup\sto\ncheck-in\s[3a16ddf91f0c9c516a7]\sthat\sfixes\sa\scase\sthe\sprevious\scheck-in\smissed.\nAlso\sadd\sassert()s\sto\sprove\scorrect\szero\stermination. +D 2019-05-16T01:22:21.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -593,13 +593,13 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 4c0669e042b4e50a08a9e5fd14cecc76e5f877efa288533dccddb6fe98f4d6b5 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c d14841dc77e5b0cbd5cb857dee026f17b07a9d1ab147c1c2c9557227be6a52c9 +F src/vdbe.c 27fe1628d39aa7d71645d6a26f70066bd0e17cd74d010bad3bf73879efbe216a F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c d444f4a3ff9c571965329a186701a57fe445e4c3f4c42f87402aca75386ba358 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c b76b42ac9d6a36fc55a0797929fc94cc33e1334eea2792f5ee1eef868ce13320 +F src/vdbemem.c 14618670d96151efdcc0e0f0dd44a7a1acf94e065701159921e42ef19077b7d1 F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P adebffc18e6165672947a6bda5ca23ea7723cca7ab8da4feb81fca8f83e4fcaf -R b7271620cbaccc77f5dc0740795c22dc +P 05897ca48a40c6771ff83ba8ecc3a5c60dafddf58651c222dd8cf89b9fc7b077 +R c1522be20733136f28ced9b4722a52aa U drh -Z c38fee2bcfbeb4ee3d8baed90d28d7e4 +Z 5f545ffa57cd66d95ff033345f2b408a diff --git a/manifest.uuid b/manifest.uuid index eab2a2b2b9..8551903f4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05897ca48a40c6771ff83ba8ecc3a5c60dafddf58651c222dd8cf89b9fc7b077 \ No newline at end of file +d612fb7873cf59dfda18cabe45f674c37aa78a4587de3378b1840c99465a0269 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index c5452c5a89..78d46ebb7a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1501,7 +1501,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ + if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ goto no_mem; } MemSetTypeFlag(pOut, MEM_Str); @@ -1515,6 +1515,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ pIn1->flags = flags1; pOut->z[nByte]=0; pOut->z[nByte+1] = 0; + pOut->z[nByte+2] = 0; pOut->flags |= MEM_Term; pOut->n = (int)nByte; pOut->enc = encoding; diff --git a/src/vdbemem.c b/src/vdbemem.c index 34b7c1f840..8d39351fe7 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -118,7 +118,10 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ #ifdef SQLITE_DEBUG /* -** Check that string value of pMem agrees with its integer or real value. +** Validity checks on pMem. pMem holds a string. +** +** (1) Check that string value of pMem agrees with its integer or real value. +** (2) Check that the string is correctly zero terminated ** ** A single int or real value always converts to the same strings. But ** many different strings can be converted into the same int or real. @@ -136,11 +139,22 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ ** ** This routine is for use inside of assert() statements only. */ -int sqlite3VdbeMemConsistentDualRep(Mem *p){ +int sqlite3VdbeMemValidStrRep(Mem *p){ char zBuf[100]; char *z; int i, j, incr; if( (p->flags & MEM_Str)==0 ) return 1; + if( p->flags & MEM_Term ){ + /* Insure that the string is properly zero-terminated. Pay particular + ** attention to the case where p->n is odd */ + if( p->z==p->zMalloc && p->szMalloc>0 ){ + assert( p->enc==SQLITE_UTF8 || p->szMalloc >= ((p->n+1)&~1)+2 ); + assert( p->enc!=SQLITE_UTF8 || p->szMalloc >= p->n+1 ); + } + assert( p->z[p->n]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[(p->n+1)&~1]==0 ); + assert( p->enc==SQLITE_UTF8 || p->z[((p->n+1)&~1)+1]==0 ); + } if( (p->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ) return 1; vdbeMemRenderNum(sizeof(zBuf), zBuf, p); z = p->z; @@ -1221,7 +1235,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 || pVal->db->mallocFailed ); if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ - assert( sqlite3VdbeMemConsistentDualRep(pVal) ); + assert( sqlite3VdbeMemValidStrRep(pVal) ); return pVal->z; }else{ return 0; @@ -1244,7 +1258,7 @@ const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); assert( !sqlite3VdbeMemIsRowSet(pVal) ); if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ - assert( sqlite3VdbeMemConsistentDualRep(pVal) ); + assert( sqlite3VdbeMemValidStrRep(pVal) ); return pVal->z; } if( pVal->flags&MEM_Null ){ From 3196abb7cb7aec87656bb8e299319ba55e35a3a4 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 16 May 2019 03:47:38 +0000 Subject: [PATCH 04/96] Fix harmless compiler warning in the session extension. FossilOrigin-Name: dff823ca8b5ca4a5611407b0231f89b2e8c981f50e85e361e76d3e4973cea8ca --- ext/session/sqlite3session.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index acf455a509..8d1cd77275 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -1830,7 +1830,7 @@ int sqlite3session_attach( ** set *pRc to SQLITE_NOMEM and return non-zero. */ static int sessionBufferGrow(SessionBuffer *p, size_t nByte, int *pRc){ - if( *pRc==SQLITE_OK && p->nAlloc-p->nBufnAlloc-p->nBuf)nAlloc ? p->nAlloc : 128; do { diff --git a/manifest b/manifest index 39ca99b218..8753caf4e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sOP_Concat\sopcode\salways\scorrectly\szero-terminates\sa\sUTF16\nstring,\seven\sif\sthe\sinput\sstrings\sare\sill-formed.\s\sThis\sis\sa\sfollowup\sto\ncheck-in\s[3a16ddf91f0c9c516a7]\sthat\sfixes\sa\scase\sthe\sprevious\scheck-in\smissed.\nAlso\sadd\sassert()s\sto\sprove\scorrect\szero\stermination. -D 2019-05-16T01:22:21.954 +C Fix\sharmless\scompiler\swarning\sin\sthe\ssession\sextension. +D 2019-05-16T03:47:38.299 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -434,7 +434,7 @@ F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b295 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c 12c958dcd093fca229ca3d3fd833f2f99f1d9c70093dca60f697d5f8e20ebde1 +F ext/session/sqlite3session.c 53a110fc7f421fe5570b8393d791fab9252e57194c68b8149d6af2145cbddbaf F ext/session/sqlite3session.h 919be6649d39d6413ce7a63fc3e3bca3270e18bc2d57ad4040a70007b9e54397 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 05897ca48a40c6771ff83ba8ecc3a5c60dafddf58651c222dd8cf89b9fc7b077 -R c1522be20733136f28ced9b4722a52aa -U drh -Z 5f545ffa57cd66d95ff033345f2b408a +P d612fb7873cf59dfda18cabe45f674c37aa78a4587de3378b1840c99465a0269 +R 755335cc3633e819ff0edeec491ec5c4 +U mistachkin +Z aa932ea847c93a7effce40bd2a389e8f diff --git a/manifest.uuid b/manifest.uuid index 8551903f4e..772f918ea2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d612fb7873cf59dfda18cabe45f674c37aa78a4587de3378b1840c99465a0269 \ No newline at end of file +dff823ca8b5ca4a5611407b0231f89b2e8c981f50e85e361e76d3e4973cea8ca \ No newline at end of file From e72d1a8682ba69f163ed022178a286e69406ef40 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 16 May 2019 11:47:16 +0000 Subject: [PATCH 05/96] Fix a harmless use-of-initialized-value fault in the assert() logic added by check-in [d612fb7873cf59d] FossilOrigin-Name: 3dac90728a6a1962da478afe751582ddf8b6d4666548a805564817b21e07a246 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8753caf4e9..2a3810a71f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sin\sthe\ssession\sextension. -D 2019-05-16T03:47:38.299 +C Fix\sa\sharmless\suse-of-initialized-value\sfault\sin\sthe\sassert()\slogic\sadded\nby\scheck-in\s[d612fb7873cf59d] +D 2019-05-16T11:47:16.802 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c d444f4a3ff9c571965329a186701a57fe445e4c3f4c42f87402aca75386ba358 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 14618670d96151efdcc0e0f0dd44a7a1acf94e065701159921e42ef19077b7d1 +F src/vdbemem.c e9a0aa2feb93356333bcd94491c25bac041e63e3d87e4caac67fde742dd2deba F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d612fb7873cf59dfda18cabe45f674c37aa78a4587de3378b1840c99465a0269 -R 755335cc3633e819ff0edeec491ec5c4 -U mistachkin -Z aa932ea847c93a7effce40bd2a389e8f +P dff823ca8b5ca4a5611407b0231f89b2e8c981f50e85e361e76d3e4973cea8ca +R 5cac7cac2aae9a027ca8b23269506de3 +U drh +Z b31a97f638862af265326c481a9a46ed diff --git a/manifest.uuid b/manifest.uuid index 772f918ea2..4496b9767f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dff823ca8b5ca4a5611407b0231f89b2e8c981f50e85e361e76d3e4973cea8ca \ No newline at end of file +3dac90728a6a1962da478afe751582ddf8b6d4666548a805564817b21e07a246 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 8d39351fe7..ee4a4a3905 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -147,7 +147,7 @@ int sqlite3VdbeMemValidStrRep(Mem *p){ if( p->flags & MEM_Term ){ /* Insure that the string is properly zero-terminated. Pay particular ** attention to the case where p->n is odd */ - if( p->z==p->zMalloc && p->szMalloc>0 ){ + if( p->szMalloc>0 && p->z==p->zMalloc ){ assert( p->enc==SQLITE_UTF8 || p->szMalloc >= ((p->n+1)&~1)+2 ); assert( p->enc!=SQLITE_UTF8 || p->szMalloc >= p->n+1 ); } From 36c9301816ab0acb23db36517754f66295542e3b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 May 2019 16:44:47 +0000 Subject: [PATCH 06/96] Add new test file fts5corrupt4.test. FossilOrigin-Name: 5dfc4fe98a4821cbdbfd7dfddf221b00251b2a26bf58767a3956b64e9a4e92da --- ext/fts5/test/fts5corrupt4.test | 61 +++++++++++++++++++++++++++++++++ manifest | 13 +++---- manifest.uuid | 2 +- 3 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 ext/fts5/test/fts5corrupt4.test diff --git a/ext/fts5/test/fts5corrupt4.test b/ext/fts5/test/fts5corrupt4.test new file mode 100644 index 0000000000..dc9ca661d4 --- /dev/null +++ b/ext/fts5/test/fts5corrupt4.test @@ -0,0 +1,61 @@ +# 2019 May 16 +# +# 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. +# +#*********************************************************************** +# +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5corrupt4 + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} +sqlite3_fts5_may_be_corrupt 1 + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE ttt USING fts5(a, b); + INSERT INTO ttt + VALUES('e ee eee e ee eee e ee eee', 'eee ee e e e ee eee ee ee'); + INSERT INTO ttt SELECT a||a, b||b FROM ttt; + INSERT INTO ttt SELECT a||a, b||b FROM ttt; +} + +proc mutate {blob i} { + set o [expr {$i % [string length $blob]}] + set a [string range $blob 0 $o-1] + set b [string range $blob $o+1 end] + set v [expr int(rand()*255) - 127] + return "$a[binary format c $v]$b" +} +db func mutate mutate + +for {set j 1000} {$j <= 5000} {incr j 1000} { + do_test 1.$j { + for {set i 0} {$i < 1000} {incr i} { + execsql { + BEGIN; + UPDATE ttt_data SET block = mutate(block, $i) WHERE id>10; + } + foreach sql { + {SELECT snippet(ttt, -1, '.', '..', '[', ']'), * FROM ttt('e*')} + {SELECT snippet(ttt, -1, '.', '..', '[', ']'), * FROM ttt('e* NOT ee*')} + } { + catch { execsql $sql } + } + execsql ROLLBACK + } + } {} +} + +sqlite3_fts5_may_be_corrupt 0 +finish_test + diff --git a/manifest b/manifest index 2a3810a71f..ca1fa4f285 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\suse-of-initialized-value\sfault\sin\sthe\sassert()\slogic\sadded\nby\scheck-in\s[d612fb7873cf59d] -D 2019-05-16T11:47:16.802 +C Add\snew\stest\sfile\sfts5corrupt4.test. +D 2019-05-16T16:44:47.855 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -158,6 +158,7 @@ F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f F ext/fts5/test/fts5corrupt3.test 9f64bc23eff5c89d01fdbf2214bf05109d5759ebb32c07d9740175fb80e2f89d +F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1825,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dff823ca8b5ca4a5611407b0231f89b2e8c981f50e85e361e76d3e4973cea8ca -R 5cac7cac2aae9a027ca8b23269506de3 -U drh -Z b31a97f638862af265326c481a9a46ed +P 3dac90728a6a1962da478afe751582ddf8b6d4666548a805564817b21e07a246 +R 63eeb757d1b15e5973befcdcabc831a8 +U dan +Z c85f31c74673c2143742eceb64530a13 diff --git a/manifest.uuid b/manifest.uuid index 4496b9767f..da26bc5011 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3dac90728a6a1962da478afe751582ddf8b6d4666548a805564817b21e07a246 \ No newline at end of file +5dfc4fe98a4821cbdbfd7dfddf221b00251b2a26bf58767a3956b64e9a4e92da \ No newline at end of file From 0971ef45abb33fd7f44510aa095efcdae776301b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 16 May 2019 20:13:32 +0000 Subject: [PATCH 07/96] Fix an assert() in the OP_Delete opcode that could fail with a corrupt database. FossilOrigin-Name: 915388ab39ba3ca8681cd2613b91314aa965967f23a5bface90f54a3d6423300 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 +- test/corruptL.test | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ca1fa4f285..d7a6145b87 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\stest\sfile\sfts5corrupt4.test. -D 2019-05-16T16:44:47.855 +C Fix\san\sassert()\sin\sthe\sOP_Delete\sopcode\sthat\scould\sfail\swith\sa\scorrupt\sdatabase. +D 2019-05-16T20:13:32.259 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,7 +594,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 4c0669e042b4e50a08a9e5fd14cecc76e5f877efa288533dccddb6fe98f4d6b5 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 27fe1628d39aa7d71645d6a26f70066bd0e17cd74d010bad3bf73879efbe216a +F src/vdbe.c 41d8cc6e12e026428997f57923b847d414235b2111a6fd5b2bebcc42cc5b3001 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -766,7 +766,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test b6ea0f657b26a8fe10405a9f5970f94de47fdfcc02fce2a635954aef13e55a88 +F test/corruptL.test 15882a75d06de29df9ad33a3503eb0fe21efbd1afcd676949c0d82e1f4e55360 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3dac90728a6a1962da478afe751582ddf8b6d4666548a805564817b21e07a246 -R 63eeb757d1b15e5973befcdcabc831a8 +P 5dfc4fe98a4821cbdbfd7dfddf221b00251b2a26bf58767a3956b64e9a4e92da +R 4f3b5e878bd55096d308bc1102b9455e U dan -Z c85f31c74673c2143742eceb64530a13 +Z 99032e8e5af3e03cd1215b2fa213f92f diff --git a/manifest.uuid b/manifest.uuid index da26bc5011..fec405e020 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5dfc4fe98a4821cbdbfd7dfddf221b00251b2a26bf58767a3956b64e9a4e92da \ No newline at end of file +915388ab39ba3ca8681cd2613b91314aa965967f23a5bface90f54a3d6423300 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 78d46ebb7a..0c20afbb0d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4784,7 +4784,7 @@ case OP_Delete: { ** OP_Delete will have also set the pC->movetoTarget field to the rowid of ** the row that is being deleted */ i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); - assert( pC->movetoTarget==iKey ); + assert( CORRUPT_DB || pC->movetoTarget==iKey ); } #endif diff --git a/test/corruptL.test b/test/corruptL.test index 61b582d0ab..53a68a0258 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1008,4 +1008,56 @@ do_catchsql_test 10.1 { } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 595 pagesize 512 filename x.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 02 00 00 01 00 40 20 20 00 01 00 0c 00 00 00 07 .....@ ........ +| 32: 00 00 00 05 07 a1 1f fa 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 01 00 00 49 00 00 00 00 00 05 00 00 00 00 .....I.......... +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c ................ +| 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ +| 112: 01 56 01 86 01 2a 01 06 00 00 62 00 00 00 00 00 .V...*....b..... +| 128: 00 ed e2 78 74 64 33 ff 43 52 45 41 54 45 20 49 ...xtd3.CREATE I +| 144: 4e 44 45 58 20 74 33 78 20 4f 4e 20 74 33 28 38 NDEX t3x ON t3(8 +| 160: 29 2e 04 06 17 15 11 01 45 69 6e 64 65 68 74 32 ).......Eindeht2 +| 176: 63 64 74 31 e5 43 52 45 41 54 45 20 49 4e 44 45 cdt1.CREATE INDE +| 192: 58 20 74 32 63 c4 20 4f 4e 20 74 32 28 63 2c 64 X t2c. ON t2(c,d +| 208: 29 28 05 06 17 01 11 11 3d 74 61 6c 36 74 62 74 )(......=tal6tbt +| 224: 65 32 04 43 52 45 41 54 45 20 54 41 42 4c 45 20 e2.CREATE TABLE +| 240: 74 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 t............... +| 256: 00 00 00 00 00 00 22 07 06 17 11 11 01 30 e8 03 .............0.. +| 272: 62 6c 65 74 34 74 35 02 43 52 45 41 54 45 20 54 blet4t5.CREATE T +| 288: 41 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11 ABLE t4(.)*..... +| 304: 01 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45 .?i3tnexxtd3.CRE +| 320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e ATE INDEX t3x ON +| 336: 20 74 31 28 38 29 2e 04 06 17 15 11 01 45 69 6e t1(8).......Ein +| 352: 64 65 68 74 32 63 64 74 31 e5 43 52 45 41 54 45 deht2cdt1.CREATE +| 368: 20 49 4e 44 45 58 20 74 32 63 c4 20 4f 4e 20 74 INDEX t2c. ON t +| 384: 32 28 63 2c 64 29 28 05 06 17 01 11 11 3d 74 61 2(c,d)(......=ta +| 400: 6c 32 74 62 74 65 32 04 43 52 45 41 54 45 20 54 l2tbte2.CREATE T +| 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) +| 432: 28 02 06 17 11 11 01 3d 74 61 9e 93 65 74 32 74 (......=ta..et2t +| 448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 2.CREATE TABLE t +| 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... +| 480: 01 35 55 61 62 6c 88 74 31 74 31 02 43 52 45 41 .5Uabl.t1t1.CREA +| 496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 TE TABLE t1(a,b) +| page 2 offset 512 +| 0: 0d 00 00 00 0d 25 00 01 cf 00 01 fa 01 f3 01 de .....%.......... +| 16: 01 00 00 00 fd 00 00 0d 00 00 00 00 45 20 54 41 ............E TA +| 32: 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11 01 BLE t4(.)*...... +| 48: 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45 a0 ?i3tnexxtd3.CRE. +| 64: a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 74 13 11 01 ............t... +| 80: 49 45 74 00 00 00 00 00 00 00 00 00 00 00 00 00 IEt............. +| end x.db +}]} {} + +do_catchsql_test 11.1 { + DELETE FROM t3 WHERE x IN (SELECT x FROM t4); +} {1 {database disk image is malformed}} + finish_test From 5c2f2206b63f7cfabb9e0211e8887d6cd915e983 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 16 May 2019 20:36:07 +0000 Subject: [PATCH 08/96] Initialize the 18-byte overrun area on the buffer used to reconstruct overflow btree cells during a btree search, to avoid a harmless jump-depends-on-uninit-values warning. FossilOrigin-Name: 4b05caeb1b9767ba58cb4261ecc22cdd495216b3258d45f2165cdbd3ea079495 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d7a6145b87..707a2bd0f5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sthe\sOP_Delete\sopcode\sthat\scould\sfail\swith\sa\scorrupt\sdatabase. -D 2019-05-16T20:13:32.259 +C Initialize\sthe\s18-byte\soverrun\sarea\son\sthe\sbuffer\sused\sto\sreconstruct\noverflow\sbtree\scells\sduring\sa\sbtree\ssearch,\sto\savoid\sa\sharmless\njump-depends-on-uninit-values\swarning. +D 2019-05-16T20:36:07.863 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -463,7 +463,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c b1d37f6f7f5913944583733ed0f9e182f3ece0d42c27f46701142141a6e6fd33 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 5e15f903fd44b076b864a8d2449d63b44a546efabb66fca7dfed90f106f5c756 +F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c aead3d74794ed4dac396fdd9323ba2272e3734f07c5d7f1f57389e5afbd99f3f @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5dfc4fe98a4821cbdbfd7dfddf221b00251b2a26bf58767a3956b64e9a4e92da -R 4f3b5e878bd55096d308bc1102b9455e -U dan -Z 99032e8e5af3e03cd1215b2fa213f92f +P 915388ab39ba3ca8681cd2613b91314aa965967f23a5bface90f54a3d6423300 +R ed531e4ba41699ff8df485c2669f625d +U drh +Z 007bff55daf3bf51cb6e94d75161e1f9 diff --git a/manifest.uuid b/manifest.uuid index fec405e020..d982294e7d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -915388ab39ba3ca8681cd2613b91314aa965967f23a5bface90f54a3d6423300 \ No newline at end of file +4b05caeb1b9767ba58cb4261ecc22cdd495216b3258d45f2165cdbd3ea079495 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 47c5dd9f70..6c73a94223 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5524,6 +5524,7 @@ int sqlite3BtreeMovetoUnpacked( ** case this happens. */ void *pCellKey; u8 * const pCellBody = pCell - pPage->childPtrSize; + const int nOverrun = 18; /* Size of the overrun padding */ pPage->xParseCell(pPage, pCellBody, &pCur->info); nCell = (int)pCur->info.nKey; testcase( nCell<0 ); /* True if key size is 2^32 or more */ @@ -5534,13 +5535,14 @@ int sqlite3BtreeMovetoUnpacked( rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } - pCellKey = sqlite3Malloc( nCell+18 ); + pCellKey = sqlite3Malloc( nCell+nOverrun ); if( pCellKey==0 ){ rc = SQLITE_NOMEM_BKPT; goto moveto_finish; } pCur->ix = (u16)idx; rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ pCur->curFlags &= ~BTCF_ValidOvfl; if( rc ){ sqlite3_free(pCellKey); From 829d4253ffa2e0bb5cc6ca37f0bf5053fd8db930 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 16 May 2019 20:40:08 +0000 Subject: [PATCH 09/96] Add test cases to test/fuzzdata7.db for (harmless) dbfuzz2 finds. FossilOrigin-Name: 1eb2a628e4bfae51fea43e8f40fedfe23f2118024d9cce35828c3cbe92a9b392 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata7.db | Bin 16807936 -> 16811008 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 707a2bd0f5..292ae9a3db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Initialize\sthe\s18-byte\soverrun\sarea\son\sthe\sbuffer\sused\sto\sreconstruct\noverflow\sbtree\scells\sduring\sa\sbtree\ssearch,\sto\savoid\sa\sharmless\njump-depends-on-uninit-values\swarning. -D 2019-05-16T20:36:07.863 +C Add\stest\scases\sto\stest/fuzzdata7.db\sfor\s(harmless)\sdbfuzz2\sfinds. +D 2019-05-16T20:40:08.037 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1002,7 +1002,7 @@ F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 2b13f8d7a4e475f164c733e64c9ebc459424ec58d0876ef103de62c1a99e2fca +F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 F test/fuzzdata8.db ae3f4f364f798cd73b1769ca701878e40cbaa6fb8726a94148bce8062fada5c3 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 915388ab39ba3ca8681cd2613b91314aa965967f23a5bface90f54a3d6423300 -R ed531e4ba41699ff8df485c2669f625d +P 4b05caeb1b9767ba58cb4261ecc22cdd495216b3258d45f2165cdbd3ea079495 +R a338144cc8cfe21be9496df48c4b4839 U drh -Z 007bff55daf3bf51cb6e94d75161e1f9 +Z f89dd532b3c5655312d5052f04d46bf4 diff --git a/manifest.uuid b/manifest.uuid index d982294e7d..b83bd3c730 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b05caeb1b9767ba58cb4261ecc22cdd495216b3258d45f2165cdbd3ea079495 \ No newline at end of file +1eb2a628e4bfae51fea43e8f40fedfe23f2118024d9cce35828c3cbe92a9b392 \ No newline at end of file diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index fb111d865fddf4da32fe8faeeb7e3830696846d4..262a22107f442158de0bee9e54b860e1b80f6b22 100644 GIT binary patch delta 419248 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 cOcc5hxd+uC`n<}OQrJ5 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

CFu*V#s@*2^SQrgwbKCw^+^ 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

{zjlg(Sr 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

ak!=ZmhlrW`>P9ly&)8Crq=$A%rZ|{)&SpB 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 z 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 UGO$6#ix;u=Y+$*65$N^*3rVOVVgLXD delta 419042 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 From be812624006aa7ca3acef17161ed6ea8de24d004 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 17 May 2019 15:59:11 +0000 Subject: [PATCH 10/96] Always store a REAL value in a column with REAL affinity if the integer equivalent would require 8 bytes of storage. Fix for [3c27b97e3]. FossilOrigin-Name: 14c00b1016ba53ab2dc177c59a27b6b9209202973685f0f274112d296ba7dfcb --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 4 ++++ test/intreal.test | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 292ae9a3db..8a6bb1f1d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\stest/fuzzdata7.db\sfor\s(harmless)\sdbfuzz2\sfinds. -D 2019-05-16T20:40:08.037 +C Always\sstore\sa\sREAL\svalue\sin\sa\scolumn\swith\sREAL\saffinity\sif\sthe\sinteger\sequivalent\swould\srequire\s8\sbytes\sof\sstorage.\sFix\sfor\s[3c27b97e3]. +D 2019-05-17T15:59:11.410 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,7 +594,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 4c0669e042b4e50a08a9e5fd14cecc76e5f877efa288533dccddb6fe98f4d6b5 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 41d8cc6e12e026428997f57923b847d414235b2111a6fd5b2bebcc42cc5b3001 +F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1060,7 +1060,7 @@ F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 1d03e48c53224b69efc8cb7349f009e388c116790bfdb4d320b233d603aaba9a +F test/intreal.test 2c80b5c90c597e65c6606b333515261c73a534b6c527b7009e97ed6b78f8b79a F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4b05caeb1b9767ba58cb4261ecc22cdd495216b3258d45f2165cdbd3ea079495 -R a338144cc8cfe21be9496df48c4b4839 -U drh -Z f89dd532b3c5655312d5052f04d46bf4 +P 1eb2a628e4bfae51fea43e8f40fedfe23f2118024d9cce35828c3cbe92a9b392 +R 89d153f510a379ba4d9fb0045ff12ab5 +U dan +Z f8c6a84d28611f5f221654c971d8da9d diff --git a/manifest.uuid b/manifest.uuid index b83bd3c730..fe2d76e69d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1eb2a628e4bfae51fea43e8f40fedfe23f2118024d9cce35828c3cbe92a9b392 \ No newline at end of file +14c00b1016ba53ab2dc177c59a27b6b9209202973685f0f274112d296ba7dfcb \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 0c20afbb0d..c8dd618adf 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2884,6 +2884,10 @@ case OP_MakeRecord: { pRec = pData0; do{ applyAffinity(pRec, zAffinity[0], encoding); + if( zAffinity[0]==SQLITE_AFF_REAL && (pRec->flags & MEM_Int) ){ + pRec->flags |= MEM_IntReal; + pRec->flags &= ~(MEM_Int); + } REGISTER_TRACE((int)(pRec-aMem), pRec); zAffinity++; pRec++; diff --git a/test/intreal.test b/test/intreal.test index a99e23d430..cf2c3b79ae 100644 --- a/test/intreal.test +++ b/test/intreal.test @@ -46,7 +46,41 @@ do_execsql_test 180 { max(1,intreal(5),intreal(3),4); } {5.0 5.0} +#------------------------------------------------------------------------- +do_execsql_test 2.1 { + CREATE TABLE t2(a REAL); + INSERT INTO t2 VALUES( 836627109860825358 ); + SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL); +} {8.36} +do_execsql_test 2.2 { + CREATE INDEX i2 ON t2(a); + SELECT substr(a,1,4) FROM t2 WHERE a = CAST(836627109860825358 AS REAL); +} {8.36} + +do_execsql_test 2.3 { + CREATE TABLE t0 (c0); + CREATE TABLE t1 (c1 REAL); + INSERT INTO t1(c1) VALUES (8366271098608253588); + INSERT INTO t0(c0) VALUES ('a'); +} +set D [db one {SELECT c1 FROM t1}] + +do_execsql_test 2.4 { + SELECT * FROM t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL)); +} $D + +do_execsql_test 2.5 { + SELECT * FROM t0, t1 WHERE (t1.c1 = CAST(8366271098608253588 AS REAL)); +} [list a $D] + +do_execsql_test 2.6 { + SELECT * FROM t0, t1 + WHERE ( + t1.c1 >= CAST(8366271098608253588 AS REAL) + AND t1.c1 <= CAST(8366271098608253588 AS REAL) + ); +} [list a $D] finish_test From 6c35b3065c509ec49a0ca40c85df2fdf3274306b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 17 May 2019 20:37:17 +0000 Subject: [PATCH 11/96] Disable PRAGMA journal_mode=OFF when SQLITE_DBCONFIG_DEFENSIVE is turned on. Ticket [f4ec250930342e0c]. FossilOrigin-Name: a0f5eb5c79cc33b7224f3421d2baa02a2a19eb9d6eaa8117dda4a1878b229cb5 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/pragma.c | 5 +++++ src/sqlite.h.in | 1 + test/jrnlmode.test | 11 ++++++++++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 8a6bb1f1d9..14375326fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\sstore\sa\sREAL\svalue\sin\sa\scolumn\swith\sREAL\saffinity\sif\sthe\sinteger\sequivalent\swould\srequire\s8\sbytes\sof\sstorage.\sFix\sfor\s[3c27b97e3]. -D 2019-05-17T15:59:11.410 +C Disable\sPRAGMA\sjournal_mode=OFF\swhen\sSQLITE_DBCONFIG_DEFENSIVE\sis\sturned\son.\nTicket\s[f4ec250930342e0c]. +D 2019-05-17T20:37:17.292 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/parse.y 22f64d8a8910acd17580450513b58d64187b0962848380c7f0a39376b8a48cee F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d -F src/pragma.c 2e9fbfcb23cb72eabb38ab6fa84c36a65f9c4839ce1e9bb3dd982ab26b67a5a8 +F src/pragma.c 00046255566744b4a3086286d50f66f08531c53403bf64623abc4d86ca677173 F src/pragma.h 482c26f352efd7a4ed1354d83ffa992e13004f6528edeee44cdbfd5025a490bd F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd @@ -524,7 +524,7 @@ F src/resolve.c 408632d9531ca8f1df8591f00530797daaa7bde3fe0d3211de4d431cbb99347e F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 -F src/sqlite.h.in 0605c88d98c85fbcba8bbd9716e7cc10b361e7b21cf2375171130f577388c943 +F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 F src/sqliteInt.h b78a1f0bdc46582f33876932f8b45a264be7ee4f3f6c31102f924d33fa6177ee @@ -1078,7 +1078,7 @@ F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 F test/journal3.test 939a3578396dffa0cdaa9b2685088c5a1a644db90d61aca08bd7e19d33932c00 -F test/jrnlmode.test a6693f2bed4541a21e703aaa37bb3e10de154130645952933b82b2dec0a8b539 +F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1eb2a628e4bfae51fea43e8f40fedfe23f2118024d9cce35828c3cbe92a9b392 -R 89d153f510a379ba4d9fb0045ff12ab5 -U dan -Z f8c6a84d28611f5f221654c971d8da9d +P 14c00b1016ba53ab2dc177c59a27b6b9209202973685f0f274112d296ba7dfcb +R 288f772b42222d23f2e7cf9a9376af07 +U drh +Z b868be56cdcb778989571f3a1cfd1c2d diff --git a/manifest.uuid b/manifest.uuid index fe2d76e69d..ee796ca1d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14c00b1016ba53ab2dc177c59a27b6b9209202973685f0f274112d296ba7dfcb \ No newline at end of file +a0f5eb5c79cc33b7224f3421d2baa02a2a19eb9d6eaa8117dda4a1878b229cb5 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 90ecdfcc5d..3c120dc71f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -644,6 +644,11 @@ void sqlite3Pragma( ** then do a query */ eMode = PAGER_JOURNALMODE_QUERY; } + if( eMode==PAGER_JOURNALMODE_OFF && (db->flags & SQLITE_Defensive)!=0 ){ + /* Do not allow journal-mode "OFF" in defensive since the database + ** can become corrupted using ordinary SQL when the journal is off */ + eMode = PAGER_JOURNALMODE_QUERY; + } } if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index b9c2330d46..e6f9802dad 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2198,6 +2198,7 @@ struct sqlite3_mem_methods { ** features include but are not limited to the following: **

diff --git a/test/jrnlmode.test b/test/jrnlmode.test index 3112f6184e..99823a8725 100644 --- a/test/jrnlmode.test +++ b/test/jrnlmode.test @@ -65,7 +65,16 @@ do_test jrnlmode-1.2 { PRAGMA temp.journal_mode; } } [list persist persist [temp_journal_mode persist]] -do_test jrnlmode-1.4 { +do_test jrnlmode-1.4a { + # When defensive is on, unable to set journal_mode to OFF + sqlite3_db_config db DEFENSIVE 1 + execsql { + PRAGMA journal_mode = off; + } +} {persist} +do_test jrnlmode-1.4b { + # When defensive is on, unable to set journal_mode to OFF + sqlite3_db_config db DEFENSIVE 0 execsql { PRAGMA journal_mode = off; } From 4db4b5b4fe62fc9055209e4341d33ed3dd20d70f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 18 May 2019 19:49:08 +0000 Subject: [PATCH 12/96] Avoid including the comment in the output of "PRAGMA table_info" in situations where there is a comment following a DEFAULT value within a CREATE TABLE statement. FossilOrigin-Name: d91095ba7130e974f0c95334760c679a31479b07a3d458e15994a24eee474752 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/parse.y | 18 +++++++++++------- test/pragma4.test | 10 ++++++++++ 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 14375326fb..f04f7129e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sPRAGMA\sjournal_mode=OFF\swhen\sSQLITE_DBCONFIG_DEFENSIVE\sis\sturned\son.\nTicket\s[f4ec250930342e0c]. -D 2019-05-17T20:37:17.292 +C Avoid\sincluding\sthe\scomment\sin\sthe\soutput\sof\s"PRAGMA\stable_info"\sin\ssituations\swhere\sthere\sis\sa\scomment\sfollowing\sa\sDEFAULT\svalue\swithin\sa\sCREATE\sTABLE\sstatement. +D 2019-05-18T19:49:08.397 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 22f64d8a8910acd17580450513b58d64187b0962848380c7f0a39376b8a48cee +F src/parse.y 91f76f436db1c0ed3cc8a82ba6c945a592dc24a036f0ff7b48313bd80977d382 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -1212,7 +1212,7 @@ F test/pg_common.tcl 4740dc35190d6acdab14c097783331361301ab504a94d948f6afbb56ce0 F test/pragma.test cf066fe0f7f5d49f4758de4986407b8676c61aaa7871599340d64f42a8edc352 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 -F test/pragma4.test 26b250531f1c58d9b6187b663f411cd6baf227a4afeffa8f75d0f4c101f4920d +F test/pragma4.test 1cb4b32f1a304ed9e291d7c4d49c91c2c8dc1b9450e6d2c1198b2cc895d40d77 F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 14c00b1016ba53ab2dc177c59a27b6b9209202973685f0f274112d296ba7dfcb -R 288f772b42222d23f2e7cf9a9376af07 -U drh -Z b868be56cdcb778989571f3a1cfd1c2d +P a0f5eb5c79cc33b7224f3421d2baa02a2a19eb9d6eaa8117dda4a1878b229cb5 +R a29dae5cf2c74cf9fd15fd4830864202 +U dan +Z 52a3c57118f7c33eb28d32312e370c68 diff --git a/manifest.uuid b/manifest.uuid index ee796ca1d6..69ba9d6ece 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0f5eb5c79cc33b7224f3421d2baa02a2a19eb9d6eaa8117dda4a1878b229cb5 \ No newline at end of file +d91095ba7130e974f0c95334760c679a31479b07a3d458e15994a24eee474752 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index c87c759cca..46faa9a369 100644 --- a/src/parse.y +++ b/src/parse.y @@ -301,6 +301,10 @@ scanpt(A) ::= . { assert( yyLookahead!=YYNOCODE ); A = yyLookaheadToken.z; } +scantok(A) ::= . { + assert( yyLookahead!=YYNOCODE ); + A = yyLookaheadToken; +} // "carglist" is a list of additional constraints that come after the // column name and column type in a CREATE TABLE statement. @@ -308,17 +312,17 @@ scanpt(A) ::= . { carglist ::= carglist ccons. carglist ::= . ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} -ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z). - {sqlite3AddDefaultValue(pParse,X,A,Z);} +ccons ::= DEFAULT scantok(A) term(X). + {sqlite3AddDefaultValue(pParse,X,A.z,&A.z[A.n]);} ccons ::= DEFAULT LP(A) expr(X) RP(Z). {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);} -ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z). - {sqlite3AddDefaultValue(pParse,X,A.z,Z);} -ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z). { +ccons ::= DEFAULT PLUS(A) scantok(Z) term(X). + {sqlite3AddDefaultValue(pParse,X,A.z,&Z.z[Z.n]);} +ccons ::= DEFAULT MINUS(A) scantok(Z) term(X). { Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0); - sqlite3AddDefaultValue(pParse,p,A.z,Z); + sqlite3AddDefaultValue(pParse,p,A.z,&Z.z[Z.n]); } -ccons ::= DEFAULT scanpt id(X). { +ccons ::= DEFAULT scantok id(X). { Expr *p = tokenExpr(pParse, TK_STRING, X); if( p ){ sqlite3ExprIdToTrueFalse(p); diff --git a/test/pragma4.test b/test/pragma4.test index afc7260484..bceb4b84f4 100644 --- a/test/pragma4.test +++ b/test/pragma4.test @@ -249,4 +249,14 @@ do_catchsql_test 4.6.5 { pragma foreign_key_check('c2') } {1 {no such table: c2}} +do_execsql_test 5.0 { + CREATE TABLE t4(a DEFAULT 'abc' /* comment */, b DEFAULT -1 -- comment + , c DEFAULT +4.0 /* another comment */ + ); + PRAGMA table_info = t4; +} { + 0 a {} 0 'abc' 0 1 b {} 0 -1 0 2 c {} 0 +4.0 0 +} + + finish_test From 7ac0e562a384a45458aa66c8cffeabaf532e111c Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 18 May 2019 21:22:25 +0000 Subject: [PATCH 13/96] Fix an assert() failure that could occur in a join query if the RHS of an IN() operator is a list containing correlated expressions. This problem was introduced by checkin [e130319317e7611938] which was part of the fix for ticket [787fa716be3a7f650c] - so this commit is part of that ticket's fix too. FossilOrigin-Name: 778b1224a318d0137c7dab8361128f593506d3677267898119b934b4d66dfe38 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 1 + test/join5.test | 21 +++++++++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f04f7129e2..24ec9bdca6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sincluding\sthe\scomment\sin\sthe\soutput\sof\s"PRAGMA\stable_info"\sin\ssituations\swhere\sthere\sis\sa\scomment\sfollowing\sa\sDEFAULT\svalue\swithin\sa\sCREATE\sTABLE\sstatement. -D 2019-05-18T19:49:08.397 +C Fix\san\sassert()\sfailure\sthat\scould\soccur\sin\sa\sjoin\squery\sif\sthe\sRHS\sof\san\sIN()\soperator\sis\sa\slist\scontaining\scorrelated\sexpressions.\sThis\sproblem\swas\sintroduced\sby\scheckin\s[e130319317e7611938]\swhich\swas\spart\sof\sthe\sfix\sfor\sticket\s[787fa716be3a7f650c]\s-\sso\sthis\scommit\sis\spart\sof\sthat\sticket's\sfix\stoo. +D 2019-05-18T21:22:25.658 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c a41e5a03d60e2d99a8eac1535f21258e3833b29a3f52789e76284d97b54bed5f +F src/expr.c 5176c490d28e9bc712c85794694790ac586232e9d3ddd6b5ab92019347e0d78b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475 @@ -1073,7 +1073,7 @@ F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test f8b5ffdf3c1513486b52ad4e49225507ecee5005f210eb18688f791d25370972 +F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 @@ -1826,7 +1826,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a0f5eb5c79cc33b7224f3421d2baa02a2a19eb9d6eaa8117dda4a1878b229cb5 -R a29dae5cf2c74cf9fd15fd4830864202 +P d91095ba7130e974f0c95334760c679a31479b07a3d458e15994a24eee474752 +R f1155cf0ff4484b435a49607e277353e U dan -Z 52a3c57118f7c33eb28d32312e370c68 +Z 9a3b08c2ceb04898261f90540609f8f6 diff --git a/manifest.uuid b/manifest.uuid index 69ba9d6ece..d4ea795bfd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d91095ba7130e974f0c95334760c679a31479b07a3d458e15994a24eee474752 \ No newline at end of file +778b1224a318d0137c7dab8361128f593506d3677267898119b934b4d66dfe38 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index a905c28c9b..4b37e5525e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2808,6 +2808,7 @@ void sqlite3CodeRhsOfIN( */ if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ sqlite3VdbeChangeToNoop(v, addrOnce); + ExprClearProperty(pExpr, EP_Subrtn); addrOnce = 0; } diff --git a/test/join5.test b/test/join5.test index f4ded796bf..6724419e6d 100644 --- a/test/join5.test +++ b/test/join5.test @@ -306,4 +306,25 @@ do_eqp_test 7.4 { `--SEARCH TABLE t4 USING INDEX t4xz (x=?) } +reset_db +do_execsql_test 8.0 { + CREATE TABLE t0 (c0, c1, PRIMARY KEY (c0, c1)); + CREATE TABLE t1 (c0); + + INSERT INTO t1 VALUES (2); + + INSERT INTO t0 VALUES(0, 10); + INSERT INTO t0 VALUES(1, 10); + INSERT INTO t0 VALUES(2, 10); + INSERT INTO t0 VALUES(3, 10); +} + +do_execsql_test 8.1 { + SELECT * FROM t0, t1 + WHERE (t0.c1 >= 1 OR t0.c1 < 1) AND t0.c0 IN (1, t1.c0) ORDER BY 1; +} { + 1 10 2 + 2 10 2 +} + finish_test From 8ac02a94ab5ee7496c053c417a77bc620bb548fb Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 20 May 2019 10:36:15 +0000 Subject: [PATCH 14/96] Update the sqlite3ExprCompare() routine so that it does not think "? IS NOT TRUE" is the same as "? IS TRUE". Fix for [d3e7f2ba5b3]. FossilOrigin-Name: 99eba69b3a64741c69d167bf7a05dbe138c9e7faecc54a1b8d8220cb23902830 --- manifest | 17 ++++++++------- manifest.uuid | 2 +- src/expr.c | 1 + src/sqliteInt.h | 2 +- test/expr2.test | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ test/index7.test | 12 +++++++++++ 6 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 test/expr2.test diff --git a/manifest b/manifest index 24ec9bdca6..5e6ce0bc3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sfailure\sthat\scould\soccur\sin\sa\sjoin\squery\sif\sthe\sRHS\sof\san\sIN()\soperator\sis\sa\slist\scontaining\scorrelated\sexpressions.\sThis\sproblem\swas\sintroduced\sby\scheckin\s[e130319317e7611938]\swhich\swas\spart\sof\sthe\sfix\sfor\sticket\s[787fa716be3a7f650c]\s-\sso\sthis\scommit\sis\spart\sof\sthat\sticket's\sfix\stoo. -D 2019-05-18T21:22:25.658 +C Update\sthe\ssqlite3ExprCompare()\sroutine\sso\sthat\sit\sdoes\snot\sthink\s"?\sIS\sNOT\sTRUE"\sis\sthe\ssame\sas\s"?\sIS\sTRUE".\sFix\sfor\s[d3e7f2ba5b3]. +D 2019-05-20T10:36:15.759 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 5176c490d28e9bc712c85794694790ac586232e9d3ddd6b5ab92019347e0d78b +F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475 @@ -527,7 +527,7 @@ F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h b78a1f0bdc46582f33876932f8b45a264be7ee4f3f6c31102f924d33fa6177ee +F src/sqliteInt.h dd3fba28d7012f18ee91b58f5485ba33e016728b9812200a77d699c6e6872177 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -849,6 +849,7 @@ F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea +F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 @@ -1040,7 +1041,7 @@ F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473a F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test a6cf96bb70bf57b2221e102060a18af46bc366f704722f410d6f42c13a75534a -F test/index7.test be02a0b4e53ac4ad7db4995fe02b428597a2e104c4f574b0d4b2f6b082e96b28 +F test/index7.test 2222ccd1858097f734d6ac3d39117334fd1cc26460f92fced4ef57cd15c940c1 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e @@ -1826,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d91095ba7130e974f0c95334760c679a31479b07a3d458e15994a24eee474752 -R f1155cf0ff4484b435a49607e277353e +P 778b1224a318d0137c7dab8361128f593506d3677267898119b934b4d66dfe38 +R 5a1add4e7a87cebf7597568b0b99195a U dan -Z 9a3b08c2ceb04898261f90540609f8f6 +Z 97bcb2ba5bbf708b820c2c5cf8e8bff1 diff --git a/manifest.uuid b/manifest.uuid index d4ea795bfd..89d6b2d2c4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -778b1224a318d0137c7dab8361128f593506d3677267898119b934b4d66dfe38 \ No newline at end of file +99eba69b3a64741c69d167bf7a05dbe138c9e7faecc54a1b8d8220cb23902830 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4b37e5525e..2d41fc447f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4862,6 +4862,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ && (combinedFlags & EP_Reduced)==0 ){ if( pA->iColumn!=pB->iColumn ) return 2; + if( pA->op2!=pB->op2 ) return 2; if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2056d5a5a5..6f7b181090 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2481,7 +2481,7 @@ struct Expr { ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ - u8 op2; /* TK_REGISTER: original value of Expr.op + u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op ** TK_COLUMN: the value of p5 for OP_Column ** TK_AGG_FUNCTION: nesting depth */ AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ diff --git a/test/expr2.test b/test/expr2.test new file mode 100644 index 0000000000..3dfbadcd90 --- /dev/null +++ b/test/expr2.test @@ -0,0 +1,54 @@ +# 2019 May 20 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing expressions. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix expr2 + +do_execsql_test 1.0 { + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES ('val'); +} + +do_execsql_test 1.1 { + SELECT * FROM t0 WHERE ( + ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) IS 0 + ) +} {val} + +do_execsql_test 1.2.1 { + SELECT + ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) IS 0 + FROM t0 +} {1} + +do_execsql_test 1.2.2 { + SELECT + ( (0 IS NOT FALSE) OR NOT (0 IS 0 OR (t0.c0 = 1)) ) IS 0 + FROM t0 +} {1} + +do_execsql_test 1.3 { + SELECT ( (0 IS NOT FALSE) OR NOT (0 IS FALSE OR (t0.c0 = 1)) ) FROM t0 +} {0} + +do_execsql_test 1.4.1 { + SELECT (0 IS NOT FALSE) FROM t0 +} {0} +do_execsql_test 1.4.2 { + SELECT NOT (0 IS FALSE OR (t0.c0 = 1)) FROM t0 +} {0} + + +finish_test diff --git a/test/index7.test b/test/index7.test index bd529dfbcd..33abbafd95 100644 --- a/test/index7.test +++ b/test/index7.test @@ -327,5 +327,17 @@ do_catchsql_test index7-6.5 { CREATE INDEX t5a ON t5(a) WHERE a=#1; } {1 {near "#1": syntax error}} +do_execsql_test index7-7.0 { + CREATE TABLE t6(x, y); + INSERT INTO t6 VALUES(1, 1); + INSERT INTO t6 VALUES(0, 0); + SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; +} {1 1} + +do_execsql_test index7-7.1 { + CREATE INDEX i6 ON t6(x) WHERE y IS NOT TRUE; + SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; +} {1 1} + finish_test From 0d92571d65393ae87f01f533eee2a6075b122efc Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 20 May 2019 17:14:25 +0000 Subject: [PATCH 15/96] Disallow string constants enclosed in double-quotes within new CREATE TABLE and CREATE INDEX statements. It is still possible to enclose column names in double-quotes, and existing database schemas that use double-quotes for strings can still be loaded. This addresses ticket [9b78184b]. FossilOrigin-Name: 1685610ef8e0dc9218b02461ceab14dc6114f4f5ef7fcda0da395094aff443e1 --- manifest | 18 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 9 ++++++-- src/sqliteInt.h | 3 ++- test/check.test | 2 ++ test/quote.test | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 75 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 5e6ce0bc3e..1eaaa80fbf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\ssqlite3ExprCompare()\sroutine\sso\sthat\sit\sdoes\snot\sthink\s"?\sIS\sNOT\sTRUE"\sis\sthe\ssame\sas\s"?\sIS\sTRUE".\sFix\sfor\s[d3e7f2ba5b3]. -D 2019-05-20T10:36:15.759 +C Disallow\sstring\sconstants\senclosed\sin\sdouble-quotes\swithin\snew\sCREATE\sTABLE\sand\sCREATE\sINDEX\sstatements.\sIt\sis\sstill\spossible\sto\senclose\scolumn\snames\sin\sdouble-quotes,\sand\sexisting\sdatabase\sschemas\sthat\suse\sdouble-quotes\sfor\sstrings\scan\sstill\sbe\sloaded.\sThis\saddresses\sticket\s[9b78184b]. +D 2019-05-20T17:14:25.060 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,14 +520,14 @@ F src/pragma.h 482c26f352efd7a4ed1354d83ffa992e13004f6528edeee44cdbfd5025a490bd F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 408632d9531ca8f1df8591f00530797daaa7bde3fe0d3211de4d431cbb99347e +F src/resolve.c 0b046cc3d4d980c92d37200b0d1c4d4c4685103d82734162aa991f965f01b1cb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h dd3fba28d7012f18ee91b58f5485ba33e016728b9812200a77d699c6e6872177 +F src/sqliteInt.h 4f3edd821ba26fd226a98cec496de1a610460824accbc59dad9640fee5c5b232 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -725,7 +725,7 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 5ceb920718d280b61163500a7d29e0e0a86458b1cbd92d96f962c9d970aa3857 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 33a698e8c63613449d85d624a38ef669bf20331daabebe3891c9405dd6df463a +F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8 F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 @@ -1227,7 +1227,7 @@ F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6 +F test/quote.test 8258838e5135ff1034e4de929d14bfb5bdd73d2df5a2281404ae79d927b8fa70 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 778b1224a318d0137c7dab8361128f593506d3677267898119b934b4d66dfe38 -R 5a1add4e7a87cebf7597568b0b99195a +P 99eba69b3a64741c69d167bf7a05dbe138c9e7faecc54a1b8d8220cb23902830 +R d198ec0c1dbc6e91f8bbe5cf32cf98a3 U dan -Z 97bcb2ba5bbf708b820c2c5cf8e8bff1 +Z 7143d8b31f164a671db524d2917365c4 diff --git a/manifest.uuid b/manifest.uuid index 89d6b2d2c4..f0bf5c08d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -99eba69b3a64741c69d167bf7a05dbe138c9e7faecc54a1b8d8220cb23902830 \ No newline at end of file +1685610ef8e0dc9218b02461ceab14dc6114f4f5ef7fcda0da395094aff443e1 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index f6b6af1dfa..c8cce58685 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -476,7 +476,9 @@ static int lookupName( */ if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); - if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + if( ExprHasProperty(pExpr,EP_DblQuoted) + && 0==(pTopNC->ncFlags&NC_NewSchema) + ){ /* If a double-quoted identifier does not match any known column name, ** then treat it as a string. ** @@ -1654,7 +1656,7 @@ int sqlite3ResolveExprNames( NameContext *pNC, /* Namespace to resolve expressions in. */ Expr *pExpr /* The expression to be analyzed. */ ){ - u16 savedHasAgg; + int savedHasAgg; Walker w; if( pExpr==0 ) return SQLITE_OK; @@ -1769,6 +1771,9 @@ int sqlite3ResolveSelfReference( sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; + if( pTab && !pParse->db->init.busy && !sqlite3WritableSchema(pParse->db) ){ + sNC.ncFlags |= NC_NewSchema; + } if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); return rc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6f7b181090..fc4b460029 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2766,7 +2766,7 @@ struct NameContext { NameContext *pNext; /* Next outer name context. NULL for outermost */ int nRef; /* Number of names resolved by this context */ int nErr; /* Number of errors encountered while resolving names */ - u16 ncFlags; /* Zero or more NC_* flags defined below */ + int ncFlags; /* Zero or more NC_* flags defined below */ Select *pWinSelect; /* SELECT statement for any window functions */ }; @@ -2793,6 +2793,7 @@ struct NameContext { #define NC_Complex 0x2000 /* True if a function or subquery seen */ #define NC_AllowWin 0x4000 /* Window functions are allowed here */ #define NC_HasWin 0x8000 /* One or more window functions seen */ +#define NC_NewSchema 0x10000 /* Currently resolving self-refs for new object */ /* ** An instance of the following object describes a single ON CONFLICT diff --git a/test/check.test b/test/check.test index a6dbaa6171..dcd3c186cb 100644 --- a/test/check.test +++ b/test/check.test @@ -117,11 +117,13 @@ do_test check-1.17 { do_test check-2.1 { execsql { + PRAGMA writable_schema = 1; CREATE TABLE t2( x INTEGER CONSTRAINT one CHECK( typeof(coalesce(x,0))=="integer" ), y REAL CONSTRAINT two CHECK( typeof(coalesce(y,0.1))=='real' ), z TEXT CONSTRAINT three CHECK( typeof(coalesce(z,''))=='text' ) ); + PRAGMA writable_schema = 0; } } {} do_test check-2.2 { diff --git a/test/quote.test b/test/quote.test index f13d6f9ee9..ac572e92de 100644 --- a/test/quote.test +++ b/test/quote.test @@ -16,6 +16,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix quote # Create a table with a strange name and with strange column names. # @@ -84,6 +85,58 @@ do_test quote-1.6 { } msg ] lappend r $msg } {0 {}} - + +#------------------------------------------------------------------------- +# Check that it is not possible to use double-quotes for a string +# constant in a CHECK constraint or CREATE INDEX statement. However, +# SQLite can load such a schema from disk. +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(x, y, z); +} +foreach {tn sql errname} { + 1 { CREATE TABLE xyz(a, b, c CHECK (c!="null") ) } null + 2 { CREATE INDEX i2 ON t1(x, y, z||"abc") } abc + 3 { CREATE INDEX i3 ON t1("w") } w + 4 { CREATE INDEX i4 ON t1(x) WHERE z="w" } w +} { + do_catchsql_test 2.1.$tn $sql [list 1 "no such column: $errname"] +} + +do_execsql_test 2.2 { + PRAGMA writable_schema = 1; + CREATE TABLE xyz(a, b, c CHECK (c!="null") ); + CREATE INDEX i2 ON t1(x, y, z||"abc"); + CREATE INDEX i3 ON t1("w"); + CREATE INDEX i4 ON t1(x) WHERE z="w"; +} + +db close +sqlite3 db test.db + +do_execsql_test 2.3.1 { + INSERT INTO xyz VALUES(1, 2, 3); +} +do_catchsql_test 2.3.2 { + INSERT INTO xyz VALUES(1, 2, 'null'); +} {1 {CHECK constraint failed: xyz}} + +do_execsql_test 2.4 { + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 'w'); + SELECT * FROM t1 WHERE z='w'; +} {4 5 w} +do_execsql_test 2.5 { + SELECT sql FROM sqlite_master; +} { + {CREATE TABLE t1(x, y, z)} + {CREATE TABLE xyz(a, b, c CHECK (c!="null") )} + {CREATE INDEX i2 ON t1(x, y, z||"abc")} + {CREATE INDEX i3 ON t1("w")} + {CREATE INDEX i4 ON t1(x) WHERE z="w"} +} + + finish_test From 3e4f6c43b88e4e41912719b1678afb0c187def23 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 May 2019 18:35:49 +0000 Subject: [PATCH 16/96] A minor variation on check-in [1685610ef8e0dc] which (hopefully) makes the logic a little easier to follow. Also disallows the use of the double-quoted string hack in the query expression used for VACUUM INTO, which is not strictly required, but moves us toward the goal of disallowing the double-quoted string hack everywhere. FossilOrigin-Name: 3e1b55f3ab85710ed81574904718205c7370b5f0b5a41029e961486d2e3f37c7 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 6 +++--- src/sqliteInt.h | 3 ++- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1eaaa80fbf..b7c519ebfc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disallow\sstring\sconstants\senclosed\sin\sdouble-quotes\swithin\snew\sCREATE\sTABLE\sand\sCREATE\sINDEX\sstatements.\sIt\sis\sstill\spossible\sto\senclose\scolumn\snames\sin\sdouble-quotes,\sand\sexisting\sdatabase\sschemas\sthat\suse\sdouble-quotes\sfor\sstrings\scan\sstill\sbe\sloaded.\sThis\saddresses\sticket\s[9b78184b]. -D 2019-05-20T17:14:25.060 +C A\sminor\svariation\son\scheck-in\s[1685610ef8e0dc]\swhich\s(hopefully)\smakes\sthe\nlogic\sa\slittle\seasier\sto\sfollow.\s\sAlso\sdisallows\sthe\suse\sof\sthe\sdouble-quoted\nstring\shack\sin\sthe\squery\sexpression\sused\sfor\sVACUUM\sINTO,\swhich\sis\snot\nstrictly\srequired,\sbut\smoves\sus\stoward\sthe\sgoal\sof\sdisallowing\sthe\sdouble-quoted\nstring\shack\severywhere. +D 2019-05-20T18:35:49.273 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,14 +520,14 @@ F src/pragma.h 482c26f352efd7a4ed1354d83ffa992e13004f6528edeee44cdbfd5025a490bd F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 0b046cc3d4d980c92d37200b0d1c4d4c4685103d82734162aa991f965f01b1cb +F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 4f3edd821ba26fd226a98cec496de1a610460824accbc59dad9640fee5c5b232 +F src/sqliteInt.h edde1d3fa1e267a9b57ed39ca9293994ab957e45298af4681f4a71f584a8e415 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 99eba69b3a64741c69d167bf7a05dbe138c9e7faecc54a1b8d8220cb23902830 -R d198ec0c1dbc6e91f8bbe5cf32cf98a3 -U dan -Z 7143d8b31f164a671db524d2917365c4 +P 1685610ef8e0dc9218b02461ceab14dc6114f4f5ef7fcda0da395094aff443e1 +R 1113170f9c5e5be87c5119deda88593e +U drh +Z cb44fd552c668e19c46ce895661ff940 diff --git a/manifest.uuid b/manifest.uuid index f0bf5c08d4..6bb3086cda 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1685610ef8e0dc9218b02461ceab14dc6114f4f5ef7fcda0da395094aff443e1 \ No newline at end of file +3e1b55f3ab85710ed81574904718205c7370b5f0b5a41029e961486d2e3f37c7 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index c8cce58685..65906da90c 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -477,7 +477,7 @@ static int lookupName( if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) - && 0==(pTopNC->ncFlags&NC_NewSchema) + && 0==(pTopNC->ncFlags&NC_NoDblQStr) ){ /* If a double-quoted identifier does not match any known column name, ** then treat it as a string. @@ -1771,8 +1771,8 @@ int sqlite3ResolveSelfReference( sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; - if( pTab && !pParse->db->init.busy && !sqlite3WritableSchema(pParse->db) ){ - sNC.ncFlags |= NC_NewSchema; + if( !pParse->db->init.busy && !sqlite3WritableSchema(pParse->db) ){ + sNC.ncFlags |= NC_NoDblQStr; } if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index fc4b460029..630239ff4b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2793,7 +2793,8 @@ struct NameContext { #define NC_Complex 0x2000 /* True if a function or subquery seen */ #define NC_AllowWin 0x4000 /* Window functions are allowed here */ #define NC_HasWin 0x8000 /* One or more window functions seen */ -#define NC_NewSchema 0x10000 /* Currently resolving self-refs for new object */ +#define NC_NoDblQStr 0x10000 /* Do not allow double-quoted string hack. + ** Mnemonic: "NO DouBLe-Quoted STRings" */ /* ** An instance of the following object describes a single ON CONFLICT From acd6bb5fe4667730463d5e434b6c14999257e02c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 May 2019 18:43:57 +0000 Subject: [PATCH 17/96] Improvements to the automatic compile-time selection of byte-order, as suggested on the mailing list by Seb Kemper. FossilOrigin-Name: b7aad929619f7043b1685a6477d50f6b4436e85511eb365eceae3dd4dbab571a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 11 ++++++----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index b7c519ebfc..403dc74d11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sminor\svariation\son\scheck-in\s[1685610ef8e0dc]\swhich\s(hopefully)\smakes\sthe\nlogic\sa\slittle\seasier\sto\sfollow.\s\sAlso\sdisallows\sthe\suse\sof\sthe\sdouble-quoted\nstring\shack\sin\sthe\squery\sexpression\sused\sfor\sVACUUM\sINTO,\swhich\sis\snot\nstrictly\srequired,\sbut\smoves\sus\stoward\sthe\sgoal\sof\sdisallowing\sthe\sdouble-quoted\nstring\shack\severywhere. -D 2019-05-20T18:35:49.273 +C Improvements\sto\sthe\sautomatic\scompile-time\sselection\sof\sbyte-order,\sas\nsuggested\son\sthe\smailing\slist\sby\sSeb\sKemper. +D 2019-05-20T18:43:57.348 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h edde1d3fa1e267a9b57ed39ca9293994ab957e45298af4681f4a71f584a8e415 +F src/sqliteInt.h 1ba98b4b8742f9b04ae3db1df36a607d4cf6591f3f6f6507f33d9e136fe2c136 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1685610ef8e0dc9218b02461ceab14dc6114f4f5ef7fcda0da395094aff443e1 -R 1113170f9c5e5be87c5119deda88593e +P 3e1b55f3ab85710ed81574904718205c7370b5f0b5a41029e961486d2e3f37c7 +R a3c05b3b87a6165ad13eee712bf9c731 U drh -Z cb44fd552c668e19c46ce895661ff940 +Z f54a9475480094a81a3f137c4c413f13 diff --git a/manifest.uuid b/manifest.uuid index 6bb3086cda..93a66399e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e1b55f3ab85710ed81574904718205c7370b5f0b5a41029e961486d2e3f37c7 \ No newline at end of file +b7aad929619f7043b1685a6477d50f6b4436e85511eb365eceae3dd4dbab571a \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 630239ff4b..5518d93ab1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -830,12 +830,13 @@ typedef INT16_TYPE LogEst; ** at run-time. */ #ifndef SQLITE_BYTEORDER -# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ - defined(__arm__) || defined(_M_ARM64) +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) # define SQLITE_BYTEORDER 1234 -# elif defined(sparc) || defined(__ppc__) +# elif defined(sparc) || defined(__ppc__) || \ + defined(__ARMEB__) || defined(__AARCH64EB__) # define SQLITE_BYTEORDER 4321 # else # define SQLITE_BYTEORDER 0 From 595d9f5f3c19995b6ad1860c164b9aeb41b57000 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 20 May 2019 19:46:30 +0000 Subject: [PATCH 18/96] Fix a segfault that could occur in sqlite3session_diff() if NULL were passed as the pzErrMsg argument. FossilOrigin-Name: aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf --- ext/session/sqlite3session.c | 4 +++- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 8d1cd77275..ecc7644d74 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -1624,7 +1624,9 @@ int sqlite3session_diff( } sqlite3_free((char*)azCol); if( bMismatch ){ - *pzErrMsg = sqlite3_mprintf("table schemas do not match"); + if( pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("table schemas do not match"); + } rc = SQLITE_SCHEMA; } if( bHasPk==0 ){ diff --git a/manifest b/manifest index 403dc74d11..c09a69ec05 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sautomatic\scompile-time\sselection\sof\sbyte-order,\sas\nsuggested\son\sthe\smailing\slist\sby\sSeb\sKemper. -D 2019-05-20T18:43:57.348 +C Fix\sa\ssegfault\sthat\scould\soccur\sin\ssqlite3session_diff()\sif\sNULL\swere\spassed\sas\sthe\spzErrMsg\sargument. +D 2019-05-20T19:46:30.673 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -435,7 +435,7 @@ F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b295 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c 53a110fc7f421fe5570b8393d791fab9252e57194c68b8149d6af2145cbddbaf +F ext/session/sqlite3session.c 3d9d3a414be386b87d83e642f4d93c8cbe83fe7b975d17b398f96caa1bfdc2cf F ext/session/sqlite3session.h 919be6649d39d6413ce7a63fc3e3bca3270e18bc2d57ad4040a70007b9e54397 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3e1b55f3ab85710ed81574904718205c7370b5f0b5a41029e961486d2e3f37c7 -R a3c05b3b87a6165ad13eee712bf9c731 -U drh -Z f54a9475480094a81a3f137c4c413f13 +P b7aad929619f7043b1685a6477d50f6b4436e85511eb365eceae3dd4dbab571a +R f5e665aac91f707dd4c07ff4970b768b +U dan +Z da6735cf29da22434552d59a77aa93a6 diff --git a/manifest.uuid b/manifest.uuid index 93a66399e0..3dfd7626aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b7aad929619f7043b1685a6477d50f6b4436e85511eb365eceae3dd4dbab571a \ No newline at end of file +aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf \ No newline at end of file From ef14abbf8d7dac12bb3f54f61621194750bb6aed Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 21 May 2019 14:42:24 +0000 Subject: [PATCH 19/96] Use a statement journal for all CREATE INDEX statements in case an indexed exprsesion throws an exception when it is evaluated. Fix for [b5ca442a]. FossilOrigin-Name: b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 8 ++++++++ src/vdbeaux.c | 5 ++++- test/indexexpr2.test | 15 +++++++++++++++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c09a69ec05..e70eac1d9d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sthat\scould\soccur\sin\ssqlite3session_diff()\sif\sNULL\swere\spassed\sas\sthe\spzErrMsg\sargument. -D 2019-05-20T19:46:30.673 +C Use\sa\sstatement\sjournal\sfor\sall\sCREATE\sINDEX\sstatements\sin\scase\san\sindexed\sexprsesion\sthrows\san\sexception\swhen\sit\sis\sevaluated.\sFix\sfor\s[b5ca442a]. +D 2019-05-21T14:42:24.835 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c aead3d74794ed4dac396fdd9323ba2272e3734f07c5d7f1f57389e5afbd99f3f +F src/build.c 846b6106e3aaec68b180994902bd126735508f56aa16248a0de7a64042d704bb F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -598,7 +598,7 @@ F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c d444f4a3ff9c571965329a186701a57fe445e4c3f4c42f87402aca75386ba358 +F src/vdbeaux.c 32c003d783af55d0a4ef32516e45ed49a3da6b8a1d98be9b191790a42242996f F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c e9a0aa2feb93356333bcd94491c25bac041e63e3d87e4caac67fde742dd2deba F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1046,7 +1046,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce +F test/indexexpr2.test a8a648c1a6c53bd3f9b2a848bfd11b25de55573513203114216bf7a7166e4a82 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b7aad929619f7043b1685a6477d50f6b4436e85511eb365eceae3dd4dbab571a -R f5e665aac91f707dd4c07ff4970b768b +P aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf +R 3eb88af4d27fd0e9ebeeb2c2308226bd U dan -Z da6735cf29da22434552d59a77aa93a6 +Z cb8de4b0e5cd2b6b1cf5c900002e43ce diff --git a/manifest.uuid b/manifest.uuid index 3dfd7626aa..17437e6140 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf \ No newline at end of file +b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b \ No newline at end of file diff --git a/src/build.c b/src/build.c index ac6789ee80..c152bf2caf 100644 --- a/src/build.c +++ b/src/build.c @@ -3050,6 +3050,14 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); sqlite3VdbeJumpHere(v, j2); }else{ + /* Most CREATE INDEX statements that are not UNIQUE can not abort. The + ** exception is if one of the indexed expressions contains a user + ** function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement + ** is very small (since most of the pages written do not contain + ** content that needs to be restored if the statement aborts), so + ** we call sqlite3MayAbort() for all CREATE INDEX statements. */ + sqlite3MayAbort(pParse); addr2 = sqlite3VdbeCurrentAddr(v); } sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ec8f6b9955..e1fdeeb701 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -629,6 +629,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasAbort = 0; int hasFkCounter = 0; int hasCreateTable = 0; + int hasCreateIndex = 0; int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; @@ -647,6 +648,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ break; } if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ @@ -662,7 +664,8 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** true for this case to prevent the assert() in the callers frame ** from failing. */ return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter - || (hasCreateTable && hasInitCoroutine) ); + || (hasCreateTable && hasInitCoroutine) || hasCreateIndex + ); } #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ diff --git a/test/indexexpr2.test b/test/indexexpr2.test index 8d6e5914c0..d3e923f86e 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -278,5 +278,20 @@ do_eqp_test 6.2.3 { SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; } {SEARCH TABLE x1 USING INDEX x1i2 (=?)} +do_execsql_test 7.0 { + CREATE TABLE IF NOT EXISTS t0(c0); + INSERT INTO t0(c0) VALUES (-9223372036854775808); + BEGIN; +} +do_catchsql_test 7.1 { + CREATE INDEX i0 ON t0(ABS(c0)); +} {1 {integer overflow}} +do_execsql_test 7.2 { + COMMIT; + SELECT sql FROM sqlite_master WHERE tbl_name = 't0'; + CREATE INDEX i0 ON t0(c0); +} {{CREATE TABLE t0(c0)}} + + finish_test From 7ed6c068f556dd45f705355c3454c1f8af1047d4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 21 May 2019 16:32:41 +0000 Subject: [PATCH 20/96] Fix a problem in [b5ca442a] causing an assert() to fail in REINDEX commands. FossilOrigin-Name: a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 14 +++++++------- src/vdbeaux.c | 9 ++++++++- test/indexexpr2.test | 3 +++ 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e70eac1d9d..4d28f2c625 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sa\sstatement\sjournal\sfor\sall\sCREATE\sINDEX\sstatements\sin\scase\san\sindexed\sexprsesion\sthrows\san\sexception\swhen\sit\sis\sevaluated.\sFix\sfor\s[b5ca442a]. -D 2019-05-21T14:42:24.835 +C Fix\sa\sproblem\sin\s[b5ca442a]\scausing\san\sassert()\sto\sfail\sin\sREINDEX\scommands. +D 2019-05-21T16:32:41.592 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 846b6106e3aaec68b180994902bd126735508f56aa16248a0de7a64042d704bb +F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -598,7 +598,7 @@ F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c 32c003d783af55d0a4ef32516e45ed49a3da6b8a1d98be9b191790a42242996f +F src/vdbeaux.c afe8d7858ad7a7cd67b16d0df396f5c672309722c7855d33cd10adb7ce076b4b F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c e9a0aa2feb93356333bcd94491c25bac041e63e3d87e4caac67fde742dd2deba F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1046,7 +1046,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test a8a648c1a6c53bd3f9b2a848bfd11b25de55573513203114216bf7a7166e4a82 +F test/indexexpr2.test d319e7d1b1043403f39a20c892d512e02b5549c6004806b977030f2430c60208 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aee73fd28f031a2568ac723de0826be7f1dca6be3b049e4a04fb47af75dcf4bf -R 3eb88af4d27fd0e9ebeeb2c2308226bd +P b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b +R e0d2be8aaa1e1b8f55170826c63b8e27 U dan -Z cb8de4b0e5cd2b6b1cf5c900002e43ce +Z 54ed841e42a31a65a6ba750ef5f58b68 diff --git a/manifest.uuid b/manifest.uuid index 17437e6140..49935a0516 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b \ No newline at end of file +a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 \ No newline at end of file diff --git a/src/build.c b/src/build.c index c152bf2caf..380af8379d 100644 --- a/src/build.c +++ b/src/build.c @@ -3050,13 +3050,13 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); sqlite3VdbeJumpHere(v, j2); }else{ - /* Most CREATE INDEX statements that are not UNIQUE can not abort. The - ** exception is if one of the indexed expressions contains a user - ** function that throws an exception when it is evaluated. But the - ** overhead of adding a statement journal to a CREATE INDEX statement - ** is very small (since most of the pages written do not contain - ** content that needs to be restored if the statement aborts), so - ** we call sqlite3MayAbort() for all CREATE INDEX statements. */ + /* Most CREATE INDEX and REINDEX statements that are not UNIQUE can not + ** abort. The exception is if one of the indexed expressions contains a + ** user function that throws an exception when it is evaluated. But the + ** overhead of adding a statement journal to a CREATE INDEX statement is + ** very small (since most of the pages written do not contain content that + ** needs to be restored if the statement aborts), so we call + ** sqlite3MayAbort() for all CREATE INDEX statements. */ sqlite3MayAbort(pParse); addr2 = sqlite3VdbeCurrentAddr(v); } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e1fdeeb701..98c50f362d 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -648,7 +648,14 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ break; } if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; - if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( mayAbort ){ + /* hasCreateIndex may also be set for some DELETE statements that use + ** OP_Clear. So this routine may end up returning true in the case + ** where a "DELETE FROM tbl" has a statement-journal but does not + ** require one. This is not so bad - it is an inefficiency, not a bug. */ + if( opcode==OP_CreateBtree && pOp->p3==BTREE_BLOBKEY ) hasCreateIndex = 1; + if( opcode==OP_Clear ) hasCreateIndex = 1; + } if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ diff --git a/test/indexexpr2.test b/test/indexexpr2.test index d3e923f86e..a3a685fb3d 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -291,6 +291,9 @@ do_execsql_test 7.2 { SELECT sql FROM sqlite_master WHERE tbl_name = 't0'; CREATE INDEX i0 ON t0(c0); } {{CREATE TABLE t0(c0)}} +do_execsql_test 7.3 { + REINDEX; +} {} From 51e441da2b1901806e38537f118592a1a022ce6d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 21 May 2019 17:04:27 +0000 Subject: [PATCH 21/96] Combine the implementations of the key and hexkey pragmas into a single case. Have both pragmas return "ok" if they are implemented. FossilOrigin-Name: b3692c406f7ba62587c9d3256f888748393519680e9e2db53f59557f1a300e05 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/pragma.c | 38 ++++++++++++++++++++------------------ src/pragma.h | 11 +++++------ tool/mkpragmatab.tcl | 4 ++-- 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index 4d28f2c625..e80b1e4fbc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\s[b5ca442a]\scausing\san\sassert()\sto\sfail\sin\sREINDEX\scommands. -D 2019-05-21T16:32:41.592 +C Combine\sthe\simplementations\sof\sthe\skey\sand\shexkey\spragmas\sinto\sa\ssingle\ncase.\s\sHave\sboth\spragmas\sreturn\s"ok"\sif\sthey\sare\simplemented. +D 2019-05-21T17:04:27.540 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,8 +515,8 @@ F src/parse.y 91f76f436db1c0ed3cc8a82ba6c945a592dc24a036f0ff7b48313bd80977d382 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d -F src/pragma.c 00046255566744b4a3086286d50f66f08531c53403bf64623abc4d86ca677173 -F src/pragma.h 482c26f352efd7a4ed1354d83ffa992e13004f6528edeee44cdbfd5025a490bd +F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb +F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -1760,7 +1760,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl d8887dfbd5a40c9e5de2c011db989af52152b9bcc64059d9e93b28edf38af9b9 +F tool/mkpragmatab.tcl 8250ef3df54aee09f6c6ed36cad390bb6dd20bbe71927d8bff069ed9fe0bbf98 F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1827,7 +1827,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b8071d10cba8f6c19fb8d5df3877f72567dc6d6a94744a39cbc1f58b2e2f343b -R e0d2be8aaa1e1b8f55170826c63b8e27 -U dan -Z 54ed841e42a31a65a6ba750ef5f58b68 +P a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 +R 3dae3e0fc33f3c377f4c91b3d6a4afab +U drh +Z c924ae29a91263cca0c0c95662d4314e diff --git a/manifest.uuid b/manifest.uuid index 49935a0516..b664fe27c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 \ No newline at end of file +b3692c406f7ba62587c9d3256f888748393519680e9e2db53f59557f1a300e05 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 3c120dc71f..a62fc9997b 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -2130,28 +2130,30 @@ void sqlite3Pragma( */ case PragTyp_KEY: { if( zRight ){ - int n = pPragma->iArg<4 ? sqlite3Strlen30(zRight) : -1; - if( (pPragma->iArg & 1)==0 ){ - sqlite3_key_v2(db, zDb, zRight, n); + char zBuf[40]; + const char *zKey = zRight; + int n; + if( pPragma->iArg==2 || pPragma->iArg==3 ){ + u8 iByte; + int i; + for(i=0, iByte=0; iiArg<4 ? sqlite3Strlen30(zRight) : -1; } if( (pPragma->iArg & 1)==0 ){ - sqlite3_key_v2(db, zDb, zKey, i/2); + rc = sqlite3_key_v2(db, zDb, zKey, n); }else{ - sqlite3_rekey_v2(db, zDb, zKey, i/2); + rc = sqlite3_rekey_v2(db, zDb, zKey, n); + } + if( rc==SQLITE_OK && n!=0 ){ + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "ok", SQLITE_STATIC); + returnSingleText(v, "ok"); } } break; diff --git a/src/pragma.h b/src/pragma.h index d72e8cc949..11e55ee9c7 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -46,10 +46,9 @@ #define PragTyp_WAL_AUTOCHECKPOINT 38 #define PragTyp_WAL_CHECKPOINT 39 #define PragTyp_ACTIVATE_EXTENSIONS 40 -#define PragTyp_HEXKEY 41 -#define PragTyp_KEY 42 -#define PragTyp_LOCK_STATUS 43 -#define PragTyp_STATS 44 +#define PragTyp_KEY 41 +#define PragTyp_LOCK_STATUS 42 +#define PragTyp_STATS 43 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -322,12 +321,12 @@ static const PragmaName aPragmaName[] = { #endif #if defined(SQLITE_HAS_CODEC) {/* zName: */ "hexkey", - /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, /* iArg: */ 2 }, {/* zName: */ "hexrekey", - /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, /* iArg: */ 3 }, diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index eb62d089b2..85c8cc74f8 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -381,12 +381,12 @@ set pragma_def { IF: defined(SQLITE_HAS_CODEC) NAME: hexkey - TYPE: HEXKEY + TYPE: KEY ARG: 2 IF: defined(SQLITE_HAS_CODEC) NAME: hexrekey - TYPE: HEXKEY + TYPE: KEY ARG: 3 IF: defined(SQLITE_HAS_CODEC) From 29fa6b6642793aef1ed50a82046f586ef0c60e9d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 22 May 2019 14:22:44 +0000 Subject: [PATCH 22/96] Fix a buffer overread that could in fts3 when dealing with corrupt records. FossilOrigin-Name: 1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e --- ext/fts3/fts3_write.c | 4 +- manifest | 17 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 215 ++++++++++++++++++++++++++++++++++++++++- test/fts3corrupt5.test | 60 ++++++++++++ 5 files changed, 285 insertions(+), 13 deletions(-) create mode 100644 test/fts3corrupt5.test diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 8ad48a0125..7d2820e03a 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2619,14 +2619,14 @@ static void fts3ColumnFilter( nList -= (int)(p - pList); pList = p; - if( nList==0 ){ + if( nList<=0 ){ break; } p = &pList[1]; p += fts3GetVarint32(p, &iCurrent); } - if( bZero && &pList[nList]!=pEnd ){ + if( bZero && (pEnd - &pList[nList])>0){ memset(&pList[nList], 0, pEnd - &pList[nList]); } *ppList = pList; diff --git a/manifest b/manifest index e80b1e4fbc..b3a4a300b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Combine\sthe\simplementations\sof\sthe\skey\sand\shexkey\spragmas\sinto\sa\ssingle\ncase.\s\sHave\sboth\spragmas\sreturn\s"ok"\sif\sthey\sare\simplemented. -D 2019-05-21T17:04:27.540 +C Fix\sa\sbuffer\soverread\sthat\scould\sin\sfts3\swhen\sdealing\swith\scorrupt\srecords. +D 2019-05-22T14:22:44.809 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 766cfc4140c5609c5178b087697ccc5f5650bd915f3c6718f1547b3e994f674b +F ext/fts3/fts3_write.c 05fd879124769bb59af4263c63a4c5bd6370e49b6dc906208150e3ad29ebf813 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -929,7 +929,8 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 72d8f1269f3ee1eb76fdf6133618225f7fc1abeece2d02456b292c90c822d78e +F test/fts3corrupt4.test e4c038936bca89cddfb8636a442a0a5f7e027a9f6d90f194491534a2d53ea31b +F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1827,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a3e77c7776ab01dadb9d30d6067ac97e9d4b09ec54834558a5fa1ffed7b52c72 -R 3dae3e0fc33f3c377f4c91b3d6a4afab -U drh -Z c924ae29a91263cca0c0c95662d4314e +P b3692c406f7ba62587c9d3256f888748393519680e9e2db53f59557f1a300e05 +R f699aa16c433e23c44317dd7182cee58 +U dan +Z 36b8ecda6615f5abd747a22791cbbe09 diff --git a/manifest.uuid b/manifest.uuid index b664fe27c5..4d92628ab4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b3692c406f7ba62587c9d3256f888748393519680e9e2db53f59557f1a300e05 \ No newline at end of file +1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 1b85abba40..36b89b4186 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -1946,7 +1946,7 @@ do_test 13.0 { do_catchsql_test 13.1 { SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; -} {0 {0 0}} +} {0 {}} #------------------------------------------------------------------------- reset_db @@ -2826,7 +2826,7 @@ do_test 18.0 { do_catchsql_test 18.1 { SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; -} {0 0} +} {0 {}} #------------------------------------------------------------------------- reset_db @@ -4400,6 +4400,217 @@ do_catchsql_test 25.6 { INSERT INTO t1(t1) SELECT x FROM t2; INSERT INTO t1(t1) SELECT x FROM t2; } {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 26.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-26682721375870.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 51 r'(level INTEGEQ +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 66 6d 65 6e ..tablet1_sefmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 00 00 ...t.[.@.$...... +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 2f 31 36 30 36 30 39 20 44 45 42 4#. 2/160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 59 4f 4e 20 54 48 OAD EXTENSYON TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 38 52 45 41 44 53 41 46 45 3d ..%..T8READSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 fc 53 49 4f IT LOAD EXTE.SIO +| 3184: 4e 68 42 49 4e 4a c2 59 1f 20 05 00 33 0f 19 4f NhBINJ.Y. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 2f 30 30 MAX MEMORY=50/00 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 48 4e 4f 43 41 53 45 1e 1c 05 00 33 0000HNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 53 41 53 45 17 LE RTREEXNOSASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 42 42 INARY....%..ENBB +| 3552: 4d 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 ME JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 62 54 52 49 4d 17 0f 05 00 23 OPOLYXbTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 fc 35 58 4e 4f 43 41 53 45 16 0d 05 E FT.5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 56 54 53 34 58 52 54 52 49 4d 1e ABLE VTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 b3 58 1e TAT VTABXBINA.X. +| 3856: 08 05 00 31 0f 19 45 4e 40 42 4c 45 20 44 42 53 ...1..EN@BLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 45 42 53 ...1..ENABLE EBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 4b 19 4e 41 52 59 27 20160609XK.NARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 34 33 ...........0 243 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 51 74 03 25 0a 00 01 04 65 62 75 .dbstQt.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1e f3 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 2f 30 30 09 1c 04 00 01 04 ...0000/00...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 01 f0 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 00 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 a9 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 0b 31 02 00 01 02 00 01 05 65 6d 6f 72 79 ...1.......emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 f3 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 63 61 66 65 09 22 02 ...threadcafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 00 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 00 e2 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 00 00 00 ...........#a... +| end crash-26682721375870.db +}]} {} + +do_execsql_test 26.1 { + SELECT count(*) FROM ( + SELECT t1, (t1) FROM t1 WHERE b MATCH 'x' + ) +} 34 finish_test diff --git a/test/fts3corrupt5.test b/test/fts3corrupt5.test new file mode 100644 index 0000000000..d60a8c0caa --- /dev/null +++ b/test/fts3corrupt5.test @@ -0,0 +1,60 @@ +# 2019 May 22 +# +# 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 +source $testdir/fts3_common.tcl +set testprefix fts3corrupt5 + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +sqlite3_fts3_may_be_corrupt 1 + +do_execsql_test 1.0 { + BEGIN; + CREATE VIRTUAL TABLE ft USING fts3(a, b, c); + INSERT INTO ft VALUES('one', 'one', 'one'); + COMMIT; +} + +do_execsql_test 1.1 { + SELECT * FROM ft WHERE ft MATCH 'b:one' +} {one one one} + +do_execsql_test 1.2 { + SELECT quote(root) FROM ft_segdir; +} {X'00036F6E6509010201010201020200'} + +breakpoint +foreach {tn val q bCorrupt} { + 1 X'00036F6E650901' 'b:one' 1 + 2 X'00036F6E6509010201010201FFFFFF' 'c:one' 1 + 3 X'00036F6E6501' 'b:one' 1 + 4 X'00036F6E650101' 'b:one' 1 + 5 X'00036F6E650100' 'b:one' 0 +} { + do_execsql_test 1.3.$tn.1 "UPDATE ft_segdir SET root = $val" + + set res {0 {}} + if {$bCorrupt} { set res {1 {database disk image is malformed}}} + do_catchsql_test 1.3.$tn.2 { + SELECT * FROM ft WHERE ft MATCH $q + } $res +} + +finish_test + From 90c21df2338651335ad7a922dd573f50c5f161ab Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 22 May 2019 14:35:10 +0000 Subject: [PATCH 23/96] New dbsqlfuzz find added to test/fuzzdata8.db. FossilOrigin-Name: 42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1204224 -> 1210368 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b3a4a300b9..d5c712e6df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sthat\scould\sin\sfts3\swhen\sdealing\swith\scorrupt\srecords. -D 2019-05-22T14:22:44.809 +C New\sdbsqlfuzz\sfind\sadded\sto\stest/fuzzdata8.db. +D 2019-05-22T14:35:10.578 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1005,7 +1005,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db ae3f4f364f798cd73b1769ca701878e40cbaa6fb8726a94148bce8062fada5c3 +F test/fuzzdata8.db e7f7ac454c41df87408e591584e3980cd88f85bb2a8311075e93853d1b7e5b71 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b3692c406f7ba62587c9d3256f888748393519680e9e2db53f59557f1a300e05 -R f699aa16c433e23c44317dd7182cee58 -U dan -Z 36b8ecda6615f5abd747a22791cbbe09 +P 1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e +R 1e74e533f91367ec7921e2ea66d0ca79 +U drh +Z 4c3aeca66bd75ef066c4373e8b791867 diff --git a/manifest.uuid b/manifest.uuid index 4d92628ab4..7c1e1e0b01 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e \ No newline at end of file +42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 6505d563e744fe7417785090419cf82066cb06cb..b64dbf26593db3ce2b0f7bcb599517bb6bd09fbf 100644 GIT binary patch delta 20571 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%0D>LPHX~4}u-ZuvqBq=jh_CChVBn@+ioGZZYg|r^F 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 aeuwI9zq{99L}Vb!tSs?*e~oV`+=3P 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 Date: Wed, 22 May 2019 22:49:23 +0000 Subject: [PATCH 24/96] Renumber the Select.selId values in the copies of SELECT statements that implement VIEWs when the VIEW is expanded, so that when the same VIEW is used twice in the same join, each expansion as a distinct selId. This fixes ticket [ce823231949d3abf42453c8]. FossilOrigin-Name: 3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 8 ++++++++ test/with1.test | 26 ++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d5c712e6df..b2234f6f70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sdbsqlfuzz\sfind\sadded\sto\stest/fuzzdata8.db. -D 2019-05-22T14:35:10.578 +C Renumber\sthe\sSelect.selId\svalues\sin\sthe\scopies\sof\sSELECT\sstatements\sthat\nimplement\sVIEWs\swhen\sthe\sVIEW\sis\sexpanded,\sso\sthat\swhen\sthe\ssame\sVIEW\sis\nused\stwice\sin\sthe\ssame\sjoin,\seach\sexpansion\sas\sa\sdistinct\sselId.\nThis\sfixes\sticket\s[ce823231949d3abf42453c8]. +D 2019-05-22T22:49:23.036 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c +F src/select.c 2db13eac09ac2d45b2cfd5dd106d6b9b02fe413db7240731868d55467e981b85 F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1709,7 +1709,7 @@ F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91 F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898 -F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be +F test/with1.test f8b59d186a31bcdfbd6683c7e7db8152b81bbefbb90235bfa37707c8bc7b6474 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e -R 1e74e533f91367ec7921e2ea66d0ca79 +P 42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20 +R 2b09f296fa1dcac8cd30ef4241a7e8b0 U drh -Z 4c3aeca66bd75ef066c4373e8b791867 +Z 24fc3a390964329b9ca09380346f2fb1 diff --git a/manifest.uuid b/manifest.uuid index 7c1e1e0b01..06b7b6b542 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20 \ No newline at end of file +3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c \ No newline at end of file diff --git a/src/select.c b/src/select.c index 0b72cd3d22..6e20430c08 100644 --- a/src/select.c +++ b/src/select.c @@ -4843,6 +4843,10 @@ static int selectExpander(Walker *pWalker, Select *p){ if( (selFlags & SF_Expanded)!=0 ){ return WRC_Prune; } + if( pWalker->eCode ){ + /* Renumber selId because it has been copied from a view */ + p->selId = ++pParse->nSelect; + } pTabList = p->pSrc; pEList = p->pEList; sqlite3WithPush(pParse, p->pWith, 0); @@ -4892,12 +4896,15 @@ static int selectExpander(Walker *pWalker, Select *p){ #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) if( IsVirtual(pTab) || pTab->pSelect ){ i16 nCol; + u8 eCodeOrig = pWalker->eCode; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); nCol = pTab->nCol; pTab->nCol = -1; + pWalker->eCode = 1; /* Turn on Select.selId renumbering */ sqlite3WalkSelect(pWalker, pFrom->pSelect); + pWalker->eCode = eCodeOrig; pTab->nCol = nCol; } #endif @@ -5147,6 +5154,7 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ } w.xSelectCallback = selectExpander; w.xSelectCallback2 = selectPopWith; + w.eCode = 0; sqlite3WalkSelect(&w, pSelect); } diff --git a/test/with1.test b/test/with1.test index aecf0d1d16..dbba19227e 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1091,4 +1091,30 @@ do_catchsql_test 22.1 { SELECT 4 FROM c,c,c,c,c,c,c,c,c; } {1 {too many FROM clause terms, max: 200}} +# 2019-05-22 +# ticket https://www.sqlite.org/src/tktview/ce823231949d3abf42453c8f20 +# +sqlite3 db :memory: +do_execsql_test 23.1 { + CREATE TABLE t1(id INTEGER NULL PRIMARY KEY, name Text); + INSERT INTO t1 VALUES (1, 'john'); + INSERT INTO t1 VALUES (2, 'james'); + INSERT INTO t1 VALUES (3, 'jingle'); + INSERT INTO t1 VALUES (4, 'himer'); + INSERT INTO t1 VALUES (5, 'smith'); + CREATE VIEW v2 AS + WITH t4(Name) AS (VALUES ('A'), ('B')) + SELECT Name Name FROM t4; + CREATE VIEW v3 AS + WITH t4(Att, Val, Act) AS (VALUES + ('C', 'D', 'E'), + ('F', 'G', 'H') + ) + SELECT D.Id Id, P.Name Protocol, T.Att Att, T.Val Val, T.Act Act + FROM t1 D + CROSS JOIN v2 P + CROSS JOIN t4 T; + SELECT * FROM v3; +} {1 A C D E 1 A F G H 1 B C D E 1 B F G H 2 A C D E 2 A F G H 2 B C D E 2 B F G H 3 A C D E 3 A F G H 3 B C D E 3 B F G H 4 A C D E 4 A F G H 4 B C D E 4 B F G H 5 A C D E 5 A F G H 5 B C D E 5 B F G H} + finish_test From 53e8709b75e21fdba0967a65c855d410c724d4b0 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 22 May 2019 23:12:10 +0000 Subject: [PATCH 25/96] New test case for check-in [74ef97bf51dd531a] that takes the fix in the previous check-in into account. FossilOrigin-Name: cb1d06521de5918a2324a41e207b48c5e5149c23b927b9e3e1f3c3b38b82658e --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/view.test | 8 ++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b2234f6f70..e1237164ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Renumber\sthe\sSelect.selId\svalues\sin\sthe\scopies\sof\sSELECT\sstatements\sthat\nimplement\sVIEWs\swhen\sthe\sVIEW\sis\sexpanded,\sso\sthat\swhen\sthe\ssame\sVIEW\sis\nused\stwice\sin\sthe\ssame\sjoin,\seach\sexpansion\sas\sa\sdistinct\sselId.\nThis\sfixes\sticket\s[ce823231949d3abf42453c8]. -D 2019-05-22T22:49:23.036 +C New\stest\scase\sfor\scheck-in\s[74ef97bf51dd531a]\sthat\stakes\sthe\sfix\sin\sthe\nprevious\scheck-in\sinto\saccount. +D 2019-05-22T23:12:10.524 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1603,7 +1603,7 @@ F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2 F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test ee9262cee79c7f4002fd2869887d3e8eccf70d9a4e1016f847242851edb18964 +F test/view.test 40d54c9ddf5b9fdee692bf936d3352159fe467838f92742aa1d08c7c7d1eac73 F test/vtab1.test 60b4f70aafa6078d6fdfc11417af3bd216d7ef5eafce16707a6ca3dae5166d20 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20 -R 2b09f296fa1dcac8cd30ef4241a7e8b0 +P 3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c +R 9415bbe96dbbe5c29fbec91ac0d8e5a5 U drh -Z 24fc3a390964329b9ca09380346f2fb1 +Z 5378cd632ce316a4e0992ab00bf33b67 diff --git a/manifest.uuid b/manifest.uuid index 06b7b6b542..a214271817 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c \ No newline at end of file +cb1d06521de5918a2324a41e207b48c5e5149c23b927b9e3e1f3c3b38b82658e \ No newline at end of file diff --git a/test/view.test b/test/view.test index 1107ecb365..8a60f86215 100644 --- a/test/view.test +++ b/test/view.test @@ -715,5 +715,13 @@ do_execsql_test view-26.0 { 1 1 2 2 1 1 3 3 } +do_execsql_test view-26.1 { + WITH v17(x,y) AS (SELECT max(a), min(b) FROM t16 GROUP BY c) + SELECT * FROM v17 AS one, v17 AS two WHERE one.x=1; +} { + 1 1 1 1 + 1 1 2 2 + 1 1 3 3 +} finish_test From 30ad79aeb4cc1243817fdb3c1b0b51a61bbb5f97 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 23 May 2019 16:38:12 +0000 Subject: [PATCH 26/96] Improvements to the view-self-join optimization so that it works on all VIEWs, not just on Common Table Expressions. FossilOrigin-Name: d2fe370cafa9b11f6c3eb4e1c3be48d9d2610b9d2f9d9ebf9e50267f9079dfc0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e1237164ab..5907ed3bd6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sfor\scheck-in\s[74ef97bf51dd531a]\sthat\stakes\sthe\sfix\sin\sthe\nprevious\scheck-in\sinto\saccount. -D 2019-05-22T23:12:10.524 +C Improvements\sto\sthe\sview-self-join\soptimization\sso\sthat\sit\sworks\son\sall\nVIEWs,\snot\sjust\son\sCommon\sTable\sExpressions. +D 2019-05-23T16:38:12.291 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 2db13eac09ac2d45b2cfd5dd106d6b9b02fe413db7240731868d55467e981b85 +F src/select.c ccd314a204ef27edadeb58faebc7ded1f967fa83d6b9b858cd422c80ef171643 F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c -R 9415bbe96dbbe5c29fbec91ac0d8e5a5 +P cb1d06521de5918a2324a41e207b48c5e5149c23b927b9e3e1f3c3b38b82658e +R bc0be58ed799178a68209379d96c86c1 U drh -Z 5378cd632ce316a4e0992ab00bf33b67 +Z c15a1e523efaaf6901adea2e440922c6 diff --git a/manifest.uuid b/manifest.uuid index a214271817..4bbfe56d5b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb1d06521de5918a2324a41e207b48c5e5149c23b927b9e3e1f3c3b38b82658e \ No newline at end of file +d2fe370cafa9b11f6c3eb4e1c3be48d9d2610b9d2f9d9ebf9e50267f9079dfc0 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 6e20430c08..b421b0fcff 100644 --- a/src/select.c +++ b/src/select.c @@ -5481,10 +5481,12 @@ static struct SrcList_item *isSelfJoinView( if( pItem->pSelect==0 ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; - if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; + assert( pItem->pTab!=0 ); + assert( pThis->pTab!=0 ); + if( pItem->pTab->pSchema!=pThis->pTab->pSchema ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; pS1 = pItem->pSelect; - if( pThis->pSelect->selId!=pS1->selId ){ + if( pItem->pTab->pSchema==0 && pThis->pSelect->selId!=pS1->selId ){ /* The query flattener left two different CTE tables with identical ** names in the same FROM clause. */ continue; From c542fa85735fbea00c9620f72e551041855e4505 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 23 May 2019 16:40:45 +0000 Subject: [PATCH 27/96] Add test cases for the fix in the previous commit. FossilOrigin-Name: c1057b2a60add08e5c80ef2a53932a690b096f2eb03c7de863844deaa8fc9d53 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/with1.test | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5907ed3bd6..358fbc8568 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sview-self-join\soptimization\sso\sthat\sit\sworks\son\sall\nVIEWs,\snot\sjust\son\sCommon\sTable\sExpressions. -D 2019-05-23T16:38:12.291 +C Add\stest\scases\sfor\sthe\sfix\sin\sthe\sprevious\scommit. +D 2019-05-23T16:40:45.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1709,7 +1709,7 @@ F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91 F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898 -F test/with1.test f8b59d186a31bcdfbd6683c7e7db8152b81bbefbb90235bfa37707c8bc7b6474 +F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cb1d06521de5918a2324a41e207b48c5e5149c23b927b9e3e1f3c3b38b82658e -R bc0be58ed799178a68209379d96c86c1 -U drh -Z c15a1e523efaaf6901adea2e440922c6 +P d2fe370cafa9b11f6c3eb4e1c3be48d9d2610b9d2f9d9ebf9e50267f9079dfc0 +R ff989ec1755651fcd43f9c9465026001 +U dan +Z 150ba3b7918bcf8164acfcb2aad4db4c diff --git a/manifest.uuid b/manifest.uuid index 4bbfe56d5b..c3b0f77ef4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2fe370cafa9b11f6c3eb4e1c3be48d9d2610b9d2f9d9ebf9e50267f9079dfc0 \ No newline at end of file +c1057b2a60add08e5c80ef2a53932a690b096f2eb03c7de863844deaa8fc9d53 \ No newline at end of file diff --git a/test/with1.test b/test/with1.test index dbba19227e..5631bfb69d 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1117,4 +1117,27 @@ do_execsql_test 23.1 { SELECT * FROM v3; } {1 A C D E 1 A F G H 1 B C D E 1 B F G H 2 A C D E 2 A F G H 2 B C D E 2 B F G H 3 A C D E 3 A F G H 3 B C D E 3 B F G H 4 A C D E 4 A F G H 4 B C D E 4 B F G H 5 A C D E 5 A F G H 5 B C D E 5 B F G H} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 24.1 { + CREATE TABLE t1(a, b, c); + CREATE VIEW v1 AS SELECT max(a), min(b) FROM t1 GROUP BY c; +} +do_test 24.1 { + set program [db eval {EXPLAIN SELECT 1 FROM v1,v1,v1}] + expr [lsearch $program OpenDup]>0 +} {1} +do_execsql_test 24.2 { + ATTACH "" AS aux; + CREATE VIEW aux.v3 AS VALUES(1); + CREATE VIEW main.v3 AS VALUES(3); + + CREATE VIEW aux.v2 AS SELECT * FROM v3; + CREATE VIEW main.v2 AS SELECT * FROM v3; + + SELECT * FROM main.v2 AS a, aux.v2 AS b, aux.v2 AS c, main.v2 AS d; +} { + 3 1 1 3 +} + finish_test From 98d63579be4de635e5f687929ba2553f5b725661 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 24 May 2019 11:55:01 +0000 Subject: [PATCH 28/96] Fix an fts5 segfault that could occur after parsing a corrupt structure record. FossilOrigin-Name: 600daa9c27206628bf74892376ded35dac11fe0a34894fcd975ad5041a0a0fda --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 207 +++++++++++++++++++++++++++++++- manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 214 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index da5293a194..73249b0a54 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -992,7 +992,7 @@ static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ /* TODO: Do we need this if the leaf-index is appended? Probably... */ memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); - if( p->rc==SQLITE_OK && pConfig->iCookie!=iCookie ){ + if( p->rc==SQLITE_OK && (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){ p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); } fts5DataRelease(pData); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 7c8a0f57f6..c5544c8dd6 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4668,7 +4668,6 @@ do_execsql_test 38.1 { do_execsql_test 38.2 { UPDATE t1_data SET block = X'000202' WHERE rowid=1; } -breakpoint do_catchsql_test 38.3 { SELECT * FROM t1('a b') ORDER BY rank; } {1 {database disk image is malformed}} @@ -8953,10 +8952,214 @@ do_execsql_test 61.1 { CREATE VIRTUAL TABLE t3 USING fts5vocab('t1'(),'col' ); } -do_catchsql_test 62.2 { +do_catchsql_test 61.2 { SELECT * FROM t3 ORDER BY rowid; } {1 {database disk image is malformed}} +breakpoint +#------------------------------------------------------------------------- +do_test 62.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-44942694542e1e.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 00 00 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 79 67 74 31 5f 63 blet1_confygt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 52 4c 4f 42 29 5e 05 07 17 21 Y, sz RLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 35 ff 63 6f 6e 74 65 6e 74 05 43 52 entt5.content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 42 29 69 04 07 17 19 c0, c1, cB)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 79 64 78 04 43 52 45 41 54 45 20 54 41 42 1_ydx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 74 61 ablet1_datat1_ta +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 2f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 /..........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 c7 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 04 16 01 02 02 03 06 01 02 02 02 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 02 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 00 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 74 67 04 02 02 01 02 02 01 02 02 01 06 65 ebtg...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 01 f1 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 45 02 02 01 02 02 01 02 02 01 02 .....E.......... +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 09 c1 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 00 35 0d 02 03 01 02 04 01 ........5....... +| 3552: 02 03 01 0f d7 63 63 01 02 03 01 02 03 01 02 03 .....cc......... +| 3568: 02 06 65 6f 70 6f 6b 79 10 02 03 01 02 03 01 02 ..eopoky........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 14 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 12 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 09 f6 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 11 02 ................ +| 3728: 02 01 04 6f 7d 69 74 1f 02 02 01 02 02 01 02 02 ...o.it......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 11 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 00 fa 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 03 04 01 40 .......vtab....@ +| 3856: 04 01 02 04 11 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 00 02 01 06 01 01 02 01 03 91 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 76 01 01 02 01 06 01 01 02 5c ......v......... +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 11 06 ................ +| 4000: 01 02 02 01 06 08 11 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 05 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 ca 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 14 24 0f D..@.......$Z.$. +| 4080: 0a 03 00 24 ff ff ff ff 01 01 02 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fb 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 09 00 00 00 00 00 00 00 00 00 ....$........... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 47 17 22 DSAFE=0XNOCASG.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 3f 41 44 20 45 58 54 45 4e 53 49 4f IT L?AD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 64 20 4c 4f 41 44 20 45 58 54 45 d9 53 49 MId LOAD EXTE.SI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 39 54 20 4c 4f 41 44 20 45 58 55 45 4e 53 OM9T LOAD EXUENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4c 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 LAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 af 4f 43 41 53 45 1e 1c 05 00 33 0000X.OCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 ab 30 30 58 62 54 52 49 4d 18 1b 05 00 25 00.00XbTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1b 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 63 35 58 42 49 NABLE MEMSYc5XBI +| 3456: 4e 41 52 59 1a 17 04 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 3d 45 ....)..ENABLE =E +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 46 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LF JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 46 45 46 50 4f 4c 59 57 42 49 NABLE FEFPOLYWBI +| 3616: 4e 41 52 59 18 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 5f 43 41 53 45 E GEOPOLYXN_CASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 42 ....)..ENABLE GB +| 3664: 2f 50 4f 4c 59 58 51 54 52 49 4d 17 0f 05 00 23 /POLYXQTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 1c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 16 0b LE FTS4XBINARY.. +| 3776: 05 00 22 0f e9 45 4e 41 42 4c 35 20 46 54 53 34 .....ENABL5 FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 00 47 45 4e XNOCASE....#.GEN +| 3808: 41 42 4c 45 20 46 54 53 34 57 52 54 52 49 4d 1e ABLE FTS4WRTRIM. +| 3824: 60 05 00 31 0f 19 45 4e 41 42 4c 55 20 43 42 53 `..1..ENABLU CBS +| 3840: 54 41 54 20 56 54 42 42 58 42 49 4e 41 52 59 1e TAT VTBBXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 40 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d T@T VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 55 20 44 42 53 ...1..ENABLU DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 12 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 21 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y!......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 18 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 42 54 52 49 4d 27 11 05 00 43 0f 19 43 4f 4d XBTRIM'...C..COM +| 3984: 50 49 48 f5 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PIH.R=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 22 32 30 31 36 30 36 30 cc-5.4.0.2016060 +| 4048: 39 c2 3e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9.>OCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 30 32 30 31 26 30 36 30 39 58 52 54 52 49 4d 00201&0609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 00 00 00 00 00 00 00 00 ....$........... +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 00 f6 17 03 00 19 e2 f9 01 ................ +| 3920: 06 16 03 00 12 02 05 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 10 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 00 f1 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 02 ff 84 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 07 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-44942694542e1e.db +}]} {} + +do_catchsql_test 62.1 { + WITH c(x) AS (VALUES(false) UNION ALL SELECT x+1 FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; +} {0 {}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 358fbc8568..168da4f56a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sfor\sthe\sfix\sin\sthe\sprevious\scommit. -D 2019-05-23T16:40:45.620 +C Fix\san\sfts5\ssegfault\sthat\scould\soccur\safter\sparsing\sa\scorrupt\sstructure\srecord. +D 2019-05-24T11:55:01.124 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f417615c657e5869649c605baaf38b1343e12f9556f9472159c3f837f856e4e8 +F ext/fts5/fts5_index.c 5a89e0341297fade9a8f2c7aecc1ebd2e7e0989da84ece4d287a153da73cf0e6 F ext/fts5/fts5_main.c abd04720e2729ba5bab2648d9d541faab18f45d481ae21fc30f125b55e979d6b F ext/fts5/fts5_storage.c b24f6916fcdd68989a549f25962f286bdba9d9d59c7581567a6a0eb647cd07cc F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 9f64bc23eff5c89d01fdbf2214bf05109d5759ebb32c07d9740175fb80e2f89d +F ext/fts5/test/fts5corrupt3.test ee32b76e1b4beae8051f0bd5bc9cc9609667fdaed87886eda69b96b305d21897 F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1828,7 +1828,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d2fe370cafa9b11f6c3eb4e1c3be48d9d2610b9d2f9d9ebf9e50267f9079dfc0 -R ff989ec1755651fcd43f9c9465026001 +P c1057b2a60add08e5c80ef2a53932a690b096f2eb03c7de863844deaa8fc9d53 +R f567420def97dd0b23423062e506d036 U dan -Z 150ba3b7918bcf8164acfcb2aad4db4c +Z fca2e115ce615d21967ebafbe5353094 diff --git a/manifest.uuid b/manifest.uuid index c3b0f77ef4..b33b6938a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1057b2a60add08e5c80ef2a53932a690b096f2eb03c7de863844deaa8fc9d53 \ No newline at end of file +600daa9c27206628bf74892376ded35dac11fe0a34894fcd975ad5041a0a0fda \ No newline at end of file From a0ed86bc372b5a14ab81027644c2bc37e62556da Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 24 May 2019 22:58:16 +0000 Subject: [PATCH 29/96] Improvements to rounding behavior in the round() and printf() functions. FossilOrigin-Name: 641b2d210541b4d5a1a9e57d7dcf5ce5dfd7ff4d2dc6277ba0582869f48fc946 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/printf.c | 15 +++++++++++++-- test/round1.test | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 test/round1.test diff --git a/manifest b/manifest index 168da4f56a..5fc9c50030 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sfts5\ssegfault\sthat\scould\soccur\safter\sparsing\sa\scorrupt\sstructure\srecord. -D 2019-05-24T11:55:01.124 +C Improvements\sto\srounding\sbehavior\sin\sthe\sround()\sand\sprintf()\sfunctions. +D 2019-05-24T22:58:16.438 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd +F src/printf.c 23a0fd3c81637d3d05340919d8a65963091e5f6597db1d275cdc9742dd970165 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1244,6 +1244,7 @@ F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a +F test/round1.test b0b29d360acbbda7b0e7d79c75c0575808a98a7b151ae863a9a8a6a0dd7ac868 F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 @@ -1828,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c1057b2a60add08e5c80ef2a53932a690b096f2eb03c7de863844deaa8fc9d53 -R f567420def97dd0b23423062e506d036 -U dan -Z fca2e115ce615d21967ebafbe5353094 +P 600daa9c27206628bf74892376ded35dac11fe0a34894fcd975ad5041a0a0fda +R 344188f99ea3b54a44aefc5d0b69d101 +U drh +Z cd3c36b6c431f378c015834e2bb5423e diff --git a/manifest.uuid b/manifest.uuid index b33b6938a3..8794f6f437 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -600daa9c27206628bf74892376ded35dac11fe0a34894fcd975ad5041a0a0fda \ No newline at end of file +641b2d210541b4d5a1a9e57d7dcf5ce5dfd7ff4d2dc6277ba0582869f48fc946 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 0f66bc29f5..f1634799ba 100644 --- a/src/printf.c +++ b/src/printf.c @@ -99,6 +99,12 @@ static const et_info fmtinfo[] = { { 'r', 10, 1, etORDINAL, 0, 0 }, }; +/* Floating point constants used for rounding */ +static const double arRound[] = { + 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, + 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, +}; + /* ** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point ** conversions will work. @@ -517,8 +523,13 @@ void sqlite3_str_vappendf( } if( xtype==etGENERIC && precision>0 ) precision--; testcase( precision>0xfff ); - for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){} - if( xtype==etFLOAT ) realvalue += rounder; + idx = precision & 0xfff; + rounder = arRound[idx%10]; + while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } + if( xtype==etFLOAT ){ + if( precision<17) rounder += realvalue*2.0e-16; + realvalue += rounder; + } /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ exp = 0; if( sqlite3IsNaN((double)realvalue) ){ diff --git a/test/round1.test b/test/round1.test new file mode 100644 index 0000000000..ce5f702c0a --- /dev/null +++ b/test/round1.test @@ -0,0 +1,41 @@ +# 2019-05-24 +# +# 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. +# +#*********************************************************************** +# Test cases for rounding behavior of floating point values. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix round1 + +expr srand(0) +unset -nocomplain iTest +for {set iTest 1} {$iTest<=10000} {incr iTest} { + set x1 [expr int(rand()*100000)] + set x2 [expr int(rand()*100000)+1000*int(rand()*10000)] + set n [expr int(rand()*8)+1] + set x3 [string range [format %09d $x2] [expr {9-$n}] end] + set r $x1.$x3 + set ans [string trimright $r 0] + if {[string match *. $ans]} {set ans ${ans}0} + do_test $iTest/$n/${r}4=>$ans { + set x [db one "SELECT round(${r}4,$n)"] + } $ans + set x4 [string range [format %09d [expr {$x2+1}]] [expr {9-$n}] end] + if {[string trim $x3 9]==""} {incr x1} + set r2 $x1.$x4 + set ans [string trimright $r2 0] + if {[string match *. $ans]} {set ans ${ans}0} + do_test $iTest/$n/${r}5=>$ans { + set x [db one "SELECT round(${r}5,$n)"] + } $ans +} + +finish_test From aa81cae485ce4c265437f908863b3f0fdbc73818 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 25 May 2019 00:17:26 +0000 Subject: [PATCH 30/96] Disable the new rounding tests on systems without long double support. FossilOrigin-Name: ed250b4e18ea042d681bbe8d7ed00895564f4525c22928a003a84585b4756ec3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/round1.test | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5fc9c50030..a4e04fd765 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\srounding\sbehavior\sin\sthe\sround()\sand\sprintf()\sfunctions. -D 2019-05-24T22:58:16.438 +C Disable\sthe\snew\srounding\stests\son\ssystems\swithout\slong\sdouble\ssupport. +D 2019-05-25T00:17:26.133 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1244,7 +1244,7 @@ F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a -F test/round1.test b0b29d360acbbda7b0e7d79c75c0575808a98a7b151ae863a9a8a6a0dd7ac868 +F test/round1.test 138fc19eb8798fac8a475e3c624b8d7736ea12b65ecef43bb6bcf071b3c63a81 F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 600daa9c27206628bf74892376ded35dac11fe0a34894fcd975ad5041a0a0fda -R 344188f99ea3b54a44aefc5d0b69d101 +P 641b2d210541b4d5a1a9e57d7dcf5ce5dfd7ff4d2dc6277ba0582869f48fc946 +R 1509ff37992ec43be26a56c59431662c U drh -Z cd3c36b6c431f378c015834e2bb5423e +Z 6c89935717c9ba7eedfcf2d77fafaeb4 diff --git a/manifest.uuid b/manifest.uuid index 8794f6f437..5004ad6af1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -641b2d210541b4d5a1a9e57d7dcf5ce5dfd7ff4d2dc6277ba0582869f48fc946 \ No newline at end of file +ed250b4e18ea042d681bbe8d7ed00895564f4525c22928a003a84585b4756ec3 \ No newline at end of file diff --git a/test/round1.test b/test/round1.test index ce5f702c0a..f3c9a81a20 100644 --- a/test/round1.test +++ b/test/round1.test @@ -15,6 +15,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix round1 +if {$::longdouble_size<=8} { + finish_test + return +} + expr srand(0) unset -nocomplain iTest for {set iTest 1} {$iTest<=10000} {incr iTest} { From 4413265d4eb6eab7dc6c8fde05738fb68990d901 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 25 May 2019 13:14:19 +0000 Subject: [PATCH 31/96] Add new cases to speedtest1 for measuring performance of binary to/from decimal conversions of floating point values. FossilOrigin-Name: b84e7057c05338347b4267f7ccc1d7b9b6d4e9a941ce8b76bf2c27c26772000c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 13 +++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a4e04fd765..a0a0a35c4b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\snew\srounding\stests\son\ssystems\swithout\slong\sdouble\ssupport. -D 2019-05-25T00:17:26.133 +C Add\snew\scases\sto\sspeedtest1\sfor\smeasuring\sperformance\sof\sbinary\sto/from\sdecimal\nconversions\sof\sfloating\spoint\svalues. +D 2019-05-25T13:14:19.953 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1350,7 +1350,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c cc7e6b4a7c9f3e3d1a497ae3f75236a832a2ce0f6a9b017f95d996c821605bfb +F test/speedtest1.c f3bfe3c6a87cbd88e4c4e38005d972bcc1019d1b2fe9569425f86629b11f6c31 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 641b2d210541b4d5a1a9e57d7dcf5ce5dfd7ff4d2dc6277ba0582869f48fc946 -R 1509ff37992ec43be26a56c59431662c +P ed250b4e18ea042d681bbe8d7ed00895564f4525c22928a003a84585b4756ec3 +R 2c768348491496273751373be91c3128 U drh -Z 6c89935717c9ba7eedfcf2d77fafaeb4 +Z 45355f8fcda3ba263b75983d16009530 diff --git a/manifest.uuid b/manifest.uuid index 5004ad6af1..c56abab974 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed250b4e18ea042d681bbe8d7ed00895564f4525c22928a003a84585b4756ec3 \ No newline at end of file +b84e7057c05338347b4267f7ccc1d7b9b6d4e9a941ce8b76bf2c27c26772000c \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index cf03c5354b..ccb8a44e18 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -1191,6 +1191,19 @@ void testset_fp(void){ speedtest1_run(); } speedtest1_end_test(); + + n = g.szTest*5000; + speedtest1_begin_test(140, "%d calls to round()", n); + speedtest1_exec("SELECT sum(round(a,2)+round(b,4)) FROM t1;"); + speedtest1_end_test(); + + + speedtest1_begin_test(150, "%d printf() calls", n*4); + speedtest1_exec( + "WITH c(fmt) AS (VALUES('%%g'),('%%e'),('%%!g'),('%%.20f'))" + "SELECT sum(printf(fmt,a)) FROM t1, c" + ); + speedtest1_end_test(); } #ifdef SQLITE_ENABLE_RTREE From 38a59af41766695f2e1aa6581781bb222e56a8b9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 25 May 2019 17:41:07 +0000 Subject: [PATCH 32/96] Use "long double" literals to initialize an array of "long double" objects. FossilOrigin-Name: 2e2ebad3ab636c4c65814ad41d417b105be8e254d609d0e08fbba4c5bd107bf3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/util.c | 18 +++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index a0a0a35c4b..257aeea9d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\scases\sto\sspeedtest1\sfor\smeasuring\sperformance\sof\sbinary\sto/from\sdecimal\nconversions\sof\sfloating\spoint\svalues. -D 2019-05-25T13:14:19.953 +C Use\s"long\sdouble"\sliterals\sto\sinitialize\san\sarray\sof\s"long\sdouble"\sobjects. +D 2019-05-25T17:41:07.575 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 4c0669e042b4e50a08a9e5fd14cecc76e5f877efa288533dccddb6fe98f4d6b5 +F src/util.c 94464ad0f6d893b439f773aa6acfb9c3220fd251f5ffd025529e290de6a1e2f7 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ed250b4e18ea042d681bbe8d7ed00895564f4525c22928a003a84585b4756ec3 -R 2c768348491496273751373be91c3128 +P b84e7057c05338347b4267f7ccc1d7b9b6d4e9a941ce8b76bf2c27c26772000c +R 93de9e77865611bdbf18a7a1be8bf013 U drh -Z 45355f8fcda3ba263b75983d16009530 +Z 961c5c6f7eb3026439aac298d02352ba diff --git a/manifest.uuid b/manifest.uuid index c56abab974..c520f7ced3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b84e7057c05338347b4267f7ccc1d7b9b6d4e9a941ce8b76bf2c27c26772000c \ No newline at end of file +2e2ebad3ab636c4c65814ad41d417b105be8e254d609d0e08fbba4c5bd107bf3 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 6d619e231c..dabff991a2 100644 --- a/src/util.c +++ b/src/util.c @@ -359,15 +359,15 @@ int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ #if defined(_MSC_VER) static const LONGDOUBLE_TYPE x[] = { - 1.0e+001, - 1.0e+002, - 1.0e+004, - 1.0e+008, - 1.0e+016, - 1.0e+032, - 1.0e+064, - 1.0e+128, - 1.0e+256 + 1.0e+001L, + 1.0e+002L, + 1.0e+004L, + 1.0e+008L, + 1.0e+016L, + 1.0e+032L, + 1.0e+064L, + 1.0e+128L, + 1.0e+256L }; LONGDOUBLE_TYPE r = 1.0; int i; From c2b893a7e0688556eed1a4150942742bb4d5c977 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 25 May 2019 18:17:53 +0000 Subject: [PATCH 33/96] Performance enhancement in sqlite3AtoF(). About 8% faster. FossilOrigin-Name: 81721aa54587e20d031d528fb6b74d91671a6e950fa926dc63f4284466e70f0e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/util.c | 20 +++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 257aeea9d7..22c51be6ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s"long\sdouble"\sliterals\sto\sinitialize\san\sarray\sof\s"long\sdouble"\sobjects. -D 2019-05-25T17:41:07.575 +C Performance\senhancement\sin\ssqlite3AtoF().\s\sAbout\s8%\sfaster. +D 2019-05-25T18:17:53.260 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 94464ad0f6d893b439f773aa6acfb9c3220fd251f5ffd025529e290de6a1e2f7 +F src/util.c 2f07256354b58053c20045fa5b3d4bc3884dfa4d393a66c983cfea115d8253dc F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b84e7057c05338347b4267f7ccc1d7b9b6d4e9a941ce8b76bf2c27c26772000c -R 93de9e77865611bdbf18a7a1be8bf013 +P 2e2ebad3ab636c4c65814ad41d417b105be8e254d609d0e08fbba4c5bd107bf3 +R ef9208359f9605c768184cd8045692e9 U drh -Z 961c5c6f7eb3026439aac298d02352ba +Z f6f659f82b7441453c2104f0c0b3b1fb diff --git a/manifest.uuid b/manifest.uuid index c520f7ced3..776837a336 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e2ebad3ab636c4c65814ad41d417b105be8e254d609d0e08fbba4c5bd107bf3 \ No newline at end of file +81721aa54587e20d031d528fb6b74d91671a6e950fa926dc63f4284466e70f0e \ No newline at end of file diff --git a/src/util.c b/src/util.c index dabff991a2..a59a2d240e 100644 --- a/src/util.c +++ b/src/util.c @@ -423,7 +423,7 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ int e = 0; /* exponent */ int eValid = 1; /* True exponent is either not used or is well-formed */ double result; - int nDigits = 0; + int nDigit = 0; /* Number of digits processed */ int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); @@ -454,14 +454,15 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ } /* copy max significant digits to significand */ - while( z=((LARGEST_INT64-9)/10) ){ + /* skip non-significant significand digits + ** (increase exponent by d to shift decimal left) */ + while( z=zEnd ) goto do_atof_calc; /* if decimal point is present */ @@ -473,8 +474,9 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ if( s<((LARGEST_INT64-9)/10) ){ s = s*10 + (*z - '0'); d--; + nDigit++; } - z+=incr; nDigits++; + z+=incr; } } if( z>=zEnd ) goto do_atof_calc; @@ -581,7 +583,7 @@ do_atof_calc: *pResult = result; /* return true if number and no extra non-whitespace chracters after */ - return z==zEnd && nDigits>0 && eValid && nonNum==0; + return z==zEnd && nDigit>0 && eValid && nonNum==0; #else return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ From ef7d5187a74fdddee3dabfaddebaf63ca316aac7 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 27 May 2019 00:29:15 +0000 Subject: [PATCH 34/96] Improved rounding even on systems with an 8-byte "long double" type. FossilOrigin-Name: 15202aee150fa8e15fb90e90e5765c5e19a1eaf4896da2996a747636b76da8e6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 7 ++++++- test/round1.test | 7 +------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 22c51be6ab..35606de1a9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\senhancement\sin\ssqlite3AtoF().\s\sAbout\s8%\sfaster. -D 2019-05-25T18:17:53.260 +C Improved\srounding\seven\son\ssystems\swith\san\s8-byte\s"long\sdouble"\stype. +D 2019-05-27T00:29:15.840 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c 23a0fd3c81637d3d05340919d8a65963091e5f6597db1d275cdc9742dd970165 +F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1244,7 +1244,7 @@ F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a -F test/round1.test 138fc19eb8798fac8a475e3c624b8d7736ea12b65ecef43bb6bcf071b3c63a81 +F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab21e F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2e2ebad3ab636c4c65814ad41d417b105be8e254d609d0e08fbba4c5bd107bf3 -R ef9208359f9605c768184cd8045692e9 +P 81721aa54587e20d031d528fb6b74d91671a6e950fa926dc63f4284466e70f0e +R c9de0c36c0333668e5f2f8e4d611250f U drh -Z f6f659f82b7441453c2104f0c0b3b1fb +Z 1cb14885af88ddd3e3ec785d1bef950d diff --git a/manifest.uuid b/manifest.uuid index 776837a336..3dafc063a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -81721aa54587e20d031d528fb6b74d91671a6e950fa926dc63f4284466e70f0e \ No newline at end of file +15202aee150fa8e15fb90e90e5765c5e19a1eaf4896da2996a747636b76da8e6 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index f1634799ba..fc77f68dff 100644 --- a/src/printf.c +++ b/src/printf.c @@ -527,7 +527,12 @@ void sqlite3_str_vappendf( rounder = arRound[idx%10]; while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } if( xtype==etFLOAT ){ - if( precision<17) rounder += realvalue*2.0e-16; + double rx = (double)realvalue; + sqlite3_uint64 u; + int ex; + memcpy(&u, &rx, sizeof(u)); + ex = -1023 + (int)((u>>52)&0x7ff); + if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16; realvalue += rounder; } /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ diff --git a/test/round1.test b/test/round1.test index f3c9a81a20..ba2c79eaba 100644 --- a/test/round1.test +++ b/test/round1.test @@ -15,14 +15,9 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix round1 -if {$::longdouble_size<=8} { - finish_test - return -} - expr srand(0) unset -nocomplain iTest -for {set iTest 1} {$iTest<=10000} {incr iTest} { +for {set iTest 1} {$iTest<=50000} {incr iTest} { set x1 [expr int(rand()*100000)] set x2 [expr int(rand()*100000)+1000*int(rand()*10000)] set n [expr int(rand()*8)+1] From 3517cc7f36ab406fbdfd0517976ae456f7905cd4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 27 May 2019 11:09:55 +0000 Subject: [PATCH 35/96] Fix a memory leak in the delta_parse() table-valued function of the fossildelta.c extension. FossilOrigin-Name: c86ca3f0220a5f9e7f7f1818f6e1220d851f3ebed6a5f0aae6ac38309bd2930e --- ext/misc/fossildelta.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 7e78f6fb12..2c7154882f 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -849,6 +849,7 @@ static int deltaparsevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ */ static int deltaparsevtabClose(sqlite3_vtab_cursor *cur){ deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + sqlite3_free(pCur->aDelta); sqlite3_free(pCur); return SQLITE_OK; } diff --git a/manifest b/manifest index 35606de1a9..d050a178c8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\srounding\seven\son\ssystems\swith\san\s8-byte\s"long\sdouble"\stype. -D 2019-05-27T00:29:15.840 +C Fix\sa\smemory\sleak\sin\sthe\sdelta_parse()\stable-valued\sfunction\sof\sthe\nfossildelta.c\sextension. +D 2019-05-27T11:09:55.813 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -290,7 +290,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09915f -F ext/misc/fossildelta.c 910510968a30ab77b8ac1a27931f2cb834e9db9fd5ab122f53b6045b4315665d +F ext/misc/fossildelta.c 5c04d0a5657615daf4c6cd01c4281de8983dd28f6eed592b2691c10e3f6710e1 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 81721aa54587e20d031d528fb6b74d91671a6e950fa926dc63f4284466e70f0e -R c9de0c36c0333668e5f2f8e4d611250f +P 15202aee150fa8e15fb90e90e5765c5e19a1eaf4896da2996a747636b76da8e6 +R e61fea6f93806d01823e5fc691f3aa88 U drh -Z 1cb14885af88ddd3e3ec785d1bef950d +Z 3d2ff6acd2478eed643bd175bc3f125f diff --git a/manifest.uuid b/manifest.uuid index 3dafc063a2..6d6459ecb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -15202aee150fa8e15fb90e90e5765c5e19a1eaf4896da2996a747636b76da8e6 \ No newline at end of file +c86ca3f0220a5f9e7f7f1818f6e1220d851f3ebed6a5f0aae6ac38309bd2930e \ No newline at end of file From 0a0e89fa2136ffdcecff19916c22f25f4fca55c5 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 27 May 2019 11:21:43 +0000 Subject: [PATCH 36/96] Fix an error message on the blobread() extension function so that it says "read" instead of "write". FossilOrigin-Name: 7cbb9a5fe835d01be158edd1e2f9d553dc257f2d27b53a5d5bf6660d0bd101c4 --- ext/misc/blobio.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/blobio.c b/ext/misc/blobio.c index 65ca467e3a..3a1ee8465c 100644 --- a/ext/misc/blobio.c +++ b/ext/misc/blobio.c @@ -76,7 +76,7 @@ static void readblobFunc( sqlite3_blob_close(pBlob); if( rc ){ sqlite3_free(aData); - sqlite3_result_error(context, "BLOB write failed", -1); + sqlite3_result_error(context, "BLOB read failed", -1); }else{ sqlite3_result_blob(context, aData, nData, sqlite3_free); } diff --git a/manifest b/manifest index d050a178c8..1844661063 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sthe\sdelta_parse()\stable-valued\sfunction\sof\sthe\nfossildelta.c\sextension. -D 2019-05-27T11:09:55.813 +C Fix\san\serror\smessage\son\sthe\sblobread()\sextension\sfunction\sso\sthat\sit\ssays\n"read"\sinstead\sof\s"write". +D 2019-05-27T11:21:43.537 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -278,7 +278,7 @@ F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f23 F ext/misc/amatch.c 50a9ef2d38dabfa371f8c1904097d493271e63d58ccb0e9b79a4fa4a94e66660 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/blobio.c 085bbfa57ea58bb15d994ba4cd397bff6f0c38c4f618adbc62cf4d3780e5d88a +F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 15202aee150fa8e15fb90e90e5765c5e19a1eaf4896da2996a747636b76da8e6 -R e61fea6f93806d01823e5fc691f3aa88 +P c86ca3f0220a5f9e7f7f1818f6e1220d851f3ebed6a5f0aae6ac38309bd2930e +R 28acc3f29bcd4bbf90c1d0a0ea9891e4 U drh -Z 3d2ff6acd2478eed643bd175bc3f125f +Z aea7d8aa2e27fa39ddeadb0238a8b803 diff --git a/manifest.uuid b/manifest.uuid index 6d6459ecb2..21ee82d3bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c86ca3f0220a5f9e7f7f1818f6e1220d851f3ebed6a5f0aae6ac38309bd2930e \ No newline at end of file +7cbb9a5fe835d01be158edd1e2f9d553dc257f2d27b53a5d5bf6660d0bd101c4 \ No newline at end of file From efdb371a1d591f7ba4346804eb4b0f954e6c90ca Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 28 May 2019 14:42:32 +0000 Subject: [PATCH 37/96] Fix an assert() in fts3 that could fail when processing corrupt records. Also some minor sanitizer warnings. FossilOrigin-Name: c736c40aab071a69bd5c5347b7c116d87ea3954019e967ca8ff7bdb4b518e5bf --- ext/fts3/fts3_write.c | 38 +++---- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 234 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 263 insertions(+), 27 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 7d2820e03a..9a223231ac 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3934,7 +3934,7 @@ static int fts3AppendToNode( /* Node must have already been started. There must be a doclist for a ** leaf node, and there must not be a doclist for an internal node. */ assert( pNode->n>0 ); - assert( (pNode->a[0]=='\0')==(aDoclist!=0) ); + assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) ); blobGrowBuffer(pPrev, nTerm, &rc); if( rc!=SQLITE_OK ) return rc; @@ -4150,7 +4150,7 @@ static int fts3TermCmp( int nCmp = MIN(nLhs, nRhs); int res; - res = memcmp(zLhs, zRhs, nCmp); + res = (nCmp ? memcmp(zLhs, zRhs, nCmp) : 0); if( res==0 ) res = nLhs - nRhs; return res; @@ -4293,23 +4293,25 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[i]; rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); - while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); - blobGrowBuffer(&pNode->key, reader.term.n, &rc); - if( rc==SQLITE_OK ){ - memcpy(pNode->key.a, reader.term.a, reader.term.n); - pNode->key.n = reader.term.n; - if( i>0 ){ - char *aBlock = 0; - int nBlock = 0; - pNode = &pWriter->aNodeWriter[i-1]; - pNode->iBlock = reader.iChild; - rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); - blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc); - if( rc==SQLITE_OK ){ - memcpy(pNode->block.a, aBlock, nBlock); - pNode->block.n = nBlock; + if( reader.aNode ){ + while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + blobGrowBuffer(&pNode->key, reader.term.n, &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->key.a, reader.term.a, reader.term.n); + pNode->key.n = reader.term.n; + if( i>0 ){ + char *aBlock = 0; + int nBlock = 0; + pNode = &pWriter->aNodeWriter[i-1]; + pNode->iBlock = reader.iChild; + rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); + blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc); + if( rc==SQLITE_OK ){ + memcpy(pNode->block.a, aBlock, nBlock); + pNode->block.n = nBlock; + } + sqlite3_free(aBlock); } - sqlite3_free(aBlock); } } nodeReaderRelease(&reader); diff --git a/manifest b/manifest index 1844661063..131f4696ed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\serror\smessage\son\sthe\sblobread()\sextension\sfunction\sso\sthat\sit\ssays\n"read"\sinstead\sof\s"write". -D 2019-05-27T11:21:43.537 +C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\scorrupt\srecords.\sAlso\ssome\sminor\ssanitizer\swarnings. +D 2019-05-28T14:42:32.004 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 05fd879124769bb59af4263c63a4c5bd6370e49b6dc906208150e3ad29ebf813 +F ext/fts3/fts3_write.c 35f13d6f50a44003135ddf169db43af0cd970f086bdc78b20256d83ff5add7d5 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -929,7 +929,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test e4c038936bca89cddfb8636a442a0a5f7e027a9f6d90f194491534a2d53ea31b +F test/fts3corrupt4.test 26039980f3a4550f4c1437c8182204a93b81c568406eca104451f88eeb830633 F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c86ca3f0220a5f9e7f7f1818f6e1220d851f3ebed6a5f0aae6ac38309bd2930e -R 28acc3f29bcd4bbf90c1d0a0ea9891e4 -U drh -Z aea7d8aa2e27fa39ddeadb0238a8b803 +P 7cbb9a5fe835d01be158edd1e2f9d553dc257f2d27b53a5d5bf6660d0bd101c4 +R 26e3f1c25f112ad35d8663e8b483c4e3 +U dan +Z 20d8c2bc205996206f3528e83303f90e diff --git a/manifest.uuid b/manifest.uuid index 21ee82d3bc..9c072458ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cbb9a5fe835d01be158edd1e2f9d553dc257f2d27b53a5d5bf6660d0bd101c4 \ No newline at end of file +c736c40aab071a69bd5c5347b7c116d87ea3954019e967ca8ff7bdb4b518e5bf \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 36b89b4186..e60f564633 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -4611,6 +4611,240 @@ do_execsql_test 26.1 { SELECT t1, (t1) FROM t1 WHERE b MATCH 'x' ) } 34 + +#------------------------------------------------------------------------- +reset_db +do_test 27.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-23ddd777a03bfd.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 64 73 74 31 5f 73 65 67 6d 65 6e 73 73 04 43 52 dst1_segmenss.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 4e 72 59 INTEGER PRIMNrY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 39 4d cid INTEGER PR9M +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 26 0b 48 0e 0f d8 0f af 0f 86 0f 74 ....&.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e 00 00 00 00 00 .a.N./.......... +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 55 42 4.0 20160609 DUB +| 2928: 55 47 20 45 4e 41 e4 7c 45 20 44 42 53 54 41 54 UG ENA.|E DBSTAT +| 2944: e4 46 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 .FTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 42 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 BTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4c 49 54 20 4c =50000000 OLIT L +| 3056: 4f 41 43 20 45 58 54 45 4e 53 49 4f 4e 21 54 48 OAC EXTENSION!TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 4b 75 3d 30 58 4d 4f 43 41 53 45 17 22 DSAKu=0XMOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 46 3d ..%..THREADSAFF= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 52 49 4f IT LOAD EXTENRIO +| 3184: 4e 58 42 49 4e 41 52 59 0f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 43 49 MIT LOAD EXTENCI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 5d 12 49 4d 1f 1e 05 00 33 0f 19 IONXR].IM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4f 4f 43 41 53 45 1e 1c 05 00 33 0000XOOCASE....3 +| 3328: 0f 17 4d 41 b8 20 4d 45 4d 4f 52 59 3d 35 30 3c ..MA. MEMORY=50< +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 0d a5 0f 19 45 4e 41 42 INARY.......ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 1c 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 53 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NASY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 14 05 01 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 12 42 4c 45 20 4a 53 4f 4e 31 58 42 ..EN.BLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 09 d9 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 3e 31 58 4e 4f 43 41 53 45 17 LE JSO>1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 40 42 4c 45 20 4a 53 4f ...%..EN@BLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 82 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4d 59 58 42 49 NABLE GEOPOMYXBI +| 3616: 4e 41 52 59 1a 11 05 c9 29 e8 19 46 4e 41 42 4c NARY....)..FNABL +| 3632: 48 c0 47 45 4f 50 4f 4c 59 58 4e 74 43 41 53 45 H.GEOPOLYXNtCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 30 46 54 53 35 58 42 49 ..ENABLE0FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 4a e1 53 45 16 0e 05 E FTS5XNOJ.SE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 55 4e XNOCASE....#..UN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 42 42 4c 45 20 44 42 53 ...1..ENBBLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 4a 4d 11 06 TAT VTABXRTRJM.. +| 3920: 05 f0 17 0f 29 44 45 42 55 47 58 42 49 4e 41 52 ....)DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0e 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 16 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 06 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4b 45 52 3d 67 63 63 2d 35 2e 34 2e OMPIKER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 40 39 58 29 54 52 49 4d 0 201606@9X)TRIM +| page 4 offset 12288 +| 0: 0d 00 10 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 16: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 7c 65 09 25 09 g.%....enab|e.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6e 6f 72 79 ..max.%....enory +| 3184: 03 25 19 00 03 04 ce 79 73 4d 03 25 15 00 00 04 .%.....ysM.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 0e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 02 f1 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 01 f2 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 67 ler............g +| 3440: d2 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 .stat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 6f 82 6c 65 3f 07 02 00 01 02 00 01 02 .eno.le?........ +| 3488: b0 01 02 00 01 02 00 11 0a f0 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 a6 00 01 02 00 02 ................ +| 3520: 02 05 51 02 00 01 02 00 01 02 00 01 02 00 01 02 ..Q............. +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 00 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 73 6c 79 09 .........eopsly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 12 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 01 e3 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 01 f0 01 01 01 07 30 01 01 01 02 00 01 01 ........0....... +| 3968: 01 02 00 ea 01 01 02 00 01 01 01 02 00 11 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 01 ff 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 11 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 01 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0e f4 0f e9 10 d6 0f c7 ................ +| 4016: 00 00 00 00 00 00 00 00 0f 85 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =1.............. +| end crash-23ddd777a03bfd.db +}]} {} + +do_catchsql_test 27.2 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x GLOB 2.16770 FROM x) + INSERT INTO t1(a) SELECT randomblob(3000) FROM t2 ; +} {0 {}} +do_catchsql_test 27.3 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT 3+x FROM c WHERE x<2.653) + INSERT INTO t1(a) SELECT randomblob(-current_time) FROM c; +} {0 {}} +do_catchsql_test 27.4 { + UPDATE t1 SET b=quote((true) ) WHERE t1 MATCH 'h*h*'; +} {0 {}} +do_catchsql_test 27.5 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT 3+x FROM c WHERE x<2.653) + INSERT INTO t1(a) SELECT randomblob(-current_time) FROM c; +} {0 {}} +do_catchsql_test 27.5 { + INSERT INTO t1(t1) SELECT x FROM t2; +} {0 {}} +do_catchsql_test 27.6 { + INSERT INTO t1(t1) SELECT x FROM t2; +} {0 {}} finish_test From 7cd5e856e55c64ed7109595c7dd154d65861ec03 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 29 May 2019 17:22:38 +0000 Subject: [PATCH 38/96] Fix the query flattener optimization so that it preserve the "SF_Compound" bit when flattening a compound subquery into a non-compound outer query. Failure to preserve that bit could allow subsequent flattenings which are not valid. Fix for ticket [c41afac34f15781fe09cd]. FossilOrigin-Name: 523b42371122d9e1b3185425745f1490138bff7f7cc941ee26ee81df7ade5bf4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 8 ++++---- test/select6.test | 17 ++++++++++++++++- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 131f4696ed..71cc36d6f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\scorrupt\srecords.\sAlso\ssome\sminor\ssanitizer\swarnings. -D 2019-05-28T14:42:32.004 +C Fix\sthe\squery\sflattener\soptimization\sso\sthat\sit\spreserve\sthe\s"SF_Compound"\nbit\swhen\sflattening\sa\scompound\ssubquery\sinto\sa\snon-compound\souter\squery.\nFailure\sto\spreserve\sthat\sbit\scould\sallow\ssubsequent\sflattenings\swhich\sare\nnot\svalid.\sFix\sfor\sticket\s[c41afac34f15781fe09cd]. +D 2019-05-29T17:22:38.103 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c ccd314a204ef27edadeb58faebc7ded1f967fa83d6b9b858cd422c80ef171643 +F src/select.c 87ea2169d63a363a4ce5e2b9fa901c98126e5a57a5e865cb8e0032d8781d4b6f F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1282,7 +1282,7 @@ F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546 -F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0 +F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801 F test/select7.test f659f231489349e8c5734e610803d7654207318f F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7cbb9a5fe835d01be158edd1e2f9d553dc257f2d27b53a5d5bf6660d0bd101c4 -R 26e3f1c25f112ad35d8663e8b483c4e3 -U dan -Z 20d8c2bc205996206f3528e83303f90e +P c736c40aab071a69bd5c5347b7c116d87ea3954019e967ca8ff7bdb4b518e5bf +R 2c266512a1a06dffad446ef8f7479e2d +U drh +Z e14541c4ce7a69af488fec1ac8365e2a diff --git a/manifest.uuid b/manifest.uuid index 9c072458ec..4be6010e51 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c736c40aab071a69bd5c5347b7c116d87ea3954019e967ca8ff7bdb4b518e5bf \ No newline at end of file +523b42371122d9e1b3185425745f1490138bff7f7cc941ee26ee81df7ade5bf4 \ No newline at end of file diff --git a/src/select.c b/src/select.c index b421b0fcff..3091f17d4c 100644 --- a/src/select.c +++ b/src/select.c @@ -4045,10 +4045,10 @@ static int flattenSubquery( substSelect(&x, pParent, 0); } - /* The flattened query is distinct if either the inner or the - ** outer query is distinct. - */ - pParent->selFlags |= pSub->selFlags & SF_Distinct; + /* The flattened query is a compound if either the inner or the + ** outer query is a compound. */ + pParent->selFlags |= pSub->selFlags & SF_Compound; + assert( (pSub->selFlags & SF_Distinct)==0 ); /* restriction (17b) */ /* ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; diff --git a/test/select6.test b/test/select6.test index 590512a6b0..ef5c5b2f07 100644 --- a/test/select6.test +++ b/test/select6.test @@ -12,7 +12,6 @@ # focus of this file is testing SELECT statements that contain # subqueries in their FROM clause. # -# $Id: select6.test,v 1.29 2009/01/09 01:12:28 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -613,5 +612,21 @@ do_execsql_test 11.100 { FROM ( SELECT count(*) AS cnt FROM t1 ); } {{}} +# 2019-05-29 ticket https://www.sqlite.org/src/info/c41afac34f15781f +# A LIMIT clause in a subquery is incorrectly applied to a subquery. +# +do_execsql_test 12.100 { + DROP TABLE t1; + DROP TABLE t2; + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1); + INSERT INTO t1 VALUES(2); + CREATE TABLE t2(b); + INSERT INTO t2 VALUES(3); + SELECT * FROM ( + SELECT * FROM (SELECT * FROM t1 LIMIT 1) + UNION ALL + SELECT * from t2); +} {1 3} finish_test From b0968b6b140d415e2ebac0583d9b323913d6ad16 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 29 May 2019 18:33:59 +0000 Subject: [PATCH 39/96] Add an assert() as an additional test for fix in check-in [523b42371122d9e1b3]. FossilOrigin-Name: f9e85e6c79162081f8f512d22951931a89d157a32b24afdc48b7eb865379abe7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 71cc36d6f9..e176159d4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\squery\sflattener\soptimization\sso\sthat\sit\spreserve\sthe\s"SF_Compound"\nbit\swhen\sflattening\sa\scompound\ssubquery\sinto\sa\snon-compound\souter\squery.\nFailure\sto\spreserve\sthat\sbit\scould\sallow\ssubsequent\sflattenings\swhich\sare\nnot\svalid.\sFix\sfor\sticket\s[c41afac34f15781fe09cd]. -D 2019-05-29T17:22:38.103 +C Add\san\sassert()\sas\san\sadditional\stest\sfor\sfix\sin\scheck-in\s[523b42371122d9e1b3]. +D 2019-05-29T18:33:59.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 87ea2169d63a363a4ce5e2b9fa901c98126e5a57a5e865cb8e0032d8781d4b6f +F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c736c40aab071a69bd5c5347b7c116d87ea3954019e967ca8ff7bdb4b518e5bf -R 2c266512a1a06dffad446ef8f7479e2d +P 523b42371122d9e1b3185425745f1490138bff7f7cc941ee26ee81df7ade5bf4 +R 02ac4619c1cd7611d095b6b080f57f2d U drh -Z e14541c4ce7a69af488fec1ac8365e2a +Z c74bccf839be69c4d3d35a14f921375f diff --git a/manifest.uuid b/manifest.uuid index 4be6010e51..9463b5aacc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -523b42371122d9e1b3185425745f1490138bff7f7cc941ee26ee81df7ade5bf4 \ No newline at end of file +f9e85e6c79162081f8f512d22951931a89d157a32b24afdc48b7eb865379abe7 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 3091f17d4c..bd16acb027 100644 --- a/src/select.c +++ b/src/select.c @@ -2540,6 +2540,7 @@ static int multiSelect( */ assert( p && p->pPrior ); /* Calling function guarantees this much */ assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION ); + assert( p->selFlags & SF_Compound ); db = pParse->db; pPrior = p->pPrior; dest = *pDest; From 8a3884efae47b8f762fdd7c3b0751ddca8e41243 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 29 May 2019 21:18:27 +0000 Subject: [PATCH 40/96] Much faster implementation of applyNumericAffinity() by avoiding some unnecessary calls to sqlite3Atoi64(). FossilOrigin-Name: c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/util.c | 17 ++++++++++++----- src/vdbe.c | 32 ++++++++++++++++++++++++++++---- src/vdbemem.c | 2 +- 6 files changed, 52 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index e176159d4f..78f25db778 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sassert()\sas\san\sadditional\stest\sfor\sfix\sin\scheck-in\s[523b42371122d9e1b3]. -D 2019-05-29T18:33:59.635 +C Much\sfaster\simplementation\sof\sapplyNumericAffinity()\sby\savoiding\ssome\nunnecessary\scalls\sto\ssqlite3Atoi64(). +D 2019-05-29T21:18:27.160 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 1ba98b4b8742f9b04ae3db1df36a607d4cf6591f3f6f6507f33d9e136fe2c136 +F src/sqliteInt.h 0769cc94ac573aea0cc293b4f4e12d9cc1fb7549cece32ff6ff781214ced474c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,15 +592,15 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 2f07256354b58053c20045fa5b3d4bc3884dfa4d393a66c983cfea115d8253dc +F src/util.c e278abeb8c82fc84dac998f2f2cf16ef7740333cae9335ce270b9af75e0505a0 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 0380e94736e0b5a0717460d1d3546ae4b1338d0fe7ea07674633d1fd9a5fc42b +F src/vdbe.c e6fb674eda4aa32c50d53eb09210c9ed802866cb4d1dc0d6187301b55e4a82b7 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c afe8d7858ad7a7cd67b16d0df396f5c672309722c7855d33cd10adb7ce076b4b F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c e9a0aa2feb93356333bcd94491c25bac041e63e3d87e4caac67fde742dd2deba +F src/vdbemem.c 5ecfa992b496c8e46227f1ff2ebae30c7b7a6bc098229c89a8ff49cf27249d69 F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 523b42371122d9e1b3185425745f1490138bff7f7cc941ee26ee81df7ade5bf4 -R 02ac4619c1cd7611d095b6b080f57f2d +P f9e85e6c79162081f8f512d22951931a89d157a32b24afdc48b7eb865379abe7 +R a653c2e9383493624b2d8a6c82e92a37 U drh -Z c74bccf839be69c4d3d35a14f921375f +Z 02644c99894a777c23667de1b2c8f4f7 diff --git a/manifest.uuid b/manifest.uuid index 9463b5aacc..f9268007f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f9e85e6c79162081f8f512d22951931a89d157a32b24afdc48b7eb865379abe7 \ No newline at end of file +c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5518d93ab1..24fabe6276 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4175,6 +4175,7 @@ int sqlite3FixSelect(DbFixer*, Select*); int sqlite3FixExpr(DbFixer*, Expr*); int sqlite3FixExprList(DbFixer*, ExprList*); int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); +int sqlite3RealSameAsInt(double,sqlite3_int64); int sqlite3AtoF(const char *z, double*, int, u8); int sqlite3GetInt32(const char *, int*); int sqlite3Atoi(const char*); diff --git a/src/util.c b/src/util.c index a59a2d240e..938b6a9fb2 100644 --- a/src/util.c +++ b/src/util.c @@ -397,8 +397,13 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ ** uses the encoding enc. The string is not necessarily zero-terminated. ** ** Return TRUE if the result is a valid real number (or integer) and FALSE -** if the string is empty or contains extraneous text. Valid numbers -** are in one of these formats: +** if the string is empty or contains extraneous text. More specifically +** return +** 1 => The input string is a pure integer +** 2 or more => The input has a decimal point or eNNN clause +** 0 => The input string is not a valid number +** +** Valid numbers are in one of these formats: ** ** [+-]digits[E[+-]digits] ** [+-]digits.[digits][E[+-]digits] @@ -424,7 +429,7 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ int eValid = 1; /* True exponent is either not used or is well-formed */ double result; int nDigit = 0; /* Number of digits processed */ - int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ @@ -436,7 +441,7 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ incr = 2; assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); for(i=3-enc; i0 && eValid && nonNum==0; + return z==zEnd && nDigit>0 && eValid && eType>0 ? eType : 0; #else return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ diff --git a/src/vdbe.c b/src/vdbe.c index c8dd618adf..7e1356679a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -276,6 +276,30 @@ static VdbeCursor *allocateCursor( return pCx; } +/* +** The string in pRec is known to look like an integer and to have a +** floating point value of rValue. Return true and set *piValue to the +** integer value if the string is in range to be an integer. Otherwise, +** return false. +*/ +static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ + i64 iValue = (double)rValue; + if( sqlite3RealSameAsInt(rValue,iValue) ){ + testcase( iValue<-2251799813685248 ); + testcase( iValue==-2251799813685248 ); + testcase( iValue==-2251799813685247 ); + testcase( iValue>-2251799813685247 && iValue<+2251799813685247 ); + testcase( iValue==+2251799813685247 ); + testcase( iValue==+2251799813685248 ); + testcase( iValue>+2251799813685248 ); + if( iValue > -2251799813685248 && iValue < 2251799813685248 ){ + *piValue = iValue; + return 1; + } + } + return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); +} + /* ** Try to convert a value into a numeric representation if we can ** do so without loss of information. In other words, if the string @@ -293,12 +317,12 @@ static VdbeCursor *allocateCursor( */ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ double rValue; - i64 iValue; u8 enc = pRec->enc; + int rc; assert( (pRec->flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); - if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return; - if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){ - pRec->u.i = iValue; + rc = sqlite3AtoF(pRec->z, &rValue, pRec->n, enc); + if( rc==0 ) return; + if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ pRec->flags |= MEM_Int; }else{ pRec->u.r = rValue; diff --git a/src/vdbemem.c b/src/vdbemem.c index ee4a4a3905..e8e85dc9e6 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -697,7 +697,7 @@ int sqlite3VdbeMemRealify(Mem *pMem){ ** comparison of "r1==(double)i" you sometimes get an answer of false even ** though the r1 and (double)i values are bit-for-bit the same. */ -static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ +int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ double r2 = (double)i; return memcmp(&r1, &r2, sizeof(r1))==0; } From 05921223c25ae385a5e17bbf5484f5885bb78f2c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 30 May 2019 00:46:37 +0000 Subject: [PATCH 41/96] Smaller and faster sqlite3IsNaN() implementation makes deserialization of floating point values much faster. FossilOrigin-Name: ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 4 ++++ src/util.c | 42 +++--------------------------------------- src/vdbeaux.c | 4 ++-- 5 files changed, 18 insertions(+), 50 deletions(-) diff --git a/manifest b/manifest index 78f25db778..a2a87ce139 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Much\sfaster\simplementation\sof\sapplyNumericAffinity()\sby\savoiding\ssome\nunnecessary\scalls\sto\ssqlite3Atoi64(). -D 2019-05-29T21:18:27.160 +C Smaller\sand\sfaster\ssqlite3IsNaN()\simplementation\smakes\sdeserialization\sof\nfloating\spoint\svalues\smuch\sfaster. +D 2019-05-30T00:46:37.512 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 0769cc94ac573aea0cc293b4f4e12d9cc1fb7549cece32ff6ff781214ced474c +F src/sqliteInt.h 73d93952552a7a5fdb29ae19ef9919041364070615ba04c2d673126185f523bf F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,13 +592,13 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c e278abeb8c82fc84dac998f2f2cf16ef7740333cae9335ce270b9af75e0505a0 +F src/util.c 8d95c976b33953a039d4ebd543c7acc2c9fd03d1cecb3d41ba7fcc0f24fcbe2d F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c e6fb674eda4aa32c50d53eb09210c9ed802866cb4d1dc0d6187301b55e4a82b7 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c afe8d7858ad7a7cd67b16d0df396f5c672309722c7855d33cd10adb7ce076b4b +F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 5ecfa992b496c8e46227f1ff2ebae30c7b7a6bc098229c89a8ff49cf27249d69 F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f9e85e6c79162081f8f512d22951931a89d157a32b24afdc48b7eb865379abe7 -R a653c2e9383493624b2d8a6c82e92a37 +P c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2 +R f03dbc9beefc5d34628277d962365044 U drh -Z 02644c99894a777c23667de1b2c8f4f7 +Z 78c9dcb795a751d434058963c2b0384b diff --git a/manifest.uuid b/manifest.uuid index f9268007f6..65499fed89 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2 \ No newline at end of file +ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 24fabe6276..5422007958 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3802,8 +3802,12 @@ void sqlite3MutexWarnOnContention(sqlite3_mutex*); #endif #ifndef SQLITE_OMIT_FLOATING_POINT +# define EXP754 (((u64)0x7ff)<<52) +# define MAN754 ((((u64)1)<<52)-1) +# define IsNaN(X) (((X)&EXP754)==EXP754 && ((X)&MAN754)!=0) int sqlite3IsNaN(double); #else +# define IsNaN(X) 0 # define sqlite3IsNaN(X) 0 #endif diff --git a/src/util.c b/src/util.c index 938b6a9fb2..31c88046e9 100644 --- a/src/util.c +++ b/src/util.c @@ -58,47 +58,11 @@ int sqlite3FaultSim(int iTest){ #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Return true if the floating point value is Not a Number (NaN). -** -** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. -** Otherwise, we have our own implementation that works on most systems. */ int sqlite3IsNaN(double x){ - int rc; /* The value return */ -#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN - /* - ** Systems that support the isnan() library function should probably - ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have - ** found that many systems do not have a working isnan() function so - ** this implementation is provided as an alternative. - ** - ** This NaN test sometimes fails if compiled on GCC with -ffast-math. - ** On the other hand, the use of -ffast-math comes with the following - ** warning: - ** - ** This option [-ffast-math] should never be turned on by any - ** -O option since it can result in incorrect output for programs - ** which depend on an exact implementation of IEEE or ISO - ** rules/specifications for math functions. - ** - ** Under MSVC, this NaN test may fail if compiled with a floating- - ** point precision mode other than /fp:precise. From the MSDN - ** documentation: - ** - ** The compiler [with /fp:precise] will properly handle comparisons - ** involving NaN. For example, x != x evaluates to true if x is NaN - ** ... - */ -#ifdef __FAST_MATH__ -# error SQLite will not work correctly with the -ffast-math option of GCC. -#endif - volatile double y = x; - volatile double z = y; - rc = (y!=z); -#else /* if HAVE_ISNAN */ - rc = isnan(x); -#endif /* HAVE_ISNAN */ - testcase( rc ); - return rc; + u64 y; + memcpy(&y,&x,sizeof(y)); + return IsNaN(y); } #endif /* SQLITE_OMIT_FLOATING_POINT */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 98c50f362d..8dd2b421aa 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3652,7 +3652,7 @@ u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ ** routine so that in most cases the overhead of moving the stack pointer ** is avoided. */ -static u32 SQLITE_NOINLINE serialGet( +static u32 serialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ Mem *pMem /* Memory cell to write value into */ @@ -3684,7 +3684,7 @@ static u32 SQLITE_NOINLINE serialGet( assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); swapMixedEndianFloat(x); memcpy(&pMem->u.r, &x, sizeof(x)); - pMem->flags = sqlite3IsNaN(pMem->u.r) ? MEM_Null : MEM_Real; + pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; } return 8; } From 84422db987f3e26545760984ace02515eed1542c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 30 May 2019 13:47:10 +0000 Subject: [PATCH 42/96] Optimization to the round() SQL function for large input values without a fractional part. FossilOrigin-Name: e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/func.c | 8 ++++---- src/util.c | 2 ++ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index a2a87ce139..7955a86729 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Smaller\sand\sfaster\ssqlite3IsNaN()\simplementation\smakes\sdeserialization\sof\nfloating\spoint\svalues\smuch\sfaster. -D 2019-05-30T00:46:37.512 +C Optimization\sto\sthe\sround()\sSQL\sfunction\sfor\slarge\sinput\svalues\swithout\sa\nfractional\spart. +D 2019-05-30T13:47:10.747 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 -F src/func.c 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475 +F src/func.c ad7a7752872eb0bf148e0e56fc6a5e70de95bc6f589497fbe2fa81e2a514e807 F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -592,7 +592,7 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 8d95c976b33953a039d4ebd543c7acc2c9fd03d1cecb3d41ba7fcc0f24fcbe2d +F src/util.c bdbb67d3709a0a4b4ba30221e05e0fec184030982a8c94a175ce634ccf547501 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c e6fb674eda4aa32c50d53eb09210c9ed802866cb4d1dc0d6187301b55e4a82b7 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c1d8a3f65490eef2216f360d708b1746cbaa6dadce42c0950dc8e09b9ab28ee2 -R f03dbc9beefc5d34628277d962365044 +P ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 +R 7754d0bcda862a16960da7e5623f3f4e U drh -Z 78c9dcb795a751d434058963c2b0384b +Z 17021e3360c89f47e46d1424ad5de5c6 diff --git a/manifest.uuid b/manifest.uuid index 65499fed89..51d8ae8f05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 \ No newline at end of file +e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 313a14018b..80c595a559 100644 --- a/src/func.c +++ b/src/func.c @@ -387,10 +387,10 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** handle the rounding directly, ** otherwise use printf. */ - if( n==0 && r>=0 && r+4503599627370496.0 ){ + /* The value has no fractional part so there is nothing to round */ + }else if( n==0 ){ + r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); }else{ zBuf = sqlite3_mprintf("%.*f",n,r); if( zBuf==0 ){ diff --git a/src/util.c b/src/util.c index 31c88046e9..e67f22e771 100644 --- a/src/util.c +++ b/src/util.c @@ -404,6 +404,8 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ int i; incr = 2; assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + testcase( enc==SQLITE_UTF16LE ); + testcase( enc==SQLITE_UTF16BE ); for(i=3-enc; i Date: Mon, 3 Jun 2019 15:09:25 +0000 Subject: [PATCH 43/96] Fix harmless compiler warning in lemon. FossilOrigin-Name: 2da0eea02d128c37f2fbe764227ac526d3e993284516544adc0a216a035c5676 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lemon.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7955a86729..763a361e03 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Optimization\sto\sthe\sround()\sSQL\sfunction\sfor\slarge\sinput\svalues\swithout\sa\nfractional\spart. -D 2019-05-30T13:47:10.747 +C Fix\sharmless\scompiler\swarning\sin\slemon. +D 2019-06-03T15:09:25.986 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1748,7 +1748,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c dbcb617f0d815a60c2cb5fedc09ac575af0ba7026b48726c7f80a5a20a5ba345 +F tool/lemon.c cc43148d2793ab93668e74a6a6319bb71c2e65c1ffcd6deeaa59e12be9362a43 F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea748edecb261f2b862d542daff6e99a6fd8879a8ace94b440d99e110577d1c1 -R 7754d0bcda862a16960da7e5623f3f4e -U drh -Z 17021e3360c89f47e46d1424ad5de5c6 +P e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 +R 4e760c7015e96f21477efba0202b23a8 +U mistachkin +Z 1d06b8a525cc16af48fda6dc31562f9b diff --git a/manifest.uuid b/manifest.uuid index 51d8ae8f05..ad88aa13b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 \ No newline at end of file +2da0eea02d128c37f2fbe764227ac526d3e993284516544adc0a216a035c5676 \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index d92da870d2..4416f67bb2 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -48,6 +48,7 @@ extern int access(const char *path, int mode); #define MAXRHS 1000 #endif +extern void memory_error(); static int showPrecedenceConflict = 0; static char *msort(char*,char**,int(*)(const char*,const char*)); @@ -4919,7 +4920,6 @@ char *SetNew(void){ char *s; s = (char*)calloc( size, 1); if( s==0 ){ - extern void memory_error(); memory_error(); } return s; From 471e88f73255169ed00649f32ad92f4237044775 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 4 Jun 2019 13:11:37 +0000 Subject: [PATCH 44/96] Fix a segfault in fts3 that could occur when processing corrupt fts records. FossilOrigin-Name: dff24c6c7a4e7623984b5bb24c2ff14fe079dc49a0ad048cbfc66f84c08875b0 --- ext/fts3/fts3_write.c | 5 +- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 250 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 262 insertions(+), 11 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 9a223231ac..0004a47a0c 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -4554,7 +4554,10 @@ static int fts3TruncateNode( NodeReader reader; /* Reader object */ Blob prev = {0, 0, 0}; /* Previous term written to new node */ int rc = SQLITE_OK; /* Return code */ - int bLeaf = aNode[0]=='\0'; /* True for a leaf node */ + int bLeaf; /* True for a leaf node */ + + if( nNode<1 ) return FTS_CORRUPT_VTAB; + bLeaf = aNode[0]=='\0'; /* Allocate required output space */ blobGrowBuffer(pNew, nNode, &rc); diff --git a/manifest b/manifest index 763a361e03..7bc4946d46 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sin\slemon. -D 2019-06-03T15:09:25.986 +C Fix\sa\ssegfault\sin\sfts3\sthat\scould\soccur\swhen\sprocessing\scorrupt\sfts\srecords. +D 2019-06-04T13:11:37.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 35f13d6f50a44003135ddf169db43af0cd970f086bdc78b20256d83ff5add7d5 +F ext/fts3/fts3_write.c b4c2e8fc90df14b0cdb78be934269689abe29ee652fc672e342a82e8e632cea5 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -929,7 +929,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 26039980f3a4550f4c1437c8182204a93b81c568406eca104451f88eeb830633 +F test/fts3corrupt4.test c311911898e9ddac93fe71b947660a9716b285e2e600ad02810c231ff79a5925 F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e95138f5f4febde598f39e031d6e4f4d5ad0adbd8dcdd34fd0baaa78ab393417 -R 4e760c7015e96f21477efba0202b23a8 -U mistachkin -Z 1d06b8a525cc16af48fda6dc31562f9b +P 2da0eea02d128c37f2fbe764227ac526d3e993284516544adc0a216a035c5676 +R 45375553c6d7000e0bd0067325ffdf12 +U dan +Z 9e21e2ef69c84c18bb208938adf893d6 diff --git a/manifest.uuid b/manifest.uuid index ad88aa13b2..07630061b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2da0eea02d128c37f2fbe764227ac526d3e993284516544adc0a216a035c5676 \ No newline at end of file +dff24c6c7a4e7623984b5bb24c2ff14fe079dc49a0ad048cbfc66f84c08875b0 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index e60f564633..8c1a14a274 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -4845,6 +4845,254 @@ do_catchsql_test 27.5 { do_catchsql_test 27.6 { INSERT INTO t1(t1) SELECT x FROM t2; } {0 {}} - + +#------------------------------------------------------------------------- +reset_db +do_test 28.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-159ac1ca51ed55.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 10 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 64 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 dst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 4f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1Ocontentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 43 a5 52 20 50 52 39 4d cid INTEC.R PR9M +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 26 0b 48 00 00 00 00 00 00 00 00 00 ....&.H......... +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 55 42 4.0 20160609 DUB +| 2928: 55 47 20 45 4e 41 e4 7c 45 20 44 42 53 54 41 54 UG ENA.|E DBSTAT +| 2944: e4 46 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 .FTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 1f 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 AB.E GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 42 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 BTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4c 49 54 20 4c =50000000 OLIT L +| 3056: 4f 41 43 20 45 58 54 45 4e 53 49 4f 4e 21 54 48 OAC EXTENSION!TH +| 3072: 52 45 41 44 53 41 46 45 3d 2f 18 24 05 00 25 0f READSAFE=/.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 4b 75 3d 30 58 4d 4f 43 41 53 45 17 22 DSAKu=0XMOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 46 3d ..%..THREADSAFF= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 52 49 4f IT LOAD EXTENRIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 42 b8 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MB. MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 4a 4d 18 1b 05 00 25 00000XRTRJM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 0d a5 0f 19 45 4e 41 42 INARY.......ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 1c 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 14 05 01 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 12 42 4c 45 20 4a 53 4f 4e 31 58 42 ..EN.BLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 09 d9 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 3e 31 58 4e 4f 43 41 53 45 17 LE JSO>1XNOCASE. +| 3568: 13 05 00 25 0f 17 44 4e 40 42 4c 45 20 4a 53 4f ...%..DN@BLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 82 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 c9 29 e8 19 46 4e 41 42 4c NARY....)..FNABL +| 3632: 48 c0 47 45 4f 50 4f 4c 59 58 4e 74 43 41 53 45 H.GEOPOLYXNtCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 30 46 54 53 35 58 42 49 ..ENABLE0FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0e 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 04 ff 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 42 42 4c 45 20 44 42 53 ...1..ENBBLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 4a 4d 11 06 TAT VTABXRTRJM.. +| 3920: 05 f0 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 09 b0 17 0e 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 16 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 4d 67 ...C..COMPILERMg +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 06 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4b 45 52 3d 67 63 63 2d 35 2e 34 2e OMPIKER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 40 39 58 29 54 52 49 4d 0 201606@9X)TRIM +| page 4 offset 12288 +| 0: 0d 00 10 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 00 00 00 00 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 4d 07 30 30 30 30 30 30 30 03 25 1a .%..M.0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 10 ff ff f5 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 71 78 03 25 18 00 01 05 65 6e 6f 72 79 ..mqx.%....enory +| 3184: 03 25 19 00 03 04 ce 79 73 4d 03 25 15 00 00 04 .%.....ysM.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 7f 08 72 65 61 64 73 61 66 65 03 %......readsafe. +| 3232: 25 0e 00 00 04 76 75 61 62 03 25 0b 00 86 50 01 %....vuab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 09 ................ +| 3280: 51 03 00 00 09 32 30 31 36 30 36 30 39 09 01 07 Q....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 03 ff 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 02 f1 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 67 ler............g +| 3440: d2 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 .stat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 6f 82 6c 65 3f 07 02 00 01 02 00 01 02 .eno.le?........ +| 3488: b0 01 02 00 00 f2 00 11 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 a6 00 01 02 00 01 ................ +| 3520: 02 05 51 02 00 01 02 00 01 02 00 01 02 00 01 02 ..Q............. +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 00 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 73 6c 79 09 .........eopsly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 12 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 0f 71 02 02 00 03 01 02 02 00 03 6f 02 02 00 00 .q.........o.... +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 07 30 01 01 01 02 00 01 01 ........0....... +| 3968: 01 02 00 11 01 01 02 00 01 01 01 02 00 11 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 01 ff 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0e f4 0f e9 10 d6 0f c7 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =1.............. +| end crash-159ac1ca51ed55.db +}]} {} + +do_catchsql_test 28.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT 3+x FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; +} {0 {}} + +do_catchsql_test 28.1 { + UPDATE t1 SET b=quote((true) ) WHERE t1 MATCH 'h'; +} {0 {}} + +do_catchsql_test 28.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT 3+x FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; +} {0 {}} + +do_catchsql_test 28.1 { + WITH c(x) AS (VALUES(1) UNION ALL SELECT 3< Date: Tue, 4 Jun 2019 15:47:37 +0000 Subject: [PATCH 45/96] New dbsqlfuzz test cases add to test/fuzzdata8.db. FossilOrigin-Name: 873aa46da3d0f97784cad94828fc367bb2ceb13d5ece2e105320f404b3971c85 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1210368 -> 1230848 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7bc4946d46..b8603b9fe3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sin\sfts3\sthat\scould\soccur\swhen\sprocessing\scorrupt\sfts\srecords. -D 2019-06-04T13:11:37.928 +C New\sdbsqlfuzz\stest\scases\sadd\sto\stest/fuzzdata8.db. +D 2019-06-04T15:47:37.663 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1005,7 +1005,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db e7f7ac454c41df87408e591584e3980cd88f85bb2a8311075e93853d1b7e5b71 +F test/fuzzdata8.db 2f2ebc7632affed8f0bb6c52447db5a73eb37f41afa4d745f7ac9013722feead F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2da0eea02d128c37f2fbe764227ac526d3e993284516544adc0a216a035c5676 -R 45375553c6d7000e0bd0067325ffdf12 -U dan -Z 9e21e2ef69c84c18bb208938adf893d6 +P dff24c6c7a4e7623984b5bb24c2ff14fe079dc49a0ad048cbfc66f84c08875b0 +R 29942a5dadbf0c4873d5ec24774b4fae +U drh +Z a081c7a3023a2e7ea5f5e1dbd6001878 diff --git a/manifest.uuid b/manifest.uuid index 07630061b7..1fe6465f27 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dff24c6c7a4e7623984b5bb24c2ff14fe079dc49a0ad048cbfc66f84c08875b0 \ No newline at end of file +873aa46da3d0f97784cad94828fc367bb2ceb13d5ece2e105320f404b3971c85 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index b64dbf26593db3ce2b0f7bcb599517bb6bd09fbf..3d23ff335473cfefc161c3b63692dd1344f07e5d 100644 GIT binary patch delta 21344 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 From f9c7c4b1f25fa5692d2a5154ed3f148021189c1f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 4 Jun 2019 18:21:59 +0000 Subject: [PATCH 46/96] In the CLI, add a small delay (0.1 seconds) after launching the output command for ".once" before deleting the temporary file. FossilOrigin-Name: 4979f138e8c8bef7dd6b5921fb9ca9fea86bbf7ec1419934bb2d1a0d74e77183 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b8603b9fe3..fa184d2afb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sdbsqlfuzz\stest\scases\sadd\sto\stest/fuzzdata8.db. -D 2019-06-04T15:47:37.663 +C In\sthe\sCLI,\sadd\sa\ssmall\sdelay\s(0.1\sseconds)\safter\slaunching\sthe\soutput\ncommand\sfor\s".once"\sbefore\sdeleting\sthe\stemporary\sfile. +D 2019-06-04T18:21:59.709 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3 +F src/shell.c.in 6a58aac018b61c6fc3184f431d3955b4738154b57a73e29a10b38a7cdec008ac F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1829,7 +1829,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dff24c6c7a4e7623984b5bb24c2ff14fe079dc49a0ad048cbfc66f84c08875b0 -R 29942a5dadbf0c4873d5ec24774b4fae +P 873aa46da3d0f97784cad94828fc367bb2ceb13d5ece2e105320f404b3971c85 +R 48f77e7ac5a86de88749e11daaba1779 U drh -Z a081c7a3023a2e7ea5f5e1dbd6001878 +Z 6e0dab7a2dd76f073fda77de4a7b24be diff --git a/manifest.uuid b/manifest.uuid index 1fe6465f27..dcc0231352 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -873aa46da3d0f97784cad94828fc367bb2ceb13d5ece2e105320f404b3971c85 \ No newline at end of file +4979f138e8c8bef7dd6b5921fb9ca9fea86bbf7ec1419934bb2d1a0d74e77183 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f9f82b01ca..cadf8933dd 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4849,6 +4849,7 @@ static void output_reset(ShellState *p){ sqlite3_free(zCmd); outputModePop(p); p->doXdgOpen = 0; + sqlite3_sleep(100); } #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ } From 48646e497bbd423a4e207ee578ce86044d2237df Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 5 Jun 2019 13:14:19 +0000 Subject: [PATCH 47/96] Add a test case for the unix SQLITE_FCNTL_CHUNK_SIZE file-control. FossilOrigin-Name: 3a477fd0c944440be03d23c667053b346c769c6a4f6ba1ef094b7581a08d7bd4 --- manifest | 13 +++++++------ manifest.uuid | 2 +- test/chunksize.test | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 test/chunksize.test diff --git a/manifest b/manifest index fa184d2afb..cf34fc0bfa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sCLI,\sadd\sa\ssmall\sdelay\s(0.1\sseconds)\safter\slaunching\sthe\soutput\ncommand\sfor\s".once"\sbefore\sdeleting\sthe\stemporary\sfile. -D 2019-06-04T18:21:59.709 +C Add\sa\stest\scase\sfor\sthe\sunix\sSQLITE_FCNTL_CHUNK_SIZE\sfile-control. +D 2019-06-05T13:14:19.264 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -726,6 +726,7 @@ F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 5ceb920718d280b61163500a7d29e0e0a86458b1cbd92d96f962c9d970aa3857 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e +F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8 F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 @@ -1829,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 873aa46da3d0f97784cad94828fc367bb2ceb13d5ece2e105320f404b3971c85 -R 48f77e7ac5a86de88749e11daaba1779 -U drh -Z 6e0dab7a2dd76f073fda77de4a7b24be +P 4979f138e8c8bef7dd6b5921fb9ca9fea86bbf7ec1419934bb2d1a0d74e77183 +R 522b3167ef6a36c1a53d7505a94718e4 +U dan +Z 3782252d7bfa19845f7bea0ebc102852 diff --git a/manifest.uuid b/manifest.uuid index dcc0231352..5385ddac9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4979f138e8c8bef7dd6b5921fb9ca9fea86bbf7ec1419934bb2d1a0d74e77183 \ No newline at end of file +3a477fd0c944440be03d23c667053b346c769c6a4f6ba1ef094b7581a08d7bd4 \ No newline at end of file diff --git a/test/chunksize.test b/test/chunksize.test new file mode 100644 index 0000000000..47d118d841 --- /dev/null +++ b/test/chunksize.test @@ -0,0 +1,41 @@ +# 2019 June 5 +# +# 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 chunksize + +if {$::tcl_platform(platform)!="unix"} { + finish_test + return +} + +foreach {tn jrnlmode} { + 1 delete + 2 wal +} { + reset_db + file_control_chunksize_test db main 32768 + do_execsql_test $tn.0 " PRAGMA journal_mode = $jrnlmode " $jrnlmode + do_execsql_test $tn.1 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + } + + execsql { PRAGMA wal_checkpoint } + + do_test $tn.2 { + file size test.db + } 32768 +} + +finish_test From d985f7260b2f7b8a4977f1af330f49c110aa3f43 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 5 Jun 2019 14:29:53 +0000 Subject: [PATCH 48/96] CLI enhancements: Add the ".filectrl" command. Make the ".testctrl" command visible to ".help". FossilOrigin-Name: 7b3a99fce8b4a757f2b2ef2f0b02d68566f2528d9ae1e30628522717f872466c --- manifest | 14 +++--- manifest.uuid | 2 +- src/shell.c.in | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cf34fc0bfa..ba290ee02c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stest\scase\sfor\sthe\sunix\sSQLITE_FCNTL_CHUNK_SIZE\sfile-control. -D 2019-06-05T13:14:19.264 +C CLI\senhancements:\s\sAdd\sthe\s".filectrl"\scommand.\s\sMake\sthe\s".testctrl"\scommand\nvisible\sto\s".help". +D 2019-06-05T14:29:53.728 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in 6a58aac018b61c6fc3184f431d3955b4738154b57a73e29a10b38a7cdec008ac +F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a8 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4979f138e8c8bef7dd6b5921fb9ca9fea86bbf7ec1419934bb2d1a0d74e77183 -R 522b3167ef6a36c1a53d7505a94718e4 -U dan -Z 3782252d7bfa19845f7bea0ebc102852 +P 3a477fd0c944440be03d23c667053b346c769c6a4f6ba1ef094b7581a08d7bd4 +R 177641f432f1c6b30cb4289f1dc2ad01 +U drh +Z d627a69eae92e533d7c2a62b56c5ad5b diff --git a/manifest.uuid b/manifest.uuid index 5385ddac9c..10abff898b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3a477fd0c944440be03d23c667053b346c769c6a4f6ba1ef094b7581a08d7bd4 \ No newline at end of file +7b3a99fce8b4a757f2b2ef2f0b02d68566f2528d9ae1e30628522717f872466c \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index cadf8933dd..ada2900ddc 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3510,6 +3510,8 @@ static const char *(azHelp[]) = { /* Because explain mode comes on automatically now, the ".explain" mode ** is removed from the help screen. It is still supported for legacy, however */ /*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic",*/ + ".filectrl CMD ... Run various sqlite3_file_control() operations", + " Run \".filectrl\" with no arguments for details", ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", ".headers on|off Turn display of headers on or off", ".help ?-all? ?PATTERN? Show help text for PATTERN", @@ -3627,6 +3629,8 @@ static const char *(azHelp[]) = { #endif ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", ".testcase NAME Begin redirecting output to 'testcase-out.txt'", + ".testctrl CMD ... Run various sqlite3_test_control() operations", + " Run \".testctrl\" with no arguments for details", ".timeout MS Try opening locked tables for MS milliseconds", ".timer on|off Turn SQL timer on or off", #ifndef SQLITE_OMIT_TRACE @@ -7277,6 +7281,125 @@ static int do_meta_command(char *zLine, ShellState *p){ }else #endif + if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ + static const struct { + const char *zCtrlName; /* Name of a test-control option */ + int ctrlCode; /* Integer code for that option */ + const char *zUsage; /* Usage notes */ + } aCtrl[] = { + { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, + { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, + /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ + { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, + { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, + /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ + { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, + { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, + { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, + }; + int filectrl = -1; + int iCtrl = -1; + sqlite3_int64 iRes; /* Integer result to display if rc2==1 */ + int isOk = 0; /* 0: usage 1: %lld 2: no-result */ + int n2, i; + const char *zCmd = 0; + + open_db(p, 0); + zCmd = nArg>=2 ? azArg[1] : "help"; + + /* The argument can optionally begin with "-" or "--" */ + if( zCmd[0]=='-' && zCmd[1] ){ + zCmd++; + if( zCmd[0]=='-' && zCmd[1] ) zCmd++; + } + + /* --help lists all file-controls */ + if( strcmp(zCmd,"help")==0 ){ + utf8_printf(p->out, "Available file-controls:\n"); + for(i=0; iout, " .filectrl %s %s\n", + aCtrl[i].zCtrlName, aCtrl[i].zUsage); + } + rc = 1; + goto meta_command_exit; + } + + /* convert filectrl text option to value. allow any unique prefix + ** of the option name, or a numerical value. */ + n2 = strlen30(zCmd); + for(i=0; idb, 0, SQLITE_FCNTL_SIZE_LIMIT, &iRes); + isOk = 1; + break; + } + case SQLITE_FCNTL_LOCK_TIMEOUT: + case SQLITE_FCNTL_CHUNK_SIZE: { + int x; + if( nArg!=3 ) break; + x = (int)integerValue(azArg[2]); + sqlite3_file_control(p->db, 0, filectrl, &x); + isOk = 2; + break; + } + case SQLITE_FCNTL_PERSIST_WAL: + case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { + int x; + if( nArg!=2 && nArg!=3 ) break; + x = nArg==3 ? booleanValue(azArg[2]) : -1; + sqlite3_file_control(p->db, 0, filectrl, &x); + iRes = x; + isOk = 1; + break; + } + case SQLITE_FCNTL_HAS_MOVED: { + int x; + if( nArg!=2 ) break; + sqlite3_file_control(p->db, 0, filectrl, &x); + iRes = x; + isOk = 1; + break; + } + case SQLITE_FCNTL_TEMPFILENAME: { + char *z = 0; + if( nArg!=2 ) break; + sqlite3_file_control(p->db, 0, filectrl, &z); + if( z ){ + utf8_printf(p->out, "%s\n", z); + sqlite3_free(z); + } + isOk = 2; + break; + } + } + } + if( isOk==0 && iCtrl>=0 ){ + utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); + rc = 1; + }else if( isOk==1 ){ + raw_printf(p->out, "%lld\n", iRes); + } + }else + if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ ShellState data; char *zErrMsg = 0; From 9cc867d09c4da853fc22778a8b70ce1be21c6975 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 7 Jun 2019 18:53:51 +0000 Subject: [PATCH 49/96] Upgrade the config.guess script to the latest version. FossilOrigin-Name: be8438133f6cd87e5d51f15cfd1eed83176b3239334875eb0c3dec502cfe39d3 --- config.guess | 1340 +++++++++++++++++++++++++++---------------------- manifest | 14 +- manifest.uuid | 2 +- 3 files changed, 740 insertions(+), 616 deletions(-) diff --git a/config.guess b/config.guess index 34093cc6bb..ae713942d8 100644 --- a/config.guess +++ b/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# Copyright 1992-2019 Free Software Foundation, Inc. -timestamp='2007-07-22' +timestamp='2019-05-28' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,26 +15,22 @@ timestamp='2007-07-22' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + me=`echo "$0" | sed -e 's,.*/,,'` @@ -45,7 +39,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -56,8 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright 1992-2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -91,8 +84,6 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 - # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -103,34 +94,38 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi @@ -139,29 +134,40 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -if [ "${UNAME_SYSTEM}" = "Linux" ] ; then - eval $set_cc_for_build - cat << EOF > $dummy.c +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" #include - #ifdef __UCLIBC__ - # ifdef __UCLIBC_CONFIG_VERSION__ - LIBC=uclibc __UCLIBC_CONFIG_VERSION__ - # else + #if defined(__UCLIBC__) LIBC=uclibc - # endif + #elif defined(__dietlibc__) + LIBC=dietlibc #else LIBC=gnu #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` -fi + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward @@ -171,23 +177,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null + | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? @@ -197,7 +213,14 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in fi ;; *) - os=netbsd + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release @@ -205,42 +228,62 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on @@ -250,60 +293,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos + echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos + echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition @@ -312,12 +349,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo s390-ibm-zvmoe exit ;; *:OS400:*:*) - echo powerpc-ibm-os400 + echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} + echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -341,20 +378,39 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in @@ -363,25 +419,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} + echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not @@ -392,44 +448,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} + echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} + echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} + echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} + echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} + echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -438,23 +494,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} + echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax @@ -478,21 +534,21 @@ EOF echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] then - echo m88k-dg-dgux${UNAME_RELEASE} + echo m88k-dg-dgux"$UNAME_RELEASE" else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else - echo i586-dg-dgux${UNAME_RELEASE} + echo i586-dg-dgux"$UNAME_RELEASE" fi - exit ;; + exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; @@ -507,7 +563,7 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id @@ -519,14 +575,14 @@ EOF if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -537,7 +593,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else @@ -549,28 +605,29 @@ EOF echo rs6000-ibm-aix3.2 fi exit ;; - *:AIX:*:[45]) + *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx @@ -585,67 +642,67 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" - #define _HPUX_SOURCE - #include - #include + #define _HPUX_SOURCE + #include + #include - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ "$HP_ARCH" = hppa2.0w ] then - eval $set_cc_for_build + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -656,23 +713,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -697,11 +754,11 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -710,7 +767,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -718,9 +775,9 @@ EOF exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + echo "$UNAME_MACHINE"-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) @@ -728,205 +785,137 @@ EOF exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit ;; + exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit ;; + exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit ;; + exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit ;; + exit ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} + echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi exit ;; *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 + echo "$UNAME_MACHINE"-pc-mingw32 exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 + echo "$UNAME_MACHINE"-pc-pw32 exit ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in + *:Interix*:*) + case "$UNAME_MACHINE" in x86) - echo i586-pc-interix${UNAME_RELEASE} + echo i586-pc-interix"$UNAME_RELEASE" exit ;; - EM64T | authenticamd) - echo x86_64-unknown-interix${UNAME_RELEASE} + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin + echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin + echo x86_64-pc-cygwin exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix exit ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -937,108 +926,172 @@ EOF EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-${LIBC} + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; - xtensa:Linux:*:*) - echo xtensa-unknown-linux-${LIBC} + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" - exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" - exit ;; - esac - # This should get integrated into the C code below, but now we hack - if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both @@ -1046,54 +1099,54 @@ EOF echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx + echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop + echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos + echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable + echo "$UNAME_MACHINE"-pc-syllable exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp + echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. + # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1103,17 +1156,20 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv32 + echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit ;; + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; @@ -1122,9 +1178,9 @@ EOF exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) @@ -1144,29 +1200,39 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} + echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} + echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} + echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} + echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 @@ -1177,15 +1243,15 @@ EOF *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm @@ -1197,25 +1263,25 @@ EOF exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos + echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} + echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + echo mips-nec-sysv"$UNAME_RELEASE" else - echo mips-unknown-sysv${UNAME_RELEASE} + echo mips-unknown-sysv"$UNAME_RELEASE" fi - exit ;; + exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; @@ -1225,53 +1291,101 @@ EOF BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} + echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} + echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} + echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} + echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} + echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} + echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux @@ -1280,18 +1394,19 @@ EOF echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + # shellcheck disable=SC2154 + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi - echo ${UNAME_MACHINE}-unknown-plan9 + echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 @@ -1312,14 +1427,14 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} + echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; @@ -1328,21 +1443,39 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < "$dummy.c" < -# include +#include +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif #endif main () { @@ -1355,22 +1488,14 @@ main () #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" + "" #endif - ); exit (0); + ); exit (0); #endif #endif -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" @@ -1410,39 +1535,54 @@ main () #endif #if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); + struct utsname un; + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif #endif #if defined (alliant) && defined (i860) @@ -1453,54 +1593,38 @@ main () } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +echo "$0: unable to guess system type" >&2 -# Convex versions that predate uname can use getsysinfo(1) +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp @@ -1519,16 +1643,16 @@ hostinfo = `(hostinfo) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/manifest b/manifest index ba290ee02c..69455efd07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C CLI\senhancements:\s\sAdd\sthe\s".filectrl"\scommand.\s\sMake\sthe\s".testctrl"\scommand\nvisible\sto\s".help". -D 2019-06-05T14:29:53.728 +C Upgrade\sthe\sconfig.guess\sscript\sto\sthe\slatest\sversion. +D 2019-06-07T18:53:51.086 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -31,7 +31,7 @@ F autoconf/tea/tclconfig/tcl.m4 66ddf0a5d5e4b1d29bff472c0985fd7fa89d0fb5 F autoconf/tea/win/makefile.vc f89d0184d0eee5f7e356ea407964dcd139939928 F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 -F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 +F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 F configure 4a97fb6ccce582ebb3dc5a7e281e5e2823574dad851b8ccf814aa6de9f4c7ad2 x @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3a477fd0c944440be03d23c667053b346c769c6a4f6ba1ef094b7581a08d7bd4 -R 177641f432f1c6b30cb4289f1dc2ad01 -U drh -Z d627a69eae92e533d7c2a62b56c5ad5b +P 7b3a99fce8b4a757f2b2ef2f0b02d68566f2528d9ae1e30628522717f872466c +R d942243a0ac8489c407d7afb0b926ed4 +U dan +Z 7a960d6982fc25800640fc7f687e4c6e diff --git a/manifest.uuid b/manifest.uuid index 10abff898b..6b611d928e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b3a99fce8b4a757f2b2ef2f0b02d68566f2528d9ae1e30628522717f872466c \ No newline at end of file +be8438133f6cd87e5d51f15cfd1eed83176b3239334875eb0c3dec502cfe39d3 \ No newline at end of file From 4eefeb5577a8bd3823c4b5dfc3152c824548574d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 7 Jun 2019 18:56:03 +0000 Subject: [PATCH 50/96] Also upgrade script config.sub to the latest version. This should have been part of the previous commit. FossilOrigin-Name: efbf31b82e6e16fda88d8cea54202a8593ff52f2267a44dba828704818162e66 --- config.sub | 2680 ++++++++++++++++++++++++++----------------------- manifest | 12 +- manifest.uuid | 2 +- 3 files changed, 1424 insertions(+), 1270 deletions(-) diff --git a/config.sub b/config.sub index 63cdd0a35d..5b158ac41c 100644 --- a/config.sub +++ b/config.sub @@ -1,44 +1,40 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# Copyright 1992-2019 Free Software Foundation, Inc. -timestamp='2007-06-28' +timestamp='2019-05-23' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. @@ -57,12 +53,11 @@ timestamp='2007-06-28' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -72,8 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright 1992-2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -95,12 +89,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -116,1079 +110,1167 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac ;; - -scout) + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx | dvp \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none + op50n) + cpu=hppa1.1 + vendor=oki ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + op60c) + cpu=hppa1.1 + vendor=oki ;; - ms1) - basic_machine=mt-unknown + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsEE* | ee | ps2) - basic_machine=mips64r5900el-scei - case $os in - -linux*) - ;; - *) - os=-elf - ;; - esac - ;; - iop) - basic_machine=mipsel-scei - os=-irx - ;; - dvp) - basic_machine=dvp-scei - os=-elf - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 + cpu=$basic_machine + vendor=pc ;; + # These rules are duplicated from below for sake of the special case above; + # i.e. things that normalized to x86 arches should also default to "pc" pc98) - basic_machine=i386-pc + cpu=i386 + vendor=pc ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + x64 | amd64) + cpu=x86_64 + vendor=pc ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc + # Recognize the basic CPU types without company name. + *) + cpu=$basic_machine + vendor=unknown ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc +esac + +unset -v basic_machine + +# Decode basic machines in the full and proper CPU-Company form. +case $cpu-$vendor in + # Here we handle the default manufacturer of certain CPU types in canonical form. It is in + # some cases the only manufacturer, in others, it is the most popular. + craynv-unknown) + vendor=cray + os=${os:-unicosmp} ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc + c90-unknown | c90-cray) + vendor=cray + os=${os:-unicos} ;; - pentium4) - basic_machine=i786-pc + fx80-unknown) + vendor=alliant ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + romp-unknown) + vendor=ibm ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + mmix-unknown) + vendor=knuth ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + microblaze-unknown | microblazeel-unknown) + vendor=xilinx ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + rs6000-unknown) + vendor=ibm ;; - pn) - basic_machine=pn-gould + vax-unknown) + vendor=dec ;; - power) basic_machine=power-ibm + pdp11-unknown) + vendor=dec ;; - ppc) basic_machine=powerpc-unknown + we32k-unknown) + vendor=att ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + cydra-unknown) + vendor=cydrome ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown + i370-ibm*) + vendor=ibm ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + orion-unknown) + vendor=highlevel ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none + xps-unknown | xps100-unknown) + cpu=xps100 + vendor=honeywell ;; -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond + # Here we normalize CPU types with a missing or matching vendor + dpx20-unknown | dpx20-bull) + cpu=rs6000 + vendor=bull + os=${os:-bosx} ;; - op50n) - basic_machine=hppa1.1-oki + + # Here we normalize CPU types irrespective of the vendor + amd64-*) + cpu=x86_64 ;; - op60c) - basic_machine=hppa1.1-oki + blackfin-*) + cpu=bfin + os=linux ;; - romp) - basic_machine=romp-ibm + c54x-*) + cpu=tic54x ;; - mmix) - basic_machine=mmix-knuth + c55x-*) + cpu=tic55x ;; - rs6000) - basic_machine=rs6000-ibm + c6x-*) + cpu=tic6x ;; - vax) - basic_machine=vax-dec + e500v[12]-*) + cpu=powerpc + os=$os"spe" ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown + mips3*-*) + cpu=mips64 ;; - pdp11) - basic_machine=pdp11-dec + ms1-*) + cpu=mt ;; - we32k) - basic_machine=we32k-att + m68knommu-*) + cpu=m68k + os=linux ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown + m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) + cpu=s12z ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun + openrisc-*) + cpu=or32 ;; - cydra) - basic_machine=cydra-cydrome + parisc-*) + cpu=hppa + os=linux ;; - orion) - basic_machine=orion-highlevel + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + cpu=i586 ;; - orion105) - basic_machine=clipper-highlevel + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + cpu=i686 ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + cpu=i686 ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple + pentium4-*) + cpu=i786 ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. + pc98-*) + cpu=i386 ;; + ppc-* | ppcbe-*) + cpu=powerpc + ;; + ppcle-* | powerpclittle-*) + cpu=powerpcle + ;; + ppc64-*) + cpu=powerpc64 + ;; + ppc64le-* | powerpc64little-*) + cpu=powerpc64le + ;; + sb1-*) + cpu=mipsisa64sb1 + ;; + sb1el-*) + cpu=mipsisa64sb1el + ;; + sh5e[lb]-*) + cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` + ;; + spur-*) + cpu=spur + ;; + strongarm-* | thumb-*) + cpu=arm + ;; + tx39-*) + cpu=mipstx39 + ;; + tx39el-*) + cpu=mipstx39el + ;; + x64-*) + cpu=x86_64 + ;; + xscale-* | xscalee[bl]-*) + cpu=`echo "$cpu" | sed 's/^xscale/arm/'` + ;; + + # Recognize the canonical CPU Types that limit and/or modify the + # company names they are paired with. + cr16-*) + os=${os:-elf} + ;; + crisv32-* | etraxfs*-*) + cpu=crisv32 + vendor=axis + ;; + cris-* | etrax*-*) + cpu=cris + vendor=axis + ;; + crx-*) + os=${os:-elf} + ;; + neo-tandem) + cpu=neo + vendor=tandem + ;; + nse-tandem) + cpu=nse + vendor=tandem + ;; + nsr-tandem) + cpu=nsr + vendor=tandem + ;; + nsv-tandem) + cpu=nsv + vendor=tandem + ;; + nsx-tandem) + cpu=nsx + vendor=tandem + ;; + s390-*) + cpu=s390 + vendor=ibm + ;; + s390x-*) + cpu=s390x + vendor=ibm + ;; + tile*-*) + os=${os:-linux-gnu} + ;; + *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv64 \ + | rl78 | romp | rs6000 | rx \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1196,190 +1278,246 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if [ x$os != x ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; - -solaris) - os=-solaris2 + solaris) + os=solaris2 ;; - -svr4*) - os=-sysv4 + unixware*) + os=sysv4.2uw ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) + gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # First accept the basic system types. + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi*) # Remember, each alternative MUST END IN *, to match a version number. ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) + qnx*) + case $cpu in + x86 | i*86) ;; *) - os=-nto$os + os=nto-$os ;; esac ;; - -nto-qnx*) + hiux*) + os=hiuxwe2 ;; - -nto*) + nto-qnx*) + ;; + nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` + linux-dietlibc) + os=linux-dietlibc ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) + linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` + lynx*178) + os=lynxos178 ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` + lynx*5) + os=lynxos5 ;; - -opened*) - os=-openedition + lynx*) + os=lynxos ;; - -os400*) - os=-os400 + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` ;; - -wince*) - os=-wince + opened*) + os=openedition ;; - -osfrose*) - os=-osfrose + os400*) + os=os400 ;; - -osf*) - os=-osf + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; - -utek*) - os=-bsd + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; - -dynix*) - os=-bsd + wince*) + os=wince ;; - -acis*) - os=-aos + utek*) + os=bsd ;; - -atheos*) - os=-atheos + dynix*) + os=bsd ;; - -syllable*) - os=-syllable + acis*) + os=aos ;; - -386bsd) - os=-bsd + atheos*) + os=atheos ;; - -ctix* | -uts*) - os=-sysv + syllable*) + os=syllable ;; - -nova*) - os=-rtmk-nova + 386bsd) + os=bsd ;; - -ns2 ) - os=-nextstep2 + ctix* | uts*) + os=sysv ;; - -nsk*) - os=-nsk + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + nsk*) + os=nsk ;; # Preserve the version number of sinix5. - -sinix5.*) + sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; - -sinix*) - os=-sysv4 + sinix*) + os=sysv4 ;; - -tpf*) - os=-tpf + tpf*) + os=tpf ;; - -triton*) - os=-sysv3 + triton*) + os=sysv3 ;; - -oss*) - os=-sysv3 + oss*) + os=sysv3 ;; - -svr4) - os=-sysv4 + svr4*) + os=sysv4 ;; - -svr3) - os=-sysv3 + svr3) + os=sysv3 ;; - -sysvr4) - os=-sysv4 + sysvr4) + os=sysv4 ;; - # This must come after -sysvr4. - -sysv*) + # This must come after sysvr4. + sysv*) ;; - -ose*) - os=-ose + ose*) + os=ose ;; - -es1800*) - os=-ose + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint ;; - -xenix) - os=-xenix + zvmoe) + os=zvmoe ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint + dicos*) + os=dicos ;; - -aros*) - os=-aros + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac ;; - -kaos*) - os=-kaos + nacl*) ;; - -zvmoe) - os=-zvmoe + ios) ;; - -none) + none) + ;; + *-eabi) ;; *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac @@ -1395,249 +1533,265 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in - score-*) - os=-elf +case $cpu-$vendor in + score-*) + os=elf ;; - spu-*) - os=-elf + spu-*) + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + os=linux ;; arm*-semi) - os=-aout + os=aout ;; - c4x-* | tic4x-*) - os=-coff + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; - mep-*) - os=-elf + mep-*) + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 + ;; + pru-*) + os=elf ;; *-be) - os=-beos - ;; - *-haiku) - os=-haiku + os=beos ;; *-ibm) - os=-aix + os=aix ;; - *-knuth) - os=-mmixware + *-knuth) + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs + os=luna ;; *-next) - os=-nextstep3 + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) +case $vendor in + unknown) case $os in - -riscix*) + riscix*) vendor=acorn ;; - -sunos*) + sunos*) vendor=sun ;; - -aix*) + cnk*|-aix*) vendor=ibm ;; - -beos*) + beos*) vendor=be ;; - -hpux*) + hpux*) vendor=hp ;; - -mpeix*) + mpeix*) vendor=hp ;; - -hiux*) + hiux*) vendor=hitachi ;; - -unos*) + unos*) vendor=crds ;; - -dgux*) + dgux*) vendor=dg ;; - -luna*) + luna*) vendor=omron ;; - -genix*) + genix*) vendor=ns ;; - -mvs* | -opened*) + clix*) + vendor=intergraph + ;; + mvs* | opened*) vendor=ibm ;; - -os400*) + os400*) vendor=ibm ;; - -ptx*) + ptx*) vendor=sequent ;; - -tpf*) + tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + vxsim* | vxworks* | windiss*) vendor=wrs ;; - -aux*) + aux*) vendor=apple ;; - -hms*) + hms*) vendor=hitachi ;; - -mpw* | -macos*) + mpw* | macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) vendor=atari ;; - -vos*) + vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor-$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/manifest b/manifest index 69455efd07..40819ec71f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Upgrade\sthe\sconfig.guess\sscript\sto\sthe\slatest\sversion. -D 2019-06-07T18:53:51.086 +C Also\supgrade\sscript\sconfig.sub\sto\sthe\slatest\sversion.\sThis\sshould\shave\sbeen\spart\sof\sthe\sprevious\scommit. +D 2019-06-07T18:56:03.782 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -33,7 +33,7 @@ F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc -F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 +F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 F configure 4a97fb6ccce582ebb3dc5a7e281e5e2823574dad851b8ccf814aa6de9f4c7ad2 x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b3a99fce8b4a757f2b2ef2f0b02d68566f2528d9ae1e30628522717f872466c -R d942243a0ac8489c407d7afb0b926ed4 +P be8438133f6cd87e5d51f15cfd1eed83176b3239334875eb0c3dec502cfe39d3 +R 00ceb0bb88b1df0dc7ae96766c6b0ad8 U dan -Z 7a960d6982fc25800640fc7f687e4c6e +Z 21b18707f1c3d774dec053a2348d0058 diff --git a/manifest.uuid b/manifest.uuid index 6b611d928e..662786c7de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be8438133f6cd87e5d51f15cfd1eed83176b3239334875eb0c3dec502cfe39d3 \ No newline at end of file +efbf31b82e6e16fda88d8cea54202a8593ff52f2267a44dba828704818162e66 \ No newline at end of file From 9a2782293c37d360382296558c358d60929d0744 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 7 Jun 2019 22:26:08 +0000 Subject: [PATCH 51/96] When casting string values into numeric and the string has a prefix that looks like a number but total string is not a well-formed number, then take extra care that the result is either integer or real depending on what the prefix looks like. Fix for tickets [e8bedb2a184001] and [4c2d7639f076aa]. FossilOrigin-Name: 67a68af5578f08d2be2e48cf4fd12a6cf35a09c47d259deda81950f7ee1f02f7 --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/date.c | 6 +++--- src/func.c | 2 +- src/util.c | 19 ++++++++++++++----- src/vdbe.c | 24 +++++++++++++----------- src/vdbemem.c | 18 ++++++++++-------- test/cast.test | 27 +++++++++++++++++++++++++++ test/e_expr.test | 12 ++++++------ test/tkt-a8a0d2996a.test | 8 ++++---- 10 files changed, 93 insertions(+), 53 deletions(-) diff --git a/manifest b/manifest index 40819ec71f..43b03d9330 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\supgrade\sscript\sconfig.sub\sto\sthe\slatest\sversion.\sThis\sshould\shave\sbeen\spart\sof\sthe\sprevious\scommit. -D 2019-06-07T18:56:03.782 +C When\scasting\sstring\svalues\sinto\snumeric\sand\sthe\sstring\shas\sa\sprefix\sthat\slooks\nlike\sa\snumber\sbut\stotal\sstring\sis\snot\sa\swell-formed\snumber,\sthen\stake\sextra\ncare\sthat\sthe\sresult\sis\seither\sinteger\sor\sreal\sdepending\son\swhat\sthe\sprefix\nlooks\slike.\s\sFix\sfor\stickets\s[e8bedb2a184001]\sand\s[4c2d7639f076aa]. +D 2019-06-07T22:26:08.019 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,14 +470,14 @@ F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b -F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 +F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 -F src/func.c ad7a7752872eb0bf148e0e56fc6a5e70de95bc6f589497fbe2fa81e2a514e807 +F src/func.c f1ee70d50c75a00620f0b1721438de56fa12b7798b38fb469896582f599fe3c0 F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -592,15 +592,15 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c bdbb67d3709a0a4b4ba30221e05e0fec184030982a8c94a175ce634ccf547501 +F src/util.c 11e0e5e43850e29571301a3f3b87f43ad69a8ebaef99c69f8ac23793230ab7f9 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c e6fb674eda4aa32c50d53eb09210c9ed802866cb4d1dc0d6187301b55e4a82b7 +F src/vdbe.c 51989be8322328fabc04a257dc207427646a6c165c51c6fe2260e783b72a9f9c F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 5ecfa992b496c8e46227f1ff2ebae30c7b7a6bc098229c89a8ff49cf27249d69 +F src/vdbemem.c be520020f89c02de6e0a0df6767e37a4a2eeef3ec7bf9ae64ad6ba32005c19fb F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -723,7 +723,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 5ceb920718d280b61163500a7d29e0e0a86458b1cbd92d96f962c9d970aa3857 +F test/cast.test 6505b8aecc0e17079536103328add23fe63418530d1f827e46c32e4151a29daf F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -821,7 +821,7 @@ F test/e_createtable.test 1c602347e73ab80b11b9fa083f47155861aaafcff8054aac9e0b76 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 -F test/e_expr.test 698c8c6e9b4b737f494c39b2210a3eb7af0efd8167137844483b7add5c76a951 +F test/e_expr.test 8cd7d85270cc7b1bca4cad6dc1c65f2d414b8851d0a13eb4eed0aa27a3516b9a F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1441,7 +1441,7 @@ F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a8a0d2996a.test 76662ff0622c90e7ce7bbcb4d9e1129acddf877d17c3489f2da7f17ddfaad1f4 +F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 F test/tkt-b72787b1.test a95e8cdad0b98af1853ac7f0afd4ab27b77bf5f3 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P be8438133f6cd87e5d51f15cfd1eed83176b3239334875eb0c3dec502cfe39d3 -R 00ceb0bb88b1df0dc7ae96766c6b0ad8 -U dan -Z 21b18707f1c3d774dec053a2348d0058 +P efbf31b82e6e16fda88d8cea54202a8593ff52f2267a44dba828704818162e66 +R 30eb5049d622e77cde7b765c01527b8b +U drh +Z 8a6d08c3a530b4e77d8a6a19f29cc9fd diff --git a/manifest.uuid b/manifest.uuid index 662786c7de..9698419a40 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efbf31b82e6e16fda88d8cea54202a8593ff52f2267a44dba828704818162e66 \ No newline at end of file +67a68af5578f08d2be2e48cf4fd12a6cf35a09c47d259deda81950f7ee1f02f7 \ No newline at end of file diff --git a/src/date.c b/src/date.c index 313c7f9137..e271210679 100644 --- a/src/date.c +++ b/src/date.c @@ -388,7 +388,7 @@ static int parseDateOrTime( return 0; }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ return setDateTimeToCurrent(context, p); - }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ + }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ setRawDateNumber(p, r); return 0; } @@ -722,7 +722,7 @@ static int parseModifier( ** date is already on the appropriate weekday, this is a no-op. */ if( sqlite3_strnicmp(z, "weekday ", 8)==0 - && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) + && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)>0 && (n=(int)r)==r && n>=0 && r<7 ){ sqlite3_int64 Z; computeYMD_HMS(p); @@ -781,7 +781,7 @@ static int parseModifier( double rRounder; int i; for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} - if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ + if( sqlite3AtoF(z, &r, n, SQLITE_UTF8)<=0 ){ rc = 1; break; } diff --git a/src/func.c b/src/func.c index 80c595a559..869d4bd16f 100644 --- a/src/func.c +++ b/src/func.c @@ -397,7 +397,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ sqlite3_result_error_nomem(context); return; } - if( !sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8) ){ + if( sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8)<=0 ){ assert( sqlite3_strglob("*Inf", zBuf)==0 ); r = zBuf[0]=='-' ? -HUGE_VAL : +HUGE_VAL; } diff --git a/src/util.c b/src/util.c index e67f22e771..735d6bed6a 100644 --- a/src/util.c +++ b/src/util.c @@ -365,7 +365,9 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ ** return ** 1 => The input string is a pure integer ** 2 or more => The input has a decimal point or eNNN clause -** 0 => The input string is not a valid number +** 0 or less => The input string is not a valid number +** -1 => Not a valid number, but has a valid prefix which +** includes a decimal point and/or an eNNN clause ** ** Valid numbers are in one of these formats: ** @@ -556,7 +558,13 @@ do_atof_calc: *pResult = result; /* return true if number and no extra non-whitespace chracters after */ - return z==zEnd && nDigit>0 && eValid && eType>0 ? eType : 0; + if( z==zEnd && nDigit>0 && eValid && eType>0 ){ + return eType; + }else if( eType>=2 && (eType==3 || eValid) ){ + return -1; + }else{ + return 0; + } #else return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ @@ -599,6 +607,7 @@ static int compare2pow63(const char *zNum, int incr){ ** ** Returns: ** +** -1 Not even a prefix of the input text looks like an integer ** 0 Successful transformation. Fits in a 64-bit signed integer. ** 1 Excess non-space text after the integer value ** 2 Integer too large for a 64-bit signed integer or is malformed @@ -658,9 +667,9 @@ int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){ *pNum = (i64)u; } rc = 0; - if( (i==0 && zStart==zNum) /* No digits */ - || nonNum /* UTF16 with high-order bytes non-zero */ - ){ + if( i==0 && zStart==zNum ){ /* No digits */ + rc = -1; + }else if( nonNum ){ /* UTF16 with high-order bytes non-zero */ rc = 1; }else if( &zNum[i]flags & (MEM_Str|MEM_Int|MEM_Real|MEM_IntReal))==MEM_Str ); rc = sqlite3AtoF(pRec->z, &rValue, pRec->n, enc); - if( rc==0 ) return; + if( rc<=0 ) return; if( rc==1 && alsoAnInt(pRec, rValue, &pRec->u.i) ){ pRec->flags |= MEM_Int; }else{ @@ -422,13 +422,21 @@ void sqlite3ValueApplyAffinity( ** accordingly. */ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ + int rc; + sqlite3_int64 ix; assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal))==0 ); assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); ExpandBlob(pMem); - if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ - return 0; - } - if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==0 ){ + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc<=0 ){ + if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ + pMem->u.i = ix; + return MEM_Int; + }else{ + return MEM_Real; + } + }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + pMem->u.i = ix; return MEM_Int; } return MEM_Real; @@ -1590,7 +1598,6 @@ case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */ case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ - char bIntint; /* Started out as two integer operands */ u16 flags; /* Combined MEM_* flags from both inputs */ u16 type1; /* Numeric type of left operand */ u16 type2; /* Numeric type of right operand */ @@ -1608,7 +1615,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ if( (type1 & type2 & MEM_Int)!=0 ){ iA = pIn1->u.i; iB = pIn2->u.i; - bIntint = 1; switch( pOp->opcode ){ case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break; case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break; @@ -1631,7 +1637,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ }else if( (flags & MEM_Null)!=0 ){ goto arithmetic_result_is_null; }else{ - bIntint = 0; fp_math: rA = sqlite3VdbeRealValue(pIn1); rB = sqlite3VdbeRealValue(pIn2); @@ -1663,9 +1668,6 @@ fp_math: } pOut->u.r = rB; MemSetTypeFlag(pOut, MEM_Real); - if( ((type1|type2)&(MEM_Real|MEM_IntReal))==0 && !bIntint ){ - sqlite3VdbeIntegerAffinity(pOut); - } #endif } break; diff --git a/src/vdbemem.c b/src/vdbemem.c index e8e85dc9e6..a139714a18 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -717,20 +717,22 @@ int sqlite3VdbeMemNumerify(Mem *pMem){ testcase( pMem->flags & MEM_Null ); if( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))==0 ){ int rc; + sqlite3_int64 ix; assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - rc = sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc); - if( rc==0 ){ - MemSetTypeFlag(pMem, MEM_Int); - }else{ - i64 i = pMem->u.i; - sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); - if( rc==1 && sqlite3RealSameAsInt(pMem->u.r, i) ){ - pMem->u.i = i; + rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc<=0 ){ + if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ + pMem->u.i = ix; MemSetTypeFlag(pMem, MEM_Int); }else{ MemSetTypeFlag(pMem, MEM_Real); } + }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + pMem->u.i = ix; + MemSetTypeFlag(pMem, MEM_Int); + }else{ + MemSetTypeFlag(pMem, MEM_Real); } } assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Null))!=0 ); diff --git a/test/cast.test b/test/cast.test index f43aa48560..8247636867 100644 --- a/test/cast.test +++ b/test/cast.test @@ -388,4 +388,31 @@ do_execsql_test case-6.1 { SELECT * FROM t1; } {9000000000000000001 9000000000000000001 9000000000000000001 9000000000000000001} +# 2019-06-07 +# https://www.sqlite.org/src/info/4c2d7639f076aa7c +do_execsql_test case-7.1 { + SELECT CAST('-' AS NUMERIC); +} {0} +do_execsql_test case-7.2 { + SELECT CAST('-0' AS NUMERIC); +} {0} +do_execsql_test case-7.3 { + SELECT CAST('+' AS NUMERIC); +} {0} +do_execsql_test case-7.4 { + SELECT CAST('/' AS NUMERIC); +} {0} + +# 2019-06-07 +# https://www.sqlite.org/src/info/e8bedb2a184001bb +do_execsql_test case-7.10 { + SELECT '' - 2851427734582196970; +} {-2851427734582196970} +do_execsql_test case-7.11 { + SELECT 0 - 2851427734582196970; +} {-2851427734582196970} +do_execsql_test case-7.12 { + SELECT '' - 1; +} {-1} + finish_test diff --git a/test/e_expr.test b/test/e_expr.test index 6e3a8d9608..75618a6e06 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1650,7 +1650,7 @@ do_expr_test e_expr-31.2.4 { # is lossless and reversible. # do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 -do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 +do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } real 45.0 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11 do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1 @@ -1701,16 +1701,16 @@ do_execsql_test e_expr-32.2.8 { integer 9000000000000000001 \ integer 9000000000000000001 \ integer 9000000000000000001 \ - integer 9000000000000000001 \ + real 9.0e+18 \ integer 9223372036854775807 \ integer 9223372036854775807 \ integer 9223372036854775807 \ real 9.22337203685478e+18 \ real 9.22337203685478e+18 \ - integer 9223372036854775807 \ - integer 9223372036854775807 \ - integer -5 \ - integer -5 \ + real 9.22337203685478e+18 \ + real 9.22337203685478e+18 \ + real -5.0 \ + real -5.0 \ ] # EVIDENCE-OF: R-64550-29191 Note that the result from casting any diff --git a/test/tkt-a8a0d2996a.test b/test/tkt-a8a0d2996a.test index 03c2ee9448..2644937029 100644 --- a/test/tkt-a8a0d2996a.test +++ b/test/tkt-a8a0d2996a.test @@ -84,12 +84,12 @@ do_execsql_test 4.3 { } {104.5} do_execsql_test 4.4 { SELECT '-9223372036854775807x'-'1x'; -} {-9.22337203685478e+18} +} {-9223372036854775808} do_execsql_test 4.5 { SELECT '9223372036854775806x'+'1x'; -} {9.22337203685478e+18} +} {9223372036854775807} do_execsql_test 4.6 { - SELECT '1234x'/'10y'; -} {123.4} + SELECT '1234x'/'10y', '1234x'/'10.y', '1234x'/'1e1y'; +} {123 123.4 123.4} finish_test From 55700bcd7255b15861fec4a0c4ab24eda965420d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 7 Jun 2019 22:51:13 +0000 Subject: [PATCH 52/96] Remove code in the round() SQL function that became unreachable due to the optimization of check-in [e95138f5f4febde5] FossilOrigin-Name: b141bae3f6d16c0ebb59dac9b02086a4370839e71ade34004f647b09b1083d1d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 5 +---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 43b03d9330..360ece08bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scasting\sstring\svalues\sinto\snumeric\sand\sthe\sstring\shas\sa\sprefix\sthat\slooks\nlike\sa\snumber\sbut\stotal\sstring\sis\snot\sa\swell-formed\snumber,\sthen\stake\sextra\ncare\sthat\sthe\sresult\sis\seither\sinteger\sor\sreal\sdepending\son\swhat\sthe\sprefix\nlooks\slike.\s\sFix\sfor\stickets\s[e8bedb2a184001]\sand\s[4c2d7639f076aa]. -D 2019-06-07T22:26:08.019 +C Remove\scode\sin\sthe\sround()\sSQL\sfunction\sthat\sbecame\sunreachable\sdue\sto\nthe\soptimization\sof\scheck-in\s[e95138f5f4febde5] +D 2019-06-07T22:51:13.798 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 -F src/func.c f1ee70d50c75a00620f0b1721438de56fa12b7798b38fb469896582f599fe3c0 +F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P efbf31b82e6e16fda88d8cea54202a8593ff52f2267a44dba828704818162e66 -R 30eb5049d622e77cde7b765c01527b8b +P 67a68af5578f08d2be2e48cf4fd12a6cf35a09c47d259deda81950f7ee1f02f7 +R 6f81af875af4fc753423b0367cd03825 U drh -Z 8a6d08c3a530b4e77d8a6a19f29cc9fd +Z 994865afe67c9e685ee27813494924dd diff --git a/manifest.uuid b/manifest.uuid index 9698419a40..fe50092b17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67a68af5578f08d2be2e48cf4fd12a6cf35a09c47d259deda81950f7ee1f02f7 \ No newline at end of file +b141bae3f6d16c0ebb59dac9b02086a4370839e71ade34004f647b09b1083d1d \ No newline at end of file diff --git a/src/func.c b/src/func.c index 869d4bd16f..5aea2d74b8 100644 --- a/src/func.c +++ b/src/func.c @@ -397,10 +397,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ sqlite3_result_error_nomem(context); return; } - if( sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8)<=0 ){ - assert( sqlite3_strglob("*Inf", zBuf)==0 ); - r = zBuf[0]=='-' ? -HUGE_VAL : +HUGE_VAL; - } + sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8); sqlite3_free(zBuf); } sqlite3_result_double(context, r); From 32d0f64e8dc1ce478a48e6ebcc400e71a3deb8aa Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 10 Jun 2019 13:46:42 +0000 Subject: [PATCH 53/96] Do not attempt the LIKE optimization on a column with numeric affinity if the rhs of the operator begins with whitespace. Fix for ticket [fd76310a5e]. FossilOrigin-Name: 94b58ab059cba9771e75f16d1460f313104a8fb879f9f8805725d362aa58cbcd --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/whereexpr.c | 13 +++++++------ test/like.test | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 360ece08bd..80bac3620e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\scode\sin\sthe\sround()\sSQL\sfunction\sthat\sbecame\sunreachable\sdue\sto\nthe\soptimization\sof\scheck-in\s[e95138f5f4febde5] -D 2019-06-07T22:51:13.798 +C Do\snot\sattempt\sthe\sLIKE\soptimization\son\sa\scolumn\swith\snumeric\saffinity\sif\sthe\srhs\sof\sthe\soperator\sbegins\swith\swhitespace.\sFix\sfor\sticket\s[fd76310a5e]. +D 2019-06-10T13:46:42.468 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 99c7b718ef846ac952016083aaf4e22ede2290beceaf4730a2df55c023251369 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a -F src/whereexpr.c 4219bdd5d310ba6424166d918efef301c21e1b7f6444e964b415c4a5b877a8fe +F src/whereexpr.c d0683adb125754b3edd44d7c73fa2e4ea175eaacd900f1dc6993da2f6f0149cc F src/window.c 5be2cf7d8763cc97137fc44d015aed8a1a4a56fe9700d7933ed560172617c756 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1093,7 +1093,7 @@ F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 11cfd7d4ef8625389df9efc46735ff0b0b41d5e62047ef0f3bc24c380d28a7a6 +F test/like.test 5013f18e7242fe118524fcf8e484b8827bcd5906b509d106f3587c7bfcf274ae F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da F test/like3.test ac61947ef35bde9d97718bcfa04659a17d9218f1fffc4104b135b3f82ed43836 F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 67a68af5578f08d2be2e48cf4fd12a6cf35a09c47d259deda81950f7ee1f02f7 -R 6f81af875af4fc753423b0367cd03825 -U drh -Z 994865afe67c9e685ee27813494924dd +P b141bae3f6d16c0ebb59dac9b02086a4370839e71ade34004f647b09b1083d1d +R 0edeeba297be7794a2df312af7fa73d6 +U dan +Z f66db0d0d24acc61923a149ef2da89aa diff --git a/manifest.uuid b/manifest.uuid index fe50092b17..e84dddf058 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b141bae3f6d16c0ebb59dac9b02086a4370839e71ade34004f647b09b1083d1d \ No newline at end of file +94b58ab059cba9771e75f16d1460f313104a8fb879f9f8805725d362aa58cbcd \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index f216b848e3..db460652ce 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -264,12 +264,12 @@ static int isLikeOrGlob( zNew[iTo] = 0; assert( iTo>0 ); - /* If the RHS begins with a digit or a +/- sign, then the LHS must be - ** an ordinary column (not a virtual table column) with TEXT affinity. - ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false - ** even though "lhs LIKE rhs" is true. But if the RHS does not start - ** with a digit or +/-, then "lhs LIKE rhs" will always be false if - ** the LHS is numeric and so the optimization still works. + /* If the RHS begins with a digit, a +/- sign or whitespace, then the + ** LHS must be an ordinary column (not a virtual table column) with + ** TEXT affinity. Otherwise the LHS might be numeric and "lhs >= rhs" + ** would be false even though "lhs LIKE rhs" is true. But if the RHS + ** does not start with a digit or +/-, then "lhs LIKE rhs" will always + ** be false if the LHS is numeric and so the optimization still works. ** ** 2018-09-10 ticket c94369cae9b561b1f996d0054bfab11389f9d033 ** The RHS pattern must not be '/%' because the termination condition @@ -277,6 +277,7 @@ static int isLikeOrGlob( ** be converted into "x<0", which is incorrect. */ if( sqlite3Isdigit(zNew[0]) + || sqlite3Isspace(zNew[0]) || zNew[0]=='-' || zNew[0]=='+' || zNew[iTo-1]=='0'-1 diff --git a/test/like.test b/test/like.test index e5324aee25..75ddf9ccc0 100644 --- a/test/like.test +++ b/test/like.test @@ -17,6 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix like # Create some sample data to work with. # @@ -1095,4 +1096,22 @@ do_execsql_test like-15.121 { } {/SEARCH/} } +#------------------------------------------------------------------------- +# Tests for ticket [b1d8c79314]. +# +reset_db +do_execsql_test 16.0 { + CREATE TABLE t1(a INTEGER COLLATE NOCASE); + CREATE INDEX i1 ON t1(a); + INSERT INTO t1 VALUES(' 1x'); + INSERT INTO t1 VALUES(' 1-'); +} +do_execsql_test 16.1 { + SELECT * FROM t1 WHERE a LIKE ' 1%'; +} {{ 1x} { 1-}} +do_execsql_test 16.2 { + SELECT * FROM t1 WHERE a LIKE ' 1-'; +} {{ 1-}} + finish_test + From e20a894a34894eeb4eca0252d4ff25f99ac311e8 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 10 Jun 2019 15:34:16 +0000 Subject: [PATCH 54/96] Handle renaming a column or table when the schema contains a (meaningless) index on the constant expression ('text' IN ()) or ('text' NOT IN()). FossilOrigin-Name: 567b13093956185b5d5e971b81ba4788fd9d26c03688f643b380f0f1c1a94da0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/parse.y | 8 ++++++++ test/altertab3.test | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 80bac3620e..722c863cab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sthe\sLIKE\soptimization\son\sa\scolumn\swith\snumeric\saffinity\sif\sthe\srhs\sof\sthe\soperator\sbegins\swith\swhitespace.\sFix\sfor\sticket\s[fd76310a5e]. -D 2019-06-10T13:46:42.468 +C Handle\srenaming\sa\scolumn\sor\stable\swhen\sthe\sschema\scontains\sa\s(meaningless)\sindex\son\sthe\sconstant\sexpression\s('text'\sIN\s())\sor\s('text'\sNOT\sIN()). +D 2019-06-10T15:34:16.336 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 91f76f436db1c0ed3cc8a82ba6c945a592dc24a036f0ff7b48313bd80977d382 +F src/parse.y 954e2624409fb04344811e2a59e3458abf67fd75ad71f0776e94435617871edf F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 5d423a2d1006085b05cc1b788863d5a860ea2da21c4f892d15e2f2a34c78348a -F test/altertab3.test 2433d0cc6cb9cffe087f9138cd36818c7abd5c396804aa6e6dc8c2b80e2cd406 +F test/altertab3.test a8f64e2896a9645d948ff65a6202ccbe6687b483c0ead2928d532472e674be6f F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b141bae3f6d16c0ebb59dac9b02086a4370839e71ade34004f647b09b1083d1d -R 0edeeba297be7794a2df312af7fa73d6 +P 94b58ab059cba9771e75f16d1460f313104a8fb879f9f8805725d362aa58cbcd +R 690f23cd3c9b330abd9f7860557c7bc2 U dan -Z f66db0d0d24acc61923a149ef2da89aa +Z 9f6778172efe3826af7afd3381a81ce6 diff --git a/manifest.uuid b/manifest.uuid index e84dddf058..4c3d0191a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -94b58ab059cba9771e75f16d1460f313104a8fb879f9f8805725d362aa58cbcd \ No newline at end of file +567b13093956185b5d5e971b81ba4788fd9d26c03688f643b380f0f1c1a94da0 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 46faa9a369..de7c6b16d5 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1172,10 +1172,18 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. + ** + ** Or, if this is part of an ALTER TABLE RENAME command, instead + ** change the expression to "+(expr1)". The unary + is required to + ** workaround the obscure case where expr1 is a string literal, as + ** SQLite treats simple string literals in CREATE INDEX statements + ** as column names, not constant expressions. */ if( IN_RENAME_OBJECT==0 ){ sqlite3ExprDelete(pParse->db, A); A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + }else{ + A = sqlite3PExpr(pParse, TK_UPLUS, A, 0); } }else if( Y->nExpr==1 ){ /* Expressions of the form: diff --git a/test/altertab3.test b/test/altertab3.test index b37d9ed1f9..897f6908f6 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -175,6 +175,21 @@ do_catchsql_test 7.2.2 { ALTER TABLE t1x RENAME TO t1; } {1 {error in trigger AFTER: no such column: d}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + CREATE TABLE t0(c0); + CREATE INDEX i0 ON t0('1' IN ()); +} +do_execsql_test 8.1 { + ALTER TABLE t0 RENAME TO t1; + SELECT sql FROM sqlite_master; +} { + {CREATE TABLE "t1"(c0)} + {CREATE INDEX i0 ON "t1"('1' IN ())} +} + + finish_test From c285ded26c1a8b368777691cf40ad7385f27919b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 10 Jun 2019 18:33:16 +0000 Subject: [PATCH 55/96] Make sure a CAST to "NUMERIC" results in an integer if the value can be losslessly expressed as an integer, as the documentation requires. Ticket [dd6bffbfb6e61db9]. FossilOrigin-Name: c0c90961b4fa1c1185772d04fe1915bc1a1af27ed8ddb8db1c524bf90d68ccbf --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 13 ++----------- src/vdbemem.c | 14 +++++--------- test/cast.test | 18 +++++++++++++++++- test/e_expr.test | 6 +++--- 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 722c863cab..1a36cae441 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\srenaming\sa\scolumn\sor\stable\swhen\sthe\sschema\scontains\sa\s(meaningless)\sindex\son\sthe\sconstant\sexpression\s('text'\sIN\s())\sor\s('text'\sNOT\sIN()). -D 2019-06-10T15:34:16.336 +C Make\ssure\sa\sCAST\sto\s"NUMERIC"\sresults\sin\san\sinteger\sif\sthe\svalue\scan\sbe\nlosslessly\sexpressed\sas\san\sinteger,\sas\sthe\sdocumentation\srequires.\nTicket\s[dd6bffbfb6e61db9]. +D 2019-06-10T18:33:16.336 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,13 +594,13 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 11e0e5e43850e29571301a3f3b87f43ad69a8ebaef99c69f8ac23793230ab7f9 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 51989be8322328fabc04a257dc207427646a6c165c51c6fe2260e783b72a9f9c +F src/vdbe.c 42a7966812a5c3305cadd3e1060a0e962d6674e4a647fcc153e8693ecf59af74 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c be520020f89c02de6e0a0df6767e37a4a2eeef3ec7bf9ae64ad6ba32005c19fb +F src/vdbemem.c 44ef1a12855e0c866082622a60520d89194887b805390d8da3d9b5fd36897454 F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -723,7 +723,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 6505b8aecc0e17079536103328add23fe63418530d1f827e46c32e4151a29daf +F test/cast.test 9fa79845ef0f701082bea0f86bfe4aa22bf714e8369862f227dfc8fd1c24879d F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -821,7 +821,7 @@ F test/e_createtable.test 1c602347e73ab80b11b9fa083f47155861aaafcff8054aac9e0b76 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 -F test/e_expr.test 8cd7d85270cc7b1bca4cad6dc1c65f2d414b8851d0a13eb4eed0aa27a3516b9a +F test/e_expr.test 628c1c5990e7df71bee17c83afcf59f31c3d34914b829ac098ee3a72b2f1d061 F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 94b58ab059cba9771e75f16d1460f313104a8fb879f9f8805725d362aa58cbcd -R 690f23cd3c9b330abd9f7860557c7bc2 -U dan -Z 9f6778172efe3826af7afd3381a81ce6 +P 567b13093956185b5d5e971b81ba4788fd9d26c03688f643b380f0f1c1a94da0 +R e1f8a32b710aa9d301370151b67c84ba +U drh +Z a526308cb484ae4690504962aa2e9239 diff --git a/manifest.uuid b/manifest.uuid index 4c3d0191a5..1e38aae0f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -567b13093956185b5d5e971b81ba4788fd9d26c03688f643b380f0f1c1a94da0 \ No newline at end of file +c0c90961b4fa1c1185772d04fe1915bc1a1af27ed8ddb8db1c524bf90d68ccbf \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 55656f2a68..d37ba1cceb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -285,17 +285,8 @@ static VdbeCursor *allocateCursor( static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ i64 iValue = (double)rValue; if( sqlite3RealSameAsInt(rValue,iValue) ){ - testcase( iValue<-2251799813685248 ); - testcase( iValue==-2251799813685248 ); - testcase( iValue==-2251799813685247 ); - testcase( iValue>-2251799813685247 && iValue<+2251799813685247 ); - testcase( iValue==+2251799813685247 ); - testcase( iValue==+2251799813685248 ); - testcase( iValue>+2251799813685248 ); - if( iValue > -2251799813685248 && iValue < 2251799813685248 ){ - *piValue = iValue; - return 1; - } + *piValue = iValue; + return 1; } return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); } diff --git a/src/vdbemem.c b/src/vdbemem.c index a139714a18..ab3c378d87 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -699,7 +699,8 @@ int sqlite3VdbeMemRealify(Mem *pMem){ */ int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ double r2 = (double)i; - return memcmp(&r1, &r2, sizeof(r1))==0; + return memcmp(&r1, &r2, sizeof(r1))==0 + && i > -2251799813685248 && i < 2251799813685248; } /* @@ -721,14 +722,9 @@ int sqlite3VdbeMemNumerify(Mem *pMem){ assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); rc = sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); - if( rc<=0 ){ - if( rc==0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1 ){ - pMem->u.i = ix; - MemSetTypeFlag(pMem, MEM_Int); - }else{ - MemSetTypeFlag(pMem, MEM_Real); - } - }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1) + || sqlite3RealSameAsInt(pMem->u.r, (ix = (i64)pMem->u.r)) + ){ pMem->u.i = ix; MemSetTypeFlag(pMem, MEM_Int); }else{ diff --git a/test/cast.test b/test/cast.test index 8247636867..6519d6db78 100644 --- a/test/cast.test +++ b/test/cast.test @@ -371,7 +371,8 @@ do_execsql_test cast-5.2 { do_execsql_test case-5.3 { SELECT CAST('123e+5' AS INTEGER); SELECT CAST('123e+5' AS NUMERIC); -} {123 12300000.0} + SELECT CAST('123e+5' AS REAL); +} {123 12300000 12300000.0} # The following does not have anything to do with the CAST operator, @@ -415,4 +416,19 @@ do_execsql_test case-7.12 { SELECT '' - 1; } {-1} +# 2019-06-10 +# https://www.sqlite.org/src/info/dd6bffbfb6e61db9 +# +# EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC +# first does a forced conversion into REAL but then further converts the +# result into INTEGER if and only if the conversion from REAL to INTEGER +# is lossless and reversible. +# +do_execsql_test cast-7.20 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0 (c0 TEXT); + INSERT INTO t0(c0) VALUES ('1.0'); + SELECT CAST(c0 AS NUMERIC) FROM t0; +} {1} + finish_test diff --git a/test/e_expr.test b/test/e_expr.test index 75618a6e06..66725bd2ee 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1650,7 +1650,7 @@ do_expr_test e_expr-31.2.4 { # is lossless and reversible. # do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 -do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } real 45.0 +do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11 do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1 @@ -1709,8 +1709,8 @@ do_execsql_test e_expr-32.2.8 { real 9.22337203685478e+18 \ real 9.22337203685478e+18 \ real 9.22337203685478e+18 \ - real -5.0 \ - real -5.0 \ + integer -5 \ + integer -5 \ ] # EVIDENCE-OF: R-64550-29191 Note that the result from casting any From 99778c4b211b78134152b38ee1798c54b5c268a8 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 10 Jun 2019 19:07:15 +0000 Subject: [PATCH 56/96] Improvements to the documentation for the xAccess method of the VFS. Ticket [5e0423b058fa5adf] FossilOrigin-Name: 7078d77effc296c63c91ec032c866e2b320f081d58e57e9e83cc58373169bda3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 10 ++++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1a36cae441..f452b033fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sa\sCAST\sto\s"NUMERIC"\sresults\sin\san\sinteger\sif\sthe\svalue\scan\sbe\nlosslessly\sexpressed\sas\san\sinteger,\sas\sthe\sdocumentation\srequires.\nTicket\s[dd6bffbfb6e61db9]. -D 2019-06-10T18:33:16.336 +C Improvements\sto\sthe\sdocumentation\sfor\sthe\sxAccess\smethod\sof\sthe\sVFS.\nTicket\s[5e0423b058fa5adf] +D 2019-06-10T19:07:15.538 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a8 -F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b +F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 F src/sqliteInt.h 73d93952552a7a5fdb29ae19ef9919041364070615ba04c2d673126185f523bf @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 567b13093956185b5d5e971b81ba4788fd9d26c03688f643b380f0f1c1a94da0 -R e1f8a32b710aa9d301370151b67c84ba +P c0c90961b4fa1c1185772d04fe1915bc1a1af27ed8ddb8db1c524bf90d68ccbf +R 1af247308c22bd12313667a6b8f8165c U drh -Z a526308cb484ae4690504962aa2e9239 +Z 865398b77cb46905965e28b6b92a0e8d diff --git a/manifest.uuid b/manifest.uuid index 1e38aae0f1..7fa3a21a6c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0c90961b4fa1c1185772d04fe1915bc1a1af27ed8ddb8db1c524bf90d68ccbf \ No newline at end of file +7078d77effc296c63c91ec032c866e2b320f081d58e57e9e83cc58373169bda3 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index e6f9802dad..f6054c17eb 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1296,8 +1296,14 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; ** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] ** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to ** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. +** to test whether a file is at least readable. The SQLITE_ACCESS_READ +** flag is never actually used and is not implemented in the built-in +** VFSes of SQLite. The file is named by the second argument and can be a +** directory. The xAccess method returns [SQLITE_OK] on success or some +** non-zero error code if there is an I/O error or if the name of +** the file given in the second argument is illegal. If SQLITE_OK +** is returned, then non-zero or zero is written into *pResOut to indicate +** whether or not the file is accessible. ** ** ^SQLite will always allocate at least mxPathname+1 bytes for the ** output buffer xFullPathname. The exact size of the output buffer From e4a9e4d0e57be6228936dc06936a7aa09e551d46 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 10 Jun 2019 19:17:37 +0000 Subject: [PATCH 57/96] Have ALTER TABLE commands ignore the lhs of "expr IN ()" and "expr NOT IN ()" expressions, just as other queries do. Fix for [533010b8ca]. FossilOrigin-Name: 71643deb6bbad4b4a511bfd43b32245b50a555b508b90f33adf0656ae53292c6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/parse.y | 8 ++------ test/altertab3.test | 20 +++++++++++++++++++- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index f452b033fe..2f12e27694 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sdocumentation\sfor\sthe\sxAccess\smethod\sof\sthe\sVFS.\nTicket\s[5e0423b058fa5adf] -D 2019-06-10T19:07:15.538 +C Have\sALTER\sTABLE\scommands\signore\sthe\slhs\sof\s"expr\sIN\s()"\sand\s"expr\sNOT\sIN\s()"\sexpressions,\sjust\sas\sother\squeries\sdo.\sFix\sfor\s[533010b8ca]. +D 2019-06-10T19:17:37.185 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 954e2624409fb04344811e2a59e3458abf67fd75ad71f0776e94435617871edf +F src/parse.y 0548025430bf02b55cd8ce31938d38ea72a24e1bacac729377dd8af26c94b9a4 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 5d423a2d1006085b05cc1b788863d5a860ea2da21c4f892d15e2f2a34c78348a -F test/altertab3.test a8f64e2896a9645d948ff65a6202ccbe6687b483c0ead2928d532472e674be6f +F test/altertab3.test 47cdbc49c0e3638754be29966e3406f5b8041ff863ecdcc176d6352fa0f2b6d7 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c0c90961b4fa1c1185772d04fe1915bc1a1af27ed8ddb8db1c524bf90d68ccbf -R 1af247308c22bd12313667a6b8f8165c -U drh -Z 865398b77cb46905965e28b6b92a0e8d +P 7078d77effc296c63c91ec032c866e2b320f081d58e57e9e83cc58373169bda3 +R afd3c490799de49217aa8031c183c3f2 +U dan +Z 8f1ab056c29f3005ef2ba2d582e1a93e diff --git a/manifest.uuid b/manifest.uuid index 7fa3a21a6c..07e280d6a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7078d77effc296c63c91ec032c866e2b320f081d58e57e9e83cc58373169bda3 \ No newline at end of file +71643deb6bbad4b4a511bfd43b32245b50a555b508b90f33adf0656ae53292c6 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index de7c6b16d5..f7d677d331 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1179,12 +1179,8 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** SQLite treats simple string literals in CREATE INDEX statements ** as column names, not constant expressions. */ - if( IN_RENAME_OBJECT==0 ){ - sqlite3ExprDelete(pParse->db, A); - A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); - }else{ - A = sqlite3PExpr(pParse, TK_UPLUS, A, 0); - } + sqlite3ExprDelete(pParse->db, A); + A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); }else if( Y->nExpr==1 ){ /* Expressions of the form: ** diff --git a/test/altertab3.test b/test/altertab3.test index 897f6908f6..87bdb10de3 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -79,7 +79,7 @@ do_execsql_test 3.1 { do_execsql_test 3.2 { SELECT sql FROM sqlite_master WHERE name = 'v1' -} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}} +} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ())}} #------------------------------------------------------------------------- reset_db @@ -189,6 +189,24 @@ do_execsql_test 8.1 { {CREATE INDEX i0 ON "t1"('1' IN ())} } +do_execsql_test 8.2.1 { + CREATE TABLE t2 (c0); + CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ())); + ALTER TABLE t2 RENAME COLUMN c0 TO c1; +} +do_execsql_test 8.2.2 { + SELECT sql FROM sqlite_master WHERE tbl_name = 't2'; +} { + {CREATE TABLE t2 (c1)} + {CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ()))} +} +do_test 8.2.3 { + sqlite3 db2 test.db + db2 eval { INSERT INTO t2 VALUES (1), (2), (3) } + db close +} {} + + finish_test From 378a7d356b954de44ea5274422d0ba5dfaf11501 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 10 Jun 2019 23:45:10 +0000 Subject: [PATCH 58/96] A string consisting of a single '.' is not a floating point literal with extra text at the end. Fix for ticket [412bba9b22c677da] FossilOrigin-Name: 57050162294efec90caa5cc3c2f8c1a85215526adcf57b284ce2d2e799286b78 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/util.c | 2 +- test/cast.test | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2f12e27694..caf3e4ff94 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sALTER\sTABLE\scommands\signore\sthe\slhs\sof\s"expr\sIN\s()"\sand\s"expr\sNOT\sIN\s()"\sexpressions,\sjust\sas\sother\squeries\sdo.\sFix\sfor\s[533010b8ca]. -D 2019-06-10T19:17:37.185 +C A\sstring\sconsisting\sof\sa\ssingle\s'.'\sis\snot\sa\sfloating\spoint\sliteral\swith\sextra\ntext\sat\sthe\send.\s\sFix\sfor\sticket\s[412bba9b22c677da] +D 2019-06-10T23:45:10.215 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 11e0e5e43850e29571301a3f3b87f43ad69a8ebaef99c69f8ac23793230ab7f9 +F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 42a7966812a5c3305cadd3e1060a0e962d6674e4a647fcc153e8693ecf59af74 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 @@ -723,7 +723,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 9fa79845ef0f701082bea0f86bfe4aa22bf714e8369862f227dfc8fd1c24879d +F test/cast.test 2067a08edfe4ded14d0eb845731716d397df78d65b69d8045d25950ad9bffad9 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7078d77effc296c63c91ec032c866e2b320f081d58e57e9e83cc58373169bda3 -R afd3c490799de49217aa8031c183c3f2 -U dan -Z 8f1ab056c29f3005ef2ba2d582e1a93e +P 71643deb6bbad4b4a511bfd43b32245b50a555b508b90f33adf0656ae53292c6 +R 54d590b4a5191f047d2f445fbb388e22 +U drh +Z e2d78dfbfe8e13309b95d519b72471d5 diff --git a/manifest.uuid b/manifest.uuid index 07e280d6a6..3d69552849 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71643deb6bbad4b4a511bfd43b32245b50a555b508b90f33adf0656ae53292c6 \ No newline at end of file +57050162294efec90caa5cc3c2f8c1a85215526adcf57b284ce2d2e799286b78 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 735d6bed6a..764bfe919c 100644 --- a/src/util.c +++ b/src/util.c @@ -560,7 +560,7 @@ do_atof_calc: /* return true if number and no extra non-whitespace chracters after */ if( z==zEnd && nDigit>0 && eValid && eType>0 ){ return eType; - }else if( eType>=2 && (eType==3 || eValid) ){ + }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ return -1; }else{ return 0; diff --git a/test/cast.test b/test/cast.test index 6519d6db78..09127ee985 100644 --- a/test/cast.test +++ b/test/cast.test @@ -431,4 +431,21 @@ do_execsql_test cast-7.20 { SELECT CAST(c0 AS NUMERIC) FROM t0; } {1} +# 2019-06-10 +# https://sqlite.org/src/info/27de823723a41df45af3 +# +do_execsql_test cast-7.30 { + SELECT -'.'; +} 0 +do_execsql_test cast-7.31 { + SELECT '.'+0; +} 0 +do_execsql_test cast-7.32 { + SELECT CAST('.' AS numeric); +} 0 +do_execsql_test cast-7.33 { + SELECT -CAST('.' AS numeric); +} 0 + + finish_test From e53be9f2363b7d65168f8200c7db251efaf62f14 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 01:30:39 +0000 Subject: [PATCH 59/96] Remove a comment made obsolete by check-in [71643deb6bbad4b4]. No changes to code. FossilOrigin-Name: 211c8002d5ea4b224125d4ed395fe15767d1dc32a77b40b89fdfc80bdd1c5a48 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 6 ------ 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index caf3e4ff94..63876508f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sstring\sconsisting\sof\sa\ssingle\s'.'\sis\snot\sa\sfloating\spoint\sliteral\swith\sextra\ntext\sat\sthe\send.\s\sFix\sfor\sticket\s[412bba9b22c677da] -D 2019-06-10T23:45:10.215 +C Remove\sa\scomment\smade\sobsolete\sby\scheck-in\s[71643deb6bbad4b4].\s\sNo\schanges\nto\scode. +D 2019-06-11T01:30:39.178 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 0548025430bf02b55cd8ce31938d38ea72a24e1bacac729377dd8af26c94b9a4 +F src/parse.y 9e13554d106885123293b0f9dc8b3fb7d4a36f109ba24bc5984bbc6405b1c665 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 71643deb6bbad4b4a511bfd43b32245b50a555b508b90f33adf0656ae53292c6 -R 54d590b4a5191f047d2f445fbb388e22 +P 57050162294efec90caa5cc3c2f8c1a85215526adcf57b284ce2d2e799286b78 +R fbb4255aba053df4ec4f1142e0f81c12 U drh -Z e2d78dfbfe8e13309b95d519b72471d5 +Z 7d251f11a7688ef9709b135ca29074d3 diff --git a/manifest.uuid b/manifest.uuid index 3d69552849..8589bccf1a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57050162294efec90caa5cc3c2f8c1a85215526adcf57b284ce2d2e799286b78 \ No newline at end of file +211c8002d5ea4b224125d4ed395fe15767d1dc32a77b40b89fdfc80bdd1c5a48 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index f7d677d331..f02f2074c7 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1172,12 +1172,6 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. - ** - ** Or, if this is part of an ALTER TABLE RENAME command, instead - ** change the expression to "+(expr1)". The unary + is required to - ** workaround the obscure case where expr1 is a string literal, as - ** SQLite treats simple string literals in CREATE INDEX statements - ** as column names, not constant expressions. */ sqlite3ExprDelete(pParse->db, A); A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); From a753d400393d34ec988b50f7a2cf77773332b33d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 01:56:42 +0000 Subject: [PATCH 60/96] Fix repeated test numbers in the altertab2.test file. FossilOrigin-Name: e82f235e7201a420149847cda630ac6f2fce5e3a4577b0ea4793f430d3dc1611 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/altertab2.test | 6 ++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 63876508f2..947387a055 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\scomment\smade\sobsolete\sby\scheck-in\s[71643deb6bbad4b4].\s\sNo\schanges\nto\scode. -D 2019-06-11T01:30:39.178 +C Fix\srepeated\stest\snumbers\sin\sthe\saltertab2.test\sfile. +D 2019-06-11T01:56:42.626 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f -F test/altertab2.test 5d423a2d1006085b05cc1b788863d5a860ea2da21c4f892d15e2f2a34c78348a +F test/altertab2.test 429e4e84475f3e10b6b49cb4025d4a58a22ea1145277cd99b6ed81c02061e490 F test/altertab3.test 47cdbc49c0e3638754be29966e3406f5b8041ff863ecdcc176d6352fa0f2b6d7 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 57050162294efec90caa5cc3c2f8c1a85215526adcf57b284ce2d2e799286b78 -R fbb4255aba053df4ec4f1142e0f81c12 +P 211c8002d5ea4b224125d4ed395fe15767d1dc32a77b40b89fdfc80bdd1c5a48 +R e5606e998f2ab9c48506263561beeb14 U drh -Z 7d251f11a7688ef9709b135ca29074d3 +Z 5b483bb7289f1f0365328c5969127898 diff --git a/manifest.uuid b/manifest.uuid index 8589bccf1a..20000ff15e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -211c8002d5ea4b224125d4ed395fe15767d1dc32a77b40b89fdfc80bdd1c5a48 \ No newline at end of file +e82f235e7201a420149847cda630ac6f2fce5e3a4577b0ea4793f430d3dc1611 \ No newline at end of file diff --git a/test/altertab2.test b/test/altertab2.test index 9fa40d0033..9b9070a7db 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -338,15 +338,13 @@ do_execsql_test 8.3 { INSERT INTO t3 VALUES(4, 5, 6); } -do_execsql_test 8.1 { +do_execsql_test 8.4 { CREATE TABLE t4(a, b); CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; } -do_execsql_test 8.2 { +do_execsql_test 8.5 { ALTER TABLE t4 RENAME a TO c; SELECT sql FROM sqlite_master WHERE name = 'v4' } {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} finish_test - - From b854b767330306ae20b235186af8e75f3c368900 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 02:43:22 +0000 Subject: [PATCH 61/96] The ALTER TABLE command should not attempt to rename objects that are contained within an expression tree that has been optimized out because it is the other branch of an "AND false" expression. Ticket [533010b8cacebe82] FossilOrigin-Name: 04bd5cb73287f926f1ecf578998fa6ce1379474e86918c692eae5778d0817cef --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 6 ++++-- test/altertab2.test | 16 +++++++++++++++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 947387a055..776eebe5bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srepeated\stest\snumbers\sin\sthe\saltertab2.test\sfile. -D 2019-06-11T01:56:42.626 +C The\sALTER\sTABLE\scommand\sshould\snot\sattempt\sto\srename\sobjects\sthat\sare\s\ncontained\swithin\san\sexpression\stree\sthat\shas\sbeen\soptimized\sout\sbecause\nit\sis\sthe\sother\sbranch\sof\san\s"AND\sfalse"\sexpression.\nTicket\s[533010b8cacebe82] +D 2019-06-11T02:43:22.189 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 6b18f022871816c80b772abc3657276562630004b48f588085b404f104fd4430 +F src/expr.c 19100ef384cbe1f985b2bf692bfe5100127365d81becb61122bed48667e0ad0d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -631,7 +631,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f -F test/altertab2.test 429e4e84475f3e10b6b49cb4025d4a58a22ea1145277cd99b6ed81c02061e490 +F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 F test/altertab3.test 47cdbc49c0e3638754be29966e3406f5b8041ff863ecdcc176d6352fa0f2b6d7 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 211c8002d5ea4b224125d4ed395fe15767d1dc32a77b40b89fdfc80bdd1c5a48 -R e5606e998f2ab9c48506263561beeb14 +P e82f235e7201a420149847cda630ac6f2fce5e3a4577b0ea4793f430d3dc1611 +R 68739974257ae8553d5364ff46bec812 U drh -Z 5b483bb7289f1f0365328c5969127898 +Z d223dd9a1c633bbd46be540c239afe43 diff --git a/manifest.uuid b/manifest.uuid index 20000ff15e..6b6897bdd9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e82f235e7201a420149847cda630ac6f2fce5e3a4577b0ea4793f430d3dc1611 \ No newline at end of file +04bd5cb73287f926f1ecf578998fa6ce1379474e86918c692eae5778d0817cef \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 2d41fc447f..057cbd6b7b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -894,9 +894,11 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ return pRight; }else if( pRight==0 ){ return pLeft; - }else if( pParse->nErr || IN_RENAME_OBJECT ){ - return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); }else if( ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight) ){ + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pLeft); + sqlite3RenameExprUnmap(pParse, pRight); + } sqlite3ExprDelete(db, pLeft); sqlite3ExprDelete(db, pRight); return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0); diff --git a/test/altertab2.test b/test/altertab2.test index 9b9070a7db..f14dc13ff1 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -342,9 +342,23 @@ do_execsql_test 8.4 { CREATE TABLE t4(a, b); CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; } + +# Do not rename branches of an expression tree that is optimized out by +# the AND optimization. +# do_execsql_test 8.5 { ALTER TABLE t4 RENAME a TO c; SELECT sql FROM sqlite_master WHERE name = 'v4' -} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2}} +# "a" is not renamed to "c" ---^ + +# 2019-06-10 https://www.sqlite.org/src/info/533010b8cacebe82 +reset_db +do_execsql_test 8.6 { + CREATE TABLE t0(c0); + CREATE INDEX i0 ON t0(LIKELIHOOD(1,2) AND 0); + ALTER TABLE t0 RENAME TO t1; + SELECT sql FROM sqlite_master WHERE name='i0'; +} {{CREATE INDEX i0 ON "t1"(LIKELIHOOD(1,2) AND 0)}} finish_test From 8e34e4061b534130bc7495c102120371c8738d95 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 10:43:56 +0000 Subject: [PATCH 62/96] Add the new sqlite3ExprUnmapAndDelete() function and use it in place of separate calls to sqlite3RenameExprUnmap() and sqlite3ExprDelete(). FossilOrigin-Name: 36ea13e0a851a749c9ef292377ecd82dbd4797d38df907b362487fa234c98ca5 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 25 +++++++++++++++---------- src/parse.y | 2 +- src/sqliteInt.h | 1 + test/fuzzdata8.db | Bin 1230848 -> 1232896 bytes 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 776eebe5bd..0ab2546e0e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sALTER\sTABLE\scommand\sshould\snot\sattempt\sto\srename\sobjects\sthat\sare\s\ncontained\swithin\san\sexpression\stree\sthat\shas\sbeen\soptimized\sout\sbecause\nit\sis\sthe\sother\sbranch\sof\san\s"AND\sfalse"\sexpression.\nTicket\s[533010b8cacebe82] -D 2019-06-11T02:43:22.189 +C Add\sthe\snew\ssqlite3ExprUnmapAndDelete()\sfunction\sand\suse\sit\sin\splace\sof\nseparate\scalls\sto\ssqlite3RenameExprUnmap()\sand\ssqlite3ExprDelete(). +D 2019-06-11T10:43:56.870 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 19100ef384cbe1f985b2bf692bfe5100127365d81becb61122bed48667e0ad0d +F src/expr.c f6b10414b5bd88f2966a407caee09a8f1703f3c80e1a67a5b0945e9dea3ef409 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 9e13554d106885123293b0f9dc8b3fb7d4a36f109ba24bc5984bbc6405b1c665 +F src/parse.y 026e3e6fff32432166a4eae0bdb78ad09a53c84eb49acb44dc32e49b4c0b8a48 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -527,7 +527,7 @@ F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 73d93952552a7a5fdb29ae19ef9919041364070615ba04c2d673126185f523bf +F src/sqliteInt.h 3f4d665dff31c852e9b724b0ec27f84af0d8c500eb0391d713faccdd86a3d379 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1006,7 +1006,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db 2f2ebc7632affed8f0bb6c52447db5a73eb37f41afa4d745f7ac9013722feead +F test/fuzzdata8.db b305f58033b043856d7d58c43bc0e8eb8fc2c102071a77d6b4c7f4efa667702d F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e82f235e7201a420149847cda630ac6f2fce5e3a4577b0ea4793f430d3dc1611 -R 68739974257ae8553d5364ff46bec812 +P 04bd5cb73287f926f1ecf578998fa6ce1379474e86918c692eae5778d0817cef +R 6b6d800c72acd17bee33792b16c98170 U drh -Z d223dd9a1c633bbd46be540c239afe43 +Z 2841a4dab216457624e44ac4f8437ccd diff --git a/manifest.uuid b/manifest.uuid index 6b6897bdd9..e7d33d1bfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -04bd5cb73287f926f1ecf578998fa6ce1379474e86918c692eae5778d0817cef \ No newline at end of file +36ea13e0a851a749c9ef292377ecd82dbd4797d38df907b362487fa234c98ca5 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 057cbd6b7b..4e8251bd89 100644 --- a/src/expr.c +++ b/src/expr.c @@ -895,12 +895,8 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ }else if( pRight==0 ){ return pLeft; }else if( ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight) ){ - if( IN_RENAME_OBJECT ){ - sqlite3RenameExprUnmap(pParse, pLeft); - sqlite3RenameExprUnmap(pParse, pRight); - } - sqlite3ExprDelete(db, pLeft); - sqlite3ExprDelete(db, pRight); + sqlite3ExprUnmapAndDelete(pParse, pLeft); + sqlite3ExprUnmapAndDelete(pParse, pRight); return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0); }else{ return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); @@ -1060,6 +1056,18 @@ void sqlite3ExprDelete(sqlite3 *db, Expr *p){ if( p ) sqlite3ExprDeleteNN(db, p); } +/* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the +** expression. +*/ +void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ + if( p ){ + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, p); + } + sqlite3ExprDeleteNN(pParse->db, p); + } +} + /* ** Return the number of bytes allocated for the expression structure ** passed as the first argument. This is always one of EXPR_FULLSIZE, @@ -1642,10 +1650,7 @@ ExprList *sqlite3ExprListAppendVector( } vector_append_error: - if( IN_RENAME_OBJECT ){ - sqlite3RenameExprUnmap(pParse, pExpr); - } - sqlite3ExprDelete(db, pExpr); + sqlite3ExprUnmapAndDelete(pParse, pExpr); sqlite3IdListDelete(db, pColumns); return pList; } diff --git a/src/parse.y b/src/parse.y index f02f2074c7..fc5bff16dc 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1173,7 +1173,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, A); + sqlite3ExprUnmapAndDelete(pParse, A); A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); }else if( Y->nExpr==1 ){ /* Expressions of the form: diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5422007958..5c711f952a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3871,6 +3871,7 @@ Expr *sqlite3ExprSimplifiedAndOr(Expr*); Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int); void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); void sqlite3ExprDelete(sqlite3*, Expr*); +void sqlite3ExprUnmapAndDelete(Parse*, Expr*); ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); void sqlite3ExprListSetSortOrder(ExprList*,int); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 3d23ff335473cfefc161c3b63692dd1344f07e5d..8da49a1df72f6f313190d9f7b2e365df851f393b 100644 GIT binary patch delta 21079 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 V`m`FoYl0{dJ^gv}b?f`B{|{>->a73( delta 20620 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 From 0b277a980a799a4fc3e17d8f44fce6a3ea1eb8d8 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 11 Jun 2019 12:03:10 +0000 Subject: [PATCH 63/96] Have the ALTER TABLE code handle the case where an entire expression that includes a sub-select is excluded from a view, trigger or index. FossilOrigin-Name: f2c8179f3c0b77f10da3f9b0771db4dec30d0bbf0b7f4751ce439bfb08da8f6f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 15 +++++++++++++++ test/altertab3.test | 13 ++++++++++++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0ab2546e0e..413583b672 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\ssqlite3ExprUnmapAndDelete()\sfunction\sand\suse\sit\sin\splace\sof\nseparate\scalls\sto\ssqlite3RenameExprUnmap()\sand\ssqlite3ExprDelete(). -D 2019-06-11T10:43:56.870 +C Have\sthe\sALTER\sTABLE\scode\shandle\sthe\scase\swhere\san\sentire\sexpression\sthat\sincludes\sa\ssub-select\sis\sexcluded\sfrom\sa\sview,\strigger\sor\sindex. +D 2019-06-11T12:03:10.803 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -456,7 +456,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 85b41586b2527c8288b249fb0beb96f25860e5b2bf94c02f788b3d0f686354ee +F src/alter.c 29fcfd07f75b6cae9bbd18ff9a5768f80203ca8196a41839fb04ec5d3d99888e F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 47cdbc49c0e3638754be29966e3406f5b8041ff863ecdcc176d6352fa0f2b6d7 +F test/altertab3.test 6909f4f31e5fd5622f3ea382b1865e1853fd01cc3f7e6be45e8d10457e7ccf3d F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 04bd5cb73287f926f1ecf578998fa6ce1379474e86918c692eae5778d0817cef -R 6b6d800c72acd17bee33792b16c98170 -U drh -Z 2841a4dab216457624e44ac4f8437ccd +P 36ea13e0a851a749c9ef292377ecd82dbd4797d38df907b362487fa234c98ca5 +R 762a7a19236cec9b157d94379126d586 +U dan +Z 99b4f10703988e7b4324363701c6ae00 diff --git a/manifest.uuid b/manifest.uuid index e7d33d1bfe..f41ceea763 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36ea13e0a851a749c9ef292377ecd82dbd4797d38df907b362487fa234c98ca5 \ No newline at end of file +f2c8179f3c0b77f10da3f9b0771db4dec30d0bbf0b7f4751ce439bfb08da8f6f \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index e5f4e2b182..765110042c 100644 --- a/src/alter.c +++ b/src/alter.c @@ -727,6 +727,20 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } +/* +** Walker callback used by sqlite3RenameExprUnmap(). +*/ +static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + if( p->pSrc ){ + Parse *pParse = pWalker->pParse; + int i; + for(i=0; ipSrc->nSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)p->pSrc->a[0].zName); + } + } + return WRC_Continue; +} + /* ** Remove all nodes that are part of expression pExpr from the rename list. */ @@ -735,6 +749,7 @@ void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ memset(&sWalker, 0, sizeof(Walker)); sWalker.pParse = pParse; sWalker.xExprCallback = renameUnmapExprCb; + sWalker.xSelectCallback = renameUnmapSelectCb; sqlite3WalkExpr(&sWalker, pExpr); } diff --git a/test/altertab3.test b/test/altertab3.test index 87bdb10de3..af89bc9dc2 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -188,7 +188,6 @@ do_execsql_test 8.1 { {CREATE TABLE "t1"(c0)} {CREATE INDEX i0 ON "t1"('1' IN ())} } - do_execsql_test 8.2.1 { CREATE TABLE t2 (c0); CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ())); @@ -206,6 +205,18 @@ do_test 8.2.3 { db close } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 9.1 { + CREATE TABLE t1(a,b,c); + CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + SELECT true WHERE (SELECT a, b FROM (t1)) IN (); + END; +} + +do_execsql_test 9.2 { + ALTER TABLE t1 RENAME TO t1x; +} finish_test From fa685947d8df2f6d4170f0c1c9894fee7ddf780d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 16:06:05 +0000 Subject: [PATCH 64/96] Off-by-one error in the CAST to NUMERIC logic. FossilOrigin-Name: 25b89630206fdbb41c756e98f99baa711d35a8c226697a92339d0fe7e8b3652a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 413583b672..0944b83561 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sALTER\sTABLE\scode\shandle\sthe\scase\swhere\san\sentire\sexpression\sthat\sincludes\sa\ssub-select\sis\sexcluded\sfrom\sa\sview,\strigger\sor\sindex. -D 2019-06-11T12:03:10.803 +C Off-by-one\serror\sin\sthe\sCAST\sto\sNUMERIC\slogic. +D 2019-06-11T16:06:05.646 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 44ef1a12855e0c866082622a60520d89194887b805390d8da3d9b5fd36897454 +F src/vdbemem.c c970d2b480beca04f9a6a70be70acf07aa1aa261f7a723e5beb986d1a83cd851 F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 36ea13e0a851a749c9ef292377ecd82dbd4797d38df907b362487fa234c98ca5 -R 762a7a19236cec9b157d94379126d586 -U dan -Z 99b4f10703988e7b4324363701c6ae00 +P f2c8179f3c0b77f10da3f9b0771db4dec30d0bbf0b7f4751ce439bfb08da8f6f +R d01aca841c3dfa997035150c46c302cd +U drh +Z f2f716cd41c6e715a96225f6f1d51c75 diff --git a/manifest.uuid b/manifest.uuid index f41ceea763..2d63549df8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2c8179f3c0b77f10da3f9b0771db4dec30d0bbf0b7f4751ce439bfb08da8f6f \ No newline at end of file +25b89630206fdbb41c756e98f99baa711d35a8c226697a92339d0fe7e8b3652a \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index ab3c378d87..20e1fb77e0 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -700,7 +700,7 @@ int sqlite3VdbeMemRealify(Mem *pMem){ int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ double r2 = (double)i; return memcmp(&r1, &r2, sizeof(r1))==0 - && i > -2251799813685248 && i < 2251799813685248; + && i >= -2251799813685248 && i < 2251799813685248; } /* From 66cc2ca83ac7804e2eea5ed0c3fa5f7ee407453c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 16:07:39 +0000 Subject: [PATCH 65/96] New test case in fuzzdata8.db. FossilOrigin-Name: e96641f0be7d4454215459b0a95cf1c46ba0133e46d0bae22269741c8f4e5b44 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1232896 -> 1234944 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0944b83561..9a0ef547c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Off-by-one\serror\sin\sthe\sCAST\sto\sNUMERIC\slogic. -D 2019-06-11T16:06:05.646 +C New\stest\scase\sin\sfuzzdata8.db. +D 2019-06-11T16:07:39.003 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1006,7 +1006,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db b305f58033b043856d7d58c43bc0e8eb8fc2c102071a77d6b4c7f4efa667702d +F test/fuzzdata8.db 7f8f849d767a2935ea37a417794672d0508171835a39a55032f490b372732222 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f2c8179f3c0b77f10da3f9b0771db4dec30d0bbf0b7f4751ce439bfb08da8f6f -R d01aca841c3dfa997035150c46c302cd +P 25b89630206fdbb41c756e98f99baa711d35a8c226697a92339d0fe7e8b3652a +R 441e44e5006149b9106762a360154ee6 U drh -Z f2f716cd41c6e715a96225f6f1d51c75 +Z 03cffffbef03cc11c3be0beeb7f9b2b0 diff --git a/manifest.uuid b/manifest.uuid index 2d63549df8..3303211947 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25b89630206fdbb41c756e98f99baa711d35a8c226697a92339d0fe7e8b3652a \ No newline at end of file +e96641f0be7d4454215459b0a95cf1c46ba0133e46d0bae22269741c8f4e5b44 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8da49a1df72f6f313190d9f7b2e365df851f393b..990f03d17c7482038fdcf1885e7d25551316b613 100644 GIT binary patch delta 21103 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 Au>b%7 delta 20485 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 Ut;C3JK~#rMe$oA^`2FVp16%Vky#N3J From 2c3f46500fb8f1cb8dbd2d325719ebc77c02e0e5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 16:43:58 +0000 Subject: [PATCH 66/96] Mark an unreachable branch with an ALWAYS macro. FossilOrigin-Name: d4755aca4b435eed62b54af84013f7f176d3fa5b7b1c243555d59de5749fcde5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9a0ef547c4..e2c9abd8a9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sin\sfuzzdata8.db. -D 2019-06-11T16:07:39.003 +C Mark\san\sunreachable\sbranch\swith\san\sALWAYS\smacro. +D 2019-06-11T16:43:58.413 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -456,7 +456,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 29fcfd07f75b6cae9bbd18ff9a5768f80203ca8196a41839fb04ec5d3d99888e +F src/alter.c 12f8c9a79ab51f7574998e3ed28dbafe59bbf0e8a435443c80bc788f661586f7 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 25b89630206fdbb41c756e98f99baa711d35a8c226697a92339d0fe7e8b3652a -R 441e44e5006149b9106762a360154ee6 +P e96641f0be7d4454215459b0a95cf1c46ba0133e46d0bae22269741c8f4e5b44 +R 7d7dff82d0b7963bbc938a7ab08b7358 U drh -Z 03cffffbef03cc11c3be0beeb7f9b2b0 +Z b7b0b5e48d9017530c5e5509ff9ff70f diff --git a/manifest.uuid b/manifest.uuid index 3303211947..776dac85c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e96641f0be7d4454215459b0a95cf1c46ba0133e46d0bae22269741c8f4e5b44 \ No newline at end of file +d4755aca4b435eed62b54af84013f7f176d3fa5b7b1c243555d59de5749fcde5 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 765110042c..4fb2ac93ea 100644 --- a/src/alter.c +++ b/src/alter.c @@ -731,7 +731,7 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ ** Walker callback used by sqlite3RenameExprUnmap(). */ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ - if( p->pSrc ){ + if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ Parse *pParse = pWalker->pParse; int i; for(i=0; ipSrc->nSrc; i++){ From 42be2ad30bad38f15a4c33956d6fe2b9c4b00989 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 18:07:53 +0000 Subject: [PATCH 67/96] Make sure the affinity of the RHS of an IN operator does not affect the outcome even if the RHS expression contains a COLLATE clause. Ticket [57353f8243c637c0] FossilOrigin-Name: 0f748fe58bbbb7ce3f30303da25ec811b2bbce249549aa9c7927979ac5b38013 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/in.test | 16 +++++++++++++++- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index e2c9abd8a9..0ba7dea5f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\san\sunreachable\sbranch\swith\san\sALWAYS\smacro. -D 2019-06-11T16:43:58.413 +C Make\ssure\sthe\saffinity\sof\sthe\sRHS\sof\san\sIN\soperator\sdoes\snot\saffect\sthe\noutcome\seven\sif\sthe\sRHS\sexpression\scontains\sa\sCOLLATE\sclause.\nTicket\s[57353f8243c637c0] +D 2019-06-11T18:07:53.447 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c f6b10414b5bd88f2966a407caee09a8f1703f3c80e1a67a5b0945e9dea3ef409 +F src/expr.c 2e0fb76763e2af1e9cf641e68706f0d8969401d93fa864762f7f075c49b447ce F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -1020,7 +1020,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 4b985774a64f143f486418cec53379bed3aeb0503179353cc7c7ce15fb464349 +F test/in.test 63e642e97bc22c8fd970752fb4f0b3992a957003ea87524fe69e5a700500c500 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e96641f0be7d4454215459b0a95cf1c46ba0133e46d0bae22269741c8f4e5b44 -R 7d7dff82d0b7963bbc938a7ab08b7358 +P d4755aca4b435eed62b54af84013f7f176d3fa5b7b1c243555d59de5749fcde5 +R 3812a38c433825e4f80a93981d20e5e0 U drh -Z b7b0b5e48d9017530c5e5509ff9ff70f +Z 5ba0d1eb2891e71e20f27e0a9eeff5ee diff --git a/manifest.uuid b/manifest.uuid index 776dac85c7..1caa679680 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d4755aca4b435eed62b54af84013f7f176d3fa5b7b1c243555d59de5749fcde5 \ No newline at end of file +0f748fe58bbbb7ce3f30303da25ec811b2bbce249549aa9c7927979ac5b38013 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4e8251bd89..f69b2a6217 100644 --- a/src/expr.c +++ b/src/expr.c @@ -44,8 +44,8 @@ char sqlite3TableColumnAffinity(Table *pTab, int iCol){ */ char sqlite3ExprAffinity(Expr *pExpr){ int op; - pExpr = sqlite3ExprSkipCollate(pExpr); if( pExpr->flags & EP_Generic ) return 0; + pExpr = sqlite3ExprSkipCollate(pExpr); op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); diff --git a/test/in.test b/test/in.test index 075095c6b3..c247f2e070 100644 --- a/test/in.test +++ b/test/in.test @@ -734,6 +734,20 @@ do_execsql_test in-16.2 { ORDER BY a DESC, b; } {} - +# 2019-06-11 +# https://www.sqlite.org/src/info/57353f8243c637c0 +# +do_execsql_test in-17.1 { + SELECT 1 IN ('1'); +} 0 +do_execsql_test in-17.2 { + SELECT 1 IN ('1' COLLATE nocase); +} 0 +do_execsql_test in-17.3 { + SELECT 1 IN (CAST('1' AS text)); +} 0 +do_execsql_test in-17.4 { + SELECT 1 IN (CAST('1' AS text) COLLATE nocase); +} 0 finish_test From a7d6db6ac05cb7d51c19494feba51a65c6a21cd2 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 11 Jun 2019 21:02:15 +0000 Subject: [PATCH 68/96] The affinity of the unlikely() function and its cousins should be "none". Ticket [0c620df60bffd9ef] FossilOrigin-Name: 614ecb0af47038848e8ba2aed6b92db6f33ddc4aea6361795dbde440380f5a35 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 8 ++++++-- src/resolve.c | 2 +- src/sqliteInt.h | 2 +- test/func3.test | 13 +++++++++++++ 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 0ba7dea5f1..4757a000bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\saffinity\sof\sthe\sRHS\sof\san\sIN\soperator\sdoes\snot\saffect\sthe\noutcome\seven\sif\sthe\sRHS\sexpression\scontains\sa\sCOLLATE\sclause.\nTicket\s[57353f8243c637c0] -D 2019-06-11T18:07:53.447 +C The\saffinity\sof\sthe\sunlikely()\sfunction\sand\sits\scousins\sshould\sbe\s"none".\nTicket\s[0c620df60bffd9ef] +D 2019-06-11T21:02:15.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 2e0fb76763e2af1e9cf641e68706f0d8969401d93fa864762f7f075c49b447ce +F src/expr.c d1eeebc0ffcbd16759a9c838f8fe7de334bb0ff2afcc3a7ab9f9b5693b99f4cd F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6 +F src/resolve.c 38228d41d6ced02561463f568117afd72f3b90f22f24e790ec6437945e8f6cf9 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a8 F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 3f4d665dff31c852e9b724b0ec27f84af0d8c500eb0391d713faccdd86a3d379 +F src/sqliteInt.h dc9ec3b8754d28700d32302291c03fe048198fa1c8c491c3515cb41759e77e35 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -987,7 +987,7 @@ F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test e4313baba80bf933e58eb89a7c617bec0f0c348c862b096ec4387f36e05ad0a6 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test d202a7606d23f90988a664e88e268aed1087c11c +F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f F test/func5.test cdd224400bc3e48d891827cc913a57051a426fa4 F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d4755aca4b435eed62b54af84013f7f176d3fa5b7b1c243555d59de5749fcde5 -R 3812a38c433825e4f80a93981d20e5e0 +P 0f748fe58bbbb7ce3f30303da25ec811b2bbce249549aa9c7927979ac5b38013 +R fb267b0bd7f9dcadb198290597e652f2 U drh -Z 5ba0d1eb2891e71e20f27e0a9eeff5ee +Z c4bdfa1d3f232dffc50e68442790540c diff --git a/manifest.uuid b/manifest.uuid index 1caa679680..b7cfd5422f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f748fe58bbbb7ce3f30303da25ec811b2bbce249549aa9c7927979ac5b38013 \ No newline at end of file +614ecb0af47038848e8ba2aed6b92db6f33ddc4aea6361795dbde440380f5a35 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index f69b2a6217..763c7b8ad9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -45,7 +45,11 @@ char sqlite3TableColumnAffinity(Table *pTab, int iCol){ char sqlite3ExprAffinity(Expr *pExpr){ int op; if( pExpr->flags & EP_Generic ) return 0; - pExpr = sqlite3ExprSkipCollate(pExpr); + while( ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + } op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); @@ -106,7 +110,7 @@ Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ ** or likelihood() function at the root of an expression. */ Expr *sqlite3ExprSkipCollate(Expr *pExpr){ - while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ if( ExprHasProperty(pExpr, EP_Unlikely) ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); assert( pExpr->x.pList->nExpr>0 ); diff --git a/src/resolve.c b/src/resolve.c index 65906da90c..b40a5a39ca 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -747,7 +747,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ is_agg = pDef->xFinalize!=0; if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ - ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); + ExprSetProperty(pExpr, EP_Unlikely); if( n==2 ){ pExpr->iTable = exprProbability(pList->a[1].pExpr); if( pExpr->iTable<0 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5c711f952a..664820bf50 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2516,7 +2516,7 @@ struct Expr { #define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ #define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ #define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Skip 0x001000 /* COLLATE, AS, or UNLIKELY */ +#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ #define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ diff --git a/test/func3.test b/test/func3.test index 3b1613b56c..a535bae7b9 100644 --- a/test/func3.test +++ b/test/func3.test @@ -153,6 +153,19 @@ do_test func3-5.39 { db eval {EXPLAIN SELECT unlikely(min(1.0+'2.0',4*11))} } [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}] +# Unlikely() does not preserve the affinity of X. +# ticket https://www.sqlite.org/src/tktview/0c620df60b +# +do_execsql_test func3-5.40 { + SELECT likely(CAST(1 AS INT))=='1'; +} 0 +do_execsql_test func3-5.41 { + SELECT unlikely(CAST(1 AS INT))=='1'; +} 0 +do_execsql_test func3-5.41 { + SELECT likelihood(CAST(1 AS INT),0.5)=='1'; +} 0 + # EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument # X unchanged. From 6ece353f2d2223ec78e63ce972081a047e89a641 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 12 Jun 2019 13:49:32 +0000 Subject: [PATCH 69/96] Handle expressions like "expr IS TRUE COLLATE xyz" in the same way as "expr IS TRUE". Fix for [4d01eda8115b10d1]. FossilOrigin-Name: 5c6146b56a75a94f4baa10e95407c54dd0b9314a57a8702a4b96b15c4d7ac48c --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 1 + src/resolve.c | 4 ++-- src/treeview.c | 2 +- test/istrue.test | 14 ++++++++++++++ 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 4757a000bc..77216e85fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\saffinity\sof\sthe\sunlikely()\sfunction\sand\sits\scousins\sshould\sbe\s"none".\nTicket\s[0c620df60bffd9ef] -D 2019-06-11T21:02:15.752 +C Handle\sexpressions\slike\s"expr\sIS\sTRUE\sCOLLATE\sxyz"\sin\sthe\ssame\sway\sas\s"expr\sIS\sTRUE".\sFix\sfor\s[4d01eda8115b10d1]. +D 2019-06-12T13:49:32.380 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c d1eeebc0ffcbd16759a9c838f8fe7de334bb0ff2afcc3a7ab9f9b5693b99f4cd +F src/expr.c 069de02008e6190bb684db65ca7cbcab65616f415629c3b884223ce9cbdefd61 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 38228d41d6ced02561463f568117afd72f3b90f22f24e790ec6437945e8f6cf9 +F src/resolve.c f71303e7202743e261b2fb885591b29d4bd826a7dc915745fa376fd1a3943f1a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a8 @@ -587,7 +587,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c 56724725c62a0d0f408f7c257475dc33309198afee36a1d18be1bc268b09055e +F src/treeview.c cf03f9f6efb93288c7b9f17374ea48e4ce9111b0bc7e428d6850c3eee532b461 F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -1071,7 +1071,7 @@ F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 62372ad3ddcc5d0eb8ff9097dcb0aad8961bf1b9cb45ba634f6e284695126f9a +F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc5 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0f748fe58bbbb7ce3f30303da25ec811b2bbce249549aa9c7927979ac5b38013 -R fb267b0bd7f9dcadb198290597e652f2 -U drh -Z c4bdfa1d3f232dffc50e68442790540c +P 614ecb0af47038848e8ba2aed6b92db6f33ddc4aea6361795dbde440380f5a35 +R ff535e67a0f998f18172bd430f50d3e5 +U dan +Z 1b38c763ebe911ce5080403db6734d6a diff --git a/manifest.uuid b/manifest.uuid index b7cfd5422f..0c39527915 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -614ecb0af47038848e8ba2aed6b92db6f33ddc4aea6361795dbde440380f5a35 \ No newline at end of file +5c6146b56a75a94f4baa10e95407c54dd0b9314a57a8702a4b96b15c4d7ac48c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 763c7b8ad9..e6dc20222e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1813,6 +1813,7 @@ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ ** and 0 if it is FALSE. */ int sqlite3ExprTruthValue(const Expr *pExpr){ + pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); assert( pExpr->op==TK_TRUEFALSE ); assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); diff --git a/src/resolve.c b/src/resolve.c index b40a5a39ca..658792354d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -930,11 +930,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } case TK_IS: case TK_ISNOT: { - Expr *pRight; + Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); assert( !ExprHasProperty(pExpr, EP_Reduced) ); /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", ** and "x IS NOT FALSE". */ - if( (pRight = pExpr->pRight)->op==TK_ID ){ + if( pRight->op==TK_ID ){ int rc = resolveExprStep(pWalker, pRight); if( rc==WRC_Abort ) return WRC_Abort; if( pRight->op==TK_TRUEFALSE ){ diff --git a/src/treeview.c b/src/treeview.c index 981ae2f692..6b4a98e3ab 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -514,7 +514,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ }; assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); assert( pExpr->pRight ); - assert( pExpr->pRight->op==TK_TRUEFALSE ); + assert( sqlite3ExprSkipCollate(pExpr->pRight)->op==TK_TRUEFALSE ); x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); zUniOp = azOp[x]; break; diff --git a/test/istrue.test b/test/istrue.test index 14c013ffc9..d2768b3798 100644 --- a/test/istrue.test +++ b/test/istrue.test @@ -158,4 +158,18 @@ do_execsql_test istrue-700 { SELECT *,'x' FROM t7 ORDER BY a; } {1 0 1 0 1 x 2 1 0 0 1 x 3 1 0 0 1 x 4 0 1 1 0 x} +do_execsql_test istrue-710 { + SELECT 0.5 IS TRUE COLLATE NOCASE; + SELECT 0.5 IS TRUE COLLATE RTRIM; + SELECT 0.5 IS TRUE COLLATE BINARY; + + SELECT 0.5 IS TRUE; + SELECT 0.5 COLLATE NOCASE IS TRUE; + SELECT 0.0 IS FALSE; + + SELECT 0.0 IS FALSE COLLATE NOCASE; + SELECT 0.0 IS FALSE COLLATE RTRIM; + SELECT 0.0 IS FALSE COLLATE BINARY; +} {1 1 1 1 1 1 1 1 1} + finish_test From 13d04020775b10b252029455d2b8dcfcf49a47e4 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 12 Jun 2019 20:51:38 +0000 Subject: [PATCH 70/96] As a special case, casting '-0.0' into numeric should yield 0. Fix for ticket [674385aeba91c774]. FossilOrigin-Name: 491f0f9bbddb6302536d99abd1ea481fd747ddcf6c6eaaacc0338d147b119081 --- manifest | 16 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 7 +++++-- test/cast.test | 57 ++++++++++++++++++++++++++++++++------------------ 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 77216e85fb..098d8984ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\sexpressions\slike\s"expr\sIS\sTRUE\sCOLLATE\sxyz"\sin\sthe\ssame\sway\sas\s"expr\sIS\sTRUE".\sFix\sfor\s[4d01eda8115b10d1]. -D 2019-06-12T13:49:32.380 +C As\sa\sspecial\scase,\scasting\s'-0.0'\sinto\snumeric\sshould\syield\s0.\nFix\sfor\sticket\s[674385aeba91c774]. +D 2019-06-12T20:51:38.407 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c c970d2b480beca04f9a6a70be70acf07aa1aa261f7a723e5beb986d1a83cd851 +F src/vdbemem.c 9ee3c0373bfc05dc8bf5307a4a92be6bea3055928c4846fdced7e708993b2d6d F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -723,7 +723,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 2067a08edfe4ded14d0eb845731716d397df78d65b69d8045d25950ad9bffad9 +F test/cast.test 6678564470f08a638425d38d7e33da2a3af9b121c7c4136712997e02a250974f F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 614ecb0af47038848e8ba2aed6b92db6f33ddc4aea6361795dbde440380f5a35 -R ff535e67a0f998f18172bd430f50d3e5 -U dan -Z 1b38c763ebe911ce5080403db6734d6a +P 5c6146b56a75a94f4baa10e95407c54dd0b9314a57a8702a4b96b15c4d7ac48c +R 6c86d629a66a89517c28e86d21d1e096 +U drh +Z 50b8926736baa22469a105aadf87c0d7 diff --git a/manifest.uuid b/manifest.uuid index 0c39527915..38b5f79abc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c6146b56a75a94f4baa10e95407c54dd0b9314a57a8702a4b96b15c4d7ac48c \ No newline at end of file +491f0f9bbddb6302536d99abd1ea481fd747ddcf6c6eaaacc0338d147b119081 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 20e1fb77e0..c0e386ef6d 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -693,14 +693,17 @@ int sqlite3VdbeMemRealify(Mem *pMem){ /* Compare a floating point value to an integer. Return true if the two ** values are the same within the precision of the floating point value. ** +** This function assumes that i was obtained by assignment from r1. +** ** For some versions of GCC on 32-bit machines, if you do the more obvious ** comparison of "r1==(double)i" you sometimes get an answer of false even ** though the r1 and (double)i values are bit-for-bit the same. */ int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ double r2 = (double)i; - return memcmp(&r1, &r2, sizeof(r1))==0 - && i >= -2251799813685248 && i < 2251799813685248; + return r1==0.0 + || (memcmp(&r1, &r2, sizeof(r1))==0 + && i >= -2251799813685248 && i < 2251799813685248); } /* diff --git a/test/cast.test b/test/cast.test index 09127ee985..5e134abed6 100644 --- a/test/cast.test +++ b/test/cast.test @@ -183,34 +183,34 @@ do_test cast-1.53 { execsql {SELECT CAST('123.5abc' AS integer)} } 123 -do_test case-1.60 { +do_test cast-1.60 { execsql {SELECT CAST(null AS REAL)} } {{}} -do_test case-1.61 { +do_test cast-1.61 { execsql {SELECT typeof(CAST(null AS REAL))} } {null} -do_test case-1.62 { +do_test cast-1.62 { execsql {SELECT CAST(1 AS REAL)} } {1.0} -do_test case-1.63 { +do_test cast-1.63 { execsql {SELECT typeof(CAST(1 AS REAL))} } {real} -do_test case-1.64 { +do_test cast-1.64 { execsql {SELECT CAST('1' AS REAL)} } {1.0} -do_test case-1.65 { +do_test cast-1.65 { execsql {SELECT typeof(CAST('1' AS REAL))} } {real} -do_test case-1.66 { +do_test cast-1.66 { execsql {SELECT CAST('abc' AS REAL)} } {0.0} -do_test case-1.67 { +do_test cast-1.67 { execsql {SELECT typeof(CAST('abc' AS REAL))} } {real} -do_test case-1.68 { +do_test cast-1.68 { execsql {SELECT CAST(x'31' AS REAL)} } {1.0} -do_test case-1.69 { +do_test cast-1.69 { execsql {SELECT typeof(CAST(x'31' AS REAL))} } {real} @@ -299,7 +299,7 @@ if {[db eval {PRAGMA encoding}]=="UTF-8"} { } 9223372036854774784 } } -do_test case-3.31 { +do_test cast-3.31 { execsql {SELECT CAST(NULL AS numeric)} } {{}} @@ -368,7 +368,7 @@ do_execsql_test cast-5.2 { # ignored because it is no part of the integer prefix. # EVIDENCE-OF: R-24225-46995 For example, "(CAST '123e+5' AS INTEGER)" # results in 123, not in 12300000. -do_execsql_test case-5.3 { +do_execsql_test cast-5.3 { SELECT CAST('123e+5' AS INTEGER); SELECT CAST('123e+5' AS NUMERIC); SELECT CAST('123e+5' AS REAL); @@ -378,7 +378,7 @@ do_execsql_test case-5.3 { # The following does not have anything to do with the CAST operator, # but it does deal with affinity transformations. # -do_execsql_test case-6.1 { +do_execsql_test cast-6.1 { DROP TABLE IF EXISTS t1; CREATE TABLE t1(a NUMERIC); INSERT INTO t1 VALUES @@ -391,28 +391,28 @@ do_execsql_test case-6.1 { # 2019-06-07 # https://www.sqlite.org/src/info/4c2d7639f076aa7c -do_execsql_test case-7.1 { +do_execsql_test cast-7.1 { SELECT CAST('-' AS NUMERIC); } {0} -do_execsql_test case-7.2 { +do_execsql_test cast-7.2 { SELECT CAST('-0' AS NUMERIC); } {0} -do_execsql_test case-7.3 { +do_execsql_test cast-7.3 { SELECT CAST('+' AS NUMERIC); } {0} -do_execsql_test case-7.4 { +do_execsql_test cast-7.4 { SELECT CAST('/' AS NUMERIC); } {0} # 2019-06-07 # https://www.sqlite.org/src/info/e8bedb2a184001bb -do_execsql_test case-7.10 { +do_execsql_test cast-7.10 { SELECT '' - 2851427734582196970; } {-2851427734582196970} -do_execsql_test case-7.11 { +do_execsql_test cast-7.11 { SELECT 0 - 2851427734582196970; } {-2851427734582196970} -do_execsql_test case-7.12 { +do_execsql_test cast-7.12 { SELECT '' - 1; } {-1} @@ -447,5 +447,22 @@ do_execsql_test cast-7.33 { SELECT -CAST('.' AS numeric); } 0 +# 2019-06-12 +# https://www.sqlite.org/src/info/674385aeba91c774 +# +do_execsql_test cast-7.40 { + SELECT CAST('-0.0' AS numeric); +} 0 +do_execsql_test cast-7.41 { + SELECT CAST('0.0' AS numeric); +} 0 +do_execsql_test cast-7.42 { + SELECT CAST('+0.0' AS numeric); +} 0 +do_execsql_test cast-7.43 { + SELECT CAST('-1.0' AS numeric); +} -1 + + finish_test From 0ce974d122875c6e9ac3017660cc7a3746d276af Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 12 Jun 2019 22:46:04 +0000 Subject: [PATCH 71/96] Adjust requirements marks and add new requirements tests. FossilOrigin-Name: ebb81dad1f43dac4636cd44d4055d1d4b198c675f73e23c5a2d8d992ae27fe1f --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/insert.c | 2 +- src/pcache.c | 7 ++++--- test/cast.test | 6 ++---- test/e_expr.test | 32 ++++++++++++++++++++++++++++---- 6 files changed, 45 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 098d8984ab..c68d0b1efe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C As\sa\sspecial\scase,\scasting\s'-0.0'\sinto\snumeric\sshould\syield\s0.\nFix\sfor\sticket\s[674385aeba91c774]. -D 2019-06-12T20:51:38.407 +C Adjust\srequirements\smarks\sand\sadd\snew\srequirements\stests. +D 2019-06-12T22:46:04.741 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 4ffc3aa5d2aed178b501533428a76e150907e92a1e4bf7af4ffbcb0d77e99823 +F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c F src/main.c 3c3925b0bcb4c45687fd52f54c79e98e379252e1d3393f8b7dcccfa26181b661 @@ -512,7 +512,7 @@ F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 026e3e6fff32432166a4eae0bdb78ad09a53c84eb49acb44dc32e49b4c0b8a48 -F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee +F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb @@ -723,7 +723,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 6678564470f08a638425d38d7e33da2a3af9b121c7c4136712997e02a250974f +F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -821,7 +821,7 @@ F test/e_createtable.test 1c602347e73ab80b11b9fa083f47155861aaafcff8054aac9e0b76 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 -F test/e_expr.test 628c1c5990e7df71bee17c83afcf59f31c3d34914b829ac098ee3a72b2f1d061 +F test/e_expr.test e6048fe3901241799c4315bdd625f39dae790ff089c454979ca85f03b644dc6f F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5c6146b56a75a94f4baa10e95407c54dd0b9314a57a8702a4b96b15c4d7ac48c -R 6c86d629a66a89517c28e86d21d1e096 +P 491f0f9bbddb6302536d99abd1ea481fd747ddcf6c6eaaacc0338d147b119081 +R 74b2bba9e3465235032a43b32357bf19 U drh -Z 50b8926736baa22469a105aadf87c0d7 +Z d33ff3e8865e3f4c95fe281e7298214c diff --git a/manifest.uuid b/manifest.uuid index 38b5f79abc..d724b4ed7e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -491f0f9bbddb6302536d99abd1ea481fd747ddcf6c6eaaacc0338d147b119081 \ No newline at end of file +ebb81dad1f43dac4636cd44d4055d1d4b198c675f73e23c5a2d8d992ae27fe1f \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 094b98351e..2fe015fa05 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1425,7 +1425,7 @@ void sqlite3GenerateConstraintChecks( }else{ char *zName = pCheck->a[i].zName; if( zName==0 ) zName = pTab->zName; - if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */ + if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-26383-51744 */ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, onError, zName, P4_TRANSIENT, P5_ConstraintCheck); diff --git a/src/pcache.c b/src/pcache.c index 8311049c5e..9125d5de3f 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -243,9 +243,10 @@ static int numberOfCachePages(PCache *p){ ** suggested cache size is set to N. */ return p->szCache; }else{ - /* IMPLEMENTATION-OF: R-61436-13639 If the argument N is negative, then - ** the number of cache pages is adjusted to use approximately abs(N*1024) - ** bytes of memory. */ + /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the + ** number of cache pages is adjusted to be a number of pages that would + ** use approximately abs(N*1024) bytes of memory based on the current + ** page size. */ return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); } } diff --git a/test/cast.test b/test/cast.test index 5e134abed6..e6795ce456 100644 --- a/test/cast.test +++ b/test/cast.test @@ -419,10 +419,8 @@ do_execsql_test cast-7.12 { # 2019-06-10 # https://www.sqlite.org/src/info/dd6bffbfb6e61db9 # -# EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC -# first does a forced conversion into REAL but then further converts the -# result into INTEGER if and only if the conversion from REAL to INTEGER -# is lossless and reversible. +# EVIDENCE-OF: R-55084-10555 Casting a TEXT or BLOB value into NUMERIC +# yields either an INTEGER or a REAL result. # do_execsql_test cast-7.20 { DROP TABLE IF EXISTS t0; diff --git a/test/e_expr.test b/test/e_expr.test index 66725bd2ee..b8445c273e 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1644,16 +1644,40 @@ do_expr_test e_expr-31.2.4 { } integer 9223372036854775807 -# EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC -# first does a forced conversion into REAL but then further converts the -# result into INTEGER if and only if the conversion from REAL to INTEGER -# is lossless and reversible. +# EVIDENCE-OF: R-55084-10555 Casting a TEXT or BLOB value into NUMERIC +# yields either an INTEGER or a REAL result. +# +# EVIDENCE-OF: R-48945-04866 If the input text looks like an integer +# (there is no decimal point nor exponent) and the value is small enough +# to fit in a 64-bit signed integer, then the result will be INTEGER. +# +# EVIDENCE-OF: R-47045-23194 Input text that looks like floating point +# (there is a decimal point and/or an exponent) and the text describes a +# value that can be losslessly converted back and forth between IEEE 754 +# 64-bit float and a 51-bit signed integer, then the result is INTEGER. # do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11 do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1 +do_expr_test e_expr-32.1.6 {CAST( '9.223372036e14' AS NUMERIC)} integer 922337203600000 +do_expr_test e_expr-32.1.7 {CAST('-9.223372036e14' AS NUMERIC)} integer -922337203600000 +do_expr_test e_expr-32.1.8 {CAST( '9.223372036e15' AS NUMERIC)} real 9223372036000000.0 +do_expr_test e_expr-32.1.9 {CAST('-9.223372036e15' AS NUMERIC)} real -9223372036000000.0 + + +# EVIDENCE-OF: R-50300-26941 Any text input that describes a value +# outside the range of a 64-bit signed integer yields a REAL result. +# +do_expr_test e_expr-32.1.20 { CAST('9223372036854775807' AS numeric) } \ + integer 9223372036854775807 +do_expr_test e_expr-32.1.21 { CAST('9223372036854775808' AS numeric) } \ + real 9.22337203685478e+18 +do_expr_test e_expr-32.1.22 { CAST('-9223372036854775808' AS numeric) } \ + integer -9223372036854775808 +do_expr_test e_expr-32.1.23 { CAST('-9223372036854775809' AS numeric) } \ + real -9.22337203685478e+18 # EVIDENCE-OF: R-30347-18702 Casting a REAL or INTEGER value to NUMERIC # is a no-op, even if a real value could be losslessly converted to an From 4245e0456d8387d867a73ab3d986aabcf3725ff2 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 13 Jun 2019 13:52:46 +0000 Subject: [PATCH 72/96] Fix a minor error in a test script, and harmless compiler warnings in the CLI code. FossilOrigin-Name: eaa34626e497d3af132dd8f13eddbbda89365d369ed43212a5f788175b3d6198 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 6 +++--- test/altertab3.test | 3 +-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index c68d0b1efe..b0b9685620 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\srequirements\smarks\sand\sadd\snew\srequirements\stests. -D 2019-06-12T22:46:04.741 +C Fix\sa\sminor\serror\sin\sa\stest\sscript,\sand\sharmless\scompiler\swarnings\sin\sthe\sCLI\scode. +D 2019-06-13T13:52:46.886 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c f71303e7202743e261b2fb885591b29d4bd826a7dc915745fa376fd1a3943f1a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in 9648bc2035a4dc2a380c863535893dc1d9f8a62bab57b6f2943e530aa62d04a8 +F src/shell.c.in fec94208857c8a4a9524f53b0bdc34cbcf670a20c854507ee95cd407ce4ffcc5 F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 6909f4f31e5fd5622f3ea382b1865e1853fd01cc3f7e6be45e8d10457e7ccf3d +F test/altertab3.test 3d9f15e903b63649511a7217feb2875056d0d89cf006a4d23b976be8b579cd0e F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 491f0f9bbddb6302536d99abd1ea481fd747ddcf6c6eaaacc0338d147b119081 -R 74b2bba9e3465235032a43b32357bf19 +P ebb81dad1f43dac4636cd44d4055d1d4b198c675f73e23c5a2d8d992ae27fe1f +R 3ad45f71cbea41cec7480c2849f85b1a U drh -Z d33ff3e8865e3f4c95fe281e7298214c +Z 6a6eb3ac5cb87ea62f48a0f2f89a912a diff --git a/manifest.uuid b/manifest.uuid index d724b4ed7e..8e9648097b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ebb81dad1f43dac4636cd44d4055d1d4b198c675f73e23c5a2d8d992ae27fe1f \ No newline at end of file +eaa34626e497d3af132dd8f13eddbbda89365d369ed43212a5f788175b3d6198 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ada2900ddc..4c10362761 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6562,7 +6562,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ char *z = azArg[i]; int n; if( z[0]=='-' && z[1]=='-' ) z++; - n = strlen(z); + n = strlen30(z); if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ bFreelist = 0; }else @@ -7299,8 +7299,8 @@ static int do_meta_command(char *zLine, ShellState *p){ }; int filectrl = -1; int iCtrl = -1; - sqlite3_int64 iRes; /* Integer result to display if rc2==1 */ - int isOk = 0; /* 0: usage 1: %lld 2: no-result */ + sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ + int isOk = 0; /* 0: usage 1: %lld 2: no-result */ int n2, i; const char *zCmd = 0; diff --git a/test/altertab3.test b/test/altertab3.test index af89bc9dc2..a3862a097a 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -204,6 +204,7 @@ do_test 8.2.3 { db2 eval { INSERT INTO t2 VALUES (1), (2), (3) } db close } {} +db2 close #------------------------------------------------------------------------- reset_db @@ -220,5 +221,3 @@ do_execsql_test 9.2 { finish_test - - From e25007602b08bc237d828260514b4fe12b901ad4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 13 Jun 2019 14:07:41 +0000 Subject: [PATCH 73/96] Do not use the %lld printf conversion in the platform printf() as some legacy platforms do not support it. FossilOrigin-Name: f8696b60eec0dcacfe92d9a31cbf1436d674140e5447de0cd1c2f52bff6c2be4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b0b9685620..f72bd4d9bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\serror\sin\sa\stest\sscript,\sand\sharmless\scompiler\swarnings\sin\sthe\sCLI\scode. -D 2019-06-13T13:52:46.886 +C Do\snot\suse\sthe\s%lld\sprintf\sconversion\sin\sthe\splatform\sprintf()\sas\ssome\nlegacy\splatforms\sdo\snot\ssupport\sit. +D 2019-06-13T14:07:41.561 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c f71303e7202743e261b2fb885591b29d4bd826a7dc915745fa376fd1a3943f1a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in fec94208857c8a4a9524f53b0bdc34cbcf670a20c854507ee95cd407ce4ffcc5 +F src/shell.c.in ad3405c9995ff875e88ca0822f9c148490266629c49a0e35aeacf5d568b23ae8 F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ebb81dad1f43dac4636cd44d4055d1d4b198c675f73e23c5a2d8d992ae27fe1f -R 3ad45f71cbea41cec7480c2849f85b1a +P eaa34626e497d3af132dd8f13eddbbda89365d369ed43212a5f788175b3d6198 +R 1fb1eed0bdcf9929e26b84b1f1ce5b53 U drh -Z 6a6eb3ac5cb87ea62f48a0f2f89a912a +Z 487ea6fbf33dd8a246af175d9f9eddcb diff --git a/manifest.uuid b/manifest.uuid index 8e9648097b..868ecd43eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eaa34626e497d3af132dd8f13eddbbda89365d369ed43212a5f788175b3d6198 \ No newline at end of file +f8696b60eec0dcacfe92d9a31cbf1436d674140e5447de0cd1c2f52bff6c2be4 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 4c10362761..8b0e3a1cc7 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7396,7 +7396,9 @@ static int do_meta_command(char *zLine, ShellState *p){ utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); rc = 1; }else if( isOk==1 ){ - raw_printf(p->out, "%lld\n", iRes); + char zBuf[100]; + sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); + raw_printf(p->out, "%s\n", zBuf); } }else From 4eb4e4fe7e1e60bbcb5009a43bb6278e0a81edff Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 13 Jun 2019 16:14:53 +0000 Subject: [PATCH 74/96] Add a new requirement mark on the ctime.c code. FossilOrigin-Name: c4b405687b010ee20ec02c42913a0540909d0155c88a4a56194fda99c704279e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/ctime.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f72bd4d9bd..4de3d8c50a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\sthe\s%lld\sprintf\sconversion\sin\sthe\splatform\sprintf()\sas\ssome\nlegacy\splatforms\sdo\snot\ssupport\sit. -D 2019-06-13T14:07:41.561 +C Add\sa\snew\srequirement\smark\son\sthe\sctime.c\scode. +D 2019-06-13T16:14:53.717 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3 F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b +F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eaa34626e497d3af132dd8f13eddbbda89365d369ed43212a5f788175b3d6198 -R 1fb1eed0bdcf9929e26b84b1f1ce5b53 +P f8696b60eec0dcacfe92d9a31cbf1436d674140e5447de0cd1c2f52bff6c2be4 +R d629c2a79ba0d4b863d7e3516a4b3f0e U drh -Z 487ea6fbf33dd8a246af175d9f9eddcb +Z 26c2a9c5cf62b22c3542f90299b66f73 diff --git a/manifest.uuid b/manifest.uuid index 868ecd43eb..251d32c58e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8696b60eec0dcacfe92d9a31cbf1436d674140e5447de0cd1c2f52bff6c2be4 \ No newline at end of file +c4b405687b010ee20ec02c42913a0540909d0155c88a4a56194fda99c704279e \ No newline at end of file diff --git a/src/ctime.c b/src/ctime.c index 27fc4fe6c2..ebb6e85915 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -14,7 +14,7 @@ ** SQLite was built with. */ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */ /* ** Include the configuration header output by 'configure' if we're using the From 060b7fa9745e1439ce1d9be96bb921b98b0a6da3 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 14 Jun 2019 12:28:21 +0000 Subject: [PATCH 75/96] Refactor the LIKE optimization decision logic so that it uses sqlite3AtoF() on both boundary keys to determine if the optimization can be used when the LHS is something that might not have TEXT affinity. Ticket [ce8717f0885af975]. See also [c94369cae9b561b1], [b043a54c3de54b28], [fd76310a5e843e07], and [158290c0abafde67]. FossilOrigin-Name: b4a9e09e60213ccff925d09f0b6e549e2a3e3862856c710f108779e2867dec76 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/whereexpr.c | 41 +++++++++++++++++++++------------------- test/like3.test | 9 +++++++++ test/tkt-78e04e52ea.test | 2 +- test/vtab1.test | 16 +++++++++++----- test/vtabH.test | 20 +++++++++++++++++--- 7 files changed, 71 insertions(+), 39 deletions(-) diff --git a/manifest b/manifest index 4de3d8c50a..89460f0100 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\snew\srequirement\smark\son\sthe\sctime.c\scode. -D 2019-06-13T16:14:53.717 +C Refactor\sthe\sLIKE\soptimization\sdecision\slogic\sso\sthat\sit\suses\nsqlite3AtoF()\son\sboth\sboundary\skeys\sto\sdetermine\sif\sthe\soptimization\scan\sbe\nused\swhen\sthe\sLHS\sis\ssomething\sthat\smight\snot\shave\sTEXT\saffinity.\nTicket\s[ce8717f0885af975].\s\sSee\salso\s[c94369cae9b561b1],\n[b043a54c3de54b28],\s[fd76310a5e843e07],\sand\s[158290c0abafde67]. +D 2019-06-14T12:28:21.568 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 99c7b718ef846ac952016083aaf4e22ede2290beceaf4730a2df55c023251369 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a -F src/whereexpr.c d0683adb125754b3edd44d7c73fa2e4ea175eaacd900f1dc6993da2f6f0149cc +F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 F src/window.c 5be2cf7d8763cc97137fc44d015aed8a1a4a56fe9700d7933ed560172617c756 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1095,7 +1095,7 @@ F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 F test/like.test 5013f18e7242fe118524fcf8e484b8827bcd5906b509d106f3587c7bfcf274ae F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test ac61947ef35bde9d97718bcfa04659a17d9218f1fffc4104b135b3f82ed43836 +F test/like3.test 62bf82ac674b7d4126e73532e1ad96cdcd8e1752a4ed90b28a6f98305f5a66aa F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 @@ -1427,7 +1427,7 @@ F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 F test/tkt-5ee23731f.test 9db6e1d7209dc0794948b260d6f82b2b1de83a9f F test/tkt-6bfb98dfc0.test 24780633627b5cfc0635a5500c2389ebfb563336 F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf -F test/tkt-78e04e52ea.test 1b5be1bac961833a9fd70fe50738cb4064822c61f82c54f7d488435ec806ea62 +F test/tkt-78e04e52ea.test cb44d0f5e7940223be740a39913a1b9b9b30d7e4a17ed3349141f893bae1b8f2 F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 @@ -1606,7 +1606,7 @@ F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test 40d54c9ddf5b9fdee692bf936d3352159fe467838f92742aa1d08c7c7d1eac73 -F test/vtab1.test 60b4f70aafa6078d6fdfc11417af3bd216d7ef5eafce16707a6ca3dae5166d20 +F test/vtab1.test 47b935205d7b6290765973abd6fce0e13e94e040017099170f43f81886efa5ba F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1621,7 +1621,7 @@ F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test 3cf9aa1c1c4381b3b3ac33f933376f06fbb99d2294a83c79b7562d3ed87be450 +F test/vtabH.test e65540eed0f7434cdf0b160374570b51f3e3179548f0fa5e99b1d33f8dcdf9a0 F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f8696b60eec0dcacfe92d9a31cbf1436d674140e5447de0cd1c2f52bff6c2be4 -R d629c2a79ba0d4b863d7e3516a4b3f0e +P c4b405687b010ee20ec02c42913a0540909d0155c88a4a56194fda99c704279e +R 169cc5ff08963701bea2f41ccb640ca5 U drh -Z 26c2a9c5cf62b22c3542f90299b66f73 +Z 338301df57dfe8eacff0a4b94bfd0060 diff --git a/manifest.uuid b/manifest.uuid index 251d32c58e..a05adedae2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4b405687b010ee20ec02c42913a0540909d0155c88a4a56194fda99c704279e \ No newline at end of file +b4a9e09e60213ccff925d09f0b6e549e2a3e3862856c710f108779e2867dec76 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index db460652ce..9ac940c5a0 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -264,28 +264,31 @@ static int isLikeOrGlob( zNew[iTo] = 0; assert( iTo>0 ); - /* If the RHS begins with a digit, a +/- sign or whitespace, then the - ** LHS must be an ordinary column (not a virtual table column) with - ** TEXT affinity. Otherwise the LHS might be numeric and "lhs >= rhs" - ** would be false even though "lhs LIKE rhs" is true. But if the RHS - ** does not start with a digit or +/-, then "lhs LIKE rhs" will always - ** be false if the LHS is numeric and so the optimization still works. + /* If the LHS is not an ordinary column with TEXT affinity, then the + ** pattern prefix boundaries (both the start and end boundaries) must + ** not look like a number. Otherwise the pattern might be treated as + ** a number, which will invalidate the LIKE optimization. ** - ** 2018-09-10 ticket c94369cae9b561b1f996d0054bfab11389f9d033 - ** The RHS pattern must not be '/%' because the termination condition - ** will then become "x<'0'" and if the affinity is numeric, will then - ** be converted into "x<0", which is incorrect. + ** Getting this right has been a persistent source of bugs in the + ** LIKE optimization. See, for example: + ** 2018-09-10 https://sqlite.org/src/info/c94369cae9b561b1 + ** 2019-05-02 https://sqlite.org/src/info/b043a54c3de54b28 + ** 2019-06-10 https://sqlite.org/src/info/fd76310a5e843e07 + ** 2019-06-14 https://sqlite.org/src/info/ce8717f0885af975 */ - if( sqlite3Isdigit(zNew[0]) - || sqlite3Isspace(zNew[0]) - || zNew[0]=='-' - || zNew[0]=='+' - || zNew[iTo-1]=='0'-1 + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ ){ - if( pLeft->op!=TK_COLUMN - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ - ){ + int isNum; + double rDummy; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + if( isNum<=0 ){ + zNew[iTo-1]++; + isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); + zNew[iTo-1]--; + } + if( isNum>0 ){ sqlite3ExprDelete(db, pPrefix); sqlite3ValueFree(pVal); return 0; diff --git a/test/like3.test b/test/like3.test index 5e75571b61..f64fb637be 100644 --- a/test/like3.test +++ b/test/like3.test @@ -198,6 +198,15 @@ do_execsql_test like3-5.400 { SELECT * FROM t0 WHERE t0.c0 LIKE './'; } {./} +# 2019-06-14 +# Ticket https://www.sqlite.org/src/info/ce8717f0885af975 +do_execsql_test like3-5.410 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 INT UNIQUE COLLATE NOCASE); + INSERT INTO t0(c0) VALUES ('.1%'); + SELECT * FROM t0 WHERE t0.c0 LIKE '.1%'; +} {.1%} + # 2019-02-27 # Verify that the LIKE optimization works with an ESCAPE clause when diff --git a/test/tkt-78e04e52ea.test b/test/tkt-78e04e52ea.test index 47a1093dd8..a432e6c22b 100644 --- a/test/tkt-78e04e52ea.test +++ b/test/tkt-78e04e52ea.test @@ -41,7 +41,7 @@ do_test tkt-78e04-1.3 { } } {} do_test tkt-78e04-1.4 { - db eval {EXPLAIN QUERY PLAN SELECT "" FROM "" WHERE "" LIKE '1abc%';} + db eval {EXPLAIN QUERY PLAN SELECT "" FROM "" WHERE "" LIKE '1e5%';} } {/*SCAN TABLE USING COVERING INDEX i1*/} do_test tkt-78e04-1.5 { execsql { diff --git a/test/vtab1.test b/test/vtab1.test index 193a53acf7..8280715cdc 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -1311,10 +1311,13 @@ foreach {tn sql res filter} { {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} 8 9} 1.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8J%} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8J%} 1.4 "SELECT a FROM e6 WHERE b LIKE '8j%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8j%} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8j%} + + 1.5 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%} } { set echo_module {} do_execsql_test 18.$tn.1 $sql $res @@ -1323,11 +1326,14 @@ foreach {tn sql res filter} { do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON } foreach {tn sql res filter} { - 2.1 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8J%} + 2.1 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%} 2.2 "SELECT a FROM e6 WHERE b LIKE '8j%'" {} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8j%} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8j 8k 8j%} + + 2.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8K 8J%} } { set echo_module {} do_execsql_test 18.$tn.1 $sql $res diff --git a/test/vtabH.test b/test/vtabH.test index 56c12544f8..78b156cb63 100644 --- a/test/vtabH.test +++ b/test/vtabH.test @@ -32,13 +32,27 @@ do_execsql_test 1.0 { foreach {tn sql expect} { 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" { - xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} - xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8abc + xBestIndex + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} + xFilter + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} + 8ABC 8abd 8abc } 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" { + xBestIndex + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} + xFilter + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} + 8abc 8abd 8abc + } + 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" { + xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} + xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/ + } + 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" { xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?} - xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8abc + xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/ } } { do_test 1.$tn { From 821afa44c13e1bbe0de726dbace1145bf38b057f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 14 Jun 2019 13:24:46 +0000 Subject: [PATCH 76/96] Fix the implementation of the built-in RTRIM collating sequence so that it works for control characters at the end of the string. Ticket [f1580ba1b574e9e9] FossilOrigin-Name: 86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/main.c | 51 ++++++++++++++++++++-------------------------- test/collate1.test | 16 +++++++++++++++ 4 files changed, 46 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index 89460f0100..5dd3342ee8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sthe\sLIKE\soptimization\sdecision\slogic\sso\sthat\sit\suses\nsqlite3AtoF()\son\sboth\sboundary\skeys\sto\sdetermine\sif\sthe\soptimization\scan\sbe\nused\swhen\sthe\sLHS\sis\ssomething\sthat\smight\snot\shave\sTEXT\saffinity.\nTicket\s[ce8717f0885af975].\s\sSee\salso\s[c94369cae9b561b1],\n[b043a54c3de54b28],\s[fd76310a5e843e07],\sand\s[158290c0abafde67]. -D 2019-06-14T12:28:21.568 +C Fix\sthe\simplementation\sof\sthe\sbuilt-in\sRTRIM\scollating\ssequence\sso\sthat\nit\sworks\sfor\scontrol\scharacters\sat\sthe\send\sof\sthe\sstring.\nTicket\s[f1580ba1b574e9e9] +D 2019-06-14T13:24:46.956 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c 3c3925b0bcb4c45687fd52f54c79e98e379252e1d3393f8b7dcccfa26181b661 +F src/main.c ac968e9464bededb29b23d654f60645039631a9f5885e1c481f435381af55203 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -730,7 +730,7 @@ F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b13 F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8 F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test 08c18e7512a5a32c97938854263fa15362eeb846 +F test/collate1.test f9b653f515ef3324a0c4e3c6adbf136bb1903622af678d482a60c11c9c054e6c F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c4b405687b010ee20ec02c42913a0540909d0155c88a4a56194fda99c704279e -R 169cc5ff08963701bea2f41ccb640ca5 +P b4a9e09e60213ccff925d09f0b6e549e2a3e3862856c710f108779e2867dec76 +R c907d65d9b1a85d364fe810800c1a6e0 U drh -Z 338301df57dfe8eacff0a4b94bfd0060 +Z 282306ba184d64b78bcec7f67e84b8b9 diff --git a/manifest.uuid b/manifest.uuid index a05adedae2..d0b883c39d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b4a9e09e60213ccff925d09f0b6e549e2a3e3862856c710f108779e2867dec76 \ No newline at end of file +86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6358457c85..0dd8e294f5 100644 --- a/src/main.c +++ b/src/main.c @@ -875,28 +875,17 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ return rc; } - -/* -** Return true if the buffer z[0..n-1] contains all spaces. -*/ -static int allSpaces(const char *z, int n){ - while( n>0 && z[n-1]==' ' ){ n--; } - return n==0; -} - /* ** This is the default collating function named "BINARY" which is always ** available. -** -** If the padFlag argument is not NULL then space padding at the end -** of strings is ignored. This implements the RTRIM collation. */ static int binCollFunc( - void *padFlag, + void *NotUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2 ){ int rc, n; + UNUSED_PARAMETER(NotUsed); n = nKey1xCmp!=binCollFunc || p->pUser!=0 - || strcmp(p->zName,"BINARY")==0 ); - return p==0 || (p->xCmp==binCollFunc && p->pUser==0); + assert( p==0 || p->xCmp!=binCollFunc || strcmp(p->zName,"BINARY")==0 ); + return p==0 || p->xCmp==binCollFunc; } /* @@ -3128,7 +3121,7 @@ static int openDatabase( createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); - createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); + createCollation(db, "RTRIM", SQLITE_UTF8, 0, rtrimCollFunc, 0); if( db->mallocFailed ){ goto opendb_out; } diff --git a/test/collate1.test b/test/collate1.test index 7cf5698454..a1623f07e6 100644 --- a/test/collate1.test +++ b/test/collate1.test @@ -400,5 +400,21 @@ do_execsql_test 7.2 { ORDER BY 1 COLLATE binary COLLATE binary COLLATE binary COLLATE nocase; } {abc DEF} +# 2019-06-14 +# https://sqlite.org/src/info/f1580ba1b574e9e9 +# +do_execsql_test 8.0 { + SELECT ' ' > char(20) COLLATE rtrim; +} 0 +do_execsql_test 8.1 { + SELECT '' < char(20) COLLATE rtrim; +} 1 +do_execsql_test 8.2 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 COLLATE RTRIM, c1 BLOB UNIQUE, + PRIMARY KEY (c0, c1)) WITHOUT ROWID; + INSERT INTO t0 VALUES (123, 3), (' ', 1), (' ', 2), ('', 4); + SELECT * FROM t0 WHERE c1 = 1; +} {{ } 1} finish_test From c164cc992f48ff70b569ca3acd143cbb41f7c03c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 14 Jun 2019 17:37:39 +0000 Subject: [PATCH 77/96] Deprecate the SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option when it is turned off. This probably will impact no-one. If it does, they will get an error message instructing them to contact developers, so that we can get feedback that somebody is actually using this feature. Start-time disabling of covering index scan is not affected. FossilOrigin-Name: 23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/global.c | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5dd3342ee8..81bfb45017 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\simplementation\sof\sthe\sbuilt-in\sRTRIM\scollating\ssequence\sso\sthat\nit\sworks\sfor\scontrol\scharacters\sat\sthe\send\sof\sthe\sstring.\nTicket\s[f1580ba1b574e9e9] -D 2019-06-14T13:24:46.956 +C Deprecate\sthe\sSQLITE_ALLOW_COVERING_INDEX_SCAN\scompile-time\soption\swhen\sit\sis\nturned\soff.\s\sThis\sprobably\swill\simpact\sno-one.\s\sIf\sit\sdoes,\sthey\swill\sget\san\nerror\smessage\sinstructing\sthem\sto\scontact\sdevelopers,\sso\sthat\swe\scan\sget\nfeedback\sthat\ssomebody\sis\sactually\susing\sthis\sfeature.\s\sStart-time\sdisabling\nof\scovering\sindex\sscan\sis\snot\saffected. +D 2019-06-14T17:37:39.865 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/expr.c 069de02008e6190bb684db65ca7cbcab65616f415629c3b884223ce9cbdefd61 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 -F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec +F src/global.c 1e942b1e6fb6a2a15e6015bda72be0abefc4b1339a8640a47b1b71b7f317917b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b4a9e09e60213ccff925d09f0b6e549e2a3e3862856c710f108779e2867dec76 -R c907d65d9b1a85d364fe810800c1a6e0 +P 86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 +R 873943208d4923d363fce49df4a77550 U drh -Z 282306ba184d64b78bcec7f67e84b8b9 +Z 6ba03e4464eda00fcc57e65ad21625a8 diff --git a/manifest.uuid b/manifest.uuid index d0b883c39d..f8ddc254b0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 \ No newline at end of file +23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 \ No newline at end of file diff --git a/src/global.c b/src/global.c index a78ea65a7f..b512e6f0bb 100644 --- a/src/global.c +++ b/src/global.c @@ -153,8 +153,15 @@ const unsigned char sqlite3CtypeMap[256] = { ** SQLITE_ALLOW_COVERING_INDEX_SCAN compile-time option, or is "on" if ** that compile-time option is omitted. */ -#ifndef SQLITE_ALLOW_COVERING_INDEX_SCAN +#if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) # define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#else +# if !SQLITE_ALLOW_COVERING_INDEX_SCAN +# error "Compile-time disabling of covering index scan using the\ + -DSQLITE_ALLOW_COVERING_INDEX_SCAN=0 option is deprecated.\ + Contact SQLite developers if this is a problem for you, and\ + delete this #error macro to continue with your build." +# endif #endif /* The minimum PMA size is set to this value multiplied by the database From 0a6873bfd65233d242fd17ec818ac57593f25540 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 14 Jun 2019 21:25:25 +0000 Subject: [PATCH 78/96] Add SQLITE_DBCONFIG options LEGACY_ALTER_TABLE, NO_DQS_SCHEMA, and NO_DQS. FossilOrigin-Name: 1fad20925efa70d0c242e9cba8fa55456fb07a81229c1068da84c6e27d0c0be8 --- manifest | 25 ++++++++++++++----------- manifest.uuid | 2 +- src/main.c | 4 ++++ src/resolve.c | 10 ++++++++-- src/shell.c.in | 22 +++++++++++++--------- src/sqlite.h.in | 30 +++++++++++++++++++++++++++++- src/sqliteInt.h | 2 ++ src/test1.c | 22 +++++++++++++--------- 8 files changed, 84 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index 81bfb45017..f79a8e3714 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Deprecate\sthe\sSQLITE_ALLOW_COVERING_INDEX_SCAN\scompile-time\soption\swhen\sit\sis\nturned\soff.\s\sThis\sprobably\swill\simpact\sno-one.\s\sIf\sit\sdoes,\sthey\swill\sget\san\nerror\smessage\sinstructing\sthem\sto\scontact\sdevelopers,\sso\sthat\swe\scan\sget\nfeedback\sthat\ssomebody\sis\sactually\susing\sthis\sfeature.\s\sStart-time\sdisabling\nof\scovering\sindex\sscan\sis\snot\saffected. -D 2019-06-14T17:37:39.865 +C Add\sSQLITE_DBCONFIG\soptions\sLEGACY_ALTER_TABLE,\sNO_DQS_SCHEMA,\sand\sNO_DQS. +D 2019-06-14T21:25:25.591 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c ac968e9464bededb29b23d654f60645039631a9f5885e1c481f435381af55203 +F src/main.c a511e378ab8e839f77e041347fe045194b9f4b2203050c6dbfdb75902ff628c2 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -520,19 +520,19 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c f71303e7202743e261b2fb885591b29d4bd826a7dc915745fa376fd1a3943f1a +F src/resolve.c 8fd2fca510e8ae7457f37f294809900d232a2e5c121943bb9e52068ae885a644 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in ad3405c9995ff875e88ca0822f9c148490266629c49a0e35aeacf5d568b23ae8 -F src/sqlite.h.in e80973893802ec7980a602a449c93527f9265f1295ad156c83cbb48f9b58ce4e +F src/shell.c.in 21e30c2cf16aa873c9ce2cd6ca1c8933c830e69b73c1e74f4fdffbda80e9c356 +F src/sqlite.h.in e9a463ea16100b54f02b4063dc96a0add392c4a92963c50bfd6eb0324e118f3b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h dc9ec3b8754d28700d32302291c03fe048198fa1c8c491c3515cb41759e77e35 +F src/sqliteInt.h 377ffa32933137d5ce140713315df34263ddf2f68150a63fce51e4cd52ed0194 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c f4e0be5c344587b2beac474a58018a3833208fb6bbec35d37d58b1270a7a5917 +F src/test1.c 15752c6299f43e3e96004516d6a4895cc02fce6cb6da71dd4eeeeb922b8e10fb F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -1830,7 +1830,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 -R 873943208d4923d363fce49df4a77550 +P 23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 +R 9bfbb0e600d24d42989c08db0f349d57 +T *branch * new-dbconfig-options +T *sym-new-dbconfig-options * +T -sym-trunk * U drh -Z 6ba03e4464eda00fcc57e65ad21625a8 +Z 30e1c14e70d492d05922ad996c549711 diff --git a/manifest.uuid b/manifest.uuid index f8ddc254b0..474ecfa45a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 \ No newline at end of file +1fad20925efa70d0c242e9cba8fa55456fb07a81229c1068da84c6e27d0c0be8 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 0dd8e294f5..0596ce81b6 100644 --- a/src/main.c +++ b/src/main.c @@ -845,6 +845,9 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| SQLITE_NoSchemaError }, + { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, + { SQLITE_DBCONFIG_NO_DQS_SCHEMA, SQLITE_NoDQSSchema }, + { SQLITE_DBCONFIG_NO_DQS, SQLITE_NoDQS }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -3071,6 +3074,7 @@ static int openDatabase( db->nextPagesize = 0; db->nMaxSorterMmap = 0x7FFFFFFF; db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_CacheSpill + | SQLITE_NoDQSSchema #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX | SQLITE_AutoIndex #endif diff --git a/src/resolve.c b/src/resolve.c index 658792354d..ddb1bcfcb6 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -477,7 +477,8 @@ static int lookupName( if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) - && 0==(pTopNC->ncFlags&NC_NoDblQStr) + && 0==(pTopNC->ncFlags&NC_NoDblQStr) + && 0==(db->flags & SQLITE_NoDQS) ){ /* If a double-quoted identifier does not match any known column name, ** then treat it as a string. @@ -1771,7 +1772,12 @@ int sqlite3ResolveSelfReference( sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; - if( !pParse->db->init.busy && !sqlite3WritableSchema(pParse->db) ){ + if( (pParse->db->flags & SQLITE_NoDQS)!=0 + || (!pParse->db->init.busy + && !sqlite3WritableSchema(pParse->db) + && (pParse->db->flags & SQLITE_NoDQSSchema)!=0 + ) + ){ sNC.ncFlags |= NC_NoDblQStr; } if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; diff --git a/src/shell.c.in b/src/shell.c.in index 8b0e3a1cc7..d72b419474 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7075,15 +7075,19 @@ static int do_meta_command(char *zLine, ShellState *p){ const char *zName; int op; } aDbConfig[] = { - { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, - { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, - { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, - { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, - { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, - { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, - { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, - { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, - { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, + { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, + { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, + { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, + { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, + { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, + { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, + { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, + { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, + { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, + { "wriable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, + { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, + { "no_dqs_schema", SQLITE_DBCONFIG_NO_DQS_SCHEMA }, + { "no_dqs", SQLITE_DBCONFIG_NO_DQS }, }; int ii, v; open_db(p, 0); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f6054c17eb..9c61408946 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2220,6 +2220,31 @@ struct sqlite3_mem_methods { ** integer into which is written 0 or 1 to indicate whether the writable_schema ** is enabled or disabled following this call. ** +** +** [[SQLITE_DBCONFIG_LEGACY_ALTER_TABLE]] +**

SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
+**
The SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option activates or deactivates +** the legacy behavior of the [ALTER TABLE RENAME] command such it +** behaves as it did prior to [version 3.24.0] (2018-06-04). See the +** "Compatibility Notice" on the [ALTER TABLE RENAME documentation] for +** additional information. This feature can also be turned on and off +** using the [PRAGMA legacy_alter_table] statement. +**
+** +** [[SQLITE_DBCONFIG_NO_DQS_SCHEMA]] +**
SQLITE_DBCONFIG_NO_DQS_SCHEMA +**
The SQLITE_DBCONFIG_NO_DQS_SCHEMA option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DDL statements. +**
+** +** [[SQLITE_DBCONFIG_NO_DQS]] +**
SQLITE_DBCONFIG_NO_DQS +**
The SQLITE_DBCONFIG_NO_DQS option activates or deactivates +** the legacy [double-quoted string literal] misfeature. The +** double-quoted string literal misfeature is on by default for +** compatibility, though it might become off by default in some +** future release of SQLite. +**
** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2234,7 +2259,10 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ #define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ #define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1011 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ +#define SQLITE_DBCONFIG_NO_DQS_SCHEMA 1013 /* int int* */ +#define SQLITE_DBCONFIG_NO_DQS 1014 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1014 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 664820bf50..1585fb9e5d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1548,6 +1548,8 @@ struct sqlite3 { #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ #define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ #define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ +#define SQLITE_NoDQSSchema 0x20000000 /* No dbl-quote strings in CREATE */ +#define SQLITE_NoDQS 0x40000000 /* No double-quoted strings anywhere*/ /* Flags used only if debugging */ #define HI(X) ((u64)(X)<<32) diff --git a/src/test1.c b/src/test1.c index be31ee110b..f7b6e25e79 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7608,15 +7608,19 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( const char *zName; int eVal; } aSetting[] = { - { "FKEY", SQLITE_DBCONFIG_ENABLE_FKEY }, - { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER }, - { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, - { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, - { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, - { "QPSG", SQLITE_DBCONFIG_ENABLE_QPSG }, - { "TRIGGER_EQP", SQLITE_DBCONFIG_TRIGGER_EQP }, - { "RESET_DB", SQLITE_DBCONFIG_RESET_DATABASE }, - { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE }, + { "FKEY", SQLITE_DBCONFIG_ENABLE_FKEY }, + { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER }, + { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, + { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, + { "NO_CKPT_ON_CLOSE", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, + { "QPSG", SQLITE_DBCONFIG_ENABLE_QPSG }, + { "TRIGGER_EQP", SQLITE_DBCONFIG_TRIGGER_EQP }, + { "RESET_DB", SQLITE_DBCONFIG_RESET_DATABASE }, + { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE }, + { "WRITABLE_SCHEMA", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, + { "LEGACY_ALTER_TABLE", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, + { "NO_DQS_SCHEMA", SQLITE_DBCONFIG_NO_DQS_SCHEMA }, + { "NO_DQS", SQLITE_DBCONFIG_NO_DQS }, }; int i; int v; From bdf4cf0b900792a0565e743f98707a493f490961 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 15 Jun 2019 15:21:49 +0000 Subject: [PATCH 79/96] Ensure that sqlite3RenameExprUnmap() does an unmap of the result set alias names in subqueries when ALTER TABLE fails because of a syntax error in a trigger. FossilOrigin-Name: d3b6f1665f6fb5fc5cf1c0864d779d0b24746ada530f755c7b6ff34766bd2188 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 17 +++++++++++++---- test/fuzzdata8.db | Bin 1234944 -> 1239040 bytes 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 81bfb45017..97527f917d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Deprecate\sthe\sSQLITE_ALLOW_COVERING_INDEX_SCAN\scompile-time\soption\swhen\sit\sis\nturned\soff.\s\sThis\sprobably\swill\simpact\sno-one.\s\sIf\sit\sdoes,\sthey\swill\sget\san\nerror\smessage\sinstructing\sthem\sto\scontact\sdevelopers,\sso\sthat\swe\scan\sget\nfeedback\sthat\ssomebody\sis\sactually\susing\sthis\sfeature.\s\sStart-time\sdisabling\nof\scovering\sindex\sscan\sis\snot\saffected. -D 2019-06-14T17:37:39.865 +C Ensure\sthat\ssqlite3RenameExprUnmap()\sdoes\san\sunmap\sof\sthe\sresult\sset\salias\nnames\sin\ssubqueries\swhen\sALTER\sTABLE\sfails\sbecause\sof\sa\ssyntax\serror\sin\sa\ntrigger. +D 2019-06-15T15:21:49.851 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -456,7 +456,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 12f8c9a79ab51f7574998e3ed28dbafe59bbf0e8a435443c80bc788f661586f7 +F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -1006,7 +1006,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db 7f8f849d767a2935ea37a417794672d0508171835a39a55032f490b372732222 +F test/fuzzdata8.db c69ca6d4bf1b25fd56ab432e9b96f2db0da752cfc6aa32700867f3a2d8a0514a F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 86fa0087cd1f5c79ed51b99a226ec2eef5b0fa0a23981d469bec0e02fadf2a68 -R 873943208d4923d363fce49df4a77550 +P 23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 +R f32faa5640204e692c837bae7c67dc11 U drh -Z 6ba03e4464eda00fcc57e65ad21625a8 +Z 183153c8a75202803cdde578595e82c2 diff --git a/manifest.uuid b/manifest.uuid index f8ddc254b0..adbbad2f96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 \ No newline at end of file +d3b6f1665f6fb5fc5cf1c0864d779d0b24746ada530f755c7b6ff34766bd2188 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 4fb2ac93ea..3957edefa0 100644 --- a/src/alter.c +++ b/src/alter.c @@ -731,11 +731,20 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ ** Walker callback used by sqlite3RenameExprUnmap(). */ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + Parse *pParse = pWalker->pParse; + int i; + if( ALWAYS(p->pEList) ){ + ExprList *pList = p->pEList; + for(i=0; inExpr; i++){ + if( pList->a[i].zName ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zName); + } + } + } if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ - Parse *pParse = pWalker->pParse; - int i; - for(i=0; ipSrc->nSrc; i++){ - sqlite3RenameTokenRemap(pParse, 0, (void*)p->pSrc->a[0].zName); + SrcList *pSrc = p->pSrc; + for(i=0; inSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); } } return WRC_Continue; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 990f03d17c7482038fdcf1885e7d25551316b613..4452d295b8f141d6fc93bee6249dc969fc1467af 100644 GIT binary patch delta 22557 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 b2V&`+|0BN-JO2OS55!I(KlK0B@5BBtD%Si- delta 20603 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 Date: Sat, 15 Jun 2019 15:27:37 +0000 Subject: [PATCH 80/96] Add extra test case for one of the problems fixed by the previous commit. FossilOrigin-Name: 0bbceebb126c94b5159079a341fa16e8424b7f2f6b9364561516964e871fb6e0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/altertab3.test | 20 +++++++++++++++++++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 97527f917d..d245f5e6b1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\ssqlite3RenameExprUnmap()\sdoes\san\sunmap\sof\sthe\sresult\sset\salias\nnames\sin\ssubqueries\swhen\sALTER\sTABLE\sfails\sbecause\sof\sa\ssyntax\serror\sin\sa\ntrigger. -D 2019-06-15T15:21:49.851 +C Add\sextra\stest\scase\sfor\sone\sof\sthe\sproblems\sfixed\sby\sthe\sprevious\scommit. +D 2019-06-15T15:27:37.473 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 3d9f15e903b63649511a7217feb2875056d0d89cf006a4d23b976be8b579cd0e +F test/altertab3.test 7a2419829b2b908985b2c83d680388ef2eb9a74e446b68cee7b9b1551ae69078 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 -R f32faa5640204e692c837bae7c67dc11 -U drh -Z 183153c8a75202803cdde578595e82c2 +P d3b6f1665f6fb5fc5cf1c0864d779d0b24746ada530f755c7b6ff34766bd2188 +R d55429e048628dac11cbe9c44c4e7b4d +U dan +Z c3d9c64d7fe6508d21ac15588bb74ca8 diff --git a/manifest.uuid b/manifest.uuid index adbbad2f96..eb993666a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3b6f1665f6fb5fc5cf1c0864d779d0b24746ada530f755c7b6ff34766bd2188 \ No newline at end of file +0bbceebb126c94b5159079a341fa16e8424b7f2f6b9364561516964e871fb6e0 \ No newline at end of file diff --git a/test/altertab3.test b/test/altertab3.test index a3862a097a..863da729c1 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -214,10 +214,28 @@ do_execsql_test 9.1 { SELECT true WHERE (SELECT a, b FROM (t1)) IN (); END; } - do_execsql_test 9.2 { ALTER TABLE t1 RENAME TO t1x; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 10.1 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(a, b, c); + CREATE VIEW v1 AS SELECT * FROM t1 WHERE ( + SELECT t1.a FROM t1, t2 + ) IN () OR t1.a=5; +} + +do_execsql_test 10.2 { + ALTER TABLE t2 RENAME TO t3; + SELECT sql FROM sqlite_master WHERE name='v1'; +} { + {CREATE VIEW v1 AS SELECT * FROM t1 WHERE ( + SELECT t1.a FROM t1, t2 + ) IN () OR t1.a=5} +} + finish_test From e3664dcb4837e94f685606a00aa5da1d4f4c3d3d Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 15 Jun 2019 15:32:37 +0000 Subject: [PATCH 81/96] Fix minor problems in the test code in test_demovfs.c. FossilOrigin-Name: ca4ddfefc1be1afbf366d87c47f0dd1122350d7ab34ba60020c5babb64a654a4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test_demovfs.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d245f5e6b1..522fd6ca91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextra\stest\scase\sfor\sone\sof\sthe\sproblems\sfixed\sby\sthe\sprevious\scommit. -D 2019-06-15T15:27:37.473 +C Fix\sminor\sproblems\sin\sthe\stest\scode\sin\stest_demovfs.c. +D 2019-06-15T15:32:37.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31 F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 F src/test_config.c 5ebafbcd5c75ac1c16bb0c8fe926dc325cc03e780943a88ca50e0d9a4fc4d2f5 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c a0c3bdd45ed044115c2c9f7779e56eafff18741e +F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2 F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d3b6f1665f6fb5fc5cf1c0864d779d0b24746ada530f755c7b6ff34766bd2188 -R d55429e048628dac11cbe9c44c4e7b4d +P 0bbceebb126c94b5159079a341fa16e8424b7f2f6b9364561516964e871fb6e0 +R ad3804e28123fb8cc31cc68386329653 U dan -Z c3d9c64d7fe6508d21ac15588bb74ca8 +Z ba4d1a6df34a3362ceba4b029fa2fe75 diff --git a/manifest.uuid b/manifest.uuid index eb993666a8..2b4cb0fec7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0bbceebb126c94b5159079a341fa16e8424b7f2f6b9364561516964e871fb6e0 \ No newline at end of file +ca4ddfefc1be1afbf366d87c47f0dd1122350d7ab34ba60020c5babb64a654a4 \ No newline at end of file diff --git a/src/test_demovfs.c b/src/test_demovfs.c index ba7af863cd..eaba208732 100644 --- a/src/test_demovfs.c +++ b/src/test_demovfs.c @@ -240,6 +240,9 @@ static int demoRead( if( nRead==iAmt ){ return SQLITE_OK; }else if( nRead>=0 ){ + if( nRead Date: Sun, 16 Jun 2019 08:58:14 +0000 Subject: [PATCH 82/96] Avoid transforming TK_COLLATE or TK_UNLIKELY Expr nodes to TK_REFERENCE. Instead, transform the uppermost Expr node in the expression tree that is not of this type. FossilOrigin-Name: ba7870e292919cf6c2f4b65b63fb0420ba2718eb0a797e0ba5302eec551a4238 --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/expr.c | 3 ++- test/between.test | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 522fd6ca91..1b9d4e7d3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\sproblems\sin\sthe\stest\scode\sin\stest_demovfs.c. -D 2019-06-15T15:32:37.620 +C Avoid\stransforming\sTK_COLLATE\sor\sTK_UNLIKELY\sExpr\snodes\sto\sTK_REFERENCE.\sInstead,\stransform\sthe\suppermost\sExpr\snode\sin\sthe\sexpression\stree\sthat\sis\snot\sof\sthis\stype. +D 2019-06-16T08:58:14.849 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 069de02008e6190bb684db65ca7cbcab65616f415629c3b884223ce9cbdefd61 +F src/expr.c 2756d2875ac5b7a7efcc54edea3c8a31f4126684ded18da6fb406f4d3780a5f5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -692,7 +692,7 @@ F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b792 F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 -F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c +F test/between.test 68137a6e941c221417c15b6fe2d55f27bb1b6ab48bdf9e2aa51efdd85bc53802 F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b @@ -1830,7 +1830,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0bbceebb126c94b5159079a341fa16e8424b7f2f6b9364561516964e871fb6e0 -R ad3804e28123fb8cc31cc68386329653 +P ca4ddfefc1be1afbf366d87c47f0dd1122350d7ab34ba60020c5babb64a654a4 +R 18312679532d55fb24bce06818aa1e91 +T *branch * tkt-e1e07ef2 +T *sym-tkt-e1e07ef2 * +T -sym-trunk * U dan -Z ba4d1a6df34a3362ceba4b029fa2fe75 +Z 0c99556d547b90fce21532cb343b5082 diff --git a/manifest.uuid b/manifest.uuid index 2b4cb0fec7..0fb49d78af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca4ddfefc1be1afbf366d87c47f0dd1122350d7ab34ba60020c5babb64a654a4 \ No newline at end of file +ba7870e292919cf6c2f4b65b63fb0420ba2718eb0a797e0ba5302eec551a4238 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e6dc20222e..c4f201a131 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3387,7 +3387,8 @@ void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ ** register iReg. The caller must ensure that iReg already contains ** the correct value for the expression. */ -static void exprToRegister(Expr *p, int iReg){ +static void exprToRegister(Expr *pExpr, int iReg){ + Expr *p = sqlite3ExprSkipCollate(pExpr); p->op2 = p->op; p->op = TK_REGISTER; p->iTable = iReg; diff --git a/test/between.test b/test/between.test index df4c67995c..e2b25ca3ce 100644 --- a/test/between.test +++ b/test/between.test @@ -119,5 +119,25 @@ do_test between-1.5.3 { } } {4 2 25 27 sort t1 *} +#------------------------------------------------------------------------- +reset_db +do_execsql_test between-2.0 { + CREATE TABLE t1(x TEXT, y TEXT COLLATE nocase); + INSERT INTO t1 VALUES('0', 'abc'); +} + +foreach {tn expr res} { + 1 "x BETWEEN 1 AND '5'" 0 + 2 "x COLLATE binary BETWEEN 1 AND '5'" 0 + 3 "x COLLATE nocase BETWEEN 1 AND '5'" 0 + + 4 "y BETWEEN 'A' AND 'B'" 1 + 5 "y COLLATE nocase BETWEEN 'A' AND 'B'" 1 + 6 "y COLLATE binary BETWEEN 'A' AND 'B'" 0 + 7 "(y COLLATE binary) BETWEEN 'A' AND 'B'" 0 +} { + set sql "SELECT $expr FROM t1" + do_execsql_test between-2.1.$tn $sql $res +} finish_test From d0ff601c62a4873a5808fd072dc573797883ef51 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 17 Jun 2019 13:56:11 +0000 Subject: [PATCH 83/96] Improved interface to double-quoted string literal enabling/disabling. FossilOrigin-Name: 923cfd53fcff2fcb91530bf819d2ecb0eda3f6a27dae29c7460f9ce3a3ffce7b --- manifest | 25 +++++++++++-------------- manifest.uuid | 2 +- src/main.c | 6 +++--- src/resolve.c | 32 ++++++++++++++++++++------------ src/shell.c.in | 4 ++-- src/sqlite.h.in | 25 ++++++++++++------------- src/sqliteInt.h | 7 +++---- src/test1.c | 4 ++-- 8 files changed, 54 insertions(+), 51 deletions(-) diff --git a/manifest b/manifest index f79a8e3714..a2af8f27f5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sSQLITE_DBCONFIG\soptions\sLEGACY_ALTER_TABLE,\sNO_DQS_SCHEMA,\sand\sNO_DQS. -D 2019-06-14T21:25:25.591 +C Improved\sinterface\sto\sdouble-quoted\sstring\sliteral\senabling/disabling. +D 2019-06-17T13:56:11.777 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c a511e378ab8e839f77e041347fe045194b9f4b2203050c6dbfdb75902ff628c2 +F src/main.c e16c702032930fd9d8c0533fed7575f3900022c13a59cc2817e60f07096a005e F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -520,19 +520,19 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 8fd2fca510e8ae7457f37f294809900d232a2e5c121943bb9e52068ae885a644 +F src/resolve.c 93b7bc7c45efa6322d92293361c51a873690daed50cf77eeff88a448246b0d5a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in 21e30c2cf16aa873c9ce2cd6ca1c8933c830e69b73c1e74f4fdffbda80e9c356 -F src/sqlite.h.in e9a463ea16100b54f02b4063dc96a0add392c4a92963c50bfd6eb0324e118f3b +F src/shell.c.in 6edadde44b5b084cb0091340e73061e47c65a40c531befd7566fbfe64cfa85fc +F src/sqlite.h.in bc4aa09a59dcf3c34b8e57ce9ade8ff6aed8ef7a7ddc59951f59f9b009fc7cc0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 377ffa32933137d5ce140713315df34263ddf2f68150a63fce51e4cd52ed0194 +F src/sqliteInt.h bf65dfa6565fae2e0d501088fc9c5212244adc1429a543827a16b2f5eaf41982 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 15752c6299f43e3e96004516d6a4895cc02fce6cb6da71dd4eeeeb922b8e10fb +F src/test1.c f57c229ad7878215d0b3bb5d59ffe94772c099ce5b5e147a4a59d3157923a988 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -1830,10 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 23e49f9984f74f242602c6e56bfc645585c7c86bcdd585c322ab0d8e20958d86 -R 9bfbb0e600d24d42989c08db0f349d57 -T *branch * new-dbconfig-options -T *sym-new-dbconfig-options * -T -sym-trunk * +P 1fad20925efa70d0c242e9cba8fa55456fb07a81229c1068da84c6e27d0c0be8 +R 10b2e303dd1c5747406e48e4085cd8f9 U drh -Z 30e1c14e70d492d05922ad996c549711 +Z 5e32c45febb886d78a377b0ce6c28269 diff --git a/manifest.uuid b/manifest.uuid index 474ecfa45a..4426a06f88 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1fad20925efa70d0c242e9cba8fa55456fb07a81229c1068da84c6e27d0c0be8 \ No newline at end of file +923cfd53fcff2fcb91530bf819d2ecb0eda3f6a27dae29c7460f9ce3a3ffce7b \ No newline at end of file diff --git a/src/main.c b/src/main.c index 0596ce81b6..a70271162a 100644 --- a/src/main.c +++ b/src/main.c @@ -846,8 +846,8 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_WriteSchema| SQLITE_NoSchemaError }, { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, - { SQLITE_DBCONFIG_NO_DQS_SCHEMA, SQLITE_NoDQSSchema }, - { SQLITE_DBCONFIG_NO_DQS, SQLITE_NoDQS }, + { SQLITE_DBCONFIG_DQS_DDL, SQLITE_DqsDDL }, + { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -3074,7 +3074,7 @@ static int openDatabase( db->nextPagesize = 0; db->nMaxSorterMmap = 0x7FFFFFFF; db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_CacheSpill - | SQLITE_NoDQSSchema + | SQLITE_DqsDML #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX | SQLITE_AutoIndex #endif diff --git a/src/resolve.c b/src/resolve.c index ddb1bcfcb6..8dac077eed 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -148,6 +148,23 @@ int sqlite3MatchSpanName( return 1; } +/* +** Return TRUE if the double-quoted string mis-feature should be supported. +*/ +static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ + if( db->init.busy ) return 1; /* Always support for legacy schemas */ + if( pTopNC->ncFlags & NC_IsDDL ){ + /* Currently parsing a DDL statement */ + if( sqlite3WritableSchema(db) && (db->flags & SQLITE_DqsDML)!=0 ){ + return 1; + } + return (db->flags & SQLITE_DqsDDL)!=0; + }else{ + /* Currently parsing a DML statement */ + return (db->flags & SQLITE_DqsDML)!=0; + } +} + /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr @@ -476,9 +493,8 @@ static int lookupName( */ if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); - if( ExprHasProperty(pExpr,EP_DblQuoted) - && 0==(pTopNC->ncFlags&NC_NoDblQStr) - && 0==(db->flags & SQLITE_NoDQS) + if( ExprHasProperty(pExpr,EP_DblQuoted) + && areDoubleQuotedStringsEnabled(db, pTopNC) ){ /* If a double-quoted identifier does not match any known column name, ** then treat it as a string. @@ -1771,15 +1787,7 @@ int sqlite3ResolveSelfReference( } sNC.pParse = pParse; sNC.pSrcList = &sSrc; - sNC.ncFlags = type; - if( (pParse->db->flags & SQLITE_NoDQS)!=0 - || (!pParse->db->init.busy - && !sqlite3WritableSchema(pParse->db) - && (pParse->db->flags & SQLITE_NoDQSSchema)!=0 - ) - ){ - sNC.ncFlags |= NC_NoDblQStr; - } + sNC.ncFlags = type | NC_IsDDL; if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); return rc; diff --git a/src/shell.c.in b/src/shell.c.in index d72b419474..07d4408c25 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7086,8 +7086,8 @@ static int do_meta_command(char *zLine, ShellState *p){ { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, { "wriable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, - { "no_dqs_schema", SQLITE_DBCONFIG_NO_DQS_SCHEMA }, - { "no_dqs", SQLITE_DBCONFIG_NO_DQS }, + { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, + { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, }; int ii, v; open_db(p, 0); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9c61408946..6b0704f12e 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2231,19 +2231,18 @@ struct sqlite3_mem_methods { ** using the [PRAGMA legacy_alter_table] statement. ** ** -** [[SQLITE_DBCONFIG_NO_DQS_SCHEMA]] -**
SQLITE_DBCONFIG_NO_DQS_SCHEMA -**
The SQLITE_DBCONFIG_NO_DQS_SCHEMA option activates or deactivates -** the legacy [double-quoted string literal] misfeature for DDL statements. +** [[SQLITE_DBCONFIG_DQS_DML]] +**
SQLITE_DBCONFIG_DQS_DML +**
The SQLITE_DBCONFIG_DQS_DML option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DML statement +** only, that is DELETE, INSERT, SELECT, and UPDATE statements. **
** -** [[SQLITE_DBCONFIG_NO_DQS]] -**
SQLITE_DBCONFIG_NO_DQS -**
The SQLITE_DBCONFIG_NO_DQS option activates or deactivates -** the legacy [double-quoted string literal] misfeature. The -** double-quoted string literal misfeature is on by default for -** compatibility, though it might become off by default in some -** future release of SQLite. +** [[SQLITE_DBCONFIG_DQS_DDL]] +**
SQLITE_DBCONFIG_DQS_DDL +**
The SQLITE_DBCONFIG_DQS option activates or deactivates +** the legacy [double-quoted string literal] misfeature for DDL statements, +** such as CREATE TABLE and CREATE INDEX. **
** */ @@ -2260,8 +2259,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ #define SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011 /* int int* */ #define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ -#define SQLITE_DBCONFIG_NO_DQS_SCHEMA 1013 /* int int* */ -#define SQLITE_DBCONFIG_NO_DQS 1014 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ +#define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ #define SQLITE_DBCONFIG_MAX 1014 /* Largest DBCONFIG */ /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1585fb9e5d..1c46183312 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1548,8 +1548,8 @@ struct sqlite3 { #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ #define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ #define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ -#define SQLITE_NoDQSSchema 0x20000000 /* No dbl-quote strings in CREATE */ -#define SQLITE_NoDQS 0x40000000 /* No double-quoted strings anywhere*/ +#define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ +#define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ /* Flags used only if debugging */ #define HI(X) ((u64)(X)<<32) @@ -2796,8 +2796,7 @@ struct NameContext { #define NC_Complex 0x2000 /* True if a function or subquery seen */ #define NC_AllowWin 0x4000 /* Window functions are allowed here */ #define NC_HasWin 0x8000 /* One or more window functions seen */ -#define NC_NoDblQStr 0x10000 /* Do not allow double-quoted string hack. - ** Mnemonic: "NO DouBLe-Quoted STRings" */ +#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ /* ** An instance of the following object describes a single ON CONFLICT diff --git a/src/test1.c b/src/test1.c index f7b6e25e79..9aaf79261e 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7619,8 +7619,8 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE }, { "WRITABLE_SCHEMA", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, { "LEGACY_ALTER_TABLE", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, - { "NO_DQS_SCHEMA", SQLITE_DBCONFIG_NO_DQS_SCHEMA }, - { "NO_DQS", SQLITE_DBCONFIG_NO_DQS }, + { "DQS_DML", SQLITE_DBCONFIG_DQS_DML }, + { "DQS_DDL", SQLITE_DBCONFIG_DQS_DDL }, }; int i; int v; From fe9a832e806ea2796a8f362f21168725c610687b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 17 Jun 2019 14:50:33 +0000 Subject: [PATCH 84/96] Fix a problem with handling with handling quoted path elements in extension functions json_set() and json_insert() reported on the mailing list. FossilOrigin-Name: 45bfcb88e71451a656982e217375e257fc8e68374349c2984be1266bf86fb8cf --- ext/misc/json1.c | 2 +- manifest | 17 ++++++++--------- manifest.uuid | 2 +- test/json104.test | 27 +++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index d99d360b27..0bb4e1cee5 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1123,7 +1123,7 @@ static JsonNode *jsonLookupStep( u32 iStart, iLabel; JsonNode *pNode; iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); - iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath); + iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); zPath += i; pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); if( pParse->oom ) return 0; diff --git a/manifest b/manifest index 9d33331f58..5d70a1c111 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\ssqlite3_db_config()\soptions:\nSQLITE_DBCONFIG_LEGACY_ALTER_TABLE,\nSQLITE_DBCONFIG_DQS_DML,\sand\nSQLITE_DBCONFIG_DQS_DDL. -D 2019-06-17T14:13:30.018 +C Fix\sa\sproblem\swith\shandling\swith\shandling\squoted\spath\selements\sin\sextension\sfunctions\sjson_set()\sand\sjson_insert()\sreported\son\sthe\smailing\slist. +D 2019-06-17T14:50:33.682 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -293,7 +293,7 @@ F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09 F ext/misc/fossildelta.c 5c04d0a5657615daf4c6cd01c4281de8983dd28f6eed592b2691c10e3f6710e1 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 +F ext/misc/json1.c c99b5f04fccba87c1c8c5ab5c0e53eef37c0144086e33911290a67dfba541d59 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1087,7 +1087,7 @@ F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 877d5845f6303899b7889ea5dd1bea99076e3100574d5c536082245c5805dcaa +F test/json104.test cf0dbd220cba81e6c3cf8bc326e2321049cec05ab0b529308d76f28a52529800 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 @@ -1830,8 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 54110870487f78013ab1b554413c18baa2bdc07d979bc65c110f32d30c3b53fe 923cfd53fcff2fcb91530bf819d2ecb0eda3f6a27dae29c7460f9ce3a3ffce7b -R 17173e044c85ca8112ca4f457336d5b7 -T +closed 923cfd53fcff2fcb91530bf819d2ecb0eda3f6a27dae29c7460f9ce3a3ffce7b -U drh -Z 76b36f59b1f0937d86a7a531c05ca60c +P a61db8ff6713d66778a0500ca4049229c081a3ae95991f05eba09729434444b3 +R 31ce2b32bf2124cf303125809a64a6cf +U dan +Z 2e7e8d8a7d7718b39f109f741c0f41e1 diff --git a/manifest.uuid b/manifest.uuid index 5ac596beed..d20086fe30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a61db8ff6713d66778a0500ca4049229c081a3ae95991f05eba09729434444b3 \ No newline at end of file +45bfcb88e71451a656982e217375e257fc8e68374349c2984be1266bf86fb8cf \ No newline at end of file diff --git a/test/json104.test b/test/json104.test index b5313f01b5..23864d53dc 100644 --- a/test/json104.test +++ b/test/json104.test @@ -13,6 +13,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix json104 ifcapable !json1 { finish_test @@ -125,6 +126,32 @@ do_execsql_test json104-314 { SELECT json_patch('{}','{"a":{"bb":{"ccc":null}}}'); } {{{"a":{"bb":{}}}}} +#------------------------------------------------------------------------- + +do_execsql_test 401 { + CREATE TABLE obj(x); + INSERT INTO obj VALUES('{"a":1,"b":2}'); + SELECT * FROM obj; +} {{{"a":1,"b":2}}} +do_execsql_test 402 { + UPDATE obj SET x = json_insert(x, '$.c', 3); + SELECT * FROM obj; +} {{{"a":1,"b":2,"c":3}}} +do_execsql_test 403 { + SELECT json_extract(x, '$.b') FROM obj; + SELECT json_extract(x, '$."b"') FROM obj; +} {2 2} +do_execsql_test 404 { + UPDATE obj SET x = json_set(x, '$."b"', 555); + SELECT json_extract(x, '$.b') FROM obj; + SELECT json_extract(x, '$."b"') FROM obj; +} {555 555} +do_execsql_test 405 { + UPDATE obj SET x = json_set(x, '$."d"', 4); + SELECT json_extract(x, '$."d"') FROM obj; +} {4} finish_test + + From 07312a6b06b09d64e964c2e346cd253d839c3132 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 Jun 2019 14:05:27 +0000 Subject: [PATCH 85/96] Fix a typo in an option name for the .dbconfig command in shell.c.in: s/wriable_schema/writable_schema/ FossilOrigin-Name: 1c58522e49cd91426bca7efccf0d99e0f2803dcd5991ae5d56166fc5510e4c62 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5d70a1c111..4f39424cf5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\shandling\swith\shandling\squoted\spath\selements\sin\sextension\sfunctions\sjson_set()\sand\sjson_insert()\sreported\son\sthe\smailing\slist. -D 2019-06-17T14:50:33.682 +C Fix\sa\stypo\sin\san\soption\sname\sfor\sthe\s.dbconfig\scommand\sin\sshell.c.in:\ss/wriable_schema/writable_schema/ +D 2019-06-21T14:05:27.839 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 93b7bc7c45efa6322d92293361c51a873690daed50cf77eeff88a448246b0d5a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea -F src/shell.c.in 6edadde44b5b084cb0091340e73061e47c65a40c531befd7566fbfe64cfa85fc +F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb F src/sqlite.h.in bc4aa09a59dcf3c34b8e57ce9ade8ff6aed8ef7a7ddc59951f59f9b009fc7cc0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a61db8ff6713d66778a0500ca4049229c081a3ae95991f05eba09729434444b3 -R 31ce2b32bf2124cf303125809a64a6cf +P 45bfcb88e71451a656982e217375e257fc8e68374349c2984be1266bf86fb8cf +R 6c12d6336fc82578eae036f8206dac72 U dan -Z 2e7e8d8a7d7718b39f109f741c0f41e1 +Z d88e871f7274ab00b3162208bb6a423c diff --git a/manifest.uuid b/manifest.uuid index d20086fe30..1788abe673 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45bfcb88e71451a656982e217375e257fc8e68374349c2984be1266bf86fb8cf \ No newline at end of file +1c58522e49cd91426bca7efccf0d99e0f2803dcd5991ae5d56166fc5510e4c62 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 07d4408c25..f3edee22d9 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7084,7 +7084,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, - { "wriable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, + { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, From 855b5d144aaa7ff9e52741a039e53ffcaaac7d65 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 Jun 2019 21:04:30 +0000 Subject: [PATCH 86/96] Ensure that when an ephemeral cursor is reopened with a second invocation of to OP_OpenEphemeral, the sequence counter is reset and the cache marked as stale. Fix for [9cdc5c46]. FossilOrigin-Name: 5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 4 +++- test/subquery2.test | 17 +++++++++++++++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4f39424cf5..a70f6b5a89 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\san\soption\sname\sfor\sthe\s.dbconfig\scommand\sin\sshell.c.in:\ss/wriable_schema/writable_schema/ -D 2019-06-21T14:05:27.839 +C Ensure\sthat\swhen\san\sephemeral\scursor\sis\sreopened\swith\sa\ssecond\sinvocation\sof\sto\sOP_OpenEphemeral,\sthe\ssequence\scounter\sis\sreset\sand\sthe\scache\smarked\sas\sstale.\sFix\sfor\s[9cdc5c46]. +D 2019-06-26T21:04:30.194 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,7 +594,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 42a7966812a5c3305cadd3e1060a0e962d6674e4a647fcc153e8693ecf59af74 +F src/vdbe.c aaa36d1ac7d55baf007e9c03ee7c826834a51dfe7a56ba4c386318695dd87c99 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1365,7 +1365,7 @@ F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec7 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f -F test/subquery2.test 8250dfd6a773b04c7a5c37ac63276f62b329157ce171244d0cbe1acc365e3303 +F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 45bfcb88e71451a656982e217375e257fc8e68374349c2984be1266bf86fb8cf -R 6c12d6336fc82578eae036f8206dac72 +P 1c58522e49cd91426bca7efccf0d99e0f2803dcd5991ae5d56166fc5510e4c62 +R aa86bccf5d83f42eb7e88df9492939da U dan -Z d88e871f7274ab00b3162208bb6a423c +Z 83cefd86767b67dddce8adaf1f2cbca7 diff --git a/manifest.uuid b/manifest.uuid index 1788abe673..483673e8b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c58522e49cd91426bca7efccf0d99e0f2803dcd5991ae5d56166fc5510e4c62 \ No newline at end of file +5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index d37ba1cceb..d697d6b1e0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3753,13 +3753,14 @@ case OP_OpenEphemeral: { /* If the ephermeral table is already open, erase all existing content ** so that the table is empty again, rather than creating a new table. */ assert( pCx->isEphemeral ); + pCx->seqCount = 0; + pCx->cacheStatus = CACHE_STALE; if( pCx->pBtx ){ rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); } }else{ pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); if( pCx==0 ) goto no_mem; - pCx->nullRow = 1; pCx->isEphemeral = 1; rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, @@ -3795,6 +3796,7 @@ case OP_OpenEphemeral: { pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); } if( rc ) goto abort_due_to_error; + pCx->nullRow = 1; break; } diff --git a/test/subquery2.test b/test/subquery2.test index 8ccd229e80..0c1bdc6697 100644 --- a/test/subquery2.test +++ b/test/subquery2.test @@ -197,5 +197,22 @@ foreach {tn sql} { }] } +#------------------------------------------------------------------------- +# Test that ticket [9cdc5c46] is fixed. +# +reset_db +do_execsql_test 5.0 { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('ALFKI'); + INSERT INTO t1 VALUES('ANATR'); + + CREATE TABLE t2(y, z); + CREATE INDEX t2y ON t2 (y); + INSERT INTO t2 VALUES('ANATR', '1997-08-08 00:00:00'); + INSERT INTO t2 VALUES('ALFKI', '1997-08-25 00:00:00'); +} +do_execsql_test 5.1 { + SELECT ( SELECT y FROM t2 WHERE x = y ORDER BY y, z) FROM t1; +} {ALFKI ANATR} finish_test From 00a6153fafe01c9dde8f84a70f1cb810256300dd Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 28 Jun 2019 07:08:13 +0000 Subject: [PATCH 87/96] Use the OP_Sequence opcode for generating unique rowid values for an autoindex on a co-routine implementation of a subquery. FossilOrigin-Name: eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 21 ++++++++++----------- test/autoindex5.test | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index a70f6b5a89..a320ae1e91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\swhen\san\sephemeral\scursor\sis\sreopened\swith\sa\ssecond\sinvocation\sof\sto\sOP_OpenEphemeral,\sthe\ssequence\scounter\sis\sreset\sand\sthe\scache\smarked\sas\sstale.\sFix\sfor\s[9cdc5c46]. -D 2019-06-26T21:04:30.194 +C Use\sthe\sOP_Sequence\sopcode\sfor\sgenerating\sunique\srowid\svalues\sfor\san\nautoindex\son\sa\sco-routine\simplementation\sof\sa\ssubquery. +D 2019-06-28T07:08:13.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -608,7 +608,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b09a2a9cab50efa08451a8c81d47052120ad5da174048c6d0b08d405384abdf2 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 -F src/where.c 99c7b718ef846ac952016083aaf4e22ede2290beceaf4730a2df55c023251369 +F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 @@ -672,7 +672,7 @@ F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test 1d8c1134e1488a35c6fa205b2f52e72fc220972d946c59492d10bba01d6fecd4 +F test/autoindex5.test a5d72fe8c217cc0ea356dc6fa06a282a8a3fc53aa807709d79dba07a8f248102 F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c58522e49cd91426bca7efccf0d99e0f2803dcd5991ae5d56166fc5510e4c62 -R aa86bccf5d83f42eb7e88df9492939da -U dan -Z 83cefd86767b67dddce8adaf1f2cbca7 +P 5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e +R d8e38b1a6647f90f85dd30ba60740431 +U drh +Z 069759ad3085e2b5f17cc34ec369471a diff --git a/manifest.uuid b/manifest.uuid index 483673e8b2..82a0a5af46 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e \ No newline at end of file +eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e \ No newline at end of file diff --git a/src/where.c b/src/where.c index b421e4ae93..f2ab125d2d 100644 --- a/src/where.c +++ b/src/where.c @@ -562,17 +562,17 @@ static LogEst estLog(LogEst N){ ** opcodes into OP_Copy when the table is being accessed via co-routine ** instead of via table lookup. ** -** If the bIncrRowid parameter is 0, then any OP_Rowid instructions on -** cursor iTabCur are transformed into OP_Null. Or, if bIncrRowid is non-zero, -** then each OP_Rowid is transformed into an instruction to increment the -** value stored in its output register. +** If the iAutoidxCur is not zero, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Sequence opcode for the +** iAutoidxCur cursor, in order to generate unique rowids for the +** automatic index being generated. */ static void translateColumnToCopy( Parse *pParse, /* Parsing context */ int iStart, /* Translate from this opcode to the end */ int iTabCur, /* OP_Column/OP_Rowid references to this table */ int iRegister, /* The first column is in this register */ - int bIncrRowid /* If non-zero, transform OP_rowid to OP_AddImm(1) */ + int iAutoidxCur /* If non-zero, cursor of autoindex being generated */ ){ Vdbe *v = pParse->pVdbe; VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); @@ -586,11 +586,9 @@ static void translateColumnToCopy( pOp->p2 = pOp->p3; pOp->p3 = 0; }else if( pOp->opcode==OP_Rowid ){ - if( bIncrRowid ){ - /* Increment the value stored in the P2 operand of the OP_Rowid. */ - pOp->opcode = OP_AddImm; - pOp->p1 = pOp->p2; - pOp->p2 = 1; + if( iAutoidxCur ){ + pOp->opcode = OP_Sequence; + pOp->p1 = iAutoidxCur; }else{ pOp->opcode = OP_Null; pOp->p1 = 0; @@ -864,8 +862,9 @@ static void constructAutomaticIndex( if( pTabItem->fg.viaCoroutine ){ sqlite3VdbeChangeP2(v, addrCounter, regBase+n); testcase( pParse->db->mallocFailed ); + assert( pLevel->iIdxCur>0 ); translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, - pTabItem->regResult, 1); + pTabItem->regResult, pLevel->iIdxCur); sqlite3VdbeGoto(v, addrTop); pTabItem->fg.viaCoroutine = 0; }else{ diff --git a/test/autoindex5.test b/test/autoindex5.test index eabdeae482..94e220328c 100644 --- a/test/autoindex5.test +++ b/test/autoindex5.test @@ -123,6 +123,20 @@ do_execsql_test 2.1 { SELECT sum(z) FROM vvv WHERE x='aaa' ) FROM one; } {8.0} +do_execsql_test 2.2 { + DROP TABLE t1; + CREATE TABLE t1(aaa); + INSERT INTO t1(aaa) VALUES(9); + SELECT ( + SELECT aaa FROM t1 GROUP BY ( + SELECT bbb FROM ( + SELECT ccc AS bbb FROM ( + SELECT 1 ccc + ) WHERE rowid IS NOT 1 + ) WHERE bbb = 1 + ) + ); +} {9} # Ticket https://www.sqlite.org/src/info/787fa716be3a7f65 # Segfault due to multiple uses of the same subquery where the From 4b50da9c951d036483407459d58536db35487d36 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 2 Jul 2019 12:23:09 +0000 Subject: [PATCH 88/96] Restore the legacy behavior of enabling double-quoted string literals in all contexts. But also provide a new compile-time option (SQLITE_DQS) to change the default to something more restrictive. FossilOrigin-Name: 97a94446f3941c313c4c3a19d9f89f24d7ef06e842f79d66f0ad88810b872084 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 29 ++++++++++++++++++++++++++++- src/sqlite.h.in | 8 ++++++-- test/quote.test | 2 ++ 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index a320ae1e91..4b2554288b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\sOP_Sequence\sopcode\sfor\sgenerating\sunique\srowid\svalues\sfor\san\nautoindex\son\sa\sco-routine\simplementation\sof\sa\ssubquery. -D 2019-06-28T07:08:13.998 +C Restore\sthe\slegacy\sbehavior\sof\senabling\sdouble-quoted\sstring\sliterals\sin\nall\scontexts.\s\sBut\salso\sprovide\sa\snew\scompile-time\soption\s(SQLITE_DQS)\sto\s\nchange\sthe\sdefault\sto\ssomething\smore\srestrictive. +D 2019-07-02T12:23:09.339 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c e16c702032930fd9d8c0533fed7575f3900022c13a59cc2817e60f07096a005e +F src/main.c 591a0084b1a6b0ed6741f77181bd1a630ca10bb460420f00e8c11809da7df5b9 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -524,7 +524,7 @@ F src/resolve.c 93b7bc7c45efa6322d92293361c51a873690daed50cf77eeff88a448246b0d5a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb -F src/sqlite.h.in bc4aa09a59dcf3c34b8e57ce9ade8ff6aed8ef7a7ddc59951f59f9b009fc7cc0 +F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 F src/sqliteInt.h bf65dfa6565fae2e0d501088fc9c5212244adc1429a543827a16b2f5eaf41982 @@ -1229,7 +1229,7 @@ F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 8258838e5135ff1034e4de929d14bfb5bdd73d2df5a2281404ae79d927b8fa70 +F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e -R d8e38b1a6647f90f85dd30ba60740431 +P eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e +R 0b36af6a8df78e1b4ae21c7b05704310 U drh -Z 069759ad3085e2b5f17cc34ec369471a +Z ed1c8cce590ac464550f943b9f1b0f06 diff --git a/manifest.uuid b/manifest.uuid index 82a0a5af46..556bcd8299 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e \ No newline at end of file +97a94446f3941c313c4c3a19d9f89f24d7ef06e842f79d66f0ad88810b872084 \ No newline at end of file diff --git a/src/main.c b/src/main.c index a70271162a..6127006275 100644 --- a/src/main.c +++ b/src/main.c @@ -3073,8 +3073,35 @@ static int openDatabase( db->szMmap = sqlite3GlobalConfig.szMmap; db->nextPagesize = 0; db->nMaxSorterMmap = 0x7FFFFFFF; - db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger | SQLITE_CacheSpill + db->flags |= SQLITE_ShortColNames + | SQLITE_EnableTrigger + | SQLITE_CacheSpill + +/* The SQLITE_DQS compile-time option determines the default settings +** for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML. +** +** SQLITE_DQS SQLITE_DBCONFIG_DQS_DDL SQLITE_DBCONFIG_DQS_DML +** ---------- ----------------------- ----------------------- +** undefined on on +** 3 on on +** 2 on off +** 1 off on +** 0 off off +** +** Legacy behavior is 3 (double-quoted string literals are allowed anywhere) +** and so that is the default. But developers are encouranged to use +** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. +*/ +#if !defined(SQLITE_DQS) +# define SQLITE_DQS 3 +#endif +#if (SQLITE_DQS&1)==1 | SQLITE_DqsDML +#endif +#if (SQLITE_DQS&2)==2 + | SQLITE_DqsDDL +#endif + #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX | SQLITE_AutoIndex #endif diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 6b0704f12e..4dd14ac17c 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2235,14 +2235,18 @@ struct sqlite3_mem_methods { **
SQLITE_DBCONFIG_DQS_DML **
The SQLITE_DBCONFIG_DQS_DML option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DML statement -** only, that is DELETE, INSERT, SELECT, and UPDATE statements. +** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. **
** ** [[SQLITE_DBCONFIG_DQS_DDL]] **
SQLITE_DBCONFIG_DQS_DDL **
The SQLITE_DBCONFIG_DQS option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DDL statements, -** such as CREATE TABLE and CREATE INDEX. +** such as CREATE TABLE and CREATE INDEX. The +** default value of this setting is determined by the [-DSQLITE_DQS] +** compile-time option. **
** */ diff --git a/test/quote.test b/test/quote.test index ac572e92de..a7477087c0 100644 --- a/test/quote.test +++ b/test/quote.test @@ -92,6 +92,8 @@ do_test quote-1.6 { # SQLite can load such a schema from disk. # reset_db +sqlite3_db_config db SQLITE_DBCONFIG_DQS_DDL 0 +sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1 do_execsql_test 2.0 { CREATE TABLE t1(x, y, z); } From a082cd75a1625d5aa0f7aeb9384dbccb7a6a78ec Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jul 2019 16:05:26 +0000 Subject: [PATCH 89/96] Fix a race condition that could occur in SQLITE_ENABLE_MEMORY_MANAGEMENT builds when two threads simultaneously open the first two database connections in the process. FossilOrigin-Name: 5ea3f6fc88cf66824128aa64f777a7abb4f6ed55f214d7a135f36e306a32487c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pcache1.c | 2 +- test/releasetest.tcl | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 4b2554288b..1bbadc03ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restore\sthe\slegacy\sbehavior\sof\senabling\sdouble-quoted\sstring\sliterals\sin\nall\scontexts.\s\sBut\salso\sprovide\sa\snew\scompile-time\soption\s(SQLITE_DQS)\sto\s\nchange\sthe\sdefault\sto\ssomething\smore\srestrictive. -D 2019-07-02T12:23:09.339 +C Fix\sa\srace\scondition\sthat\scould\soccur\sin\sSQLITE_ENABLE_MEMORY_MANAGEMENT\sbuilds\swhen\stwo\sthreads\ssimultaneously\sopen\sthe\sfirst\stwo\sdatabase\sconnections\sin\sthe\sprocess. +D 2019-07-04T16:05:26.878 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -514,7 +514,7 @@ F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 026e3e6fff32432166a4eae0bdb78ad09a53c84eb49acb44dc32e49b4c0b8a48 F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d +F src/pcache1.c e6373934cdafea272d94feb224344f9fd93ff94318221b64ccabd72d98b4672e F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 @@ -1238,7 +1238,7 @@ F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl 204efd3a87ec1d62da2efde42c673b18b955350a9d3c6ac0b4dbba5bc8595808 x +F test/releasetest.tcl 968fc1e8fd23e113fb8a04379747f3a9f2c12d207b2de85aeff5a825962e1cd7 x F test/releasetest_data.tcl c3746248b5ad8f99a29020f83501bb25e024156ecc37e05c71c76da4fc8601c6 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e -R 0b36af6a8df78e1b4ae21c7b05704310 -U drh -Z ed1c8cce590ac464550f943b9f1b0f06 +P 97a94446f3941c313c4c3a19d9f89f24d7ef06e842f79d66f0ad88810b872084 +R 9398ab014d6e6e64eafbbf681a19d3b0 +U dan +Z fca5035aac627b4a455ff2174ca1daf0 diff --git a/manifest.uuid b/manifest.uuid index 556bcd8299..7d035f1333 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97a94446f3941c313c4c3a19d9f89f24d7ef06e842f79d66f0ad88810b872084 \ No newline at end of file +5ea3f6fc88cf66824128aa64f777a7abb4f6ed55f214d7a135f36e306a32487c \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index ff01ae3113..c9d55866ee 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -778,6 +778,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ }else{ pGroup = &pcache1.grp; } + pcache1EnterMutex(pGroup); if( pGroup->lru.isAnchor==0 ){ pGroup->lru.isAnchor = 1; pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; @@ -787,7 +788,6 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pCache->szExtra = szExtra; pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); pCache->bPurgeable = (bPurgeable ? 1 : 0); - pcache1EnterMutex(pGroup); pcache1ResizeHash(pCache); if( bPurgeable ){ pCache->nMin = 10; diff --git a/test/releasetest.tcl b/test/releasetest.tcl index d216d2a08d..997e5eab9f 100755 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -281,7 +281,7 @@ array set ::Platforms [strip_comments { "User-Auth" tcltest "Update-Delete-Limit" test "Extra-Robustness" test - "Device-Two" test + "Device-Two" "threadtest test" "No-lookaside" test "Devkit" test "Apple" test From 40d6c827e96737dbdfb5c54c803ee54560876290 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jul 2019 16:06:59 +0000 Subject: [PATCH 90/96] Have wapptest.tcl run at least one threadtest with an SQLITE_ENABLE_MEMORY_MANAGEMENT build. FossilOrigin-Name: d6131caf6471ad41fa5a28b0067d759ac1cc9dba1170678534488b416f9a1157 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/releasetest_data.tcl | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1bbadc03ab..83fce2aca0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\srace\scondition\sthat\scould\soccur\sin\sSQLITE_ENABLE_MEMORY_MANAGEMENT\sbuilds\swhen\stwo\sthreads\ssimultaneously\sopen\sthe\sfirst\stwo\sdatabase\sconnections\sin\sthe\sprocess. -D 2019-07-04T16:05:26.878 +C Have\swapptest.tcl\srun\sat\sleast\sone\sthreadtest\swith\san\sSQLITE_ENABLE_MEMORY_MANAGEMENT\sbuild. +D 2019-07-04T16:06:59.902 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1239,7 +1239,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 968fc1e8fd23e113fb8a04379747f3a9f2c12d207b2de85aeff5a825962e1cd7 x -F test/releasetest_data.tcl c3746248b5ad8f99a29020f83501bb25e024156ecc37e05c71c76da4fc8601c6 +F test/releasetest_data.tcl 146a73e8c8212f962b6558fee0711b895f11b607ee0610e6910781dc8f83797d F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 97a94446f3941c313c4c3a19d9f89f24d7ef06e842f79d66f0ad88810b872084 -R 9398ab014d6e6e64eafbbf681a19d3b0 +P 5ea3f6fc88cf66824128aa64f777a7abb4f6ed55f214d7a135f36e306a32487c +R f5e643e3b2aab63e72fd9f8921c994bb U dan -Z fca5035aac627b4a455ff2174ca1daf0 +Z cdda695dbb9f0a69b04eebf595abe256 diff --git a/manifest.uuid b/manifest.uuid index 7d035f1333..64a70b45c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5ea3f6fc88cf66824128aa64f777a7abb4f6ed55f214d7a135f36e306a32487c \ No newline at end of file +d6131caf6471ad41fa5a28b0067d759ac1cc9dba1170678534488b416f9a1157 \ No newline at end of file diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index 3afd659f99..6b6c2a8efe 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -246,7 +246,7 @@ array set ::Platforms [strip_comments { "User-Auth" tcltest "Update-Delete-Limit" test "Extra-Robustness" test - "Device-Two" test + "Device-Two" "threadtest test" "No-lookaside" test "Devkit" test "Apple" test From 79d8aa24f17b1d7f2743c1bcf823bc17489d14ec Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jul 2019 16:30:41 +0000 Subject: [PATCH 91/96] Fix a typo in the wapptest.tcl script. FossilOrigin-Name: 971b4422ae7a8eed67f5db62c0e1cc061faac9404ff5f7051d7e07decf2207a4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/wapptest.tcl | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 83fce2aca0..7a3195aabc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\swapptest.tcl\srun\sat\sleast\sone\sthreadtest\swith\san\sSQLITE_ENABLE_MEMORY_MANAGEMENT\sbuild. -D 2019-07-04T16:06:59.902 +C Fix\sa\stypo\sin\sthe\swapptest.tcl\sscript. +D 2019-07-04T16:30:41.433 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1664,7 +1664,7 @@ F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl f387e81750b2938ccf445b8a061541626a4a31f55e9e500b3e38ef3ce177bc61 x +F test/wapptest.tcl 56d2b7974ecd8cca3189a670f757306d5ff3334cc9fe3744f7a6ad7ae4380e8c x F test/where.test 0607caa5a1fbfe7b93b95705981b463a3a0408038f22ae6e9dc11b36902b0e95 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5ea3f6fc88cf66824128aa64f777a7abb4f6ed55f214d7a135f36e306a32487c -R f5e643e3b2aab63e72fd9f8921c994bb +P d6131caf6471ad41fa5a28b0067d759ac1cc9dba1170678534488b416f9a1157 +R c98163eabdee9b9ab51ab308cb5cb0fa U dan -Z cdda695dbb9f0a69b04eebf595abe256 +Z a73d97c70b134c41148806913e5fb63d diff --git a/manifest.uuid b/manifest.uuid index 64a70b45c8..c59317626f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d6131caf6471ad41fa5a28b0067d759ac1cc9dba1170678534488b416f9a1157 \ No newline at end of file +971b4422ae7a8eed67f5db62c0e1cc061faac9404ff5f7051d7e07decf2207a4 \ No newline at end of file diff --git a/test/wapptest.tcl b/test/wapptest.tcl index 62488a1eac..65bf98891c 100755 --- a/test/wapptest.tcl +++ b/test/wapptest.tcl @@ -288,7 +288,7 @@ proc slave_test_done {name rc} { wapptest_output $msg if {[info exists G(test.$name.errmsg)] && $G(test.$name.errmsg)!=""} { - wapptest_output " $G(test.$config.errmsg)" + wapptest_output " $G(test.$name.errmsg)" } } From e88c0cde6caa0136fb9b6b3b2ea3330faf8547d1 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jul 2019 19:19:08 +0000 Subject: [PATCH 92/96] As it requires wal mode support, do not run test file chunksize.test as part of the "journaltest" permutation. FossilOrigin-Name: acd2df36c2876ff3cc477889fc99f493cdf53a656bdb84bde6121676c9eeed1f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test_devsym.c | 1 + test/permutations.test | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7a3195aabc..bfd81bddc8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\swapptest.tcl\sscript. -D 2019-07-04T16:30:41.433 +C As\sit\srequires\swal\smode\ssupport,\sdo\snot\srun\stest\sfile\schunksize.test\sas\spart\sof\sthe\s"journaltest"\spermutation. +D 2019-07-04T19:19:08.667 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 F src/test_config.c 5ebafbcd5c75ac1c16bb0c8fe926dc325cc03e780943a88ca50e0d9a4fc4d2f5 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 -F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2 +F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d @@ -1210,7 +1210,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test b8f0da2f53ef1bd7ff149a140ee625aa7276c94ae15eb9acc2d8ed4af8f22b13 +F test/permutations.test 4282fb00e5ac0f8c2cd1be62652f6da4ac03ce3c58b7d785fa17f4684492a0e0 F test/pg_common.tcl 4740dc35190d6acdab14c097783331361301ab504a94d948f6afbb56ce0a51e8 F test/pragma.test cf066fe0f7f5d49f4758de4986407b8676c61aaa7871599340d64f42a8edc352 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d6131caf6471ad41fa5a28b0067d759ac1cc9dba1170678534488b416f9a1157 -R c98163eabdee9b9ab51ab308cb5cb0fa +P 971b4422ae7a8eed67f5db62c0e1cc061faac9404ff5f7051d7e07decf2207a4 +R 79b5e680b38447bcaf019a79afae54b9 U dan -Z a73d97c70b134c41148806913e5fb63d +Z 6b251d25a286a2d9a468d35d6244a9a1 diff --git a/manifest.uuid b/manifest.uuid index c59317626f..ffdcec6bf3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -971b4422ae7a8eed67f5db62c0e1cc061faac9404ff5f7051d7e07decf2207a4 \ No newline at end of file +acd2df36c2876ff3cc477889fc99f493cdf53a656bdb84bde6121676c9eeed1f \ No newline at end of file diff --git a/src/test_devsym.c b/src/test_devsym.c index 0da6671cf4..23354312c5 100644 --- a/src/test_devsym.c +++ b/src/test_devsym.c @@ -505,6 +505,7 @@ void devsym_register(int iDeviceChar, int iSectorSize){ void devsym_unregister(){ sqlite3_vfs_unregister(&devsym_vfs); + sqlite3_vfs_unregister(&writecrash_vfs); g.pVfs = 0; g.iDeviceChar = 0; g.iSectorSize = 0; diff --git a/test/permutations.test b/test/permutations.test index 1a8050ee61..007aec1988 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -966,7 +966,7 @@ test_suite "journaltest" -description { async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock* pager2.test *fault* rowal* snapshot* superlock* symlink.test - delete_db.test shmlock.test + delete_db.test shmlock.test chunksize.test }] if {[info commands register_demovfs] != ""} { From 7d840e530f7ef1a81fae92542c5d7088e033ffca Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 5 Jul 2019 15:16:22 +0000 Subject: [PATCH 93/96] Fix a valgrind problem in fts3corrupt4.test. FossilOrigin-Name: cb3dec427e399064eeec31c15565346f045bd7c46d2f7860b1cd346bbcccb124 --- ext/fts3/fts3_write.c | 10 ++++++++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 0004a47a0c..889a674f87 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -4282,10 +4282,13 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[nHeight]; pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight; - blobGrowBuffer(&pNode->block, MAX(nRoot, p->nNodeSize), &rc); + blobGrowBuffer(&pNode->block, + MAX(nRoot, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); if( rc==SQLITE_OK ){ memcpy(pNode->block.a, aRoot, nRoot); pNode->block.n = nRoot; + memset(&pNode->block.a[nRoot], 0, FTS3_NODE_PADDING); } for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ @@ -4305,10 +4308,13 @@ static int fts3IncrmergeLoad( pNode = &pWriter->aNodeWriter[i-1]; pNode->iBlock = reader.iChild; rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0); - blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc); + blobGrowBuffer(&pNode->block, + MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc + ); if( rc==SQLITE_OK ){ memcpy(pNode->block.a, aBlock, nBlock); pNode->block.n = nBlock; + memset(&pNode->block.a[nBlock], 0, FTS3_NODE_PADDING); } sqlite3_free(aBlock); } diff --git a/manifest b/manifest index bfd81bddc8..667bc8f276 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C As\sit\srequires\swal\smode\ssupport,\sdo\snot\srun\stest\sfile\schunksize.test\sas\spart\sof\sthe\s"journaltest"\spermutation. -D 2019-07-04T19:19:08.667 +C Fix\sa\svalgrind\sproblem\sin\sfts3corrupt4.test. +D 2019-07-05T15:16:22.173 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c b4c2e8fc90df14b0cdb78be934269689abe29ee652fc672e342a82e8e632cea5 +F ext/fts3/fts3_write.c 9e88111ca9f70e4079880d842c8323bffc4968b39ee38c0a75962a3485af9333 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -1830,7 +1830,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 971b4422ae7a8eed67f5db62c0e1cc061faac9404ff5f7051d7e07decf2207a4 -R 79b5e680b38447bcaf019a79afae54b9 +P acd2df36c2876ff3cc477889fc99f493cdf53a656bdb84bde6121676c9eeed1f +R 89c994fa71bff5aaeabc661835b668a5 U dan -Z 6b251d25a286a2d9a468d35d6244a9a1 +Z 2b04774a5a233cfa78160cfe1ff740cc diff --git a/manifest.uuid b/manifest.uuid index ffdcec6bf3..592344de2f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -acd2df36c2876ff3cc477889fc99f493cdf53a656bdb84bde6121676c9eeed1f \ No newline at end of file +cb3dec427e399064eeec31c15565346f045bd7c46d2f7860b1cd346bbcccb124 \ No newline at end of file From 62742fd2647ccd6a5cd2f899db70b6062f671c33 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jul 2019 12:01:39 +0000 Subject: [PATCH 94/96] Ensure collation sequences and affinities work in window function queries. Fix for [9ece23d2]. FossilOrigin-Name: 28196d894ac9fad9d8f877c7bf17ec9d299d12acdcc942f9ea0783777b14fdc5 --- manifest | 15 +++---- manifest.uuid | 2 +- src/select.c | 3 -- src/window.c | 29 +++++++++---- test/window9.test | 102 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 18 deletions(-) create mode 100644 test/window9.test diff --git a/manifest b/manifest index 667bc8f276..605151f859 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\svalgrind\sproblem\sin\sfts3corrupt4.test. -D 2019-07-05T15:16:22.173 +C Ensure\scollation\ssequences\sand\saffinities\swork\sin\swindow\sfunction\squeries.\sFix\sfor\s[9ece23d2]. +D 2019-07-08T12:01:39.675 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 93b7bc7c45efa6322d92293361c51a873690daed50cf77eeff88a448246b0d5a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea +F src/select.c 62f21307b280791c50554c9fa3766758dd695ed66a05d2408d213355c7b0aa89 F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -612,7 +612,7 @@ F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 5be2cf7d8763cc97137fc44d015aed8a1a4a56fe9700d7933ed560172617c756 +F src/window.c 3408c0f606574d41033d461506bad68790239844b23e70610738a71152873d05 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1708,6 +1708,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f +F test/window9.test 06495ac733843849b1fca8a79d13ba330d04aba02099703198af2ba7e231f90c F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898 @@ -1830,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P acd2df36c2876ff3cc477889fc99f493cdf53a656bdb84bde6121676c9eeed1f -R 89c994fa71bff5aaeabc661835b668a5 +P cb3dec427e399064eeec31c15565346f045bd7c46d2f7860b1cd346bbcccb124 +R 8abf67c9f7cb3324d11bb2f1aeec506d U dan -Z 2b04774a5a233cfa78160cfe1ff740cc +Z 9ad0a93a7b03f31ce9406ff65c3f0b05 diff --git a/manifest.uuid b/manifest.uuid index 592344de2f..418d75eed9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb3dec427e399064eeec31c15565346f045bd7c46d2f7860b1cd346bbcccb124 \ No newline at end of file +28196d894ac9fad9d8f877c7bf17ec9d299d12acdcc942f9ea0783777b14fdc5 \ No newline at end of file diff --git a/src/select.c b/src/select.c index bd16acb027..53d33a7ef4 100644 --- a/src/select.c +++ b/src/select.c @@ -2096,9 +2096,6 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ if( pTab==0 ){ return 0; } - /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside - ** is disabled */ - assert( db->lookaside.bDisable ); pTab->nTabRef = 1; pTab->zName = 0; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); diff --git a/src/window.c b/src/window.c index 737261e85c..dcd7107a42 100644 --- a/src/window.c +++ b/src/window.c @@ -736,6 +736,7 @@ struct WindowRewrite { Window *pWin; SrcList *pSrc; ExprList *pSub; + Table *pTab; Select *pSubSelect; /* Current sub-select, if any */ }; @@ -796,6 +797,7 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ pExpr->op = TK_COLUMN; pExpr->iColumn = p->pSub->nExpr-1; pExpr->iTable = p->pWin->iEphCsr; + pExpr->y.pTab = p->pTab; } break; @@ -839,6 +841,7 @@ static void selectWindowRewriteEList( Window *pWin, SrcList *pSrc, ExprList *pEList, /* Rewrite expressions in this list */ + Table *pTab, ExprList **ppSub /* IN/OUT: Sub-select expression-list */ ){ Walker sWalker; @@ -850,6 +853,7 @@ static void selectWindowRewriteEList( sRewrite.pSub = *ppSub; sRewrite.pWin = pWin; sRewrite.pSrc = pSrc; + sRewrite.pTab = pTab; sWalker.pParse = pParse; sWalker.xExprCallback = selectWindowRewriteExprCb; @@ -909,11 +913,18 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ExprList *pSublist = 0; /* Expression list for sub-query */ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ + Table *pTab; + + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ){ + return SQLITE_NOMEM; + } p->pSrc = 0; p->pWhere = 0; p->pGroupBy = 0; p->pHaving = 0; + p->selFlags &= ~SF_Aggregate; /* Create the ORDER BY clause for the sub-select. This is the concatenation ** of the window PARTITION and ORDER BY clauses. Then, if this makes it @@ -933,8 +944,8 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pMWin->iEphCsr = pParse->nTab++; pParse->nTab += 3; - selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, &pSublist); - selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pEList, pTab, &pSublist); + selectWindowRewriteEList(pParse, pMWin, pSrc, p->pOrderBy, pTab, &pSublist); pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); /* Append the PARTITION BY and ORDER BY expressions to the to the @@ -976,16 +987,19 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ); p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ + Table *pTab2; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); - if( sqlite3ExpandSubquery(pParse, &p->pSrc->a[0]) ){ + pSub->selFlags |= SF_Expanded; + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub); + if( pTab2==0 ){ rc = SQLITE_NOMEM; }else{ - pSub->selFlags |= SF_Expanded; - p->selFlags &= ~SF_Aggregate; - sqlite3SelectPrep(pParse, pSub, 0); + memcpy(pTab, pTab2, sizeof(Table)); + pTab->tabFlags |= TF_Ephemeral; + p->pSrc->a[0].pTab = pTab; + pTab = pTab2; } - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); @@ -994,6 +1008,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ sqlite3SelectDelete(db, pSub); } if( db->mallocFailed ) rc = SQLITE_NOMEM; + sqlite3DbFree(db, pTab); } return rc; diff --git a/test/window9.test b/test/window9.test new file mode 100644 index 0000000000..5a32a75378 --- /dev/null +++ b/test/window9.test @@ -0,0 +1,102 @@ +# 2019 June 8 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix window9 + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE fruits( + name TEXT COLLATE NOCASE, + color TEXT COLLATE NOCASE + ); +} + +do_execsql_test 1.1 { + INSERT INTO fruits (name, color) VALUES ('apple', 'RED'); + INSERT INTO fruits (name, color) VALUES ('APPLE', 'yellow'); + INSERT INTO fruits (name, color) VALUES ('pear', 'YELLOW'); + INSERT INTO fruits (name, color) VALUES ('PEAR', 'green'); +} + +do_execsql_test 1.2 { + SELECT name, color, dense_rank() OVER (ORDER BY name) FROM fruits; +} { + apple RED 1 + APPLE yellow 1 + pear YELLOW 2 + PEAR green 2 +} + +do_execsql_test 1.3 { + SELECT name, color, + dense_rank() OVER (PARTITION BY name ORDER BY color) + FROM fruits; +} { + apple RED 1 + APPLE yellow 2 + PEAR green 1 + pear YELLOW 2 +} + +do_execsql_test 1.4 { + SELECT name, color, + dense_rank() OVER (ORDER BY name), + dense_rank() OVER (PARTITION BY name ORDER BY color) + FROM fruits; +} { + apple RED 1 1 + APPLE yellow 1 2 + PEAR green 2 1 + pear YELLOW 2 2 +} + +do_execsql_test 1.5 { + SELECT name, color, + dense_rank() OVER (ORDER BY name), + dense_rank() OVER (PARTITION BY name ORDER BY color) + FROM fruits ORDER BY color; +} { + PEAR green 2 1 + apple RED 1 1 + APPLE yellow 1 2 + pear YELLOW 2 2 +} + +do_execsql_test 2.0 { + CREATE TABLE t1(a BLOB, b INTEGER, c COLLATE nocase); + INSERT INTO t1 VALUES(1, 2, 'abc'); + INSERT INTO t1 VALUES(3, 4, 'ABC'); +} + +do_execsql_test 2.1.1 { + SELECT c=='Abc' FROM t1 +} {1 1} +do_execsql_test 2.1.2 { + SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1 +} {1 1 1 2} + +do_execsql_test 2.2.1 { + SELECT b=='2' FROM t1 +} {1 0} +do_execsql_test 2.2.2 { + SELECT b=='2', rank() OVER (ORDER BY a) FROM t1 +} {1 1 0 2} + +finish_test + From bedf84c17bb5b5a811cd395892c1f89f5f458b70 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jul 2019 13:45:02 +0000 Subject: [PATCH 95/96] Fix an assert() that [28196d89] caused to fail. FossilOrigin-Name: 8fb0c6d5a38e77aa4c5f394fb8af1b0c7c6a4790e932aabc213a3078ee9acaf6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 10 +++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 605151f859..2d63230ac4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\scollation\ssequences\sand\saffinities\swork\sin\swindow\sfunction\squeries.\sFix\sfor\s[9ece23d2]. -D 2019-07-08T12:01:39.675 +C Fix\san\sassert()\sthat\s[28196d89]\scaused\sto\sfail. +D 2019-07-08T13:45:02.303 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 +F src/build.c 23a0253ab53e62feadcc0c6f31e7e418ef9d4b92c82a1398e98433776b920a4e F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 @@ -1831,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cb3dec427e399064eeec31c15565346f045bd7c46d2f7860b1cd346bbcccb124 -R 8abf67c9f7cb3324d11bb2f1aeec506d +P 28196d894ac9fad9d8f877c7bf17ec9d299d12acdcc942f9ea0783777b14fdc5 +R 82e16c8e60b5eda4b2ce81c779dcc78d U dan -Z 9ad0a93a7b03f31ce9406ff65c3f0b05 +Z 674e911c929b37c09c0bfdce73560c2c diff --git a/manifest.uuid b/manifest.uuid index 418d75eed9..1ebdf8fbdf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28196d894ac9fad9d8f877c7bf17ec9d299d12acdcc942f9ea0783777b14fdc5 \ No newline at end of file +8fb0c6d5a38e77aa4c5f394fb8af1b0c7c6a4790e932aabc213a3078ee9acaf6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 380af8379d..53314593bd 100644 --- a/src/build.c +++ b/src/build.c @@ -618,10 +618,14 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ #ifdef SQLITE_DEBUG /* Record the number of outstanding lookaside allocations in schema Tables - ** prior to doing any free() operations. Since schema Tables do not use - ** lookaside, this number should not change. */ + ** prior to doing any free() operations. Since schema Tables do not use + ** lookaside, this number should not change. + ** + ** If malloc has already failed, it may be that it failed while allocating + ** a Table object that was going to be marked ephemeral. So do not check + ** that no lookaside memory is used in this case either. */ int nLookaside = 0; - if( db && (pTable->tabFlags & TF_Ephemeral)==0 ){ + if( db && !db->mallocFailed && (pTable->tabFlags & TF_Ephemeral)==0 ){ nLookaside = sqlite3LookasideUsed(db, 0); } #endif From 0ba323476a40484243f93019ab6f2dc6df7befd1 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 8 Jul 2019 18:35:51 +0000 Subject: [PATCH 96/96] Fix dbfuzz2 so that it will compile on systems that do not support getrlimit(). FossilOrigin-Name: 36295dcebcb5487f2a462eabb41900ac28b8e839898ef0fae0aa4730bf9b0671 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/dbfuzz2.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2d63230ac4..fc89663fe6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\s[28196d89]\scaused\sto\sfail. -D 2019-07-08T13:45:02.303 +C Fix\sdbfuzz2\sso\sthat\sit\swill\scompile\son\ssystems\sthat\sdo\snot\ssupport\sgetrlimit(). +D 2019-07-08T18:35:51.425 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -795,7 +795,7 @@ F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4964faf F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 6c355cf70c4a308b1b84a11a65282bcac5b4038db77de5cfc8ad080ef371f109 +F test/dbfuzz2.c b93db9056ad057733463ba333f89d2d195a95155805065c5962422955d7fb011 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1831,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 28196d894ac9fad9d8f877c7bf17ec9d299d12acdcc942f9ea0783777b14fdc5 -R 82e16c8e60b5eda4b2ce81c779dcc78d -U dan -Z 674e911c929b37c09c0bfdce73560c2c +P 8fb0c6d5a38e77aa4c5f394fb8af1b0c7c6a4790e932aabc213a3078ee9acaf6 +R dcf77f4d7d0214b8fb64b9a4c8c10b8b +U drh +Z 19085f878a144e5e0a91542256409ad0 diff --git a/manifest.uuid b/manifest.uuid index 1ebdf8fbdf..0157ddcfa6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8fb0c6d5a38e77aa4c5f394fb8af1b0c7c6a4790e932aabc213a3078ee9acaf6 \ No newline at end of file +36295dcebcb5487f2a462eabb41900ac28b8e839898ef0fae0aa4730bf9b0671 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 3e277c9d34..025204dcf9 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -377,6 +377,7 @@ int main(int argc, char **argv){ free(pIn); } } +#ifdef RUSAGE_SELF if( eVerbosity>0 ){ struct rusage x; printf("SQLite %s\n", sqlite3_sourceid()); @@ -385,6 +386,7 @@ int main(int argc, char **argv){ printf("Maximum RSS = %ld KB\n", x.ru_maxrss); } } +#endif return 0; } #endif /*STANDALONE*/

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