| Index: third_party/sqlite/src/src/test_vfstrace.c | 
| diff --git a/third_party/sqlite/src/src/test_vfstrace.c b/third_party/sqlite/src/src/test_vfstrace.c | 
| index 073eab631b9c0a7acfd8798856c796f153d459cd..d0bc29f0c3ceb6dd60c7b4307480f5e77c3c344f 100644 | 
| --- a/third_party/sqlite/src/src/test_vfstrace.c | 
| +++ b/third_party/sqlite/src/src/test_vfstrace.c | 
| @@ -12,6 +12,100 @@ | 
| ** | 
| ** This file contains code implements a VFS shim that writes diagnostic | 
| ** output for each VFS call, similar to "strace". | 
| +** | 
| +** USAGE: | 
| +** | 
| +** This source file exports a single symbol which is the name of a | 
| +** function: | 
| +** | 
| +**   int vfstrace_register( | 
| +**     const char *zTraceName,         // Name of the newly constructed VFS | 
| +**     const char *zOldVfsName,        // Name of the underlying VFS | 
| +**     int (*xOut)(const char*,void*), // Output routine.  ex: fputs | 
| +**     void *pOutArg,                  // 2nd argument to xOut.  ex: stderr | 
| +**     int makeDefault                 // Make the new VFS the default | 
| +**   ); | 
| +** | 
| +** Applications that want to trace their VFS usage must provide a callback | 
| +** function with this prototype: | 
| +** | 
| +**   int traceOutput(const char *zMessage, void *pAppData); | 
| +** | 
| +** This function will "output" the trace messages, where "output" can | 
| +** mean different things to different applications.  The traceOutput function | 
| +** for the command-line shell (see shell.c) is "fputs" from the standard | 
| +** library, which means that all trace output is written on the stream | 
| +** specified by the second argument.  In the case of the command-line shell | 
| +** the second argument is stderr.  Other applications might choose to output | 
| +** trace information to a file, over a socket, or write it into a buffer. | 
| +** | 
| +** The vfstrace_register() function creates a new "shim" VFS named by | 
| +** the zTraceName parameter.  A "shim" VFS is an SQLite backend that does | 
| +** not really perform the duties of a true backend, but simply filters or | 
| +** interprets VFS calls before passing them off to another VFS which does | 
| +** the actual work.  In this case the other VFS - the one that does the | 
| +** real work - is identified by the second parameter, zOldVfsName.  If | 
| +** the 2nd parameter is NULL then the default VFS is used.  The common | 
| +** case is for the 2nd parameter to be NULL. | 
| +** | 
| +** The third and fourth parameters are the pointer to the output function | 
| +** and the second argument to the output function.  For the SQLite | 
| +** command-line shell, when the -vfstrace option is used, these parameters | 
| +** are fputs and stderr, respectively. | 
| +** | 
| +** The fifth argument is true (non-zero) to cause the newly created VFS | 
| +** to become the default VFS.  The common case is for the fifth parameter | 
| +** to be true. | 
| +** | 
| +** The call to vfstrace_register() simply creates the shim VFS that does | 
| +** tracing.  The application must also arrange to use the new VFS for | 
| +** all database connections that are created and for which tracing is | 
| +** desired.  This can be done by specifying the trace VFS using URI filename | 
| +** notation, or by specifying the trace VFS as the 4th parameter to | 
| +** sqlite3_open_v2() or by making the trace VFS be the default (by setting | 
| +** the 5th parameter of vfstrace_register() to 1). | 
| +** | 
| +** | 
| +** ENABLING VFSTRACE IN A COMMAND-LINE SHELL | 
| +** | 
| +** The SQLite command line shell implemented by the shell.c source file | 
| +** can be used with this module.  To compile in -vfstrace support, first | 
| +** gather this file (test_vfstrace.c), the shell source file (shell.c), | 
| +** and the SQLite amalgamation source files (sqlite3.c, sqlite3.h) into | 
| +** the working directory.  Then compile using a command like the following: | 
| +** | 
| +**    gcc -o sqlite3 -Os -I. -DSQLITE_ENABLE_VFSTRACE \ | 
| +**        -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE \ | 
| +**        -DHAVE_READLINE -DHAVE_USLEEP=1 \ | 
| +**        shell.c test_vfstrace.c sqlite3.c -ldl -lreadline -lncurses | 
| +** | 
| +** The gcc command above works on Linux and provides (in addition to the | 
| +** -vfstrace option) support for FTS3 and FTS4, RTREE, and command-line | 
| +** editing using the readline library.  The command-line shell does not | 
| +** use threads so we added -DSQLITE_THREADSAFE=0 just to make the code | 
| +** run a little faster.   For compiling on a Mac, you'll probably need | 
| +** to omit the -DHAVE_READLINE, the -lreadline, and the -lncurses options. | 
| +** The compilation could be simplified to just this: | 
| +** | 
| +**    gcc -DSQLITE_ENABLE_VFSTRACE \ | 
| +**         shell.c test_vfstrace.c sqlite3.c -ldl -lpthread | 
| +** | 
| +** In this second example, all unnecessary options have been removed | 
| +** Note that since the code is now threadsafe, we had to add the -lpthread | 
| +** option to pull in the pthreads library. | 
| +** | 
| +** To cross-compile for windows using MinGW, a command like this might | 
| +** work: | 
| +** | 
| +**    /opt/mingw/bin/i386-mingw32msvc-gcc -o sqlite3.exe -Os -I \ | 
| +**         -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_VFSTRACE \ | 
| +**         shell.c test_vfstrace.c sqlite3.c | 
| +** | 
| +** Similar compiler commands will work on different systems.  The key | 
| +** invariants are (1) you must have -DSQLITE_ENABLE_VFSTRACE so that | 
| +** the shell.c source file will know to include the -vfstrace command-line | 
| +** option and (2) you must compile and link the three source files | 
| +** shell,c, test_vfstrace.c, and sqlite3.c. | 
| */ | 
| #include <stdlib.h> | 
| #include <string.h> | 
| @@ -164,6 +258,11 @@ static void vfstrace_print_errcode( | 
| case SQLITE_IOERR_SHMOPEN:      zVal = "SQLITE_IOERR_SHMOPEN";      break; | 
| case SQLITE_IOERR_SHMSIZE:      zVal = "SQLITE_IOERR_SHMSIZE";      break; | 
| case SQLITE_IOERR_SHMLOCK:      zVal = "SQLITE_IOERR_SHMLOCK";      break; | 
| +    case SQLITE_IOERR_SHMMAP:       zVal = "SQLITE_IOERR_SHMMAP";       break; | 
| +    case SQLITE_IOERR_SEEK:         zVal = "SQLITE_IOERR_SEEK";         break; | 
| +    case SQLITE_IOERR_GETTEMPPATH:  zVal = "SQLITE_IOERR_GETTEMPPATH";  break; | 
| +    case SQLITE_IOERR_CONVPATH:     zVal = "SQLITE_IOERR_CONVPATH";     break; | 
| +    case SQLITE_READONLY_DBMOVED:   zVal = "SQLITE_READONLY_DBMOVED";   break; | 
| case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break; | 
| case SQLITE_BUSY_RECOVERY:      zVal = "SQLITE_BUSY_RECOVERY";      break; | 
| case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break; | 
| @@ -377,7 +476,18 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ | 
| } | 
| case SQLITE_FCNTL_FILE_POINTER: zOp = "FILE_POINTER";       break; | 
| case SQLITE_FCNTL_SYNC_OMITTED: zOp = "SYNC_OMITTED";       break; | 
| +    case SQLITE_FCNTL_WIN32_AV_RETRY: zOp = "WIN32_AV_RETRY";   break; | 
| +    case SQLITE_FCNTL_PERSIST_WAL:  zOp = "PERSIST_WAL";        break; | 
| +    case SQLITE_FCNTL_OVERWRITE:    zOp = "OVERWRITE";          break; | 
| +    case SQLITE_FCNTL_VFSNAME:      zOp = "VFSNAME";            break; | 
| +    case SQLITE_FCNTL_TEMPFILENAME: zOp = "TEMPFILENAME";       break; | 
| case 0xca093fa0:                zOp = "DB_UNCHANGED";       break; | 
| +    case SQLITE_FCNTL_PRAGMA: { | 
| +      const char *const* a = (const char*const*)pArg; | 
| +      sqlite3_snprintf(sizeof(zBuf), zBuf, "PRAGMA,[%s,%s]",a[1],a[2]); | 
| +      zOp = zBuf; | 
| +      break; | 
| +    } | 
| default: { | 
| sqlite3_snprintf(sizeof zBuf, zBuf, "%d", op); | 
| zOp = zBuf; | 
| @@ -388,6 +498,15 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ | 
| pInfo->zVfsName, p->zFName, zOp); | 
| rc = p->pReal->pMethods->xFileControl(p->pReal, op, pArg); | 
| vfstrace_print_errcode(pInfo, " -> %s\n", rc); | 
| +  if( op==SQLITE_FCNTL_VFSNAME && rc==SQLITE_OK ){ | 
| +    *(char**)pArg = sqlite3_mprintf("vfstrace.%s/%z", | 
| +                                    pInfo->zVfsName, *(char**)pArg); | 
| +  } | 
| +  if( (op==SQLITE_FCNTL_PRAGMA || op==SQLITE_FCNTL_TEMPFILENAME) | 
| +   && rc==SQLITE_OK && *(char**)pArg ){ | 
| +    vfstrace_printf(pInfo, "%s.xFileControl(%s,%s) returns %s", | 
| +                    pInfo->zVfsName, p->zFName, zOp, *(char**)pArg); | 
| +  } | 
| return rc; | 
| } | 
|  | 
| @@ -559,7 +678,7 @@ static int vfstraceAccess( | 
| vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData; | 
| sqlite3_vfs *pRoot = pInfo->pRootVfs; | 
| int rc; | 
| -  vfstrace_printf(pInfo, "%s.xDelete(\"%s\",%d)", | 
| +  vfstrace_printf(pInfo, "%s.xAccess(\"%s\",%d)", | 
| pInfo->zVfsName, zPath, flags); | 
| rc = pRoot->xAccess(pRoot, zPath, flags, pResOut); | 
| vfstrace_print_errcode(pInfo, " -> %s", rc); | 
|  |