/ Hex Artifact Content
Login

Artifact 529255dc704289001b225d97e57e0cfa14b29c3f281c7349cfa8fdb655de79ae:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 31 31 2d 31 36  /*.** 2015-11-16
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 76 69 72  implements a vir
0190: 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72 20 53  tual table for S
01a0: 51 4c 69 74 65 33 20 61 72 6f 75 6e 64 20 74 68  QLite3 around th
01b0: 65 20 4c 53 4d 0a 2a 2a 20 73 74 6f 72 61 67 65  e LSM.** storage
01c0: 20 65 6e 67 69 6e 65 20 66 72 6f 6d 20 53 51 4c   engine from SQL
01d0: 69 74 65 34 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47  ite4..**.** USAG
01e0: 45 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  E.**.**   CREATE
01f0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
0200: 65 6d 6f 20 55 53 49 4e 47 20 6c 73 6d 31 28 66  emo USING lsm1(f
0210: 69 6c 65 6e 61 6d 65 2c 6b 65 79 2c 6b 65 79 74  ilename,key,keyt
0220: 79 70 65 2c 76 61 6c 75 65 31 2c 2e 2e 2e 29 3b  ype,value1,...);
0230: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 6e  .**.** The filen
0240: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ame parameter is
0250: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0260: 20 4c 53 4d 20 64 61 74 61 62 61 73 65 20 66 69   LSM database fi
0270: 6c 65 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  le, which is.** 
0280: 73 65 70 61 72 61 74 65 20 61 6e 64 20 64 69 73  separate and dis
0290: 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20 53  tinct from the S
02a0: 51 4c 69 74 65 33 20 64 61 74 61 62 61 73 65 20  QLite3 database 
02b0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
02c0: 6b 65 79 74 79 70 65 20 6d 75 73 74 20 62 65 20  keytype must be 
02d0: 6f 6e 65 20 6f 66 3a 20 55 49 4e 54 2c 20 54 45  one of: UINT, TE
02e0: 58 54 2c 20 42 4c 4f 42 2e 20 20 41 6c 6c 20 6b  XT, BLOB.  All k
02f0: 65 79 73 20 6d 75 73 74 20 62 65 20 6f 66 20 74  eys must be of t
0300: 68 61 74 0a 2a 2a 20 6f 6e 65 20 74 79 70 65 2e  hat.** one type.
0310: 20 20 22 55 49 4e 54 22 20 6d 65 61 6e 73 20 75    "UINT" means u
0320: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
0330: 20 20 54 68 65 20 76 61 6c 75 65 73 20 6d 61 79    The values may
0340: 20 62 65 20 6f 66 20 61 6e 79 0a 2a 2a 20 53 51   be of any.** SQ
0350: 4c 69 74 65 20 64 61 74 61 74 79 70 65 3a 20 42  Lite datatype: B
0360: 4c 4f 42 2c 20 54 45 58 54 2c 20 49 4e 54 45 47  LOB, TEXT, INTEG
0370: 45 52 2c 20 46 4c 4f 41 54 2c 20 6f 72 20 4e 55  ER, FLOAT, or NU
0380: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  LL..**.** The vi
0390: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74  rtual table cont
03a0: 61 69 6e 73 20 72 65 61 64 2d 6f 6e 6c 79 20 68  ains read-only h
03b0: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 3a 0a 2a  idden columns:.*
03c0: 2a 0a 2a 2a 20 20 20 20 20 6c 73 6d 31 5f 6b 65  *.**     lsm1_ke
03d0: 79 09 20 20 20 20 20 20 41 20 42 4c 4f 42 20 77  y.      A BLOB w
03e0: 68 69 63 68 20 69 73 20 74 68 65 20 72 61 77 20  hich is the raw 
03f0: 4c 53 4d 20 6b 65 79 2e 20 20 49 66 20 74 68 65  LSM key.  If the
0400: 20 22 6b 65 79 74 79 70 65 22 0a 2a 2a 20 20 20   "keytype".**   
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0420: 20 69 73 20 42 4c 4f 42 20 6f 72 20 54 45 58 54   is BLOB or TEXT
0430: 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6c 75 6d   then this colum
0440: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
0450: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0460: 20 20 20 20 20 20 20 73 61 6d 65 20 61 73 20 74         same as t
0470: 68 65 20 6b 65 79 2e 20 20 46 6f 72 20 74 68 65  he key.  For the
0480: 20 55 49 4e 54 20 6b 65 79 74 79 70 65 2c 20 74   UINT keytype, t
0490: 68 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  his column.**   
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04b0: 20 77 69 6c 6c 20 62 65 20 61 20 76 61 72 69 61   will be a varia
04c0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
04d0: 65 72 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  er encoding of t
04e0: 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  he key..**.**   
04f0: 20 20 6c 73 6d 31 5f 76 61 6c 75 65 20 20 20 20    lsm1_value    
0500: 20 41 20 42 4c 4f 42 20 77 68 69 63 68 20 69 73   A BLOB which is
0510: 20 74 68 65 20 72 61 77 20 4c 53 4d 20 76 61 6c   the raw LSM val
0520: 75 65 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 20  ue.  All of the 
0530: 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20 20  value.**        
0540: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
0550: 6d 6e 73 20 61 72 65 20 70 61 63 6b 65 64 20 69  mns are packed i
0560: 6e 74 6f 20 74 68 69 73 20 42 4c 4f 42 20 75 73  nto this BLOB us
0570: 69 6e 67 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ing the encoding
0580: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0590: 20 20 20 20 20 20 20 64 65 73 63 72 69 62 65 64         described
05a0: 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 41 74   below..**.** At
05b0: 74 65 6d 70 74 73 20 74 6f 20 77 72 69 74 65 20  tempts to write 
05c0: 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68 65 20  values into the 
05d0: 6c 73 6d 31 5f 6b 65 79 20 61 6e 64 20 6c 73 6d  lsm1_key and lsm
05e0: 31 5f 76 61 6c 75 65 20 63 6f 6c 75 6d 6e 73 20  1_value columns 
05f0: 61 72 65 0a 2a 2a 20 73 69 6c 65 6e 74 6c 79 20  are.** silently 
0600: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  ignored..**.** E
0610: 58 41 4d 50 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 65  XAMPLE.**.** The
0620: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   virtual table d
0630: 65 63 6c 61 72 65 64 20 74 68 69 73 20 77 61 79  eclared this way
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
0650: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0660: 64 65 6d 6f 32 20 55 53 49 4e 47 20 6c 73 6d 31  demo2 USING lsm1
0670: 28 27 78 2e 6c 73 6d 27 2c 69 64 2c 55 49 4e 54  ('x.lsm',id,UINT
0680: 2c 61 2c 62 2c 63 2c 64 29 3b 0a 2a 2a 0a 2a 2a  ,a,b,c,d);.**.**
0690: 20 52 65 73 75 6c 74 73 20 69 6e 20 61 20 6e 65   Results in a ne
06a0: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  w virtual table 
06b0: 6e 61 6d 65 64 20 22 64 65 6d 6f 32 22 20 74 68  named "demo2" th
06c0: 61 74 20 61 63 74 73 20 61 73 20 69 66 20 69 74  at acts as if it
06d0: 20 68 61 73 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c   has.** the foll
06e0: 6f 77 69 6e 67 20 73 63 68 65 6d 61 3a 0a 2a 2a  owing schema:.**
06f0: 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41  .**    CREATE TA
0700: 42 4c 45 20 64 65 6d 6f 32 28 0a 2a 2a 20 20 20  BLE demo2(.**   
0710: 20 20 20 69 64 20 55 49 4e 54 20 50 52 49 4d 41     id UINT PRIMA
0720: 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49  RY KEY ON CONFLI
0730: 43 54 20 52 45 50 4c 41 43 45 2c 0a 2a 2a 20 20  CT REPLACE,.**  
0740: 20 20 20 20 61 20 41 4e 59 2c 0a 2a 2a 20 20 20      a ANY,.**   
0750: 20 20 20 62 20 41 4e 59 2c 0a 2a 2a 20 20 20 20     b ANY,.**    
0760: 20 20 63 20 41 4e 59 2c 0a 2a 2a 20 20 20 20 20    c ANY,.**     
0770: 20 64 20 41 4e 59 2c 0a 2a 2a 20 20 20 20 20 20   d ANY,.**      
0780: 6c 73 6d 31 5f 6b 65 79 20 42 4c 4f 42 20 48 49  lsm1_key BLOB HI
0790: 44 44 45 4e 2c 0a 2a 2a 20 20 20 20 20 20 6c 73  DDEN,.**      ls
07a0: 6d 31 5f 76 61 6c 75 65 20 42 4c 4f 42 20 48 49  m1_value BLOB HI
07b0: 44 44 45 4e 0a 2a 2a 20 20 20 20 29 20 57 49 54  DDEN.**    ) WIT
07c0: 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a  HOUT ROWID;.**.*
07d0: 2a 20 0a 2a 2a 0a 2a 2a 20 49 4e 54 45 52 4e 41  * .**.** INTERNA
07e0: 4c 53 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6b 65 79  LS.**.** The key
07f0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 42 4c   encoding for BL
0800: 4f 42 20 61 6e 64 20 54 45 58 54 20 69 73 20 6a  OB and TEXT is j
0810: 75 73 74 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ust a copy of th
0820: 65 20 62 6c 6f 62 20 6f 72 20 74 65 78 74 2e 0a  e blob or text..
0830: 2a 2a 20 55 54 46 2d 38 20 69 73 20 75 73 65 64  ** UTF-8 is used
0840: 20 66 6f 72 20 74 65 78 74 2e 20 20 54 68 65 20   for text.  The 
0850: 6b 65 79 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  key encoding for
0860: 20 55 49 4e 54 20 69 73 20 74 68 65 20 76 61 72   UINT is the var
0870: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 0a 2a 2a 20  iable-length.** 
0880: 69 6e 74 65 67 65 72 20 66 6f 72 6d 61 74 20 61  integer format a
0890: 74 20 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65  t https://sqlite
08a0: 2e 6f 72 67 2f 73 72 63 34 2f 64 6f 63 2f 74 72  .org/src4/doc/tr
08b0: 75 6e 6b 2f 77 77 77 2f 76 61 72 69 6e 74 2e 77  unk/www/varint.w
08c0: 69 6b 69 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  iki..**.** The v
08d0: 61 6c 75 65 73 20 61 72 65 20 65 6e 63 6f 64 65  alues are encode
08e0: 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  d as a single bl
08f0: 6f 62 20 28 73 69 6e 63 65 20 74 68 61 74 20 69  ob (since that i
0900: 73 20 77 68 61 74 20 6c 73 6d 20 73 74 6f 72 65  s what lsm store
0910: 73 20 61 73 0a 2a 2a 20 69 74 73 20 63 6f 6e 74  s as.** its cont
0920: 65 6e 74 29 2e 20 20 54 68 65 72 65 20 69 73 20  ent).  There is 
0930: 61 20 22 74 79 70 65 20 69 6e 74 65 67 65 72 22  a "type integer"
0940: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 22 63 6f   followed by "co
0950: 6e 74 65 6e 74 22 20 66 6f 72 20 65 61 63 68 0a  ntent" for each.
0960: 2a 2a 20 76 61 6c 75 65 2c 20 61 6c 74 65 72 6e  ** value, altern
0970: 61 74 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 66  ating back and f
0980: 6f 72 74 68 2e 20 20 54 68 65 20 63 6f 6e 74 65  orth.  The conte
0990: 6e 74 20 6d 69 67 68 74 20 62 65 20 65 6d 70 74  nt might be empt
09a0: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 59 50 45  y..**.**    TYPE
09b0: 31 20 20 43 4f 4e 54 45 4e 54 31 20 20 54 59 50  1  CONTENT1  TYP
09c0: 45 32 20 20 43 4f 4e 54 45 4e 54 32 20 20 54 59  E2  CONTENT2  TY
09d0: 50 45 33 20 20 43 4f 4e 54 45 4e 54 33 20 2e 2e  PE3  CONTENT3 ..
09e0: 2e 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 22 74  ...**.** Each "t
09f0: 79 70 65 20 69 6e 74 65 67 65 72 22 20 69 73 20  ype integer" is 
0a00: 65 6e 63 6f 64 65 64 20 61 73 20 61 20 76 61 72  encoded as a var
0a10: 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74  iable-length int
0a20: 65 67 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 66  eger in the.** f
0a30: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6c 69 6e  ormat of the lin
0a40: 6b 20 61 62 6f 76 65 2e 20 20 4c 65 74 20 74 68  k above.  Let th
0a50: 65 20 74 79 70 65 20 69 6e 74 65 67 65 72 20 62  e type integer b
0a60: 65 20 54 2e 20 20 54 68 65 20 61 63 74 75 61 6c  e T.  The actual
0a70: 0a 2a 2a 20 64 61 74 61 74 79 70 65 20 69 73 20  .** datatype is 
0a80: 61 6e 20 69 6e 74 65 67 65 72 20 30 2d 35 20 65  an integer 0-5 e
0a90: 71 75 61 6c 20 74 6f 20 54 25 36 2e 20 20 56 61  qual to T%6.  Va
0aa0: 6c 75 65 73 20 31 20 74 68 72 6f 75 67 68 20 35  lues 1 through 5
0ab0: 20 63 6f 72 72 65 73 70 6f 6e 64 0a 2a 2a 20 74   correspond.** t
0ac0: 6f 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  o SQLITE_INTEGER
0ad0: 20 74 68 72 6f 75 67 68 20 53 51 4c 49 54 45 5f   through SQLITE_
0ae0: 4e 55 4c 4c 2e 20 20 54 68 65 20 73 69 7a 65 20  NULL.  The size 
0af0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  of the content i
0b00: 6e 20 62 79 74 65 73 0a 2a 2a 20 69 73 20 54 2f  n bytes.** is T/
0b10: 36 2e 20 20 54 79 70 65 20 76 61 6c 75 65 20 30  6.  Type value 0
0b20: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0b30: 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65  value is an inte
0b40: 67 65 72 20 77 68 6f 73 65 20 61 63 74 75 61 6c  ger whose actual
0b50: 0a 2a 2a 20 76 61 6c 75 65 73 20 69 73 20 54 2f  .** values is T/
0b60: 36 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  6 and there is n
0b70: 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 54 68 65 20  o content.  The 
0b80: 74 79 70 65 2d 76 61 6c 75 65 2d 30 20 69 6e 74  type-value-0 int
0b90: 65 67 65 72 20 66 6f 72 6d 61 74 0a 2a 2a 20 6f  eger format.** o
0ba0: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e  nly works for in
0bb0: 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 72 61  tegers in the ra
0bc0: 6e 67 65 20 6f 66 20 30 20 74 68 72 6f 75 67 68  nge of 0 through
0bd0: 20 34 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   40..**.** There
0be0: 20 69 73 20 6e 6f 20 63 6f 6e 74 65 6e 74 20 66   is no content f
0bf0: 6f 72 20 4e 55 4c 4c 20 6f 72 20 74 79 70 65 2d  or NULL or type-
0c00: 30 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  0 integers.  For
0c10: 20 42 4c 4f 42 20 61 6e 64 20 54 45 58 54 0a 2a   BLOB and TEXT.*
0c20: 2a 20 76 61 6c 75 65 73 2c 20 74 68 65 20 63 6f  * values, the co
0c30: 6e 74 65 6e 74 20 69 73 20 74 68 65 20 62 6c 6f  ntent is the blo
0c40: 62 20 64 61 74 61 20 6f 72 20 74 68 65 20 55 54  b data or the UT
0c50: 46 2d 38 20 74 65 78 74 20 64 61 74 61 2e 20 20  F-8 text data.  
0c60: 46 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67 61 74  For.** non-negat
0c70: 69 76 65 20 69 6e 74 65 67 65 72 73 20 58 2c 20  ive integers X, 
0c80: 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 61  the content is a
0c90: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
0ca0: 20 69 6e 74 65 67 65 72 20 58 2a 32 2e 0a 2a 2a   integer X*2..**
0cb0: 20 46 6f 72 20 6e 65 67 61 74 69 76 65 20 69 6e   For negative in
0cc0: 74 65 67 65 72 73 20 59 2c 20 74 68 65 20 63 6f  tegers Y, the co
0cd0: 6e 74 65 6e 74 20 69 73 20 76 61 72 61 69 62 6c  ntent is varaibl
0ce0: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
0cf0: 20 28 31 2d 59 29 2a 32 2b 31 2e 0a 2a 2a 20 46   (1-Y)*2+1..** F
0d00: 6f 72 20 46 4c 4f 41 54 20 76 61 6c 75 65 73 2c  or FLOAT values,
0d10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
0d20: 74 68 65 20 49 45 45 45 37 35 34 20 66 6c 6f 61  the IEEE754 floa
0d30: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
0d40: 20 69 6e 0a 2a 2a 20 6e 61 74 69 76 65 20 62 79   in.** native by
0d50: 74 65 2d 6f 72 64 65 72 2e 20 20 54 68 69 73 20  te-order.  This 
0d60: 6d 65 61 6e 73 20 74 68 61 74 20 46 4c 4f 41 54  means that FLOAT
0d70: 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20   values will be 
0d80: 63 6f 72 72 75 70 74 65 64 20 77 68 65 6e 0a 2a  corrupted when.*
0d90: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
0da0: 69 73 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e  is moved between
0db0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 61 6e 64 20   big-endian and 
0dc0: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61  little-endian ma
0dd0: 63 68 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c  chines..*/.#incl
0de0: 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e  ude "sqlite3ext.
0df0: 68 22 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  h".SQLITE_EXTENS
0e00: 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75  ION_INIT1.#inclu
0e10: 64 65 20 22 6c 73 6d 2e 68 22 0a 23 69 6e 63 6c  de "lsm.h".#incl
0e20: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0e30: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0e40: 68 3e 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  h>../* Forward d
0e50: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 73 75  eclaration of su
0e60: 62 63 6c 61 73 73 65 73 20 6f 66 20 76 69 72 74  bclasses of virt
0e70: 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual table object
0e80: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
0e90: 75 63 74 20 6c 73 6d 31 5f 76 74 61 62 20 6c 73  uct lsm1_vtab ls
0ea0: 6d 31 5f 76 74 61 62 3b 0a 74 79 70 65 64 65 66  m1_vtab;.typedef
0eb0: 20 73 74 72 75 63 74 20 6c 73 6d 31 5f 63 75 72   struct lsm1_cur
0ec0: 73 6f 72 20 6c 73 6d 31 5f 63 75 72 73 6f 72 3b  sor lsm1_cursor;
0ed0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0ee0: 6c 73 6d 31 5f 76 62 6c 6f 62 20 6c 73 6d 31 5f  lsm1_vblob lsm1_
0ef0: 76 62 6c 6f 62 3b 0a 0a 2f 2a 20 50 72 69 6d 69  vblob;../* Primi
0f00: 74 69 76 65 20 74 79 70 65 73 20 2a 2f 0a 74 79  tive types */.ty
0f10: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
0f20: 68 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20  har u8;.typedef 
0f30: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32  unsigned int u32
0f40: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
0f50: 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 0a 2f  3_uint64 u64;../
0f60: 2a 20 41 6e 20 6f 70 65 6e 20 63 6f 6e 6e 65 63  * An open connec
0f70: 74 69 6f 6e 20 74 6f 20 61 6e 20 4c 53 4d 20 74  tion to an LSM t
0f80: 61 62 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 6c  able */.struct l
0f90: 73 6d 31 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c  sm1_vtab {.  sql
0fa0: 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
0fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
0fc0: 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65   class - must be
0fd0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 6c 73 6d 5f   first */.  lsm_
0fe0: 64 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  db *pDb;        
0ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1000: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
1010: 65 20 4c 53 4d 20 74 61 62 6c 65 20 2a 2f 0a 20  e LSM table */. 
1020: 20 75 38 20 6b 65 79 54 79 70 65 3b 20 20 20 20   u8 keyType;    
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1040: 53 51 4c 49 54 45 5f 42 4c 4f 42 2c 20 5f 54 45  SQLITE_BLOB, _TE
1050: 58 54 2c 20 6f 72 20 5f 49 4e 54 45 47 45 52 20  XT, or _INTEGER 
1060: 2a 2f 0a 20 20 75 33 32 20 6e 56 61 6c 3b 20 20  */.  u32 nVal;  
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
1090: 6c 75 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d  lue columns */.}
10a0: 3b 0a 0a 0a 2f 2a 20 6c 73 6d 31 5f 63 75 72 73  ;.../* lsm1_curs
10b0: 6f 72 20 69 73 20 61 20 73 75 62 63 6c 61 73 73  or is a subclass
10c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 74 61 62   of sqlite3_vtab
10d0: 5f 63 75 72 73 6f 72 20 77 68 69 63 68 20 77 69  _cursor which wi
10e0: 6c 6c 0a 2a 2a 20 73 65 72 76 65 20 61 73 20 74  ll.** serve as t
10f0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 72 65  he underlying re
1100: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1110: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 73 63  a cursor that sc
1120: 61 6e 73 0a 2a 2a 20 6f 76 65 72 20 72 6f 77 73  ans.** over rows
1130: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   of the result.*
1140: 2f 0a 73 74 72 75 63 74 20 6c 73 6d 31 5f 63 75  /.struct lsm1_cu
1150: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
1160: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
1170: 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  e;  /* Base clas
1180: 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73  s - must be firs
1190: 74 20 2a 2f 0a 20 20 6c 73 6d 5f 63 75 72 73 6f  t */.  lsm_curso
11a0: 72 20 2a 70 4c 73 6d 43 75 72 3b 20 20 20 20 20  r *pLsmCur;     
11b0: 20 20 2f 2a 20 54 68 65 20 4c 53 4d 20 63 75 72    /* The LSM cur
11c0: 73 6f 72 20 2a 2f 0a 20 20 75 38 20 69 73 44 65  sor */.  u8 isDe
11d0: 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sc;             
11e0: 20 20 20 20 2f 2a 20 30 3a 20 73 63 61 6e 20 66      /* 0: scan f
11f0: 6f 72 77 61 72 64 2e 20 20 31 3a 20 73 63 61 6e  orward.  1: scan
1200: 20 72 65 76 65 72 73 65 20 2a 2f 0a 20 20 75 38   reverse */.  u8
1210: 20 61 74 45 6f 66 3b 20 20 20 20 20 20 20 20 20   atEof;         
1220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1230: 20 69 66 20 74 68 65 20 73 63 61 6e 20 69 73 20   if the scan is 
1240: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 75 38  complete */.  u8
1250: 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20   bUnique;       
1260: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1270: 20 69 66 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   if no more than
1280: 20 6f 6e 65 20 72 6f 77 20 6f 66 20 6f 75 74 70   one row of outp
1290: 75 74 20 2a 2f 0a 20 20 75 38 20 2a 7a 44 61 74  ut */.  u8 *zDat
12a0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
12b0: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
12c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12d0: 20 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74 61 3b   */.  u32 nData;
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1300: 74 65 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  tes in the curre
1310: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 75 38 20 2a  nt row */.  u8 *
1320: 61 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20  aeType;         
1330: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 73 20         /* Types 
1340: 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 76  for all column v
1350: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  alues */.  u32 *
1360: 61 69 4f 66 73 74 3b 20 20 20 20 20 20 20 20 20  aiOfst;         
1370: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 73        /* Offsets
1380: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
1390: 66 69 65 6c 64 73 20 2a 2f 0a 20 20 75 33 32 20  fields */.  u32 
13a0: 2a 61 69 4c 65 6e 3b 20 20 20 20 20 20 20 20 20  *aiLen;         
13b0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
13c0: 20 6f 66 20 65 61 63 68 20 66 69 65 6c 64 20 2a   of each field *
13d0: 2f 0a 20 20 75 38 20 2a 70 4b 65 79 32 3b 20 20  /.  u8 *pKey2;  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f0: 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  * Loop terminati
1400: 6f 6e 20 6b 65 79 2c 20 6f 72 20 4e 55 4c 4c 20  on key, or NULL 
1410: 2a 2f 0a 20 20 75 33 32 20 6e 4b 65 79 32 3b 20  */.  u32 nKey2; 
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
1440: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
1450: 6e 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  n key */.};../* 
1460: 41 6e 20 65 78 74 65 6e 73 69 62 6c 65 20 62 75  An extensible bu
1470: 66 66 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  ffer object..**.
1480: 2a 2a 20 43 6f 6e 74 65 6e 74 20 63 61 6e 20 62  ** Content can b
1490: 65 20 61 70 70 65 6e 64 65 64 2e 20 20 53 70 61  e appended.  Spa
14a0: 63 65 20 74 6f 20 68 6f 6c 64 20 6e 65 77 20 63  ce to hold new c
14b0: 6f 6e 74 65 6e 74 20 69 73 20 61 75 74 6f 6d 61  ontent is automa
14c0: 74 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  tically.** alloc
14d0: 61 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ated..*/.struct 
14e0: 6c 73 6d 31 5f 76 62 6c 6f 62 20 7b 0a 20 20 75  lsm1_vblob {.  u
14f0: 38 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  8 *a;           
1500: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
1510: 6c 64 20 63 6f 6e 74 65 6e 74 2c 20 66 72 6f 6d  ld content, from
1520: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1530: 34 28 29 20 2a 2f 0a 20 20 75 36 34 20 6e 3b 20  4() */.  u64 n; 
1540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1550: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 75 73  ytes of space us
1560: 65 64 20 2a 2f 0a 20 20 75 36 34 20 6e 41 6c 6c  ed */.  u64 nAll
1570: 6f 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79  oc;        /* By
1580: 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1590: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 75 38 20 65  ocated */.  u8 e
15a0: 72 72 4e 6f 4d 65 6d 3b 20 20 20 20 20 20 20 2f  rrNoMem;       /
15b0: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 65 6d 6f  * True if a memo
15c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
15d0: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 73 65 65  ror has been see
15e0: 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 64 65 66  n */.};..#if def
15f0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23  ined(__GNUC__).#
1600: 20 20 64 65 66 69 6e 65 20 4c 53 4d 31 5f 4e 4f    define LSM1_NO
1610: 49 4e 4c 49 4e 45 20 20 5f 5f 61 74 74 72 69 62  INLINE  __attrib
1620: 75 74 65 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29  ute__((noinline)
1630: 29 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ).#elif defined(
1640: 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
1650: 43 5f 56 45 52 3e 3d 31 33 31 30 0a 23 20 20 64  C_VER>=1310.#  d
1660: 65 66 69 6e 65 20 4c 53 4d 31 5f 4e 4f 49 4e 4c  efine LSM1_NOINL
1670: 49 4e 45 20 20 5f 5f 64 65 63 6c 73 70 65 63 28  INE  __declspec(
1680: 6e 6f 69 6e 6c 69 6e 65 29 0a 23 65 6c 73 65 0a  noinline).#else.
1690: 23 20 20 64 65 66 69 6e 65 20 4c 53 4d 31 5f 4e  #  define LSM1_N
16a0: 4f 49 4e 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 0a  OINLINE.#endif..
16b0: 0a 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  ./* Increase the
16c0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
16d0: 20 69 6e 20 74 68 65 20 76 62 6c 6f 62 20 6f 62   in the vblob ob
16e0: 6a 65 63 74 20 73 6f 20 74 68 61 74 20 69 74 20  ject so that it 
16f0: 63 61 6e 20 68 6f 6c 64 0a 2a 2a 20 61 74 20 6c  can hold.** at l
1700: 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74 65  east N more byte
1710: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
1720: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1730: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
1740: 73 6d 31 56 62 6c 6f 62 45 6e 6c 61 72 67 65 28  sm1VblobEnlarge(
1750: 6c 73 6d 31 5f 76 62 6c 6f 62 20 2a 70 2c 20 75  lsm1_vblob *p, u
1760: 33 32 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  32 N){.  if( p->
1770: 6e 2b 4e 3e 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  n+N>p->nAlloc ){
1780: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 72 72 4e  .    if( p->errN
1790: 6f 4d 65 6d 20 29 20 72 65 74 75 72 6e 20 31 3b  oMem ) return 1;
17a0: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  .    p->nAlloc +
17b0: 3d 20 4e 20 2b 20 28 70 2d 3e 6e 41 6c 6c 6f 63  = N + (p->nAlloc
17c0: 20 3f 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3a 20 4e   ? p->nAlloc : N
17d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 20 3d 20 73 71  );.    p->a = sq
17e0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
17f0: 70 2d 3e 61 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->a, p->nAlloc)
1800: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 3d 3d  ;.    if( p->a==
1810: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20  0 ){.      p->n 
1820: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 41  = 0;.      p->nA
1830: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
1840: 70 2d 3e 65 72 72 4e 6f 4d 65 6d 20 3d 20 31 3b  p->errNoMem = 1;
1850: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1860: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 41  .    }.    p->nA
1870: 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 5f 6d  lloc = sqlite3_m
1880: 73 69 7a 65 28 70 2d 3e 61 29 3b 0a 20 20 7d 0a  size(p->a);.  }.
1890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18a0: 2a 20 41 70 70 65 6e 64 20 4e 20 62 79 74 65 73  * Append N bytes
18b0: 20 74 6f 20 61 20 76 62 6c 6f 62 20 61 66 74 65   to a vblob afte
18c0: 72 20 66 69 72 73 74 20 65 6e 6c 61 72 67 69 6e  r first enlargin
18d0: 67 20 69 74 20 2a 2f 0a 73 74 61 74 69 63 20 4c  g it */.static L
18e0: 53 4d 31 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  SM1_NOINLINE voi
18f0: 64 20 6c 73 6d 31 56 62 6c 6f 62 45 6e 6c 61 72  d lsm1VblobEnlar
1900: 67 65 41 6e 64 41 70 70 65 6e 64 28 0a 20 20 6c  geAndAppend(.  l
1910: 73 6d 31 5f 76 62 6c 6f 62 20 2a 70 2c 0a 20 20  sm1_vblob *p,.  
1920: 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
1930: 0a 20 20 75 33 32 20 4e 0a 29 7b 0a 20 20 69 66  .  u32 N.){.  if
1940: 28 20 70 2d 3e 6e 2b 4e 3e 70 2d 3e 6e 41 6c 6c  ( p->n+N>p->nAll
1950: 6f 63 20 26 26 20 6c 73 6d 31 56 62 6c 6f 62 45  oc && lsm1VblobE
1960: 6e 6c 61 72 67 65 28 70 2c 20 4e 29 20 29 20 72  nlarge(p, N) ) r
1970: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  eturn;.  memcpy(
1980: 70 2d 3e 61 2b 70 2d 3e 6e 2c 20 70 44 61 74 61  p->a+p->n, pData
1990: 2c 20 4e 29 3b 0a 20 20 70 2d 3e 6e 20 2b 3d 20  , N);.  p->n += 
19a0: 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  N;.}../* Append 
19b0: 4e 20 62 79 74 65 73 20 74 6f 20 61 20 76 62 6c  N bytes to a vbl
19c0: 6f 62 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ob */.static voi
19d0: 64 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e  d lsm1VblobAppen
19e0: 64 28 6c 73 6d 31 5f 76 62 6c 6f 62 20 2a 70 2c  d(lsm1_vblob *p,
19f0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
1a00: 2c 20 75 33 32 20 4e 29 7b 0a 20 20 73 71 6c 69  , u32 N){.  sqli
1a10: 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 70 2d  te3_int64 n = p-
1a20: 3e 6e 3b 0a 20 20 69 66 28 20 6e 2b 4e 3e 70 2d  >n;.  if( n+N>p-
1a30: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 6c  >nAlloc ){.    l
1a40: 73 6d 31 56 62 6c 6f 62 45 6e 6c 61 72 67 65 41  sm1VblobEnlargeA
1a50: 6e 64 41 70 70 65 6e 64 28 70 2c 20 70 44 61 74  ndAppend(p, pDat
1a60: 61 2c 20 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a, N);.  }else{.
1a70: 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 4e 3b 0a 20      p->n += N;. 
1a80: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 2b 6e     memcpy(p->a+n
1a90: 2c 20 70 44 61 74 61 2c 20 4e 29 3b 0a 20 20 7d  , pData, N);.  }
1aa0: 0a 7d 0a 0a 2f 2a 20 61 70 70 65 6e 64 20 74 65  .}../* append te
1ab0: 78 74 20 74 6f 20 61 20 76 62 6c 6f 62 20 2a 2f  xt to a vblob */
1ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d  .static void lsm
1ad0: 31 56 62 6c 6f 62 41 70 70 65 6e 64 54 65 78 74  1VblobAppendText
1ae0: 28 6c 73 6d 31 5f 76 62 6c 6f 62 20 2a 70 2c 20  (lsm1_vblob *p, 
1af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1b00: 20 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e    lsm1VblobAppen
1b10: 64 28 70 2c 20 28 75 38 2a 29 7a 2c 20 28 75 33  d(p, (u8*)z, (u3
1b20: 32 29 73 74 72 6c 65 6e 28 7a 29 29 3b 0a 7d 0a  2)strlen(z));.}.
1b30: 0a 2f 2a 20 44 65 71 75 6f 74 65 20 74 68 65 20  ./* Dequote the 
1b40: 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  string */.static
1b50: 20 76 6f 69 64 20 6c 73 6d 31 44 65 71 75 6f 74   void lsm1Dequot
1b60: 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  e(char *z){.  in
1b70: 74 20 6a 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  t j;.  char cQuo
1b80: 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 69 7a  te = z[0];.  siz
1b90: 65 5f 74 20 69 2c 20 6e 3b 0a 0a 20 20 69 66 28  e_t i, n;..  if(
1ba0: 20 63 51 75 6f 74 65 21 3d 27 5c 27 27 20 26 26   cQuote!='\'' &&
1bb0: 20 63 51 75 6f 74 65 21 3d 27 22 27 20 29 20 72   cQuote!='"' ) r
1bc0: 65 74 75 72 6e 3b 0a 20 20 6e 20 3d 20 73 74 72  eturn;.  n = str
1bd0: 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 6e 3c  len(z);.  if( n<
1be0: 32 20 7c 7c 20 7a 5b 6e 2d 31 5d 21 3d 7a 5b 30  2 || z[n-1]!=z[0
1bf0: 5d 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ] ) return;.  fo
1c00: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d  r(i=1, j=0; i<n-
1c10: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  1; i++){.    if(
1c20: 20 7a 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 26 26   z[i]==cQuote &&
1c30: 20 7a 5b 69 2b 31 5d 3d 3d 63 51 75 6f 74 65 20   z[i+1]==cQuote 
1c40: 29 20 69 2b 2b 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  ) i++;.    z[j++
1c50: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
1c60: 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  z[j] = 0;.}.../*
1c70: 0a 2a 2a 20 54 68 65 20 6c 73 6d 31 43 6f 6e 6e  .** The lsm1Conn
1c80: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 69 73 20  ect() method is 
1c90: 69 6e 76 6f 6b 65 64 20 74 6f 20 63 72 65 61 74  invoked to creat
1ca0: 65 20 61 20 6e 65 77 0a 2a 2a 20 6c 73 6d 31 5f  e a new.** lsm1_
1cb0: 76 74 61 62 20 74 68 61 74 20 64 65 73 63 72 69  vtab that descri
1cc0: 62 65 73 20 74 68 65 20 76 69 72 74 75 61 6c 20  bes the virtual 
1cd0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1ce0: 20 69 6e 74 20 6c 73 6d 31 43 6f 6e 6e 65 63 74   int lsm1Connect
1cf0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d00: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
1d10: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1d20: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
1d30: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
1d40: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
1d50: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
1d60: 6c 73 6d 31 5f 76 74 61 62 20 2a 70 4e 65 77 3b  lsm1_vtab *pNew;
1d70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1d80: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1d90: 75 38 20 6b 65 79 54 79 70 65 20 3d 20 30 3b 0a  u8 keyType = 0;.
1da0: 20 20 69 6e 74 20 69 3b 0a 20 20 6c 73 6d 31 5f    int i;.  lsm1_
1db0: 76 62 6c 6f 62 20 73 71 6c 3b 0a 20 20 73 74 61  vblob sql;.  sta
1dc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1dd0: 61 7a 54 79 70 65 73 5b 5d 20 3d 20 7b 20 22 55  azTypes[] = { "U
1de0: 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 22 54  INT",         "T
1df0: 45 58 54 22 2c 20 20 20 20 20 22 42 4c 4f 42 22  EXT",     "BLOB"
1e00: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
1e10: 73 74 20 75 38 20 61 65 54 79 70 65 73 5b 5d 20  st u8 aeTypes[] 
1e20: 3d 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 49 4e  =    { SQLITE_IN
1e30: 54 45 47 45 52 2c 20 53 51 4c 49 54 45 5f 54 45  TEGER, SQLITE_TE
1e40: 58 54 2c 20 53 51 4c 49 54 45 5f 42 4c 4f 42 20  XT, SQLITE_BLOB 
1e50: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
1e60: 74 20 63 68 61 72 20 2a 61 7a 41 72 67 4e 61 6d  t char *azArgNam
1e70: 65 5b 5d 20 3d 20 7b 22 66 69 6c 65 6e 61 6d 65  e[] = {"filename
1e80: 22 2c 20 22 6b 65 79 22 2c 20 22 6b 65 79 20 74  ", "key", "key t
1e90: 79 70 65 22 2c 20 22 76 61 6c 75 65 31 22 20 7d  ype", "value1" }
1ea0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1eb0: 73 69 7a 65 6f 66 28 61 7a 41 72 67 4e 61 6d 65  sizeof(azArgName
1ec0: 29 2f 73 69 7a 65 6f 66 28 61 7a 41 72 67 4e 61  )/sizeof(azArgNa
1ed0: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  me[0]); i++){.  
1ee0: 20 20 69 66 28 20 61 72 67 63 3c 69 2b 34 20 7c    if( argc<i+4 |
1ef0: 7c 20 61 72 67 76 5b 69 2b 33 5d 3d 3d 30 20 7c  | argv[i+3]==0 |
1f00: 7c 20 61 72 67 76 5b 69 2b 33 5d 5b 30 5d 3d 3d  | argv[i+3][0]==
1f10: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  0 ){.      *pzEr
1f20: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
1f30: 6e 74 66 28 22 25 73 20 28 25 72 29 20 61 72 67  ntf("%s (%r) arg
1f40: 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 22 2c 0a  ument missing",.
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1f70: 7a 41 72 67 4e 61 6d 65 5b 69 5d 2c 20 69 2b 31  zArgName[i], i+1
1f80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1fa0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
1fb0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 79  0; i<sizeof(azTy
1fc0: 70 65 73 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79  pes)/sizeof(azTy
1fd0: 70 65 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  pes[0]); i++){. 
1fe0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1ff0: 74 72 69 63 6d 70 28 61 7a 54 79 70 65 73 5b 69  tricmp(azTypes[i
2000: 5d 2c 61 72 67 76 5b 35 5d 29 3d 3d 30 20 29 7b  ],argv[5])==0 ){
2010: 0a 20 20 20 20 20 20 6b 65 79 54 79 70 65 20 3d  .      keyType =
2020: 20 61 65 54 79 70 65 73 5b 69 5d 3b 0a 20 20 20   aeTypes[i];.   
2030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2040: 20 20 7d 0a 20 20 69 66 28 20 6b 65 79 54 79 70    }.  if( keyTyp
2050: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  e==0 ){.    *pzE
2060: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
2070: 69 6e 74 66 28 22 6b 65 79 20 74 79 70 65 20 73  intf("key type s
2080: 68 6f 75 6c 64 20 62 65 20 49 4e 54 2c 20 54 45  hould be INT, TE
2090: 58 54 2c 20 6f 72 20 42 4c 4f 42 22 29 3b 0a 20  XT, or BLOB");. 
20a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 2a 70  _ERROR;.  }.  *p
20c0: 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  pVtab = sqlite3_
20d0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
20e0: 70 4e 65 77 29 20 29 3b 0a 20 20 70 4e 65 77 20  pNew) );.  pNew 
20f0: 3d 20 28 6c 73 6d 31 5f 76 74 61 62 2a 29 2a 70  = (lsm1_vtab*)*p
2100: 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 4e 65  pVtab;.  if( pNe
2110: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
2120: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2130: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
2140: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
2150: 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6b  New));.  pNew->k
2160: 65 79 54 79 70 65 20 3d 20 6b 65 79 54 79 70 65  eyType = keyType
2170: 3b 0a 20 20 72 63 20 3d 20 6c 73 6d 5f 6e 65 77  ;.  rc = lsm_new
2180: 28 30 2c 20 26 70 4e 65 77 2d 3e 70 44 62 29 3b  (0, &pNew->pDb);
2190: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
21a0: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
21b0: 33 5f 6d 70 72 69 6e 74 66 28 22 6c 73 6d 5f 6e  3_mprintf("lsm_n
21c0: 65 77 20 66 61 69 6c 65 64 20 77 69 74 68 20 65  ew failed with e
21d0: 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 20  rror code %d",  
21e0: 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rc);.    rc = SQ
21f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2200: 67 6f 74 6f 20 63 6f 6e 6e 65 63 74 5f 66 61 69  goto connect_fai
2210: 6c 65 64 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  led;.  }.  zFile
2220: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
2230: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2240: 76 5b 33 5d 29 3b 0a 20 20 6c 73 6d 31 44 65 71  v[3]);.  lsm1Deq
2250: 75 6f 74 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  uote(zFilename);
2260: 0a 20 20 72 63 20 3d 20 6c 73 6d 5f 6f 70 65 6e  .  rc = lsm_open
2270: 28 70 4e 65 77 2d 3e 70 44 62 2c 20 7a 46 69 6c  (pNew->pDb, zFil
2280: 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  ename);.  sqlite
2290: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
22a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22b0: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
22c0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6c 73 6d  te3_mprintf("lsm
22d0: 5f 6f 70 65 6e 20 66 61 69 6c 65 64 20 77 69 74  _open failed wit
22e0: 68 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  h %d", rc);.    
22f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2300: 52 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6e 6e  R;.    goto conn
2310: 65 63 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  ect_failed;.  }.
2320: 0a 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 2c 20  .  memset(&sql, 
2330: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 29 29 3b  0, sizeof(sql));
2340: 0a 20 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65  .  lsm1VblobAppe
2350: 6e 64 54 65 78 74 28 26 73 71 6c 2c 20 22 43 52  ndText(&sql, "CR
2360: 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 29 3b  EATE TABLE x(");
2370: 0a 20 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65  .  lsm1VblobAppe
2380: 6e 64 54 65 78 74 28 26 73 71 6c 2c 20 61 72 67  ndText(&sql, arg
2390: 76 5b 34 5d 29 3b 0a 20 20 6c 73 6d 31 56 62 6c  v[4]);.  lsm1Vbl
23a0: 6f 62 41 70 70 65 6e 64 54 65 78 74 28 26 73 71  obAppendText(&sq
23b0: 6c 2c 20 22 20 22 29 3b 0a 20 20 6c 73 6d 31 56  l, " ");.  lsm1V
23c0: 62 6c 6f 62 41 70 70 65 6e 64 54 65 78 74 28 26  blobAppendText(&
23d0: 73 71 6c 2c 20 61 72 67 76 5b 35 5d 29 3b 0a 20  sql, argv[5]);. 
23e0: 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e 64   lsm1VblobAppend
23f0: 54 65 78 74 28 26 73 71 6c 2c 20 22 20 50 52 49  Text(&sql, " PRI
2400: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 20 20 66 6f  MARY KEY");.  fo
2410: 72 28 69 3d 36 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=6; i<argc; i
2420: 2b 2b 29 7b 0a 20 20 20 20 6c 73 6d 31 56 62 6c  ++){.    lsm1Vbl
2430: 6f 62 41 70 70 65 6e 64 54 65 78 74 28 26 73 71  obAppendText(&sq
2440: 6c 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 6c 73  l, ", ");.    ls
2450: 6d 31 56 62 6c 6f 62 41 70 70 65 6e 64 54 65 78  m1VblobAppendTex
2460: 74 28 26 73 71 6c 2c 20 61 72 67 76 5b 69 5d 29  t(&sql, argv[i])
2470: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 56 61 6c  ;.    pNew->nVal
2480: 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 73 6d 31 56 62  ++;.  }.  lsm1Vb
2490: 6c 6f 62 41 70 70 65 6e 64 54 65 78 74 28 26 73  lobAppendText(&s
24a0: 71 6c 2c 20 0a 20 20 20 20 20 20 22 2c 20 6c 73  ql, .      ", ls
24b0: 6d 31 5f 63 6f 6d 6d 61 6e 64 20 48 49 44 44 45  m1_command HIDDE
24c0: 4e 22 0a 20 20 20 20 20 20 22 2c 20 6c 73 6d 31  N".      ", lsm1
24d0: 5f 6b 65 79 20 48 49 44 44 45 4e 22 0a 20 20 20  _key HIDDEN".   
24e0: 20 20 20 22 2c 20 6c 73 6d 31 5f 76 61 6c 75 65     ", lsm1_value
24f0: 20 48 49 44 44 45 4e 29 20 57 49 54 48 4f 55 54   HIDDEN) WITHOUT
2500: 20 52 4f 57 49 44 22 29 3b 0a 20 20 6c 73 6d 31   ROWID");.  lsm1
2510: 56 62 6c 6f 62 41 70 70 65 6e 64 28 26 73 71 6c  VblobAppend(&sql
2520: 2c 20 28 75 38 2a 29 22 22 2c 20 31 29 3b 0a 20  , (u8*)"", 1);. 
2530: 20 69 66 28 20 73 71 6c 2e 65 72 72 4e 6f 4d 65   if( sql.errNoMe
2540: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
2550: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2560: 67 6f 74 6f 20 63 6f 6e 6e 65 63 74 5f 66 61 69  goto connect_fai
2570: 6c 65 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  led;.  }.  rc = 
2580: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
2590: 76 74 61 62 28 64 62 2c 20 28 63 6f 6e 73 74 20  vtab(db, (const 
25a0: 63 68 61 72 2a 29 73 71 6c 2e 61 29 3b 0a 20 20  char*)sql.a);.  
25b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c  sqlite3_free(sql
25c0: 2e 61 29 3b 0a 0a 63 6f 6e 6e 65 63 74 5f 66 61  .a);..connect_fa
25d0: 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
25e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25f0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2600: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 44 62     if( pNew->pDb
2610: 20 29 20 6c 73 6d 5f 63 6c 6f 73 65 28 70 4e 65   ) lsm_close(pNe
2620: 77 2d 3e 70 44 62 29 3b 0a 20 20 20 20 20 20 73  w->pDb);.      s
2630: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2640: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  );.    }.    *pp
2650: 56 74 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Vtab = 0;.  }.  
2660: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2670: 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20  .** This method 
2680: 69 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  is the destructo
2690: 72 20 66 6f 72 20 6c 73 6d 31 5f 63 75 72 73 6f  r for lsm1_curso
26a0: 72 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  r objects..*/.st
26b0: 61 74 69 63 20 69 6e 74 20 6c 73 6d 31 44 69 73  atic int lsm1Dis
26c0: 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
26d0: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
26e0: 6c 73 6d 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  lsm1_vtab *p = (
26f0: 6c 73 6d 31 5f 76 74 61 62 2a 29 70 56 74 61 62  lsm1_vtab*)pVtab
2700: 3b 0a 20 20 6c 73 6d 5f 63 6c 6f 73 65 28 70 2d  ;.  lsm_close(p-
2710: 3e 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pDb);.  sqlite3
2720: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
2730: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2740: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2750: 6f 72 20 66 6f 72 20 61 20 6e 65 77 20 6c 73 6d  or for a new lsm
2760: 31 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  1_cursor object.
2770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
2780: 73 6d 31 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  sm1Open(sqlite3_
2790: 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73 71 6c  vtab *pVtab, sql
27a0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
27b0: 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
27c0: 6c 73 6d 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  lsm1_vtab *p = (
27d0: 6c 73 6d 31 5f 76 74 61 62 2a 29 70 56 74 61 62  lsm1_vtab*)pVtab
27e0: 3b 0a 20 20 6c 73 6d 31 5f 63 75 72 73 6f 72 20  ;.  lsm1_cursor 
27f0: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
2800: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
2810: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
2820: 6f 66 28 2a 70 43 75 72 29 0a 20 20 20 20 20 20  of(*pCur).      
2830: 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 2d 3e             + p->
2840: 6e 56 61 6c 2a 28 73 69 7a 65 6f 66 28 70 43 75  nVal*(sizeof(pCu
2850: 72 2d 3e 61 69 4f 66 73 74 29 2b 73 69 7a 65 6f  r->aiOfst)+sizeo
2860: 66 28 70 43 75 72 2d 3e 61 69 4c 65 6e 29 2b 31  f(pCur->aiLen)+1
2870: 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
2880: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2890: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
28a0: 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65  et(pCur, 0, size
28b0: 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 43  of(*pCur));.  pC
28c0: 75 72 2d 3e 61 69 4f 66 73 74 20 3d 20 28 75 33  ur->aiOfst = (u3
28d0: 32 2a 29 26 70 43 75 72 5b 31 5d 3b 0a 20 20 70  2*)&pCur[1];.  p
28e0: 43 75 72 2d 3e 61 69 4c 65 6e 20 3d 20 26 70 43  Cur->aiLen = &pC
28f0: 75 72 2d 3e 61 69 4f 66 73 74 5b 70 2d 3e 6e 56  ur->aiOfst[p->nV
2900: 61 6c 5d 3b 0a 20 20 70 43 75 72 2d 3e 61 65 54  al];.  pCur->aeT
2910: 79 70 65 20 3d 20 28 75 38 2a 29 26 70 43 75 72  ype = (u8*)&pCur
2920: 2d 3e 61 69 4c 65 6e 5b 70 2d 3e 6e 56 61 6c 5d  ->aiLen[p->nVal]
2930: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
2940: 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCur->base;.  r
2950: 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6f 70 65 6e  c = lsm_csr_open
2960: 28 70 2d 3e 70 44 62 2c 20 26 70 43 75 72 2d 3e  (p->pDb, &pCur->
2970: 70 4c 73 6d 43 75 72 29 3b 0a 20 20 69 66 28 20  pLsmCur);.  if( 
2980: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
2990: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
29a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
29b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
29c0: 29 3b 0a 20 20 20 20 2a 70 70 43 75 72 73 6f 72  );.    *ppCursor
29d0: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
29e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
29f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a00: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  ./*.** Destructo
2a10: 72 20 66 6f 72 20 61 20 6c 73 6d 31 5f 63 75 72  r for a lsm1_cur
2a20: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
2a30: 6e 74 20 6c 73 6d 31 43 6c 6f 73 65 28 73 71 6c  nt lsm1Close(sql
2a40: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2a50: 20 2a 63 75 72 29 7b 0a 20 20 6c 73 6d 31 5f 63   *cur){.  lsm1_c
2a60: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 6c  ursor *pCur = (l
2a70: 73 6d 31 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  sm1_cursor*)cur;
2a80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2a90: 70 43 75 72 2d 3e 70 4b 65 79 32 29 3b 0a 20 20  pCur->pKey2);.  
2aa0: 6c 73 6d 5f 63 73 72 5f 63 6c 6f 73 65 28 70 43  lsm_csr_close(pC
2ab0: 75 72 2d 3e 70 4c 73 6d 43 75 72 29 3b 0a 20 20  ur->pLsmCur);.  
2ac0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2ad0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
2ae0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
2af0: 2a 20 41 64 76 61 6e 63 65 20 61 20 6c 73 6d 31  * Advance a lsm1
2b00: 5f 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e  _cursor to its n
2b10: 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  ext row of outpu
2b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2b30: 20 6c 73 6d 31 4e 65 78 74 28 73 71 6c 69 74 65   lsm1Next(sqlite
2b40: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
2b50: 75 72 29 7b 0a 20 20 6c 73 6d 31 5f 63 75 72 73  ur){.  lsm1_curs
2b60: 6f 72 20 2a 70 43 75 72 20 3d 20 28 6c 73 6d 31  or *pCur = (lsm1
2b70: 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
2b80: 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
2b90: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 62 55 6e  .  if( pCur->bUn
2ba0: 69 71 75 65 20 29 7b 0a 20 20 20 20 70 43 75 72  ique ){.    pCur
2bb0: 2d 3e 61 74 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  ->atEof = 1;.  }
2bc0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43  else{.    if( pC
2bd0: 75 72 2d 3e 69 73 44 65 73 63 20 29 7b 0a 20 20  ur->isDesc ){.  
2be0: 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72      rc = lsm_csr
2bf0: 5f 70 72 65 76 28 70 43 75 72 2d 3e 70 4c 73 6d  _prev(pCur->pLsm
2c00: 43 75 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Cur);.    }else{
2c10: 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f  .      rc = lsm_
2c20: 63 73 72 5f 6e 65 78 74 28 70 43 75 72 2d 3e 70  csr_next(pCur->p
2c30: 4c 73 6d 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  LsmCur);.    }. 
2c40: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
2c50: 4b 20 26 26 20 6c 73 6d 5f 63 73 72 5f 76 61 6c  K && lsm_csr_val
2c60: 69 64 28 70 43 75 72 2d 3e 70 4c 73 6d 43 75 72  id(pCur->pLsmCur
2c70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  )==0 ){.      pC
2c80: 75 72 2d 3e 61 74 45 6f 66 20 3d 20 31 3b 0a 20  ur->atEof = 1;. 
2c90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2ca0: 72 2d 3e 70 4b 65 79 32 20 26 26 20 70 43 75 72  r->pKey2 && pCur
2cb0: 2d 3e 61 74 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  ->atEof==0 ){.  
2cc0: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 56      const u8 *pV
2cd0: 61 6c 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 56  al;.      u32 nV
2ce0: 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
2cf0: 28 20 70 43 75 72 2d 3e 69 73 44 65 73 63 3d 3d  ( pCur->isDesc==
2d00: 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2d10: 6c 73 6d 5f 63 73 72 5f 6b 65 79 28 70 43 75 72  lsm_csr_key(pCur
2d20: 2d 3e 70 4c 73 6d 43 75 72 2c 20 28 63 6f 6e 73  ->pLsmCur, (cons
2d30: 74 20 76 6f 69 64 2a 2a 29 26 70 56 61 6c 2c 20  t void**)&pVal, 
2d40: 28 69 6e 74 2a 29 26 6e 56 61 6c 29 3b 0a 20 20  (int*)&nVal);.  
2d50: 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
2d60: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  OK ){.        u3
2d70: 32 20 6c 65 6e 20 3d 20 70 43 75 72 2d 3e 6e 4b  2 len = pCur->nK
2d80: 65 79 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ey2;.        int
2d90: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   c;.        if( 
2da0: 6c 65 6e 3e 6e 56 61 6c 20 29 20 6c 65 6e 20 3d  len>nVal ) len =
2db0: 20 6e 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 63   nVal;.        c
2dc0: 20 3d 20 6d 65 6d 63 6d 70 28 70 56 61 6c 2c 20   = memcmp(pVal, 
2dd0: 70 43 75 72 2d 3e 70 4b 65 79 32 2c 20 6c 65 6e  pCur->pKey2, len
2de0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2df0: 3d 3d 30 20 29 20 63 20 3d 20 6e 56 61 6c 20 2d  ==0 ) c = nVal -
2e00: 20 70 43 75 72 2d 3e 6e 4b 65 79 32 3b 0a 20 20   pCur->nKey2;.  
2e10: 20 20 20 20 20 20 69 66 28 20 63 3e 30 20 29 20        if( c>0 ) 
2e20: 70 43 75 72 2d 3e 61 74 45 6f 66 20 3d 20 31 3b  pCur->atEof = 1;
2e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e40: 20 20 20 70 43 75 72 2d 3e 7a 44 61 74 61 20 3d     pCur->zData =
2e50: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2e60: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 3f 20 53 51   rc==LSM_OK ? SQ
2e70: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
2e80: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
2e90: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ea0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 62  the cursor has b
2eb0: 65 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66  een moved off of
2ec0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77   the last.** row
2ed0: 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73   of output..*/.s
2ee0: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 31 45 6f  tatic int lsm1Eo
2ef0: 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
2f00: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 6c  ursor *cur){.  l
2f10: 73 6d 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  sm1_cursor *pCur
2f20: 20 3d 20 28 6c 73 6d 31 5f 63 75 72 73 6f 72 2a   = (lsm1_cursor*
2f30: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
2f40: 43 75 72 2d 3e 61 74 45 6f 66 3b 0a 7d 0a 0a 2f  Cur->atEof;.}../
2f50: 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 61 72 65 20  *.** Rowids are 
2f60: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  not supported by
2f70: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2f80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
2f90: 53 6f 20 61 6c 77 61 79 73 0a 2a 2a 20 72 65 74  So always.** ret
2fa0: 75 72 6e 20 30 20 66 6f 72 20 74 68 65 20 72 6f  urn 0 for the ro
2fb0: 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wid..*/.static i
2fc0: 6e 74 20 6c 73 6d 31 52 6f 77 69 64 28 73 71 6c  nt lsm1Rowid(sql
2fd0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2fe0: 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e   *cur, sqlite_in
2ff0: 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20  t64 *pRowid){.  
3000: 2a 70 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72  *pRowid = 0;.  r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 70  .}../*.** Type p
3030: 72 65 66 69 78 65 73 20 6f 6e 20 4c 53 4d 20 6b  refixes on LSM k
3040: 65 79 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  eys.*/.#define L
3050: 53 4d 31 5f 54 59 50 45 5f 4e 45 47 41 54 49 56  SM1_TYPE_NEGATIV
3060: 45 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4c 53  E   0.#define LS
3070: 4d 31 5f 54 59 50 45 5f 50 4f 53 49 54 49 56 45  M1_TYPE_POSITIVE
3080: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4c 53 4d     1.#define LSM
3090: 31 5f 54 59 50 45 5f 54 45 58 54 20 20 20 20 20  1_TYPE_TEXT     
30a0: 20 20 32 0a 23 64 65 66 69 6e 65 20 4c 53 4d 31    2.#define LSM1
30b0: 5f 54 59 50 45 5f 42 4c 4f 42 20 20 20 20 20 20  _TYPE_BLOB      
30c0: 20 33 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20   3../*.** Write 
30d0: 61 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e 65  a 32-bit unsigne
30e0: 64 20 69 6e 74 65 67 65 72 20 61 73 20 34 20 62  d integer as 4 b
30f0: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 73 2e  ig-endian bytes.
3100: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3110: 76 61 72 69 6e 74 57 72 69 74 65 33 32 28 75 6e  varintWrite32(un
3120: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
3130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 79 29 7b  unsigned int y){
3140: 0a 20 20 7a 5b 30 5d 20 3d 20 28 75 6e 73 69 67  .  z[0] = (unsig
3150: 6e 65 64 20 63 68 61 72 29 28 79 3e 3e 32 34 29  ned char)(y>>24)
3160: 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 75 6e 73 69  ;.  z[1] = (unsi
3170: 67 6e 65 64 20 63 68 61 72 29 28 79 3e 3e 31 36  gned char)(y>>16
3180: 29 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28 75 6e 73  );.  z[2] = (uns
3190: 69 67 6e 65 64 20 63 68 61 72 29 28 79 3e 3e 38  igned char)(y>>8
31a0: 29 3b 0a 20 20 7a 5b 33 5d 20 3d 20 28 75 6e 73  );.  z[3] = (uns
31b0: 69 67 6e 65 64 20 63 68 61 72 29 28 79 29 3b 0a  igned char)(y);.
31c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
31d0: 20 76 61 72 69 6e 74 20 69 6e 74 6f 20 7a 5b 5d   varint into z[]
31e0: 2e 20 20 54 68 65 20 62 75 66 66 65 72 20 7a 5b  .  The buffer z[
31f0: 5d 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  ] must be at lea
3200: 73 74 20 39 20 63 68 61 72 61 63 74 65 72 73 0a  st 9 characters.
3210: 2a 2a 20 6c 6f 6e 67 20 74 6f 20 61 63 63 6f 6d  ** long to accom
3220: 6d 6f 64 61 74 65 20 74 68 65 20 6c 61 72 67 65  modate the large
3230: 73 74 20 70 6f 73 73 69 62 6c 65 20 76 61 72 69  st possible vari
3240: 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  nt.  Return the 
3250: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
3260: 65 73 20 6f 66 20 7a 5b 5d 20 75 73 65 64 2e 0a  es of z[] used..
3270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  */.static int ls
3280: 6d 31 50 75 74 56 61 72 69 6e 74 36 34 28 75 6e  m1PutVarint64(un
3290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
32a0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 78  sqlite3_uint64 x
32b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
32c0: 74 20 77 2c 20 79 3b 0a 20 20 69 66 28 20 78 3c  t w, y;.  if( x<
32d0: 3d 32 34 30 20 29 7b 0a 20 20 20 20 7a 5b 30 5d  =240 ){.    z[0]
32e0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
32f0: 72 29 78 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r)x;.    return 
3300: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 3c 3d  1;.  }.  if( x<=
3310: 32 32 38 37 20 29 7b 0a 20 20 20 20 79 20 3d 20  2287 ){.    y = 
3320: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28 78  (unsigned int)(x
3330: 20 2d 20 32 34 30 29 3b 0a 20 20 20 20 7a 5b 30   - 240);.    z[0
3340: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
3350: 61 72 29 28 79 2f 32 35 36 20 2b 20 32 34 31 29  ar)(y/256 + 241)
3360: 3b 0a 20 20 20 20 7a 5b 31 5d 20 3d 20 28 75 6e  ;.    z[1] = (un
3370: 73 69 67 6e 65 64 20 63 68 61 72 29 28 79 25 32  signed char)(y%2
3380: 35 36 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  56);.    return 
3390: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 3c 3d  2;.  }.  if( x<=
33a0: 36 37 38 32 33 20 29 7b 0a 20 20 20 20 79 20 3d  67823 ){.    y =
33b0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28   (unsigned int)(
33c0: 78 20 2d 20 32 32 38 38 29 3b 0a 20 20 20 20 7a  x - 2288);.    z
33d0: 5b 30 5d 20 3d 20 32 34 39 3b 0a 20 20 20 20 7a  [0] = 249;.    z
33e0: 5b 31 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  [1] = (unsigned 
33f0: 63 68 61 72 29 28 79 2f 32 35 36 29 3b 0a 20 20  char)(y/256);.  
3400: 20 20 7a 5b 32 5d 20 3d 20 28 75 6e 73 69 67 6e    z[2] = (unsign
3410: 65 64 20 63 68 61 72 29 28 79 25 32 35 36 29 3b  ed char)(y%256);
3420: 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20  .    return 3;. 
3430: 20 7d 0a 20 20 79 20 3d 20 28 75 6e 73 69 67 6e   }.  y = (unsign
3440: 65 64 20 69 6e 74 29 78 3b 0a 20 20 77 20 3d 20  ed int)x;.  w = 
3450: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28 78  (unsigned int)(x
3460: 3e 3e 33 32 29 3b 0a 20 20 69 66 28 20 77 3d 3d  >>32);.  if( w==
3470: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 79 3c 3d  0 ){.    if( y<=
3480: 31 36 37 37 37 32 31 35 20 29 7b 0a 20 20 20 20  16777215 ){.    
3490: 20 20 7a 5b 30 5d 20 3d 20 32 35 30 3b 0a 20 20    z[0] = 250;.  
34a0: 20 20 20 20 7a 5b 31 5d 20 3d 20 28 75 6e 73 69      z[1] = (unsi
34b0: 67 6e 65 64 20 63 68 61 72 29 28 79 3e 3e 31 36  gned char)(y>>16
34c0: 29 3b 0a 20 20 20 20 20 20 7a 5b 32 5d 20 3d 20  );.      z[2] = 
34d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
34e0: 79 3e 3e 38 29 3b 0a 20 20 20 20 20 20 7a 5b 33  y>>8);.      z[3
34f0: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
3500: 61 72 29 28 79 29 3b 0a 20 20 20 20 20 20 72 65  ar)(y);.      re
3510: 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
3520: 20 20 7a 5b 30 5d 20 3d 20 32 35 31 3b 0a 20 20    z[0] = 251;.  
3530: 20 20 76 61 72 69 6e 74 57 72 69 74 65 33 32 28    varintWrite32(
3540: 7a 2b 31 2c 20 79 29 3b 0a 20 20 20 20 72 65 74  z+1, y);.    ret
3550: 75 72 6e 20 35 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 5;.  }.  if(
3560: 20 77 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 7a   w<=255 ){.    z
3570: 5b 30 5d 20 3d 20 32 35 32 3b 0a 20 20 20 20 7a  [0] = 252;.    z
3580: 5b 31 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  [1] = (unsigned 
3590: 63 68 61 72 29 77 3b 0a 20 20 20 20 76 61 72 69  char)w;.    vari
35a0: 6e 74 57 72 69 74 65 33 32 28 7a 2b 32 2c 20 79  ntWrite32(z+2, y
35b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  );.    return 6;
35c0: 0a 20 20 7d 0a 20 20 69 66 28 20 77 3c 3d 36 35  .  }.  if( w<=65
35d0: 35 33 35 20 29 7b 0a 20 20 20 20 7a 5b 30 5d 20  535 ){.    z[0] 
35e0: 3d 20 32 35 33 3b 0a 20 20 20 20 7a 5b 31 5d 20  = 253;.    z[1] 
35f0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3600: 29 28 77 3e 3e 38 29 3b 0a 20 20 20 20 7a 5b 32  )(w>>8);.    z[2
3610: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
3620: 61 72 29 77 3b 0a 20 20 20 20 76 61 72 69 6e 74  ar)w;.    varint
3630: 57 72 69 74 65 33 32 28 7a 2b 33 2c 20 79 29 3b  Write32(z+3, y);
3640: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
3650: 20 7d 0a 20 20 69 66 28 20 77 3c 3d 31 36 37 37   }.  if( w<=1677
3660: 37 32 31 35 20 29 7b 0a 20 20 20 20 7a 5b 30 5d  7215 ){.    z[0]
3670: 20 3d 20 32 35 34 3b 0a 20 20 20 20 7a 5b 31 5d   = 254;.    z[1]
3680: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3690: 72 29 28 77 3e 3e 31 36 29 3b 0a 20 20 20 20 7a  r)(w>>16);.    z
36a0: 5b 32 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  [2] = (unsigned 
36b0: 63 68 61 72 29 28 77 3e 3e 38 29 3b 0a 20 20 20  char)(w>>8);.   
36c0: 20 7a 5b 33 5d 20 3d 20 28 75 6e 73 69 67 6e 65   z[3] = (unsigne
36d0: 64 20 63 68 61 72 29 77 3b 0a 20 20 20 20 76 61  d char)w;.    va
36e0: 72 69 6e 74 57 72 69 74 65 33 32 28 7a 2b 34 2c  rintWrite32(z+4,
36f0: 20 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   y);.    return 
3700: 38 3b 0a 20 20 7d 0a 20 20 7a 5b 30 5d 20 3d 20  8;.  }.  z[0] = 
3710: 32 35 35 3b 0a 20 20 76 61 72 69 6e 74 57 72 69  255;.  varintWri
3720: 74 65 33 32 28 7a 2b 31 2c 20 77 29 3b 0a 20 20  te32(z+1, w);.  
3730: 76 61 72 69 6e 74 57 72 69 74 65 33 32 28 7a 2b  varintWrite32(z+
3740: 35 2c 20 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  5, y);.  return 
3750: 39 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  9;.}../* Append 
3760: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
3770: 65 67 65 72 20 78 20 61 73 20 61 20 76 61 72 69  eger x as a vari
3780: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
3790: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ger..*/.static v
37a0: 6f 69 64 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70  oid lsm1VblobApp
37b0: 65 6e 64 56 61 72 69 6e 74 28 6c 73 6d 31 5f 76  endVarint(lsm1_v
37c0: 62 6c 6f 62 20 2a 70 2c 20 73 71 6c 69 74 65 33  blob *p, sqlite3
37d0: 5f 75 69 6e 74 36 34 20 78 29 7b 0a 20 20 73 71  _uint64 x){.  sq
37e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
37f0: 70 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 2b 39 3e  p->n;.  if( n+9>
3800: 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 6c 73 6d  p->nAlloc && lsm
3810: 31 56 62 6c 6f 62 45 6e 6c 61 72 67 65 28 70 2c  1VblobEnlarge(p,
3820: 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   9) ) return;.  
3830: 70 2d 3e 6e 20 2b 3d 20 6c 73 6d 31 50 75 74 56  p->n += lsm1PutV
3840: 61 72 69 6e 74 36 34 28 70 2d 3e 61 2b 70 2d 3e  arint64(p->a+p->
3850: 6e 2c 20 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n, x);.}../*.** 
3860: 44 65 63 6f 64 65 20 74 68 65 20 76 61 72 69 6e  Decode the varin
3870: 74 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  t in the first n
3880: 20 62 79 74 65 73 20 7a 5b 5d 2e 20 20 57 72 69   bytes z[].  Wri
3890: 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  te the integer v
38a0: 61 6c 75 65 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  alue.** into *pR
38b0: 65 73 75 6c 74 20 61 6e 64 20 72 65 74 75 72 6e  esult and return
38c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
38d0: 79 74 65 73 20 69 6e 20 74 68 65 20 76 61 72 69  ytes in the vari
38e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
38f0: 20 64 65 63 6f 64 65 20 66 61 69 6c 73 20 62 65   decode fails be
3900: 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
3910: 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
3920: 20 69 6e 20 7a 5b 5d 20 74 68 65 6e 0a 2a 2a 20   in z[] then.** 
3930: 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a 73 74 61  return 0;.*/.sta
3940: 74 69 63 20 69 6e 74 20 6c 73 6d 31 47 65 74 56  tic int lsm1GetV
3950: 61 72 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74  arint64(.  const
3960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3970: 7a 2c 0a 20 20 69 6e 74 20 6e 2c 0a 20 20 73 71  z,.  int n,.  sq
3980: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 2a 70 52  lite3_uint64 *pR
3990: 65 73 75 6c 74 0a 29 7b 0a 20 20 75 6e 73 69 67  esult.){.  unsig
39a0: 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20 69 66 28  ned int x;.  if(
39b0: 20 6e 3c 31 20 29 20 72 65 74 75 72 6e 20 30 3b   n<1 ) return 0;
39c0: 0a 20 20 69 66 28 20 7a 5b 30 5d 3c 3d 32 34 30  .  if( z[0]<=240
39d0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74   ){.    *pResult
39e0: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 72 65 74   = z[0];.    ret
39f0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
3a00: 20 7a 5b 30 5d 3c 3d 32 34 38 20 29 7b 0a 20 20   z[0]<=248 ){.  
3a10: 20 20 69 66 28 20 6e 3c 32 20 29 20 72 65 74 75    if( n<2 ) retu
3a20: 72 6e 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 75  rn 0;.    *pResu
3a30: 6c 74 20 3d 20 28 7a 5b 30 5d 2d 32 34 31 29 2a  lt = (z[0]-241)*
3a40: 32 35 36 20 2b 20 7a 5b 31 5d 20 2b 20 32 34 30  256 + z[1] + 240
3a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
3a60: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 7a 5b 30 5d    }.  if( n<z[0]
3a70: 2d 32 34 36 20 29 20 72 65 74 75 72 6e 20 30 3b  -246 ) return 0;
3a80: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 32 34 39  .  if( z[0]==249
3a90: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74   ){.    *pResult
3aa0: 20 3d 20 32 32 38 38 20 2b 20 32 35 36 2a 7a 5b   = 2288 + 256*z[
3ab0: 31 5d 20 2b 20 7a 5b 32 5d 3b 0a 20 20 20 20 72  1] + z[2];.    r
3ac0: 65 74 75 72 6e 20 33 3b 0a 20 20 7d 0a 20 20 69  eturn 3;.  }.  i
3ad0: 66 28 20 7a 5b 30 5d 3d 3d 32 35 30 20 29 7b 0a  f( z[0]==250 ){.
3ae0: 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 28      *pResult = (
3af0: 7a 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 7a 5b 32  z[1]<<16) + (z[2
3b00: 5d 3c 3c 38 29 20 2b 20 7a 5b 33 5d 3b 0a 20 20  ]<<8) + z[3];.  
3b10: 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 7d 0a    return 4;.  }.
3b20: 20 20 78 20 3d 20 28 7a 5b 31 5d 3c 3c 32 34 29    x = (z[1]<<24)
3b30: 20 2b 20 28 7a 5b 32 5d 3c 3c 31 36 29 20 2b 20   + (z[2]<<16) + 
3b40: 28 7a 5b 33 5d 3c 3c 38 29 20 2b 20 7a 5b 34 5d  (z[3]<<8) + z[4]
3b50: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 32 35  ;.  if( z[0]==25
3b60: 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c  1 ){.    *pResul
3b70: 74 20 3d 20 78 3b 0a 20 20 20 20 72 65 74 75 72  t = x;.    retur
3b80: 6e 20 35 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  n 5;.  }.  if( z
3b90: 5b 30 5d 3d 3d 32 35 32 20 29 7b 0a 20 20 20 20  [0]==252 ){.    
3ba0: 2a 70 52 65 73 75 6c 74 20 3d 20 28 28 28 73 71  *pResult = (((sq
3bb0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 78 29 3c  lite3_uint64)x)<
3bc0: 3c 38 29 20 2b 20 7a 5b 35 5d 3b 0a 20 20 20 20  <8) + z[5];.    
3bd0: 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
3be0: 69 66 28 20 7a 5b 30 5d 3d 3d 32 35 33 20 29 7b  if( z[0]==253 ){
3bf0: 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20  .    *pResult = 
3c00: 28 28 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  (((sqlite3_uint6
3c10: 34 29 78 29 3c 3c 31 36 29 20 2b 20 28 7a 5b 35  4)x)<<16) + (z[5
3c20: 5d 3c 3c 38 29 20 2b 20 7a 5b 36 5d 3b 0a 20 20  ]<<8) + z[6];.  
3c30: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
3c40: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 32 35 34 20    if( z[0]==254 
3c50: 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20  ){.    *pResult 
3c60: 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 75 69 6e  = (((sqlite3_uin
3c70: 74 36 34 29 78 29 3c 3c 32 34 29 20 2b 20 28 7a  t64)x)<<24) + (z
3c80: 5b 35 5d 3c 3c 31 36 29 20 2b 20 28 7a 5b 36 5d  [5]<<16) + (z[6]
3c90: 3c 3c 38 29 20 2b 20 7a 5b 37 5d 3b 0a 20 20 20  <<8) + z[7];.   
3ca0: 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 7d 0a 20   return 8;.  }. 
3cb0: 20 2a 70 52 65 73 75 6c 74 20 3d 20 28 28 28 73   *pResult = (((s
3cc0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 78 29  qlite3_uint64)x)
3cd0: 3c 3c 33 32 29 20 2b 0a 20 20 20 20 20 20 20 20  <<32) +.        
3ce0: 20 20 20 20 20 20 20 28 30 78 66 66 66 66 66 66         (0xffffff
3cf0: 66 66 20 26 20 28 28 7a 5b 35 5d 3c 3c 32 34 29  ff & ((z[5]<<24)
3d00: 20 2b 20 28 7a 5b 36 5d 3c 3c 31 36 29 20 2b 20   + (z[6]<<16) + 
3d10: 28 7a 5b 37 5d 3c 3c 38 29 20 2b 20 7a 5b 38 5d  (z[7]<<8) + z[8]
3d20: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 39 3b 0a  ));.  return 9;.
3d30: 7d 0a 0a 2f 2a 20 45 6e 63 6f 64 65 64 20 61 20  }../* Encoded a 
3d40: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
3d50: 73 20 61 20 76 61 72 69 6e 74 2e 20 20 4e 75 6d  s a varint.  Num
3d60: 62 65 72 73 20 63 6c 6f 73 65 20 74 6f 20 7a 65  bers close to ze
3d70: 72 6f 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a  ro uses fewer.**
3d80: 20 62 79 74 65 73 20 74 68 61 6e 20 6e 75 6d 62   bytes than numb
3d90: 65 72 73 20 66 61 72 20 61 77 61 79 20 66 72 6f  ers far away fro
3da0: 6d 20 7a 65 72 6f 2e 20 20 48 6f 77 65 76 65 72  m zero.  However
3db0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
3dc0: 6e 6f 74 20 69 6e 0a 2a 2a 20 6c 65 78 69 63 6f  not in.** lexico
3dd0: 67 72 61 70 68 69 63 61 6c 20 6f 72 64 65 72 2e  graphical order.
3de0: 0a 2a 2a 0a 2a 2a 20 45 6e 63 6f 64 69 6e 67 3a  .**.** Encoding:
3df0: 20 20 4e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69    Non-negative i
3e00: 6e 74 65 67 65 72 20 58 20 69 73 20 65 6e 63 6f  nteger X is enco
3e10: 64 69 6e 67 20 61 73 20 61 6e 20 75 6e 73 69 67  ding as an unsig
3e20: 6e 65 64 0a 2a 2a 20 76 61 72 69 6e 74 20 58 2a  ned.** varint X*
3e30: 32 2e 20 20 4e 65 67 61 74 69 76 65 20 69 6e 74  2.  Negative int
3e40: 65 67 65 72 20 59 20 69 73 20 65 6e 63 6f 64 69  eger Y is encodi
3e50: 6e 67 20 61 73 20 61 6e 20 75 6e 73 69 67 6e 65  ng as an unsigne
3e60: 64 0a 2a 2a 20 76 61 72 69 6e 74 20 28 31 2d 59  d.** varint (1-Y
3e70: 29 2a 32 20 2b 20 31 2e 0a 2a 2f 0a 73 74 61 74  )*2 + 1..*/.stat
3e80: 69 63 20 69 6e 74 20 6c 73 6d 31 50 75 74 53 69  ic int lsm1PutSi
3e90: 67 6e 65 64 56 61 72 69 6e 74 36 34 28 75 38 20  gnedVarint64(u8 
3ea0: 2a 7a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *z, sqlite3_int6
3eb0: 34 20 76 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4 v){.  sqlite3_
3ec0: 75 69 6e 74 36 34 20 75 3b 0a 20 20 69 66 28 20  uint64 u;.  if( 
3ed0: 76 3e 3d 30 20 29 7b 0a 20 20 20 20 75 20 3d 20  v>=0 ){.    u = 
3ee0: 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
3ef0: 76 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 73  v;.    return ls
3f00: 6d 31 50 75 74 56 61 72 69 6e 74 36 34 28 7a 2c  m1PutVarint64(z,
3f10: 20 75 2a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   u*2);.  }else{.
3f20: 20 20 20 20 75 20 3d 20 28 73 71 6c 69 74 65 33      u = (sqlite3
3f30: 5f 75 69 6e 74 36 34 29 28 2d 31 2d 76 29 3b 0a  _uint64)(-1-v);.
3f40: 20 20 20 20 72 65 74 75 72 6e 20 6c 73 6d 31 50      return lsm1P
3f50: 75 74 56 61 72 69 6e 74 36 34 28 7a 2c 20 75 2a  utVarint64(z, u*
3f60: 32 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  2+1);.  }.}../* 
3f70: 44 65 63 6f 64 65 64 20 61 20 73 69 67 6e 65 64  Decoded a signed
3f80: 20 76 61 72 69 6e 74 2e 20 2a 2f 0a 73 74 61 74   varint. */.stat
3f90: 69 63 20 69 6e 74 20 6c 73 6d 31 47 65 74 53 69  ic int lsm1GetSi
3fa0: 67 6e 65 64 56 61 72 69 6e 74 36 34 28 0a 20 20  gnedVarint64(.  
3fb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3fc0: 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e 2c  har *z,.  int n,
3fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3fe0: 20 2a 70 52 65 73 75 6c 74 0a 29 7b 0a 20 20 73   *pResult.){.  s
3ff0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 20  qlite3_uint64 u 
4000: 3d 20 30 3b 0a 20 20 6e 20 3d 20 6c 73 6d 31 47  = 0;.  n = lsm1G
4010: 65 74 56 61 72 69 6e 74 36 34 28 7a 2c 20 6e 2c  etVarint64(z, n,
4020: 20 26 75 29 3b 0a 20 20 69 66 28 20 75 26 31 20   &u);.  if( u&1 
4030: 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20  ){.    *pResult 
4040: 3d 20 2d 31 20 2d 20 28 73 71 6c 69 74 65 33 5f  = -1 - (sqlite3_
4050: 69 6e 74 36 34 29 28 75 3e 3e 31 29 3b 0a 20 20  int64)(u>>1);.  
4060: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73  }else{.    *pRes
4070: 75 6c 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  ult = (sqlite3_i
4080: 6e 74 36 34 29 28 75 3e 3e 31 29 3b 0a 20 20 7d  nt64)(u>>1);.  }
4090: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
40a0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
40b0: 76 61 6c 75 65 20 70 61 72 74 20 6f 66 20 74 68  value part of th
40c0: 65 20 6b 65 79 2d 76 61 6c 75 65 20 70 61 69 72  e key-value pair
40d0: 20 61 6e 64 20 64 65 63 6f 64 65 20 69 74 20 69   and decode it i
40e0: 6e 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  nto columns..*/.
40f0: 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 31 44  static int lsm1D
4100: 65 63 6f 64 65 56 61 6c 75 65 73 28 6c 73 6d 31  ecodeValues(lsm1
4110: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  _cursor *pCur){.
4120: 20 20 6c 73 6d 31 5f 76 74 61 62 20 2a 70 54 61    lsm1_vtab *pTa
4130: 62 20 3d 20 28 6c 73 6d 31 5f 76 74 61 62 2a 29  b = (lsm1_vtab*)
4140: 28 70 43 75 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCur->base.pVta
4150: 62 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  b);.  int i, n;.
4160: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65    int rc;.  u8 e
4170: 54 79 70 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Type;.  sqlite3_
4180: 75 69 6e 74 36 34 20 76 3b 0a 0a 20 20 69 66 28  uint64 v;..  if(
4190: 20 70 43 75 72 2d 3e 7a 44 61 74 61 20 29 20 72   pCur->zData ) r
41a0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20  eturn 1;.  rc = 
41b0: 6c 73 6d 5f 63 73 72 5f 76 61 6c 75 65 28 70 43  lsm_csr_value(pC
41c0: 75 72 2d 3e 70 4c 73 6d 43 75 72 2c 20 28 63 6f  ur->pLsmCur, (co
41d0: 6e 73 74 20 76 6f 69 64 2a 2a 29 26 70 43 75 72  nst void**)&pCur
41e0: 2d 3e 7a 44 61 74 61 2c 0a 20 20 20 20 20 20 20  ->zData,.       
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
4200: 6e 74 2a 29 26 70 43 75 72 2d 3e 6e 44 61 74 61  nt*)&pCur->nData
4210: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
4220: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
4230: 6e 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 56 61  n=0; i<pTab->nVa
4240: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d  l; i++){.    v =
4250: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 6c 73 6d   0;.    n += lsm
4260: 31 47 65 74 56 61 72 69 6e 74 36 34 28 70 43 75  1GetVarint64(pCu
4270: 72 2d 3e 7a 44 61 74 61 2b 6e 2c 20 70 43 75 72  r->zData+n, pCur
4280: 2d 3e 6e 44 61 74 61 2d 6e 2c 20 26 76 29 3b 0a  ->nData-n, &v);.
4290: 20 20 20 20 70 43 75 72 2d 3e 61 65 54 79 70 65      pCur->aeType
42a0: 5b 69 5d 20 3d 20 65 54 79 70 65 20 3d 20 28 75  [i] = eType = (u
42b0: 38 29 28 76 25 36 29 3b 0a 20 20 20 20 69 66 28  8)(v%6);.    if(
42c0: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
42d0: 20 20 20 70 43 75 72 2d 3e 61 69 4f 66 73 74 5b     pCur->aiOfst[
42e0: 69 5d 20 3d 20 28 75 33 32 29 28 76 2f 36 29 3b  i] = (u32)(v/6);
42f0: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 4c  .      pCur->aiL
4300: 65 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  en[i] = 0;.    }
4310: 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 70 43 75  else{ .      pCu
4320: 72 2d 3e 61 69 4f 66 73 74 5b 69 5d 20 3d 20 6e  r->aiOfst[i] = n
4330: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 70 43  ;.      n += (pC
4340: 75 72 2d 3e 61 69 4c 65 6e 5b 69 5d 20 3d 20 28  ur->aiLen[i] = (
4350: 75 33 32 29 28 76 2f 36 29 29 3b 0a 20 20 20 20  u32)(v/6));.    
4360: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 70 43 75 72  }.    if( n>pCur
4370: 2d 3e 6e 44 61 74 61 20 29 20 62 72 65 61 6b 3b  ->nData ) break;
4380: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 70 54 61  .  }.  if( i<pTa
4390: 62 2d 3e 6e 56 61 6c 20 29 7b 0a 20 20 20 20 70  b->nVal ){.    p
43a0: 43 75 72 2d 3e 7a 44 61 74 61 20 3d 20 30 3b 0a  Cur->zData = 0;.
43b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
43c0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
43d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  ./*.** Return va
43e0: 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  lues of columns 
43f0: 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77  for the row at w
4400: 68 69 63 68 20 74 68 65 20 6c 73 6d 31 5f 63 75  hich the lsm1_cu
4410: 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
4420: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
4430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  /.static int lsm
4440: 31 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74  1Column(.  sqlit
4450: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
4460: 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75  cur,   /* The cu
4470: 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rsor */.  sqlite
4480: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
4490: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
44a0: 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
44b0: 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20  e3_result_...() 
44c0: 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20 20  */.  int i      
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e   /* Which column
44f0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
4500: 0a 20 20 6c 73 6d 31 5f 63 75 72 73 6f 72 20 2a  .  lsm1_cursor *
4510: 70 43 75 72 20 3d 20 28 6c 73 6d 31 5f 63 75 72  pCur = (lsm1_cur
4520: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6c 73 6d 31  sor*)cur;.  lsm1
4530: 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28 6c  _vtab *pTab = (l
4540: 73 6d 31 5f 76 74 61 62 2a 29 28 63 75 72 2d 3e  sm1_vtab*)(cur->
4550: 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 69 3d  pVtab);.  if( i=
4560: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
4570: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   key column */. 
4580: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70     const void *p
4590: 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 56 61  Val;.    int nVa
45a0: 6c 3b 0a 20 20 20 20 69 66 28 20 6c 73 6d 5f 63  l;.    if( lsm_c
45b0: 73 72 5f 6b 65 79 28 70 43 75 72 2d 3e 70 4c 73  sr_key(pCur->pLs
45c0: 6d 43 75 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56  mCur, &pVal, &nV
45d0: 61 6c 29 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20  al)==LSM_OK ){. 
45e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6b       if( pTab->k
45f0: 65 79 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  eyType==SQLITE_B
4600: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73  LOB ){.        s
4610: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
4620: 6f 62 28 63 74 78 2c 20 70 56 61 6c 2c 20 6e 56  ob(ctx, pVal, nV
4630: 61 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  al, SQLITE_TRANS
4640: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c  IENT);.      }el
4650: 73 65 20 69 66 28 20 70 54 61 62 2d 3e 6b 65 79  se if( pTab->key
4660: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
4670: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
4680: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4690: 28 63 74 78 2c 28 63 6f 6e 73 74 20 63 68 61 72  (ctx,(const char
46a0: 2a 29 70 56 61 6c 2c 20 6e 56 61 6c 2c 20 53 51  *)pVal, nVal, SQ
46b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
46c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
46d0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
46e0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
46f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4700: 68 61 72 2a 29 70 56 61 6c 3b 0a 20 20 20 20 20  har*)pVal;.     
4710: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
4720: 34 20 76 31 3b 0a 20 20 20 20 20 20 20 20 6c 73  4 v1;.        ls
4730: 6d 31 47 65 74 56 61 72 69 6e 74 36 34 28 7a 2c  m1GetVarint64(z,
4740: 20 6e 56 61 6c 2c 20 26 76 31 29 3b 0a 20 20 20   nVal, &v1);.   
4750: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4760: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 28  ult_int64(ctx, (
4770: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76 31  sqlite3_int64)v1
4780: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4790: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3e 70  .  }else if( i>p
47a0: 54 61 62 2d 3e 6e 56 61 6c 20 29 7b 0a 20 20 20  Tab->nVal ){.   
47b0: 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 6e 56   if( i==pTab->nV
47c0: 61 6c 2b 32 20 29 7b 20 20 2f 2a 20 6c 73 6d 31  al+2 ){  /* lsm1
47d0: 5f 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 63 6f  _key */.      co
47e0: 6e 73 74 20 76 6f 69 64 20 2a 70 56 61 6c 3b 0a  nst void *pVal;.
47f0: 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 0a        int nVal;.
4800: 20 20 20 20 20 20 69 66 28 20 6c 73 6d 5f 63 73        if( lsm_cs
4810: 72 5f 6b 65 79 28 70 43 75 72 2d 3e 70 4c 73 6d  r_key(pCur->pLsm
4820: 43 75 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61  Cur, &pVal, &nVa
4830: 6c 29 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  l)==LSM_OK ){.  
4840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4850: 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20 70  sult_blob(ctx, p
4860: 56 61 6c 2c 20 6e 56 61 6c 2c 20 53 51 4c 49 54  Val, nVal, SQLIT
4870: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
4880: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
4890: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 6e 56 61  if( i==pTab->nVa
48a0: 6c 2b 33 20 29 7b 20 20 2f 2a 20 6c 73 6d 31 5f  l+3 ){  /* lsm1_
48b0: 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 63  value */.      c
48c0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 56 61 6c 3b  onst void *pVal;
48d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
48e0: 0a 20 20 20 20 20 20 69 66 28 20 6c 73 6d 5f 63  .      if( lsm_c
48f0: 73 72 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70  sr_value(pCur->p
4900: 4c 73 6d 43 75 72 2c 20 26 70 56 61 6c 2c 20 26  LsmCur, &pVal, &
4910: 6e 56 61 6c 29 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  nVal)==LSM_OK ){
4920: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4930: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78  _result_blob(ctx
4940: 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 2c 20 53 51  , pVal, nVal, SQ
4950: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4960: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4970: 20 7d 65 6c 73 65 20 69 66 28 20 6c 73 6d 31 44   }else if( lsm1D
4980: 65 63 6f 64 65 56 61 6c 75 65 73 28 70 43 75 72  ecodeValues(pCur
4990: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
49a0: 69 2d 74 68 20 76 61 6c 75 65 20 63 6f 6c 75 6d  i-th value colum
49b0: 6e 20 28 77 68 65 72 65 20 6c 65 66 74 6d 6f 73  n (where leftmos
49c0: 74 20 69 73 20 31 29 20 2a 2f 0a 20 20 20 20 63  t is 1) */.    c
49d0: 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 0a  onst u8 *zData;.
49e0: 20 20 20 20 75 33 32 20 6e 44 61 74 61 3b 0a 20      u32 nData;. 
49f0: 20 20 20 69 2d 2d 3b 0a 20 20 20 20 7a 44 61 74     i--;.    zDat
4a00: 61 20 3d 20 70 43 75 72 2d 3e 7a 44 61 74 61 20  a = pCur->zData 
4a10: 2b 20 70 43 75 72 2d 3e 61 69 4f 66 73 74 5b 69  + pCur->aiOfst[i
4a20: 5d 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 70  ];.    nData = p
4a30: 43 75 72 2d 3e 61 69 4c 65 6e 5b 69 5d 3b 0a 20  Cur->aiLen[i];. 
4a40: 20 20 20 73 77 69 74 63 68 28 20 70 43 75 72 2d     switch( pCur-
4a50: 3e 61 65 54 79 70 65 5b 69 5d 20 29 7b 0a 20 20  >aeType[i] ){.  
4a60: 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
4a70: 2a 20 69 6e 2d 6c 69 6e 65 20 69 6e 74 65 67 65  * in-line intege
4a80: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  r */.        sql
4a90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
4aa0: 63 74 78 2c 20 70 43 75 72 2d 3e 61 69 4f 66 73  ctx, pCur->aiOfs
4ab0: 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  t[i]);.        b
4ac0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4ad0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4ae0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
4af0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
4b00: 20 76 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d 31   v;.        lsm1
4b10: 47 65 74 53 69 67 6e 65 64 56 61 72 69 6e 74 36  GetSignedVarint6
4b20: 34 28 7a 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  4(zData, nData, 
4b30: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  &v);.        sql
4b40: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4b50: 34 28 63 74 78 2c 20 76 29 3b 0a 20 20 20 20 20  4(ctx, v);.     
4b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4b70: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  }.      case SQL
4b80: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
4b90: 20 20 20 20 20 64 6f 75 62 6c 65 20 76 3b 0a 20       double v;. 
4ba0: 20 20 20 20 20 20 20 69 66 28 20 6e 44 61 74 61         if( nData
4bb0: 3d 3d 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20  ==sizeof(v) ){. 
4bc0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
4bd0: 26 76 2c 20 7a 44 61 74 61 2c 20 73 69 7a 65 6f  &v, zData, sizeo
4be0: 66 28 76 29 29 3b 0a 20 20 20 20 20 20 20 20 20  f(v));.         
4bf0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4c00: 64 6f 75 62 6c 65 28 63 74 78 2c 20 76 29 3b 0a  double(ctx, v);.
4c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4c30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
4c40: 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
4c50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4c60: 74 5f 74 65 78 74 28 63 74 78 2c 20 28 63 6f 6e  t_text(ctx, (con
4c70: 73 74 20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20  st char*)zData, 
4c80: 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 54 52  nData, SQLITE_TR
4c90: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
4ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4cb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
4cc0: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
4cd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4ce0: 74 5f 62 6c 6f 62 28 63 74 78 2c 20 7a 44 61 74  t_blob(ctx, zDat
4cf0: 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45  a, nData, SQLITE
4d00: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
4d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4d20: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
4d30: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a  t: {.         /*
4d40: 20 41 20 4e 55 4c 4c 2e 20 20 44 6f 20 6e 6f 74   A NULL.  Do not
4d50: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  hing */.      }.
4d60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4d70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4d80: 0a 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 22 70  ./* Parameter "p
4d90: 56 61 6c 75 65 22 20 63 6f 6e 74 61 69 6e 73 20  Value" contains 
4da0: 61 6e 20 53 51 4c 20 76 61 6c 75 65 20 74 68 61  an SQL value tha
4db0: 74 20 69 73 20 74 6f 20 62 65 20 75 73 65 64 20  t is to be used 
4dc0: 61 73 0a 2a 2a 20 61 20 6b 65 79 20 69 6e 20 61  as.** a key in a
4dd0: 6e 20 4c 53 4d 20 74 61 62 6c 65 2e 20 20 54 68  n LSM table.  Th
4de0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 6b 65  e type of the ke
4df0: 79 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  y is determined 
4e00: 62 79 0a 2a 2a 20 22 6b 65 79 54 79 70 65 22 2e  by.** "keyType".
4e10: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 61    Extract the ra
4e20: 77 20 62 79 74 65 73 20 75 73 65 64 20 66 6f 72  w bytes used for
4e30: 20 74 68 65 20 6b 65 79 20 69 6e 20 4c 53 4d 31   the key in LSM1
4e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4e50: 20 6c 73 6d 31 4b 65 79 46 72 6f 6d 56 61 6c 75   lsm1KeyFromValu
4e60: 65 28 0a 20 20 69 6e 74 20 6b 65 79 54 79 70 65  e(.  int keyType
4e70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4e80: 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 79 70    /* The key typ
4e90: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
4ea0: 61 6c 75 65 20 2a 70 56 61 6c 75 65 2c 20 20 20  alue *pValue,   
4eb0: 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 76      /* The key v
4ec0: 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 2a 70 42  alue */.  u8 *pB
4ed0: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
4ee0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 61 67         /* Storag
4ef0: 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 67 65  e space for a ge
4f00: 6e 65 72 61 74 65 64 20 6b 65 79 20 2a 2f 0a 20  nerated key */. 
4f10: 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 4b 65   const u8 **ppKe
4f20: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y,            /*
4f30: 20 4f 55 54 3a 20 74 68 65 20 62 79 74 65 73 20   OUT: the bytes 
4f40: 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  of the key */.  
4f50: 69 6e 74 20 2a 70 6e 4b 65 79 20 20 20 20 20 20  int *pnKey      
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f70: 4f 55 54 3a 20 73 69 7a 65 20 6f 66 20 74 68 65  OUT: size of the
4f80: 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   key */.){.  if(
4f90: 20 6b 65 79 54 79 70 65 3d 3d 53 51 4c 49 54 45   keyType==SQLITE
4fa0: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 2a 70 70  _BLOB ){.    *pp
4fb0: 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  Key = (const u8*
4fc0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
4fd0: 6c 6f 62 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  lob(pValue);.   
4fe0: 20 2a 70 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65   *pnKey = sqlite
4ff0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
5000: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  alue);.  }else i
5010: 66 28 20 6b 65 79 54 79 70 65 3d 3d 53 51 4c 49  f( keyType==SQLI
5020: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2a  TE_TEXT ){.    *
5030: 70 70 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  ppKey = (const u
5040: 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  8*)sqlite3_value
5050: 5f 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20  _text(pValue);. 
5060: 20 20 20 2a 70 6e 4b 65 79 20 3d 20 73 71 6c 69     *pnKey = sqli
5070: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5080: 70 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65  pValue);.  }else
5090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
50a0: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
50b0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
50c0: 75 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3c 30  ue);.    if( v<0
50d0: 20 29 20 76 20 3d 20 30 3b 0a 20 20 20 20 2a 70   ) v = 0;.    *p
50e0: 6e 4b 65 79 20 3d 20 6c 73 6d 31 50 75 74 56 61  nKey = lsm1PutVa
50f0: 72 69 6e 74 36 34 28 70 42 75 66 2c 20 76 29 3b  rint64(pBuf, v);
5100: 0a 20 20 20 20 2a 70 70 4b 65 79 20 3d 20 70 42  .    *ppKey = pB
5110: 75 66 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 4d 6f  uf;.  }.}../* Mo
5120: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
5130: 72 6f 77 20 74 6f 20 72 65 74 75 72 6e 2e 0a 2a  row to return..*
5140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  /.static int lsm
5150: 31 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  1Filter(.  sqlit
5160: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
5170: 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20  pVtabCursor, .  
5180: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
5190: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
51a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
51b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
51c0: 0a 29 7b 0a 20 20 6c 73 6d 31 5f 63 75 72 73 6f  .){.  lsm1_curso
51d0: 72 20 2a 70 43 75 72 20 3d 20 28 6c 73 6d 31 5f  r *pCur = (lsm1_
51e0: 63 75 72 73 6f 72 20 2a 29 70 56 74 61 62 43 75  cursor *)pVtabCu
51f0: 72 73 6f 72 3b 0a 20 20 6c 73 6d 31 5f 76 74 61  rsor;.  lsm1_vta
5200: 62 20 2a 70 54 61 62 20 3d 20 28 6c 73 6d 31 5f  b *pTab = (lsm1_
5210: 76 74 61 62 2a 29 28 70 43 75 72 2d 3e 62 61 73  vtab*)(pCur->bas
5220: 65 2e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74 20  e.pVtab);.  int 
5230: 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69  rc = LSM_OK;.  i
5240: 6e 74 20 73 65 65 6b 54 79 70 65 20 3d 20 2d 31  nt seekType = -1
5250: 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 56  ;.  const u8 *pV
5260: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 56  al = 0;.  int nV
5270: 61 6c 3b 0a 20 20 75 38 20 6b 65 79 54 79 70 65  al;.  u8 keyType
5280: 20 3d 20 70 54 61 62 2d 3e 6b 65 79 54 79 70 65   = pTab->keyType
5290: 3b 0a 20 20 75 38 20 61 4b 65 79 31 5b 31 36 5d  ;.  u8 aKey1[16]
52a0: 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 74 45 6f 66  ;..  pCur->atEof
52b0: 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 1;.  sqlite3_
52c0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 32  free(pCur->pKey2
52d0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 32  );.  pCur->pKey2
52e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 4e   = 0;.  if( idxN
52f0: 75 6d 3c 39 39 20 29 7b 0a 20 20 20 20 6c 73 6d  um<99 ){.    lsm
5300: 31 4b 65 79 46 72 6f 6d 56 61 6c 75 65 28 6b 65  1KeyFromValue(ke
5310: 79 54 79 70 65 2c 20 61 72 67 76 5b 30 5d 2c 20  yType, argv[0], 
5320: 61 4b 65 79 31 2c 20 26 70 56 61 6c 2c 20 26 6e  aKey1, &pVal, &n
5330: 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  Val);.  }.  swit
5340: 63 68 28 20 69 64 78 4e 75 6d 20 29 7b 0a 20 20  ch( idxNum ){.  
5350: 20 20 63 61 73 65 20 30 3a 20 7b 20 20 20 2f 2a    case 0: {   /*
5360: 20 6b 65 79 3d 3d 61 72 67 76 5b 30 5d 20 2a 2f   key==argv[0] */
5370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
5380: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  rgc==1 );.      
5390: 73 65 65 6b 54 79 70 65 20 3d 20 4c 53 4d 5f 53  seekType = LSM_S
53a0: 45 45 4b 5f 45 51 3b 0a 20 20 20 20 20 20 70 43  EEK_EQ;.      pC
53b0: 75 72 2d 3e 69 73 44 65 73 63 20 3d 20 30 3b 0a  ur->isDesc = 0;.
53c0: 20 20 20 20 20 20 70 43 75 72 2d 3e 62 55 6e 69        pCur->bUni
53d0: 71 75 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  que = 1;.      b
53e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
53f0: 63 61 73 65 20 31 3a 20 7b 20 20 2f 2a 20 6b 65  case 1: {  /* ke
5400: 79 3e 3d 61 72 67 76 5b 30 5d 20 41 4e 44 20 6b  y>=argv[0] AND k
5410: 65 79 3c 3d 61 72 67 76 5b 31 5d 20 2a 2f 0a 20  ey<=argv[1] */. 
5420: 20 20 20 20 20 75 38 20 61 4b 65 79 5b 31 32 5d       u8 aKey[12]
5430: 3b 0a 20 20 20 20 20 20 73 65 65 6b 54 79 70 65  ;.      seekType
5440: 20 3d 20 4c 53 4d 5f 53 45 45 4b 5f 47 45 3b 0a   = LSM_SEEK_GE;.
5450: 20 20 20 20 20 20 70 43 75 72 2d 3e 69 73 44 65        pCur->isDe
5460: 73 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  sc = 0;.      pC
5470: 75 72 2d 3e 62 55 6e 69 71 75 65 20 3d 20 30 3b  ur->bUnique = 0;
5480: 0a 20 20 20 20 20 20 69 66 28 20 6b 65 79 54 79  .      if( keyTy
5490: 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
54a0: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ER ){.        sq
54b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20  lite3_int64 v = 
54c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
54d0: 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  t64(argv[1]);.  
54e0: 20 20 20 20 20 20 69 66 28 20 76 3c 30 20 29 20        if( v<0 ) 
54f0: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  v = 0;.        p
5500: 43 75 72 2d 3e 6e 4b 65 79 32 20 3d 20 6c 73 6d  Cur->nKey2 = lsm
5510: 31 50 75 74 56 61 72 69 6e 74 36 34 28 61 4b 65  1PutVarint64(aKe
5520: 79 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  y, (sqlite3_uint
5530: 36 34 29 76 29 3b 0a 20 20 20 20 20 20 20 20 70  64)v);.        p
5540: 43 75 72 2d 3e 70 4b 65 79 32 20 3d 20 73 71 6c  Cur->pKey2 = sql
5550: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 43 75  ite3_malloc( pCu
5560: 72 2d 3e 6e 4b 65 79 32 20 29 3b 0a 20 20 20 20  r->nKey2 );.    
5570: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4b      if( pCur->pK
5580: 65 79 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ey2==0 ) return 
5590: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
55a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 75        memcpy(pCu
55b0: 72 2d 3e 70 4b 65 79 32 2c 20 61 4b 65 79 2c 20  r->pKey2, aKey, 
55c0: 70 43 75 72 2d 3e 6e 4b 65 79 32 29 3b 0a 20 20  pCur->nKey2);.  
55d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55e0: 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 32 20 3d     pCur->nKey2 =
55f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5600: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
5610: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5620: 79 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  y2 = sqlite3_mal
5630: 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 32  loc( pCur->nKey2
5640: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
5650: 70 43 75 72 2d 3e 70 4b 65 79 32 3d 3d 30 20 29  pCur->pKey2==0 )
5660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5670: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 69 66  OMEM;.        if
5680: 28 20 6b 65 79 54 79 70 65 3d 3d 53 51 4c 49 54  ( keyType==SQLIT
5690: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
56a0: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 75 72 2d      memcpy(pCur-
56b0: 3e 70 4b 65 79 32 2c 20 73 71 6c 69 74 65 33 5f  >pKey2, sqlite3_
56c0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
56d0: 31 5d 29 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 32  1]), pCur->nKey2
56e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
56f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5700: 70 79 28 70 43 75 72 2d 3e 70 4b 65 79 32 2c 20  py(pCur->pKey2, 
5710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5720: 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 70 43 75  xt(argv[1]), pCu
5730: 72 2d 3e 6e 4b 65 79 32 29 3b 0a 20 20 20 20 20  r->nKey2);.     
5740: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5760: 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 20 2f      case 2: {  /
5770: 2a 20 6b 65 79 3e 3d 61 72 67 76 5b 30 5d 20 2a  * key>=argv[0] *
5780: 2f 0a 20 20 20 20 20 20 73 65 65 6b 54 79 70 65  /.      seekType
5790: 20 3d 20 4c 53 4d 5f 53 45 45 4b 5f 47 45 3b 0a   = LSM_SEEK_GE;.
57a0: 20 20 20 20 20 20 70 43 75 72 2d 3e 69 73 44 65        pCur->isDe
57b0: 73 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  sc = 0;.      pC
57c0: 75 72 2d 3e 62 55 6e 69 71 75 65 20 3d 20 30 3b  ur->bUnique = 0;
57d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
57e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
57f0: 7b 20 20 2f 2a 20 6b 65 79 3c 3d 61 72 67 76 5b  {  /* key<=argv[
5800: 30 5d 20 2a 2f 0a 20 20 20 20 20 20 73 65 65 6b  0] */.      seek
5810: 54 79 70 65 20 3d 20 4c 53 4d 5f 53 45 45 4b 5f  Type = LSM_SEEK_
5820: 4c 45 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  LE;.      pCur->
5830: 69 73 44 65 73 63 20 3d 20 31 3b 0a 20 20 20 20  isDesc = 1;.    
5840: 20 20 70 43 75 72 2d 3e 62 55 6e 69 71 75 65 20    pCur->bUnique 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
5860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5870: 75 6c 74 3a 20 7b 20 2f 2a 20 66 75 6c 6c 20 74  ult: { /* full t
5880: 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
5890: 20 20 20 70 43 75 72 2d 3e 69 73 44 65 73 63 20     pCur->isDesc 
58a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
58b0: 3e 62 55 6e 69 71 75 65 20 3d 20 30 3b 0a 20 20  >bUnique = 0;.  
58c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
58d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 56 61 6c 20  .  }.  if( pVal 
58e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f  ){.    rc = lsm_
58f0: 63 73 72 5f 73 65 65 6b 28 70 43 75 72 2d 3e 70  csr_seek(pCur->p
5900: 4c 73 6d 43 75 72 2c 20 70 56 61 6c 2c 20 6e 56  LsmCur, pVal, nV
5910: 61 6c 2c 20 73 65 65 6b 54 79 70 65 29 3b 0a 20  al, seekType);. 
5920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
5930: 20 6c 73 6d 5f 63 73 72 5f 66 69 72 73 74 28 70   lsm_csr_first(p
5940: 43 75 72 2d 3e 70 4c 73 6d 43 75 72 29 3b 0a 20  Cur->pLsmCur);. 
5950: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d   }.  if( rc==LSM
5960: 5f 4f 4b 20 26 26 20 6c 73 6d 5f 63 73 72 5f 76  _OK && lsm_csr_v
5970: 61 6c 69 64 28 70 43 75 72 2d 3e 70 4c 73 6d 43  alid(pCur->pLsmC
5980: 75 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  ur)!=0 ){.    pC
5990: 75 72 2d 3e 61 74 45 6f 66 20 3d 20 30 3b 0a 20  ur->atEof = 0;. 
59a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3d 3d   }.  return rc==
59b0: 4c 53 4d 5f 4f 4b 20 3f 20 53 51 4c 49 54 45 5f  LSM_OK ? SQLITE_
59c0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  OK : SQLITE_ERRO
59d0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79  R;.}../*.** Only
59e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 67 61   comparisons aga
59f0: 69 6e 73 74 20 74 68 65 20 6b 65 79 20 61 72 65  inst the key are
5a00: 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 69   allowed.  The i
5a10: 64 78 4e 75 6d 20 64 65 66 69 6e 65 73 0a 2a 2a  dxNum defines.**
5a20: 20 77 68 69 63 68 20 63 6f 6d 70 61 72 69 73 6f   which compariso
5a30: 6e 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ns are available
5a40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 20 20  :.**.**     0   
5a50: 20 20 20 20 20 6b 65 79 3d 3d 3f 31 0a 2a 2a 20       key==?1.** 
5a60: 20 20 20 20 31 20 20 20 20 20 20 20 20 6b 65 79      1        key
5a70: 3e 3d 3f 31 20 41 4e 44 20 6b 65 79 3c 3d 3f 32  >=?1 AND key<=?2
5a80: 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 20 20 20  .**     2       
5a90: 20 6b 65 79 3e 3f 31 20 6f 72 20 6b 65 79 3e 3d   key>?1 or key>=
5aa0: 3f 31 0a 2a 2a 20 20 20 20 20 33 20 20 20 20 20  ?1.**     3     
5ab0: 20 20 20 6b 65 79 3c 3f 31 20 6f 72 20 6b 65 79     key<?1 or key
5ac0: 3c 3d 3f 31 0a 2a 2a 20 20 20 20 39 39 20 20 20  <=?1.**    99   
5ad0: 20 20 20 20 20 46 75 6c 6c 20 74 61 62 6c 65 20       Full table 
5ae0: 73 63 61 6e 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61  scan only.*/.sta
5af0: 74 69 63 20 69 6e 74 20 6c 73 6d 31 42 65 73 74  tic int lsm1Best
5b00: 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
5b10: 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71  _vtab *tab,.  sq
5b20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
5b30: 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20   *pIdxInfo.){.  
5b40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5b50: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f         /* Loop o
5b60: 76 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ver constraints 
5b70: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 20  */.  int idxNum 
5b80: 3d 20 39 39 3b 20 20 20 20 20 20 20 2f 2a 20 54  = 99;       /* T
5b90: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  he query plan */
5ba0: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
5bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5bc0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5bd0: 20 74 6f 20 78 46 69 6c 74 65 72 20 2a 2f 0a 20   to xFilter */. 
5be0: 20 69 6e 74 20 61 72 67 49 64 78 20 3d 20 2d 31   int argIdx = -1
5bf0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ;       /* Index
5c00: 20 6f 66 20 74 68 65 20 6b 65 79 3d 3d 20 63 6f   of the key== co
5c10: 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 2d 31 20  nstraint, or -1 
5c20: 69 66 20 6e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  if none */.  int
5c30: 20 69 49 64 78 32 20 3d 20 2d 31 3b 20 20 20 20   iIdx2 = -1;    
5c40: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
5c50: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 6b   of the second k
5c60: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  ey */.  int omit
5c70: 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 6d 69  1 = 0;.  int omi
5c80: 74 32 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73 74  t2 = 0;..  const
5c90: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
5ca0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
5cb0: 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20   *pConstraint;. 
5cc0: 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
5cd0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
5ce0: 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
5cf0: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
5d00: 6e 73 74 72 61 69 6e 74 20 26 26 20 69 64 78 4e  nstraint && idxN
5d10: 75 6d 3c 31 36 3b 20 69 2b 2b 2c 20 70 43 6f 6e  um<16; i++, pCon
5d20: 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
5d30: 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
5d40: 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e  >usable==0 ) con
5d50: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
5d60: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
5d70: 75 6d 6e 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  umn!=0 ) continu
5d80: 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  e;.    switch( p
5d90: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 20 29  Constraint->op )
5da0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
5db0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
5dc0: 41 49 4e 54 5f 45 51 3a 20 7b 0a 20 20 20 20 20  AINT_EQ: {.     
5dd0: 20 20 20 69 66 28 20 69 64 78 4e 75 6d 3e 30 20     if( idxNum>0 
5de0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 72 67  ){.          arg
5df0: 49 64 78 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Idx = i;.       
5e00: 20 20 20 69 49 64 78 32 20 3d 20 2d 31 3b 0a 20     iIdx2 = -1;. 
5e10: 20 20 20 20 20 20 20 20 20 69 64 78 4e 75 6d 20           idxNum 
5e20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  = 0;.          o
5e30: 6d 69 74 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  mit1 = 1;.      
5e40: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5e50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5e60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
5e70: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
5e80: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  :.      case SQL
5e90: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
5ea0: 41 49 4e 54 5f 47 54 3a 20 7b 0a 20 20 20 20 20  AINT_GT: {.     
5eb0: 20 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 39     if( idxNum==9
5ec0: 39 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  9 ){.          a
5ed0: 72 67 49 64 78 20 3d 20 69 3b 0a 20 20 20 20 20  rgIdx = i;.     
5ee0: 20 20 20 20 20 69 64 78 4e 75 6d 20 3d 20 32 3b       idxNum = 2;
5ef0: 0a 20 20 20 20 20 20 20 20 20 20 6f 6d 69 74 31  .          omit1
5f00: 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e   = pConstraint->
5f10: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
5f20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3b 0a  _CONSTRAINT_GE;.
5f30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5f40: 28 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20  ( idxNum==3 ){. 
5f50: 20 20 20 20 20 20 20 20 20 69 49 64 78 32 20 3d           iIdx2 =
5f60: 20 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 20   idxNum;.       
5f70: 20 20 20 6f 6d 69 74 32 20 3d 20 6f 6d 69 74 31     omit2 = omit1
5f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 72 67 49  ;.          argI
5f90: 64 78 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  dx = i;.        
5fa0: 20 20 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20    idxNum = 1;.  
5fb0: 20 20 20 20 20 20 20 20 6f 6d 69 74 31 20 3d 20          omit1 = 
5fc0: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
5fd0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
5fe0: 4e 53 54 52 41 49 4e 54 5f 47 45 3b 0a 20 20 20  NSTRAINT_GE;.   
5ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
6000: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6010: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6020: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
6030: 5f 4c 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  _LE:.      case 
6040: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
6050: 53 54 52 41 49 4e 54 5f 4c 54 3a 20 7b 0a 20 20  STRAINT_LT: {.  
6060: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d        if( idxNum
6070: 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 20 20  ==99 ){.        
6080: 20 20 61 72 67 49 64 78 20 3d 20 69 3b 0a 20 20    argIdx = i;.  
6090: 20 20 20 20 20 20 20 20 69 64 78 4e 75 6d 20 3d          idxNum =
60a0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6d   3;.          om
60b0: 69 74 31 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e  it1 = pConstrain
60c0: 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
60d0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
60e0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
60f0: 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 32 20 29   if( idxNum==2 )
6100: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 64 78  {.          iIdx
6110: 32 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  2 = i;.         
6120: 20 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20   idxNum = 1;.   
6130: 20 20 20 20 20 20 20 6f 6d 69 74 31 20 3d 20 70         omit1 = p
6140: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
6150: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
6160: 53 54 52 41 49 4e 54 5f 4c 45 3b 0a 20 20 20 20  STRAINT_LE;.    
6170: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
6180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6190: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67   }.  }.  if( arg
61a0: 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49  Idx>=0 ){.    pI
61b0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
61c0: 69 6e 74 55 73 61 67 65 5b 61 72 67 49 64 78 5d  intUsage[argIdx]
61d0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b 6e  .argvIndex = ++n
61e0: 41 72 67 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  Arg;.    pIdxInf
61f0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
6200: 61 67 65 5b 61 72 67 49 64 78 5d 2e 6f 6d 69 74  age[argIdx].omit
6210: 20 3d 20 6f 6d 69 74 31 3b 0a 20 20 7d 0a 20 20   = omit1;.  }.  
6220: 69 66 28 20 69 49 64 78 32 3e 3d 30 20 29 7b 0a  if( iIdx2>=0 ){.
6230: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
6240: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
6250: 49 64 78 32 5d 2e 61 72 67 76 49 6e 64 65 78 20  Idx2].argvIndex 
6260: 3d 20 2b 2b 6e 41 72 67 3b 0a 20 20 20 20 70 49  = ++nArg;.    pI
6270: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
6280: 69 6e 74 55 73 61 67 65 5b 69 49 64 78 32 5d 2e  intUsage[iIdx2].
6290: 6f 6d 69 74 20 3d 20 6f 6d 69 74 32 3b 0a 20 20  omit = omit2;.  
62a0: 7d 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d  }.  if( idxNum==
62b0: 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  0 ){.    pIdxInf
62c0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
62d0: 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
62e0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
62f0: 6d 61 74 65 64 52 6f 77 73 20 3d 20 31 3b 0a 20  matedRows = 1;. 
6300: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
6310: 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 31  erByConsumed = 1
6320: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  ;.  }else if( id
6330: 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 70  xNum==1 ){.    p
6340: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
6350: 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
6360: 29 31 30 30 3b 0a 20 20 20 20 70 49 64 78 49 6e  )100;.    pIdxIn
6370: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
6380: 73 20 3d 20 31 30 30 3b 0a 20 20 7d 65 6c 73 65  s = 100;.  }else
6390: 20 69 66 28 20 69 64 78 4e 75 6d 3c 39 39 20 29   if( idxNum<99 )
63a0: 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
63b0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
63c0: 28 64 6f 75 62 6c 65 29 35 30 30 30 3b 0a 20 20  (double)5000;.  
63d0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
63e0: 6d 61 74 65 64 52 6f 77 73 20 3d 20 35 30 30 30  matedRows = 5000
63f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6400: 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
6410: 6e 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66  n */.    pIdxInf
6420: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
6430: 20 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34   = (double)21474
6440: 38 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49  83647;.    pIdxI
6450: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
6460: 77 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b  ws = 2147483647;
6470: 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d  .  }.  pIdxInfo-
6480: 3e 69 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d  >idxNum = idxNum
6490: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
64a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
64b0: 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  he xUpdate metho
64c0: 64 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 75 73  d is normally us
64d0: 65 64 20 66 6f 72 20 49 4e 53 45 52 54 2c 20 52  ed for INSERT, R
64e0: 45 50 4c 41 43 45 2c 20 55 50 44 41 54 45 2c 20  EPLACE, UPDATE, 
64f0: 61 6e 64 0a 2a 2a 20 44 45 4c 45 54 45 2e 20 20  and.** DELETE.  
6500: 42 75 74 20 74 68 69 73 20 76 69 72 74 75 61 6c  But this virtual
6510: 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70   table only supp
6520: 6f 72 74 73 20 49 4e 53 45 52 54 20 61 6e 64 20  orts INSERT and 
6530: 52 45 50 4c 41 43 45 2e 0a 2a 2a 20 44 45 4c 45  REPLACE..** DELE
6540: 54 45 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  TE is accomplish
6550: 65 64 20 62 79 20 69 6e 73 65 72 74 69 6e 67 20  ed by inserting 
6560: 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 61 20  a record with a 
6570: 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 2e 0a 2a  value of NULL..*
6580: 2a 20 55 50 44 41 54 45 20 69 73 20 61 63 68 69  * UPDATE is achi
6590: 65 76 65 64 20 62 79 20 75 73 69 6e 67 20 52 45  eved by using RE
65a0: 50 4c 41 43 45 2e 0a 2a 2f 0a 69 6e 74 20 6c 73  PLACE..*/.int ls
65b0: 6d 31 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69  m1Update(.  sqli
65c0: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
65d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
65e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
65f0: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  rgv,.  sqlite_in
6600: 74 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20  t64 *pRowid.){. 
6610: 20 6c 73 6d 31 5f 76 74 61 62 20 2a 70 20 3d 20   lsm1_vtab *p = 
6620: 28 6c 73 6d 31 5f 76 74 61 62 2a 29 70 56 54 61  (lsm1_vtab*)pVTa
6630: 62 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 6e  b;.  int nKey, n
6640: 4b 65 79 32 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Key2;.  int i;. 
6650: 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
6660: 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ;.  const u8 *pK
6670: 65 79 2c 20 2a 70 4b 65 79 32 3b 0a 20 20 75 6e  ey, *pKey2;.  un
6680: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4b 65 79  signed char aKey
6690: 5b 31 36 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [16];.  unsigned
66a0: 20 63 68 61 72 20 70 53 70 61 63 65 5b 31 36 5d   char pSpace[16]
66b0: 3b 0a 20 20 6c 73 6d 31 5f 76 62 6c 6f 62 20 76  ;.  lsm1_vblob v
66c0: 61 6c 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d  al;..  if( argc=
66d0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 44 45 4c  =1 ){.    /* DEL
66e0: 45 54 45 20 74 68 65 20 72 65 63 6f 72 64 20 77  ETE the record w
66f0: 68 6f 73 65 20 6b 65 79 20 69 73 20 61 72 67 76  hose key is argv
6700: 5b 30 5d 20 2a 2f 0a 20 20 20 20 6c 73 6d 31 4b  [0] */.    lsm1K
6710: 65 79 46 72 6f 6d 56 61 6c 75 65 28 70 2d 3e 6b  eyFromValue(p->k
6720: 65 79 54 79 70 65 2c 20 61 72 67 76 5b 30 5d 2c  eyType, argv[0],
6730: 20 61 4b 65 79 2c 20 26 70 4b 65 79 2c 20 26 6e   aKey, &pKey, &n
6740: 4b 65 79 29 3b 0a 20 20 20 20 6c 73 6d 5f 64 65  Key);.    lsm_de
6750: 6c 65 74 65 28 70 2d 3e 70 44 62 2c 20 70 4b 65  lete(p->pDb, pKe
6760: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 72 65  y, nKey);.    re
6770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6780: 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74    }..  if( sqlit
6790: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
67a0: 67 76 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  gv[0])!=SQLITE_N
67b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  ULL ){.    /* An
67c0: 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 6c   UPDATE */.    l
67d0: 73 6d 31 4b 65 79 46 72 6f 6d 56 61 6c 75 65 28  sm1KeyFromValue(
67e0: 70 2d 3e 6b 65 79 54 79 70 65 2c 20 61 72 67 76  p->keyType, argv
67f0: 5b 30 5d 2c 20 61 4b 65 79 2c 20 26 70 4b 65 79  [0], aKey, &pKey
6800: 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 6c 73  , &nKey);.    ls
6810: 6d 31 4b 65 79 46 72 6f 6d 56 61 6c 75 65 28 70  m1KeyFromValue(p
6820: 2d 3e 6b 65 79 54 79 70 65 2c 20 61 72 67 76 5b  ->keyType, argv[
6830: 31 5d 2c 20 70 53 70 61 63 65 2c 20 26 70 4b 65  1], pSpace, &pKe
6840: 79 32 2c 20 26 6e 4b 65 79 32 29 3b 0a 20 20 20  y2, &nKey2);.   
6850: 20 69 66 28 20 6e 4b 65 79 21 3d 6e 4b 65 79 32   if( nKey!=nKey2
6860: 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 4b 65 79 2c   || memcmp(pKey,
6870: 20 70 4b 65 79 32 2c 20 6e 4b 65 79 29 21 3d 30   pKey2, nKey)!=0
6880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
6890: 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 73 20   UPDATE changes 
68a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
68b0: 76 61 6c 75 65 2e 20 20 44 45 4c 45 54 45 20 74  value.  DELETE t
68c0: 68 65 20 6f 6c 64 20 6b 65 79 20 2a 2f 0a 20 20  he old key */.  
68d0: 20 20 20 20 6c 73 6d 5f 64 65 6c 65 74 65 28 70      lsm_delete(p
68e0: 2d 3e 70 44 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  ->pDb, pKey, nKe
68f0: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  y);.    }.    /*
6900: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
6910: 74 6f 20 74 68 65 20 49 4e 53 45 52 54 20 63 61  to the INSERT ca
6920: 73 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  se to complete t
6930: 68 65 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 7d  he UPDATE */.  }
6940: 0a 0a 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 49  ..  /* "INSERT I
6950: 4e 54 4f 20 74 61 62 28 6c 73 6d 31 5f 63 6f 6d  NTO tab(lsm1_com
6960: 6d 61 6e 64 29 20 56 41 4c 55 45 53 28 27 2e 2e  mand) VALUES('..
6970: 2e 2e 27 29 22 20 69 73 20 75 73 65 64 20 74 6f  ..')" is used to
6980: 20 69 6d 70 6c 65 6d 65 6e 74 0a 20 20 2a 2a 20   implement.  ** 
6990: 73 70 65 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 73  special commands
69a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
69b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
69c0: 61 72 67 76 5b 33 2b 70 2d 3e 6e 56 61 6c 5d 29  argv[3+p->nVal])
69d0: 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  !=SQLITE_NULL ){
69e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
69f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6c 73 6d  TE_OK;.  }.  lsm
6a00: 31 4b 65 79 46 72 6f 6d 56 61 6c 75 65 28 70 2d  1KeyFromValue(p-
6a10: 3e 6b 65 79 54 79 70 65 2c 20 61 72 67 76 5b 32  >keyType, argv[2
6a20: 5d 2c 20 61 4b 65 79 2c 20 26 70 4b 65 79 2c 20  ], aKey, &pKey, 
6a30: 26 6e 4b 65 79 29 3b 0a 20 20 6d 65 6d 73 65 74  &nKey);.  memset
6a40: 28 26 76 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&val, 0, sizeof
6a50: 28 76 61 6c 29 29 3b 0a 20 20 66 6f 72 28 69 3d  (val));.  for(i=
6a60: 30 3b 20 69 3c 70 2d 3e 6e 56 61 6c 3b 20 69 2b  0; i<p->nVal; i+
6a70: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
6a80: 76 61 6c 75 65 20 2a 70 41 72 67 20 3d 20 61 72  value *pArg = ar
6a90: 67 76 5b 33 2b 69 5d 3b 0a 20 20 20 20 75 38 20  gv[3+i];.    u8 
6aa0: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
6ab0: 76 61 6c 75 65 5f 74 79 70 65 28 70 41 72 67 29  value_type(pArg)
6ac0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 54  ;.    switch( eT
6ad0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
6ae0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
6af0: 0a 20 20 20 20 20 20 20 20 6c 73 6d 31 56 62 6c  .        lsm1Vbl
6b00: 6f 62 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  obAppendVarint(&
6b10: 76 61 6c 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  val, SQLITE_NULL
6b20: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
6b50: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  GER: {.        s
6b60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
6b70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6b80: 6e 74 36 34 28 70 41 72 67 29 3b 0a 20 20 20 20  nt64(pArg);.    
6b90: 20 20 20 20 69 66 28 20 76 3e 3d 30 20 26 26 20      if( v>=0 && 
6ba0: 76 3c 3d 32 34 30 2f 36 20 29 7b 0a 20 20 20 20  v<=240/6 ){.    
6bb0: 20 20 20 20 20 20 6c 73 6d 31 56 62 6c 6f 62 41        lsm1VblobA
6bc0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 76 61 6c  ppendVarint(&val
6bd0: 2c 20 76 2a 36 29 3b 0a 20 20 20 20 20 20 20 20  , v*6);.        
6be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6bf0: 20 69 6e 74 20 6e 20 3d 20 6c 73 6d 31 50 75 74   int n = lsm1Put
6c00: 53 69 67 6e 65 64 56 61 72 69 6e 74 36 34 28 70  SignedVarint64(p
6c10: 53 70 61 63 65 2c 20 76 29 3b 0a 20 20 20 20 20  Space, v);.     
6c20: 20 20 20 20 20 6c 73 6d 31 56 62 6c 6f 62 41 70       lsm1VblobAp
6c30: 70 65 6e 64 56 61 72 69 6e 74 28 26 76 61 6c 2c  pendVarint(&val,
6c40: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20   SQLITE_INTEGER 
6c50: 2b 20 6e 2a 36 29 3b 0a 20 20 20 20 20 20 20 20  + n*6);.        
6c60: 20 20 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e    lsm1VblobAppen
6c70: 64 28 26 76 61 6c 2c 20 70 53 70 61 63 65 2c 20  d(&val, pSpace, 
6c80: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
6c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6ca0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6cb0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
6cc0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
6cd0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6ce0: 5f 64 6f 75 62 6c 65 28 70 41 72 67 29 3b 0a 20  _double(pArg);. 
6cf0: 20 20 20 20 20 20 20 6c 73 6d 31 56 62 6c 6f 62         lsm1Vblob
6d00: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 76 61  AppendVarint(&va
6d10: 6c 2c 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  l, SQLITE_FLOAT 
6d20: 2b 20 38 2a 36 29 3b 0a 20 20 20 20 20 20 20 20  + 8*6);.        
6d30: 6c 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e 64 28  lsm1VblobAppend(
6d40: 26 76 61 6c 2c 20 28 75 38 2a 29 26 72 2c 20 73  &val, (u8*)&r, s
6d50: 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20  izeof(r));.     
6d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6d70: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  }.      case SQL
6d80: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
6d90: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
6da0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6db0: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 6c  pArg);.        l
6dc0: 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e 64 56 61  sm1VblobAppendVa
6dd0: 72 69 6e 74 28 26 76 61 6c 2c 20 6e 2a 36 20 2b  rint(&val, n*6 +
6de0: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 29 3b 0a 20   SQLITE_BLOB);. 
6df0: 20 20 20 20 20 20 20 6c 73 6d 31 56 62 6c 6f 62         lsm1Vblob
6e00: 41 70 70 65 6e 64 28 26 76 61 6c 2c 20 73 71 6c  Append(&val, sql
6e10: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
6e20: 70 41 72 67 29 2c 20 6e 29 3b 0a 20 20 20 20 20  pArg), n);.     
6e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e40: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  }.      case SQL
6e50: 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
6e60: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
6e70: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6e80: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 6c  pArg);.        l
6e90: 73 6d 31 56 62 6c 6f 62 41 70 70 65 6e 64 56 61  sm1VblobAppendVa
6ea0: 72 69 6e 74 28 26 76 61 6c 2c 20 6e 2a 36 20 2b  rint(&val, n*6 +
6eb0: 20 53 51 4c 49 54 45 5f 54 45 58 54 29 3b 0a 20   SQLITE_TEXT);. 
6ec0: 20 20 20 20 20 20 20 6c 73 6d 31 56 62 6c 6f 62         lsm1Vblob
6ed0: 41 70 70 65 6e 64 28 26 76 61 6c 2c 20 73 71 6c  Append(&val, sql
6ee0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6ef0: 70 41 72 67 29 2c 20 6e 29 3b 0a 20 20 20 20 20  pArg), n);.     
6f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6f10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
6f20: 28 20 76 61 6c 2e 65 72 72 4e 6f 4d 65 6d 20 29  ( val.errNoMem )
6f30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6f40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
6f50: 20 72 63 20 3d 20 6c 73 6d 5f 69 6e 73 65 72 74   rc = lsm_insert
6f60: 28 70 2d 3e 70 44 62 2c 20 70 4b 65 79 2c 20 6e  (p->pDb, pKey, n
6f70: 4b 65 79 2c 20 76 61 6c 2e 61 2c 20 76 61 6c 2e  Key, val.a, val.
6f80: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  n);.  sqlite3_fr
6f90: 65 65 28 76 61 6c 2e 61 29 3b 0a 20 20 72 65 74  ee(val.a);.  ret
6fa0: 75 72 6e 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 3f  urn rc==LSM_OK ?
6fb0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
6fc0: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 20 20 20 20  ITE_ERROR;.}    
6fd0: 20 20 0a 0a 2f 2a 20 42 65 67 69 6e 20 61 20 74    ../* Begin a t
6fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ransaction.*/.st
6ff0: 61 74 69 63 20 69 6e 74 20 6c 73 6d 31 42 65 67  atic int lsm1Beg
7000: 69 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  in(sqlite3_vtab 
7010: 2a 70 56 74 61 62 29 7b 0a 20 20 6c 73 6d 31 5f  *pVtab){.  lsm1_
7020: 76 74 61 62 20 2a 70 20 3d 20 28 6c 73 6d 31 5f  vtab *p = (lsm1_
7030: 76 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20 69  vtab*)pVtab;.  i
7040: 6e 74 20 72 63 20 3d 20 6c 73 6d 5f 62 65 67 69  nt rc = lsm_begi
7050: 6e 28 70 2d 3e 70 44 62 2c 20 31 29 3b 0a 20 20  n(p->pDb, 1);.  
7060: 72 65 74 75 72 6e 20 72 63 3d 3d 4c 53 4d 5f 4f  return rc==LSM_O
7070: 4b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  K ? SQLITE_OK : 
7080: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
7090: 0a 2f 2a 20 50 68 61 73 65 20 31 20 6f 66 20 61  ./* Phase 1 of a
70a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
70b0: 6d 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mit..*/.static i
70c0: 6e 74 20 6c 73 6d 31 53 79 6e 63 28 73 71 6c 69  nt lsm1Sync(sqli
70d0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
70e0: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
70f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 6d  E_OK;.}../* Comm
7100: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
7110: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
7120: 73 6d 31 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  sm1Commit(sqlite
7130: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
7140: 20 20 6c 73 6d 31 5f 76 74 61 62 20 2a 70 20 3d    lsm1_vtab *p =
7150: 20 28 6c 73 6d 31 5f 76 74 61 62 2a 29 70 56 74   (lsm1_vtab*)pVt
7160: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6c  ab;.  int rc = l
7170: 73 6d 5f 63 6f 6d 6d 69 74 28 70 2d 3e 70 44 62  sm_commit(p->pDb
7180: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
7190: 63 3d 3d 4c 53 4d 5f 4f 4b 20 3f 20 53 51 4c 49  c==LSM_OK ? SQLI
71a0: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45  TE_OK : SQLITE_E
71b0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 20 52 6f 6c 6c  RROR;.}../* Roll
71c0: 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
71d0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
71e0: 20 6c 73 6d 31 52 6f 6c 6c 62 61 63 6b 28 73 71   lsm1Rollback(sq
71f0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
7200: 62 29 7b 0a 20 20 6c 73 6d 31 5f 76 74 61 62 20  b){.  lsm1_vtab 
7210: 2a 70 20 3d 20 28 6c 73 6d 31 5f 76 74 61 62 2a  *p = (lsm1_vtab*
7220: 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
7230: 20 3d 20 6c 73 6d 5f 72 6f 6c 6c 62 61 63 6b 28   = lsm_rollback(
7240: 70 2d 3e 70 44 62 2c 20 30 29 3b 0a 20 20 72 65  p->pDb, 0);.  re
7250: 74 75 72 6e 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  turn rc==LSM_OK 
7260: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
7270: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
7280: 2a 0a 2a 2a 20 54 68 69 73 20 66 6f 6c 6c 6f 77  *.** This follow
7290: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 64 65  ing structure de
72a0: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
72b0: 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20 0a 2a  thods for the .*
72c0: 2a 20 67 65 6e 65 72 61 74 65 5f 6c 73 6d 31 20  * generate_lsm1 
72d0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
72e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
72f0: 5f 6d 6f 64 75 6c 65 20 6c 73 6d 31 4d 6f 64 75  _module lsm1Modu
7300: 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
7330: 0a 20 20 6c 73 6d 31 43 6f 6e 6e 65 63 74 2c 20  .  lsm1Connect, 
7340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
7350: 43 72 65 61 74 65 20 2a 2f 0a 20 20 6c 73 6d 31  Create */.  lsm1
7360: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
7370: 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
7380: 20 2a 2f 0a 20 20 6c 73 6d 31 42 65 73 74 49 6e   */.  lsm1BestIn
7390: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
73a0: 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
73b0: 20 20 6c 73 6d 31 44 69 73 63 6f 6e 6e 65 63 74    lsm1Disconnect
73c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
73d0: 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6c  isconnect */.  l
73e0: 73 6d 31 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  sm1Disconnect,  
73f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
7400: 72 6f 79 20 2a 2f 0a 20 20 6c 73 6d 31 4f 70 65  roy */.  lsm1Ope
7410: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
7420: 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
7430: 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
7440: 6c 73 6d 31 43 6c 6f 73 65 2c 20 20 20 20 20 20  lsm1Close,      
7450: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
7460: 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
7470: 73 6f 72 20 2a 2f 0a 20 20 6c 73 6d 31 46 69 6c  sor */.  lsm1Fil
7480: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
7490: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
74a0: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
74b0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6c  nstraints */.  l
74c0: 73 6d 31 4e 65 78 74 2c 20 20 20 20 20 20 20 20  sm1Next,        
74d0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
74e0: 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
74f0: 73 6f 72 20 2a 2f 0a 20 20 6c 73 6d 31 45 6f 66  sor */.  lsm1Eof
7500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7510: 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63    /* xEof - chec
7520: 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61  k for end of sca
7530: 6e 20 2a 2f 0a 20 20 6c 73 6d 31 43 6f 6c 75 6d  n */.  lsm1Colum
7540: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
7550: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
7560: 64 20 64 61 74 61 20 2a 2f 0a 20 20 6c 73 6d 31  d data */.  lsm1
7570: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
7580: 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
7590: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
75a0: 6c 73 6d 31 55 70 64 61 74 65 2c 20 20 20 20 20  lsm1Update,     
75b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
75c0: 61 74 65 20 2a 2f 0a 20 20 6c 73 6d 31 42 65 67  ate */.  lsm1Beg
75d0: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
75e0: 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20    /* xBegin */. 
75f0: 20 6c 73 6d 31 53 79 6e 63 2c 20 20 20 20 20 20   lsm1Sync,      
7600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
7610: 6e 63 20 2a 2f 0a 20 20 6c 73 6d 31 43 6f 6d 6d  nc */.  lsm1Comm
7620: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
7630: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
7640: 20 6c 73 6d 31 52 6f 6c 6c 62 61 63 6b 2c 20 20   lsm1Rollback,  
7650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
7660: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20  llback */.  0,  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74       /* xFindMet
7690: 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  hod */.  0,     
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
76c0: 7d 3b 0a 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e  };...#ifdef _WIN
76d0: 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
76e0: 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
76f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 73 6d 5f  int sqlite3_lsm_
7700: 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
7710: 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  *db, .  char **p
7720: 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73  zErrMsg, .  cons
7730: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
7740: 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
7750: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7760: 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54 45 5f 45  E_OK;.  SQLITE_E
7770: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
7780: 41 70 69 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Api);.  rc = sql
7790: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
77a0: 6c 65 28 64 62 2c 20 22 6c 73 6d 31 22 2c 20 26  le(db, "lsm1", &
77b0: 6c 73 6d 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  lsm1Module, 0);.
77c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.