From a192807c132854b8da42aad2ba0d03b26751fce4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Jul 2020 13:11:19 +0000 Subject: [PATCH 1/5] Faster column name lookup in the columnIndex() routine using hashing. FossilOrigin-Name: de2a90812498e504c9b8eeb83bfc48a948b45e87bdfa242c0aa9f0377d90740f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2abeb64294..887f099cbb 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Fix\stest\scase\sresult\son\sa\sDELETE\swith\san\sINDEXED\sBY\sclause\sdue\sto\nimprovements\sin\sthe\squery\splanner\sat\s[d901837fea1ed54d] -D 2020-07-18T18:59:11.167 +C Faster\scolumn\sname\slookup\sin\sthe\scolumnIndex()\sroutine\susing\shashing. +D 2020-07-20T13:11:19.877 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -28,7 +28,7 @@ F src/parse.y 5bdb760a29c0b25caf7e80e82210b81cd2ea3066d5199ca29e6eac40b34bc184 F src/pragma.c ae499b5ab8f4e833f67e28bf2322500e9aa612aadf12581d1324333f848d8b51 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e -F src/select.c ee84981a346ddddf5669db441a68fac763f4266fe83a9cb27e43c67fbcf1b215 +F src/select.c 835a86f1064b5b744c22166ef10a9f598be266feccef3128122ad5f8e9bd9dbc F src/shell.c.in 81fa23ac1a3d6ac9ed13e9ae711a3d8806396ca7cc12c5d6a2e2536f70b0c7ad F src/sqliteInt.h 9682c3ce6b970b3a997d65c140bdb5b286a04188e4e1c8489b64a525161ecb30 F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8 @@ -70,7 +70,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P 4c0d208c455abb983217a6dfea7634f677f8360fb57857e1421334fe7a5a23e2 -R 61a02552087d7d7a36de6e291a7a443b +P 020dbfa2aef20e5872cc3e785d99f45903843401292114b5092b9c8aa829b9c3 +R dd7292537766c9a2f1a52ad731c64848 U drh -Z bcc70f031a6dba86e55b60ee851e59f9 +Z b4e9384168d028fbccb483cf5527f35f diff --git a/manifest.uuid b/manifest.uuid index 2e1e533cca..1a5dcc7fbc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -020dbfa2aef20e5872cc3e785d99f45903843401292114b5092b9c8aa829b9c3 \ No newline at end of file +de2a90812498e504c9b8eeb83bfc48a948b45e87bdfa242c0aa9f0377d90740f \ No newline at end of file diff --git a/src/select.c b/src/select.c index cbc64e3c23..903b90a5d3 100644 --- a/src/select.c +++ b/src/select.c @@ -264,8 +264,10 @@ int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ */ static int columnIndex(Table *pTab, const char *zCol){ int i; - for(i=0; inCol; i++){ - if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; + u8 h = sqlite3StrIHash(zCol); + Column *pCol; + for(pCol=pTab->aCol, i=0; inCol; pCol++, i++){ + if( pCol->hName==h && sqlite3StrICmp(pCol->zName, zCol)==0 ) return i; } return -1; } From 09cf569292aaf37a7678524f8c8270c1f6612c67 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Jul 2020 18:07:35 +0000 Subject: [PATCH 2/5] Fix a corner-case error in the new UPDATE FROM logic helpfully discovered by OSSFuzz. FossilOrigin-Name: 5cc200939d3a33566ddb858fc74c878acc72cfe5cf4c9b1d08e7b13e4d5ff566 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 9 ++++++++- test/upfrom1.test | 11 +++++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 887f099cbb..6d0802502a 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Faster\scolumn\sname\slookup\sin\sthe\scolumnIndex()\sroutine\susing\shashing. -D 2020-07-20T13:11:19.877 +C Fix\sa\scorner-case\serror\sin\sthe\snew\sUPDATE\sFROM\slogic\shelpfully\sdiscovered\nby\sOSSFuzz. +D 2020-07-20T18:07:35.022 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -28,7 +28,7 @@ F src/parse.y 5bdb760a29c0b25caf7e80e82210b81cd2ea3066d5199ca29e6eac40b34bc184 F src/pragma.c ae499b5ab8f4e833f67e28bf2322500e9aa612aadf12581d1324333f848d8b51 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e -F src/select.c 835a86f1064b5b744c22166ef10a9f598be266feccef3128122ad5f8e9bd9dbc +F src/select.c 39c6b63d996f9a24b34d2ccf38f67a7283355056011c2bb1b135daed7a715cf5 F src/shell.c.in 81fa23ac1a3d6ac9ed13e9ae711a3d8806396ca7cc12c5d6a2e2536f70b0c7ad F src/sqliteInt.h 9682c3ce6b970b3a997d65c140bdb5b286a04188e4e1c8489b64a525161ecb30 F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8 @@ -57,7 +57,7 @@ F test/speedtest1.c a8b5afe72d78ff365012aba48d3f0c579e957facb7630f765f58a6ae4656 F test/tester.tcl 174f668fcb4569a775bf24534ac8e59ce47d3a56d37c3465d1857f027e7ec136 F test/triggerupfrom.test d25961fa70a99b6736193da7b49a36d8c1d28d56188f0be6406d4366315cd6e4 F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9041 -F test/upfrom1.test c0a99a3f44b42beaca37c62e05332d64768c326c75b4edf976533a2d1ef76895 +F test/upfrom1.test d18f69f7c691bc791e7f31bf0e354eeff04cf2f44edc32d6b1928bad71697073 F test/upfrom2.test 6ebd3be8c3fac984e89a177d823686f04605b512fc167392bce6d8ba2ba63325 F test/upfrom3.test 7dab379d128e8dd7beb2055b295fb113c7ba93e8c2038f5ddb7a4a10f0ebb348 F test/upfromfault.test 70ecf8eb85559727a487283f69374e3ae39879e994d8a2437c49d7c05ecb70c9 @@ -70,7 +70,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P 020dbfa2aef20e5872cc3e785d99f45903843401292114b5092b9c8aa829b9c3 -R dd7292537766c9a2f1a52ad731c64848 +P de2a90812498e504c9b8eeb83bfc48a948b45e87bdfa242c0aa9f0377d90740f +R 63d0c6e2d5ef247c5f1458f1099377ab U drh -Z b4e9384168d028fbccb483cf5527f35f +Z b970f4086adbbc294d690e39a6ac70c0 diff --git a/manifest.uuid b/manifest.uuid index 1a5dcc7fbc..14915032f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de2a90812498e504c9b8eeb83bfc48a948b45e87bdfa242c0aa9f0377d90740f \ No newline at end of file +5cc200939d3a33566ddb858fc74c878acc72cfe5cf4c9b1d08e7b13e4d5ff566 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 903b90a5d3..ebb764573e 100644 --- a/src/select.c +++ b/src/select.c @@ -1138,7 +1138,14 @@ static void selectInnerLoop( { int i2 = pDest->iSDParm2; int r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_MakeRecord,regResult+(i2<0),nResultCol-(i2<0),r1); + + /* If the UPDATE FROM join is an aggregate that matches no rows, it + ** might still be trying to return one row, because that is what + ** aggregates do. Don't record that empty row in the output table. */ + sqlite3VdbeAddOp2(v, OP_IsNull, regResult, iBreak); VdbeCoverage(v); + + sqlite3VdbeAddOp3(v, OP_MakeRecord, + regResult+(i2<0), nResultCol-(i2<0), r1); if( i2<0 ){ sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); }else{ diff --git a/test/upfrom1.test b/test/upfrom1.test index 6153ca4588..7996f97702 100644 --- a/test/upfrom1.test +++ b/test/upfrom1.test @@ -164,4 +164,15 @@ do_test 2.3.2 { catch { execsql { UPDATE t5 AS apples SET b=1 FROM t5 AS apples; } } } 1 +# Problem found by OSSFuzz on 2020-07-20 +# https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24282 +# +reset_db +do_execsql_test 3.1 { + CREATE TABLE t0(a); + CREATE TABLE t1(b); + UPDATE t1 SET b=sum(a) FROM t0; + SELECT * FROM t0, t1; +} {} + finish_test From bbd620e22cb9c3e0b2dcfc094827968e438fabdf Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Jul 2020 23:33:11 +0000 Subject: [PATCH 3/5] Fix the ".read" command so that it gives an error when its argument is a directory. See [https://sqlite.org/forum/forumpost/4c53c434ca|forum message 4c53c434ca]. FossilOrigin-Name: 6d258c3c7ecafa1114e4a63739971ff527580868659c2f2c47d2c0adb92c1453 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 20 ++++++++++++++++++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6d0802502a..1c0d2b40b6 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Fix\sa\scorner-case\serror\sin\sthe\snew\sUPDATE\sFROM\slogic\shelpfully\sdiscovered\nby\sOSSFuzz. -D 2020-07-20T18:07:35.022 +C Fix\sthe\s".read"\scommand\sso\sthat\sit\sgives\san\serror\swhen\sits\sargument\sis\na\sdirectory.\nSee\s[https://sqlite.org/forum/forumpost/4c53c434ca|forum\smessage\s4c53c434ca]. +D 2020-07-20T23:33:11.707 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -29,7 +29,7 @@ F src/pragma.c ae499b5ab8f4e833f67e28bf2322500e9aa612aadf12581d1324333f848d8b51 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e F src/select.c 39c6b63d996f9a24b34d2ccf38f67a7283355056011c2bb1b135daed7a715cf5 -F src/shell.c.in 81fa23ac1a3d6ac9ed13e9ae711a3d8806396ca7cc12c5d6a2e2536f70b0c7ad +F src/shell.c.in 352a0a6399ccae40a30f72ea06f52f3791a062bde9b8929a97f345e1584ba310 F src/sqliteInt.h 9682c3ce6b970b3a997d65c140bdb5b286a04188e4e1c8489b64a525161ecb30 F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8 F src/test_malloc.c 21121ea85b49ec0bdb69995847cef9036ef9beca3ce63bbb776e4ea2ecc44b97 @@ -70,7 +70,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P de2a90812498e504c9b8eeb83bfc48a948b45e87bdfa242c0aa9f0377d90740f -R 63d0c6e2d5ef247c5f1458f1099377ab +P 5cc200939d3a33566ddb858fc74c878acc72cfe5cf4c9b1d08e7b13e4d5ff566 +R 31bbfdd93c9215857f0fa05ed289844e U drh -Z b970f4086adbbc294d690e39a6ac70c0 +Z 4ed324ec08dc243e01ea3575725217a0 diff --git a/manifest.uuid b/manifest.uuid index 14915032f7..dc3e5ac416 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5cc200939d3a33566ddb858fc74c878acc72cfe5cf4c9b1d08e7b13e4d5ff566 \ No newline at end of file +6d258c3c7ecafa1114e4a63739971ff527580868659c2f2c47d2c0adb92c1453 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 78a80da3e9..ee0bc82bec 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -623,6 +623,21 @@ static int strlenChar(const char *z){ return n; } +/* +** Return true if zFile does not exist or if it is not an ordinary file. +*/ +#ifdef _WIN32 +# define notNormalFile(X) 0 +#else +static int notNormalFile(const char *zFile){ + struct stat x; + int rc; + memset(&x, 0, sizeof(x)); + rc = stat(zFile, &x); + return rc || !S_ISREG(x.st_mode); +} +#endif + /* ** This routine reads a line of text from FILE in, stores ** the text in memory obtained from malloc() and returns a pointer @@ -8932,8 +8947,9 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = 1; goto meta_command_exit; } - p->in = fopen(azArg[1], "rb"); - if( p->in==0 ){ + if( notNormalFile(azArg[1]) + || (p->in = fopen(azArg[1], "rb"))==0 + ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; }else{ From 82b0f106ce12c3b14508f8a395d0fc2fbf95244a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 21 Jul 2020 18:25:19 +0000 Subject: [PATCH 4/5] Add the sqlite3Int64ToText() routine and use it to convert integers to text, as it is much faster than the generic text formatter. FossilOrigin-Name: 14eed318aa9e6e16d1aa13a9f34e3822aa135c39ba06c77df7743509fed6c95e --- manifest | 16 +++++++++------- manifest.uuid | 2 +- src/date.c | 4 ++-- src/sqliteInt.h | 1 + src/util.c | 24 ++++++++++++++++++++++++ src/vdbemem.c | 14 +++++++------- 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 1c0d2b40b6..e8eb1919a1 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Fix\sthe\s".read"\scommand\sso\sthat\sit\sgives\san\serror\swhen\sits\sargument\sis\na\sdirectory.\nSee\s[https://sqlite.org/forum/forumpost/4c53c434ca|forum\smessage\s4c53c434ca]. -D 2020-07-20T23:33:11.707 +C Add\sthe\ssqlite3Int64ToText()\sroutine\sand\suse\sit\sto\sconvert\sintegers\sto\stext,\nas\sit\sis\smuch\sfaster\sthan\sthe\sgeneric\stext\sformatter. +D 2020-07-21T18:25:19.943 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -20,6 +20,7 @@ F src/attach.c 0b11e00c166b622c84ec176773b1d691c61ad07d247809e3e1635d4e99e71d30 F src/btree.c b8b0e80c8bbe4e1fb35ae559e9e9aa009799c20cf12f159ebb503b05be1fab9b F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf F src/build.c 45d912640987426442eb9eeec695c4dd45dd440b4cd27e8c13a42eed2fa87dcd +F src/date.c dace306a10d9b02ee553d454c8e1cf8d3c9b932e137738a6b15b90253a9bfc10 F src/delete.c 410c771c25afc113c273d9efad6ab6881bda28c75a1838b9d2c52ba20d1dc704 F src/expr.c 90039a043658ce78c3237ba5064c0934b7294120f6adc387f8d0fba306028154 F src/malloc.c 22d5bdd9fe88ae4fad1b91a1b9735104b82853ffef868f1f05517d60dc1875f5 @@ -30,14 +31,15 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e F src/select.c 39c6b63d996f9a24b34d2ccf38f67a7283355056011c2bb1b135daed7a715cf5 F src/shell.c.in 352a0a6399ccae40a30f72ea06f52f3791a062bde9b8929a97f345e1584ba310 -F src/sqliteInt.h 9682c3ce6b970b3a997d65c140bdb5b286a04188e4e1c8489b64a525161ecb30 +F src/sqliteInt.h e07f073568a07e6b96c99a08ec650e2dd88a3a3229dbaeb0ed09a5f1b215e405 F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8 F src/test_malloc.c 21121ea85b49ec0bdb69995847cef9036ef9beca3ce63bbb776e4ea2ecc44b97 F src/trigger.c ef67bde309a831515dc3c2173d792574309f2f42d45f8c078743fae9f7f98c75 F src/update.c fb15bec5b54fd098f4b84f6abc83c7103b45ba8484011fff8edf5ae31656eab6 -F src/util.c c0bacc165f46169d2b720c37c8719165e383211698fad1de39dd16a8c161815a +F src/util.c 98ae6ee20504a963c9073154eb80ceded7f595a6435b6f866cd69e92a214951c F src/vdbe.c 981666c49d33039df6dc9fccd40191575586ac4866255b2f57819cc5eb99f572 F src/vdbeapi.c c1a9004ac554d8d48794d2ce5f80397f8e419fd28643a543cc1e004c7713c3ef +F src/vdbemem.c 26b6393cf4f0d9b16913b8759ed99f311dab7887d2ae1866580e12b7a90bf372 F src/where.c 2ea911238674e9baaeddf105dddabed92692a01996073c4d4983f9a7efe481f9 F src/window.c 0dec178bfa541c757d15a2be78f34aea36393a0966600366810e5f8739ccf370 F test/altertab.test b8b2104212e8ea87c75c3cbe3cb78ed7236a6c828ee2e59ed09d3dbe9812d002 @@ -70,7 +72,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P 5cc200939d3a33566ddb858fc74c878acc72cfe5cf4c9b1d08e7b13e4d5ff566 -R 31bbfdd93c9215857f0fa05ed289844e +P 6d258c3c7ecafa1114e4a63739971ff527580868659c2f2c47d2c0adb92c1453 +R c6088ea0c8431e235c910d4f8e65c23f U drh -Z 4ed324ec08dc243e01ea3575725217a0 +Z 7f0d2c84e154f159195756859765e9e4 diff --git a/manifest.uuid b/manifest.uuid index dc3e5ac416..5217787b02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6d258c3c7ecafa1114e4a63739971ff527580868659c2f2c47d2c0adb92c1453 \ No newline at end of file +14eed318aa9e6e16d1aa13a9f34e3822aa135c39ba06c77df7743509fed6c95e \ No newline at end of file diff --git a/src/date.c b/src/date.c index 9cba27f591..1db26b1c69 100644 --- a/src/date.c +++ b/src/date.c @@ -1112,8 +1112,8 @@ static void strftimeFunc( case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; case 's': { - sqlite3_snprintf(30,&z[j],"%lld", - (i64)(x.iJD/1000 - 21086676*(i64)10000)); + i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); + sqlite3Int64ToText(iS, &z[j]); j += sqlite3Strlen30(&z[j]); break; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 68f08bc2eb..4c09ac214c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4462,6 +4462,7 @@ int sqlite3FixExpr(DbFixer*, Expr*); int sqlite3FixExprList(DbFixer*, ExprList*); int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); int sqlite3RealSameAsInt(double,sqlite3_int64); +void sqlite3Int64ToText(i64,char*); 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 9c462cc670..a195b1500e 100644 --- a/src/util.c +++ b/src/util.c @@ -595,6 +595,30 @@ do_atof_calc: #pragma warning(default : 4756) #endif +/* +** Render an signed 64-bit integer as text. Store the result in zOut[]. +** +** The caller must ensure that zOut[] is at least 21 bytes in size. +*/ +void sqlite3Int64ToText(i64 v, char *zOut){ + int i; + u64 x; + char zTemp[22]; + if( v<0 ){ + x = (v==SMALLEST_INT64) ? ((u64)1)<<63 : -v; + }else{ + x = v; + } + i = sizeof(zTemp)-2; + zTemp[sizeof(zTemp)-1] = 0; + do{ + zTemp[i--] = (x%10) + '0'; + x = x/10; + }while( x ); + if( v<0 ) zTemp[i--] = '-'; + memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i); +} + /* ** Compare the 19-character string zNum against the text representation ** value 2^63: 9223372036854775808. Return negative, zero, or positive diff --git a/src/vdbemem.c b/src/vdbemem.c index 16d1ac8b08..01d7629c1b 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -104,16 +104,16 @@ int sqlite3VdbeCheckMemInvariants(Mem *p){ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ StrAccum acc; assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) ); - sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); + assert( sz>22 ); if( p->flags & MEM_Int ){ - sqlite3_str_appendf(&acc, "%lld", p->u.i); - }else if( p->flags & MEM_IntReal ){ - sqlite3_str_appendf(&acc, "%!.15g", (double)p->u.i); + sqlite3Int64ToText(p->u.i, zBuf); }else{ - sqlite3_str_appendf(&acc, "%!.15g", p->u.r); + sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); + sqlite3_str_appendf(&acc, "%!.15g", + (p->flags & MEM_IntReal)!=0 ? (double)p->u.i : p->u.r); + assert( acc.zText==zBuf && acc.mxAlloc<=0 ); + zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */ } - assert( acc.zText==zBuf && acc.mxAlloc<=0 ); - zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */ } #ifdef SQLITE_DEBUG From 2f04583f041c7b49b0db98d3a653dd0f802b6284 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 21 Jul 2020 18:36:06 +0000 Subject: [PATCH 5/5] Work-around for [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270|GCC bug 96270]. FossilOrigin-Name: 9679c0c61131f0e986551701a64191da0ee0f50880eaa57fe4bf520e3fecf634 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e8eb1919a1..bfa9ecd786 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b -C Add\sthe\ssqlite3Int64ToText()\sroutine\sand\suse\sit\sto\sconvert\sintegers\sto\stext,\nas\sit\sis\smuch\sfaster\sthan\sthe\sgeneric\stext\sformatter. -D 2020-07-21T18:25:19.943 +C Work-around\sfor\s[https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270|GCC\sbug\s96270]. +D 2020-07-21T18:36:06.197 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8 @@ -39,7 +39,7 @@ F src/update.c fb15bec5b54fd098f4b84f6abc83c7103b45ba8484011fff8edf5ae31656eab6 F src/util.c 98ae6ee20504a963c9073154eb80ceded7f595a6435b6f866cd69e92a214951c F src/vdbe.c 981666c49d33039df6dc9fccd40191575586ac4866255b2f57819cc5eb99f572 F src/vdbeapi.c c1a9004ac554d8d48794d2ce5f80397f8e419fd28643a543cc1e004c7713c3ef -F src/vdbemem.c 26b6393cf4f0d9b16913b8759ed99f311dab7887d2ae1866580e12b7a90bf372 +F src/vdbemem.c 947f2a65910edb4014dc981d33e414a68c51f169f9df8c4c493a0ba840b6eb1f F src/where.c 2ea911238674e9baaeddf105dddabed92692a01996073c4d4983f9a7efe481f9 F src/window.c 0dec178bfa541c757d15a2be78f34aea36393a0966600366810e5f8739ccf370 F test/altertab.test b8b2104212e8ea87c75c3cbe3cb78ed7236a6c828ee2e59ed09d3dbe9812d002 @@ -72,7 +72,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58 -P 6d258c3c7ecafa1114e4a63739971ff527580868659c2f2c47d2c0adb92c1453 -R c6088ea0c8431e235c910d4f8e65c23f +P 14eed318aa9e6e16d1aa13a9f34e3822aa135c39ba06c77df7743509fed6c95e +R 7d68dfef8f54ff612340b00b3b6644f1 U drh -Z 7f0d2c84e154f159195756859765e9e4 +Z a26de3a893be447e4c173c68496f3e02 diff --git a/manifest.uuid b/manifest.uuid index 5217787b02..eb3c4cd53b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14eed318aa9e6e16d1aa13a9f34e3822aa135c39ba06c77df7743509fed6c95e \ No newline at end of file +9679c0c61131f0e986551701a64191da0ee0f50880eaa57fe4bf520e3fecf634 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 01d7629c1b..384eacc015 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -106,7 +106,16 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) ); assert( sz>22 ); if( p->flags & MEM_Int ){ +#if GCC_VERSION>=7000000 + /* Work-around for GCC bug + ** https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270 */ + i64 x; + assert( (p->flags&MEM_Int)*2==sizeof(x) ); + memcpy(&x, (char*)&p->u, (p->flags&MEM_Int)*2); + sqlite3Int64ToText(x, zBuf); +#else sqlite3Int64ToText(p->u.i, zBuf); +#endif }else{ sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0); sqlite3_str_appendf(&acc, "%!.15g",