| Index: third_party/sqlite/src/tool/fuzzershell.c
 | 
| diff --git a/third_party/sqlite/src/tool/fuzzershell.c b/third_party/sqlite/src/tool/fuzzershell.c
 | 
| index 2c778bce6e054a54d8320caba05368bbce9fdbc5..c75beb4d88ea62d0d1ba56932500d9712139754d 100644
 | 
| --- a/third_party/sqlite/src/tool/fuzzershell.c
 | 
| +++ b/third_party/sqlite/src/tool/fuzzershell.c
 | 
| @@ -195,12 +195,14 @@ static int execCallback(void *NotUsed, int argc, char **argv, char **colv){
 | 
|    int i;
 | 
|    static unsigned cnt = 0;
 | 
|    printf("ROW #%u:\n", ++cnt);
 | 
| -  for(i=0; i<argc; i++){
 | 
| -    printf(" %s=", colv[i]);
 | 
| -    if( argv[i] ){
 | 
| -      printf("[%s]\n", argv[i]);
 | 
| -    }else{
 | 
| -      printf("NULL\n");
 | 
| +  if( argv ){
 | 
| +    for(i=0; i<argc; i++){
 | 
| +      printf(" %s=", colv[i]);
 | 
| +      if( argv[i] ){
 | 
| +        printf("[%s]\n", argv[i]);
 | 
| +      }else{
 | 
| +        printf("NULL\n");
 | 
| +      }
 | 
|      }
 | 
|    }
 | 
|    fflush(stdout);
 | 
| @@ -225,6 +227,56 @@ static void traceNoop(void *NotUsed, const char *zMsg){
 | 
|  #endif
 | 
|  
 | 
|  /***************************************************************************
 | 
| +** String accumulator object
 | 
| +*/
 | 
| +typedef struct Str Str;
 | 
| +struct Str {
 | 
| +  char *z;                /* The string.  Memory from malloc() */
 | 
| +  sqlite3_uint64 n;       /* Bytes of input used */
 | 
| +  sqlite3_uint64 nAlloc;  /* Bytes allocated to z[] */
 | 
| +  int oomErr;             /* OOM error has been seen */
 | 
| +};
 | 
| +
 | 
| +/* Initialize a Str object */
 | 
| +static void StrInit(Str *p){
 | 
| +  memset(p, 0, sizeof(*p));
 | 
| +}
 | 
| +
 | 
| +/* Append text to the end of a Str object */
 | 
| +static void StrAppend(Str *p, const char *z){
 | 
| +  sqlite3_uint64 n = strlen(z);
 | 
| +  if( p->n + n >= p->nAlloc ){
 | 
| +    char *zNew;
 | 
| +    sqlite3_uint64 nNew;
 | 
| +    if( p->oomErr ) return;
 | 
| +    nNew = p->nAlloc*2 + 100 + n;
 | 
| +    zNew = sqlite3_realloc(p->z, nNew);
 | 
| +    if( zNew==0 ){
 | 
| +      sqlite3_free(p->z);
 | 
| +      memset(p, 0, sizeof(*p));
 | 
| +      p->oomErr = 1;
 | 
| +      return;
 | 
| +    }
 | 
| +    p->z = zNew;
 | 
| +    p->nAlloc = nNew;
 | 
| +  }
 | 
| +  memcpy(p->z + p->n, z, n);
 | 
| +  p->n += n;
 | 
| +  p->z[p->n] = 0;
 | 
| +}
 | 
| +
 | 
| +/* Return the current string content */
 | 
| +static char *StrStr(Str *p){
 | 
| + return p->z;
 | 
| +}
 | 
| +
 | 
| +/* Free the string */
 | 
| +static void StrFree(Str *p){
 | 
| +  sqlite3_free(p->z);
 | 
| +  StrInit(p);
 | 
| +}
 | 
| +
 | 
| +/***************************************************************************
 | 
|  ** eval() implementation copied from ../ext/misc/eval.c
 | 
|  */
 | 
|  /*
 | 
| @@ -312,6 +364,326 @@ static void sqlEvalFunc(
 | 
|  /* End of the eval() implementation
 | 
|  ******************************************************************************/
 | 
|  
 | 
| +/******************************************************************************
 | 
| +** The generate_series(START,END,STEP) eponymous table-valued function.
 | 
| +**
 | 
| +** This code is copy/pasted from ext/misc/series.c in the SQLite source tree.
 | 
| +*/
 | 
| +/* series_cursor is a subclass of sqlite3_vtab_cursor which will
 | 
| +** serve as the underlying representation of a cursor that scans
 | 
| +** over rows of the result
 | 
| +*/
 | 
| +typedef struct series_cursor series_cursor;
 | 
| +struct series_cursor {
 | 
| +  sqlite3_vtab_cursor base;  /* Base class - must be first */
 | 
| +  int isDesc;                /* True to count down rather than up */
 | 
| +  sqlite3_int64 iRowid;      /* The rowid */
 | 
| +  sqlite3_int64 iValue;      /* Current value ("value") */
 | 
| +  sqlite3_int64 mnValue;     /* Mimimum value ("start") */
 | 
| +  sqlite3_int64 mxValue;     /* Maximum value ("stop") */
 | 
| +  sqlite3_int64 iStep;       /* Increment ("step") */
 | 
| +};
 | 
| +
 | 
| +/*
 | 
| +** The seriesConnect() method is invoked to create a new
 | 
| +** series_vtab that describes the generate_series virtual table.
 | 
| +**
 | 
| +** Think of this routine as the constructor for series_vtab objects.
 | 
| +**
 | 
| +** All this routine needs to do is:
 | 
| +**
 | 
| +**    (1) Allocate the series_vtab object and initialize all fields.
 | 
| +**
 | 
| +**    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
 | 
| +**        result set of queries against generate_series will look like.
 | 
| +*/
 | 
| +static int seriesConnect(
 | 
| +  sqlite3 *db,
 | 
| +  void *pAux,
 | 
| +  int argc, const char *const*argv,
 | 
| +  sqlite3_vtab **ppVtab,
 | 
| +  char **pzErr
 | 
| +){
 | 
| +  sqlite3_vtab *pNew;
 | 
| +  int rc;
 | 
| +
 | 
| +/* Column numbers */
 | 
| +#define SERIES_COLUMN_VALUE 0
 | 
| +#define SERIES_COLUMN_START 1
 | 
| +#define SERIES_COLUMN_STOP  2
 | 
| +#define SERIES_COLUMN_STEP  3
 | 
| +
 | 
| +  rc = sqlite3_declare_vtab(db,
 | 
| +     "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
 | 
| +  if( rc==SQLITE_OK ){
 | 
| +    pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
 | 
| +    if( pNew==0 ) return SQLITE_NOMEM;
 | 
| +    memset(pNew, 0, sizeof(*pNew));
 | 
| +  }
 | 
| +  return rc;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** This method is the destructor for series_cursor objects.
 | 
| +*/
 | 
| +static int seriesDisconnect(sqlite3_vtab *pVtab){
 | 
| +  sqlite3_free(pVtab);
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Constructor for a new series_cursor object.
 | 
| +*/
 | 
| +static int seriesOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
 | 
| +  series_cursor *pCur;
 | 
| +  pCur = sqlite3_malloc( sizeof(*pCur) );
 | 
| +  if( pCur==0 ) return SQLITE_NOMEM;
 | 
| +  memset(pCur, 0, sizeof(*pCur));
 | 
| +  *ppCursor = &pCur->base;
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Destructor for a series_cursor.
 | 
| +*/
 | 
| +static int seriesClose(sqlite3_vtab_cursor *cur){
 | 
| +  sqlite3_free(cur);
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +/*
 | 
| +** Advance a series_cursor to its next row of output.
 | 
| +*/
 | 
| +static int seriesNext(sqlite3_vtab_cursor *cur){
 | 
| +  series_cursor *pCur = (series_cursor*)cur;
 | 
| +  if( pCur->isDesc ){
 | 
| +    pCur->iValue -= pCur->iStep;
 | 
| +  }else{
 | 
| +    pCur->iValue += pCur->iStep;
 | 
| +  }
 | 
| +  pCur->iRowid++;
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Return values of columns for the row at which the series_cursor
 | 
| +** is currently pointing.
 | 
| +*/
 | 
| +static int seriesColumn(
 | 
| +  sqlite3_vtab_cursor *cur,   /* The cursor */
 | 
| +  sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
 | 
| +  int i                       /* Which column to return */
 | 
| +){
 | 
| +  series_cursor *pCur = (series_cursor*)cur;
 | 
| +  sqlite3_int64 x = 0;
 | 
| +  switch( i ){
 | 
| +    case SERIES_COLUMN_START:  x = pCur->mnValue; break;
 | 
| +    case SERIES_COLUMN_STOP:   x = pCur->mxValue; break;
 | 
| +    case SERIES_COLUMN_STEP:   x = pCur->iStep;   break;
 | 
| +    default:                   x = pCur->iValue;  break;
 | 
| +  }
 | 
| +  sqlite3_result_int64(ctx, x);
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Return the rowid for the current row.  In this implementation, the
 | 
| +** rowid is the same as the output value.
 | 
| +*/
 | 
| +static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
 | 
| +  series_cursor *pCur = (series_cursor*)cur;
 | 
| +  *pRowid = pCur->iRowid;
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Return TRUE if the cursor has been moved off of the last
 | 
| +** row of output.
 | 
| +*/
 | 
| +static int seriesEof(sqlite3_vtab_cursor *cur){
 | 
| +  series_cursor *pCur = (series_cursor*)cur;
 | 
| +  if( pCur->isDesc ){
 | 
| +    return pCur->iValue < pCur->mnValue;
 | 
| +  }else{
 | 
| +    return pCur->iValue > pCur->mxValue;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/* True to cause run-time checking of the start=, stop=, and/or step= 
 | 
| +** parameters.  The only reason to do this is for testing the
 | 
| +** constraint checking logic for virtual tables in the SQLite core.
 | 
| +*/
 | 
| +#ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
 | 
| +# define SQLITE_SERIES_CONSTRAINT_VERIFY 0
 | 
| +#endif
 | 
| +
 | 
| +/*
 | 
| +** This method is called to "rewind" the series_cursor object back
 | 
| +** to the first row of output.  This method is always called at least
 | 
| +** once prior to any call to seriesColumn() or seriesRowid() or 
 | 
| +** seriesEof().
 | 
| +**
 | 
| +** The query plan selected by seriesBestIndex is passed in the idxNum
 | 
| +** parameter.  (idxStr is not used in this implementation.)  idxNum
 | 
| +** is a bitmask showing which constraints are available:
 | 
| +**
 | 
| +**    1:    start=VALUE
 | 
| +**    2:    stop=VALUE
 | 
| +**    4:    step=VALUE
 | 
| +**
 | 
| +** Also, if bit 8 is set, that means that the series should be output
 | 
| +** in descending order rather than in ascending order.
 | 
| +**
 | 
| +** This routine should initialize the cursor and position it so that it
 | 
| +** is pointing at the first row, or pointing off the end of the table
 | 
| +** (so that seriesEof() will return true) if the table is empty.
 | 
| +*/
 | 
| +static int seriesFilter(
 | 
| +  sqlite3_vtab_cursor *pVtabCursor, 
 | 
| +  int idxNum, const char *idxStr,
 | 
| +  int argc, sqlite3_value **argv
 | 
| +){
 | 
| +  series_cursor *pCur = (series_cursor *)pVtabCursor;
 | 
| +  int i = 0;
 | 
| +  if( idxNum & 1 ){
 | 
| +    pCur->mnValue = sqlite3_value_int64(argv[i++]);
 | 
| +  }else{
 | 
| +    pCur->mnValue = 0;
 | 
| +  }
 | 
| +  if( idxNum & 2 ){
 | 
| +    pCur->mxValue = sqlite3_value_int64(argv[i++]);
 | 
| +  }else{
 | 
| +    pCur->mxValue = 0xffffffff;
 | 
| +  }
 | 
| +  if( idxNum & 4 ){
 | 
| +    pCur->iStep = sqlite3_value_int64(argv[i++]);
 | 
| +    if( pCur->iStep<1 ) pCur->iStep = 1;
 | 
| +  }else{
 | 
| +    pCur->iStep = 1;
 | 
| +  }
 | 
| +  if( idxNum & 8 ){
 | 
| +    pCur->isDesc = 1;
 | 
| +    pCur->iValue = pCur->mxValue;
 | 
| +    if( pCur->iStep>0 ){
 | 
| +      pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep;
 | 
| +    }
 | 
| +  }else{
 | 
| +    pCur->isDesc = 0;
 | 
| +    pCur->iValue = pCur->mnValue;
 | 
| +  }
 | 
| +  pCur->iRowid = 1;
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** SQLite will invoke this method one or more times while planning a query
 | 
| +** that uses the generate_series virtual table.  This routine needs to create
 | 
| +** a query plan for each invocation and compute an estimated cost for that
 | 
| +** plan.
 | 
| +**
 | 
| +** In this implementation idxNum is used to represent the
 | 
| +** query plan.  idxStr is unused.
 | 
| +**
 | 
| +** The query plan is represented by bits in idxNum:
 | 
| +**
 | 
| +**  (1)  start = $value  -- constraint exists
 | 
| +**  (2)  stop = $value   -- constraint exists
 | 
| +**  (4)  step = $value   -- constraint exists
 | 
| +**  (8)  output in descending order
 | 
| +*/
 | 
| +static int seriesBestIndex(
 | 
| +  sqlite3_vtab *tab,
 | 
| +  sqlite3_index_info *pIdxInfo
 | 
| +){
 | 
| +  int i;                 /* Loop over constraints */
 | 
| +  int idxNum = 0;        /* The query plan bitmask */
 | 
| +  int startIdx = -1;     /* Index of the start= constraint, or -1 if none */
 | 
| +  int stopIdx = -1;      /* Index of the stop= constraint, or -1 if none */
 | 
| +  int stepIdx = -1;      /* Index of the step= constraint, or -1 if none */
 | 
| +  int nArg = 0;          /* Number of arguments that seriesFilter() expects */
 | 
| +
 | 
| +  const struct sqlite3_index_constraint *pConstraint;
 | 
| +  pConstraint = pIdxInfo->aConstraint;
 | 
| +  for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
 | 
| +    if( pConstraint->usable==0 ) continue;
 | 
| +    if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
 | 
| +    switch( pConstraint->iColumn ){
 | 
| +      case SERIES_COLUMN_START:
 | 
| +        startIdx = i;
 | 
| +        idxNum |= 1;
 | 
| +        break;
 | 
| +      case SERIES_COLUMN_STOP:
 | 
| +        stopIdx = i;
 | 
| +        idxNum |= 2;
 | 
| +        break;
 | 
| +      case SERIES_COLUMN_STEP:
 | 
| +        stepIdx = i;
 | 
| +        idxNum |= 4;
 | 
| +        break;
 | 
| +    }
 | 
| +  }
 | 
| +  if( startIdx>=0 ){
 | 
| +    pIdxInfo->aConstraintUsage[startIdx].argvIndex = ++nArg;
 | 
| +    pIdxInfo->aConstraintUsage[startIdx].omit= !SQLITE_SERIES_CONSTRAINT_VERIFY;
 | 
| +  }
 | 
| +  if( stopIdx>=0 ){
 | 
| +    pIdxInfo->aConstraintUsage[stopIdx].argvIndex = ++nArg;
 | 
| +    pIdxInfo->aConstraintUsage[stopIdx].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
 | 
| +  }
 | 
| +  if( stepIdx>=0 ){
 | 
| +    pIdxInfo->aConstraintUsage[stepIdx].argvIndex = ++nArg;
 | 
| +    pIdxInfo->aConstraintUsage[stepIdx].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
 | 
| +  }
 | 
| +  if( (idxNum & 3)==3 ){
 | 
| +    /* Both start= and stop= boundaries are available.  This is the 
 | 
| +    ** the preferred case */
 | 
| +    pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
 | 
| +    pIdxInfo->estimatedRows = 1000;
 | 
| +    if( pIdxInfo->nOrderBy==1 ){
 | 
| +      if( pIdxInfo->aOrderBy[0].desc ) idxNum |= 8;
 | 
| +      pIdxInfo->orderByConsumed = 1;
 | 
| +    }
 | 
| +  }else{
 | 
| +    /* If either boundary is missing, we have to generate a huge span
 | 
| +    ** of numbers.  Make this case very expensive so that the query
 | 
| +    ** planner will work hard to avoid it. */
 | 
| +    pIdxInfo->estimatedCost = (double)2147483647;
 | 
| +    pIdxInfo->estimatedRows = 2147483647;
 | 
| +  }
 | 
| +  pIdxInfo->idxNum = idxNum;
 | 
| +  return SQLITE_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** This following structure defines all the methods for the 
 | 
| +** generate_series virtual table.
 | 
| +*/
 | 
| +static sqlite3_module seriesModule = {
 | 
| +  0,                         /* iVersion */
 | 
| +  0,                         /* xCreate */
 | 
| +  seriesConnect,             /* xConnect */
 | 
| +  seriesBestIndex,           /* xBestIndex */
 | 
| +  seriesDisconnect,          /* xDisconnect */
 | 
| +  0,                         /* xDestroy */
 | 
| +  seriesOpen,                /* xOpen - open a cursor */
 | 
| +  seriesClose,               /* xClose - close a cursor */
 | 
| +  seriesFilter,              /* xFilter - configure scan constraints */
 | 
| +  seriesNext,                /* xNext - advance a cursor */
 | 
| +  seriesEof,                 /* xEof - check for end of scan */
 | 
| +  seriesColumn,              /* xColumn - read data */
 | 
| +  seriesRowid,               /* xRowid - read data */
 | 
| +  0,                         /* xUpdate */
 | 
| +  0,                         /* xBegin */
 | 
| +  0,                         /* xSync */
 | 
| +  0,                         /* xCommit */
 | 
| +  0,                         /* xRollback */
 | 
| +  0,                         /* xFindMethod */
 | 
| +  0,                         /* xRename */
 | 
| +};
 | 
| +/* END the generate_series(START,END,STEP) implementation
 | 
| +*********************************************************************************/
 | 
| +
 | 
|  /*
 | 
|  ** Print sketchy documentation for this utility program
 | 
|  */
 | 
| @@ -706,6 +1078,8 @@ int main(int argc, char **argv){
 | 
|          oomCnt = 0;
 | 
|        }
 | 
|        do{
 | 
| +        Str sql;
 | 
| +        StrInit(&sql);
 | 
|          if( zDbName ){
 | 
|            rc = sqlite3_open_v2(zDbName, &db, SQLITE_OPEN_READWRITE, 0);
 | 
|            if( rc!=SQLITE_OK ){
 | 
| @@ -729,11 +1103,31 @@ int main(int argc, char **argv){
 | 
|      #endif
 | 
|          sqlite3_create_function(db, "eval", 1, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0);
 | 
|          sqlite3_create_function(db, "eval", 2, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0);
 | 
| +        sqlite3_create_module(db, "generate_series", &seriesModule, 0);
 | 
|          sqlite3_limit(db, SQLITE_LIMIT_LENGTH, 1000000);
 | 
|          if( zEncoding ) sqlexec(db, "PRAGMA encoding=%s", zEncoding);
 | 
|          if( pageSize ) sqlexec(db, "PRAGMA pagesize=%d", pageSize);
 | 
|          if( doAutovac ) sqlexec(db, "PRAGMA auto_vacuum=FULL");
 | 
|          iStart = timeOfDay();
 | 
| +
 | 
| +        /* If using an input database file and that database contains a table
 | 
| +        ** named "autoexec" with a column "sql", then replace the input SQL
 | 
| +        ** with the concatenated text of the autoexec table.  In this way,
 | 
| +        ** if the database file is the input being fuzzed, the SQL text is
 | 
| +        ** fuzzed at the same time. */
 | 
| +        if( sqlite3_table_column_metadata(db,0,"autoexec","sql",0,0,0,0,0)==0 ){
 | 
| +          sqlite3_stmt *pStmt;
 | 
| +          rc = sqlite3_prepare_v2(db, "SELECT sql FROM autoexec", -1, &pStmt, 0);
 | 
| +          if( rc==SQLITE_OK ){
 | 
| +            while( sqlite3_step(pStmt)==SQLITE_ROW ){
 | 
| +              StrAppend(&sql, (const char*)sqlite3_column_text(pStmt, 0));
 | 
| +              StrAppend(&sql, "\n");
 | 
| +            }
 | 
| +          }
 | 
| +          sqlite3_finalize(pStmt);
 | 
| +          zSql = StrStr(&sql);
 | 
| +        }
 | 
| +
 | 
|          g.bOomEnable = 1;
 | 
|          if( verboseFlag ){
 | 
|            zErrMsg = 0;
 | 
| @@ -747,6 +1141,7 @@ int main(int argc, char **argv){
 | 
|          }
 | 
|          g.bOomEnable = 0;
 | 
|          iEnd = timeOfDay();
 | 
| +        StrFree(&sql);
 | 
|          rc = sqlite3_close(db);
 | 
|          if( rc ){
 | 
|            abendError("sqlite3_close() failed with rc=%d", rc);
 | 
| 
 |