Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(432)

Unified Diff: third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch

Issue 2366013002: [sqlite] Bring patches up-to-date with trunk. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch
diff --git a/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch b/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch
index 7d925c4291d5ca347e0f07fc8d4031f71c1438f9..6a937f96724329416bd8bf5916d0d47b2f0d7e94 100644
--- a/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch
+++ b/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch
@@ -1,4 +1,4 @@
-From 31dd2fd1cdeba87223f6a46cc19bcea9eb8b2f38 Mon Sep 17 00:00:00 2001
+From d176c774ba1a8b431400f38ca71459bf148f0c3a Mon Sep 17 00:00:00 2001
From: Scott Hess <shess@chromium.org>
Date: Sat, 20 Jul 2013 11:42:21 -0700
Subject: [PATCH 05/13] Virtual table supporting recovery of corrupted
@@ -15,53 +15,26 @@ listed. This patch and the top of recover.c should be considered
authoritative. The history is mostly under
third_party/sqlite/src/src/{recover,recover-alt}.c .
---
- third_party/sqlite/src/Makefile.in | 1 +
- third_party/sqlite/src/Makefile.linux-gcc | 4 +
- third_party/sqlite/src/main.mk | 5 +-
- third_party/sqlite/src/src/main.c | 8 +
- third_party/sqlite/src/src/recover.c | 2281 ++++++++++++++++++++++++++++
- third_party/sqlite/src/src/sqlite.h.in | 16 +
- third_party/sqlite/src/test/recover.test | 164 ++
- third_party/sqlite/src/test/recover0.test | 532 +++++++
- third_party/sqlite/src/test/recover1.test | 429 ++++++
- third_party/sqlite/src/test/recover2.test | 157 ++
- third_party/sqlite/src/tool/mksqlite3c.tcl | 2 +
- 11 files changed, 3598 insertions(+), 1 deletion(-)
+ third_party/sqlite/src/main.mk | 6 +-
+ third_party/sqlite/src/src/main.c | 8 +
+ third_party/sqlite/src/src/recover.c | 2270 +++++++++++++++++++++++++++
+ third_party/sqlite/src/src/recover.h | 23 +
+ third_party/sqlite/src/src/recover_varint.c | 201 +++
+ third_party/sqlite/src/test/recover.test | 164 ++
+ third_party/sqlite/src/test/recover0.test | 532 +++++++
+ third_party/sqlite/src/test/recover1.test | 429 +++++
+ third_party/sqlite/src/test/recover2.test | 157 ++
+ 9 files changed, 3789 insertions(+), 1 deletion(-)
create mode 100644 third_party/sqlite/src/src/recover.c
+ create mode 100644 third_party/sqlite/src/src/recover.h
+ create mode 100644 third_party/sqlite/src/src/recover_varint.c
create mode 100644 third_party/sqlite/src/test/recover.test
create mode 100644 third_party/sqlite/src/test/recover0.test
create mode 100644 third_party/sqlite/src/test/recover1.test
create mode 100644 third_party/sqlite/src/test/recover2.test
-diff --git a/third_party/sqlite/src/Makefile.in b/third_party/sqlite/src/Makefile.in
-index 1fe49d6..8b965c7 100644
---- a/third_party/sqlite/src/Makefile.in
-+++ b/third_party/sqlite/src/Makefile.in
-@@ -260,6 +260,7 @@ SRC = \
- $(TOP)/src/prepare.c \
- $(TOP)/src/printf.c \
- $(TOP)/src/random.c \
-+ $(TOP)/src/recover.c \
- $(TOP)/src/resolve.c \
- $(TOP)/src/rowset.c \
- $(TOP)/src/select.c \
-diff --git a/third_party/sqlite/src/Makefile.linux-gcc b/third_party/sqlite/src/Makefile.linux-gcc
-index 952e8d1..f6291c0 100644
---- a/third_party/sqlite/src/Makefile.linux-gcc
-+++ b/third_party/sqlite/src/Makefile.linux-gcc
-@@ -81,6 +81,10 @@ OPTS += -DSQLITE_MEMDEBUG=1
- # TODO(shess) I can't see why I need this setting.
- OPTS += -DOS_UNIX=1
-
-+# The recover virtual table is not generally enabled. Enable it for testing
-+# purposes.
-+OPTS += -DDEFAULT_ENABLE_RECOVER=1
-+
- #### The suffix to add to executable files. ".exe" for windows.
- # Nothing for unix.
- #
diff --git a/third_party/sqlite/src/main.mk b/third_party/sqlite/src/main.mk
-index 6ff3bd4..a8629aa 100644
+index 6ff3bd4..26f9f15 100644
--- a/third_party/sqlite/src/main.mk
+++ b/third_party/sqlite/src/main.mk
@@ -67,7 +67,8 @@ LIBOBJ+= vdbe.o parse.o \
@@ -69,27 +42,28 @@ index 6ff3bd4..a8629aa 100644
notify.o opcodes.o os.o os_unix.o os_win.o \
pager.o pcache.o pcache1.o pragma.o prepare.o printf.o \
- random.o resolve.o rowset.o rtree.o select.o sqlite3rbu.o status.o \
-+ random.o recover.o resolve.o rowset.o rtree.o \
++ random.o recover.o recover_varint.o resolve.o rowset.o rtree.o \
+ select.o sqlite3rbu.o status.o \
table.o threads.o tokenize.o treeview.o trigger.o \
update.o userauth.o util.o vacuum.o \
vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \
-@@ -140,6 +141,7 @@ SRC = \
- $(TOP)/src/prepare.c \
- $(TOP)/src/printf.c \
- $(TOP)/src/random.c \
-+ $(TOP)/src/recover.c \
- $(TOP)/src/resolve.c \
- $(TOP)/src/rowset.c \
- $(TOP)/src/select.c \
-@@ -360,6 +362,7 @@ TESTSRC2 = \
+@@ -360,6 +361,8 @@ TESTSRC2 = \
$(TOP)/src/prepare.c \
$(TOP)/src/printf.c \
$(TOP)/src/random.c \
+ $(TOP)/src/recover.c \
++ $(TOP)/src/recover_varint.c \
$(TOP)/src/pcache.c \
$(TOP)/src/pcache1.c \
$(TOP)/src/select.c \
+@@ -720,6 +723,7 @@ sqlite3_analyzer$(EXE): sqlite3_analyzer.c
+ #
+ TESTFIXTURE_FLAGS = -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1
+ TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE
++TESTFIXTURE_FLAGS += -DDEFAULT_ENABLE_RECOVER=1
+
+ testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c
+ $(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS) \
diff --git a/third_party/sqlite/src/src/main.c b/third_party/sqlite/src/src/main.c
index 3be7c77..301808c 100644
--- a/third_party/sqlite/src/src/main.c
@@ -111,10 +85,10 @@ index 3be7c77..301808c 100644
rc = sqlite3IcuInit(db);
diff --git a/third_party/sqlite/src/src/recover.c b/third_party/sqlite/src/src/recover.c
new file mode 100644
-index 0000000..5ff6f78
+index 0000000..c22fd4d
--- /dev/null
+++ b/third_party/sqlite/src/src/recover.c
-@@ -0,0 +1,2281 @@
+@@ -0,0 +1,2270 @@
+/*
+** 2012 Jan 11
+**
@@ -327,20 +301,24 @@ index 0000000..5ff6f78
+
+#include <assert.h>
+#include <ctype.h>
++#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
-+/* Internal SQLite things that are used:
-+ * u32, u64, i64 types.
-+ * Btree, Pager, and DbPage structs.
-+ * DbPage.pData, .pPager, and .pgno
-+ * sqlite3 struct.
-+ * sqlite3BtreePager() and sqlite3BtreeGetPageSize()
-+ * sqlite3BtreeGetOptimalReserve()
-+ * sqlite3PagerGet() and sqlite3PagerUnref()
-+ * getVarint().
-+ */
-+#include "sqliteInt.h"
++#include "sqlite3.h"
++
++/* Some SQLite internals use, cribbed from fts5int.h. */
++#ifndef SQLITE_AMALGAMATION
++typedef uint8_t u8;
++typedef uint32_t u32;
++typedef sqlite3_int64 i64;
++typedef sqlite3_uint64 u64;
++
++#define ArraySize(x) (sizeof(x) / sizeof(x[0]))
++#endif
++
++/* From recover_varint.c. */
++u8 recoverGetVarint(const unsigned char *p, u64 *v);
+
+/* For debugging. */
+#if 0
@@ -365,10 +343,10 @@ index 0000000..5ff6f78
+
+/* From section 1.5. */
+static const unsigned kiPageTypeOffset = 0;
-+static const unsigned kiPageFreeBlockOffset = 1;
++/* static const unsigned kiPageFreeBlockOffset = 1; */
+static const unsigned kiPageCellCountOffset = 3;
-+static const unsigned kiPageCellContentOffset = 5;
-+static const unsigned kiPageFragmentedBytesOffset = 7;
++/* static const unsigned kiPageCellContentOffset = 5; */
++/* static const unsigned kiPageFragmentedBytesOffset = 7; */
+static const unsigned knPageLeafHeaderBytes = 8;
+/* Interior pages contain an additional field. */
+static const unsigned kiPageRightChildOffset = 8;
@@ -537,7 +515,7 @@ index 0000000..5ff6f78
+const int kExcessSpace = 128;
+typedef struct RecoverPage RecoverPage;
+struct RecoverPage {
-+ Pgno pgno; /* Page number for this page */
++ u32 pgno; /* Page number for this page */
+ void *pData; /* Page data for pgno */
+ RecoverPager *pPager; /* The pager this page is part of */
+};
@@ -814,8 +792,6 @@ index 0000000..5ff6f78
+ * interiorCursorDestroy - release all resources associated with the
+ * cursor and any parent cursors.
+ * interiorCursorCreate - create a cursor with the given parent and page.
-+ * interiorCursorEOF - returns true if neither the cursor nor the
-+ * parent cursors can return any more data.
+ * interiorCursorNextPage - fetch the next child page from the cursor.
+ *
+ * Logically, interiorCursorNextPage() returns the next child page
@@ -832,11 +808,6 @@ index 0000000..5ff6f78
+ * Note that while interiorCursorNextPage() will refuse to follow
+ * loops, it does not keep track of pages returned for purposes of
+ * preventing duplication.
-+ *
-+ * Note that interiorCursorEOF() could return false (not at EOF), and
-+ * interiorCursorNextPage() could still return SQLITE_DONE. This
-+ * could happen if there are more cells to iterate in an interior
-+ * page, but those cells refer to invalid pages.
+ */
+typedef struct RecoverInteriorCursor RecoverInteriorCursor;
+struct RecoverInteriorCursor {
@@ -952,14 +923,6 @@ index 0000000..5ff6f78
+ return 0;
+}
+
-+static int interiorCursorEOF(RecoverInteriorCursor *pCursor){
-+ /* Find a parent with remaining children. EOF if none found. */
-+ while( pCursor && pCursor->iChild>=pCursor->nChildren ){
-+ pCursor = pCursor->pParent;
-+ }
-+ return pCursor==NULL;
-+}
-+
+/* Internal helper. Used to detect if iPage would cause a loop. */
+static int interiorCursorPageInUse(RecoverInteriorCursor *pCursor,
+ unsigned iPage){
@@ -1575,11 +1538,11 @@ index 0000000..5ff6f78
+ return ValidateError();
+ }
+
-+ nRead = getVarint(pCell, &nRecordBytes);
++ nRead = recoverGetVarint(pCell, &nRecordBytes);
+ assert( iCellOffset+nRead<=pCursor->nPageSize );
+ pCursor->nRecordBytes = nRecordBytes;
+
-+ nRead += getVarint(pCell + nRead, &iRowid);
++ nRead += recoverGetVarint(pCell + nRead, &iRowid);
+ assert( iCellOffset+nRead<=pCursor->nPageSize );
+ pCursor->iRowid = (i64)iRowid;
+
@@ -1605,7 +1568,7 @@ index 0000000..5ff6f78
+ }
+ }
+
-+ nRecordHeaderRead = getVarint(pCell + nRead, &nRecordHeaderBytes);
++ nRecordHeaderRead = recoverGetVarint(pCell + nRead, &nRecordHeaderBytes);
+ assert( nRecordHeaderBytes<=nRecordBytes );
+ pCursor->nRecordHeaderBytes = nRecordHeaderBytes;
+
@@ -1627,8 +1590,8 @@ index 0000000..5ff6f78
+ nRecordHeaderBytes - nRecordHeaderRead) ){
+ return ValidateError();
+ }
-+ nRecordHeaderRead += getVarint(pCursor->pRecordHeader + nRecordHeaderRead,
-+ &iSerialType);
++ nRecordHeaderRead += recoverGetVarint(
++ pCursor->pRecordHeader + nRecordHeaderRead, &iSerialType);
+ if( iSerialType==10 || iSerialType==11 ){
+ return ValidateError();
+ }
@@ -1694,7 +1657,7 @@ index 0000000..5ff6f78
+ /* Rather than caching the header size and how many bytes it took,
+ * decode it every time.
+ */
-+ nRead = getVarint(pRecordHeader, &nRecordHeaderBytes);
++ nRead = recoverGetVarint(pRecordHeader, &nRecordHeaderBytes);
+ assert( nRecordHeaderBytes==pCursor->nRecordHeaderBytes );
+
+ /* Scan forward to the indicated column. Scans to _after_ column
@@ -1713,7 +1676,7 @@ index 0000000..5ff6f78
+ if( !checkVarint(pRecordHeader + nRead, nRecordHeaderBytes - nRead) ){
+ return SQLITE_CORRUPT;
+ }
-+ nRead += getVarint(pRecordHeader + nRead, &iSerialType);
++ nRead += recoverGetVarint(pRecordHeader + nRead, &iSerialType);
+ iColEndOffset += SerialTypeLength(iSerialType);
+ nColsSkipped++;
+ }
@@ -2108,7 +2071,7 @@ index 0000000..5ff6f78
+ 0, /* xRename - rename the table */
+};
+
-+CHROMIUM_SQLITE_API
++SQLITE_API
+int recoverVtableInit(sqlite3 *db){
+ return sqlite3_create_module_v2(db, "recover", &recoverModule, NULL, 0);
+}
@@ -2346,7 +2309,7 @@ index 0000000..5ff6f78
+ /* Parse out db.table, assuming main if no dot. */
+ zDot = strchr(argv[3], '.');
+ if( !zDot ){
-+ pRecover->zDb = sqlite3_strdup(db->aDb[0].zName);
++ pRecover->zDb = sqlite3_strdup("main");
+ pRecover->zTable = sqlite3_strdup(argv[3]);
+ }else if( zDot>argv[3] && zDot[1]!='\0' ){
+ pRecover->zDb = sqlite3_strndup(argv[3], zDot - argv[3]);
@@ -2396,19 +2359,22 @@ index 0000000..5ff6f78
+ *ppVtab = (sqlite3_vtab *)pRecover;
+ return SQLITE_OK;
+}
-diff --git a/third_party/sqlite/src/src/sqlite.h.in b/third_party/sqlite/src/src/sqlite.h.in
-index e5673fd..6829bcb 100644
---- a/third_party/sqlite/src/src/sqlite.h.in
-+++ b/third_party/sqlite/src/src/sqlite.h.in
-@@ -7411,6 +7411,22 @@ int sqlite3_strnicmp(const char *, const char *, int);
- */
- int sqlite3_strglob(const char *zGlob, const char *zStr);
-
-+/* Begin recover virtual table patch for Chromium */
-+/* Our patches don't conform to SQLite's amalgamation processing. Hack it. */
-+#ifndef CHROMIUM_SQLITE_API
-+#define CHROMIUM_SQLITE_API SQLITE_API
+diff --git a/third_party/sqlite/src/src/recover.h b/third_party/sqlite/src/src/recover.h
+new file mode 100644
+index 0000000..691f2fd
+--- /dev/null
++++ b/third_party/sqlite/src/src/recover.h
+@@ -0,0 +1,23 @@
++/* TODO(shess): sqliteicu.h is able to make this include without
++** trouble. It doesn't work when used with Chromium's SQLite. For
++** now the including code must include sqlite3.h first.
++*/
++/* #include "sqlite3.h" */
++
++#ifdef __cplusplus
++extern "C" {
+#endif
++
+/*
+** Call to initialize the recover virtual-table modules (see recover.c).
+**
@@ -2416,13 +2382,219 @@ index e5673fd..6829bcb 100644
+** virtual table available to Web SQL. Breaking it out allows only
+** selected users to enable it (currently sql/recovery.cc).
+*/
-+CHROMIUM_SQLITE_API
++SQLITE_API
+int recoverVtableInit(sqlite3 *db);
-+/* End recover virtual table patch for Chromium */
+
- /* Begin WebDatabase patch for Chromium */
- /* Expose some SQLite internals for the WebDatabase vfs.
- ** DO NOT EXTEND THE USE OF THIS.
++#ifdef __cplusplus
++} /* End of the 'extern "C"' block */
++#endif
+diff --git a/third_party/sqlite/src/src/recover_varint.c b/third_party/sqlite/src/src/recover_varint.c
+new file mode 100644
+index 0000000..c111e2c
+--- /dev/null
++++ b/third_party/sqlite/src/src/recover_varint.c
+@@ -0,0 +1,201 @@
++/*
++** 2016 Feb 29
++**
++** The author disclaims copyright to this source code. In place of
++** a legal notice, here is a blessing:
++**
++** May you do good and not evil.
++** May you find forgiveness for yourself and forgive others.
++** May you share freely, never taking more than you give.
++**
++******************************************************************************
++**
++** Copy of sqlite3Fts5GetVarint() from fts3_varint.c, which in turn is copied
++** from SQLite core.
++*/
++
++#include <assert.h>
++#include "sqlite3.h"
++
++/* Copied from fts3int.h. */
++#ifndef SQLITE_AMALGAMATION
++typedef unsigned char u8;
++typedef unsigned int u32;
++typedef sqlite3_uint64 u64;
++#endif
++
++/*
++** Bitmasks used by recoverGetVarint(). These precomputed constants
++** are defined here rather than simply putting the constant expressions
++** inline in order to work around bugs in the RVT compiler.
++**
++** SLOT_2_0 A mask for (0x7f<<14) | 0x7f
++**
++** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0
++*/
++#define SLOT_2_0 0x001fc07f
++#define SLOT_4_2_0 0xf01fc07f
++
++/*
++** Read a 64-bit variable-length integer from memory starting at p[0].
++** Return the number of bytes read. The value is stored in *v.
++*/
++u8 recoverGetVarint(const unsigned char *p, u64 *v){
++ u32 a,b,s;
++
++ a = *p;
++ /* a: p0 (unmasked) */
++ if (!(a&0x80))
++ {
++ *v = a;
++ return 1;
++ }
++
++ p++;
++ b = *p;
++ /* b: p1 (unmasked) */
++ if (!(b&0x80))
++ {
++ a &= 0x7f;
++ a = a<<7;
++ a |= b;
++ *v = a;
++ return 2;
++ }
++
++ /* Verify that constants are precomputed correctly */
++ assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) );
++ assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) );
++
++ p++;
++ a = a<<14;
++ a |= *p;
++ /* a: p0<<14 | p2 (unmasked) */
++ if (!(a&0x80))
++ {
++ a &= SLOT_2_0;
++ b &= 0x7f;
++ b = b<<7;
++ a |= b;
++ *v = a;
++ return 3;
++ }
++
++ /* CSE1 from below */
++ a &= SLOT_2_0;
++ p++;
++ b = b<<14;
++ b |= *p;
++ /* b: p1<<14 | p3 (unmasked) */
++ if (!(b&0x80))
++ {
++ b &= SLOT_2_0;
++ /* moved CSE1 up */
++ /* a &= (0x7f<<14)|(0x7f); */
++ a = a<<7;
++ a |= b;
++ *v = a;
++ return 4;
++ }
++
++ /* a: p0<<14 | p2 (masked) */
++ /* b: p1<<14 | p3 (unmasked) */
++ /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
++ /* moved CSE1 up */
++ /* a &= (0x7f<<14)|(0x7f); */
++ b &= SLOT_2_0;
++ s = a;
++ /* s: p0<<14 | p2 (masked) */
++
++ p++;
++ a = a<<14;
++ a |= *p;
++ /* a: p0<<28 | p2<<14 | p4 (unmasked) */
++ if (!(a&0x80))
++ {
++ /* we can skip these cause they were (effectively) done above in calc'ing s */
++ /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
++ /* b &= (0x7f<<14)|(0x7f); */
++ b = b<<7;
++ a |= b;
++ s = s>>18;
++ *v = ((u64)s)<<32 | a;
++ return 5;
++ }
++
++ /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
++ s = s<<7;
++ s |= b;
++ /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
++
++ p++;
++ b = b<<14;
++ b |= *p;
++ /* b: p1<<28 | p3<<14 | p5 (unmasked) */
++ if (!(b&0x80))
++ {
++ /* we can skip this cause it was (effectively) done above in calc'ing s */
++ /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
++ a &= SLOT_2_0;
++ a = a<<7;
++ a |= b;
++ s = s>>18;
++ *v = ((u64)s)<<32 | a;
++ return 6;
++ }
++
++ p++;
++ a = a<<14;
++ a |= *p;
++ /* a: p2<<28 | p4<<14 | p6 (unmasked) */
++ if (!(a&0x80))
++ {
++ a &= SLOT_4_2_0;
++ b &= SLOT_2_0;
++ b = b<<7;
++ a |= b;
++ s = s>>11;
++ *v = ((u64)s)<<32 | a;
++ return 7;
++ }
++
++ /* CSE2 from below */
++ a &= SLOT_2_0;
++ p++;
++ b = b<<14;
++ b |= *p;
++ /* b: p3<<28 | p5<<14 | p7 (unmasked) */
++ if (!(b&0x80))
++ {
++ b &= SLOT_4_2_0;
++ /* moved CSE2 up */
++ /* a &= (0x7f<<14)|(0x7f); */
++ a = a<<7;
++ a |= b;
++ s = s>>4;
++ *v = ((u64)s)<<32 | a;
++ return 8;
++ }
++
++ p++;
++ a = a<<15;
++ a |= *p;
++ /* a: p4<<29 | p6<<15 | p8 (unmasked) */
++
++ /* moved CSE2 up */
++ /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
++ b &= SLOT_2_0;
++ b = b<<8;
++ a |= b;
++
++ s = s<<4;
++ b = p[-4];
++ b &= 0x7f;
++ b = b>>3;
++ s |= b;
++
++ *v = ((u64)s)<<32 | a;
++
++ return 9;
++}
++
diff --git a/third_party/sqlite/src/test/recover.test b/third_party/sqlite/src/test/recover.test
new file mode 100644
index 0000000..bfb7888
@@ -3729,19 +3901,6 @@ index 0000000..8aa4e04
+} [list 4 1024 1 text [string length $substr] $substr]
+
+finish_test
-diff --git a/third_party/sqlite/src/tool/mksqlite3c.tcl b/third_party/sqlite/src/tool/mksqlite3c.tcl
-index 23241e2..1113758 100644
---- a/third_party/sqlite/src/tool/mksqlite3c.tcl
-+++ b/third_party/sqlite/src/tool/mksqlite3c.tcl
-@@ -361,6 +361,8 @@ foreach file {
- main.c
- notify.c
-
-+ recover.c
-+
- fts3.c
- fts3_aux.c
- fts3_expr.c
--
-2.7.0
+2.5.0

Powered by Google App Engine
This is Rietveld 408576698