]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When parsing the schema, check for duplicate index root page numbers before adding...
authordan <dan@noemail.net>
Wed, 30 Jan 2019 19:12:13 +0000 (19:12 +0000)
committerdan <dan@noemail.net>
Wed, 30 Jan 2019 19:12:13 +0000 (19:12 +0000)
FossilOrigin-Name: 6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4

manifest
manifest.uuid
src/build.c
test/corruptL.test

index ca2fb445457c47a229d04c2031ef7c4ba22a27a3..615a0d88232693d992fceb292d79eb63ba11e1f3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stest\scase\sfor\sthe\sprevious\scommit.
-D 2019-01-30T18:47:35.202
+C When\sparsing\sthe\sschema,\scheck\sfor\sduplicate\sindex\sroot\spage\snumbers\sbefore\sadding\sthe\sindex\sto\sthe\sschema\shash\stable.
+D 2019-01-30T19:12:13.341
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4
@@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328
 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00
-F src/build.c ddcce07ea58f569da879e6fb3f4366dd66125edb6c2a41249a39fc72b01d456e
+F src/build.c f2805f5da53aa10c52323f5a7d976aade405dd70e52166ae4e7f35708577893e
 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b
@@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454
 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b
 F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4
 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4
-F test/corruptL.test a4819e673097d4ad889758207c42e4238fd7c2536d18919cd1f602aec1c3fb72
+F test/corruptL.test 82855aa907c3f899c123e8388f0450df8fccb5016539c7b5e64695772e7595bb
 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34
 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c
 F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf
@@ -1804,7 +1804,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 f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e
-R 88d559eb30b55e443784d14bbac03dff
+P 197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65
+R 614f1871a981a455ef4904657472e2dd
 U dan
-Z bff0afaec4775e81b6cc26a57aad1328
+Z 10bfb2b527ca61a24c5f5b6dad4cafcc
index ee35b657015a46c907b5150fa8f04a59927079ec..17085cfd03fee9ad68e06111bafc531146d2a46b 100644 (file)
@@ -1 +1 @@
-197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65
\ No newline at end of file
+6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4
\ No newline at end of file
index dd7e2c631b8848b59c71cd3a24ef01af4971eae6..ca8db87dd55973d7a51abbdccb0344f6fd348450 100644 (file)
@@ -3487,14 +3487,6 @@ void sqlite3CreateIndex(
       Index *p;
       assert( !IN_SPECIAL_PARSE );
       assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
-      p = sqlite3HashInsert(&pIndex->pSchema->idxHash, 
-          pIndex->zName, pIndex);
-      if( p ){
-        assert( p==pIndex );  /* Malloc must have failed */
-        sqlite3OomFault(db);
-        goto exit_create_index;
-      }
-      db->mDbFlags |= DBFLAG_SchemaChange;
       if( pTblName!=0 ){
         pIndex->tnum = db->init.newTnum;
         if( sqlite3IndexHasDuplicateRootPage(pIndex) ){
@@ -3503,6 +3495,14 @@ void sqlite3CreateIndex(
           goto exit_create_index;
         }
       }
+      p = sqlite3HashInsert(&pIndex->pSchema->idxHash, 
+          pIndex->zName, pIndex);
+      if( p ){
+        assert( p==pIndex );  /* Malloc must have failed */
+        sqlite3OomFault(db);
+        goto exit_create_index;
+      }
+      db->mDbFlags |= DBFLAG_SchemaChange;
     }
 
     /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the
index 8d84ec8479f32b6d1e998ffa214d0d59239e11bb..26ea3203f152f0011012907d91518308643b1e5f 100644 (file)
@@ -629,4 +629,97 @@ do_catchsql_test 6.1 {
   COMMIT;
 } {1 {malformed database schema (t1b) - invalid root page}}
 
+#-------------------------------------------------------------------------
+reset_db
+do_test 7.0 {
+  sqlite3 db {}
+  db deserialize [decode_hexdb {
+| size 20480 pagesize 4096 filename crash-8391315d75edff.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 05   .....@  ........
+|     32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04   ................
+|     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
+|     96: 00 00 00 00 0d 00 00 00 05 0e 55 00 0f 74 0f 3c   ..........U..t.<
+|    112: 0e f9 0e d1 0e 55 00 00 00 00 00 00 00 00 00 00   .....U..........
+|   3664: 00 00 00 00 00 7a 05 07 15 11 11 08 81 63 76 69   .....z.......cvi
+|   3680: 65 77 76 31 76 31 43 52 45 41 54 45 20 56 49 45   ewv1v1CREATE VIE
+|   3696: 57 20 76 31 28 78 2c 69 29 20 41 53 0a 53 45 4c   W v1(x,i) AS.SEL
+|   3712: 45 43 54 20 74 31 2e 62 2c 74 32 2e 62 20 46 52   ECT t1.b,t2.b FR
+|   3728: 4f 4d 20 74 31 2c 74 32 20 57 48 45 52 45 20 74   OM t1,t2 WHERE t
+|   3744: 31 2e 61 3d 74 32 2e 61 20 47 52 4f 55 50 20 42   1.a=t2.a GROUP B
+|   3760: 59 20 31 20 48 41 56 49 4e 47 20 74 32 2e 63 20   Y 1 HAVING t2.c 
+|   3776: 4e 4f 54 20 4e 55 4c 4c 0a 4c 49 4d 49 54 20 31   NOT NULL.LIMIT 1
+|   3792: 30 26 04 06 17 11 11 01 39 74 61 62 6c 65 74 32   0&......9tablet2
+|   3808: 74 32 05 43 52 45 41 54 45 20 54 41 42 4c 45 20   t2.CREATE TABLE 
+|   3824: 74 32 28 61 2c 62 2c 63 29 41 03 06 17 15 11 01   t2(a,b,c)A......
+|   3840: 6b 69 6e 64 65 78 74 31 78 31 74 31 03 43 52 45   kindext1x1t1.CRE
+|   3856: 41 54 45 20 49 4e 44 45 58 20 74 31 78 31 20 4f   ATE INDEX t1x1 O
+|   3872: 4e 20 74 31 28 64 29 20 57 48 45 52 45 20 65 65   N t1(d) WHERE ee
+|   3888: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 36 02 06 17    IS NOT NULL6...
+|   3904: 17 11 01 53 69 6e 64 65 78 74 31 61 62 63 74 31   ...Sindext1abct1
+|   3920: 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   .CREATE INDEX t1
+|   3936: 61 62 63 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2b   abc ON t1(a,b,c+
+|   3952: 64 2b 65 29 81 09 01 07 17 11 11 01 81 7d 74 61   d+e)..........ta
+|   3968: 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 20 54   blet1t1.CREATE T
+|   3984: 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c   ABLE t1(a,b,c,d,
+|   4000: 65 2c 66 2c 67 2c 68 2c 6a 2c 6a 6a 2c 6a 6a 6a   e,f,g,h,j,jj,jjj
+|   4016: 2c 6b 2c 61 61 2c 62 69 8c 63 63 2c 64 64 2c 65   ,k,aa,bi.cc,dd,e
+|   4032: 65 20 44 45 46 41 55 4c 54 20 33 2e 31 34 2c 0a   e DEFAULT 3.14,.
+|   4048: 66 66 20 44 45 46 41 55 4c 54 28 27 68 69 63 63   ff DEFAULT('hicc
+|   4064: 75 70 27 29 2c 67 67 20 4e 4f 54 20 4e 55 4c 4c   up'),gg NOT NULL
+|   4080: 20 44 45 46 41 55 4c 54 28 66 61 6c 73 65 29 29    DEFAULT(false))
+| page 2 offset 4096
+|      0: 0d 00 00 00 0a 0e 7b 00 0f dc 0f b6 0f 8f 0f 68   ...............h
+|     16: 0f 41 0f 1a 0e f3 0e cb 0e a3 0e 22 00 00 00 00   .A..............
+|   3696: 00 00 00 00 00 00 00 00 00 00 00 26 0a 14 01 01   ...........&....
+|   3712: 02 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19   ................
+|   3728: 08 09 5a 00 b4 40 09 1e b8 51 eb 95 1f 68 69 63   ..Z..@...Q...hic
+|   3744: 63 75 70 26 09 14 01 01 02 08 00 00 00 00 00 00   cup&............
+|   3760: 00 00 00 00 00 00 07 19 08 08 50 00 a0 40 09 1e   ..........P..@..
+|   3776: b8 51 eb 85 1f 68 69 63 63 74 70 26 08 14 01 01   .Q...hicctp&....
+|   3792: 03 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19   ................
+|   3808: 08 07 46 00 8c 40 09 1e b8 51 eb 85 1f 68 69 63   ..F..@...Q...hic
+|   3824: 63 75 70 25 07 14 01 01 01 08 00 00 00 00 00 00   cup%............
+|   3840: 00 00 00 00 00 10 07 19 08 06 3c 78 40 09 1e b8   ..........<x@...
+|   3856: 51 eb 85 1f 68 69 63 63 75 70 25 06 14 01 01 01   Q...hiccup%.....
+|   3872: 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 08   ................
+|   3888: 05 32 64 40 09 1e b8 51 eb 85 1f 68 69 63 63 75   .2d@...Q...hiccu
+|   3904: 70 25 05 14 01 01 01 08 00 00 00 00 00 00 00 00   p%..............
+|   3920: 00 00 00 00 07 19 08 04 28 50 40 09 1e b8 51 eb   ........(P@...Q.
+|   3936: 85 1f 68 69 63 63 75 70 25 04 14 01 00 f1 08 00   ..hiccup%.......
+|   3952: 00 00 00 00 00 00 00 00 00 00 00 07 19 08 03 1e   ................
+|   3968: 3c 40 09 1e b8 51 eb 85 1f 68 69 63 63 75 70 25   <@...Q...hiccup%
+|   3984: 03 14 01 01 01 08 00 00 00 00 00 00 00 00 00 00   ................
+|   4000: 00 00 07 19 08 02 14 28 40 09 1e b8 51 eb 85 1f   .......(@...Q...
+|   4016: 68 69 63 63 75 70 24 02 14 09 01 01 08 00 00 00   hiccup$.........
+|   4032: 00 00 00 00 00 00 00 00 00 07 19 08 0a 14 40 09   ..............@.
+|   4048: 1e b8 51 eb 85 1f 68 69 63 63 75 70 22 01 14 08   ..Q...hiccup....
+|   4064: 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 07   ................
+|   4080: 19 08 40 09 1e b8 51 eb 85 1f 68 69 63 63 75 70   ..@...Q...hiccup
+| page 3 offset 8192
+|      0: 0a 00 00 00 0a 0f aa 00 0f fa 0f f2 0f e9 0f e0   ................
+|     16: 0f d7 0f ce 0f c5 0f bc 0f b3 0f aa 00 00 00 00   ................
+|   4000: 00 00 00 00 00 00 00 00 00 00 08 05 01 01 00 01   ................
+|   4016: 09 5a 0a d8 05 01 01 00 01 08 50 09 08 05 01 01   .Z........P.....
+|   4032: 00 01 07 46 08 08 05 01 01 00 01 06 3c 07 08 05   ...F........<...
+|   4048: 01 01 00 01 05 32 06 08 05 01 01 00 01 04 28 05   .....2........(.
+|   4064: 08 05 01 02 60 01 03 1e 04 08 05 01 01 00 01 02   ....`...........
+|   4080: 14 03 07 05 09 01 00 01 0a 02 05 05 08 08 00 09   ................
+| page 4 offset 12288
+|      0: 0a 00 00 00 0a 0f cf 00 0f fc 0f f7 0f f2 0f ed   ................
+|     16: 0f e8 0f e3 0f de 0f d9 0f d4 0f cf 00 00 00 00   ................
+|   4032: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04   ................
+|   4048: 03 08 01 0a 04 03 08 01 09 04 03 08 01 08 04 03   ................
+|   4064: 08 01 07 04 03 08 01 06 04 03 08 01 05 04 03 08   ................
+|   4080: 01 04 04 03 08 01 03 04 03 08 01 02 03 03 08 09   ................
+| page 5 offset 16384
+|      0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00   ................
+| end crash-8391315d75edff.db
+}]} {}
+
+do_catchsql_test 7.1 {
+  SELECT * FROM sqlite_master;
+} {1 {malformed database schema (t1x1) - invalid root page}}
+
 finish_test