SQLite
Hex Artifact Content
Not logged in

Artifact 8db4c97f630e7d83f884ea75caf1ffd0988c160e9d530194d93721c80821e0f6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 30 2d 31 31  /*.** 2017-10-11
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  file contains an
0190: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
01a0: 6f 66 20 74 68 65 20 22 73 71 6c 69 74 65 5f 64  of the "sqlite_d
01b0: 62 70 61 67 65 22 20 76 69 72 74 75 61 6c 20 74  bpage" virtual t
01c0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
01d0: 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20 76 69  sqlite_dbpage vi
01e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 75  rtual table is u
01f0: 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 77  sed to read or w
0200: 72 69 74 65 20 77 68 6f 6c 65 20 72 61 77 0a 2a  rite whole raw.*
0210: 2a 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64  * pages of the d
0220: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0230: 68 65 20 70 61 67 65 72 20 69 6e 74 65 72 66 61  he pager interfa
0240: 63 65 20 69 73 20 75 73 65 64 20 73 6f 20 74 68  ce is used so th
0250: 61 74 20 0a 2a 2a 20 75 6e 63 6f 6d 6d 69 74 74  at .** uncommitt
0260: 65 64 20 63 68 61 6e 67 65 73 20 61 6e 64 20 63  ed changes and c
0270: 68 61 6e 67 65 73 20 72 65 63 6f 72 64 65 64 20  hanges recorded 
0280: 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  in the WAL file 
0290: 61 72 65 20 63 6f 72 72 65 63 74 6c 79 0a 2a 2a  are correctly.**
02a0: 20 72 65 74 72 69 65 76 65 64 2e 0a 2a 2a 0a 2a   retrieved..**.*
02b0: 2a 20 55 73 61 67 65 20 65 78 61 6d 70 6c 65 3a  * Usage example:
02c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
02d0: 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
02e0: 65 5f 64 62 70 61 67 65 28 27 61 75 78 31 27 29  e_dbpage('aux1')
02f0: 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 32 33 3b   WHERE pgno=123;
0300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
0310: 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  n eponymous virt
0320: 75 61 6c 20 74 61 62 6c 65 20 73 6f 20 69 74 20  ual table so it 
0330: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
0340: 20 62 65 20 63 72 65 61 74 65 64 20 62 65 66 6f   be created befo
0350: 72 65 0a 2a 2a 20 75 73 65 2e 20 20 54 68 65 20  re.** use.  The 
0360: 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  optional argumen
0370: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  t to the sqlite_
0380: 64 62 70 61 67 65 28 29 20 74 61 62 6c 65 20 6e  dbpage() table n
0390: 61 6d 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 63  ame is the.** sc
03a0: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
03b0: 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
03c0: 69 73 20 74 6f 20 62 65 20 72 65 61 64 2e 20 20  is to be read.  
03d0: 54 68 65 20 64 65 66 61 75 6c 74 20 73 63 68 65  The default sche
03e0: 6d 61 20 69 73 0a 2a 2a 20 22 6d 61 69 6e 22 2e  ma is.** "main".
03f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
0400: 66 69 65 6c 64 20 6f 66 20 73 71 6c 69 74 65 5f  field of sqlite_
0410: 64 62 70 61 67 65 20 74 61 62 6c 65 20 63 61 6e  dbpage table can
0420: 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 54 68   be updated.  Th
0430: 65 20 6e 65 77 0a 2a 2a 20 76 61 6c 75 65 20 6d  e new.** value m
0440: 75 73 74 20 62 65 20 61 20 42 4c 4f 42 20 77 68  ust be a BLOB wh
0450: 69 63 68 20 69 73 20 74 68 65 20 63 6f 72 72 65  ich is the corre
0460: 63 74 20 70 61 67 65 20 73 69 7a 65 2c 20 6f 74  ct page size, ot
0470: 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 75  herwise the.** u
0480: 70 64 61 74 65 20 66 61 69 6c 73 2e 20 20 52 6f  pdate fails.  Ro
0490: 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 65  ws may not be de
04a0: 6c 65 74 65 64 20 6f 72 20 69 6e 73 65 72 74 65  leted or inserte
04b0: 64 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20  d..*/..#include 
04c0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 20 20 20  "sqliteInt.h"   
04d0: 2f 2a 20 52 65 71 75 69 72 65 73 20 61 63 63 65  /* Requires acce
04e0: 73 73 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 64  ss to internal d
04f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
0500: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 53  /.#if (defined(S
0510: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
0520: 41 47 45 5f 56 54 41 42 29 20 7c 7c 20 64 65 66  AGE_VTAB) || def
0530: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
0540: 29 29 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  )) \.    && !def
0550: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0560: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 0a  _VIRTUALTABLE)..
0570: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
0580: 62 70 61 67 65 54 61 62 6c 65 20 44 62 70 61 67  bpageTable Dbpag
0590: 65 54 61 62 6c 65 3b 0a 74 79 70 65 64 65 66 20  eTable;.typedef 
05a0: 73 74 72 75 63 74 20 44 62 70 61 67 65 43 75 72  struct DbpageCur
05b0: 73 6f 72 20 44 62 70 61 67 65 43 75 72 73 6f 72  sor DbpageCursor
05c0: 3b 0a 0a 73 74 72 75 63 74 20 44 62 70 61 67 65  ;..struct Dbpage
05d0: 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
05e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
05f0: 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 61  ase;       /* Ba
0600: 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20  se class.  Must 
0610: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 69 6e  be first */.  in
0620: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0640: 20 43 75 72 72 65 6e 74 20 70 61 67 65 20 6e 75   Current page nu
0650: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  mber */.  int mx
0660: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
0670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
0680: 74 20 70 61 67 65 20 74 6f 20 76 69 73 69 74 20  t page to visit 
0690: 6f 6e 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a  on this scan */.
06a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 2f 2a 20 50 61 67 65 72 20 62 65 69 6e 67    /* Pager being
06d0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
06e0: 0a 20 20 44 62 50 61 67 65 20 2a 70 50 61 67 65  .  DbPage *pPage
06f0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
0700: 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
0710: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
0720: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
0750: 74 61 62 61 73 65 20 74 6f 20 61 6e 61 6c 79 7a  tabase to analyz
0760: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67  e */.  int szPag
0770: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0780: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0790: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 62  f each page in b
07a0: 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75  ytes */.};..stru
07b0: 63 74 20 44 62 70 61 67 65 54 61 62 6c 65 20 7b  ct DbpageTable {
07c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
07d0: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
07e0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
07f0: 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  .  Must be first
0800: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
0810: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
0830: 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  abase */.};../* 
0840: 43 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  Columns */.#defi
0850: 6e 65 20 44 42 50 41 47 45 5f 43 4f 4c 55 4d 4e  ne DBPAGE_COLUMN
0860: 5f 50 47 4e 4f 20 20 20 20 30 0a 23 64 65 66 69  _PGNO    0.#defi
0870: 6e 65 20 44 42 50 41 47 45 5f 43 4f 4c 55 4d 4e  ne DBPAGE_COLUMN
0880: 5f 44 41 54 41 20 20 20 20 31 0a 23 64 65 66 69  _DATA    1.#defi
0890: 6e 65 20 44 42 50 41 47 45 5f 43 4f 4c 55 4d 4e  ne DBPAGE_COLUMN
08a0: 5f 53 43 48 45 4d 41 20 20 32 0a 0a 0a 0a 2f 2a  _SCHEMA  2..../*
08b0: 0a 2a 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 6f  .** Connect to o
08c0: 72 20 63 72 65 61 74 65 20 61 20 64 62 70 61 67  r create a dbpag
08d0: 65 76 66 73 20 76 69 72 74 75 61 6c 20 74 61 62  evfs virtual tab
08e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
08f0: 74 20 64 62 70 61 67 65 43 6f 6e 6e 65 63 74 28  t dbpageConnect(
0900: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
0910: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
0920: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
0930: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
0940: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
0950: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
0960: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 44  r **pzErr.){.  D
0970: 62 70 61 67 65 54 61 62 6c 65 20 2a 70 54 61 62  bpageTable *pTab
0980: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
0990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 72   SQLITE_OK;..  r
09a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
09b0: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20  are_vtab(db, .  
09c0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
09d0: 54 41 42 4c 45 20 78 28 70 67 6e 6f 20 49 4e 54  TABLE x(pgno INT
09e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
09f0: 2c 20 64 61 74 61 20 42 4c 4f 42 2c 20 73 63 68  , data BLOB, sch
0a00: 65 6d 61 20 48 49 44 44 45 4e 29 22 29 3b 0a 20  ema HIDDEN)");. 
0a10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
0a20: 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  OK ){.    pTab =
0a30: 20 28 44 62 70 61 67 65 54 61 62 6c 65 20 2a 29   (DbpageTable *)
0a40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
0a50: 28 73 69 7a 65 6f 66 28 44 62 70 61 67 65 54 61  (sizeof(DbpageTa
0a60: 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
0a70: 54 61 62 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Tab==0 ) rc = SQ
0a80: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
0a90: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
0aa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
0ab0: 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 69 66   pTab==0 );.  if
0ac0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
0ad0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 54  ){.    memset(pT
0ae0: 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 62  ab, 0, sizeof(Db
0af0: 70 61 67 65 54 61 62 6c 65 29 29 3b 0a 20 20 20  pageTable));.   
0b00: 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a   pTab->db = db;.
0b10: 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d    }..  *ppVtab =
0b20: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
0b30: 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTab;.  return r
0b40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
0b50: 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 6f 72 20 64  onnect from or d
0b60: 65 73 74 72 6f 79 20 61 20 64 62 70 61 67 65 76  estroy a dbpagev
0b70: 66 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  fs virtual table
0b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0b90: 64 62 70 61 67 65 44 69 73 63 6f 6e 6e 65 63 74  dbpageDisconnect
0ba0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
0bb0: 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
0bc0: 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20  _free(pVtab);.  
0bd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69 64 78 4e 75  ;.}../*.** idxNu
0bf0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 20  m:.**.**     0  
0c00: 20 20 20 73 63 68 65 6d 61 3d 6d 61 69 6e 2c 20     schema=main, 
0c10: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a  full table scan.
0c20: 2a 2a 20 20 20 20 20 31 20 20 20 20 20 73 63 68  **     1     sch
0c30: 65 6d 61 3d 6d 61 69 6e 2c 20 70 67 6e 6f 3d 3f  ema=main, pgno=?
0c40: 31 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 20 73  1.**     2     s
0c50: 63 68 65 6d 61 3d 3f 31 2c 20 66 75 6c 6c 20 74  chema=?1, full t
0c60: 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20  able scan.**    
0c70: 20 33 20 20 20 20 20 73 63 68 65 6d 61 3d 3f 31   3     schema=?1
0c80: 2c 20 70 67 6e 6f 3d 3f 32 0a 2a 2f 0a 73 74 61  , pgno=?2.*/.sta
0c90: 74 69 63 20 69 6e 74 20 64 62 70 61 67 65 42 65  tic int dbpageBe
0ca0: 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f  stIndex(sqlite3_
0cb0: 76 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74  vtab *tab, sqlit
0cc0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
0cd0: 49 64 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20  IdxInfo){.  int 
0ce0: 69 3b 0a 20 20 69 6e 74 20 69 50 6c 61 6e 20 3d  i;.  int iPlan =
0cf0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
0d00: 72 65 20 69 73 20 61 20 73 63 68 65 6d 61 3d 20  re is a schema= 
0d10: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 74 20 6d  constraint, it m
0d20: 75 73 74 20 62 65 20 68 6f 6e 6f 72 65 64 2e 20  ust be honored. 
0d30: 20 52 65 70 6f 72 74 20 61 0a 20 20 2a 2a 20 72   Report a.  ** r
0d40: 69 64 69 63 75 6c 6f 75 73 6c 79 20 6c 61 72 67  idiculously larg
0d50: 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
0d60: 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 3d 20   if the schema= 
0d70: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 20 20  constraint is.  
0d80: 2a 2a 20 75 6e 61 76 61 69 6c 61 62 6c 65 0a 20  ** unavailable. 
0d90: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
0da0: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
0db0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
0dc0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
0dd0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
0de0: 74 20 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f  t *p = &pIdxInfo
0df0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
0e00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f  ;.    if( p->iCo
0e10: 6c 75 6d 6e 21 3d 44 42 50 41 47 45 5f 43 4f 4c  lumn!=DBPAGE_COL
0e20: 55 4d 4e 5f 53 43 48 45 4d 41 20 29 20 63 6f 6e  UMN_SCHEMA ) con
0e30: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
0e40: 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op!=SQLITE_IND
0e50: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
0e60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
0e70: 20 69 66 28 20 21 70 2d 3e 75 73 61 62 6c 65 20   if( !p->usable 
0e80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 73  ){.      /* No s
0e90: 6f 6c 75 74 69 6f 6e 2e 20 20 55 73 65 20 74 68  olution.  Use th
0ea0: 65 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45  e default SQLITE
0eb0: 5f 42 49 47 5f 44 42 4c 20 63 6f 73 74 20 2a 2f  _BIG_DBL cost */
0ec0: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
0ed0: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
0ee0: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
0ef0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0f00: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
0f10: 50 6c 61 6e 20 3d 20 32 3b 0a 20 20 20 20 70 49  Plan = 2;.    pI
0f20: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
0f30: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
0f40: 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70  Index = 1;.    p
0f50: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
0f60: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
0f70: 74 20 3d 20 31 3b 0a 20 20 20 20 62 72 65 61 6b  t = 1;.    break
0f80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
0f90: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
0fa0: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
0fb0: 74 20 65 69 74 68 65 72 20 74 68 65 72 65 20 69  t either there i
0fc0: 73 20 6e 6f 20 73 63 68 65 6d 61 3d 0a 20 20 2a  s no schema=.  *
0fd0: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 69 6e  * constraint (in
0fe0: 20 77 68 69 63 68 20 63 61 73 65 20 77 65 20 75   which case we u
0ff0: 73 65 20 74 68 65 20 22 6d 61 69 6e 22 20 73 63  se the "main" sc
1000: 68 65 6d 61 29 20 6f 72 20 65 6c 73 65 20 74 68  hema) or else th
1010: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 63 6f  e.  ** schema co
1020: 6e 73 74 72 61 69 6e 74 20 77 61 73 20 61 63 63  nstraint was acc
1030: 65 70 74 65 64 2e 20 20 4c 6f 77 65 72 20 74 68  epted.  Lower th
1040: 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
1050: 20 61 63 63 6f 72 64 69 6e 67 6c 79 0a 20 20 2a   accordingly.  *
1060: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  /.  pIdxInfo->es
1070: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 2e  timatedCost = 1.
1080: 30 65 36 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0e6;..  /* Check
1090: 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
10a0: 20 61 67 61 69 6e 73 74 20 70 67 6e 6f 20 2a 2f   against pgno */
10b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
10c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
10d0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
10e0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
10f0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
1100: 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e 61  p = &pIdxInfo->a
1110: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b 0a 20  Constraint[i];. 
1120: 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62 6c 65     if( p->usable
1130: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d   && p->iColumn<=
1140: 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49  0 && p->op==SQLI
1150: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
1160: 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  INT_EQ ){.      
1170: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1180: 74 65 64 52 6f 77 73 20 3d 20 31 3b 0a 20 20 20  tedRows = 1;.   
1190: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
11a0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 49  Flags = SQLITE_I
11b0: 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
11c0: 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
11d0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
11e0: 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 70 49 64  = 1.0;.      pId
11f0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
1200: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
1210: 6e 64 65 78 20 3d 20 69 50 6c 61 6e 20 3f 20 32  ndex = iPlan ? 2
1220: 20 3a 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78   : 1;.      pIdx
1230: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1240: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d  tUsage[i].omit =
1250: 20 31 3b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20   1;.      iPlan 
1260: 7c 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61  |= 1;.      brea
1270: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  k;.    }.  }.  p
1280: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
1290: 3d 20 69 50 6c 61 6e 3b 0a 0a 20 20 69 66 28 20  = iPlan;..  if( 
12a0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
12b0: 42 79 3e 3d 31 0a 20 20 20 26 26 20 70 49 64 78  By>=1.   && pIdx
12c0: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30  Info->aOrderBy[0
12d0: 5d 2e 69 43 6f 6c 75 6d 6e 3c 3d 30 0a 20 20 20  ].iColumn<=0.   
12e0: 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  && pIdxInfo->aOr
12f0: 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30  derBy[0].desc==0
1300: 0a 20 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  .  ){.    pIdxIn
1310: 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1320: 6d 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  med = 1;.  }.  r
1330: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1350: 20 6e 65 77 20 64 62 70 61 67 65 76 66 73 20 63   new dbpagevfs c
1360: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
1370: 20 69 6e 74 20 64 62 70 61 67 65 4f 70 65 6e 28   int dbpageOpen(
1380: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1390: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
13a0: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
13b0: 73 6f 72 29 7b 0a 20 20 44 62 70 61 67 65 43 75  sor){.  DbpageCu
13c0: 72 73 6f 72 20 2a 70 43 73 72 3b 0a 0a 20 20 70  rsor *pCsr;..  p
13d0: 43 73 72 20 3d 20 28 44 62 70 61 67 65 43 75 72  Csr = (DbpageCur
13e0: 73 6f 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  sor *)sqlite3_ma
13f0: 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 44 62  lloc64(sizeof(Db
1400: 70 61 67 65 43 75 72 73 6f 72 29 29 3b 0a 20 20  pageCursor));.  
1410: 69 66 28 20 70 43 73 72 3d 3d 30 20 29 7b 0a 20  if( pCsr==0 ){. 
1420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1430: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
1440: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
1450: 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
1460: 28 44 62 70 61 67 65 43 75 72 73 6f 72 29 29 3b  (DbpageCursor));
1470: 0a 20 20 20 20 70 43 73 72 2d 3e 62 61 73 65 2e  .    pCsr->base.
1480: 70 56 74 61 62 20 3d 20 70 56 54 61 62 3b 0a 20  pVtab = pVTab;. 
1490: 20 20 20 70 43 73 72 2d 3e 70 67 6e 6f 20 3d 20     pCsr->pgno = 
14a0: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 43 75  -1;.  }..  *ppCu
14b0: 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  rsor = (sqlite3_
14c0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 70 43  vtab_cursor *)pC
14d0: 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  sr;.  return SQL
14e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14f0: 20 43 6c 6f 73 65 20 61 20 64 62 70 61 67 65 76   Close a dbpagev
1500: 66 73 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74  fs cursor..*/.st
1510: 61 74 69 63 20 69 6e 74 20 64 62 70 61 67 65 43  atic int dbpageC
1520: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
1530: 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
1540: 72 29 7b 0a 20 20 44 62 70 61 67 65 43 75 72 73  r){.  DbpageCurs
1550: 6f 72 20 2a 70 43 73 72 20 3d 20 28 44 62 70 61  or *pCsr = (Dbpa
1560: 67 65 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73  geCursor *)pCurs
1570: 6f 72 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  or;.  if( pCsr->
1580: 70 50 61 67 65 31 20 29 20 73 71 6c 69 74 65 33  pPage1 ) sqlite3
1590: 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
15a0: 65 28 70 43 73 72 2d 3e 70 50 61 67 65 31 29 3b  e(pCsr->pPage1);
15b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15c0: 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCsr);.  return 
15d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15e0: 0a 2a 2a 20 4d 6f 76 65 20 61 20 64 62 70 61 67  .** Move a dbpag
15f0: 65 76 66 73 20 63 75 72 73 6f 72 20 74 6f 20 74  evfs cursor to t
1600: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
1610: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1620: 61 74 69 63 20 69 6e 74 20 64 62 70 61 67 65 4e  atic int dbpageN
1630: 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
1640: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1650: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1660: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 44 62 70 61 67  LITE_OK;.  Dbpag
1670: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
1680: 28 44 62 70 61 67 65 43 75 72 73 6f 72 20 2a 29  (DbpageCursor *)
1690: 70 43 75 72 73 6f 72 3b 0a 20 20 70 43 73 72 2d  pCursor;.  pCsr-
16a0: 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 72 65 74 75 72  >pgno++;.  retur
16b0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
16c0: 69 6e 74 20 64 62 70 61 67 65 45 6f 66 28 73 71  int dbpageEof(sq
16d0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
16e0: 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 44  r *pCursor){.  D
16f0: 62 70 61 67 65 43 75 72 73 6f 72 20 2a 70 43 73  bpageCursor *pCs
1700: 72 20 3d 20 28 44 62 70 61 67 65 43 75 72 73 6f  r = (DbpageCurso
1710: 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 72  r *)pCursor;.  r
1720: 65 74 75 72 6e 20 70 43 73 72 2d 3e 70 67 6e 6f  eturn pCsr->pgno
1730: 20 3e 20 70 43 73 72 2d 3e 6d 78 50 67 6e 6f 3b   > pCsr->mxPgno;
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69 64 78 4e 75 6d  .}../*.** idxNum
1750: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 20 20  :.**.**     0   
1760: 20 20 73 63 68 65 6d 61 3d 6d 61 69 6e 2c 20 66    schema=main, f
1770: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull table scan.*
1780: 2a 20 20 20 20 20 31 20 20 20 20 20 73 63 68 65  *     1     sche
1790: 6d 61 3d 6d 61 69 6e 2c 20 70 67 6e 6f 3d 3f 31  ma=main, pgno=?1
17a0: 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 20 73 63  .**     2     sc
17b0: 68 65 6d 61 3d 3f 31 2c 20 66 75 6c 6c 20 74 61  hema=?1, full ta
17c0: 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
17d0: 33 20 20 20 20 20 73 63 68 65 6d 61 3d 3f 31 2c  3     schema=?1,
17e0: 20 70 67 6e 6f 3d 3f 32 0a 2a 2a 0a 2a 2a 20 69   pgno=?2.**.** i
17f0: 64 78 53 74 72 20 69 73 20 6e 6f 74 20 75 73 65  dxStr is not use
1800: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
1810: 64 62 70 61 67 65 46 69 6c 74 65 72 28 0a 20 20  dbpageFilter(.  
1820: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
1830: 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20  sor *pCursor, . 
1840: 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
1850: 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
1860: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
1870: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1880: 76 0a 29 7b 0a 20 20 44 62 70 61 67 65 43 75 72  v.){.  DbpageCur
1890: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 44 62 70  sor *pCsr = (Dbp
18a0: 61 67 65 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ageCursor *)pCur
18b0: 73 6f 72 3b 0a 20 20 44 62 70 61 67 65 54 61 62  sor;.  DbpageTab
18c0: 6c 65 20 2a 70 54 61 62 20 3d 20 28 44 62 70 61  le *pTab = (Dbpa
18d0: 67 65 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f  geTable *)pCurso
18e0: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20  r->pVtab;.  int 
18f0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1900: 62 20 3d 20 70 54 61 62 2d 3e 64 62 3b 0a 20 20  b = pTab->db;.  
1910: 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 2f  Btree *pBt;..  /
1920: 2a 20 44 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * Default settin
1930: 67 20 69 73 20 6e 6f 20 72 6f 77 73 20 6f 66 20  g is no rows of 
1940: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 70 43 73 72  result */.  pCsr
1950: 2d 3e 70 67 6e 6f 20 3d 20 31 3b 20 0a 20 20 70  ->pgno = 1; .  p
1960: 43 73 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 30 3b  Csr->mxPgno = 0;
1970: 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26  ..  if( idxNum &
1980: 20 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   2 ){.    const 
1990: 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 3b 0a 20  char *zSchema;. 
19a0: 20 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3e     assert( argc>
19b0: 3d 31 20 29 3b 0a 20 20 20 20 7a 53 63 68 65 6d  =1 );.    zSchem
19c0: 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  a = (const char*
19d0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
19e0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
19f0: 20 20 70 43 73 72 2d 3e 69 44 62 20 3d 20 73 71    pCsr->iDb = sq
1a00: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1a10: 64 62 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20  db, zSchema);.  
1a20: 20 20 69 66 28 20 70 43 73 72 2d 3e 69 44 62 3c    if( pCsr->iDb<
1a30: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1a40: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1a50: 20 20 20 70 43 73 72 2d 3e 69 44 62 20 3d 20 30     pCsr->iDb = 0
1a60: 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 64 62  ;.  }.  pBt = db
1a70: 2d 3e 61 44 62 5b 70 43 73 72 2d 3e 69 44 62 5d  ->aDb[pCsr->iDb]
1a80: 2e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 3d  .pBt;.  if( pBt=
1a90: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1aa0: 54 45 5f 4f 4b 3b 0a 20 20 70 43 73 72 2d 3e 70  TE_OK;.  pCsr->p
1ab0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
1ac0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
1ad0: 20 20 70 43 73 72 2d 3e 73 7a 50 61 67 65 20 3d    pCsr->szPage =
1ae0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1af0: 50 61 67 65 53 69 7a 65 28 70 42 74 29 3b 0a 20  PageSize(pBt);. 
1b00: 20 70 43 73 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20   pCsr->mxPgno = 
1b10: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1b20: 50 61 67 65 28 70 42 74 29 3b 0a 20 20 69 66 28  Page(pBt);.  if(
1b30: 20 69 64 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20   idxNum & 1 ){. 
1b40: 20 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3e     assert( argc>
1b50: 28 69 64 78 4e 75 6d 3e 3e 31 29 20 29 3b 0a 20  (idxNum>>1) );. 
1b60: 20 20 20 70 43 73 72 2d 3e 70 67 6e 6f 20 3d 20     pCsr->pgno = 
1b70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1b80: 74 28 61 72 67 76 5b 69 64 78 4e 75 6d 3e 3e 31  t(argv[idxNum>>1
1b90: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72  ]);.    if( pCsr
1ba0: 2d 3e 70 67 6e 6f 3c 31 20 7c 7c 20 70 43 73 72  ->pgno<1 || pCsr
1bb0: 2d 3e 70 67 6e 6f 3e 70 43 73 72 2d 3e 6d 78 50  ->pgno>pCsr->mxP
1bc0: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 43 73  gno ){.      pCs
1bd0: 72 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  r->pgno = 1;.   
1be0: 20 20 20 70 43 73 72 2d 3e 6d 78 50 67 6e 6f 20     pCsr->mxPgno 
1bf0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1c00: 20 20 20 20 20 20 70 43 73 72 2d 3e 6d 78 50 67        pCsr->mxPg
1c10: 6e 6f 20 3d 20 70 43 73 72 2d 3e 70 67 6e 6f 3b  no = pCsr->pgno;
1c20: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
1c40: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 7d  ->pgno==1 );.  }
1c50: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 50 61  .  if( pCsr->pPa
1c60: 67 65 31 20 29 20 73 71 6c 69 74 65 33 50 61 67  ge1 ) sqlite3Pag
1c70: 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 70  erUnrefPageOne(p
1c80: 43 73 72 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  Csr->pPage1);.  
1c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ca0: 72 47 65 74 28 70 43 73 72 2d 3e 70 50 61 67 65  rGet(pCsr->pPage
1cb0: 72 2c 20 31 2c 20 26 70 43 73 72 2d 3e 70 50 61  r, 1, &pCsr->pPa
1cc0: 67 65 31 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ge1, 0);.  retur
1cd0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
1ce0: 69 6e 74 20 64 62 70 61 67 65 43 6f 6c 75 6d 6e  int dbpageColumn
1cf0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
1d00: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1d10: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  , .  sqlite3_con
1d20: 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69 6e  text *ctx, .  in
1d30: 74 20 69 0a 29 7b 0a 20 20 44 62 70 61 67 65 43  t i.){.  DbpageC
1d40: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 44  ursor *pCsr = (D
1d50: 62 70 61 67 65 43 75 72 73 6f 72 20 2a 29 70 43  bpageCursor *)pC
1d60: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20  ursor;.  int rc 
1d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
1d80: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
1d90: 63 61 73 65 20 30 3a 20 7b 20 20 20 20 20 20 20  case 0: {       
1da0: 20 20 20 20 2f 2a 20 70 67 6e 6f 20 2a 2f 0a 20      /* pgno */. 
1db0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1dc0: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 73  ult_int(ctx, pCs
1dd0: 72 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r->pgno);.      
1de0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1df0: 20 63 61 73 65 20 31 3a 20 7b 20 20 20 20 20 20   case 1: {      
1e00: 20 20 20 20 20 2f 2a 20 64 61 74 61 20 2a 2f 0a       /* data */.
1e10: 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
1e20: 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  bPage = 0;.     
1e30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e40: 65 72 47 65 74 28 70 43 73 72 2d 3e 70 50 61 67  erGet(pCsr->pPag
1e50: 65 72 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 2c 20  er, pCsr->pgno, 
1e60: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
1e70: 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ge, 0);.      if
1e80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ea0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
1eb0: 74 78 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  tx, sqlite3Pager
1ec0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
1ed0: 2c 20 70 43 73 72 2d 3e 73 7a 50 61 67 65 2c 0a  , pCsr->szPage,.
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1f00: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f20: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f30: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62  DbPage);.      b
1f40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f50: 64 65 66 61 75 6c 74 3a 20 7b 20 20 20 20 20 20  default: {      
1f60: 20 20 20 20 2f 2a 20 73 63 68 65 6d 61 20 2a 2f      /* schema */
1f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1f80: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
1f90: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
1fa0: 74 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tx);.      sqlit
1fb0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1fc0: 74 78 2c 20 64 62 2d 3e 61 44 62 5b 70 43 73 72  tx, db->aDb[pCsr
1fd0: 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  ->iDb].zDbSName,
1fe0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1ff0: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
2000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2020: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  }..static int db
2030: 70 61 67 65 52 6f 77 69 64 28 73 71 6c 69 74 65  pageRowid(sqlite
2040: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
2050: 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69  Cursor, sqlite_i
2060: 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
2070: 20 44 62 70 61 67 65 43 75 72 73 6f 72 20 2a 70   DbpageCursor *p
2080: 43 73 72 20 3d 20 28 44 62 70 61 67 65 43 75 72  Csr = (DbpageCur
2090: 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20  sor *)pCursor;. 
20a0: 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73 72 2d   *pRowid = pCsr-
20b0: 3e 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  >pgno;.  return 
20c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
20d0: 61 74 69 63 20 69 6e 74 20 64 62 70 61 67 65 55  atic int dbpageU
20e0: 70 64 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  pdate(.  sqlite3
20f0: 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 0a 20 20  _vtab *pVtab,.  
2100: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
2110: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2120: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
2130: 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 44 62   *pRowid.){.  Db
2140: 70 61 67 65 54 61 62 6c 65 20 2a 70 54 61 62 20  pageTable *pTab 
2150: 3d 20 28 44 62 70 61 67 65 54 61 62 6c 65 20 2a  = (DbpageTable *
2160: 29 70 56 74 61 62 3b 0a 20 20 50 67 6e 6f 20 70  )pVtab;.  Pgno p
2170: 67 6e 6f 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  gno;.  DbPage *p
2180: 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  DbPage = 0;.  in
2190: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
21b0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
21c0: 20 2a 7a 53 63 68 65 6d 61 3b 0a 20 20 69 6e 74   *zSchema;.  int
21d0: 20 69 44 62 3b 0a 20 20 42 74 72 65 65 20 2a 70   iDb;.  Btree *p
21e0: 42 74 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  Bt;.  Pager *pPa
21f0: 67 65 72 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67  ger;.  int szPag
2200: 65 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  e;..  if( argc==
2210: 31 20 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d 20  1 ){.    zErr = 
2220: 22 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 22 3b  "cannot delete";
2230: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2240: 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 70 67 6e  _fail;.  }.  pgn
2250: 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  o = sqlite3_valu
2260: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
2270: 20 20 69 66 28 20 28 50 67 6e 6f 29 73 71 6c 69    if( (Pgno)sqli
2280: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
2290: 67 76 5b 31 5d 29 21 3d 70 67 6e 6f 20 29 7b 0a  gv[1])!=pgno ){.
22a0: 20 20 20 20 7a 45 72 72 20 3d 20 22 63 61 6e 6e      zErr = "cann
22b0: 6f 74 20 69 6e 73 65 72 74 22 3b 0a 20 20 20 20  ot insert";.    
22c0: 67 6f 74 6f 20 75 70 64 61 74 65 5f 66 61 69 6c  goto update_fail
22d0: 3b 0a 20 20 7d 0a 20 20 7a 53 63 68 65 6d 61 20  ;.  }.  zSchema 
22e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
22f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2300: 74 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 69 44  t(argv[4]);.  iD
2310: 62 20 3d 20 7a 53 63 68 65 6d 61 20 3f 20 73 71  b = zSchema ? sq
2320: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
2330: 70 54 61 62 2d 3e 64 62 2c 20 7a 53 63 68 65 6d  pTab->db, zSchem
2340: 61 29 20 3a 20 2d 31 3b 0a 20 20 69 66 28 20 69  a) : -1;.  if( i
2350: 44 62 3c 30 20 29 7b 0a 20 20 20 20 7a 45 72 72  Db<0 ){.    zErr
2360: 20 3d 20 22 6e 6f 20 73 75 63 68 20 73 63 68 65   = "no such sche
2370: 6d 61 22 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70  ma";.    goto up
2380: 64 61 74 65 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  date_fail;.  }. 
2390: 20 70 42 74 20 3d 20 70 54 61 62 2d 3e 64 62 2d   pBt = pTab->db-
23a0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
23b0: 20 69 66 28 20 70 67 6e 6f 3c 31 20 7c 7c 20 70   if( pgno<1 || p
23c0: 42 74 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3e 28 69  Bt==0 || pgno>(i
23d0: 6e 74 29 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt)sqlite3BtreeL
23e0: 61 73 74 50 61 67 65 28 70 42 74 29 20 29 7b 0a  astPage(pBt) ){.
23f0: 20 20 20 20 7a 45 72 72 20 3d 20 22 62 61 64 20      zErr = "bad 
2400: 70 61 67 65 20 6e 75 6d 62 65 72 22 3b 0a 20 20  page number";.  
2410: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 66 61    goto update_fa
2420: 69 6c 3b 0a 20 20 7d 0a 20 20 73 7a 50 61 67 65  il;.  }.  szPage
2430: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2440: 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 3b  etPageSize(pBt);
2450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
2460: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 33  alue_type(argv[3
2470: 5d 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  ])!=SQLITE_BLOB 
2480: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76  .   || sqlite3_v
2490: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
24a0: 33 5d 29 21 3d 73 7a 50 61 67 65 0a 20 20 29 7b  3])!=szPage.  ){
24b0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 62 61 64  .    zErr = "bad
24c0: 20 70 61 67 65 20 76 61 6c 75 65 22 3b 0a 20 20   page value";.  
24d0: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 66 61    goto update_fa
24e0: 69 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  il;.  }.  pPager
24f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
2500: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20  ager(pBt);.  rc 
2510: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2520: 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
2530: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
2540: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
2550: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2560: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2570: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
2580: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
2590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25a0: 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
25b0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
25c0: 62 50 61 67 65 29 2c 0a 20 20 20 20 20 20 20 20  bPage),.        
25d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
25e0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 33 5d 29  ue_blob(argv[3])
25f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2600: 7a 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zPage);.    }.  
2610: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
2620: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
2630: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 75 70    return rc;..up
2640: 64 61 74 65 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  date_fail:.  sql
2650: 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
2660: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
2670: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ab->zErrMsg = sq
2680: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2690: 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74  s", zErr);.  ret
26a0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26b0: 3b 0a 7d 0a 0a 2f 2a 20 53 69 6e 63 65 20 77 65  ;.}../* Since we
26c0: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 69 6e 20   do not know in 
26d0: 61 64 76 61 6e 63 65 20 77 68 69 63 68 20 64 61  advance which da
26e0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 77 69 6c  tabase files wil
26f0: 6c 20 62 65 0a 2a 2a 20 77 72 69 74 74 65 6e 20  l be.** written 
2700: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 64 62  by the sqlite_db
2710: 70 61 67 65 20 76 69 72 74 75 61 6c 20 74 61 62  page virtual tab
2720: 6c 65 2c 20 73 74 61 72 74 20 61 20 77 72 69 74  le, start a writ
2730: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2740: 20 6f 6e 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f   on them all..*/
2750: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 70 61  .static int dbpa
2760: 67 65 42 65 67 69 6e 28 73 71 6c 69 74 65 33 5f  geBegin(sqlite3_
2770: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
2780: 44 62 70 61 67 65 54 61 62 6c 65 20 2a 70 54 61  DbpageTable *pTa
2790: 62 20 3d 20 28 44 62 70 61 67 65 54 61 62 6c 65  b = (DbpageTable
27a0: 20 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69   *)pVtab;.  sqli
27b0: 74 65 33 20 2a 64 62 20 3d 20 70 54 61 62 2d 3e  te3 *db = pTab->
27c0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
27d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
27e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
27f0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
2800: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
2810: 28 20 70 42 74 20 29 20 73 71 6c 69 74 65 33 42  ( pBt ) sqlite3B
2820: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
2830: 42 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  Bt, 1);.  }.  re
2840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2850: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  }.../*.** Invoke
2860: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2870: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 22 64   register the "d
2880: 62 70 61 67 65 22 20 76 69 72 74 75 61 6c 20 74  bpage" virtual t
2890: 61 62 6c 65 20 6d 6f 64 75 6c 65 0a 2a 2f 0a 69  able module.*/.i
28a0: 6e 74 20 73 71 6c 69 74 65 33 44 62 70 61 67 65  nt sqlite3Dbpage
28b0: 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
28c0: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
28d0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 64  sqlite3_module d
28e0: 62 70 61 67 65 5f 6d 6f 64 75 6c 65 20 3d 20 7b  bpage_module = {
28f0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2920: 2f 0a 20 20 20 20 64 62 70 61 67 65 43 6f 6e 6e  /.    dbpageConn
2930: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
2940: 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a      /* xCreate *
2950: 2f 0a 20 20 20 20 64 62 70 61 67 65 43 6f 6e 6e  /.    dbpageConn
2960: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
2970: 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
2980: 2a 2f 0a 20 20 20 20 64 62 70 61 67 65 42 65 73  */.    dbpageBes
2990: 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
29a0: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
29b0: 65 78 20 2a 2f 0a 20 20 20 20 64 62 70 61 67 65  ex */.    dbpage
29c0: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
29d0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
29e0: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 64 62  onnect */.    db
29f0: 70 61 67 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20  pageDisconnect, 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a10: 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 20 20 64  Destroy */.    d
2a20: 62 70 61 67 65 4f 70 65 6e 2c 20 20 20 20 20 20  bpageOpen,      
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a40: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
2a50: 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 64 62 70  ursor */.    dbp
2a60: 61 67 65 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ageClose,       
2a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a80: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
2a90: 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 64 62 70  ursor */.    dbp
2aa0: 61 67 65 46 69 6c 74 65 72 2c 20 20 20 20 20 20  ageFilter,      
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
2ac0: 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
2ad0: 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
2ae0: 74 73 20 2a 2f 0a 20 20 20 20 64 62 70 61 67 65  ts */.    dbpage
2af0: 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
2b00: 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
2b10: 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
2b20: 73 6f 72 20 2a 2f 0a 20 20 20 20 64 62 70 61 67  sor */.    dbpag
2b30: 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  eEof,           
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
2b50: 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64   - check for end
2b60: 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20   of scan */.    
2b70: 64 62 70 61 67 65 43 6f 6c 75 6d 6e 2c 20 20 20  dbpageColumn,   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b90: 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
2ba0: 64 61 74 61 20 2a 2f 0a 20 20 20 20 64 62 70 61  data */.    dbpa
2bb0: 67 65 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  geRowid,        
2bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
2bd0: 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
2be0: 2a 2f 0a 20 20 20 20 64 62 70 61 67 65 55 70 64  */.    dbpageUpd
2bf0: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2c00: 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20       /* xUpdate 
2c10: 2a 2f 0a 20 20 20 20 64 62 70 61 67 65 42 65 67  */.    dbpageBeg
2c20: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2c30: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
2c40: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
2c70: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
2ca0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a    /* xRollback *
2cd0: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68      /* xFindMeth
2d00: 6f 64 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  od */.    0,    
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
2d30: 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
2d60: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 30 2c 20  point */.    0, 
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
2d90: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 20 20 30 2c  elease */.    0,
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2dc0: 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20  RollbackTo */.  
2dd0: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  };.  return sqli
2de0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
2df0: 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 64 62  e(db, "sqlite_db
2e00: 70 61 67 65 22 2c 20 26 64 62 70 61 67 65 5f 6d  page", &dbpage_m
2e10: 6f 64 75 6c 65 2c 20 30 29 3b 0a 7d 0a 23 65 6c  odule, 0);.}.#el
2e20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2e30: 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
2e40: 56 54 41 42 29 0a 69 6e 74 20 73 71 6c 69 74 65  VTAB).int sqlite
2e50: 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72 28  3DbpageRegister(
2e60: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65  sqlite3 *db){ re
2e70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2e80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2e90: 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54  TE_ENABLE_DBSTAT
2ea0: 5f 56 54 41 42 20 2a 2f 0a                       _VTAB */.