]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an assertion fault that occurs when two different virtual tables are
authordrh <drh@noemail.net>
Wed, 24 Feb 2010 15:10:14 +0000 (15:10 +0000)
committerdrh <drh@noemail.net>
Wed, 24 Feb 2010 15:10:14 +0000 (15:10 +0000)
used in a single UPDATE statement.
Ticket [d2f02d37f52b].

FossilOrigin-Name: ff61e0fd802c46c2d84c4b0c0bc8a0f34959bb25

manifest
manifest.uuid
src/select.c
test/vtabA.test

index 7b06c0ffa590ae7d173804f54cad733f13dbcb88..60ca55281cdeeb3885de1b7da3cbae79811705d3 100644 (file)
--- 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-----
index 75d7d99d7733f67268e8f62ecc4b3a13447e8527..bbb86a58807339df43913a44759be6cadad4c7c2 100644 (file)
@@ -1 +1 @@
-8bf710ce6dfab0e6fd4de7d6d3157008cc70d192
\ No newline at end of file
+ff61e0fd802c46c2d84c4b0c0bc8a0f34959bb25
\ No newline at end of file
index 021c156a50e31ad233692994f3ed6988266442da..be4b95c0552236cbc6ae6853ed9eda68f85056bc 100644 (file)
@@ -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; i<pTabList->nSrc; 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; i<pTabList->nSrc; 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;
index 5eba5b5ffa8771709dcd28af7fd2af5ad42c405d..928cc2b703a0b129ff765f16c50e9e68d2371228 100644 (file)
@@ -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