From: drh Date: Wed, 24 Feb 2010 15:10:14 +0000 (+0000) Subject: Fix an assertion fault that occurs when two different virtual tables are X-Git-Tag: version-3.7.2~588 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5a29d9cbc525a986e5defe479021be2dbadb675d;p=thirdparty%2Fsqlite.git Fix an assertion fault that occurs when two different virtual tables are used in a single UPDATE statement. Ticket [d2f02d37f52b]. FossilOrigin-Name: ff61e0fd802c46c2d84c4b0c0bc8a0f34959bb25 --- diff --git a/manifest b/manifest index 7b06c0ffa5..60ca55281c 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Fix\sthe\sstmt.test\stest\sscript\sso\sthat\sit\sworks\swith\sSQLITE_TEMP_STORE=3. -D 2010-02-23T21:08:41 +C Fix\san\sassertion\sfault\sthat\soccurs\swhen\stwo\sdifferent\svirtual\stables\sare\nused\sin\sa\ssingle\sUPDATE\sstatement.\nTicket\s[d2f02d37f52b]. +D 2010-02-24T15:10:14 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -167,7 +167,7 @@ F src/printf.c f5c160b471e4a4dd22b756cb4ffe0c6979fd6d24 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c a1648d98e869937b29f4f697461fe4d60f220a7b F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 -F src/select.c 0109b993c360d649857523abb72919e1794f9b45 +F src/select.c 4113ef360430ed4e7533690ef46d06c20204adce F src/shell.c 31cd555125a1fda4a6d8dce019690f043a8e5d75 F src/sqlite.h.in a9f51302109f32e3048358122d1e38fd3ead593f F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89 @@ -743,7 +743,7 @@ F test/vtab6.test c7f290d172609d636fbfc58166eadcb55d5c117c F test/vtab7.test a8c3c3cb3eb60be364991bd714e4927e26c4cd85 F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583 F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b -F test/vtabA.test 0dcd4c81ffb56649f47d1b5fb9c5ae807ccf41f7 +F test/vtabA.test c86e1990b7e1e2bb34602a06fffa4c69f2b516dc F test/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 F test/vtabC.test 1cf7896ab6859bfe3074244b2b0e12de5cbdd766 F test/vtabD.test 74167b1578e5886fe4c886d6bef2fd1406444c42 @@ -794,14 +794,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 9f429434c0404f03a3e5c6741b769afe98a5c6c9 -R bde76a4d1143f986e520d9d13648dec0 +P 8bf710ce6dfab0e6fd4de7d6d3157008cc70d192 +R bebac69f9e91e2bdba37c73f6ba495f8 U drh -Z 0edbafdd674ccf625fff856abe89b43e +Z 0be4993a1f8e20282f72f2cbfcc52d54 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFLhEPdoxKgR168RlERAtn2AJ9MgEQumymw12j/wVK7twO3+yl+LACfcJCz -zJFAoZng83uA0nnQGrI10GM= -=jzra +iD8DBQFLhUFaoxKgR168RlERAp+bAJ9aIMVDQ8Dp1bj/Ib3bZe0DoRm3AACgiGAa +9wkaSzZ50yED/siF1Ki8y5I= +=FpV3 -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 75d7d99d77..bbb86a5880 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8bf710ce6dfab0e6fd4de7d6d3157008cc70d192 \ No newline at end of file +ff61e0fd802c46c2d84c4b0c0bc8a0f34959bb25 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 021c156a50..be4b95c055 100644 --- a/src/select.c +++ b/src/select.c @@ -3327,18 +3327,19 @@ static int selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ struct SrcList_item *pFrom; assert( p->selFlags & SF_Resolved ); - assert( (p->selFlags & SF_HasTypeInfo)==0 ); - p->selFlags |= SF_HasTypeInfo; - pParse = pWalker->pParse; - pTabList = p->pSrc; - for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ - /* A sub-query in the FROM clause of a SELECT */ - Select *pSel = pFrom->pSelect; - assert( pSel ); - while( pSel->pPrior ) pSel = pSel->pPrior; - selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSel); + if( (p->selFlags & SF_HasTypeInfo)==0 ){ + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + assert( pSel ); + while( pSel->pPrior ) pSel = pSel->pPrior; + selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSel); + } } } return WRC_Continue; diff --git a/test/vtabA.test b/test/vtabA.test index 5eba5b5ffa..928cc2b703 100644 --- a/test/vtabA.test +++ b/test/vtabA.test @@ -131,4 +131,23 @@ do_test vtabA-2.4 { analyse_parse {(a whatelse can i hidden test, b HIDDEN hidden)} {a b} } {{} {whatelse can i test} hidden} + +# Ticket [d2f02d37f52bfe23e421f2c60fbb8586ac76ff01]: +# assertion failure on an UPDATE involving two virtual tables. +# +do_test vtabA-3.1 { + db eval { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,2); + CREATE TABLE t2(x,y); + INSERT INTO t2 VALUES(3,4); + CREATE VIRTUAL TABLE vt1 USING echo(t1); + CREATE VIRTUAL TABLE vt2 USING echo(t2); + UPDATE vt2 SET x=(SELECT a FROM vt1 WHERE b=2) WHERE y=4; + SELECT * FROM t2; + } +} {1 4} + finish_test