sqlite-amalgamation-3380500.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3875 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										70
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										70
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							@@ -7964,9 +7964,14 @@ static int zipfileFilter(
 | 
				
			|||||||
    zipfileCursorErr(pCsr, "zipfile() function requires an argument");
 | 
					    zipfileCursorErr(pCsr, "zipfile() function requires an argument");
 | 
				
			||||||
    return SQLITE_ERROR;
 | 
					    return SQLITE_ERROR;
 | 
				
			||||||
  }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
 | 
					  }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
 | 
				
			||||||
 | 
					    static const u8 aEmptyBlob = 0;
 | 
				
			||||||
    const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
 | 
					    const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
 | 
				
			||||||
    int nBlob = sqlite3_value_bytes(argv[0]);
 | 
					    int nBlob = sqlite3_value_bytes(argv[0]);
 | 
				
			||||||
    assert( pTab->pFirstEntry==0 );
 | 
					    assert( pTab->pFirstEntry==0 );
 | 
				
			||||||
 | 
					    if( aBlob==0 ){
 | 
				
			||||||
 | 
					      aBlob = &aEmptyBlob;
 | 
				
			||||||
 | 
					      nBlob = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
 | 
					    rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
 | 
				
			||||||
    pCsr->pFreeEntry = pTab->pFirstEntry;
 | 
					    pCsr->pFreeEntry = pTab->pFirstEntry;
 | 
				
			||||||
    pTab->pFirstEntry = pTab->pLastEntry = 0;
 | 
					    pTab->pFirstEntry = pTab->pLastEntry = 0;
 | 
				
			||||||
@@ -14425,6 +14430,8 @@ static void exec_prepared_stmt_columnar(
 | 
				
			|||||||
  int bNextLine = 0;
 | 
					  int bNextLine = 0;
 | 
				
			||||||
  int bMultiLineRowExists = 0;
 | 
					  int bMultiLineRowExists = 0;
 | 
				
			||||||
  int bw = p->cmOpts.bWordWrap;
 | 
					  int bw = p->cmOpts.bWordWrap;
 | 
				
			||||||
 | 
					  const char *zEmpty = "";
 | 
				
			||||||
 | 
					  const char *zShowNull = p->nullValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rc = sqlite3_step(pStmt);
 | 
					  rc = sqlite3_step(pStmt);
 | 
				
			||||||
  if( rc!=SQLITE_ROW ) return;
 | 
					  if( rc!=SQLITE_ROW ) return;
 | 
				
			||||||
@@ -14486,12 +14493,14 @@ static void exec_prepared_stmt_columnar(
 | 
				
			|||||||
      if( wx<0 ) wx = -wx;
 | 
					      if( wx<0 ) wx = -wx;
 | 
				
			||||||
      if( useNextLine ){
 | 
					      if( useNextLine ){
 | 
				
			||||||
        uz = azNextLine[i];
 | 
					        uz = azNextLine[i];
 | 
				
			||||||
 | 
					        if( uz==0 ) uz = (u8*)zEmpty;
 | 
				
			||||||
      }else if( p->cmOpts.bQuote ){
 | 
					      }else if( p->cmOpts.bQuote ){
 | 
				
			||||||
        sqlite3_free(azQuoted[i]);
 | 
					        sqlite3_free(azQuoted[i]);
 | 
				
			||||||
        azQuoted[i] = quoted_column(pStmt,i);
 | 
					        azQuoted[i] = quoted_column(pStmt,i);
 | 
				
			||||||
        uz = (const unsigned char*)azQuoted[i];
 | 
					        uz = (const unsigned char*)azQuoted[i];
 | 
				
			||||||
      }else{
 | 
					      }else{
 | 
				
			||||||
        uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
 | 
					        uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
 | 
				
			||||||
 | 
					        if( uz==0 ) uz = (u8*)zShowNull;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      azData[nRow*nColumn + i]
 | 
					      azData[nRow*nColumn + i]
 | 
				
			||||||
        = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
 | 
					        = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
 | 
				
			||||||
@@ -14505,7 +14514,7 @@ static void exec_prepared_stmt_columnar(
 | 
				
			|||||||
  nTotal = nColumn*(nRow+1);
 | 
					  nTotal = nColumn*(nRow+1);
 | 
				
			||||||
  for(i=0; i<nTotal; i++){
 | 
					  for(i=0; i<nTotal; i++){
 | 
				
			||||||
    z = azData[i];
 | 
					    z = azData[i];
 | 
				
			||||||
    if( z==0 ) z = p->nullValue;
 | 
					    if( z==0 ) z = (char*)zEmpty;
 | 
				
			||||||
    n = strlenChar(z);
 | 
					    n = strlenChar(z);
 | 
				
			||||||
    j = i%nColumn;
 | 
					    j = i%nColumn;
 | 
				
			||||||
    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
 | 
					    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
 | 
				
			||||||
@@ -14609,7 +14618,10 @@ columnar_end:
 | 
				
			|||||||
    utf8_printf(p->out, "Interrupt\n");
 | 
					    utf8_printf(p->out, "Interrupt\n");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  nData = (nRow+1)*nColumn;
 | 
					  nData = (nRow+1)*nColumn;
 | 
				
			||||||
  for(i=0; i<nData; i++) free(azData[i]);
 | 
					  for(i=0; i<nData; i++){
 | 
				
			||||||
 | 
					    z = azData[i];
 | 
				
			||||||
 | 
					    if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  sqlite3_free(azData);
 | 
					  sqlite3_free(azData);
 | 
				
			||||||
  sqlite3_free((void*)azNextLine);
 | 
					  sqlite3_free((void*)azNextLine);
 | 
				
			||||||
  sqlite3_free(abRowDiv);
 | 
					  sqlite3_free(abRowDiv);
 | 
				
			||||||
@@ -19035,12 +19047,12 @@ SELECT\
 | 
				
			|||||||
  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
 | 
					  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
 | 
				
			||||||
 ||')' AS ColsSpec \
 | 
					 ||')' AS ColsSpec \
 | 
				
			||||||
FROM (\
 | 
					FROM (\
 | 
				
			||||||
 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \
 | 
					 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
 | 
				
			||||||
 FROM ColNames ORDER BY cpos\
 | 
					 FROM ColNames ORDER BY cpos\
 | 
				
			||||||
)";
 | 
					)";
 | 
				
			||||||
  static const char * const zRenamesDone =
 | 
					  static const char * const zRenamesDone =
 | 
				
			||||||
    "SELECT group_concat("
 | 
					    "SELECT group_concat("
 | 
				
			||||||
    " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff)),"
 | 
					    " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
 | 
				
			||||||
    " ','||x'0a')"
 | 
					    " ','||x'0a')"
 | 
				
			||||||
    "FROM ColNames WHERE suff<>'' OR chop!=0"
 | 
					    "FROM ColNames WHERE suff<>'' OR chop!=0"
 | 
				
			||||||
    ;
 | 
					    ;
 | 
				
			||||||
@@ -19906,7 +19918,7 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
 | 
					  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
 | 
				
			||||||
    char *zTable = 0;           /* Insert data into this table */
 | 
					    char *zTable = 0;           /* Insert data into this table */
 | 
				
			||||||
    char *zSchema = "main";     /* within this schema */
 | 
					    char *zSchema = 0;          /* within this schema (may default to "main") */
 | 
				
			||||||
    char *zFile = 0;            /* Name of file to extra content from */
 | 
					    char *zFile = 0;            /* Name of file to extra content from */
 | 
				
			||||||
    sqlite3_stmt *pStmt = NULL; /* A statement */
 | 
					    sqlite3_stmt *pStmt = NULL; /* A statement */
 | 
				
			||||||
    int nCol;                   /* Number of columns in the table */
 | 
					    int nCol;                   /* Number of columns in the table */
 | 
				
			||||||
@@ -19915,11 +19927,13 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
    int needCommit;             /* True to COMMIT or ROLLBACK at end */
 | 
					    int needCommit;             /* True to COMMIT or ROLLBACK at end */
 | 
				
			||||||
    int nSep;                   /* Number of bytes in p->colSeparator[] */
 | 
					    int nSep;                   /* Number of bytes in p->colSeparator[] */
 | 
				
			||||||
    char *zSql;                 /* An SQL statement */
 | 
					    char *zSql;                 /* An SQL statement */
 | 
				
			||||||
 | 
					    char *zFullTabName;         /* Table name with schema if applicable */
 | 
				
			||||||
    ImportCtx sCtx;             /* Reader context */
 | 
					    ImportCtx sCtx;             /* Reader context */
 | 
				
			||||||
    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
 | 
					    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
 | 
				
			||||||
    int eVerbose = 0;           /* Larger for more console output */
 | 
					    int eVerbose = 0;           /* Larger for more console output */
 | 
				
			||||||
    int nSkip = 0;              /* Initial lines to skip */
 | 
					    int nSkip = 0;              /* Initial lines to skip */
 | 
				
			||||||
    int useOutputMode = 1;      /* Use output mode to determine separators */
 | 
					    int useOutputMode = 1;      /* Use output mode to determine separators */
 | 
				
			||||||
 | 
					    char *zCreate = 0;          /* CREATE TABLE statement text */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    failIfSafeMode(p, "cannot run .import in safe mode");
 | 
					    failIfSafeMode(p, "cannot run .import in safe mode");
 | 
				
			||||||
    memset(&sCtx, 0, sizeof(sCtx));
 | 
					    memset(&sCtx, 0, sizeof(sCtx));
 | 
				
			||||||
@@ -20042,7 +20056,6 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      import_cleanup(&sCtx);
 | 
					      import_cleanup(&sCtx);
 | 
				
			||||||
      goto meta_command_exit;
 | 
					      goto meta_command_exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /* Below, resources must be freed before exit. */
 | 
					 | 
				
			||||||
    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
 | 
					    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
 | 
				
			||||||
      char zSep[2];
 | 
					      char zSep[2];
 | 
				
			||||||
      zSep[1] = 0;
 | 
					      zSep[1] = 0;
 | 
				
			||||||
@@ -20054,11 +20067,17 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      output_c_string(p->out, zSep);
 | 
					      output_c_string(p->out, zSep);
 | 
				
			||||||
      utf8_printf(p->out, "\n");
 | 
					      utf8_printf(p->out, "\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /* Below, resources must be freed before exit. */
 | 
				
			||||||
    while( (nSkip--)>0 ){
 | 
					    while( (nSkip--)>0 ){
 | 
				
			||||||
      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
 | 
					      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    zSql = sqlite3_mprintf("SELECT * FROM \"%w\".\"%w\"", zSchema, zTable);
 | 
					    if( zSchema!=0 ){
 | 
				
			||||||
    if( zSql==0 ){
 | 
					      zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
 | 
				
			||||||
 | 
					    }else{
 | 
				
			||||||
 | 
					      zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
 | 
				
			||||||
 | 
					    if( zSql==0 || zFullTabName==0 ){
 | 
				
			||||||
      import_cleanup(&sCtx);
 | 
					      import_cleanup(&sCtx);
 | 
				
			||||||
      shell_out_of_memory();
 | 
					      shell_out_of_memory();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -20066,11 +20085,10 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
					    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
				
			||||||
    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
 | 
					    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
 | 
				
			||||||
    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
 | 
					    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
 | 
				
			||||||
      char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"",
 | 
					 | 
				
			||||||
                                      zSchema, zTable);
 | 
					 | 
				
			||||||
      sqlite3 *dbCols = 0;
 | 
					      sqlite3 *dbCols = 0;
 | 
				
			||||||
      char *zRenames = 0;
 | 
					      char *zRenames = 0;
 | 
				
			||||||
      char *zColDefs;
 | 
					      char *zColDefs;
 | 
				
			||||||
 | 
					      zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
 | 
				
			||||||
      while( xRead(&sCtx) ){
 | 
					      while( xRead(&sCtx) ){
 | 
				
			||||||
        zAutoColumn(sCtx.z, &dbCols, 0);
 | 
					        zAutoColumn(sCtx.z, &dbCols, 0);
 | 
				
			||||||
        if( sCtx.cTerm!=sCtx.cColSep ) break;
 | 
					        if( sCtx.cTerm!=sCtx.cColSep ) break;
 | 
				
			||||||
@@ -20084,9 +20102,12 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      assert(dbCols==0);
 | 
					      assert(dbCols==0);
 | 
				
			||||||
      if( zColDefs==0 ){
 | 
					      if( zColDefs==0 ){
 | 
				
			||||||
        sqlite3_free(zCreate);
 | 
					 | 
				
			||||||
        import_cleanup(&sCtx);
 | 
					 | 
				
			||||||
        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
 | 
					        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
 | 
				
			||||||
 | 
					      import_fail:
 | 
				
			||||||
 | 
					        sqlite3_free(zCreate);
 | 
				
			||||||
 | 
					        sqlite3_free(zSql);
 | 
				
			||||||
 | 
					        sqlite3_free(zFullTabName);
 | 
				
			||||||
 | 
					        import_cleanup(&sCtx);
 | 
				
			||||||
        rc = 1;
 | 
					        rc = 1;
 | 
				
			||||||
        goto meta_command_exit;
 | 
					        goto meta_command_exit;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -20097,22 +20118,18 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
 | 
					      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
 | 
				
			||||||
      if( rc ){
 | 
					      if( rc ){
 | 
				
			||||||
        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
 | 
					        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
 | 
				
			||||||
        sqlite3_free(zCreate);
 | 
					        goto import_fail;
 | 
				
			||||||
        import_cleanup(&sCtx);
 | 
					 | 
				
			||||||
        rc = 1;
 | 
					 | 
				
			||||||
        goto meta_command_exit;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      sqlite3_free(zCreate);
 | 
					      sqlite3_free(zCreate);
 | 
				
			||||||
 | 
					      zCreate = 0;
 | 
				
			||||||
      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
					      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    sqlite3_free(zSql);
 | 
					 | 
				
			||||||
    if( rc ){
 | 
					    if( rc ){
 | 
				
			||||||
      if (pStmt) sqlite3_finalize(pStmt);
 | 
					      if (pStmt) sqlite3_finalize(pStmt);
 | 
				
			||||||
      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
 | 
					      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
 | 
				
			||||||
      import_cleanup(&sCtx);
 | 
					      goto import_fail;
 | 
				
			||||||
      rc = 1;
 | 
					 | 
				
			||||||
      goto meta_command_exit;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    sqlite3_free(zSql);
 | 
				
			||||||
    nCol = sqlite3_column_count(pStmt);
 | 
					    nCol = sqlite3_column_count(pStmt);
 | 
				
			||||||
    sqlite3_finalize(pStmt);
 | 
					    sqlite3_finalize(pStmt);
 | 
				
			||||||
    pStmt = 0;
 | 
					    pStmt = 0;
 | 
				
			||||||
@@ -20122,8 +20139,7 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      import_cleanup(&sCtx);
 | 
					      import_cleanup(&sCtx);
 | 
				
			||||||
      shell_out_of_memory();
 | 
					      shell_out_of_memory();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?",
 | 
					    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
 | 
				
			||||||
                     zSchema, zTable);
 | 
					 | 
				
			||||||
    j = strlen30(zSql);
 | 
					    j = strlen30(zSql);
 | 
				
			||||||
    for(i=1; i<nCol; i++){
 | 
					    for(i=1; i<nCol; i++){
 | 
				
			||||||
      zSql[j++] = ',';
 | 
					      zSql[j++] = ',';
 | 
				
			||||||
@@ -20135,14 +20151,13 @@ static int do_meta_command(char *zLine, ShellState *p){
 | 
				
			|||||||
      utf8_printf(p->out, "Insert using: %s\n", zSql);
 | 
					      utf8_printf(p->out, "Insert using: %s\n", zSql);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
					    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 | 
				
			||||||
    sqlite3_free(zSql);
 | 
					 | 
				
			||||||
    if( rc ){
 | 
					    if( rc ){
 | 
				
			||||||
      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 | 
					      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 | 
				
			||||||
      if (pStmt) sqlite3_finalize(pStmt);
 | 
					      if (pStmt) sqlite3_finalize(pStmt);
 | 
				
			||||||
      import_cleanup(&sCtx);
 | 
					      goto import_fail;
 | 
				
			||||||
      rc = 1;
 | 
					 | 
				
			||||||
      goto meta_command_exit;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    sqlite3_free(zSql);
 | 
				
			||||||
 | 
					    sqlite3_free(zFullTabName);
 | 
				
			||||||
    needCommit = sqlite3_get_autocommit(p->db);
 | 
					    needCommit = sqlite3_get_autocommit(p->db);
 | 
				
			||||||
    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
 | 
					    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
 | 
				
			||||||
    do{
 | 
					    do{
 | 
				
			||||||
@@ -22636,7 +22651,8 @@ static int process_input(ShellState *p){
 | 
				
			|||||||
      qss = QSS_Start;
 | 
					      qss = QSS_Start;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if( nSql && QSS_PLAINDARK(qss) ){
 | 
					  if( nSql ){
 | 
				
			||||||
 | 
					    /* This may be incomplete. Let the SQL parser deal with that. */
 | 
				
			||||||
    errCnt += runOneSqlLine(p, zSql, p->in, startline);
 | 
					    errCnt += runOneSqlLine(p, zSql, p->in, startline);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  free(zSql);
 | 
					  free(zSql);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										459
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										459
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
/******************************************************************************
 | 
					/******************************************************************************
 | 
				
			||||||
** This file is an amalgamation of many separate C source files from SQLite
 | 
					** This file is an amalgamation of many separate C source files from SQLite
 | 
				
			||||||
** version 3.38.0.  By combining all the individual C code files into this
 | 
					** version 3.38.5.  By combining all the individual C code files into this
 | 
				
			||||||
** single large file, the entire code can be compiled as a single translation
 | 
					** single large file, the entire code can be compiled as a single translation
 | 
				
			||||||
** unit.  This allows many compilers to do optimizations that would not be
 | 
					** unit.  This allows many compilers to do optimizations that would not be
 | 
				
			||||||
** possible if the files were compiled separately.  Performance improvements
 | 
					** possible if the files were compiled separately.  Performance improvements
 | 
				
			||||||
@@ -452,9 +452,9 @@ extern "C" {
 | 
				
			|||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 | 
					** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 | 
				
			||||||
** [sqlite_version()] and [sqlite_source_id()].
 | 
					** [sqlite_version()] and [sqlite_source_id()].
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define SQLITE_VERSION        "3.38.0"
 | 
					#define SQLITE_VERSION        "3.38.5"
 | 
				
			||||||
#define SQLITE_VERSION_NUMBER 3038000
 | 
					#define SQLITE_VERSION_NUMBER 3038005
 | 
				
			||||||
#define SQLITE_SOURCE_ID      "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab"
 | 
					#define SQLITE_SOURCE_ID      "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** CAPI3REF: Run-Time Library Version Numbers
 | 
					** CAPI3REF: Run-Time Library Version Numbers
 | 
				
			||||||
@@ -5285,6 +5285,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** even empty strings, are always zero-terminated.  ^The return
 | 
					** even empty strings, are always zero-terminated.  ^The return
 | 
				
			||||||
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
 | 
					** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
 | 
					** ^Strings returned by sqlite3_column_text16() always have the endianness
 | 
				
			||||||
 | 
					** which is native to the platform, regardless of the text encoding set
 | 
				
			||||||
 | 
					** for the database.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
 | 
					** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
 | 
				
			||||||
** [unprotected sqlite3_value] object.  In a multithreaded environment,
 | 
					** [unprotected sqlite3_value] object.  In a multithreaded environment,
 | 
				
			||||||
** an unprotected sqlite3_value object may only be used safely with
 | 
					** an unprotected sqlite3_value object may only be used safely with
 | 
				
			||||||
@@ -5298,7 +5302,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** [application-defined SQL functions] or [virtual tables], not within
 | 
					** [application-defined SQL functions] or [virtual tables], not within
 | 
				
			||||||
** top-level application code.
 | 
					** top-level application code.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
** The these routines may attempt to convert the datatype of the result.
 | 
					** These routines may attempt to convert the datatype of the result.
 | 
				
			||||||
** ^For example, if the internal representation is FLOAT and a text result
 | 
					** ^For example, if the internal representation is FLOAT and a text result
 | 
				
			||||||
** is requested, [sqlite3_snprintf()] is used internally to perform the
 | 
					** is requested, [sqlite3_snprintf()] is used internally to perform the
 | 
				
			||||||
** conversion automatically.  ^(The following table details the conversions
 | 
					** conversion automatically.  ^(The following table details the conversions
 | 
				
			||||||
@@ -5323,7 +5327,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** <tr><td>  TEXT    <td>   BLOB    <td> No change
 | 
					** <tr><td>  TEXT    <td>   BLOB    <td> No change
 | 
				
			||||||
** <tr><td>  BLOB    <td> INTEGER   <td> [CAST] to INTEGER
 | 
					** <tr><td>  BLOB    <td> INTEGER   <td> [CAST] to INTEGER
 | 
				
			||||||
** <tr><td>  BLOB    <td>  FLOAT    <td> [CAST] to REAL
 | 
					** <tr><td>  BLOB    <td>  FLOAT    <td> [CAST] to REAL
 | 
				
			||||||
** <tr><td>  BLOB    <td>   TEXT    <td> Add a zero terminator if needed
 | 
					** <tr><td>  BLOB    <td>   TEXT    <td> [CAST] to TEXT, ensure zero terminator
 | 
				
			||||||
** </table>
 | 
					** </table>
 | 
				
			||||||
** </blockquote>)^
 | 
					** </blockquote>)^
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
@@ -10073,7 +10077,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
 | 
				
			|||||||
** ^When xBestIndex returns, the sqlite3_value object returned by
 | 
					** ^When xBestIndex returns, the sqlite3_value object returned by
 | 
				
			||||||
** sqlite3_vtab_rhs_value() is automatically deallocated.
 | 
					** sqlite3_vtab_rhs_value() is automatically deallocated.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
** The "_rhs_" in the name of this routine is an appreviation for
 | 
					** The "_rhs_" in the name of this routine is an abbreviation for
 | 
				
			||||||
** "Right-Hand Side".
 | 
					** "Right-Hand Side".
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
 | 
					SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
 | 
				
			||||||
@@ -19925,6 +19929,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
 | 
				
			|||||||
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
 | 
					SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*);
 | 
					SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int);
 | 
					SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int);
 | 
				
			||||||
 | 
					SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr*,const SrcItem*);
 | 
				
			||||||
#ifdef SQLITE_ENABLE_CURSOR_HINTS
 | 
					#ifdef SQLITE_ENABLE_CURSOR_HINTS
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*);
 | 
					SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -20364,7 +20369,12 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
 | 
				
			|||||||
SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
 | 
					SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
 | 
					SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
 | 
					SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
 | 
					SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
 | 
				
			||||||
 | 
					#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
 | 
				
			||||||
 | 
					    && !defined(SQLITE_OMIT_VIRTUALTABLE)
 | 
				
			||||||
 | 
					SQLITE_PRIVATE   void sqlite3VtabWriteAll(sqlite3_index_info*);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
 | 
					SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
 | 
					SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
 | 
					SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
 | 
				
			||||||
@@ -23654,7 +23664,7 @@ static int toLocaltime(
 | 
				
			|||||||
  p->D = sLocal.tm_mday;
 | 
					  p->D = sLocal.tm_mday;
 | 
				
			||||||
  p->h = sLocal.tm_hour;
 | 
					  p->h = sLocal.tm_hour;
 | 
				
			||||||
  p->m = sLocal.tm_min;
 | 
					  p->m = sLocal.tm_min;
 | 
				
			||||||
  p->s = sLocal.tm_sec;
 | 
					  p->s = sLocal.tm_sec + (p->iJD%1000)*0.001;
 | 
				
			||||||
  p->validYMD = 1;
 | 
					  p->validYMD = 1;
 | 
				
			||||||
  p->validHMS = 1;
 | 
					  p->validHMS = 1;
 | 
				
			||||||
  p->validJD = 0;
 | 
					  p->validJD = 0;
 | 
				
			||||||
@@ -29328,8 +29338,9 @@ SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const cha
 | 
				
			|||||||
** Free any prior content in *pz and replace it with a copy of zNew.
 | 
					** Free any prior content in *pz and replace it with a copy of zNew.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
 | 
					SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
 | 
				
			||||||
 | 
					  char *z = sqlite3DbStrDup(db, zNew);
 | 
				
			||||||
  sqlite3DbFree(db, *pz);
 | 
					  sqlite3DbFree(db, *pz);
 | 
				
			||||||
  *pz = sqlite3DbStrDup(db, zNew);
 | 
					  *pz = z;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -39682,11 +39693,17 @@ static int unixShmLock(
 | 
				
			|||||||
  int flags                  /* What to do with the lock */
 | 
					  int flags                  /* What to do with the lock */
 | 
				
			||||||
){
 | 
					){
 | 
				
			||||||
  unixFile *pDbFd = (unixFile*)fd;      /* Connection holding shared memory */
 | 
					  unixFile *pDbFd = (unixFile*)fd;      /* Connection holding shared memory */
 | 
				
			||||||
  unixShm *p = pDbFd->pShm;             /* The shared memory being locked */
 | 
					  unixShm *p;                           /* The shared memory being locked */
 | 
				
			||||||
  unixShmNode *pShmNode = p->pShmNode;  /* The underlying file iNode */
 | 
					  unixShmNode *pShmNode;                /* The underlying file iNode */
 | 
				
			||||||
  int rc = SQLITE_OK;                   /* Result code */
 | 
					  int rc = SQLITE_OK;                   /* Result code */
 | 
				
			||||||
  u16 mask;                             /* Mask of locks to take or release */
 | 
					  u16 mask;                             /* Mask of locks to take or release */
 | 
				
			||||||
  int *aLock = pShmNode->aLock;
 | 
					  int *aLock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  p = pDbFd->pShm;
 | 
				
			||||||
 | 
					  if( p==0 ) return SQLITE_IOERR_SHMLOCK;
 | 
				
			||||||
 | 
					  pShmNode = p->pShmNode;
 | 
				
			||||||
 | 
					  if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
 | 
				
			||||||
 | 
					  aLock = pShmNode->aLock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert( pShmNode==pDbFd->pInode->pShmNode );
 | 
					  assert( pShmNode==pDbFd->pInode->pShmNode );
 | 
				
			||||||
  assert( pShmNode->pInode==pDbFd->pInode );
 | 
					  assert( pShmNode->pInode==pDbFd->pInode );
 | 
				
			||||||
@@ -46974,10 +46991,14 @@ static int winShmLock(
 | 
				
			|||||||
  winFile *pDbFd = (winFile*)fd;        /* Connection holding shared memory */
 | 
					  winFile *pDbFd = (winFile*)fd;        /* Connection holding shared memory */
 | 
				
			||||||
  winShm *p = pDbFd->pShm;              /* The shared memory being locked */
 | 
					  winShm *p = pDbFd->pShm;              /* The shared memory being locked */
 | 
				
			||||||
  winShm *pX;                           /* For looping over all siblings */
 | 
					  winShm *pX;                           /* For looping over all siblings */
 | 
				
			||||||
  winShmNode *pShmNode = p->pShmNode;
 | 
					  winShmNode *pShmNode;
 | 
				
			||||||
  int rc = SQLITE_OK;                   /* Result code */
 | 
					  int rc = SQLITE_OK;                   /* Result code */
 | 
				
			||||||
  u16 mask;                             /* Mask of locks to take or release */
 | 
					  u16 mask;                             /* Mask of locks to take or release */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( p==0 ) return SQLITE_IOERR_SHMLOCK;
 | 
				
			||||||
 | 
					  pShmNode = p->pShmNode;
 | 
				
			||||||
 | 
					  if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
 | 
					  assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
 | 
				
			||||||
  assert( n>=1 );
 | 
					  assert( n>=1 );
 | 
				
			||||||
  assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
 | 
					  assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
 | 
				
			||||||
@@ -50907,7 +50928,8 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){
 | 
				
			|||||||
** make it so.
 | 
					** make it so.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
 | 
					SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
 | 
				
			||||||
  assert( p->nRef>0 );
 | 
					  assert( p->nRef>0 || p->pCache->bPurgeable==0 );
 | 
				
			||||||
 | 
					  testcase( p->nRef==0 );
 | 
				
			||||||
  assert( sqlite3PcachePageSanity(p) );
 | 
					  assert( sqlite3PcachePageSanity(p) );
 | 
				
			||||||
  if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){    /*OPTIMIZATION-IF-FALSE*/
 | 
					  if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){    /*OPTIMIZATION-IF-FALSE*/
 | 
				
			||||||
    p->flags &= ~PGHDR_DONT_WRITE;
 | 
					    p->flags &= ~PGHDR_DONT_WRITE;
 | 
				
			||||||
@@ -56039,6 +56061,9 @@ static int pager_playback(Pager *pPager, int isHot){
 | 
				
			|||||||
        goto end_playback;
 | 
					        goto end_playback;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      pPager->dbSize = mxPg;
 | 
					      pPager->dbSize = mxPg;
 | 
				
			||||||
 | 
					      if( pPager->mxPgno<mxPg ){
 | 
				
			||||||
 | 
					        pPager->mxPgno = mxPg;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Copy original pages out of the journal and back into the
 | 
					    /* Copy original pages out of the journal and back into the
 | 
				
			||||||
@@ -65398,7 +65423,9 @@ struct MemPage {
 | 
				
			|||||||
  u8 *apOvfl[4];       /* Pointers to the body of overflow cells */
 | 
					  u8 *apOvfl[4];       /* Pointers to the body of overflow cells */
 | 
				
			||||||
  BtShared *pBt;       /* Pointer to BtShared that this page is part of */
 | 
					  BtShared *pBt;       /* Pointer to BtShared that this page is part of */
 | 
				
			||||||
  u8 *aData;           /* Pointer to disk image of the page data */
 | 
					  u8 *aData;           /* Pointer to disk image of the page data */
 | 
				
			||||||
  u8 *aDataEnd;        /* One byte past the end of usable data */
 | 
					  u8 *aDataEnd;        /* One byte past the end of the entire page - not just
 | 
				
			||||||
 | 
					                       ** the usable space, the entire page.  Used to prevent
 | 
				
			||||||
 | 
					                       ** corruption-induced of buffer overflow. */
 | 
				
			||||||
  u8 *aCellIdx;        /* The cell index area */
 | 
					  u8 *aCellIdx;        /* The cell index area */
 | 
				
			||||||
  u8 *aDataOfst;       /* Same as aData for leaves.  aData+4 for interior */
 | 
					  u8 *aDataOfst;       /* Same as aData for leaves.  aData+4 for interior */
 | 
				
			||||||
  DbPage *pDbPage;     /* Pager page handle */
 | 
					  DbPage *pDbPage;     /* Pager page handle */
 | 
				
			||||||
@@ -67739,6 +67766,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
 | 
				
			|||||||
        ** fragmented bytes within the page. */
 | 
					        ** fragmented bytes within the page. */
 | 
				
			||||||
        memcpy(&aData[iAddr], &aData[pc], 2);
 | 
					        memcpy(&aData[iAddr], &aData[pc], 2);
 | 
				
			||||||
        aData[hdr+7] += (u8)x;
 | 
					        aData[hdr+7] += (u8)x;
 | 
				
			||||||
 | 
					        testcase( pc+x>maxPC );
 | 
				
			||||||
 | 
					        return &aData[pc];
 | 
				
			||||||
      }else if( x+pc > maxPC ){
 | 
					      }else if( x+pc > maxPC ){
 | 
				
			||||||
        /* This slot extends off the end of the usable part of the page */
 | 
					        /* This slot extends off the end of the usable part of the page */
 | 
				
			||||||
        *pRc = SQLITE_CORRUPT_PAGE(pPg);
 | 
					        *pRc = SQLITE_CORRUPT_PAGE(pPg);
 | 
				
			||||||
@@ -68183,7 +68212,7 @@ static int btreeInitPage(MemPage *pPage){
 | 
				
			|||||||
  pPage->nOverflow = 0;
 | 
					  pPage->nOverflow = 0;
 | 
				
			||||||
  pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize;
 | 
					  pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize;
 | 
				
			||||||
  pPage->aCellIdx = data + pPage->childPtrSize + 8;
 | 
					  pPage->aCellIdx = data + pPage->childPtrSize + 8;
 | 
				
			||||||
  pPage->aDataEnd = pPage->aData + pBt->usableSize;
 | 
					  pPage->aDataEnd = pPage->aData + pBt->pageSize;
 | 
				
			||||||
  pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
 | 
					  pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
 | 
				
			||||||
  /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
 | 
					  /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
 | 
				
			||||||
  ** number of cells on the page. */
 | 
					  ** number of cells on the page. */
 | 
				
			||||||
@@ -68218,7 +68247,7 @@ static void zeroPage(MemPage *pPage, int flags){
 | 
				
			|||||||
  u8 hdr = pPage->hdrOffset;
 | 
					  u8 hdr = pPage->hdrOffset;
 | 
				
			||||||
  u16 first;
 | 
					  u16 first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
 | 
					  assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB );
 | 
				
			||||||
  assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
 | 
					  assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
 | 
				
			||||||
  assert( sqlite3PagerGetData(pPage->pDbPage) == data );
 | 
					  assert( sqlite3PagerGetData(pPage->pDbPage) == data );
 | 
				
			||||||
  assert( sqlite3PagerIswriteable(pPage->pDbPage) );
 | 
					  assert( sqlite3PagerIswriteable(pPage->pDbPage) );
 | 
				
			||||||
@@ -68234,7 +68263,7 @@ static void zeroPage(MemPage *pPage, int flags){
 | 
				
			|||||||
  pPage->nFree = (u16)(pBt->usableSize - first);
 | 
					  pPage->nFree = (u16)(pBt->usableSize - first);
 | 
				
			||||||
  decodeFlags(pPage, flags);
 | 
					  decodeFlags(pPage, flags);
 | 
				
			||||||
  pPage->cellOffset = first;
 | 
					  pPage->cellOffset = first;
 | 
				
			||||||
  pPage->aDataEnd = &data[pBt->usableSize];
 | 
					  pPage->aDataEnd = &data[pBt->pageSize];
 | 
				
			||||||
  pPage->aCellIdx = &data[first];
 | 
					  pPage->aCellIdx = &data[first];
 | 
				
			||||||
  pPage->aDataOfst = &data[pPage->childPtrSize];
 | 
					  pPage->aDataOfst = &data[pPage->childPtrSize];
 | 
				
			||||||
  pPage->nOverflow = 0;
 | 
					  pPage->nOverflow = 0;
 | 
				
			||||||
@@ -68360,7 +68389,7 @@ static int getAndInitPage(
 | 
				
			|||||||
      goto getAndInitPage_error2;
 | 
					      goto getAndInitPage_error2;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  assert( (*ppPage)->pgno==pgno );
 | 
					  assert( (*ppPage)->pgno==pgno || CORRUPT_DB );
 | 
				
			||||||
  assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) );
 | 
					  assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* If obtaining a child page for a cursor, we must verify that the page is
 | 
					  /* If obtaining a child page for a cursor, we must verify that the page is
 | 
				
			||||||
@@ -71447,7 +71476,7 @@ static int moveToRoot(BtCursor *pCur){
 | 
				
			|||||||
    pCur->curIntKey = pCur->pPage->intKey;
 | 
					    pCur->curIntKey = pCur->pPage->intKey;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  pRoot = pCur->pPage;
 | 
					  pRoot = pCur->pPage;
 | 
				
			||||||
  assert( pRoot->pgno==pCur->pgnoRoot );
 | 
					  assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
 | 
					  /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
 | 
				
			||||||
  ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
 | 
					  ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
 | 
				
			||||||
@@ -71938,7 +71967,7 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto(
 | 
				
			|||||||
    assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
 | 
					    assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
 | 
				
			||||||
    assert( pPage->isInit );
 | 
					    assert( pPage->isInit );
 | 
				
			||||||
    if( pPage->leaf ){
 | 
					    if( pPage->leaf ){
 | 
				
			||||||
      assert( pCur->ix<pCur->pPage->nCell );
 | 
					      assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB );
 | 
				
			||||||
      pCur->ix = (u16)idx;
 | 
					      pCur->ix = (u16)idx;
 | 
				
			||||||
      *pRes = c;
 | 
					      *pRes = c;
 | 
				
			||||||
      rc = SQLITE_OK;
 | 
					      rc = SQLITE_OK;
 | 
				
			||||||
@@ -74462,7 +74491,7 @@ static int balance_nonroot(
 | 
				
			|||||||
    iOvflSpace += sz;
 | 
					    iOvflSpace += sz;
 | 
				
			||||||
    assert( sz<=pBt->maxLocal+23 );
 | 
					    assert( sz<=pBt->maxLocal+23 );
 | 
				
			||||||
    assert( iOvflSpace <= (int)pBt->pageSize );
 | 
					    assert( iOvflSpace <= (int)pBt->pageSize );
 | 
				
			||||||
    for(k=0; b.ixNx[k]<=i && ALWAYS(k<NB*2); k++){}
 | 
					    for(k=0; b.ixNx[k]<=j && ALWAYS(k<NB*2); k++){}
 | 
				
			||||||
    pSrcEnd = b.apEnd[k];
 | 
					    pSrcEnd = b.apEnd[k];
 | 
				
			||||||
    if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){
 | 
					    if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){
 | 
				
			||||||
      rc = SQLITE_CORRUPT_BKPT;
 | 
					      rc = SQLITE_CORRUPT_BKPT;
 | 
				
			||||||
@@ -74978,24 +75007,6 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
 | 
				
			|||||||
  assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags );
 | 
					  assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags );
 | 
				
			||||||
  assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 );
 | 
					  assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if( pCur->eState==CURSOR_FAULT ){
 | 
					 | 
				
			||||||
    assert( pCur->skipNext!=SQLITE_OK );
 | 
					 | 
				
			||||||
    return pCur->skipNext;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  assert( cursorOwnsBtShared(pCur) );
 | 
					 | 
				
			||||||
  assert( (pCur->curFlags & BTCF_WriteFlag)!=0
 | 
					 | 
				
			||||||
              && pBt->inTransaction==TRANS_WRITE
 | 
					 | 
				
			||||||
              && (pBt->btsFlags & BTS_READ_ONLY)==0 );
 | 
					 | 
				
			||||||
  assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Assert that the caller has been consistent. If this cursor was opened
 | 
					 | 
				
			||||||
  ** expecting an index b-tree, then the caller should be inserting blob
 | 
					 | 
				
			||||||
  ** keys with no associated data. If the cursor was opened expecting an
 | 
					 | 
				
			||||||
  ** intkey table, the caller should be inserting integer keys with a
 | 
					 | 
				
			||||||
  ** blob of associated data.  */
 | 
					 | 
				
			||||||
  assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Save the positions of any other cursors open on this table.
 | 
					  /* Save the positions of any other cursors open on this table.
 | 
				
			||||||
  **
 | 
					  **
 | 
				
			||||||
  ** In some cases, the call to btreeMoveto() below is a no-op. For
 | 
					  ** In some cases, the call to btreeMoveto() below is a no-op. For
 | 
				
			||||||
@@ -75020,6 +75031,24 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( pCur->eState>=CURSOR_REQUIRESEEK ){
 | 
				
			||||||
 | 
					    rc = moveToRoot(pCur);
 | 
				
			||||||
 | 
					    if( rc && rc!=SQLITE_EMPTY ) return rc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  assert( cursorOwnsBtShared(pCur) );
 | 
				
			||||||
 | 
					  assert( (pCur->curFlags & BTCF_WriteFlag)!=0
 | 
				
			||||||
 | 
					              && pBt->inTransaction==TRANS_WRITE
 | 
				
			||||||
 | 
					              && (pBt->btsFlags & BTS_READ_ONLY)==0 );
 | 
				
			||||||
 | 
					  assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Assert that the caller has been consistent. If this cursor was opened
 | 
				
			||||||
 | 
					  ** expecting an index b-tree, then the caller should be inserting blob
 | 
				
			||||||
 | 
					  ** keys with no associated data. If the cursor was opened expecting an
 | 
				
			||||||
 | 
					  ** intkey table, the caller should be inserting integer keys with a
 | 
				
			||||||
 | 
					  ** blob of associated data.  */
 | 
				
			||||||
 | 
					  assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if( pCur->pKeyInfo==0 ){
 | 
					  if( pCur->pKeyInfo==0 ){
 | 
				
			||||||
    assert( pX->pKey==0 );
 | 
					    assert( pX->pKey==0 );
 | 
				
			||||||
    /* If this is an insert into a table b-tree, invalidate any incrblob
 | 
					    /* If this is an insert into a table b-tree, invalidate any incrblob
 | 
				
			||||||
@@ -75108,14 +75137,13 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  assert( pCur->eState==CURSOR_VALID
 | 
					  assert( pCur->eState==CURSOR_VALID
 | 
				
			||||||
       || (pCur->eState==CURSOR_INVALID && loc)
 | 
					       || (pCur->eState==CURSOR_INVALID && loc) );
 | 
				
			||||||
       || CORRUPT_DB );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pPage = pCur->pPage;
 | 
					  pPage = pCur->pPage;
 | 
				
			||||||
  assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) );
 | 
					  assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) );
 | 
				
			||||||
  assert( pPage->leaf || !pPage->intKey );
 | 
					  assert( pPage->leaf || !pPage->intKey );
 | 
				
			||||||
  if( pPage->nFree<0 ){
 | 
					  if( pPage->nFree<0 ){
 | 
				
			||||||
    if( NEVER(pCur->eState>CURSOR_INVALID) ){
 | 
					    if( pCur->eState>CURSOR_INVALID ){
 | 
				
			||||||
      rc = SQLITE_CORRUPT_BKPT;
 | 
					      rc = SQLITE_CORRUPT_BKPT;
 | 
				
			||||||
    }else{
 | 
					    }else{
 | 
				
			||||||
      rc = btreeComputeFreeSpace(pPage);
 | 
					      rc = btreeComputeFreeSpace(pPage);
 | 
				
			||||||
@@ -75396,12 +75424,16 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
 | 
				
			|||||||
  assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
 | 
					  assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
 | 
				
			||||||
  assert( !hasReadConflicts(p, pCur->pgnoRoot) );
 | 
					  assert( !hasReadConflicts(p, pCur->pgnoRoot) );
 | 
				
			||||||
  assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
 | 
					  assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
 | 
				
			||||||
  if( pCur->eState==CURSOR_REQUIRESEEK ){
 | 
					  if( pCur->eState!=CURSOR_VALID ){
 | 
				
			||||||
 | 
					    if( pCur->eState>=CURSOR_REQUIRESEEK ){
 | 
				
			||||||
      rc = btreeRestoreCursorPosition(pCur);
 | 
					      rc = btreeRestoreCursorPosition(pCur);
 | 
				
			||||||
      assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
 | 
					      assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
 | 
				
			||||||
      if( rc || pCur->eState!=CURSOR_VALID ) return rc;
 | 
					      if( rc || pCur->eState!=CURSOR_VALID ) return rc;
 | 
				
			||||||
 | 
					    }else{
 | 
				
			||||||
 | 
					      return SQLITE_CORRUPT_BKPT;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  assert( CORRUPT_DB || pCur->eState==CURSOR_VALID );
 | 
					  }
 | 
				
			||||||
 | 
					  assert( pCur->eState==CURSOR_VALID );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  iCellDepth = pCur->iPage;
 | 
					  iCellDepth = pCur->iPage;
 | 
				
			||||||
  iCellIdx = pCur->ix;
 | 
					  iCellIdx = pCur->ix;
 | 
				
			||||||
@@ -78024,7 +78056,11 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
 | 
				
			|||||||
  assert( !sqlite3VdbeMemIsRowSet(pMem) );
 | 
					  assert( !sqlite3VdbeMemIsRowSet(pMem) );
 | 
				
			||||||
  assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
 | 
					  assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
 | 
				
			||||||
           || desiredEnc==SQLITE_UTF16BE );
 | 
					           || desiredEnc==SQLITE_UTF16BE );
 | 
				
			||||||
  if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
 | 
					  if( !(pMem->flags&MEM_Str) ){
 | 
				
			||||||
 | 
					    pMem->enc = desiredEnc;
 | 
				
			||||||
 | 
					    return SQLITE_OK;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if( pMem->enc==desiredEnc ){
 | 
				
			||||||
    return SQLITE_OK;
 | 
					    return SQLITE_OK;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
 | 
					  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
 | 
				
			||||||
@@ -78736,6 +78772,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(
 | 
				
			|||||||
  void (*xDestructor)(void*)
 | 
					  void (*xDestructor)(void*)
 | 
				
			||||||
){
 | 
					){
 | 
				
			||||||
  assert( pMem->flags==MEM_Null );
 | 
					  assert( pMem->flags==MEM_Null );
 | 
				
			||||||
 | 
					  vdbeMemClear(pMem);
 | 
				
			||||||
  pMem->u.zPType = zPType ? zPType : "";
 | 
					  pMem->u.zPType = zPType ? zPType : "";
 | 
				
			||||||
  pMem->z = pPtr;
 | 
					  pMem->z = pPtr;
 | 
				
			||||||
  pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term;
 | 
					  pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term;
 | 
				
			||||||
@@ -88350,6 +88387,8 @@ case OP_Gosub: {            /* jump */
 | 
				
			|||||||
  /* Most jump operations do a goto to this spot in order to update
 | 
					  /* Most jump operations do a goto to this spot in order to update
 | 
				
			||||||
  ** the pOp pointer. */
 | 
					  ** the pOp pointer. */
 | 
				
			||||||
jump_to_p2:
 | 
					jump_to_p2:
 | 
				
			||||||
 | 
					  assert( pOp->p2>0 );       /* There are never any jumps to instruction 0 */
 | 
				
			||||||
 | 
					  assert( pOp->p2<p->nOp );  /* Jumps must be in range */
 | 
				
			||||||
  pOp = &aOp[pOp->p2 - 1];
 | 
					  pOp = &aOp[pOp->p2 - 1];
 | 
				
			||||||
  break;
 | 
					  break;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -89990,11 +90029,19 @@ case OP_Offset: {          /* out3 */
 | 
				
			|||||||
  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
 | 
					  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
 | 
				
			||||||
  pC = p->apCsr[pOp->p1];
 | 
					  pC = p->apCsr[pOp->p1];
 | 
				
			||||||
  pOut = &p->aMem[pOp->p3];
 | 
					  pOut = &p->aMem[pOp->p3];
 | 
				
			||||||
  if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){
 | 
					  if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){
 | 
				
			||||||
 | 
					    sqlite3VdbeMemSetNull(pOut);
 | 
				
			||||||
 | 
					  }else{
 | 
				
			||||||
 | 
					    if( pC->deferredMoveto ){
 | 
				
			||||||
 | 
					      rc = sqlite3VdbeFinishMoveto(pC);
 | 
				
			||||||
 | 
					      if( rc ) goto abort_due_to_error;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if( sqlite3BtreeEof(pC->uc.pCursor) ){
 | 
				
			||||||
      sqlite3VdbeMemSetNull(pOut);
 | 
					      sqlite3VdbeMemSetNull(pOut);
 | 
				
			||||||
    }else{
 | 
					    }else{
 | 
				
			||||||
      sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
 | 
					      sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  break;
 | 
					  break;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
 | 
					#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
 | 
				
			||||||
@@ -93072,6 +93119,10 @@ case OP_Rowid: {                 /* out2 */
 | 
				
			|||||||
** Move the cursor P1 to a null row.  Any OP_Column operations
 | 
					** Move the cursor P1 to a null row.  Any OP_Column operations
 | 
				
			||||||
** that occur while the cursor is on the null row will always
 | 
					** that occur while the cursor is on the null row will always
 | 
				
			||||||
** write a NULL.
 | 
					** write a NULL.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo)
 | 
				
			||||||
 | 
					** just reset the cache for that cursor.  This causes the row of
 | 
				
			||||||
 | 
					** content held by the pseudo-cursor to be reparsed.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
case OP_NullRow: {
 | 
					case OP_NullRow: {
 | 
				
			||||||
  VdbeCursor *pC;
 | 
					  VdbeCursor *pC;
 | 
				
			||||||
@@ -104718,6 +104769,38 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){
 | 
				
			|||||||
  return exprIsConst(p, 3, iCur);
 | 
					  return exprIsConst(p, 3, iCur);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Check pExpr to see if it is an invariant constraint on data source pSrc.
 | 
				
			||||||
 | 
					** This is an optimization.  False negatives will perhaps cause slower
 | 
				
			||||||
 | 
					** queries, but false positives will yield incorrect answers.  So when in
 | 
				
			||||||
 | 
					** double, return 0.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					** To be an invariant constraint, the following must be true:
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					**   (1)  pExpr cannot refer to any table other than pSrc->iCursor.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					**   (2)  pExpr cannot use subqueries or non-deterministic functions.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					**   (*)  ** Not applicable to this branch **
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					**   (4)  If pSrc is the right operand of a LEFT JOIN, then...
 | 
				
			||||||
 | 
					**         (4a)  pExpr must come from an ON clause..
 | 
				
			||||||
 | 
					**         (4b)  and specifically the ON clause associated with the LEFT JOIN.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
 | 
					**   (5)  If pSrc is not the right operand of a LEFT JOIN or the left
 | 
				
			||||||
 | 
					**        operand of a RIGHT JOIN, then pExpr must be from the WHERE
 | 
				
			||||||
 | 
					**        clause, not an ON clause.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){
 | 
				
			||||||
 | 
					  if( pSrc->fg.jointype & JT_LEFT ){
 | 
				
			||||||
 | 
					    if( !ExprHasProperty(pExpr, EP_FromJoin) ) return 0;    /* rule (4a) */
 | 
				
			||||||
 | 
					    if( pExpr->w.iRightJoinTable!=pSrc->iCursor ) return 0; /* rule (4b) */
 | 
				
			||||||
 | 
					  }else{
 | 
				
			||||||
 | 
					    if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0;     /* rule (5) */
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor);  /* rules (1), (2) */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy().
 | 
					** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy().
 | 
				
			||||||
@@ -109918,19 +110001,21 @@ static int renameParseSql(
 | 
				
			|||||||
){
 | 
					){
 | 
				
			||||||
  int rc;
 | 
					  int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Parse the SQL statement passed as the first argument. If no error
 | 
					 | 
				
			||||||
  ** occurs and the parse does not result in a new table, index or
 | 
					 | 
				
			||||||
  ** trigger object, the database must be corrupt. */
 | 
					 | 
				
			||||||
  sqlite3ParseObjectInit(p, db);
 | 
					  sqlite3ParseObjectInit(p, db);
 | 
				
			||||||
 | 
					  if( zSql==0 ){
 | 
				
			||||||
 | 
					    return SQLITE_NOMEM;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){
 | 
				
			||||||
 | 
					    return SQLITE_CORRUPT_BKPT;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
 | 
				
			||||||
  p->eParseMode = PARSE_MODE_RENAME;
 | 
					  p->eParseMode = PARSE_MODE_RENAME;
 | 
				
			||||||
  p->db = db;
 | 
					  p->db = db;
 | 
				
			||||||
  p->nQueryLoop = 1;
 | 
					  p->nQueryLoop = 1;
 | 
				
			||||||
  rc = zSql ? sqlite3RunParser(p, zSql) : SQLITE_NOMEM;
 | 
					  rc = sqlite3RunParser(p, zSql);
 | 
				
			||||||
  if( db->mallocFailed ) rc = SQLITE_NOMEM;
 | 
					  if( db->mallocFailed ) rc = SQLITE_NOMEM;
 | 
				
			||||||
  if( rc==SQLITE_OK
 | 
					  if( rc==SQLITE_OK
 | 
				
			||||||
   && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0
 | 
					   && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0)
 | 
				
			||||||
  ){
 | 
					  ){
 | 
				
			||||||
    rc = SQLITE_CORRUPT_BKPT;
 | 
					    rc = SQLITE_CORRUPT_BKPT;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -116679,6 +116764,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
 | 
				
			|||||||
      int addrInsLoop;    /* Top of the loop for inserting rows */
 | 
					      int addrInsLoop;    /* Top of the loop for inserting rows */
 | 
				
			||||||
      Table *pSelTab;     /* A table that describes the SELECT results */
 | 
					      Table *pSelTab;     /* A table that describes the SELECT results */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if( IN_SPECIAL_PARSE ){
 | 
				
			||||||
 | 
					        pParse->rc = SQLITE_ERROR;
 | 
				
			||||||
 | 
					        pParse->nErr++;
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      regYield = ++pParse->nMem;
 | 
					      regYield = ++pParse->nMem;
 | 
				
			||||||
      regRec = ++pParse->nMem;
 | 
					      regRec = ++pParse->nMem;
 | 
				
			||||||
      regRowid = ++pParse->nMem;
 | 
					      regRowid = ++pParse->nMem;
 | 
				
			||||||
@@ -123258,8 +123348,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
 | 
				
			|||||||
    INLINE_FUNC(likelihood,      2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
 | 
					    INLINE_FUNC(likelihood,      2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
 | 
				
			||||||
    INLINE_FUNC(likely,          1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
 | 
					    INLINE_FUNC(likely,          1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
 | 
				
			||||||
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
 | 
					#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
 | 
				
			||||||
    FUNCTION2(sqlite_offset,     1, 0, 0, noopFunc,  SQLITE_FUNC_OFFSET|
 | 
					    {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF,
 | 
				
			||||||
                                                     SQLITE_FUNC_TYPEOF),
 | 
					     0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    FUNCTION(ltrim,              1, 1, 0, trimFunc         ),
 | 
					    FUNCTION(ltrim,              1, 1, 0, trimFunc         ),
 | 
				
			||||||
    FUNCTION(ltrim,              2, 1, 0, trimFunc         ),
 | 
					    FUNCTION(ltrim,              2, 1, 0, trimFunc         ),
 | 
				
			||||||
@@ -125063,7 +125153,7 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(i=j=0; i<pTab->nCol; i++){
 | 
					    for(i=j=0; i<pTab->nCol; i++){
 | 
				
			||||||
      assert( pTab->aCol[i].affinity!=0 );
 | 
					      assert( pTab->aCol[i].affinity!=0 || sqlite3VdbeParser(v)->nErr>0 );
 | 
				
			||||||
      if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
 | 
					      if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
 | 
				
			||||||
        zColAff[j++] = pTab->aCol[i].affinity;
 | 
					        zColAff[j++] = pTab->aCol[i].affinity;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -125677,7 +125767,11 @@ SQLITE_PRIVATE void sqlite3Insert(
 | 
				
			|||||||
  **
 | 
					  **
 | 
				
			||||||
  ** This is the 2nd template.
 | 
					  ** This is the 2nd template.
 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
  if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
 | 
					  if( pColumn==0
 | 
				
			||||||
 | 
					   && pSelect!=0
 | 
				
			||||||
 | 
					   && pTrigger==0
 | 
				
			||||||
 | 
					   && xferOptimization(pParse, pTab, pSelect, onError, iDb)
 | 
				
			||||||
 | 
					  ){
 | 
				
			||||||
    assert( !pTrigger );
 | 
					    assert( !pTrigger );
 | 
				
			||||||
    assert( pList==0 );
 | 
					    assert( pList==0 );
 | 
				
			||||||
    goto insert_end;
 | 
					    goto insert_end;
 | 
				
			||||||
@@ -127648,18 +127742,13 @@ static int xferOptimization(
 | 
				
			|||||||
  int destHasUniqueIdx = 0;        /* True if pDest has a UNIQUE index */
 | 
					  int destHasUniqueIdx = 0;        /* True if pDest has a UNIQUE index */
 | 
				
			||||||
  int regData, regRowid;           /* Registers holding data and rowid */
 | 
					  int regData, regRowid;           /* Registers holding data and rowid */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if( pSelect==0 ){
 | 
					  assert( pSelect!=0 );
 | 
				
			||||||
    return 0;   /* Must be of the form  INSERT INTO ... SELECT ... */
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  if( pParse->pWith || pSelect->pWith ){
 | 
					  if( pParse->pWith || pSelect->pWith ){
 | 
				
			||||||
    /* Do not attempt to process this query if there are an WITH clauses
 | 
					    /* Do not attempt to process this query if there are an WITH clauses
 | 
				
			||||||
    ** attached to it. Proceeding may generate a false "no such table: xxx"
 | 
					    ** attached to it. Proceeding may generate a false "no such table: xxx"
 | 
				
			||||||
    ** error if pSelect reads from a CTE named "xxx".  */
 | 
					    ** error if pSelect reads from a CTE named "xxx".  */
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if( sqlite3TriggerList(pParse, pDest) ){
 | 
					 | 
				
			||||||
    return 0;   /* tab1 must not have triggers */
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
 | 
					#ifndef SQLITE_OMIT_VIRTUALTABLE
 | 
				
			||||||
  if( IsVirtual(pDest) ){
 | 
					  if( IsVirtual(pDest) ){
 | 
				
			||||||
    return 0;   /* tab1 must not be a virtual table */
 | 
					    return 0;   /* tab1 must not be a virtual table */
 | 
				
			||||||
@@ -133505,7 +133594,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl
 | 
				
			|||||||
    sqlite3ResetAllSchemasOfConnection(db);
 | 
					    sqlite3ResetAllSchemasOfConnection(db);
 | 
				
			||||||
    pDb = &db->aDb[iDb];
 | 
					    pDb = &db->aDb[iDb];
 | 
				
			||||||
  }else
 | 
					  }else
 | 
				
			||||||
  if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){
 | 
					  if( rc==SQLITE_OK || ((db->flags&SQLITE_NoSchemaError) && rc!=SQLITE_NOMEM)){
 | 
				
			||||||
    /* Hack: If the SQLITE_NoSchemaError flag is set, then consider
 | 
					    /* Hack: If the SQLITE_NoSchemaError flag is set, then consider
 | 
				
			||||||
    ** the schema loaded, even if errors (other than OOM) occurred. In
 | 
					    ** the schema loaded, even if errors (other than OOM) occurred. In
 | 
				
			||||||
    ** this situation the current sqlite3_prepare() operation will fail,
 | 
					    ** this situation the current sqlite3_prepare() operation will fail,
 | 
				
			||||||
@@ -133779,6 +133868,14 @@ SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){
 | 
				
			|||||||
  if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory");
 | 
					  if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Maximum number of times that we will try again to prepare a statement
 | 
				
			||||||
 | 
					** that returns SQLITE_ERROR_RETRY.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					#ifndef SQLITE_MAX_PREPARE_RETRY
 | 
				
			||||||
 | 
					# define SQLITE_MAX_PREPARE_RETRY 25
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
 | 
					** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
@@ -133953,7 +134050,7 @@ static int sqlite3LockAndPrepare(
 | 
				
			|||||||
    rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
 | 
					    rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
 | 
				
			||||||
    assert( rc==SQLITE_OK || *ppStmt==0 );
 | 
					    assert( rc==SQLITE_OK || *ppStmt==0 );
 | 
				
			||||||
    if( rc==SQLITE_OK || db->mallocFailed ) break;
 | 
					    if( rc==SQLITE_OK || db->mallocFailed ) break;
 | 
				
			||||||
  }while( rc==SQLITE_ERROR_RETRY
 | 
					  }while( (rc==SQLITE_ERROR_RETRY && (cnt++)<SQLITE_MAX_PREPARE_RETRY)
 | 
				
			||||||
       || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
 | 
					       || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
 | 
				
			||||||
  sqlite3BtreeLeaveAll(db);
 | 
					  sqlite3BtreeLeaveAll(db);
 | 
				
			||||||
  rc = sqlite3ApiExit(db, rc);
 | 
					  rc = sqlite3ApiExit(db, rc);
 | 
				
			||||||
@@ -138995,8 +139092,7 @@ static int pushDownWhereTerms(
 | 
				
			|||||||
  Parse *pParse,        /* Parse context (for malloc() and error reporting) */
 | 
					  Parse *pParse,        /* Parse context (for malloc() and error reporting) */
 | 
				
			||||||
  Select *pSubq,        /* The subquery whose WHERE clause is to be augmented */
 | 
					  Select *pSubq,        /* The subquery whose WHERE clause is to be augmented */
 | 
				
			||||||
  Expr *pWhere,         /* The WHERE clause of the outer query */
 | 
					  Expr *pWhere,         /* The WHERE clause of the outer query */
 | 
				
			||||||
  int iCursor,          /* Cursor number of the subquery */
 | 
					  SrcItem *pSrc         /* The subquery term of the outer FROM clause */
 | 
				
			||||||
  int isLeftJoin        /* True if pSubq is the right term of a LEFT JOIN */
 | 
					 | 
				
			||||||
){
 | 
					){
 | 
				
			||||||
  Expr *pNew;
 | 
					  Expr *pNew;
 | 
				
			||||||
  int nChng = 0;
 | 
					  int nChng = 0;
 | 
				
			||||||
@@ -139031,10 +139127,11 @@ static int pushDownWhereTerms(
 | 
				
			|||||||
    return 0; /* restriction (3) */
 | 
					    return 0; /* restriction (3) */
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  while( pWhere->op==TK_AND ){
 | 
					  while( pWhere->op==TK_AND ){
 | 
				
			||||||
    nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight,
 | 
					    nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrc);
 | 
				
			||||||
                                iCursor, isLeftJoin);
 | 
					 | 
				
			||||||
    pWhere = pWhere->pLeft;
 | 
					    pWhere = pWhere->pLeft;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0  /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */
 | 
				
			||||||
  if( isLeftJoin
 | 
					  if( isLeftJoin
 | 
				
			||||||
   && (ExprHasProperty(pWhere,EP_FromJoin)==0
 | 
					   && (ExprHasProperty(pWhere,EP_FromJoin)==0
 | 
				
			||||||
         || pWhere->w.iRightJoinTable!=iCursor)
 | 
					         || pWhere->w.iRightJoinTable!=iCursor)
 | 
				
			||||||
@@ -139046,7 +139143,9 @@ static int pushDownWhereTerms(
 | 
				
			|||||||
  ){
 | 
					  ){
 | 
				
			||||||
    return 0; /* restriction (5) */
 | 
					    return 0; /* restriction (5) */
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){
 | 
				
			||||||
    nChng++;
 | 
					    nChng++;
 | 
				
			||||||
    pSubq->selFlags |= SF_PushDown;
 | 
					    pSubq->selFlags |= SF_PushDown;
 | 
				
			||||||
    while( pSubq ){
 | 
					    while( pSubq ){
 | 
				
			||||||
@@ -139054,8 +139153,8 @@ static int pushDownWhereTerms(
 | 
				
			|||||||
      pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
 | 
					      pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
 | 
				
			||||||
      unsetJoinExpr(pNew, -1);
 | 
					      unsetJoinExpr(pNew, -1);
 | 
				
			||||||
      x.pParse = pParse;
 | 
					      x.pParse = pParse;
 | 
				
			||||||
      x.iTable = iCursor;
 | 
					      x.iTable = pSrc->iCursor;
 | 
				
			||||||
      x.iNewTable = iCursor;
 | 
					      x.iNewTable = pSrc->iCursor;
 | 
				
			||||||
      x.isLeftJoin = 0;
 | 
					      x.isLeftJoin = 0;
 | 
				
			||||||
      x.pEList = pSubq->pEList;
 | 
					      x.pEList = pSubq->pEList;
 | 
				
			||||||
      pNew = substExpr(&x, pNew);
 | 
					      pNew = substExpr(&x, pNew);
 | 
				
			||||||
@@ -140837,8 +140936,7 @@ SQLITE_PRIVATE int sqlite3Select(
 | 
				
			|||||||
    if( OptimizationEnabled(db, SQLITE_PushDown)
 | 
					    if( OptimizationEnabled(db, SQLITE_PushDown)
 | 
				
			||||||
     && (pItem->fg.isCte==0
 | 
					     && (pItem->fg.isCte==0
 | 
				
			||||||
         || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2))
 | 
					         || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2))
 | 
				
			||||||
     && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor,
 | 
					     && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem)
 | 
				
			||||||
                           (pItem->fg.jointype & JT_OUTER)!=0)
 | 
					 | 
				
			||||||
    ){
 | 
					    ){
 | 
				
			||||||
#if SELECTTRACE_ENABLED
 | 
					#if SELECTTRACE_ENABLED
 | 
				
			||||||
      if( sqlite3SelectTrace & 0x100 ){
 | 
					      if( sqlite3SelectTrace & 0x100 ){
 | 
				
			||||||
@@ -142372,6 +142470,7 @@ static TriggerStep *triggerStepAllocate(
 | 
				
			|||||||
  sqlite3 *db = pParse->db;
 | 
					  sqlite3 *db = pParse->db;
 | 
				
			||||||
  TriggerStep *pTriggerStep;
 | 
					  TriggerStep *pTriggerStep;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if( pParse->nErr ) return 0;
 | 
				
			||||||
  pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
 | 
					  pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
 | 
				
			||||||
  if( pTriggerStep ){
 | 
					  if( pTriggerStep ){
 | 
				
			||||||
    char *z = (char*)&pTriggerStep[1];
 | 
					    char *z = (char*)&pTriggerStep[1];
 | 
				
			||||||
@@ -146250,6 +146349,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  sqlite3ParseObjectInit(&sParse, db);
 | 
					  sqlite3ParseObjectInit(&sParse, db);
 | 
				
			||||||
  sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;
 | 
					  sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;
 | 
				
			||||||
 | 
					  sParse.disableTriggers = 1;
 | 
				
			||||||
  /* We should never be able to reach this point while loading the
 | 
					  /* We should never be able to reach this point while loading the
 | 
				
			||||||
  ** schema.  Nevertheless, defend against that (turn off db->init.busy)
 | 
					  ** schema.  Nevertheless, defend against that (turn off db->init.busy)
 | 
				
			||||||
  ** in case a bug arises. */
 | 
					  ** in case a bug arises. */
 | 
				
			||||||
@@ -148185,6 +148285,7 @@ static int codeAllEqualityTerms(
 | 
				
			|||||||
    VdbeCoverageIf(v, bRev!=0);
 | 
					    VdbeCoverageIf(v, bRev!=0);
 | 
				
			||||||
    VdbeComment((v, "begin skip-scan on %s", pIdx->zName));
 | 
					    VdbeComment((v, "begin skip-scan on %s", pIdx->zName));
 | 
				
			||||||
    j = sqlite3VdbeAddOp0(v, OP_Goto);
 | 
					    j = sqlite3VdbeAddOp0(v, OP_Goto);
 | 
				
			||||||
 | 
					    assert( pLevel->addrSkip==0 );
 | 
				
			||||||
    pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT),
 | 
					    pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT),
 | 
				
			||||||
                            iIdxCur, 0, regBase, nSkip);
 | 
					                            iIdxCur, 0, regBase, nSkip);
 | 
				
			||||||
    VdbeCoverageIf(v, bRev==0);
 | 
					    VdbeCoverageIf(v, bRev==0);
 | 
				
			||||||
@@ -148627,6 +148728,7 @@ static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){
 | 
				
			|||||||
static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
 | 
					static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
 | 
				
			||||||
  IdxExprTrans *pX = p->u.pIdxTrans;
 | 
					  IdxExprTrans *pX = p->u.pIdxTrans;
 | 
				
			||||||
  if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){
 | 
					  if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){
 | 
				
			||||||
 | 
					    pExpr = sqlite3ExprSkipCollate(pExpr);
 | 
				
			||||||
    preserveExpr(pX, pExpr);
 | 
					    preserveExpr(pX, pExpr);
 | 
				
			||||||
    pExpr->affExpr = sqlite3ExprAffinity(pExpr);
 | 
					    pExpr->affExpr = sqlite3ExprAffinity(pExpr);
 | 
				
			||||||
    pExpr->op = TK_COLUMN;
 | 
					    pExpr->op = TK_COLUMN;
 | 
				
			||||||
@@ -148782,9 +148884,12 @@ static SQLITE_NOINLINE void filterPullDown(
 | 
				
			|||||||
    WhereLevel *pLevel = &pWInfo->a[iLevel];
 | 
					    WhereLevel *pLevel = &pWInfo->a[iLevel];
 | 
				
			||||||
    WhereLoop *pLoop = pLevel->pWLoop;
 | 
					    WhereLoop *pLoop = pLevel->pWLoop;
 | 
				
			||||||
    if( pLevel->regFilter==0 ) continue;
 | 
					    if( pLevel->regFilter==0 ) continue;
 | 
				
			||||||
 | 
					    if( pLevel->pWLoop->nSkip ) continue;
 | 
				
			||||||
    /*         ,--- Because sqlite3ConstructBloomFilter() has will not have set
 | 
					    /*         ,--- Because sqlite3ConstructBloomFilter() has will not have set
 | 
				
			||||||
    **  vvvvv--'    pLevel->regFilter if this were true. */
 | 
					    **  vvvvv--'    pLevel->regFilter if this were true. */
 | 
				
			||||||
    if( NEVER(pLoop->prereq & notReady) ) continue;
 | 
					    if( NEVER(pLoop->prereq & notReady) ) continue;
 | 
				
			||||||
 | 
					    assert( pLevel->addrBrk==0 );
 | 
				
			||||||
 | 
					    pLevel->addrBrk = addrNxt;
 | 
				
			||||||
    if( pLoop->wsFlags & WHERE_IPK ){
 | 
					    if( pLoop->wsFlags & WHERE_IPK ){
 | 
				
			||||||
      WhereTerm *pTerm = pLoop->aLTerm[0];
 | 
					      WhereTerm *pTerm = pLoop->aLTerm[0];
 | 
				
			||||||
      int regRowid;
 | 
					      int regRowid;
 | 
				
			||||||
@@ -148811,6 +148916,7 @@ static SQLITE_NOINLINE void filterPullDown(
 | 
				
			|||||||
      VdbeCoverage(pParse->pVdbe);
 | 
					      VdbeCoverage(pParse->pVdbe);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pLevel->regFilter = 0;
 | 
					    pLevel->regFilter = 0;
 | 
				
			||||||
 | 
					    pLevel->addrBrk = 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148916,7 +149022,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
 | 
				
			|||||||
    int iReg;   /* P3 Value for OP_VFilter */
 | 
					    int iReg;   /* P3 Value for OP_VFilter */
 | 
				
			||||||
    int addrNotFound;
 | 
					    int addrNotFound;
 | 
				
			||||||
    int nConstraint = pLoop->nLTerm;
 | 
					    int nConstraint = pLoop->nLTerm;
 | 
				
			||||||
    int iIn;    /* Counter for IN constraints */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    iReg = sqlite3GetTempRange(pParse, nConstraint+2);
 | 
					    iReg = sqlite3GetTempRange(pParse, nConstraint+2);
 | 
				
			||||||
    addrNotFound = pLevel->addrBrk;
 | 
					    addrNotFound = pLevel->addrBrk;
 | 
				
			||||||
@@ -148962,50 +149067,54 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
 | 
				
			|||||||
    pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
 | 
					    pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
 | 
				
			||||||
    pLevel->p2 = sqlite3VdbeCurrentAddr(v);
 | 
					    pLevel->p2 = sqlite3VdbeCurrentAddr(v);
 | 
				
			||||||
    assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
 | 
					    assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
 | 
				
			||||||
    if( pLoop->wsFlags & WHERE_IN_ABLE ){
 | 
					
 | 
				
			||||||
      iIn = pLevel->u.in.nIn;
 | 
					    for(j=0; j<nConstraint; j++){
 | 
				
			||||||
    }else{
 | 
					 | 
				
			||||||
      iIn = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    for(j=nConstraint-1; j>=0; j--){
 | 
					 | 
				
			||||||
      int bIn;     /* True to generate byte code to loop over RHS IN values */
 | 
					 | 
				
			||||||
      pTerm = pLoop->aLTerm[j];
 | 
					      pTerm = pLoop->aLTerm[j];
 | 
				
			||||||
      if( (pTerm->eOperator & WO_IN)!=0
 | 
					 | 
				
			||||||
       && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
 | 
					 | 
				
			||||||
      ){
 | 
					 | 
				
			||||||
        bIn = 1;
 | 
					 | 
				
			||||||
      }else{
 | 
					 | 
				
			||||||
        bIn = 0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      if( bIn ) iIn--;
 | 
					 | 
				
			||||||
      if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
 | 
					      if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
 | 
				
			||||||
        disableTerm(pLevel, pTerm);
 | 
					        disableTerm(pLevel, pTerm);
 | 
				
			||||||
      }else if( bIn && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 ){
 | 
					        continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if( (pTerm->eOperator & WO_IN)!=0
 | 
				
			||||||
 | 
					       && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
 | 
				
			||||||
 | 
					       && !db->mallocFailed
 | 
				
			||||||
 | 
					      ){
 | 
				
			||||||
        Expr *pCompare;  /* The comparison operator */
 | 
					        Expr *pCompare;  /* The comparison operator */
 | 
				
			||||||
        Expr *pRight;    /* RHS of the comparison */
 | 
					        Expr *pRight;    /* RHS of the comparison */
 | 
				
			||||||
        VdbeOp *pOp;     /* Opcode to access the value of the IN constraint */
 | 
					        VdbeOp *pOp;     /* Opcode to access the value of the IN constraint */
 | 
				
			||||||
 | 
					        int iIn;         /* IN loop corresponding to the j-th constraint */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Reload the constraint value into reg[iReg+j+2].  The same value
 | 
					        /* Reload the constraint value into reg[iReg+j+2].  The same value
 | 
				
			||||||
        ** was loaded into the same register prior to the OP_VFilter, but
 | 
					        ** was loaded into the same register prior to the OP_VFilter, but
 | 
				
			||||||
        ** the xFilter implementation might have changed the datatype or
 | 
					        ** the xFilter implementation might have changed the datatype or
 | 
				
			||||||
        ** encoding of the value in the register, so it *must* be reloaded. */
 | 
					        ** encoding of the value in the register, so it *must* be reloaded.
 | 
				
			||||||
        assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed );
 | 
					        */
 | 
				
			||||||
        if( !db->mallocFailed ){
 | 
					        for(iIn=0; ALWAYS(iIn<pLevel->u.in.nIn); iIn++){
 | 
				
			||||||
          assert( iIn>=0 && iIn<pLevel->u.in.nIn );
 | 
					 | 
				
			||||||
          pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop);
 | 
					          pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop);
 | 
				
			||||||
          assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid );
 | 
					          if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2)
 | 
				
			||||||
          assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 );
 | 
					           || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2)
 | 
				
			||||||
          assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 );
 | 
					          ){
 | 
				
			||||||
            testcase( pOp->opcode==OP_Rowid );
 | 
					            testcase( pOp->opcode==OP_Rowid );
 | 
				
			||||||
            sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
 | 
					            sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Generate code that will continue to the next row if
 | 
					        /* Generate code that will continue to the next row if
 | 
				
			||||||
        ** the IN constraint is not satisfied */
 | 
					        ** the IN constraint is not satisfied
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
        pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0);
 | 
					        pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0);
 | 
				
			||||||
        assert( pCompare!=0 || db->mallocFailed );
 | 
					        if( !db->mallocFailed ){
 | 
				
			||||||
        if( pCompare ){
 | 
					          int iFld = pTerm->u.x.iField;
 | 
				
			||||||
          pCompare->pLeft = pTerm->pExpr->pLeft;
 | 
					          Expr *pLeft = pTerm->pExpr->pLeft;
 | 
				
			||||||
 | 
					          assert( pLeft!=0 );
 | 
				
			||||||
 | 
					          if( iFld>0 ){
 | 
				
			||||||
 | 
					            assert( pLeft->op==TK_VECTOR );
 | 
				
			||||||
 | 
					            assert( ExprUseXList(pLeft) );
 | 
				
			||||||
 | 
					            assert( iFld<=pLeft->x.pList->nExpr );
 | 
				
			||||||
 | 
					            pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr;
 | 
				
			||||||
 | 
					          }else{
 | 
				
			||||||
 | 
					            pCompare->pLeft = pLeft;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
          pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0);
 | 
					          pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0);
 | 
				
			||||||
          if( pRight ){
 | 
					          if( pRight ){
 | 
				
			||||||
            pRight->iTable = iReg+j+2;
 | 
					            pRight->iTable = iReg+j+2;
 | 
				
			||||||
@@ -149014,11 +149123,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
 | 
				
			|||||||
            );
 | 
					            );
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          pCompare->pLeft = 0;
 | 
					          pCompare->pLeft = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        sqlite3ExprDelete(db, pCompare);
 | 
					        sqlite3ExprDelete(db, pCompare);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
    assert( iIn==0 || db->mallocFailed );
 | 
					 | 
				
			||||||
    /* These registers need to be preserved in case there is an IN operator
 | 
					    /* These registers need to be preserved in case there is an IN operator
 | 
				
			||||||
    ** loop.  So we could deallocate the registers here (and potentially
 | 
					    ** loop.  So we could deallocate the registers here (and potentially
 | 
				
			||||||
    ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0.  But it seems
 | 
					    ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0.  But it seems
 | 
				
			||||||
@@ -149728,6 +149837,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
 | 
				
			|||||||
    ** the initialization of the right-hand operand of the vector comparison
 | 
					    ** the initialization of the right-hand operand of the vector comparison
 | 
				
			||||||
    ** might not occur, or might occur only in an OR branch that is not
 | 
					    ** might not occur, or might occur only in an OR branch that is not
 | 
				
			||||||
    ** taken.  dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1.
 | 
					    ** taken.  dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1.
 | 
				
			||||||
 | 
					    **
 | 
				
			||||||
 | 
					    ** 2022-03-03:  Do not push down expressions that involve subqueries.
 | 
				
			||||||
 | 
					    ** The subquery might get coded as a subroutine.  Any table-references
 | 
				
			||||||
 | 
					    ** in the subquery might be resolved to index-references for the index on
 | 
				
			||||||
 | 
					    ** the OR branch in which the subroutine is coded.  But if the subroutine
 | 
				
			||||||
 | 
					    ** is invoked from a different OR branch that uses a different index, such
 | 
				
			||||||
 | 
					    ** index-references will not work.  tag-20220303a
 | 
				
			||||||
 | 
					    ** https://sqlite.org/forum/forumpost/36937b197273d403
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    if( pWC->nTerm>1 ){
 | 
					    if( pWC->nTerm>1 ){
 | 
				
			||||||
      int iTerm;
 | 
					      int iTerm;
 | 
				
			||||||
@@ -149741,7 +149858,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
 | 
				
			|||||||
          continue;
 | 
					          continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
 | 
					        if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
 | 
				
			||||||
        testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO );
 | 
					        if( ExprHasProperty(pExpr, EP_Subquery) ) continue;  /* tag-20220303a */
 | 
				
			||||||
        pExpr = sqlite3ExprDup(db, pExpr, 0);
 | 
					        pExpr = sqlite3ExprDup(db, pExpr, 0);
 | 
				
			||||||
        pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
 | 
					        pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -152748,8 +152865,7 @@ static SQLITE_NOINLINE void constructAutomaticIndex(
 | 
				
			|||||||
    ** WHERE clause (or the ON clause of a LEFT join) that constrain which
 | 
					    ** WHERE clause (or the ON clause of a LEFT join) that constrain which
 | 
				
			||||||
    ** rows of the target table (pSrc) that can be used. */
 | 
					    ** rows of the target table (pSrc) that can be used. */
 | 
				
			||||||
    if( (pTerm->wtFlags & TERM_VIRTUAL)==0
 | 
					    if( (pTerm->wtFlags & TERM_VIRTUAL)==0
 | 
				
			||||||
     && ((pSrc->fg.jointype&JT_LEFT)==0 || ExprHasProperty(pExpr,EP_FromJoin))
 | 
					     && sqlite3ExprIsTableConstraint(pExpr, pSrc)
 | 
				
			||||||
     && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor)
 | 
					 | 
				
			||||||
    ){
 | 
					    ){
 | 
				
			||||||
      pPartial = sqlite3ExprAnd(pParse, pPartial,
 | 
					      pPartial = sqlite3ExprAnd(pParse, pPartial,
 | 
				
			||||||
                                sqlite3ExprDup(pParse->db, pExpr, 0));
 | 
					                                sqlite3ExprDup(pParse->db, pExpr, 0));
 | 
				
			||||||
@@ -152988,7 +153104,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
 | 
				
			|||||||
    for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){
 | 
					    for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){
 | 
				
			||||||
      Expr *pExpr = pTerm->pExpr;
 | 
					      Expr *pExpr = pTerm->pExpr;
 | 
				
			||||||
      if( (pTerm->wtFlags & TERM_VIRTUAL)==0
 | 
					      if( (pTerm->wtFlags & TERM_VIRTUAL)==0
 | 
				
			||||||
       && sqlite3ExprIsTableConstant(pExpr, iCur)
 | 
					       && sqlite3ExprIsTableConstraint(pExpr, pItem)
 | 
				
			||||||
      ){
 | 
					      ){
 | 
				
			||||||
        sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
 | 
					        sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -153018,7 +153134,10 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
 | 
				
			|||||||
    pLoop->wsFlags &= ~WHERE_BLOOMFILTER;
 | 
					    pLoop->wsFlags &= ~WHERE_BLOOMFILTER;
 | 
				
			||||||
    if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break;
 | 
					    if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break;
 | 
				
			||||||
    while( ++iLevel < pWInfo->nLevel ){
 | 
					    while( ++iLevel < pWInfo->nLevel ){
 | 
				
			||||||
 | 
					      const SrcItem *pTabItem;
 | 
				
			||||||
      pLevel = &pWInfo->a[iLevel];
 | 
					      pLevel = &pWInfo->a[iLevel];
 | 
				
			||||||
 | 
					      pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
 | 
				
			||||||
 | 
					      if( pTabItem->fg.jointype & JT_LEFT ) continue;
 | 
				
			||||||
      pLoop = pLevel->pWLoop;
 | 
					      pLoop = pLevel->pWLoop;
 | 
				
			||||||
      if( NEVER(pLoop==0) ) continue;
 | 
					      if( NEVER(pLoop==0) ) continue;
 | 
				
			||||||
      if( pLoop->prereq & notReady ) continue;
 | 
					      if( pLoop->prereq & notReady ) continue;
 | 
				
			||||||
@@ -154531,9 +154650,18 @@ static void whereLoopOutputAdjust(
 | 
				
			|||||||
        /* If there are extra terms in the WHERE clause not used by an index
 | 
					        /* If there are extra terms in the WHERE clause not used by an index
 | 
				
			||||||
        ** that depend only on the table being scanned, and that will tend to
 | 
					        ** that depend only on the table being scanned, and that will tend to
 | 
				
			||||||
        ** cause many rows to be omitted, then mark that table as
 | 
					        ** cause many rows to be omitted, then mark that table as
 | 
				
			||||||
        ** "self-culling". */
 | 
					        ** "self-culling".
 | 
				
			||||||
 | 
					        **
 | 
				
			||||||
 | 
					        ** 2022-03-24:  Self-culling only applies if either the extra terms
 | 
				
			||||||
 | 
					        ** are straight comparison operators that are non-true with NULL
 | 
				
			||||||
 | 
					        ** operand, or if the loop is not a LEFT JOIN.
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        if( (pTerm->eOperator & 0x3f)!=0
 | 
				
			||||||
 | 
					         || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0
 | 
				
			||||||
 | 
					        ){
 | 
				
			||||||
          pLoop->wsFlags |= WHERE_SELFCULL;
 | 
					          pLoop->wsFlags |= WHERE_SELFCULL;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      if( pTerm->truthProb<=0 ){
 | 
					      if( pTerm->truthProb<=0 ){
 | 
				
			||||||
        /* If a truth probability is specified using the likelihood() hints,
 | 
					        /* If a truth probability is specified using the likelihood() hints,
 | 
				
			||||||
        ** then use the probability provided by the application. */
 | 
					        ** then use the probability provided by the application. */
 | 
				
			||||||
@@ -155701,7 +155829,6 @@ SQLITE_API int sqlite3_vtab_rhs_value(
 | 
				
			|||||||
  return rc;
 | 
					  return rc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** Return true if ORDER BY clause may be handled as DISTINCT.
 | 
					** Return true if ORDER BY clause may be handled as DISTINCT.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
@@ -155713,6 +155840,22 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
 | 
				
			|||||||
  return pHidden->eDistinct;
 | 
					  return pHidden->eDistinct;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
 | 
				
			||||||
 | 
					    && !defined(SQLITE_OMIT_VIRTUALTABLE)
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Cause the prepared statement that is associated with a call to
 | 
				
			||||||
 | 
					** xBestIndex to open write transactions on all attached schemas.
 | 
				
			||||||
 | 
					** This is used by the (built-in) sqlite_dbpage virtual table.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){
 | 
				
			||||||
 | 
					  HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
 | 
				
			||||||
 | 
					  Parse *pParse = pHidden->pParse;
 | 
				
			||||||
 | 
					  int nDb = pParse->db->nDb;
 | 
				
			||||||
 | 
					  int i;
 | 
				
			||||||
 | 
					  for(i=0; i<nDb; i++) sqlite3BeginWriteOperation(pParse, 0, i);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** Add all WhereLoop objects for a table of the join identified by
 | 
					** Add all WhereLoop objects for a table of the join identified by
 | 
				
			||||||
** pBuilder->pNew->iTab.  That table is guaranteed to be a virtual table.
 | 
					** pBuilder->pNew->iTab.  That table is guaranteed to be a virtual table.
 | 
				
			||||||
@@ -157816,6 +157959,26 @@ whereBeginError:
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef SQLITE_DEBUG
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Return true if cursor iCur is opened by instruction k of the
 | 
				
			||||||
 | 
					** bytecode.  Used inside of assert() only.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static int cursorIsOpen(Vdbe *v, int iCur, int k){
 | 
				
			||||||
 | 
					  while( k>=0 ){
 | 
				
			||||||
 | 
					    VdbeOp *pOp = sqlite3VdbeGetOp(v,k--);
 | 
				
			||||||
 | 
					    if( pOp->p1!=iCur ) continue;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_Close ) return 0;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_OpenRead ) return 1;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_OpenWrite ) return 1;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_OpenDup ) return 1;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_OpenAutoindex ) return 1;
 | 
				
			||||||
 | 
					    if( pOp->opcode==OP_OpenEphemeral ) return 1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* SQLITE_DEBUG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** Generate the end of the WHERE loop.  See comments on
 | 
					** Generate the end of the WHERE loop.  See comments on
 | 
				
			||||||
** sqlite3WhereBegin() for additional information.
 | 
					** sqlite3WhereBegin() for additional information.
 | 
				
			||||||
@@ -158068,6 +158231,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
 | 
				
			|||||||
        ){
 | 
					        ){
 | 
				
			||||||
          int x = pOp->p2;
 | 
					          int x = pOp->p2;
 | 
				
			||||||
          assert( pIdx->pTable==pTab );
 | 
					          assert( pIdx->pTable==pTab );
 | 
				
			||||||
 | 
					#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
 | 
				
			||||||
 | 
					          if( pOp->opcode==OP_Offset ){
 | 
				
			||||||
 | 
					            /* Do not need to translate the column number */
 | 
				
			||||||
 | 
					          }else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
          if( !HasRowid(pTab) ){
 | 
					          if( !HasRowid(pTab) ){
 | 
				
			||||||
            Index *pPk = sqlite3PrimaryKeyIndex(pTab);
 | 
					            Index *pPk = sqlite3PrimaryKeyIndex(pTab);
 | 
				
			||||||
            x = pPk->aiColumn[x];
 | 
					            x = pPk->aiColumn[x];
 | 
				
			||||||
@@ -158081,9 +158249,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
 | 
				
			|||||||
            pOp->p2 = x;
 | 
					            pOp->p2 = x;
 | 
				
			||||||
            pOp->p1 = pLevel->iIdxCur;
 | 
					            pOp->p1 = pLevel->iIdxCur;
 | 
				
			||||||
            OpcodeRewriteTrace(db, k, pOp);
 | 
					            OpcodeRewriteTrace(db, k, pOp);
 | 
				
			||||||
 | 
					          }else{
 | 
				
			||||||
 | 
					            /* Unable to translate the table reference into an index
 | 
				
			||||||
 | 
					            ** reference.  Verify that this is harmless - that the
 | 
				
			||||||
 | 
					            ** table being referenced really is open.
 | 
				
			||||||
 | 
					            */
 | 
				
			||||||
 | 
					#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
 | 
				
			||||||
 | 
					            assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
 | 
				
			||||||
 | 
					                 || cursorIsOpen(v,pOp->p1,k)
 | 
				
			||||||
 | 
					                 || pOp->opcode==OP_Offset
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
 | 
				
			||||||
 | 
					                 || cursorIsOpen(v,pOp->p1,k)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0
 | 
					 | 
				
			||||||
              || pWInfo->eOnePass );
 | 
					 | 
				
			||||||
        }else if( pOp->opcode==OP_Rowid ){
 | 
					        }else if( pOp->opcode==OP_Rowid ){
 | 
				
			||||||
          pOp->p1 = pLevel->iIdxCur;
 | 
					          pOp->p1 = pLevel->iIdxCur;
 | 
				
			||||||
          pOp->opcode = OP_IdxRowid;
 | 
					          pOp->opcode = OP_IdxRowid;
 | 
				
			||||||
@@ -159071,7 +159252,11 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
 | 
					SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
 | 
				
			||||||
  int rc = SQLITE_OK;
 | 
					  int rc = SQLITE_OK;
 | 
				
			||||||
  if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){
 | 
					  if( p->pWin
 | 
				
			||||||
 | 
					   && p->pPrior==0
 | 
				
			||||||
 | 
					   && ALWAYS((p->selFlags & SF_WinRewrite)==0)
 | 
				
			||||||
 | 
					   && ALWAYS(!IN_RENAME_OBJECT)
 | 
				
			||||||
 | 
					  ){
 | 
				
			||||||
    Vdbe *v = sqlite3GetVdbe(pParse);
 | 
					    Vdbe *v = sqlite3GetVdbe(pParse);
 | 
				
			||||||
    sqlite3 *db = pParse->db;
 | 
					    sqlite3 *db = pParse->db;
 | 
				
			||||||
    Select *pSub = 0;             /* The subquery */
 | 
					    Select *pSub = 0;             /* The subquery */
 | 
				
			||||||
@@ -159146,6 +159331,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
 | 
				
			|||||||
    for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
 | 
					    for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
 | 
				
			||||||
      ExprList *pArgs;
 | 
					      ExprList *pArgs;
 | 
				
			||||||
      assert( ExprUseXList(pWin->pOwner) );
 | 
					      assert( ExprUseXList(pWin->pOwner) );
 | 
				
			||||||
 | 
					      assert( pWin->pFunc!=0 );
 | 
				
			||||||
      pArgs = pWin->pOwner->x.pList;
 | 
					      pArgs = pWin->pOwner->x.pList;
 | 
				
			||||||
      if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
 | 
					      if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
 | 
				
			||||||
        selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
 | 
					        selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
 | 
				
			||||||
@@ -159838,7 +160024,7 @@ static void windowAggStep(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        for(iEnd=sqlite3VdbeCurrentAddr(v); iOp<iEnd; iOp++){
 | 
					        for(iEnd=sqlite3VdbeCurrentAddr(v); iOp<iEnd; iOp++){
 | 
				
			||||||
          VdbeOp *pOp = sqlite3VdbeGetOp(v, iOp);
 | 
					          VdbeOp *pOp = sqlite3VdbeGetOp(v, iOp);
 | 
				
			||||||
          if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){
 | 
					          if( pOp->opcode==OP_Column && pOp->p1==pMWin->iEphCsr ){
 | 
				
			||||||
            pOp->p1 = csr;
 | 
					            pOp->p1 = csr;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -194156,15 +194342,16 @@ static JsonNode *jsonLookupStep(
 | 
				
			|||||||
        *pzErr = zPath;
 | 
					        *pzErr = zPath;
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      testcase( nKey==0 );
 | 
				
			||||||
    }else{
 | 
					    }else{
 | 
				
			||||||
      zKey = zPath;
 | 
					      zKey = zPath;
 | 
				
			||||||
      for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
 | 
					      for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
 | 
				
			||||||
      nKey = i;
 | 
					      nKey = i;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
      if( nKey==0 ){
 | 
					      if( nKey==0 ){
 | 
				
			||||||
        *pzErr = zPath;
 | 
					        *pzErr = zPath;
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    j = 1;
 | 
					    j = 1;
 | 
				
			||||||
    for(;;){
 | 
					    for(;;){
 | 
				
			||||||
      while( j<=pRoot->n ){
 | 
					      while( j<=pRoot->n ){
 | 
				
			||||||
@@ -195311,6 +195498,33 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){
 | 
				
			|||||||
  return SQLITE_OK;
 | 
					  return SQLITE_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Append an object label to the JSON Path being constructed
 | 
				
			||||||
 | 
					** in pStr.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static void jsonAppendObjectPathElement(
 | 
				
			||||||
 | 
					  JsonString *pStr,
 | 
				
			||||||
 | 
					  JsonNode *pNode
 | 
				
			||||||
 | 
					){
 | 
				
			||||||
 | 
					  int jj, nn;
 | 
				
			||||||
 | 
					  const char *z;
 | 
				
			||||||
 | 
					  assert( pNode->eType==JSON_STRING );
 | 
				
			||||||
 | 
					  assert( pNode->jnFlags & JNODE_LABEL );
 | 
				
			||||||
 | 
					  assert( pNode->eU==1 );
 | 
				
			||||||
 | 
					  z = pNode->u.zJContent;
 | 
				
			||||||
 | 
					  nn = pNode->n;
 | 
				
			||||||
 | 
					  assert( nn>=2 );
 | 
				
			||||||
 | 
					  assert( z[0]=='"' );
 | 
				
			||||||
 | 
					  assert( z[nn-1]=='"' );
 | 
				
			||||||
 | 
					  if( nn>2 && sqlite3Isalpha(z[1]) ){
 | 
				
			||||||
 | 
					    for(jj=2; jj<nn-1 && sqlite3Isalnum(z[jj]); jj++){}
 | 
				
			||||||
 | 
					    if( jj==nn-1 ){
 | 
				
			||||||
 | 
					      z++;
 | 
				
			||||||
 | 
					      nn -= 2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  jsonPrintf(nn+2, pStr, ".%.*s", nn, z);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Append the name of the path for element i to pStr
 | 
					/* Append the name of the path for element i to pStr
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
static void jsonEachComputePath(
 | 
					static void jsonEachComputePath(
 | 
				
			||||||
@@ -195335,10 +195549,7 @@ static void jsonEachComputePath(
 | 
				
			|||||||
  }else{
 | 
					  }else{
 | 
				
			||||||
    assert( pUp->eType==JSON_OBJECT );
 | 
					    assert( pUp->eType==JSON_OBJECT );
 | 
				
			||||||
    if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
 | 
					    if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
 | 
				
			||||||
    assert( pNode->eType==JSON_STRING );
 | 
					    jsonAppendObjectPathElement(pStr, pNode);
 | 
				
			||||||
    assert( pNode->jnFlags & JNODE_LABEL );
 | 
					 | 
				
			||||||
    assert( pNode->eU==1 );
 | 
					 | 
				
			||||||
    jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -195409,8 +195620,7 @@ static int jsonEachColumn(
 | 
				
			|||||||
        if( p->eType==JSON_ARRAY ){
 | 
					        if( p->eType==JSON_ARRAY ){
 | 
				
			||||||
          jsonPrintf(30, &x, "[%d]", p->iRowid);
 | 
					          jsonPrintf(30, &x, "[%d]", p->iRowid);
 | 
				
			||||||
        }else if( p->eType==JSON_OBJECT ){
 | 
					        }else if( p->eType==JSON_OBJECT ){
 | 
				
			||||||
          assert( pThis->eU==1 );
 | 
					          jsonAppendObjectPathElement(&x, pThis);
 | 
				
			||||||
          jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      jsonResult(&x);
 | 
					      jsonResult(&x);
 | 
				
			||||||
@@ -209957,6 +210167,7 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
 | 
				
			|||||||
  ){
 | 
					  ){
 | 
				
			||||||
    pIdxInfo->orderByConsumed = 1;
 | 
					    pIdxInfo->orderByConsumed = 1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  sqlite3VtabWriteAll(pIdxInfo);
 | 
				
			||||||
  return SQLITE_OK;
 | 
					  return SQLITE_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -232311,7 +232522,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){
 | 
				
			|||||||
  rc = sqlite3_step(pSorter->pStmt);
 | 
					  rc = sqlite3_step(pSorter->pStmt);
 | 
				
			||||||
  if( rc==SQLITE_DONE ){
 | 
					  if( rc==SQLITE_DONE ){
 | 
				
			||||||
    rc = SQLITE_OK;
 | 
					    rc = SQLITE_OK;
 | 
				
			||||||
    CsrFlagSet(pCsr, FTS5CSR_EOF);
 | 
					    CsrFlagSet(pCsr, FTS5CSR_EOF|FTS5CSR_REQUIRE_CONTENT);
 | 
				
			||||||
  }else if( rc==SQLITE_ROW ){
 | 
					  }else if( rc==SQLITE_ROW ){
 | 
				
			||||||
    const u8 *a;
 | 
					    const u8 *a;
 | 
				
			||||||
    const u8 *aBlob;
 | 
					    const u8 *aBlob;
 | 
				
			||||||
@@ -234300,7 +234511,7 @@ static void fts5SourceIdFunc(
 | 
				
			|||||||
){
 | 
					){
 | 
				
			||||||
  assert( nArg==0 );
 | 
					  assert( nArg==0 );
 | 
				
			||||||
  UNUSED_PARAM2(nArg, apUnused);
 | 
					  UNUSED_PARAM2(nArg, apUnused);
 | 
				
			||||||
  sqlite3_result_text(pCtx, "fts5: 2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab", -1, SQLITE_TRANSIENT);
 | 
					  sqlite3_result_text(pCtx, "fts5: 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe", -1, SQLITE_TRANSIENT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								deps/sqlite/sqlite3.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								deps/sqlite/sqlite3.h
									
									
									
									
										vendored
									
									
								
							@@ -146,9 +146,9 @@ extern "C" {
 | 
				
			|||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 | 
					** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 | 
				
			||||||
** [sqlite_version()] and [sqlite_source_id()].
 | 
					** [sqlite_version()] and [sqlite_source_id()].
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define SQLITE_VERSION        "3.38.0"
 | 
					#define SQLITE_VERSION        "3.38.5"
 | 
				
			||||||
#define SQLITE_VERSION_NUMBER 3038000
 | 
					#define SQLITE_VERSION_NUMBER 3038005
 | 
				
			||||||
#define SQLITE_SOURCE_ID      "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab"
 | 
					#define SQLITE_SOURCE_ID      "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
** CAPI3REF: Run-Time Library Version Numbers
 | 
					** CAPI3REF: Run-Time Library Version Numbers
 | 
				
			||||||
@@ -4979,6 +4979,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** even empty strings, are always zero-terminated.  ^The return
 | 
					** even empty strings, are always zero-terminated.  ^The return
 | 
				
			||||||
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
 | 
					** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
 | 
					** ^Strings returned by sqlite3_column_text16() always have the endianness
 | 
				
			||||||
 | 
					** which is native to the platform, regardless of the text encoding set
 | 
				
			||||||
 | 
					** for the database.
 | 
				
			||||||
 | 
					**
 | 
				
			||||||
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
 | 
					** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
 | 
				
			||||||
** [unprotected sqlite3_value] object.  In a multithreaded environment,
 | 
					** [unprotected sqlite3_value] object.  In a multithreaded environment,
 | 
				
			||||||
** an unprotected sqlite3_value object may only be used safely with
 | 
					** an unprotected sqlite3_value object may only be used safely with
 | 
				
			||||||
@@ -4992,7 +4996,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** [application-defined SQL functions] or [virtual tables], not within
 | 
					** [application-defined SQL functions] or [virtual tables], not within
 | 
				
			||||||
** top-level application code.
 | 
					** top-level application code.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
** The these routines may attempt to convert the datatype of the result.
 | 
					** These routines may attempt to convert the datatype of the result.
 | 
				
			||||||
** ^For example, if the internal representation is FLOAT and a text result
 | 
					** ^For example, if the internal representation is FLOAT and a text result
 | 
				
			||||||
** is requested, [sqlite3_snprintf()] is used internally to perform the
 | 
					** is requested, [sqlite3_snprintf()] is used internally to perform the
 | 
				
			||||||
** conversion automatically.  ^(The following table details the conversions
 | 
					** conversion automatically.  ^(The following table details the conversions
 | 
				
			||||||
@@ -5017,7 +5021,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
 | 
				
			|||||||
** <tr><td>  TEXT    <td>   BLOB    <td> No change
 | 
					** <tr><td>  TEXT    <td>   BLOB    <td> No change
 | 
				
			||||||
** <tr><td>  BLOB    <td> INTEGER   <td> [CAST] to INTEGER
 | 
					** <tr><td>  BLOB    <td> INTEGER   <td> [CAST] to INTEGER
 | 
				
			||||||
** <tr><td>  BLOB    <td>  FLOAT    <td> [CAST] to REAL
 | 
					** <tr><td>  BLOB    <td>  FLOAT    <td> [CAST] to REAL
 | 
				
			||||||
** <tr><td>  BLOB    <td>   TEXT    <td> Add a zero terminator if needed
 | 
					** <tr><td>  BLOB    <td>   TEXT    <td> [CAST] to TEXT, ensure zero terminator
 | 
				
			||||||
** </table>
 | 
					** </table>
 | 
				
			||||||
** </blockquote>)^
 | 
					** </blockquote>)^
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
@@ -9767,7 +9771,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
 | 
				
			|||||||
** ^When xBestIndex returns, the sqlite3_value object returned by
 | 
					** ^When xBestIndex returns, the sqlite3_value object returned by
 | 
				
			||||||
** sqlite3_vtab_rhs_value() is automatically deallocated.
 | 
					** sqlite3_vtab_rhs_value() is automatically deallocated.
 | 
				
			||||||
**
 | 
					**
 | 
				
			||||||
** The "_rhs_" in the name of this routine is an appreviation for
 | 
					** The "_rhs_" in the name of this routine is an abbreviation for
 | 
				
			||||||
** "Right-Hand Side".
 | 
					** "Right-Hand Side".
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
 | 
					SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user