From 145d0a35d9c4ad030f67519e1b68b61505d4975f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Nov 2018 22:53:06 +0000 Subject: [PATCH 1/4] In the treeview.c module, break out the display of SrcList into a separate subroutine, so that it can be invoked while debugging. FossilOrigin-Name: 8c74065f0031274d9bc711d5d53c39aefcfb2b2679811105974a2c7c7a9e1dcb --- manifest | 16 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/treeview.c | 68 +++++++++++++++++++++++++++---------------------- 4 files changed, 47 insertions(+), 40 deletions(-) diff --git a/manifest b/manifest index 1ec49b32d9..5b3bf34dfe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\shandling\sof\sSQLITE_FCNTL_PRAGMA\sin\sthe\stest_onefile.c\ndemo. -D 2018-11-07T14:39:22.900 +C In\sthe\streeview.c\smodule,\sbreak\sout\sthe\sdisplay\sof\sSrcList\sinto\sa\sseparate\nsubroutine,\sso\sthat\sit\scan\sbe\sinvoked\swhile\sdebugging. +D 2018-11-08T22:53:06.181 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3 @@ -509,7 +509,7 @@ F src/shell.c.in 060ccc327959bdc85c895015eb382017fd0cd000ebd47b7e8dda42f8aab0b66 F src/sqlite.h.in 1383b2fbce61bd3634caeafb2513205326a297e988ea749d4f6dec7da7a281c9 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 8aef40f6e756120d51de73537dbdcd624f2b2b028fc59baad85e38a83e35d838 +F src/sqliteInt.h cad10b3a482bd5b11f586df9877ff5f637ce14534291a438430d1f1a2b882296 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -568,7 +568,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83 -F src/treeview.c 0ef7dc77d6fe03172ba65dddfd3b3c557b7b7e217ca1963b7665beb266a0e2c0 +F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253 F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd F src/update.c 1816d56c1bca1ba4e0ef98cac2f49be62858e9df1dc08844c7067eb41cc44274 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -1776,7 +1776,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 cbf85284beb60d068b446c52f000d694a810d4de9096ad2951523a4c88e7334c -R 088caf8858ff5594a1a4116e158cb2b6 -U dan -Z 62eba71f05524b2e0125783d546c8de7 +P 13e21b7da8fe754e230b09ca0b9f1f69cd9aa20d4407ddd8b95ca3fb18c9abeb +R 915a30395d1ecdd8d23bc571af6386b9 +U drh +Z 043032fb93e658994b3c5096b42d8a7a diff --git a/manifest.uuid b/manifest.uuid index f301856ba3..31859bc731 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13e21b7da8fe754e230b09ca0b9f1f69cd9aa20d4407ddd8b95ca3fb18c9abeb \ No newline at end of file +8c74065f0031274d9bc711d5d53c39aefcfb2b2679811105974a2c7c7a9e1dcb \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 27caa1ace6..42fc640cc4 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3783,6 +3783,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); + void sqlite3TreeViewSrcList(TreeView*, const SrcList*); void sqlite3TreeViewSelect(TreeView*, const Select*, u8); void sqlite3TreeViewWith(TreeView*, const With*, u8); #ifndef SQLITE_OMIT_WINDOWFUNC diff --git a/src/treeview.c b/src/treeview.c index c8c3b90be1..16fe5c2681 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -121,6 +121,42 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ } } +/* +** Generate a human-readable description of a SrcList object. +*/ +void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + const struct SrcList_item *pItem = &pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3_str_appendf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } +} /* ** Generate a human-readable description of a Select object. @@ -175,39 +211,9 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ } #endif if( p->pSrc && p->pSrc->nSrc ){ - int i; pView = sqlite3TreeViewPush(pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); - for(i=0; ipSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - StrAccum x; - char zLine[100]; - sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); - sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); - if( pItem->zDatabase ){ - sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); - }else if( pItem->zName ){ - sqlite3_str_appendf(&x, " %s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); - } - if( pItem->fg.jointype & JT_LEFT ){ - sqlite3_str_appendf(&x, " LEFT-JOIN"); - } - sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); - if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); - } - if( pItem->fg.isTabFunc ){ - sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); - } - sqlite3TreeViewPop(pView); - } + sqlite3TreeViewSrcList(pView, p->pSrc); sqlite3TreeViewPop(pView); } if( p->pWhere ){ From 0b57d312b7c92020eaf35927f768d1d85fd3c275 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Nov 2018 14:17:51 +0000 Subject: [PATCH 2/4] Fix for ticket [787fa716be3a7f650cac] FossilOrigin-Name: 531eca6104e41e4301fa2cf58bb8fec811da31e151a0f766c93aece5521d235b --- manifest | 14 ++++---- manifest.uuid | 2 +- src/where.c | 1 - test/autoindex5.test | 85 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5b3bf34dfe..93f8e9597f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\streeview.c\smodule,\sbreak\sout\sthe\sdisplay\sof\sSrcList\sinto\sa\sseparate\nsubroutine,\sso\sthat\sit\scan\sbe\sinvoked\swhile\sdebugging. -D 2018-11-08T22:53:06.181 +C Fix\sfor\sticket\s[787fa716be3a7f650cac] +D 2018-11-09T14:17:51.539 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3 @@ -589,7 +589,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c a54a3d639bcd751d1474deff58e239b2e475a96e1b8f9178aa7864df8782a4e3 +F src/where.c f5da1079f084c569aa70fd4ada6b7e45b356e19708f1e5307493cc65857ec9e4 F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f F src/wherecode.c c45f03aefc2266b990df0fc4d7acc4e27f56f881f4fc0fc355b7cbc4d7189da5 F src/whereexpr.c 491f0894ad9903750cdecb7894437a0cabdffdd88f574d2b1c9ac85d14fe4b9c @@ -652,7 +652,7 @@ F test/autoindex1.test a09958fa756129af10b6582bcbf3cbdf11e305e027b393f393caef801 F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test 5f0135dc3b266277b8c1904624439097d8e8020dd7197eda13fda23c35c21a05 +F test/autoindex5.test 4a0eb6c7c7ae456d97a2061d4c8d6380946272c5c91d91507c1feb1af3dc7cce F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e @@ -1776,7 +1776,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 13e21b7da8fe754e230b09ca0b9f1f69cd9aa20d4407ddd8b95ca3fb18c9abeb -R 915a30395d1ecdd8d23bc571af6386b9 +P 8c74065f0031274d9bc711d5d53c39aefcfb2b2679811105974a2c7c7a9e1dcb +R 2aed8ed9bf698610f2ccf16db30ac97b U drh -Z 043032fb93e658994b3c5096b42d8a7a +Z 05df484bedb945ae17a7cf3ccd63a280 diff --git a/manifest.uuid b/manifest.uuid index 31859bc731..7fbf2352be 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c74065f0031274d9bc711d5d53c39aefcfb2b2679811105974a2c7c7a9e1dcb \ No newline at end of file +531eca6104e41e4301fa2cf58bb8fec811da31e151a0f766c93aece5521d235b \ No newline at end of file diff --git a/src/where.c b/src/where.c index bfc11eec18..f4d4138c8f 100644 --- a/src/where.c +++ b/src/where.c @@ -854,7 +854,6 @@ static void constructAutomaticIndex( translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, pTabItem->regResult, 1); sqlite3VdbeGoto(v, addrTop); - pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); } diff --git a/test/autoindex5.test b/test/autoindex5.test index aba546a1ec..368f2d302c 100644 --- a/test/autoindex5.test +++ b/test/autoindex5.test @@ -123,6 +123,91 @@ do_execsql_test 2.1 { SELECT sum(z) FROM vvv WHERE x='aaa' ) FROM one; } {8.0} + +# Ticket https://www.sqlite.org/src/info/787fa716be3a7f65 +# Segfault due to multiple uses of the same subquery where the +# subquery is implemented via coroutine. +# +sqlite3 db :memory: +do_execsql_test 3.0 { + -- This is the original test case reported on the mailing list + CREATE TABLE artists ( + id integer NOT NULL PRIMARY KEY AUTOINCREMENT, + name varchar(255) + ); + CREATE TABLE albums ( + id integer NOT NULL PRIMARY KEY AUTOINCREMENT, + name varchar(255), + artist_id integer REFERENCES artists + ); + INSERT INTO artists (name) VALUES ('Ar'); + INSERT INTO albums (name, artist_id) VALUES ('Al', 1); + SELECT artists.* + FROM artists + INNER JOIN artists AS 'b' ON (b.id = artists.id) + WHERE (artists.id IN ( + SELECT albums.artist_id + FROM albums + WHERE ((name = 'Al') + AND (albums.artist_id IS NOT NULL) + AND (albums.id IN ( + SELECT id + FROM ( + SELECT albums.id, + row_number() OVER ( + PARTITION BY albums.artist_id + ORDER BY name + ) AS 'x' + FROM albums + WHERE (name = 'Al') + ) AS 't1' + WHERE (x = 1) + )) + AND (albums.id IN (1, 2))) + )); +} {1 Ar} +# The remaining test cases were discovered (by Dan) during trouble-shooting +sqlite3 db :memory: +do_execsql_test 3.1 { + CREATE TABLE t1 (a); INSERT INTO t1 (a) VALUES (104); + CREATE TABLE t2 (b); INSERT INTO t2 (b) VALUES (104); + CREATE TABLE t3 (c); INSERT INTO t3 (c) VALUES (104); + CREATE TABLE t4 (d); INSERT INTO t4 (d) VALUES (104); + SELECT * + FROM t1 CROSS JOIN t2 ON (t1.a = t2.b) WHERE t2.b IN ( + SELECT t3.c + FROM t3 + WHERE t3.c IN ( + SELECT d FROM (SELECT DISTINCT d FROM t4) AS x WHERE x.d=104 + ) + ); +} {104 104} +sqlite3 db :memory: +do_execsql_test 3.2 { + CREATE TABLE t5(a, b, c, d); + CREATE INDEX t5a ON t5(a); + CREATE INDEX t5b ON t5(b); + CREATE TABLE t6(e); + INSERT INTO t6 VALUES(1); + INSERT INTO t5 VALUES(1,1,1,1), (2,2,2,2); + SELECT * FROM t5 WHERE (a=1 OR b=2) AND c IN ( + SELECT e FROM (SELECT DISTINCT e FROM t6) WHERE e=1 + ); +} {1 1 1 1} +sqlite3 db :memory: +do_execsql_test 3.3 { + CREATE TABLE t1(a1, a2, a3); + CREATE INDEX t1a2 ON t1(a2, a1); + CREATE INDEX t1a3 ON t1(a3, a1); + CREATE TABLE t2(d); + INSERT INTO t1 VALUES(3, 1, 1), (3, 2, 2); + INSERT INTO t2 VALUES(3); + SELECT *, 'x' FROM t1 WHERE (a2=1 OR a3=2) AND a1 = ( + SELECT d FROM (SELECT DISTINCT d FROM t2) WHERE d=3 + ); +} {3 1 1 x 3 2 2 x} + + finish_test From b4307018231380dd8d997fe5fc40fc1a5d135cdb Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Nov 2018 20:04:05 +0000 Subject: [PATCH 3/4] When a table is renamed using "ALTER TABLE RENAME TO", update any REFERENCES clauses that refer to the table, unless "PRAGMA legacy_alter_table" is true and "PRAGMA foreign_keys" is set to false (i.e. so that when "PRAGMA legacy_alter_table" is set behaviour is still compatible with versions 3.24 and earlier). FossilOrigin-Name: ae9638e9c0ad0c366f93c88a850f6b4cc86881e9f3f9f1e39574d9d83ddd8a6a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 2 +- test/altertab2.test | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 93f8e9597f..a214cdad39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfor\sticket\s[787fa716be3a7f650cac] -D 2018-11-09T14:17:51.539 +C When\sa\stable\sis\srenamed\susing\s"ALTER\sTABLE\sRENAME\sTO",\supdate\sany\sREFERENCES\nclauses\sthat\srefer\sto\sthe\stable,\sunless\s"PRAGMA\slegacy_alter_table"\sis\strue\nand\s"PRAGMA\sforeign_keys"\sis\sset\sto\sfalse\s(i.e.\sso\sthat\swhen\s"PRAGMA\nlegacy_alter_table"\sis\sset\sbehaviour\sis\sstill\scompatible\swith\sversions\s3.24\nand\searlier). +D 2018-11-09T20:04:05.243 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3 @@ -438,7 +438,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c bcb67339d8551408bfc99aa78b597abdc9b880114bc4e42027f9a02615df4f43 +F src/alter.c 61c1ace40a9e39c45a975cb6c57a1a283a262ea21bbe3fb5b473708b790a8d43 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -612,7 +612,7 @@ F test/alterlegacy.test e7c07d605c2a85e7d1696c89e6bf64dfc932fc6d9320fe8708c8f5fc F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test fb8a9a2ab6deb5f860d27675f6213d14ab79b705e0d6350eead4ef3a3f73bf3e -F test/altertab2.test 159fd5f7b23ddc841fe678f579f9b1b8e69f44296f3ff75d1b4c155d37a59832 +F test/altertab2.test 7b3f4a6ca0dd833b75b889477a3e291e2799b4af25db908fe6930e39a353b1eb F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test b3a9c67d00e1df7588a5b7be9a0292899f94fe8cac1f94a017277474ca2e59df F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1776,7 +1776,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 8c74065f0031274d9bc711d5d53c39aefcfb2b2679811105974a2c7c7a9e1dcb -R 2aed8ed9bf698610f2ccf16db30ac97b -U drh -Z 05df484bedb945ae17a7cf3ccd63a280 +P 531eca6104e41e4301fa2cf58bb8fec811da31e151a0f766c93aece5521d235b +R 3008a464d47aa62c3381b1fbed0d8cef +U dan +Z fb8f8ebbdb0cc9c0ada9657c20228c06 diff --git a/manifest.uuid b/manifest.uuid index 7fbf2352be..fd03e49d4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -531eca6104e41e4301fa2cf58bb8fec811da31e151a0f766c93aece5521d235b \ No newline at end of file +ae9638e9c0ad0c366f93c88a850f6b4cc86881e9f3f9f1e39574d9d83ddd8a6a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f0f913b1c5..1338b60478 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1444,7 +1444,7 @@ static void renameTableFunc( }else{ /* Modify any FK definitions to point to the new table. */ #ifndef SQLITE_OMIT_FOREIGN_KEY - if( db->flags & SQLITE_ForeignKeys ){ + if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){ FKey *pFKey; for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ diff --git a/test/altertab2.test b/test/altertab2.test index 5656def81a..2b2a0fb1e0 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -41,6 +41,50 @@ ifcapable fts5 { } {hello world in tcl} } +#------------------------------------------------------------------------- +# Check that table names that appear in REFERENCES clauses are updated +# when a table is renamed unless: +# +# a) "PRAGMA legacy_alter_table" is true, and +# b) "PRAGMA foreign_keys" is false. +# +do_execsql_test 2.0 { + CREATE TABLE p1(a PRIMARY KEY, b); + CREATE TABLE c1(x REFERENCES p1); + CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES p1); + CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES p1(a)); +} + +do_execsql_test 2.1 { + ALTER TABLE p1 RENAME TO p2; + SELECT sql FROM sqlite_master WHERE name LIKE 'c%'; +} { + {CREATE TABLE c1(x REFERENCES "p2")} + {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p2")} + {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p2"(a))} +} + +do_execsql_test 2.2 { + PRAGMA legacy_alter_table = 1; + ALTER TABLE p2 RENAME TO p3; + SELECT sql FROM sqlite_master WHERE name LIKE 'c%'; +} { + {CREATE TABLE c1(x REFERENCES "p2")} + {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p2")} + {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p2"(a))} +} + +do_execsql_test 2.3 { + ALTER TABLE p3 RENAME TO p2; + PRAGMA foreign_keys = 1; + ALTER TABLE p2 RENAME TO p3; + SELECT sql FROM sqlite_master WHERE name LIKE 'c%'; +} { + {CREATE TABLE c1(x REFERENCES "p3")} + {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p3")} + {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p3"(a))} +} + finish_test From ac4b8dea9b0dbae20b28db43c36f347d7043b0c5 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Nov 2018 23:41:57 +0000 Subject: [PATCH 4/4] Fix invalid use of unprotected sqlite3_value objects in the sqldiff utility, when using the --changeset option. FossilOrigin-Name: a8d65214a567eb1afd703ee4d09d398247e060a610b46097a726364db2861001 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/sqldiff.c | 30 +++++++++++++++--------------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index a214cdad39..749239362f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\stable\sis\srenamed\susing\s"ALTER\sTABLE\sRENAME\sTO",\supdate\sany\sREFERENCES\nclauses\sthat\srefer\sto\sthe\stable,\sunless\s"PRAGMA\slegacy_alter_table"\sis\strue\nand\s"PRAGMA\sforeign_keys"\sis\sset\sto\sfalse\s(i.e.\sso\sthat\swhen\s"PRAGMA\nlegacy_alter_table"\sis\sset\sbehaviour\sis\sstill\scompatible\swith\sversions\s3.24\nand\searlier). -D 2018-11-09T20:04:05.243 +C Fix\sinvalid\suse\sof\sunprotected\ssqlite3_value\sobjects\sin\sthe\ssqldiff\sutility,\nwhen\susing\sthe\s--changeset\soption. +D 2018-11-09T23:41:57.373 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3 @@ -1741,7 +1741,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 579d7e4e42c30a963781654c87d2868823120b55d59e16ca77b0edbab0218713 +F tool/sqldiff.c 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1776,7 +1776,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 531eca6104e41e4301fa2cf58bb8fec811da31e151a0f766c93aece5521d235b -R 3008a464d47aa62c3381b1fbed0d8cef -U dan -Z fb8f8ebbdb0cc9c0ada9657c20228c06 +P ae9638e9c0ad0c366f93c88a850f6b4cc86881e9f3f9f1e39574d9d83ddd8a6a +R 17ad9438f43deccbfad222dc84835b58 +U drh +Z 652d33c6a72178cf44c31358633e89a7 diff --git a/manifest.uuid b/manifest.uuid index fd03e49d4e..e1bfe3befc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae9638e9c0ad0c366f93c88a850f6b4cc86881e9f3f9f1e39574d9d83ddd8a6a \ No newline at end of file +a8d65214a567eb1afd703ee4d09d398247e060a610b46097a726364db2861001 \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 509470a156..9f5b6fe6d9 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -1493,8 +1493,8 @@ static void putsVarint(FILE *out, sqlite3_uint64 v){ /* ** Write an SQLite value onto out. */ -static void putValue(FILE *out, sqlite3_value *pVal){ - int iDType = sqlite3_value_type(pVal); +static void putValue(FILE *out, sqlite3_stmt *pStmt, int k){ + int iDType = sqlite3_column_type(pStmt, k); sqlite3_int64 iX; double rX; sqlite3_uint64 uX; @@ -1503,24 +1503,24 @@ static void putValue(FILE *out, sqlite3_value *pVal){ putc(iDType, out); switch( iDType ){ case SQLITE_INTEGER: - iX = sqlite3_value_int64(pVal); + iX = sqlite3_column_int64(pStmt, k); memcpy(&uX, &iX, 8); for(j=56; j>=0; j-=8) putc((uX>>j)&0xff, out); break; case SQLITE_FLOAT: - rX = sqlite3_value_double(pVal); + rX = sqlite3_column_double(pStmt, k); memcpy(&uX, &rX, 8); for(j=56; j>=0; j-=8) putc((uX>>j)&0xff, out); break; case SQLITE_TEXT: - iX = sqlite3_value_bytes(pVal); + iX = sqlite3_column_bytes(pStmt, k); putsVarint(out, (sqlite3_uint64)iX); - fwrite(sqlite3_value_text(pVal),1,(size_t)iX,out); + fwrite(sqlite3_column_text(pStmt, k),1,(size_t)iX,out); break; case SQLITE_BLOB: - iX = sqlite3_value_bytes(pVal); + iX = sqlite3_column_bytes(pStmt, k); putsVarint(out, (sqlite3_uint64)iX); - fwrite(sqlite3_value_blob(pVal),1,(size_t)iX,out); + fwrite(sqlite3_column_blob(pStmt, k),1,(size_t)iX,out); break; case SQLITE_NULL: break; @@ -1650,10 +1650,10 @@ static void changeset_one_table(const char *zTab, FILE *out){ case SQLITE_UPDATE: { for(k=1, i=0; i