/ Hex Artifact Content
Login

Artifact dcabb7d39da058cbfc9ddc427cd92fbf14822b28:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 20 4a 75 6c 79 20  /*.** 2010 July 
0010: 31 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  12.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
0180: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0190: 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
01a0: 6e 20 6f 66 20 74 68 65 20 22 64 62 73 74 61 74  n of the "dbstat
01b0: 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  " virtual table.
01c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 73 74 61  .**.** The dbsta
01d0: 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  t virtual table 
01e0: 69 73 20 75 73 65 64 20 74 6f 20 65 78 74 72 61  is used to extra
01f0: 63 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 66 6f 72  ct low-level for
0200: 6d 61 74 74 69 6e 67 0a 2a 2a 20 69 6e 66 6f 72  matting.** infor
0210: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 53  mation from an S
0220: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69  QLite database i
0230: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
0240: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 22 73 71 6c  ment the.** "sql
0250: 69 74 65 33 5f 61 6e 61 6c 79 7a 65 72 22 20 75  ite3_analyzer" u
0260: 74 69 6c 69 74 79 2e 20 20 53 65 65 20 74 68 65  tility.  See the
0270: 20 2e 2e 2f 74 6f 6f 6c 2f 73 70 61 63 65 61 6e   ../tool/spacean
0280: 61 6c 2e 74 63 6c 20 73 63 72 69 70 74 0a 2a 2a  al.tcl script.**
0290: 20 66 6f 72 20 61 6e 20 65 78 61 6d 70 6c 65 20   for an example 
02a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
02b0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  */..#include "sq
02c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
02d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
02e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a  VIRTUALTABLE../*
02f0: 0a 2a 2a 20 50 61 67 65 20 70 61 74 68 73 3a 0a  .** Page paths:.
0300: 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 20 76 61 6c  ** .**   The val
0310: 75 65 20 6f 66 20 74 68 65 20 27 70 61 74 68 27  ue of the 'path'
0320: 20 63 6f 6c 75 6d 6e 20 64 65 73 63 72 69 62 65   column describe
0330: 73 20 74 68 65 20 70 61 74 68 20 74 61 6b 65 6e  s the path taken
0340: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
0350: 72 6f 6f 74 2d 6e 6f 64 65 20 6f 66 20 74 68 65  root-node of the
0360: 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
0370: 65 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 20  e to each page. 
0380: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
0390: 20 0a 2a 2a 20 20 20 72 6f 6f 74 2d 6e 6f 64 65   .**   root-node
03a0: 20 70 61 74 68 20 69 73 20 27 2f 27 2e 0a 2a 2a   path is '/'..**
03b0: 0a 2a 2a 20 20 20 54 68 65 20 76 61 6c 75 65 20  .**   The value 
03c0: 6f 66 20 74 68 65 20 70 61 74 68 20 66 6f 72 20  of the path for 
03d0: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 68  the left-most ch
03e0: 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65 20  ild page of the 
03f0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 20 20 61 20 62  root of.**   a b
0400: 2d 74 72 65 65 20 69 73 20 27 2f 30 30 30 2f 27  -tree is '/000/'
0410: 2e 20 28 42 74 72 65 65 73 20 73 74 6f 72 65 20  . (Btrees store 
0420: 63 6f 6e 74 65 6e 74 20 6f 72 64 65 72 65 64 20  content ordered 
0430: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
0440: 68 74 0a 2a 2a 20 20 20 73 6f 20 74 68 65 20 70  ht.**   so the p
0450: 61 67 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ages to the left
0460: 20 68 61 76 65 20 73 6d 61 6c 6c 65 72 20 6b 65   have smaller ke
0470: 79 73 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  ys than the page
0480: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 29  s to the right.)
0490: 0a 2a 2a 20 20 20 54 68 65 20 6e 65 78 74 20 74  .**   The next t
04a0: 6f 20 6c 65 66 74 2d 6d 6f 73 74 20 63 68 69 6c  o left-most chil
04b0: 64 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61  d of the root pa
04c0: 67 65 20 69 73 0a 2a 2a 20 20 20 27 2f 30 30 31  ge is.**   '/001
04d0: 27 2c 20 61 6e 64 20 73 6f 20 6f 6e 2c 20 65 61  ', and so on, ea
04e0: 63 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ch sibling page 
04f0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
0500: 33 2d 64 69 67 69 74 20 68 65 78 20 0a 2a 2a 20  3-digit hex .** 
0510: 20 20 76 61 6c 75 65 2e 20 54 68 65 20 63 68 69    value. The chi
0520: 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 34 35 31  ldren of the 451
0530: 73 74 20 6c 65 66 74 2d 6d 6f 73 74 20 73 69 62  st left-most sib
0540: 6c 69 6e 67 20 68 61 76 65 20 70 61 74 68 73 20  ling have paths 
0550: 73 75 63 68 0a 2a 2a 20 20 20 61 73 20 27 2f 31  such.**   as '/1
0560: 63 32 2f 30 30 30 2f 2c 20 27 2f 31 63 32 2f 30  c2/000/, '/1c2/0
0570: 30 31 2f 27 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20  01/' etc..**.** 
0580: 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
0590: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20 62   are specified b
05a0: 79 20 61 70 70 65 6e 64 69 6e 67 20 61 20 27 2b  y appending a '+
05b0: 27 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20  ' character and 
05c0: 61 20 0a 2a 2a 20 20 20 73 69 78 2d 64 69 67 69  a .**   six-digi
05d0: 74 20 68 65 78 61 64 65 63 69 6d 61 6c 20 76 61  t hexadecimal va
05e0: 6c 75 65 20 74 6f 20 74 68 65 20 70 61 74 68 20  lue to the path 
05f0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 68 65 79  to the cell they
0600: 20 61 72 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 20   are linked.**  
0610: 20 66 72 6f 6d 2e 20 46 6f 72 20 65 78 61 6d 70   from. For examp
0620: 6c 65 2c 20 74 68 65 20 74 68 72 65 65 20 6f 76  le, the three ov
0630: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 69 6e 20  erflow pages in 
0640: 61 20 63 68 61 69 6e 20 6c 69 6e 6b 65 64 20 66  a chain linked f
0650: 72 6f 6d 20 0a 2a 2a 20 20 20 74 68 65 20 6c 65  rom .**   the le
0660: 66 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ft-most cell of 
0670: 74 68 65 20 34 35 30 74 68 20 63 68 69 6c 64 20  the 450th child 
0680: 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  of the root page
0690: 20 61 72 65 20 69 64 65 6e 74 69 66 69 65 64 0a   are identified.
06a0: 2a 2a 20 20 20 62 79 20 74 68 65 20 70 61 74 68  **   by the path
06b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2f  s:.**.**      '/
06c0: 31 63 32 2f 30 30 30 2b 30 30 30 30 30 30 27 20  1c2/000+000000' 
06d0: 20 20 20 20 20 20 20 20 2f 2f 20 46 69 72 73 74          // First
06e0: 20 70 61 67 65 20 69 6e 20 6f 76 65 72 66 6c 6f   page in overflo
06f0: 77 20 63 68 61 69 6e 0a 2a 2a 20 20 20 20 20 20  w chain.**      
0700: 27 2f 31 63 32 2f 30 30 30 2b 30 30 30 30 30 31  '/1c2/000+000001
0710: 27 20 20 20 20 20 20 20 20 20 2f 2f 20 53 65 63  '         // Sec
0720: 6f 6e 64 20 70 61 67 65 20 69 6e 20 6f 76 65 72  ond page in over
0730: 66 6c 6f 77 20 63 68 61 69 6e 0a 2a 2a 20 20 20  flow chain.**   
0740: 20 20 20 27 2f 31 63 32 2f 30 30 30 2b 30 30 30     '/1c2/000+000
0750: 30 30 32 27 20 20 20 20 20 20 20 20 20 2f 2f 20  002'         // 
0760: 54 68 69 72 64 20 70 61 67 65 20 69 6e 20 6f 76  Third page in ov
0770: 65 72 66 6c 6f 77 20 63 68 61 69 6e 0a 2a 2a 0a  erflow chain.**.
0780: 2a 2a 20 20 20 49 66 20 74 68 65 20 70 61 74 68  **   If the path
0790: 73 20 61 72 65 20 73 6f 72 74 65 64 20 75 73 69  s are sorted usi
07a0: 6e 67 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  ng the BINARY co
07b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
07c0: 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 65 20  , then.**   the 
07d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
07e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
07f0: 20 63 65 6c 6c 20 77 69 6c 6c 20 61 70 70 65 61   cell will appea
0800: 72 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65  r earlier in the
0810: 0a 2a 2a 20 20 20 73 6f 72 74 2d 6f 72 64 65 72  .**   sort-order
0820: 20 74 68 61 6e 20 69 74 73 20 63 68 69 6c 64 20   than its child 
0830: 70 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  page:.**.**     
0840: 20 27 2f 31 63 32 2f 30 30 30 2f 27 20 20 20 20   '/1c2/000/'    
0850: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4c 65             // Le
0860: 66 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ft-most child of
0870: 20 34 35 31 73 74 20 63 68 69 6c 64 20 6f 66 20   451st child of 
0880: 72 6f 6f 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  root.*/.#define 
0890: 56 54 41 42 5f 53 43 48 45 4d 41 20 20 20 20 20  VTAB_SCHEMA     
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 5c 0a 20 20 22 43 52 45 41 54 45 20      \.  "CREATE 
08e0: 54 41 42 4c 45 20 78 78 28 20 22 20 20 20 20 20  TABLE xx( "     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 5c 0a 20 20 22 20 20 6e 61 6d 65 20 20 20    \.  "  name   
0930: 20 20 20 20 53 54 52 49 4e 47 2c 20 20 20 20 20      STRING,     
0940: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0950: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
0960: 2a 2f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  */"             
0970: 5c 0a 20 20 22 20 20 70 61 74 68 20 20 20 20 20  \.  "  path     
0980: 20 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20    INTEGER,      
0990: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 70      /* Path to p
09a0: 61 67 65 20 66 72 6f 6d 20 72 6f 6f 74 20 2a 2f  age from root */
09b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  "             \.
09c0: 20 20 22 20 20 70 61 67 65 6e 6f 20 20 20 20 20    "  pageno     
09d0: 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20  INTEGER,        
09e0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
09f0: 20 2a 2f 22 20 20 20 20 20 20 20 20 20 20 20 20   */"            
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0a10: 22 20 20 70 61 67 65 74 79 70 65 20 20 20 53 54  "  pagetype   ST
0a20: 52 49 4e 47 2c 20 20 20 20 20 20 20 20 20 20 20  RING,           
0a30: 2f 2a 20 27 69 6e 74 65 72 6e 61 6c 27 2c 20 27  /* 'internal', '
0a40: 6c 65 61 66 27 20 6f 72 20 27 6f 76 65 72 66 6c  leaf' or 'overfl
0a50: 6f 77 27 20 2a 2f 22 20 20 20 5c 0a 20 20 22 20  ow' */"   \.  " 
0a60: 20 6e 63 65 6c 6c 20 20 20 20 20 20 49 4e 54 45   ncell      INTE
0a70: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  GER,          /*
0a80: 20 43 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 28   Cells on page (
0a90: 30 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 29 20  0 for overflow) 
0aa0: 2a 2f 22 20 20 20 20 20 5c 0a 20 20 22 20 20 70  */"     \.  "  p
0ab0: 61 79 6c 6f 61 64 20 20 20 20 49 4e 54 45 47 45  ayload    INTEGE
0ac0: 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  R,          /* B
0ad0: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
0ae0: 6f 6e 20 74 68 69 73 20 70 61 67 65 20 2a 2f 22  on this page */"
0af0: 20 20 20 20 20 20 5c 0a 20 20 22 20 20 75 6e 75        \.  "  unu
0b00: 73 65 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  sed     INTEGER,
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
0b20: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
0b30: 63 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ce on this page 
0b40: 2a 2f 22 20 5c 0a 20 20 22 20 20 6d 78 5f 70 61  */" \.  "  mx_pa
0b50: 79 6c 6f 61 64 20 49 4e 54 45 47 45 52 20 20 20  yload INTEGER   
0b60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
0b70: 73 74 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  st payload size 
0b80: 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 22  of all cells */"
0b90: 20 20 5c 0a 20 20 22 29 3b 22 0a 0a 23 69 66 20    \.  ");"..#if 
0ba0: 30 0a 23 64 65 66 69 6e 65 20 56 54 41 42 5f 53  0.#define VTAB_S
0bb0: 43 48 45 4d 41 32 20 20 20 20 20 20 20 20 20 20  CHEMA2          
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0bf0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
0c00: 79 79 28 20 22 20 20 20 20 20 20 20 20 20 20 20  yy( "           
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0c40: 22 20 20 70 61 67 65 6e 6f 20 20 20 49 4e 54 45  "  pageno   INTE
0c50: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 20 20  GER,            
0c60: 2f 2a 20 42 2d 74 72 65 65 20 70 61 67 65 20 6e  /* B-tree page n
0c70: 75 6d 62 65 72 20 2a 2f 22 20 20 20 20 20 20 20  umber */"       
0c80: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 20            \.  " 
0c90: 20 63 65 6c 6c 6e 6f 20 20 20 49 4e 54 45 47 45   cellno   INTEGE
0ca0: 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  R,            /*
0cb0: 20 43 65 6c 6c 20 6e 75 6d 62 65 72 20 77 69 74   Cell number wit
0cc0: 68 69 6e 20 70 61 67 65 20 2a 2f 22 20 20 20 20  hin page */"    
0cd0: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 20 20 6c          \.  "  l
0ce0: 6f 63 61 6c 20 20 20 20 49 4e 54 45 47 45 52 2c  ocal    INTEGER,
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0d00: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
0d10: 73 74 6f 72 65 64 20 6c 6f 63 61 6c 6c 79 20 2a  stored locally *
0d20: 2f 22 20 20 20 20 5c 0a 20 20 22 20 20 70 61 79  /"    \.  "  pay
0d30: 6c 6f 61 64 20 20 49 4e 54 45 47 45 52 2c 20 20  load  INTEGER,  
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
0d50: 61 6c 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  al cell payload 
0d60: 73 69 7a 65 20 2a 2f 22 20 20 20 20 20 20 20 20  size */"        
0d70: 20 20 20 20 5c 0a 20 20 22 20 20 6e 6f 76 66 6c      \.  "  novfl
0d80: 20 20 20 20 49 4e 54 45 47 45 52 20 20 20 20 20      INTEGER     
0d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0da0: 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  r of overflow pa
0db0: 67 65 73 20 2a 2f 22 20 20 20 20 20 20 20 20 20  ges */"         
0dc0: 20 20 5c 0a 20 20 22 29 3b 22 0a 23 65 6e 64 69    \.  ");".#endi
0dd0: 66 0a 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  f...typedef stru
0de0: 63 74 20 53 74 61 74 54 61 62 6c 65 20 53 74 61  ct StatTable Sta
0df0: 74 54 61 62 6c 65 3b 0a 74 79 70 65 64 65 66 20  tTable;.typedef 
0e00: 73 74 72 75 63 74 20 53 74 61 74 43 75 72 73 6f  struct StatCurso
0e10: 72 20 53 74 61 74 43 75 72 73 6f 72 3b 0a 74 79  r StatCursor;.ty
0e20: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
0e30: 74 50 61 67 65 20 53 74 61 74 50 61 67 65 3b 0a  tPage StatPage;.
0e40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0e50: 74 61 74 43 65 6c 6c 20 53 74 61 74 43 65 6c 6c  tatCell StatCell
0e60: 3b 0a 0a 73 74 72 75 63 74 20 53 74 61 74 43 65  ;..struct StatCe
0e70: 6c 6c 20 7b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  ll {.  int nLoca
0e80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0e90: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
0ea0: 6f 66 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  of local payload
0eb0: 20 2a 2f 0a 20 20 75 33 32 20 69 43 68 69 6c 64   */.  u32 iChild
0ec0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
0ed0: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 6e        /* Child n
0ee0: 6f 64 65 20 28 6f 72 20 30 20 69 66 20 74 68 69  ode (or 0 if thi
0ef0: 73 20 69 73 20 61 20 6c 65 61 66 29 20 2a 2f 0a  s is a leaf) */.
0f00: 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 20 20 20 20    int nOvfl;    
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 2f 2a 20 45 6e 74 72 69 65 73 20 69 6e 20    /* Entries in 
0f30: 61 4f 76 66 6c 5b 5d 20 2a 2f 0a 20 20 75 33 32  aOvfl[] */.  u32
0f40: 20 2a 61 4f 76 66 6c 3b 20 20 20 20 20 20 20 20   *aOvfl;        
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f60: 41 72 72 61 79 20 6f 66 20 6f 76 65 72 66 6c 6f  Array of overflo
0f70: 77 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 2a  w page numbers *
0f80: 2f 0a 20 20 69 6e 74 20 6e 4c 61 73 74 4f 76 66  /.  int nLastOvf
0f90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0fa0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
0fb0: 70 61 79 6c 6f 61 64 20 6f 6e 20 66 69 6e 61 6c  payload on final
0fc0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   overflow page *
0fd0: 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 3b 20 20  /.  int iOvfl;  
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 73 20      /* Iterates 
1000: 74 68 72 6f 75 67 68 20 61 4f 76 66 6c 5b 5d 20  through aOvfl[] 
1010: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 53 74  */.};..struct St
1020: 61 74 50 61 67 65 20 7b 0a 20 20 75 33 32 20 69  atPage {.  u32 i
1030: 50 67 6e 6f 3b 0a 20 20 44 62 50 61 67 65 20 2a  Pgno;.  DbPage *
1040: 70 50 67 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c  pPg;.  int iCell
1050: 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  ;..  char *zPath
1060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1070: 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20       /* Path to 
1080: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 0a 20 20  this page */..  
1090: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
10a0: 75 6c 61 74 65 64 20 62 79 20 73 74 61 74 44 65  ulated by statDe
10b0: 63 6f 64 65 50 61 67 65 28 29 3a 20 2a 2f 0a 20  codePage(): */. 
10c0: 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20   u8 flags;      
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 66 6c 61 67   /* Copy of flag
10f0: 73 20 62 79 74 65 20 2a 2f 0a 20 20 69 6e 74 20  s byte */.  int 
1100: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1120: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
1130: 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
1140: 6e 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  nUnused;        
1150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1160: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
1170: 62 79 74 65 73 20 6f 6e 20 70 61 67 65 20 2a 2f  bytes on page */
1180: 0a 20 20 53 74 61 74 43 65 6c 6c 20 2a 61 43 65  .  StatCell *aCe
1190: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11a0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70     /* Array of p
11b0: 61 72 73 65 64 20 63 65 6c 6c 73 20 2a 2f 0a 20  arsed cells */. 
11c0: 20 75 33 32 20 69 52 69 67 68 74 43 68 69 6c 64   u32 iRightChild
11d0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
11e0: 20 2f 2a 20 52 69 67 68 74 2d 63 68 69 6c 64 20   /* Right-child 
11f0: 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 72 20  page number (or 
1200: 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 78 50  0) */.  int nMxP
1210: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
1220: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
1230: 73 74 20 70 61 79 6c 6f 61 64 20 6f 66 20 61 6e  st payload of an
1240: 79 20 63 65 6c 6c 20 6f 6e 20 74 68 69 73 20 70  y cell on this p
1250: 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  age */.};..struc
1260: 74 20 53 74 61 74 43 75 72 73 6f 72 20 7b 0a 20  t StatCursor {. 
1270: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
1280: 72 73 6f 72 20 62 61 73 65 3b 0a 20 20 73 71 6c  rsor base;.  sql
1290: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
12a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12b0: 49 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  Iterates through
12c0: 20 73 65 74 20 6f 66 20 72 6f 6f 74 20 70 61 67   set of root pag
12d0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 6f  es */.  int isEo
12e0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
12f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72          /* After
1300: 20 70 53 74 6d 74 20 68 61 73 20 72 65 74 75 72   pStmt has retur
1310: 6e 65 64 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ned SQLITE_DONE 
1320: 2a 2f 0a 0a 20 20 53 74 61 74 50 61 67 65 20 61  */..  StatPage a
1330: 50 61 67 65 5b 33 32 5d 3b 0a 20 20 69 6e 74 20  Page[32];.  int 
1340: 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1360: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
1370: 61 50 61 67 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  aPage[] */..  /*
1380: 20 56 61 6c 75 65 73 20 74 6f 20 72 65 74 75 72   Values to retur
1390: 6e 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  n. */.  char *zN
13a0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
13b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
13c0: 20 6f 66 20 27 6e 61 6d 65 27 20 63 6f 6c 75 6d   of 'name' colum
13d0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  n */.  char *zPa
13e0: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
13f0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1400: 6f 66 20 27 70 61 74 68 27 20 63 6f 6c 75 6d 6e  of 'path' column
1410: 20 2a 2f 0a 20 20 75 33 32 20 69 50 61 67 65 6e   */.  u32 iPagen
1420: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1430: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1440: 66 20 27 70 61 67 65 6e 6f 27 20 63 6f 6c 75 6d  f 'pageno' colum
1450: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  n */.  char *zPa
1460: 67 65 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  getype;         
1470: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1480: 6f 66 20 27 70 61 67 65 74 79 70 65 27 20 63 6f  of 'pagetype' co
1490: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lumn */.  int nC
14a0: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
14c0: 75 65 20 6f 66 20 27 6e 63 65 6c 6c 27 20 63 6f  ue of 'ncell' co
14d0: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  lumn */.  int nP
14e0: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
14f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1500: 75 65 20 6f 66 20 27 70 61 79 6c 6f 61 64 27 20  ue of 'payload' 
1510: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1520: 6e 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  nUnused;        
1530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1540: 61 6c 75 65 20 6f 66 20 27 75 6e 75 73 65 64 27  alue of 'unused'
1550: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1560: 20 6e 4d 78 50 61 79 6c 6f 61 64 3b 20 20 20 20   nMxPayload;    
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1580: 56 61 6c 75 65 20 6f 66 20 27 6d 78 5f 70 61 79  Value of 'mx_pay
1590: 6c 6f 61 64 27 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  load' column */.
15a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 53 74 61 74 54  };..struct StatT
15b0: 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  able {.  sqlite3
15c0: 5f 76 74 61 62 20 62 61 73 65 3b 0a 20 20 73 71  _vtab base;.  sq
15d0: 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 23  lite3 *db;.};..#
15e0: 69 66 6e 64 65 66 20 67 65 74 32 62 79 74 65 0a  ifndef get2byte.
15f0: 23 20 64 65 66 69 6e 65 20 67 65 74 32 62 79 74  # define get2byt
1600: 65 28 78 29 20 20 20 28 28 78 29 5b 30 5d 3c 3c  e(x)   ((x)[0]<<
1610: 38 20 7c 20 28 78 29 5b 31 5d 29 0a 23 65 6e 64  8 | (x)[1]).#end
1620: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 6e 65 63  if../*.** Connec
1630: 74 20 74 6f 20 6f 72 20 63 72 65 61 74 65 20 61  t to or create a
1640: 20 73 74 61 74 76 66 73 20 76 69 72 74 75 61 6c   statvfs virtual
1650: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1660: 63 20 69 6e 74 20 73 74 61 74 43 6f 6e 6e 65 63  c int statConnec
1670: 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1680: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
1690: 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
16a0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
16b0: 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
16c0: 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
16d0: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
16e0: 20 53 74 61 74 54 61 62 6c 65 20 2a 70 54 61 62   StatTable *pTab
16f0: 3b 0a 0a 20 20 70 54 61 62 20 3d 20 28 53 74 61  ;..  pTab = (Sta
1700: 74 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 33  tTable *)sqlite3
1710: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
1720: 74 61 74 54 61 62 6c 65 29 29 3b 0a 20 20 6d 65  tatTable));.  me
1730: 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69  mset(pTab, 0, si
1740: 7a 65 6f 66 28 53 74 61 74 54 61 62 6c 65 29 29  zeof(StatTable))
1750: 3b 0a 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64  ;.  pTab->db = d
1760: 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  b;..  sqlite3_de
1770: 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 56  clare_vtab(db, V
1780: 54 41 42 5f 53 43 48 45 4d 41 29 3b 0a 20 20 2a  TAB_SCHEMA);.  *
1790: 70 70 56 74 61 62 20 3d 20 26 70 54 61 62 2d 3e  ppVtab = &pTab->
17a0: 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  base;.  return S
17b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17c0: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72  ** Disconnect fr
17d0: 6f 6d 20 6f 72 20 64 65 73 74 72 6f 79 20 61 20  om or destroy a 
17e0: 73 74 61 74 76 66 73 20 76 69 72 74 75 61 6c 20  statvfs virtual 
17f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1800: 20 69 6e 74 20 73 74 61 74 44 69 73 63 6f 6e 6e   int statDisconn
1810: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
1820: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
1830: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b  te3_free(pVtab);
1840: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1850: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1860: 65 72 65 20 69 73 20 6e 6f 20 22 62 65 73 74 2d  ere is no "best-
1870: 69 6e 64 65 78 22 2e 20 54 68 69 73 20 76 69 72  index". This vir
1880: 74 75 61 6c 20 74 61 62 6c 65 20 61 6c 77 61 79  tual table alway
1890: 73 20 64 6f 65 73 20 61 20 6c 69 6e 65 61 72 0a  s does a linear.
18a0: 2a 2a 20 73 63 61 6e 20 6f 66 20 74 68 65 20 62  ** scan of the b
18b0: 69 6e 61 72 79 20 56 46 53 20 6c 6f 67 20 66 69  inary VFS log fi
18c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
18d0: 74 20 73 74 61 74 42 65 73 74 49 6e 64 65 78 28  t statBestIndex(
18e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
18f0: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
1900: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29  _info *pIdxInfo)
1910: 7b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 73 20  {..  /* Records 
1920: 61 72 65 20 61 6c 77 61 79 73 20 72 65 74 75 72  are always retur
1930: 6e 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ned in ascending
1940: 20 6f 72 64 65 72 20 6f 66 20 28 6e 61 6d 65 2c   order of (name,
1950: 20 70 61 74 68 29 2e 20 0a 20 20 2a 2a 20 49 66   path). .  ** If
1960: 20 74 68 69 73 20 77 69 6c 6c 20 73 61 74 69 73   this will satis
1970: 66 79 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 73  fy the client, s
1980: 65 74 20 74 68 65 20 6f 72 64 65 72 42 79 43 6f  et the orderByCo
1990: 6e 73 75 6d 65 64 20 66 6c 61 67 20 73 6f 20 74  nsumed flag so t
19a0: 68 61 74 20 0a 20 20 2a 2a 20 53 51 4c 69 74 65  hat .  ** SQLite
19b0: 20 64 6f 65 73 20 6e 6f 74 20 64 6f 20 61 6e 20   does not do an 
19c0: 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2e 0a 20  external sort.. 
19d0: 20 2a 2f 0a 20 20 69 66 28 20 28 20 70 49 64 78   */.  if( ( pIdx
19e0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d  Info->nOrderBy==
19f0: 31 0a 20 20 20 20 20 26 26 20 70 49 64 78 49 6e  1.     && pIdxIn
1a00: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e  fo->aOrderBy[0].
1a10: 69 43 6f 6c 75 6d 6e 3d 3d 30 0a 20 20 20 20 20  iColumn==0.     
1a20: 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  && pIdxInfo->aOr
1a30: 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30  derBy[0].desc==0
1a40: 0a 20 20 20 20 20 29 20 7c 7c 0a 20 20 20 20 20  .     ) ||.     
1a50: 20 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   ( pIdxInfo->nOr
1a60: 64 65 72 42 79 3d 3d 32 0a 20 20 20 20 20 26 26  derBy==2.     &&
1a70: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65   pIdxInfo->aOrde
1a80: 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d  rBy[0].iColumn==
1a90: 30 0a 20 20 20 20 20 26 26 20 70 49 64 78 49 6e  0.     && pIdxIn
1aa0: 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e  fo->aOrderBy[0].
1ab0: 64 65 73 63 3d 3d 30 0a 20 20 20 20 20 26 26 20  desc==0.     && 
1ac0: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
1ad0: 42 79 5b 31 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 31  By[1].iColumn==1
1ae0: 0a 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66  .     && pIdxInf
1af0: 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 31 5d 2e 64  o->aOrderBy[1].d
1b00: 65 73 63 3d 3d 30 0a 20 20 20 20 20 29 0a 20 20  esc==0.     ).  
1b10: 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
1b20: 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1b30: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 70 49 64   = 1;.  }..  pId
1b40: 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1b50: 43 6f 73 74 20 3d 20 31 30 2e 30 3b 0a 20 20 72  Cost = 10.0;.  r
1b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1b80: 20 6e 65 77 20 73 74 61 74 76 66 73 20 63 75 72   new statvfs cur
1b90: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
1ba0: 6e 74 20 73 74 61 74 4f 70 65 6e 28 73 71 6c 69  nt statOpen(sqli
1bb0: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
1bc0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
1bd0: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
1be0: 7b 0a 20 20 53 74 61 74 54 61 62 6c 65 20 2a 70  {.  StatTable *p
1bf0: 54 61 62 20 3d 20 28 53 74 61 74 54 61 62 6c 65  Tab = (StatTable
1c00: 20 2a 29 70 56 54 61 62 3b 0a 20 20 53 74 61 74   *)pVTab;.  Stat
1c10: 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
1c20: 69 6e 74 20 72 63 3b 0a 0a 20 20 70 43 73 72 20  int rc;..  pCsr 
1c30: 3d 20 28 53 74 61 74 43 75 72 73 6f 72 20 2a 29  = (StatCursor *)
1c40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
1c50: 69 7a 65 6f 66 28 53 74 61 74 43 75 72 73 6f 72  izeof(StatCursor
1c60: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73  ));.  memset(pCs
1c70: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
1c80: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73  tCursor));.  pCs
1c90: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20  r->base.pVtab = 
1ca0: 70 56 54 61 62 3b 0a 0a 20 20 72 63 20 3d 20 73  pVTab;..  rc = s
1cb0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1cc0: 32 28 70 54 61 62 2d 3e 64 62 2c 20 0a 20 20 20  2(pTab->db, .   
1cd0: 20 20 20 22 53 45 4c 45 43 54 20 27 73 71 6c 69     "SELECT 'sqli
1ce0: 74 65 5f 6d 61 73 74 65 72 27 20 41 53 20 6e 61  te_master' AS na
1cf0: 6d 65 2c 20 31 20 41 53 20 72 6f 6f 74 70 61 67  me, 1 AS rootpag
1d00: 65 2c 20 27 74 61 62 6c 65 27 20 41 53 20 74 79  e, 'table' AS ty
1d10: 70 65 22 0a 20 20 20 20 20 20 22 20 20 55 4e 49  pe".      "  UNI
1d20: 4f 4e 20 41 4c 4c 20 20 22 0a 20 20 20 20 20 20  ON ALL  ".      
1d30: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f  "SELECT name, ro
1d40: 6f 74 70 61 67 65 2c 20 74 79 70 65 20 46 52 4f  otpage, type FRO
1d50: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1d60: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 21 3d  WHERE rootpage!=
1d70: 30 22 0a 20 20 20 20 20 20 22 20 20 4f 52 44 45  0".      "  ORDE
1d80: 52 20 42 59 20 6e 61 6d 65 22 2c 20 2d 31 2c 0a  R BY name", -1,.
1d90: 20 20 20 20 20 20 26 70 43 73 72 2d 3e 70 53 74        &pCsr->pSt
1da0: 6d 74 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28  mt, 0.  );.  if(
1db0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1dd0: 65 65 28 70 43 73 72 29 3b 0a 20 20 20 20 72 65  ee(pCsr);.    re
1de0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1df0: 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71 6c  *ppCursor = (sql
1e00: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1e10: 20 2a 29 70 43 73 72 3b 0a 20 20 72 65 74 75 72   *)pCsr;.  retur
1e20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
1e40: 43 6c 65 61 72 50 61 67 65 28 53 74 61 74 50 61  ClearPage(StatPa
1e50: 67 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ge *p){.  int i;
1e60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1e70: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
1e80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e90: 2d 3e 61 43 65 6c 6c 5b 69 5d 2e 61 4f 76 66 6c  ->aCell[i].aOvfl
1ea0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1eb0: 50 61 67 65 72 55 6e 72 65 66 28 70 2d 3e 70 50  PagerUnref(p->pP
1ec0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
1ed0: 65 65 28 70 2d 3e 61 43 65 6c 6c 29 3b 0a 20 20  ee(p->aCell);.  
1ee0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1ef0: 7a 50 61 74 68 29 3b 0a 20 20 6d 65 6d 73 65 74  zPath);.  memset
1f00: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74  (p, 0, sizeof(St
1f10: 61 74 50 61 67 65 29 29 3b 0a 7d 0a 0a 73 74 61  atPage));.}..sta
1f20: 74 69 63 20 76 6f 69 64 20 73 74 61 74 52 65 73  tic void statRes
1f30: 65 74 43 73 72 28 53 74 61 74 43 75 72 73 6f 72  etCsr(StatCursor
1f40: 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69   *pCsr){.  int i
1f50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  ;.  sqlite3_rese
1f60: 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  t(pCsr->pStmt);.
1f70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
1f80: 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 50 61  aySize(pCsr->aPa
1f90: 67 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ge); i++){.    s
1fa0: 74 61 74 43 6c 65 61 72 50 61 67 65 28 26 70 43  tatClearPage(&pC
1fb0: 73 72 2d 3e 61 50 61 67 65 5b 69 5d 29 3b 0a 20  sr->aPage[i]);. 
1fc0: 20 7d 0a 20 20 70 43 73 72 2d 3e 69 50 61 67 65   }.  pCsr->iPage
1fd0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1fe0: 66 72 65 65 28 70 43 73 72 2d 3e 7a 50 61 74 68  free(pCsr->zPath
1ff0: 29 3b 0a 20 20 70 43 73 72 2d 3e 7a 50 61 74 68  );.  pCsr->zPath
2000: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
2010: 6c 6f 73 65 20 61 20 73 74 61 74 76 66 73 20 63  lose a statvfs c
2020: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
2030: 20 69 6e 74 20 73 74 61 74 43 6c 6f 73 65 28 73   int statClose(s
2040: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2050: 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
2060: 53 74 61 74 43 75 72 73 6f 72 20 2a 70 43 73 72  StatCursor *pCsr
2070: 20 3d 20 28 53 74 61 74 43 75 72 73 6f 72 20 2a   = (StatCursor *
2080: 29 70 43 75 72 73 6f 72 3b 0a 20 20 73 74 61 74  )pCursor;.  stat
2090: 52 65 73 65 74 43 73 72 28 70 43 73 72 29 3b 0a  ResetCsr(pCsr);.
20a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
20b0: 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ze(pCsr->pStmt);
20c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20d0: 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCsr);.  return 
20e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
20f0: 61 74 69 63 20 76 6f 69 64 20 67 65 74 4c 6f 63  atic void getLoc
2100: 61 6c 50 61 79 6c 6f 61 64 28 0a 20 20 69 6e 74  alPayload(.  int
2110: 20 6e 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20   nUsable,       
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2130: 55 73 61 62 6c 65 20 62 79 74 65 73 20 70 65 72  Usable bytes per
2140: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 66 6c   page */.  u8 fl
2150: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2170: 67 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  ge flags */.  in
2180: 74 20 6e 54 6f 74 61 6c 2c 20 20 20 20 20 20 20  t nTotal,       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a0: 20 54 6f 74 61 6c 20 72 65 63 6f 72 64 20 28 70   Total record (p
21b0: 61 79 6c 6f 61 64 29 20 73 69 7a 65 20 2a 2f 0a  ayload) size */.
21c0: 20 20 69 6e 74 20 2a 70 6e 4c 6f 63 61 6c 20 20    int *pnLocal  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74 65 73 20    /* OUT: Bytes 
21f0: 73 74 6f 72 65 64 20 6c 6f 63 61 6c 6c 79 20 2a  stored locally *
2200: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  /.){.  int nLoca
2210: 6c 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 4c 6f 63  l;.  int nMinLoc
2220: 61 6c 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 4c 6f  al;.  int nMaxLo
2230: 63 61 6c 3b 0a 20 0a 20 20 69 66 28 20 66 6c 61  cal;. .  if( fla
2240: 67 73 3d 3d 30 78 30 44 20 29 7b 20 20 20 20 20  gs==0x0D ){     
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2260: 65 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20  e leaf node */. 
2270: 20 20 20 6e 4d 69 6e 4c 6f 63 61 6c 20 3d 20 28     nMinLocal = (
2280: 6e 55 73 61 62 6c 65 20 2d 20 31 32 29 20 2a 20  nUsable - 12) * 
2290: 33 32 20 2f 20 32 35 35 20 2d 20 32 33 3b 0a 20  32 / 255 - 23;. 
22a0: 20 20 20 6e 4d 61 78 4c 6f 63 61 6c 20 3d 20 6e     nMaxLocal = n
22b0: 55 73 61 62 6c 65 20 2d 20 33 35 3b 0a 20 20 7d  Usable - 35;.  }
22c0: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e0: 2a 20 49 6e 64 65 78 20 69 6e 74 65 72 69 6f 72  * Index interior
22f0: 20 61 6e 64 20 6c 65 61 66 20 6e 6f 64 65 73 20   and leaf nodes 
2300: 2a 2f 0a 20 20 20 20 6e 4d 69 6e 4c 6f 63 61 6c  */.    nMinLocal
2310: 20 3d 20 28 6e 55 73 61 62 6c 65 20 2d 20 31 32   = (nUsable - 12
2320: 29 20 2a 20 33 32 20 2f 20 32 35 35 20 2d 20 32  ) * 32 / 255 - 2
2330: 33 3b 0a 20 20 20 20 6e 4d 61 78 4c 6f 63 61 6c  3;.    nMaxLocal
2340: 20 3d 20 28 6e 55 73 61 62 6c 65 20 2d 20 31 32   = (nUsable - 12
2350: 29 20 2a 20 36 34 20 2f 20 32 35 35 20 2d 20 32  ) * 64 / 255 - 2
2360: 33 3b 0a 20 20 7d 0a 0a 20 20 6e 4c 6f 63 61 6c  3;.  }..  nLocal
2370: 20 3d 20 6e 4d 69 6e 4c 6f 63 61 6c 20 2b 20 28   = nMinLocal + (
2380: 6e 54 6f 74 61 6c 20 2d 20 6e 4d 69 6e 4c 6f 63  nTotal - nMinLoc
2390: 61 6c 29 20 25 20 28 6e 55 73 61 62 6c 65 20 2d  al) % (nUsable -
23a0: 20 34 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 63 61   4);.  if( nLoca
23b0: 6c 3e 6e 4d 61 78 4c 6f 63 61 6c 20 29 20 6e 4c  l>nMaxLocal ) nL
23c0: 6f 63 61 6c 20 3d 20 6e 4d 69 6e 4c 6f 63 61 6c  ocal = nMinLocal
23d0: 3b 0a 20 20 2a 70 6e 4c 6f 63 61 6c 20 3d 20 6e  ;.  *pnLocal = n
23e0: 4c 6f 63 61 6c 3b 0a 7d 0a 0a 73 74 61 74 69 63  Local;.}..static
23f0: 20 69 6e 74 20 73 74 61 74 44 65 63 6f 64 65 50   int statDecodeP
2400: 61 67 65 28 42 74 72 65 65 20 2a 70 42 74 2c 20  age(Btree *pBt, 
2410: 53 74 61 74 50 61 67 65 20 2a 70 29 7b 0a 20 20  StatPage *p){.  
2420: 69 6e 74 20 6e 55 6e 75 73 65 64 3b 0a 20 20 69  int nUnused;.  i
2430: 6e 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 6e  nt iOff;.  int n
2440: 48 64 72 3b 0a 20 20 69 6e 74 20 69 73 4c 65 61  Hdr;.  int isLea
2450: 66 3b 0a 0a 20 20 75 38 20 2a 61 44 61 74 61 20  f;..  u8 *aData 
2460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2470: 74 44 61 74 61 28 70 2d 3e 70 50 67 29 3b 0a 20  tData(p->pPg);. 
2480: 20 75 38 20 2a 61 48 64 72 20 3d 20 26 61 44 61   u8 *aHdr = &aDa
2490: 74 61 5b 70 2d 3e 69 50 67 6e 6f 3d 3d 31 20 3f  ta[p->iPgno==1 ?
24a0: 20 31 30 30 20 3a 20 30 5d 3b 0a 0a 20 20 70 2d   100 : 0];..  p-
24b0: 3e 66 6c 61 67 73 20 3d 20 61 48 64 72 5b 30 5d  >flags = aHdr[0]
24c0: 3b 0a 20 20 70 2d 3e 6e 43 65 6c 6c 20 3d 20 67  ;.  p->nCell = g
24d0: 65 74 32 62 79 74 65 28 26 61 48 64 72 5b 33 5d  et2byte(&aHdr[3]
24e0: 29 3b 0a 20 20 70 2d 3e 6e 4d 78 50 61 79 6c 6f  );.  p->nMxPaylo
24f0: 61 64 20 3d 20 30 3b 0a 0a 20 20 69 73 4c 65 61  ad = 0;..  isLea
2500: 66 20 3d 20 28 70 2d 3e 66 6c 61 67 73 3d 3d 30  f = (p->flags==0
2510: 78 30 41 20 7c 7c 20 70 2d 3e 66 6c 61 67 73 3d  x0A || p->flags=
2520: 3d 30 78 30 44 29 3b 0a 20 20 6e 48 64 72 20 3d  =0x0D);.  nHdr =
2530: 20 31 32 20 2d 20 69 73 4c 65 61 66 2a 34 20 2b   12 - isLeaf*4 +
2540: 20 28 70 2d 3e 69 50 67 6e 6f 3d 3d 31 29 2a 31   (p->iPgno==1)*1
2550: 30 30 3b 0a 0a 20 20 6e 55 6e 75 73 65 64 20 3d  00;..  nUnused =
2560: 20 67 65 74 32 62 79 74 65 28 26 61 48 64 72 5b   get2byte(&aHdr[
2570: 35 5d 29 20 2d 20 6e 48 64 72 20 2d 20 32 2a 70  5]) - nHdr - 2*p
2580: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 6e 55 6e 75 73  ->nCell;.  nUnus
2590: 65 64 20 2b 3d 20 28 69 6e 74 29 61 48 64 72 5b  ed += (int)aHdr[
25a0: 37 5d 3b 0a 20 20 69 4f 66 66 20 3d 20 67 65 74  7];.  iOff = get
25b0: 32 62 79 74 65 28 26 61 48 64 72 5b 31 5d 29 3b  2byte(&aHdr[1]);
25c0: 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 20 29  .  while( iOff )
25d0: 7b 0a 20 20 20 20 6e 55 6e 75 73 65 64 20 2b 3d  {.    nUnused +=
25e0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
25f0: 5b 69 4f 66 66 2b 32 5d 29 3b 0a 20 20 20 20 69  [iOff+2]);.    i
2600: 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65 28 26  Off = get2byte(&
2610: 61 44 61 74 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  aData[iOff]);.  
2620: 7d 0a 20 20 70 2d 3e 6e 55 6e 75 73 65 64 20 3d  }.  p->nUnused =
2630: 20 6e 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 69   nUnused;.  p->i
2640: 52 69 67 68 74 43 68 69 6c 64 50 67 20 3d 20 69  RightChildPg = i
2650: 73 4c 65 61 66 20 3f 20 30 20 3a 20 73 71 6c 69  sLeaf ? 0 : sqli
2660: 74 65 33 47 65 74 34 62 79 74 65 28 26 61 48 64  te3Get4byte(&aHd
2670: 72 5b 38 5d 29 3b 0a 0a 20 20 69 66 28 20 70 2d  r[8]);..  if( p-
2680: 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 6e  >nCell ){.    in
2690: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
26b0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
26c0: 68 72 6f 75 67 68 20 63 65 6c 6c 73 20 2a 2f 0a  hrough cells */.
26d0: 20 20 20 20 69 6e 74 20 6e 55 73 61 62 6c 65 20      int nUsable 
26e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
26f0: 74 50 61 67 65 53 69 7a 65 28 70 42 74 29 20 2d  tPageSize(pBt) -
2700: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2710: 52 65 73 65 72 76 65 28 70 42 74 29 3b 0a 0a 20  Reserve(pBt);.. 
2720: 20 20 20 70 2d 3e 61 43 65 6c 6c 20 3d 20 73 71     p->aCell = sq
2730: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 28 70 2d  lite3_malloc((p-
2740: 3e 6e 43 65 6c 6c 2b 31 29 20 2a 20 73 69 7a 65  >nCell+1) * size
2750: 6f 66 28 53 74 61 74 43 65 6c 6c 29 29 3b 0a 20  of(StatCell));. 
2760: 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 43 65     memset(p->aCe
2770: 6c 6c 2c 20 30 2c 20 28 70 2d 3e 6e 43 65 6c 6c  ll, 0, (p->nCell
2780: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 74 61  +1) * sizeof(Sta
2790: 74 43 65 6c 6c 29 29 3b 0a 0a 20 20 20 20 66 6f  tCell));..    fo
27a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 65 6c  r(i=0; i<p->nCel
27b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53  l; i++){.      S
27c0: 74 61 74 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d  tatCell *pCell =
27d0: 20 26 70 2d 3e 61 43 65 6c 6c 5b 69 5d 3b 0a 0a   &p->aCell[i];..
27e0: 20 20 20 20 20 20 69 4f 66 66 20 3d 20 67 65 74        iOff = get
27f0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 6e 48 64  2byte(&aData[nHd
2800: 72 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69  r+i*2]);.      i
2810: 66 28 20 21 69 73 4c 65 61 66 20 29 7b 0a 20 20  f( !isLeaf ){.  
2820: 20 20 20 20 20 20 70 43 65 6c 6c 2d 3e 69 43 68        pCell->iCh
2830: 69 6c 64 50 67 20 3d 20 73 71 6c 69 74 65 33 47  ildPg = sqlite3G
2840: 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 69  et4byte(&aData[i
2850: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  Off]);.        i
2860: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
2870: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  }.      if( p->f
2880: 6c 61 67 73 3d 3d 30 78 30 35 20 29 7b 0a 20 20  lags==0x05 ){.  
2890: 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
28a0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
28b0: 6e 50 61 79 6c 6f 61 64 3d 3d 30 2e 20 2a 2f 0a  nPayload==0. */.
28c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28d0: 20 20 20 20 20 75 33 32 20 6e 50 61 79 6c 6f 61       u32 nPayloa
28e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
28f0: 2a 20 42 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  * Bytes of paylo
2900: 61 64 20 74 6f 74 61 6c 20 28 6c 6f 63 61 6c 2b  ad total (local+
2910: 6f 76 65 72 66 6c 6f 77 29 20 2a 2f 0a 20 20 20  overflow) */.   
2920: 20 20 20 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b       int nLocal;
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2940: 2a 20 42 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  * Bytes of paylo
2950: 61 64 20 73 74 6f 72 65 64 20 6c 6f 63 61 6c 6c  ad stored locall
2960: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4f 66  y */.        iOf
2970: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
2980: 28 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 6e  (&aData[iOff], n
2990: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
29a0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 3d 3d    if( p->flags==
29b0: 30 78 30 44 20 29 7b 0a 20 20 20 20 20 20 20 20  0x0D ){.        
29c0: 20 20 75 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    u64 dummy;.   
29d0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
29e0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
29f0: 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 26 64  &aData[iOff], &d
2a00: 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
2a10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
2a20: 79 6c 6f 61 64 3e 70 2d 3e 6e 4d 78 50 61 79 6c  yload>p->nMxPayl
2a30: 6f 61 64 20 29 20 70 2d 3e 6e 4d 78 50 61 79 6c  oad ) p->nMxPayl
2a40: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
2a50: 20 20 20 20 20 20 20 20 67 65 74 4c 6f 63 61 6c          getLocal
2a60: 50 61 79 6c 6f 61 64 28 6e 55 73 61 62 6c 65 2c  Payload(nUsable,
2a70: 20 70 2d 3e 66 6c 61 67 73 2c 20 6e 50 61 79 6c   p->flags, nPayl
2a80: 6f 61 64 2c 20 26 6e 4c 6f 63 61 6c 29 3b 0a 20  oad, &nLocal);. 
2a90: 20 20 20 20 20 20 20 70 43 65 6c 6c 2d 3e 6e 4c         pCell->nL
2aa0: 6f 63 61 6c 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  ocal = nLocal;. 
2ab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2ac0: 50 61 79 6c 6f 61 64 3e 3d 6e 4c 6f 63 61 6c 20  Payload>=nLocal 
2ad0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ae0: 74 28 20 6e 4c 6f 63 61 6c 3c 3d 28 6e 55 73 61  t( nLocal<=(nUsa
2af0: 62 6c 65 2d 33 35 29 20 29 3b 0a 20 20 20 20 20  ble-35) );.     
2b00: 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e     if( nPayload>
2b10: 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2b20: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2b30: 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
2b40: 20 28 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6e 4c   ((nPayload - nL
2b50: 6f 63 61 6c 29 20 2b 20 6e 55 73 61 62 6c 65 2d  ocal) + nUsable-
2b60: 34 20 2d 20 31 29 20 2f 20 28 6e 55 73 61 62 6c  4 - 1) / (nUsabl
2b70: 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20  e - 4);.        
2b80: 20 20 70 43 65 6c 6c 2d 3e 6e 4c 61 73 74 4f 76    pCell->nLastOv
2b90: 66 6c 20 3d 20 28 6e 50 61 79 6c 6f 61 64 2d 6e  fl = (nPayload-n
2ba0: 4c 6f 63 61 6c 29 20 2d 20 28 6e 4f 76 66 6c 2d  Local) - (nOvfl-
2bb0: 31 29 20 2a 20 28 6e 55 73 61 62 6c 65 2d 34 29  1) * (nUsable-4)
2bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
2bd0: 6c 2d 3e 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c  l->nOvfl = nOvfl
2be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
2bf0: 6c 2d 3e 61 4f 76 66 6c 20 3d 20 73 71 6c 69 74  l->aOvfl = sqlit
2c00: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
2c10: 28 75 33 32 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  (u32)*nOvfl);.  
2c20: 20 20 20 20 20 20 20 20 70 43 65 6c 6c 2d 3e 61          pCell->a
2c30: 4f 76 66 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ovfl[0] = sqlite
2c40: 33 47 65 74 34 62 79 74 65 28 26 61 44 61 74 61  3Get4byte(&aData
2c50: 5b 69 4f 66 66 2b 6e 4c 6f 63 61 6c 5d 29 3b 0a  [iOff+nLocal]);.
2c60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2c70: 31 3b 20 6a 3c 6e 4f 76 66 6c 3b 20 6a 2b 2b 29  1; j<nOvfl; j++)
2c80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2c90: 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t rc;.          
2ca0: 20 20 75 33 32 20 69 50 72 65 76 20 3d 20 70 43    u32 iPrev = pC
2cb0: 65 6c 6c 2d 3e 61 4f 76 66 6c 5b 6a 2d 31 5d 3b  ell->aOvfl[j-1];
2cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 62 50  .            DbP
2cd0: 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2ce0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2cf0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 73  qlite3PagerGet(s
2d00: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
2d10: 28 70 42 74 29 2c 20 69 50 72 65 76 2c 20 26 70  (pBt), iPrev, &p
2d20: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
2d30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 3d      assert( pPg=
2d60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2d70: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20             } .  
2d90: 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 2d            pCell-
2da0: 3e 61 4f 76 66 6c 5b 6a 5d 20 3d 20 73 71 6c 69  >aOvfl[j] = sqli
2db0: 74 65 33 47 65 74 34 62 79 74 65 28 73 71 6c 69  te3Get4byte(sqli
2dc0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2dd0: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
2de0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2df0: 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
2e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2e30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2e40: 20 4d 6f 76 65 20 61 20 73 74 61 74 76 66 73 20   Move a statvfs 
2e50: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
2e60: 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
2e70: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2e80: 69 6e 74 20 73 74 61 74 4e 65 78 74 28 73 71 6c  int statNext(sql
2e90: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2ea0: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e   *pCursor){.  in
2eb0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 79  t rc;.  int nPay
2ec0: 6c 6f 61 64 3b 0a 20 20 53 74 61 74 43 75 72 73  load;.  StatCurs
2ed0: 6f 72 20 2a 70 43 73 72 20 3d 20 28 53 74 61 74  or *pCsr = (Stat
2ee0: 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
2ef0: 3b 0a 20 20 53 74 61 74 54 61 62 6c 65 20 2a 70  ;.  StatTable *p
2f00: 54 61 62 20 3d 20 28 53 74 61 74 54 61 62 6c 65  Tab = (StatTable
2f10: 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61   *)pCursor->pVta
2f20: 62 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  b;.  Btree *pBt 
2f30: 3d 20 70 54 61 62 2d 3e 64 62 2d 3e 61 44 62 5b  = pTab->db->aDb[
2f40: 30 5d 2e 70 42 74 3b 0a 20 20 50 61 67 65 72 20  0].pBt;.  Pager 
2f50: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
2f60: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
2f70: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
2f80: 65 28 70 43 73 72 2d 3e 7a 50 61 74 68 29 3b 0a  e(pCsr->zPath);.
2f90: 20 20 70 43 73 72 2d 3e 7a 50 61 74 68 20 3d 20    pCsr->zPath = 
2fa0: 30 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  0;..  if( pCsr->
2fb0: 61 50 61 67 65 5b 30 5d 2e 70 50 67 3d 3d 30 20  aPage[0].pPg==0 
2fc0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2fd0: 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70  te3_step(pCsr->p
2fe0: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
2ff0: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
3000: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
3010: 3b 0a 20 20 20 20 20 20 75 33 32 20 69 52 6f 6f  ;.      u32 iRoo
3020: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
3030: 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70  mn_int64(pCsr->p
3040: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
3050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
3060: 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
3070: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
3080: 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
3090: 20 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66       pCsr->isEof
30a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
30b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
30c0: 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  et(pCsr->pStmt);
30d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30f0: 47 65 74 28 70 50 61 67 65 72 2c 20 69 52 6f 6f  Get(pPager, iRoo
3100: 74 2c 20 26 70 43 73 72 2d 3e 61 50 61 67 65 5b  t, &pCsr->aPage[
3110: 30 5d 2e 70 50 67 29 3b 0a 20 20 20 20 20 20 70  0].pPg);.      p
3120: 43 73 72 2d 3e 61 50 61 67 65 5b 30 5d 2e 69 50  Csr->aPage[0].iP
3130: 67 6e 6f 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 20  gno = iRoot;.   
3140: 20 20 20 70 43 73 72 2d 3e 61 50 61 67 65 5b 30     pCsr->aPage[0
3150: 5d 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  ].iCell = 0;.   
3160: 20 20 20 70 43 73 72 2d 3e 61 50 61 67 65 5b 30     pCsr->aPage[0
3170: 5d 2e 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65  ].zPath = sqlite
3180: 33 5f 6d 70 72 69 6e 74 66 28 22 2f 22 29 3b 0a  3_mprintf("/");.
3190: 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50 61 67        pCsr->iPag
31a0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
31b0: 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73  {.      pCsr->is
31c0: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Eof = 1;.      r
31d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
31e0: 73 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29  set(pCsr->pStmt)
31f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3200: 0a 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 70 20  ..    /* Page p 
3210: 69 74 73 65 6c 66 20 68 61 73 20 61 6c 72 65 61  itself has alrea
3220: 64 79 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e  dy been visited.
3230: 20 2a 2f 0a 20 20 20 20 53 74 61 74 50 61 67 65   */.    StatPage
3240: 20 2a 70 20 3d 20 26 70 43 73 72 2d 3e 61 50 61   *p = &pCsr->aPa
3250: 67 65 5b 70 43 73 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCsr->iPage];
3260: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ..    while( p->
3270: 69 43 65 6c 6c 3c 70 2d 3e 6e 43 65 6c 6c 20 29  iCell<p->nCell )
3280: 7b 0a 20 20 20 20 20 20 53 74 61 74 43 65 6c 6c  {.      StatCell
3290: 20 2a 70 43 65 6c 6c 20 3d 20 26 70 2d 3e 61 43   *pCell = &p->aC
32a0: 65 6c 6c 5b 70 2d 3e 69 43 65 6c 6c 5d 3b 0a 20  ell[p->iCell];. 
32b0: 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2d 3e       if( pCell->
32c0: 69 4f 76 66 6c 3c 70 43 65 6c 6c 2d 3e 6e 4f 76  iOvfl<pCell->nOv
32d0: 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  fl ){.        in
32e0: 74 20 6e 55 73 61 62 6c 65 20 3d 20 73 71 6c 69  t nUsable = sqli
32f0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
3300: 69 7a 65 28 70 42 74 29 2d 73 71 6c 69 74 65 33  ize(pBt)-sqlite3
3310: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
3320: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43  pBt);.        pC
3330: 73 72 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  sr->zName = (cha
3340: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
3350: 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e 70 53  mn_text(pCsr->pS
3360: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
3370: 20 70 43 73 72 2d 3e 69 50 61 67 65 6e 6f 20 3d   pCsr->iPageno =
3380: 20 70 43 65 6c 6c 2d 3e 61 4f 76 66 6c 5b 70 43   pCell->aOvfl[pC
3390: 65 6c 6c 2d 3e 69 4f 76 66 6c 5d 3b 0a 20 20 20  ell->iOvfl];.   
33a0: 20 20 20 20 20 70 43 73 72 2d 3e 7a 50 61 67 65       pCsr->zPage
33b0: 74 79 70 65 20 3d 20 22 6f 76 65 72 66 6c 6f 77  type = "overflow
33c0: 22 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  ";.        pCsr-
33d0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >nCell = 0;.    
33e0: 20 20 20 20 70 43 73 72 2d 3e 6e 4d 78 50 61 79      pCsr->nMxPay
33f0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  load = 0;.      
3400: 20 20 70 43 73 72 2d 3e 7a 50 61 74 68 20 3d 20    pCsr->zPath = 
3410: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73  .            "%s
3430: 25 2e 33 78 2b 25 2e 36 78 22 2c 20 70 2d 3e 7a  %.3x+%.6x", p->z
3440: 50 61 74 68 2c 20 70 2d 3e 69 43 65 6c 6c 2c 20  Path, p->iCell, 
3450: 70 43 65 6c 6c 2d 3e 69 4f 76 66 6c 0a 20 20 20  pCell->iOvfl.   
3460: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
3470: 69 66 28 20 70 43 65 6c 6c 2d 3e 69 4f 76 66 6c  if( pCell->iOvfl
3480: 3c 70 43 65 6c 6c 2d 3e 6e 4f 76 66 6c 2d 31 20  <pCell->nOvfl-1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  ){.          pCs
34a0: 72 2d 3e 6e 55 6e 75 73 65 64 20 3d 20 30 3b 0a  r->nUnused = 0;.
34b0: 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
34c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 55 73 61 62  nPayload = nUsab
34d0: 6c 65 20 2d 20 34 3b 0a 20 20 20 20 20 20 20 20  le - 4;.        
34e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34f0: 20 70 43 73 72 2d 3e 6e 50 61 79 6c 6f 61 64 20   pCsr->nPayload 
3500: 3d 20 70 43 65 6c 6c 2d 3e 6e 4c 61 73 74 4f 76  = pCell->nLastOv
3510: 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  fl;.          pC
3520: 73 72 2d 3e 6e 55 6e 75 73 65 64 20 3d 20 6e 55  sr->nUnused = nU
3530: 73 61 62 6c 65 20 2d 20 34 20 2d 20 70 43 73 72  sable - 4 - pCsr
3540: 2d 3e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  ->nPayload;.    
3550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
3560: 65 6c 6c 2d 3e 69 4f 76 66 6c 2b 2b 3b 0a 20 20  ell->iOvfl++;.  
3570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
3580: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
3590: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 69        if( p->iRi
35a0: 67 68 74 43 68 69 6c 64 50 67 20 29 20 62 72 65  ghtChildPg ) bre
35b0: 61 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 65  ak;.      p->iCe
35c0: 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ll++;.    }..   
35d0: 20 77 68 69 6c 65 28 20 21 70 2d 3e 69 52 69 67   while( !p->iRig
35e0: 68 74 43 68 69 6c 64 50 67 20 7c 7c 20 70 2d 3e  htChildPg || p->
35f0: 69 43 65 6c 6c 3e 70 2d 3e 6e 43 65 6c 6c 20 29  iCell>p->nCell )
3600: 7b 0a 20 20 20 20 20 20 73 74 61 74 43 6c 65 61  {.      statClea
3610: 72 50 61 67 65 28 70 29 3b 0a 20 20 20 20 20 20  rPage(p);.      
3620: 69 66 28 20 70 43 73 72 2d 3e 69 50 61 67 65 3d  if( pCsr->iPage=
3630: 3d 30 20 29 20 72 65 74 75 72 6e 20 73 74 61 74  =0 ) return stat
3640: 4e 65 78 74 28 70 43 75 72 73 6f 72 29 3b 0a 20  Next(pCursor);. 
3650: 20 20 20 20 20 70 43 73 72 2d 3e 69 50 61 67 65       pCsr->iPage
3660: 2d 2d 3b 0a 20 20 20 20 20 20 70 20 3d 20 26 70  --;.      p = &p
3670: 43 73 72 2d 3e 61 50 61 67 65 5b 70 43 73 72 2d  Csr->aPage[pCsr-
3680: 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 0a 20  >iPage];.    }. 
3690: 20 20 20 70 43 73 72 2d 3e 69 50 61 67 65 2b 2b     pCsr->iPage++
36a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 3d  ;.    assert( p=
36b0: 3d 26 70 43 73 72 2d 3e 61 50 61 67 65 5b 70 43  =&pCsr->aPage[pC
36c0: 73 72 2d 3e 69 50 61 67 65 2d 31 5d 20 29 3b 0a  sr->iPage-1] );.
36d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43 65 6c  .    if( p->iCel
36e0: 6c 3d 3d 70 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  l==p->nCell ){. 
36f0: 20 20 20 20 20 70 5b 31 5d 2e 69 50 67 6e 6f 20       p[1].iPgno 
3700: 3d 20 70 2d 3e 69 52 69 67 68 74 43 68 69 6c 64  = p->iRightChild
3710: 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
3720: 20 20 20 20 20 70 5b 31 5d 2e 69 50 67 6e 6f 20       p[1].iPgno 
3730: 3d 20 70 2d 3e 61 43 65 6c 6c 5b 70 2d 3e 69 43  = p->aCell[p->iC
3740: 65 6c 6c 5d 2e 69 43 68 69 6c 64 50 67 3b 0a 20  ell].iChildPg;. 
3750: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
3760: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
3770: 61 67 65 72 2c 20 70 5b 31 5d 2e 69 50 67 6e 6f  ager, p[1].iPgno
3780: 2c 20 26 70 5b 31 5d 2e 70 50 67 29 3b 0a 20 20  , &p[1].pPg);.  
3790: 20 20 70 5b 31 5d 2e 69 43 65 6c 6c 20 3d 20 30    p[1].iCell = 0
37a0: 3b 0a 20 20 20 20 70 5b 31 5d 2e 7a 50 61 74 68  ;.    p[1].zPath
37b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
37c0: 74 66 28 22 25 73 25 2e 33 78 2f 22 2c 20 70 2d  tf("%s%.3x/", p-
37d0: 3e 7a 50 61 74 68 2c 20 70 2d 3e 69 43 65 6c 6c  >zPath, p->iCell
37e0: 29 3b 0a 20 20 20 20 70 2d 3e 69 43 65 6c 6c 2b  );.    p->iCell+
37f0: 2b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 50 6f  +;.  }...  /* Po
3800: 70 75 6c 61 74 65 20 74 68 65 20 53 74 61 74 43  pulate the StatC
3810: 75 72 73 6f 72 20 66 69 65 6c 64 73 20 77 69 74  ursor fields wit
3820: 68 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  h the values to 
3830: 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
3840: 20 62 79 20 74 68 65 20 78 43 6f 6c 75 6d 6e 28   by the xColumn(
3850: 29 20 61 6e 64 20 78 52 6f 77 69 64 28 29 20 6d  ) and xRowid() m
3860: 65 74 68 6f 64 73 2e 0a 20 20 2a 2f 0a 20 20 69  ethods..  */.  i
3870: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3890: 20 20 20 53 74 61 74 50 61 67 65 20 2a 70 20 3d     StatPage *p =
38a0: 20 26 70 43 73 72 2d 3e 61 50 61 67 65 5b 70 43   &pCsr->aPage[pC
38b0: 73 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  sr->iPage];.    
38c0: 70 43 73 72 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pCsr->zName = (c
38d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
38e0: 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e  lumn_text(pCsr->
38f0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  pStmt, 0);.    p
3900: 43 73 72 2d 3e 69 50 61 67 65 6e 6f 20 3d 20 70  Csr->iPageno = p
3910: 2d 3e 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 73 74  ->iPgno;..    st
3920: 61 74 44 65 63 6f 64 65 50 61 67 65 28 70 42 74  atDecodePage(pBt
3930: 2c 20 70 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  , p);..    switc
3940: 68 28 20 70 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  h( p->flags ){. 
3950: 20 20 20 20 20 63 61 73 65 20 30 78 30 35 3a 20       case 0x05: 
3960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
3970: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 2a 2f  able internal */
3980: 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 30 32  .      case 0x02
3990: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :             /*
39a0: 20 69 6e 64 65 78 20 69 6e 74 65 72 6e 61 6c 20   index internal 
39b0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  */.        pCsr-
39c0: 3e 7a 50 61 67 65 74 79 70 65 20 3d 20 22 69 6e  >zPagetype = "in
39d0: 74 65 72 6e 61 6c 22 3b 0a 20 20 20 20 20 20 20  ternal";.       
39e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
39f0: 73 65 20 30 78 30 44 3a 20 20 20 20 20 20 20 20  se 0x0D:        
3a00: 20 20 20 20 20 2f 2a 20 74 61 62 6c 65 20 6c 65       /* table le
3a10: 61 66 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65  af */.      case
3a20: 20 30 78 30 41 3a 20 20 20 20 20 20 20 20 20 20   0x0A:          
3a30: 20 20 20 2f 2a 20 69 6e 64 65 78 20 6c 65 61 66     /* index leaf
3a40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 73 72   */.        pCsr
3a50: 2d 3e 7a 50 61 67 65 74 79 70 65 20 3d 20 22 6c  ->zPagetype = "l
3a60: 65 61 66 22 3b 0a 20 20 20 20 20 20 20 20 62 72  eaf";.        br
3a70: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
3a80: 6c 74 3a 0a 20 20 20 20 20 20 20 20 70 43 73 72  lt:.        pCsr
3a90: 2d 3e 7a 50 61 67 65 74 79 70 65 20 3d 20 22 63  ->zPagetype = "c
3aa0: 6f 72 72 75 70 74 65 64 22 3b 0a 20 20 20 20 20  orrupted";.     
3ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ac0: 20 20 20 20 70 43 73 72 2d 3e 6e 43 65 6c 6c 20      pCsr->nCell 
3ad0: 3d 20 70 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  = p->nCell;.    
3ae0: 70 43 73 72 2d 3e 6e 55 6e 75 73 65 64 20 3d 20  pCsr->nUnused = 
3af0: 70 2d 3e 6e 55 6e 75 73 65 64 3b 0a 20 20 20 20  p->nUnused;.    
3b00: 70 43 73 72 2d 3e 6e 4d 78 50 61 79 6c 6f 61 64  pCsr->nMxPayload
3b10: 20 3d 20 70 2d 3e 6e 4d 78 50 61 79 6c 6f 61 64   = p->nMxPayload
3b20: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a 50 61 74  ;.    pCsr->zPat
3b30: 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  h = sqlite3_mpri
3b40: 6e 74 66 28 22 25 73 22 2c 20 70 2d 3e 7a 50 61  ntf("%s", p->zPa
3b50: 74 68 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  th);.    nPayloa
3b60: 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  d = 0;.    for(i
3b70: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 65 6c 6c 3b 20  =0; i<p->nCell; 
3b80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 50 61 79  i++){.      nPay
3b90: 6c 6f 61 64 20 2b 3d 20 70 2d 3e 61 43 65 6c 6c  load += p->aCell
3ba0: 5b 69 5d 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  [i].nLocal;.    
3bb0: 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e 50 61 79  }.    pCsr->nPay
3bc0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
3bd0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
3be0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
3bf0: 20 73 74 61 74 45 6f 66 28 73 71 6c 69 74 65 33   statEof(sqlite3
3c00: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
3c10: 75 72 73 6f 72 29 7b 0a 20 20 53 74 61 74 43 75  ursor){.  StatCu
3c20: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 53 74  rsor *pCsr = (St
3c30: 61 74 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73  atCursor *)pCurs
3c40: 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 73  or;.  return pCs
3c50: 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 73 74 61  r->isEof;.}..sta
3c60: 74 69 63 20 69 6e 74 20 73 74 61 74 46 69 6c 74  tic int statFilt
3c70: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
3c80: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
3c90: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
3ca0: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
3cb0: 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
3cc0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
3cd0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61   **argv.){.  Sta
3ce0: 74 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  tCursor *pCsr = 
3cf0: 28 53 74 61 74 43 75 72 73 6f 72 20 2a 29 70 43  (StatCursor *)pC
3d00: 75 72 73 6f 72 3b 0a 0a 20 20 73 74 61 74 52 65  ursor;..  statRe
3d10: 73 65 74 43 73 72 28 28 53 74 61 74 43 75 72 73  setCsr((StatCurs
3d20: 6f 72 20 2a 29 70 43 75 72 73 6f 72 29 3b 0a 20  or *)pCursor);. 
3d30: 20 72 65 74 75 72 6e 20 73 74 61 74 4e 65 78 74   return statNext
3d40: 28 70 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 73 74  (pCursor);.}..st
3d50: 61 74 69 63 20 69 6e 74 20 73 74 61 74 43 6f 6c  atic int statCol
3d60: 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
3d70: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
3d80: 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
3d90: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
3da0: 20 69 6e 74 20 69 0a 29 7b 0a 20 20 53 74 61 74   int i.){.  Stat
3db0: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
3dc0: 53 74 61 74 43 75 72 73 6f 72 20 2a 29 70 43 75  StatCursor *)pCu
3dd0: 72 73 6f 72 3b 0a 20 20 73 77 69 74 63 68 28 20  rsor;.  switch( 
3de0: 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  i ){.    case 0:
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
3e00: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ame */.      sql
3e10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
3e20: 28 63 74 78 2c 20 70 43 73 72 2d 3e 7a 4e 61 6d  (ctx, pCsr->zNam
3e30: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  e, -1, SQLITE_ST
3e40: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
3e50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  ak;.    case 1: 
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61             /* pa
3e70: 74 68 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  th */.      sqli
3e80: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3e90: 63 74 78 2c 20 70 43 73 72 2d 3e 7a 50 61 74 68  ctx, pCsr->zPath
3ea0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
3eb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62  NSIENT);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 32  reak;.    case 2
3ed0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  :            /* 
3ee0: 70 61 67 65 6e 6f 20 2a 2f 0a 20 20 20 20 20 20  pageno */.      
3ef0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3f00: 6e 74 36 34 28 63 74 78 2c 20 70 43 73 72 2d 3e  nt64(ctx, pCsr->
3f10: 69 50 61 67 65 6e 6f 29 3b 0a 20 20 20 20 20 20  iPageno);.      
3f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3f30: 33 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  3:            /*
3f40: 20 70 61 67 65 74 79 70 65 20 2a 2f 0a 20 20 20   pagetype */.   
3f50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3f60: 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 73 72  t_text(ctx, pCsr
3f70: 2d 3e 7a 50 61 67 65 74 79 70 65 2c 20 2d 31 2c  ->zPagetype, -1,
3f80: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
3f90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3fa0: 20 20 63 61 73 65 20 34 3a 20 20 20 20 20 20 20    case 4:       
3fb0: 20 20 20 20 20 2f 2a 20 6e 63 65 6c 6c 20 2a 2f       /* ncell */
3fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3fd0: 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
3fe0: 43 73 72 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  Csr->nCell);.   
3ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
4000: 73 65 20 35 3a 20 20 20 20 20 20 20 20 20 20 20  se 5:           
4010: 20 2f 2a 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20   /* payload */. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4030: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 73  ult_int(ctx, pCs
4040: 72 2d 3e 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r->nPayload);.  
4050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
4060: 61 73 65 20 36 3a 20 20 20 20 20 20 20 20 20 20  ase 6:          
4070: 20 20 2f 2a 20 75 6e 75 73 65 64 20 2a 2f 0a 20    /* unused */. 
4080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4090: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 73  ult_int(ctx, pCs
40a0: 72 2d 3e 6e 55 6e 75 73 65 64 29 3b 0a 20 20 20  r->nUnused);.   
40b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
40c0: 73 65 20 37 3a 20 20 20 20 20 20 20 20 20 20 20  se 7:           
40d0: 20 2f 2a 20 6d 78 5f 70 61 79 6c 6f 61 64 20 2a   /* mx_payload *
40e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
40f0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
4100: 70 43 73 72 2d 3e 6e 4d 78 50 61 79 6c 6f 61 64  pCsr->nMxPayload
4110: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4120: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4130: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
4140: 63 20 69 6e 74 20 73 74 61 74 52 6f 77 69 64 28  c int statRowid(
4150: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
4160: 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71  sor *pCursor, sq
4170: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
4180: 69 64 29 7b 0a 20 20 53 74 61 74 43 75 72 73 6f  id){.  StatCurso
4190: 72 20 2a 70 43 73 72 20 3d 20 28 53 74 61 74 43  r *pCsr = (StatC
41a0: 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72 3b  ursor *)pCursor;
41b0: 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73  .  *pRowid = pCs
41c0: 72 2d 3e 69 50 61 67 65 6e 6f 3b 0a 20 20 72 65  r->iPageno;.  re
41d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
41e0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  }..int sqlite3_d
41f0: 62 73 74 61 74 5f 72 65 67 69 73 74 65 72 28 73  bstat_register(s
4200: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
4210: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
4220: 64 75 6c 65 20 64 62 73 74 61 74 5f 6d 6f 64 75  dule dbstat_modu
4230: 6c 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20  le = {.    0,   
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
4260: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 74 61 74  sion */.    stat
4270: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
4280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72            /* xCr
4290: 65 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74  eate */.    stat
42a0: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
42b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
42c0: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 73 74 61  nnect */.    sta
42d0: 74 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  tBestIndex,     
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
42f0: 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 20 20  estIndex */.    
4300: 73 74 61 74 44 69 73 63 6f 6e 6e 65 63 74 2c 20  statDisconnect, 
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a   xDisconnect */.
4330: 20 20 20 20 73 74 61 74 44 69 73 63 6f 6e 6e 65      statDisconne
4340: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
4350: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
4360: 0a 20 20 20 20 73 74 61 74 4f 70 65 6e 2c 20 20  .    statOpen,  
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
4390: 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
43a0: 20 20 20 73 74 61 74 43 6c 6f 73 65 2c 20 20 20     statClose,   
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
43d0: 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
43e0: 20 20 20 73 74 61 74 46 69 6c 74 65 72 2c 20 20     statFilter,  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
4410: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
4420: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
4430: 73 74 61 74 4e 65 78 74 2c 20 20 20 20 20 20 20  statNext,       
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4450: 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
4460: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20   a cursor */.   
4470: 20 73 74 61 74 45 6f 66 2c 20 20 20 20 20 20 20   statEof,       
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66  * xEof - check f
44a0: 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a  or end of scan *
44b0: 2f 0a 20 20 20 20 73 74 61 74 43 6f 6c 75 6d 6e  /.    statColumn
44c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
44d0: 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
44e0: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
44f0: 20 20 73 74 61 74 52 6f 77 69 64 2c 20 20 20 20    statRowid,    
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
4520: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 30 2c 20   data */.    0, 
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
4550: 70 64 61 74 65 20 2a 2f 0a 20 20 20 20 30 2c 20  pdate */.    0, 
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
4580: 65 67 69 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20  egin */.    0,  
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
45b0: 6e 63 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  nc */.    0,    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
45e0: 69 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  it */.    0,    
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
4610: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 30 2c 20 20  back */.    0,  
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
4640: 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20  ndMethod */.    
4650: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4670: 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 7d 3b   xRename */.  };
4680: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
4690: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 64 62  e_module(db, "db
46a0: 73 74 61 74 22 2c 20 26 64 62 73 74 61 74 5f 6d  stat", &dbstat_m
46b0: 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74  odule, 0);.  ret
46c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
46d0: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ..#endif..#ifdef
46e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 69 6e   SQLITE_TEST.#in
46f0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 73  clude <tcl.h>..s
4700: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
4710: 62 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a 63  bstat(.  void *c
4720: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
4730: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4740: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
4750: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
4760: 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20 53  jv[].){.#ifdef S
4770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4780: 41 4c 54 41 42 4c 45 0a 20 20 54 63 6c 5f 41 70  ALTABLE.  Tcl_Ap
4790: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
47a0: 70 2c 20 22 64 62 73 74 61 74 20 6e 6f 74 20 61  p, "dbstat not a
47b0: 76 61 69 6c 61 62 6c 65 20 62 65 63 61 75 73 65  vailable because
47c0: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 20 20   of ".          
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 22 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   "SQLITE_OMIT_VI
47f0: 52 54 55 41 4c 54 41 42 4c 45 22 2c 20 28 76 6f  RTUALTABLE", (vo
4800: 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  id*)0);.  return
4810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
4820: 65 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  e.  struct Sqlit
4830: 65 44 62 20 7b 20 73 71 6c 69 74 65 33 20 2a 64  eDb { sqlite3 *d
4840: 62 3b 20 7d 3b 0a 20 20 63 68 61 72 20 2a 7a 44  b; };.  char *zD
4850: 62 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  b;.  Tcl_CmdInfo
4860: 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20 20 69 66 28   cmdInfo;..  if(
4870: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
4880: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4890: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
48a0: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
48b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
48c0: 20 7d 0a 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f   }..  zDb = Tcl_
48d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
48e0: 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
48f0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
4900: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
4910: 66 6f 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fo) ){.    sqlit
4920: 65 33 2a 20 64 62 20 3d 20 28 28 73 74 72 75 63  e3* db = ((struc
4930: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
4940: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
4950: 61 29 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69  a)->db;.    sqli
4960: 74 65 33 5f 64 62 73 74 61 74 5f 72 65 67 69 73  te3_dbstat_regis
4970: 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ter(db);.  }.  r
4980: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65  eturn TCL_OK;.#e
4990: 6e 64 69 66 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69  ndif.}..int Sqli
49a0: 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28  tetestStat_Init(
49b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
49c0: 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
49d0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
49e0: 72 70 2c 20 22 72 65 67 69 73 74 65 72 5f 64 62  rp, "register_db
49f0: 73 74 61 74 5f 76 74 61 62 22 2c 20 74 65 73 74  stat_vtab", test
4a00: 5f 64 62 73 74 61 74 2c 20 30 2c 20 30 29 3b 0a  _dbstat, 0, 0);.
4a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4a20: 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.