/ Hex Artifact Content
Login

Artifact 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430:


0000: 2f 2a 0a 2a 2a 20 32 30 31 39 2d 30 32 2d 31 39  /*.** 2019-02-19
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
01a0: 64 65 6c 74 61 20 66 75 6e 63 74 69 6f 6e 73 20  delta functions 
01b0: 75 73 65 64 20 62 79 20 74 68 65 20 52 42 55 0a  used by the RBU.
01c0: 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 68  ** extension. Th
01d0: 72 65 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ree scalar funct
01e0: 69 6f 6e 73 20 61 6e 64 20 6f 6e 65 20 74 61 62  ions and one tab
01f0: 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
0200: 6f 6e 20 61 72 65 0a 2a 2a 20 69 6d 70 6c 65 6d  on are.** implem
0210: 65 6e 74 65 64 20 68 65 72 65 3a 0a 2a 2a 0a 2a  ented here:.**.*
0220: 2a 20 20 20 64 65 6c 74 61 5f 61 70 70 6c 79 28  *   delta_apply(
0230: 58 2c 44 29 20 20 20 20 20 2d 2d 20 61 70 70 6c  X,D)     -- appl
0240: 79 20 64 65 6c 74 61 20 44 20 74 6f 20 66 69 6c  y delta D to fil
0250: 65 20 58 20 61 6e 64 20 72 65 74 75 72 6e 20 74  e X and return t
0260: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 64  he result.**   d
0270: 65 6c 74 61 5f 63 72 65 61 74 65 28 58 2c 59 29  elta_create(X,Y)
0280: 20 20 20 20 2d 2d 20 63 6f 6d 70 75 74 65 20 61      -- compute a
0290: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 6c 74  nd return a delt
02a0: 61 20 74 68 61 74 20 63 61 72 72 69 65 73 20 58  a that carries X
02b0: 20 69 6e 74 6f 20 59 0a 2a 2a 20 20 20 64 65 6c   into Y.**   del
02c0: 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28 44  ta_output_size(D
02d0: 29 20 2d 2d 20 62 6c 6f 62 20 73 69 7a 65 20 69  ) -- blob size i
02e0: 6e 20 62 79 74 65 73 20 6f 75 74 70 75 74 20 66  n bytes output f
02f0: 72 6f 6d 20 61 70 70 6c 79 69 6e 67 20 64 65 6c  rom applying del
0300: 74 61 20 44 0a 2a 2a 20 20 20 64 65 6c 74 61 5f  ta D.**   delta_
0310: 70 61 72 73 65 28 44 29 20 20 20 20 20 20 20 2d  parse(D)       -
0320: 2d 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 64  - returns rows d
0330: 65 73 63 72 69 62 69 6e 67 20 64 65 6c 74 61 20  escribing delta 
0340: 44 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74  D.**.** The delt
0350: 61 20 66 6f 72 6d 61 74 20 69 73 20 74 68 65 20  a format is the 
0360: 46 6f 73 73 69 6c 20 64 65 6c 74 61 20 66 6f 72  Fossil delta for
0370: 6d 61 74 2c 20 64 65 73 63 72 69 62 65 64 20 69  mat, described i
0380: 6e 20 61 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 6f  n a comment.** o
0390: 6e 20 74 68 65 20 64 65 6c 65 74 65 5f 63 72 65  n the delete_cre
03a0: 61 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ate() function i
03b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
03c0: 6c 6f 77 2c 20 61 6e 64 20 61 6c 73 6f 20 61 74  low, and also at
03d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 68 74 74 70 73 3a  .**.**    https:
03e0: 2f 2f 77 77 77 2e 66 6f 73 73 69 6c 2d 73 63 6d  //www.fossil-scm
03f0: 2e 6f 72 67 2f 66 6f 73 73 69 6c 2f 64 6f 63 2f  .org/fossil/doc/
0400: 74 72 75 6e 6b 2f 77 77 77 2f 64 65 6c 74 61 5f  trunk/www/delta_
0410: 66 6f 72 6d 61 74 2e 77 69 6b 69 0a 2a 2a 0a 2a  format.wiki.**.*
0420: 2a 20 54 68 69 73 20 64 65 6c 74 61 20 66 6f 72  * This delta for
0430: 6d 61 74 20 69 73 20 75 73 65 64 20 62 79 20 74  mat is used by t
0440: 68 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e  he RBU extension
0450: 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6d  , which is the m
0460: 61 69 6e 0a 2a 2a 20 72 65 61 73 6f 6e 20 74 68  ain.** reason th
0470: 61 74 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  at these routine
0480: 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69  s are included i
0490: 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  n the extension 
04a0: 6c 69 62 72 61 72 79 2e 0a 2a 2a 20 52 42 55 20  library..** RBU 
04b0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 69  does not use thi
04c0: 73 20 65 78 74 65 6e 73 69 6f 6e 20 64 69 72 65  s extension dire
04d0: 63 74 6c 79 2e 20 20 52 61 74 68 65 72 2c 20 74  ctly.  Rather, t
04e0: 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  his extension is
04f0: 0a 2a 2a 20 70 72 6f 76 69 64 65 64 20 61 73 20  .** provided as 
0500: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 74 6f  a convenience to
0510: 20 64 65 76 65 6c 6f 70 65 72 73 20 77 68 6f 20   developers who 
0520: 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
0530: 52 42 55 20 66 69 6c 65 73 20 0a 2a 2a 20 74 68  RBU files .** th
0540: 61 74 20 63 6f 6e 74 61 69 6e 20 64 65 6c 74 61  at contain delta
0550: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  s..*/.#include <
0560: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0570: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0580: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0590: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  >.#include "sqli
05a0: 74 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45  te3ext.h".SQLITE
05b0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
05c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
05d0: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a  _AMALGAMATION./*
05e0: 0a 2a 2a 20 54 68 65 20 22 75 33 32 22 20 74 79  .** The "u32" ty
05f0: 70 65 20 6d 75 73 74 20 62 65 20 61 6e 20 75 6e  pe must be an un
0600: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
0610: 74 65 67 65 72 2e 20 20 41 64 6a 75 73 74 20 74  teger.  Adjust t
0620: 68 69 73 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  his.*/.typedef u
0630: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
0640: 0a 0a 2f 2a 0a 2a 2a 20 4d 75 73 74 20 62 65 20  ../*.** Must be 
0650: 61 20 31 36 2d 62 69 74 20 76 61 6c 75 65 0a 2a  a 16-bit value.*
0660: 2f 0a 74 79 70 65 64 65 66 20 73 68 6f 72 74 20  /.typedef short 
0670: 69 6e 74 20 73 31 36 3b 0a 74 79 70 65 64 65 66  int s16;.typedef
0680: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
0690: 69 6e 74 20 75 31 36 3b 0a 0a 23 65 6e 64 69 66  int u16;..#endif
06a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47   /* SQLITE_AMALG
06b0: 41 4d 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  AMATION */.../*.
06c0: 2a 2a 20 54 68 65 20 77 69 64 74 68 20 6f 66 20  ** The width of 
06d0: 61 20 68 61 73 68 20 77 69 6e 64 6f 77 20 69 6e  a hash window in
06e0: 20 62 79 74 65 73 2e 20 20 54 68 65 20 61 6c 67   bytes.  The alg
06f0: 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
0700: 73 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  s if this.** is 
0710: 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a 2a 2f  a power of 2..*/
0720: 0a 23 64 65 66 69 6e 65 20 4e 48 41 53 48 20 31  .#define NHASH 1
0730: 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  6../*.** The cur
0740: 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
0750: 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73 68 2e 0a  e rolling hash..
0760: 2a 2a 0a 2a 2a 20 7a 5b 5d 20 68 6f 6c 64 73 20  **.** z[] holds 
0770: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
0780: 68 61 76 65 20 62 65 65 6e 20 68 61 73 68 65 64  have been hashed
0790: 2e 20 20 7a 5b 5d 20 69 73 20 61 20 63 69 72 63  .  z[] is a circ
07a0: 75 6c 61 72 20 62 75 66 66 65 72 2e 0a 2a 2a 20  ular buffer..** 
07b0: 7a 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  z[i] is the firs
07c0: 74 20 65 6e 74 72 79 20 61 6e 64 20 7a 5b 28 69  t entry and z[(i
07d0: 2b 4e 48 41 53 48 2d 31 29 25 4e 48 41 53 48 5d  +NHASH-1)%NHASH]
07e0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
07f0: 72 79 20 6f 66 0a 2a 2a 20 74 68 65 20 77 69 6e  ry of.** the win
0800: 64 6f 77 2e 0a 2a 2a 0a 2a 2a 20 48 61 73 68 2e  dow..**.** Hash.
0810: 61 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  a is the sum of 
0820: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  all elements of 
0830: 68 61 73 68 2e 7a 5b 5d 2e 20 20 48 61 73 68 2e  hash.z[].  Hash.
0840: 62 20 69 73 20 61 20 77 65 69 67 68 74 65 64 0a  b is a weighted.
0850: 2a 2a 20 73 75 6d 2e 20 20 48 61 73 68 2e 62 20  ** sum.  Hash.b 
0860: 69 73 20 7a 5b 69 5d 2a 4e 48 41 53 48 20 2b 20  is z[i]*NHASH + 
0870: 7a 5b 69 2b 31 5d 2a 28 4e 48 41 53 48 2d 31 29  z[i+1]*(NHASH-1)
0880: 20 2b 20 2e 2e 2e 20 2b 20 7a 5b 69 2b 4e 48 41   + ... + z[i+NHA
0890: 53 48 2d 31 5d 2a 31 2e 0a 2a 2a 20 28 45 61 63  SH-1]*1..** (Eac
08a0: 68 20 69 6e 64 65 78 20 66 6f 72 20 7a 5b 5d 20  h index for z[] 
08b0: 73 68 6f 75 6c 64 20 62 65 20 6d 6f 64 75 6c 65  should be module
08c0: 20 4e 48 41 53 48 2c 20 6f 66 20 63 6f 75 72 73   NHASH, of cours
08d0: 65 2e 20 20 54 68 65 20 25 4e 48 41 53 48 20 6f  e.  The %NHASH o
08e0: 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6d  perator.** is om
08f0: 69 74 74 65 64 20 69 6e 20 74 68 65 20 70 72 69  itted in the pri
0900: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  or expression fo
0910: 72 20 62 72 65 76 69 74 79 2e 29 0a 2a 2f 0a 74  r brevity.).*/.t
0920: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 68 61  ypedef struct ha
0930: 73 68 20 68 61 73 68 3b 0a 73 74 72 75 63 74 20  sh hash;.struct 
0940: 68 61 73 68 20 7b 0a 20 20 75 31 36 20 61 2c 20  hash {.  u16 a, 
0950: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  b;         /* Ha
0960: 73 68 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  sh values */.  u
0970: 31 36 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  16 i;           
0980: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
0990: 20 68 61 73 68 20 77 69 6e 64 6f 77 20 2a 2f 0a   hash window */.
09a0: 20 20 63 68 61 72 20 7a 5b 4e 48 41 53 48 5d 3b    char z[NHASH];
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
09c0: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
09d0: 20 68 61 73 68 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f   hashed */.};../
09e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
09f0: 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73 68  the rolling hash
0a00: 20 75 73 69 6e 67 20 74 68 65 20 66 69 72 73 74   using the first
0a10: 20 4e 48 41 53 48 20 63 68 61 72 61 63 74 65 72   NHASH character
0a20: 73 20 6f 66 20 7a 5b 5d 0a 2a 2f 0a 73 74 61 74  s of z[].*/.stat
0a30: 69 63 20 76 6f 69 64 20 68 61 73 68 5f 69 6e 69  ic void hash_ini
0a40: 74 28 68 61 73 68 20 2a 70 48 61 73 68 2c 20 63  t(hash *pHash, c
0a50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
0a60: 20 75 31 36 20 61 2c 20 62 2c 20 69 3b 0a 20 20   u16 a, b, i;.  
0a70: 61 20 3d 20 62 20 3d 20 7a 5b 30 5d 3b 0a 20 20  a = b = z[0];.  
0a80: 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 48 41 53 48  for(i=1; i<NHASH
0a90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 20 2b 3d  ; i++){.    a +=
0aa0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 62 20 2b 3d 20   z[i];.    b += 
0ab0: 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  a;.  }.  memcpy(
0ac0: 70 48 61 73 68 2d 3e 7a 2c 20 7a 2c 20 4e 48 41  pHash->z, z, NHA
0ad0: 53 48 29 3b 0a 20 20 70 48 61 73 68 2d 3e 61 20  SH);.  pHash->a 
0ae0: 3d 20 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20  = a & 0xffff;.  
0af0: 70 48 61 73 68 2d 3e 62 20 3d 20 62 20 26 20 30  pHash->b = b & 0
0b00: 78 66 66 66 66 3b 0a 20 20 70 48 61 73 68 2d 3e  xffff;.  pHash->
0b10: 69 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  i = 0;.}../*.** 
0b20: 41 64 76 61 6e 63 65 20 74 68 65 20 72 6f 6c 6c  Advance the roll
0b30: 69 6e 67 20 68 61 73 68 20 62 79 20 61 20 73 69  ing hash by a si
0b40: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 22  ngle character "
0b50: 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c".*/.static voi
0b60: 64 20 68 61 73 68 5f 6e 65 78 74 28 68 61 73 68  d hash_next(hash
0b70: 20 2a 70 48 61 73 68 2c 20 69 6e 74 20 63 29 7b   *pHash, int c){
0b80: 0a 20 20 75 31 36 20 6f 6c 64 20 3d 20 70 48 61  .  u16 old = pHa
0b90: 73 68 2d 3e 7a 5b 70 48 61 73 68 2d 3e 69 5d 3b  sh->z[pHash->i];
0ba0: 0a 20 20 70 48 61 73 68 2d 3e 7a 5b 70 48 61 73  .  pHash->z[pHas
0bb0: 68 2d 3e 69 5d 20 3d 20 63 3b 0a 20 20 70 48 61  h->i] = c;.  pHa
0bc0: 73 68 2d 3e 69 20 3d 20 28 70 48 61 73 68 2d 3e  sh->i = (pHash->
0bd0: 69 2b 31 29 26 28 4e 48 41 53 48 2d 31 29 3b 0a  i+1)&(NHASH-1);.
0be0: 20 20 70 48 61 73 68 2d 3e 61 20 3d 20 70 48 61    pHash->a = pHa
0bf0: 73 68 2d 3e 61 20 2d 20 6f 6c 64 20 2b 20 63 3b  sh->a - old + c;
0c00: 0a 20 20 70 48 61 73 68 2d 3e 62 20 3d 20 70 48  .  pHash->b = pH
0c10: 61 73 68 2d 3e 62 20 2d 20 4e 48 41 53 48 2a 6f  ash->b - NHASH*o
0c20: 6c 64 20 2b 20 70 48 61 73 68 2d 3e 61 3b 0a 7d  ld + pHash->a;.}
0c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
0c40: 20 33 32 2d 62 69 74 20 68 61 73 68 20 76 61 6c   32-bit hash val
0c50: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  ue.*/.static u32
0c60: 20 68 61 73 68 5f 33 32 62 69 74 28 68 61 73 68   hash_32bit(hash
0c70: 20 2a 70 48 61 73 68 29 7b 0a 20 20 72 65 74 75   *pHash){.  retu
0c80: 72 6e 20 28 70 48 61 73 68 2d 3e 61 20 26 20 30  rn (pHash->a & 0
0c90: 78 66 66 66 66 29 20 7c 20 28 28 28 75 33 32 29  xffff) | (((u32)
0ca0: 28 70 48 61 73 68 2d 3e 62 20 26 20 30 78 66 66  (pHash->b & 0xff
0cb0: 66 66 29 29 3c 3c 31 36 29 3b 0a 7d 0a 0a 2f 2a  ff))<<16);.}../*
0cc0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 68 61  .** Compute a ha
0cd0: 73 68 20 6f 6e 20 4e 48 41 53 48 20 62 79 74 65  sh on NHASH byte
0ce0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65  utine is intende
0d00: 64 20 74 6f 20 62 65 20 65 71 75 69 76 61 6c 65  d to be equivale
0d10: 6e 74 20 74 6f 3a 0a 2a 2a 20 20 20 20 68 61 73  nt to:.**    has
0d20: 68 20 68 3b 0a 2a 2a 20 20 20 20 68 61 73 68 5f  h h;.**    hash_
0d30: 69 6e 69 74 28 26 68 2c 20 7a 49 6e 70 75 74 29  init(&h, zInput)
0d40: 3b 0a 2a 2a 20 20 20 20 72 65 74 75 72 6e 20 68  ;.**    return h
0d50: 61 73 68 5f 33 32 62 69 74 28 26 68 29 3b 0a 2a  ash_32bit(&h);.*
0d60: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 68 61 73  /.static u32 has
0d70: 68 5f 6f 6e 63 65 28 63 6f 6e 73 74 20 63 68 61  h_once(const cha
0d80: 72 20 2a 7a 29 7b 0a 20 20 75 31 36 20 61 2c 20  r *z){.  u16 a, 
0d90: 62 2c 20 69 3b 0a 20 20 61 20 3d 20 62 20 3d 20  b, i;.  a = b = 
0da0: 7a 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  z[0];.  for(i=1;
0db0: 20 69 3c 4e 48 41 53 48 3b 20 69 2b 2b 29 7b 0a   i<NHASH; i++){.
0dc0: 20 20 20 20 61 20 2b 3d 20 7a 5b 69 5d 3b 0a 20      a += z[i];. 
0dd0: 20 20 20 62 20 2b 3d 20 61 3b 0a 20 20 7d 0a 20     b += a;.  }. 
0de0: 20 72 65 74 75 72 6e 20 61 20 7c 20 28 28 28 75   return a | (((u
0df0: 33 32 29 62 29 3c 3c 31 36 29 3b 0a 7d 0a 0a 2f  32)b)<<16);.}../
0e00: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 62 61  *.** Write an ba
0e10: 73 65 2d 36 34 20 69 6e 74 65 67 65 72 20 69 6e  se-64 integer in
0e20: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 62 75 66  to the given buf
0e30: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fer..*/.static v
0e40: 6f 69 64 20 70 75 74 49 6e 74 28 75 6e 73 69 67  oid putInt(unsig
0e50: 6e 65 64 20 69 6e 74 20 76 2c 20 63 68 61 72 20  ned int v, char 
0e60: 2a 2a 70 7a 29 7b 0a 20 20 73 74 61 74 69 63 20  **pz){.  static 
0e70: 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69 67 69  const char zDigi
0e80: 74 73 5b 5d 20 3d 0a 20 20 20 20 22 30 31 32 33  ts[] =.    "0123
0e90: 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 4a  456789ABCDEFGHIJ
0ea0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
0eb0: 5f 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  _abcdefghijklmno
0ec0: 70 71 72 73 74 75 76 77 78 79 7a 7e 22 3b 0a 20  pqrstuvwxyz~";. 
0ed0: 20 2f 2a 20 20 31 32 33 34 35 36 37 38 39 20 31   /*  123456789 1
0ee0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
0ef0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
0f00: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
0f10: 20 31 32 33 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   123 */.  int i,
0f20: 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   j;.  char zBuf[
0f30: 32 30 5d 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  20];.  if( v==0 
0f40: 29 7b 0a 20 20 20 20 2a 28 2a 70 7a 29 2b 2b 20  ){.    *(*pz)++ 
0f50: 3d 20 27 30 27 3b 0a 20 20 20 20 72 65 74 75 72  = '0';.    retur
0f60: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
0f70: 3b 20 76 3e 30 3b 20 69 2b 2b 2c 20 76 3e 3e 3d  ; v>0; i++, v>>=
0f80: 36 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20  6){.    zBuf[i] 
0f90: 3d 20 7a 44 69 67 69 74 73 5b 76 26 30 78 33 66  = zDigits[v&0x3f
0fa0: 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6a 3d 69  ];.  }.  for(j=i
0fb0: 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
0fc0: 20 20 20 20 2a 28 2a 70 7a 29 2b 2b 20 3d 20 7a      *(*pz)++ = z
0fd0: 42 75 66 5b 6a 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Buf[j];.  }.}../
0fe0: 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20  *.** Read bytes 
0ff0: 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e  from *pz and con
1000: 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61  vert them into a
1010: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1020: 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69  r.  When.** fini
1030: 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20  shed, leave *pz 
1040: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1050: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
1060: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  past the end of.
1070: 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20  ** the integer. 
1080: 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d   The *pLen param
1090: 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c  eter holds the l
10a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
10b0: 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e  ing.** in *pz an
10c0: 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  d is decremented
10d0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
10e0: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
10f0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1100: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
1110: 64 65 6c 74 61 47 65 74 49 6e 74 28 63 6f 6e 73  deltaGetInt(cons
1120: 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e 74  t char **pz, int
1130: 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61 74 69   *pLen){.  stati
1140: 63 20 63 6f 6e 73 74 20 73 69 67 6e 65 64 20 63  c const signed c
1150: 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d 20 7b  har zValue[] = {
1160: 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  .    -1, -1, -1,
1170: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1180: 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   -1,   -1, -1, -
1190: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
11a0: 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d  1, -1,.    -1, -
11b0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
11c0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c  1, -1, -1,   -1,
11d0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
11e0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20   -1, -1, -1,.   
11f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1200: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1210: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
1220: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
1230: 31 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c 20 20  1,.     0,  1,  
1240: 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20  2,  3,  4,  5,  
1250: 36 2c 20 20 37 2c 20 20 20 20 38 2c 20 20 39 2c  6,  7,    8,  9,
1260: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1270: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c   -1, -1,.    -1,
1280: 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c   10, 11, 12, 13,
1290: 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 20 20 31   14, 15, 16,   1
12a0: 37 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32  7, 18, 19, 20, 2
12b0: 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 0a 20  1, 22, 23, 24,. 
12c0: 20 20 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32     25, 26, 27, 2
12d0: 38 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33  8, 29, 30, 31, 3
12e0: 32 2c 20 20 20 33 33 2c 20 33 34 2c 20 33 35 2c  2,   33, 34, 35,
12f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1300: 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33 37 2c   36,.    -1, 37,
1310: 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c   38, 39, 40, 41,
1320: 20 34 32 2c 20 34 33 2c 20 20 20 34 34 2c 20 34   42, 43,   44, 4
1330: 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34  5, 46, 47, 48, 4
1340: 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20 20 35  9, 50, 51,.    5
1350: 32 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c 20 35  2, 53, 54, 55, 5
1360: 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 20  6, 57, 58, 59,  
1370: 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d 31 2c   60, 61, 62, -1,
1380: 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d 31 2c   -1, -1, 63, -1,
1390: 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
13a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 6e   int v = 0;.  in
13b0: 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t c;.  unsigned 
13c0: 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73 69 67  char *z = (unsig
13d0: 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b 0a 20  ned char*)*pz;. 
13e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13f0: 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20 77 68  zStart = z;.  wh
1400: 69 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c 75 65  ile( (c = zValue
1410: 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29 3e 3d  [0x7f&*(z++)])>=
1420: 30 20 29 7b 0a 20 20 20 20 20 76 20 3d 20 28 76  0 ){.     v = (v
1430: 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a 20 20  <<6) + c;.  }.  
1440: 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d 3d 20  z--;.  *pLen -= 
1450: 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20 2a 70  z - zStart;.  *p
1460: 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20  z = (char*)z;.  
1470: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a  return v;.}../*.
1480: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1490: 6d 62 65 72 20 64 69 67 69 74 73 20 69 6e 20 74  mber digits in t
14a0: 68 65 20 62 61 73 65 2d 36 34 20 72 65 70 72 65  he base-64 repre
14b0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70  sentation of a p
14c0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 0a  ositive integer.
14d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
14e0: 67 69 74 5f 63 6f 75 6e 74 28 69 6e 74 20 76 29  git_count(int v)
14f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
1500: 20 69 2c 20 78 3b 0a 20 20 66 6f 72 28 69 3d 31   i, x;.  for(i=1
1510: 2c 20 78 3d 36 34 3b 20 76 3e 3d 78 3b 20 69 2b  , x=64; v>=x; i+
1520: 2b 2c 20 78 20 3c 3c 3d 20 36 29 7b 7d 0a 20 20  +, x <<= 6){}.  
1530: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 23 69 66  return i;.}..#if
1540: 64 65 66 20 5f 5f 47 4e 55 43 5f 5f 0a 23 20 64  def __GNUC__.# d
1550: 65 66 69 6e 65 20 47 43 43 5f 56 45 52 53 49 4f  efine GCC_VERSIO
1560: 4e 20 28 5f 5f 47 4e 55 43 5f 5f 2a 31 30 30 30  N (__GNUC__*1000
1570: 30 30 30 2b 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  000+__GNUC_MINOR
1580: 5f 5f 2a 31 30 30 30 2b 5f 5f 47 4e 55 43 5f 50  __*1000+__GNUC_P
1590: 41 54 43 48 4c 45 56 45 4c 5f 5f 29 0a 23 65 6c  ATCHLEVEL__).#el
15a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 47 43 43 5f  se.# define GCC_
15b0: 56 45 52 53 49 4f 4e 20 30 0a 23 65 6e 64 69 66  VERSION 0.#endif
15c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
15d0: 61 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64  a 32-bit big-end
15e0: 69 61 6e 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  ian checksum on 
15f0: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
1600: 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 62 75  r.  If the.** bu
1610: 66 66 65 72 20 69 73 20 6e 6f 74 20 61 20 6d 75  ffer is not a mu
1620: 6c 74 69 70 6c 65 20 6f 66 20 34 20 62 79 74 65  ltiple of 4 byte
1630: 73 20 6c 65 6e 67 74 68 2c 20 63 6f 6d 70 75 74  s length, comput
1640: 65 20 74 68 65 20 73 75 6d 20 74 68 61 74 20 77  e the sum that w
1650: 6f 75 6c 64 0a 2a 2a 20 68 61 76 65 20 6f 63 63  ould.** have occ
1660: 75 72 72 65 64 20 69 66 20 74 68 65 20 62 75 66  urred if the buf
1670: 66 65 72 20 77 61 73 20 70 61 64 64 65 64 20 77  fer was padded w
1680: 69 74 68 20 7a 65 72 6f 73 20 74 6f 20 74 68 65  ith zeros to the
1690: 20 6e 65 78 74 20 6d 75 6c 74 69 70 6c 65 0a 2a   next multiple.*
16a0: 2a 20 6f 66 20 66 6f 75 72 20 62 79 74 65 73 2e  * of four bytes.
16b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
16c0: 6e 65 64 20 69 6e 74 20 63 68 65 63 6b 73 75 6d  ned int checksum
16d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
16e0: 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 73  , size_t N){.  s
16f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
1700: 62 79 74 65 4f 72 64 65 72 54 65 73 74 20 3d 20  byteOrderTest = 
1710: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  1;.  const unsig
1720: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  ned char *z = (c
1730: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1740: 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 63 6f 6e 73  ar *)zIn;.  cons
1750: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1760: 2a 7a 45 6e 64 20 3d 20 28 63 6f 6e 73 74 20 75  *zEnd = (const u
1770: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 7a  nsigned char*)&z
1780: 49 6e 5b 4e 26 7e 33 5d 3b 0a 20 20 75 6e 73 69  In[N&~3];.  unsi
1790: 67 6e 65 64 20 73 75 6d 20 3d 20 30 3b 0a 20 20  gned sum = 0;.  
17a0: 61 73 73 65 72 74 28 20 28 7a 20 2d 20 28 63 6f  assert( (z - (co
17b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17c0: 72 2a 29 30 29 25 34 3d 3d 30 20 29 3b 20 20 2f  r*)0)%4==0 );  /
17d0: 2a 20 46 6f 75 72 2d 62 79 74 65 20 61 6c 69 67  * Four-byte alig
17e0: 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20 30  nment */.  if( 0
17f0: 3d 3d 2a 28 63 68 61 72 2a 29 26 62 79 74 65 4f  ==*(char*)&byteO
1800: 72 64 65 72 54 65 73 74 20 29 7b 0a 20 20 20 20  rderTest ){.    
1810: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 62 69 67  /* This is a big
1820: 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 20  -endian machine 
1830: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 3c  */.    while( z<
1840: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 75  zEnd ){.      su
1850: 6d 20 2b 3d 20 2a 28 75 6e 73 69 67 6e 65 64 2a  m += *(unsigned*
1860: 29 7a 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 34  )z;.      z += 4
1870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1880: 0a 20 20 20 20 2f 2a 20 41 20 6c 69 74 74 6c 65  .    /* A little
1890: 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 20  -endian machine 
18a0: 2a 2f 0a 23 69 66 20 47 43 43 5f 56 45 52 53 49  */.#if GCC_VERSI
18b0: 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 20 20  ON>=4003000.    
18c0: 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20 29 7b  while( z<zEnd ){
18d0: 0a 20 20 20 20 20 20 73 75 6d 20 2b 3d 20 5f 5f  .      sum += __
18e0: 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 33 32 28  builtin_bswap32(
18f0: 2a 28 75 6e 73 69 67 6e 65 64 2a 29 7a 29 3b 0a  *(unsigned*)z);.
1900: 20 20 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20        z += 4;.  
1910: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
1920: 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f  d(_MSC_VER) && _
1930: 4d 53 43 5f 56 45 52 3e 3d 31 33 30 30 0a 20 20  MSC_VER>=1300.  
1940: 20 20 77 68 69 6c 65 28 20 7a 3c 7a 45 6e 64 20    while( z<zEnd 
1950: 29 7b 0a 20 20 20 20 20 20 73 75 6d 20 2b 3d 20  ){.      sum += 
1960: 5f 62 79 74 65 73 77 61 70 5f 75 6c 6f 6e 67 28  _byteswap_ulong(
1970: 2a 28 75 6e 73 69 67 6e 65 64 2a 29 7a 29 3b 0a  *(unsigned*)z);.
1980: 20 20 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20        z += 4;.  
1990: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e    }.#else.    un
19a0: 73 69 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b  signed sum0 = 0;
19b0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 73 75  .    unsigned su
19c0: 6d 31 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69  m1 = 0;.    unsi
19d0: 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a 20  gned sum2 = 0;. 
19e0: 20 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36     while(N >= 16
19f0: 29 7b 0a 20 20 20 20 20 20 73 75 6d 30 20 2b 3d  ){.      sum0 +=
1a00: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d   ((unsigned)z[0]
1a10: 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b   + z[4] + z[8] +
1a20: 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 20 20 73   z[12]);.      s
1a30: 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um1 += ((unsigne
1a40: 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20  d)z[1] + z[5] + 
1a50: 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20  z[9] + z[13]);. 
1a60: 20 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75       sum2 += ((u
1a70: 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a  nsigned)z[2] + z
1a80: 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31  [6] + z[10]+ z[1
1a90: 34 5d 29 3b 0a 20 20 20 20 20 20 73 75 6d 20 20  4]);.      sum  
1aa0: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
1ab0: 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31  3] + z[7] + z[11
1ac0: 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 20  ]+ z[15]);.     
1ad0: 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20   z += 16;.      
1ae0: 4e 20 2d 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 20  N -= 16;.    }. 
1af0: 20 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29     while(N >= 4)
1b00: 7b 0a 20 20 20 20 20 20 73 75 6d 30 20 2b 3d 20  {.      sum0 += 
1b10: 7a 5b 30 5d 3b 0a 20 20 20 20 20 20 73 75 6d 31  z[0];.      sum1
1b20: 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 20 20   += z[1];.      
1b30: 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20  sum2 += z[2];.  
1b40: 20 20 20 20 73 75 6d 20 20 2b 3d 20 7a 5b 33 5d      sum  += z[3]
1b50: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 34 3b 0a  ;.      z += 4;.
1b60: 20 20 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20 20        N -= 4;.  
1b70: 20 20 7d 0a 20 20 20 20 73 75 6d 20 2b 3d 20 28    }.    sum += (
1b80: 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75  sum2 << 8) + (su
1b90: 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d  m1 << 16) + (sum
1ba0: 30 20 3c 3c 20 32 34 29 3b 0a 23 65 6e 64 69 66  0 << 24);.#endif
1bb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 4e 26  .  }.  switch(N&
1bc0: 33 29 7b 0a 20 20 20 20 63 61 73 65 20 33 3a 20  3){.    case 3: 
1bd0: 20 20 73 75 6d 20 2b 3d 20 28 7a 5b 32 5d 20 3c    sum += (z[2] <
1be0: 3c 20 38 29 3b 0a 20 20 20 20 63 61 73 65 20 32  < 8);.    case 2
1bf0: 3a 20 20 20 73 75 6d 20 2b 3d 20 28 7a 5b 31 5d  :   sum += (z[1]
1c00: 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73   << 16);.    cas
1c10: 65 20 31 3a 20 20 20 73 75 6d 20 2b 3d 20 28 7a  e 1:   sum += (z
1c20: 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20  [0] << 24);.    
1c30: 64 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a  default:  ;.  }.
1c40: 20 20 72 65 74 75 72 6e 20 73 75 6d 3b 0a 7d 0a    return sum;.}.
1c50: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1c60: 6e 65 77 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a  new delta..**.**
1c70: 20 54 68 65 20 64 65 6c 74 61 20 69 73 20 77 72   The delta is wr
1c80: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 70 72 65  itten into a pre
1c90: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
1ca0: 2c 20 7a 44 65 6c 74 61 2c 20 77 68 69 63 68 0a  , zDelta, which.
1cb0: 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  ** should be at 
1cc0: 6c 65 61 73 74 20 36 30 20 62 79 74 65 73 20 6c  least 60 bytes l
1cd0: 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 74  onger than the t
1ce0: 61 72 67 65 74 20 66 69 6c 65 2c 20 7a 4f 75 74  arget file, zOut
1cf0: 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  ..** The delta s
1d00: 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 4e 55  tring will be NU
1d10: 4c 2d 74 65 72 6d 69 6e 61 74 65 64 2c 20 62 75  L-terminated, bu
1d20: 74 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20  t it might also 
1d30: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 65 6d 62 65 64  contain.** embed
1d40: 64 65 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ded NUL characte
1d50: 72 73 20 69 66 20 65 69 74 68 65 72 20 74 68 65  rs if either the
1d60: 20 7a 53 72 63 20 6f 72 20 7a 4f 75 74 20 66 69   zSrc or zOut fi
1d70: 6c 65 73 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72  les are.** binar
1d80: 79 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  y.  This functio
1d90: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6c 65  n returns the le
1da0: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74  ngth of the delt
1db0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 62  a string.** in b
1dc0: 79 74 65 73 2c 20 65 78 63 6c 75 64 69 6e 67 20  ytes, excluding 
1dd0: 74 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65  the final NUL te
1de0: 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
1df0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74  er..**.** Output
1e00: 20 46 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 54   Format:.**.** T
1e10: 68 65 20 64 65 6c 74 61 20 62 65 67 69 6e 73 20  he delta begins 
1e20: 77 69 74 68 20 61 20 62 61 73 65 36 34 20 6e 75  with a base64 nu
1e30: 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
1e40: 20 61 20 6e 65 77 6c 69 6e 65 2e 20 20 54 68 69   a newline.  Thi
1e50: 73 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 73 20 74  s.** number is t
1e60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e70: 65 73 20 69 6e 20 74 68 65 20 54 41 52 47 45 54  es in the TARGET
1e80: 20 66 69 6c 65 2e 20 20 54 68 75 73 2c 20 67 69   file.  Thus, gi
1e90: 76 65 6e 20 61 0a 2a 2a 20 64 65 6c 74 61 20 66  ven a.** delta f
1ea0: 69 6c 65 20 7a 2c 20 61 20 70 72 6f 67 72 61 6d  ile z, a program
1eb0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1ec0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74   size of the out
1ed0: 70 75 74 20 66 69 6c 65 0a 2a 2a 20 73 69 6d 70  put file.** simp
1ee0: 6c 79 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  ly by reading th
1ef0: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 61 6e 64  e first line and
1f00: 20 64 65 63 6f 64 69 6e 67 20 74 68 65 20 62 61   decoding the ba
1f10: 73 65 2d 36 34 20 6e 75 6d 62 65 72 0a 2a 2a 20  se-64 number.** 
1f20: 66 6f 75 6e 64 20 74 68 65 72 65 2e 20 20 54 68  found there.  Th
1f30: 65 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73  e delta_output_s
1f40: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ize() routine do
1f50: 65 73 20 65 78 61 63 74 6c 79 20 74 68 69 73 2e  es exactly this.
1f60: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
1f70: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6e 75   initial size nu
1f80: 6d 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61 20  mber, the delta 
1f90: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65  consists of a se
1fa0: 72 69 65 73 20 6f 66 0a 2a 2a 20 6c 69 74 65 72  ries of.** liter
1fb0: 61 6c 20 74 65 78 74 20 73 65 67 6d 65 6e 74 73  al text segments
1fc0: 20 61 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f   and commands to
1fd0: 20 63 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 53   copy from the S
1fe0: 4f 55 52 43 45 20 66 69 6c 65 2e 0a 2a 2a 20 41  OURCE file..** A
1ff0: 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6c 6f   copy command lo
2000: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
2010: 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e 40 4d 4d 4d  *.**     NNN@MMM
2020: 2c 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e 4e  ,.**.** where NN
2030: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2040: 6f 66 20 62 79 74 65 73 20 74 6f 20 62 65 20 63  of bytes to be c
2050: 6f 70 69 65 64 20 61 6e 64 20 4d 4d 4d 20 69 73  opied and MMM is
2060: 20 74 68 65 20 6f 66 66 73 65 74 0a 2a 2a 20 69   the offset.** i
2070: 6e 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 66  nto the source f
2080: 69 6c 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ile of the first
2090: 20 62 79 74 65 20 28 62 6f 74 68 20 62 61 73 65   byte (both base
20a0: 2d 36 34 29 2e 20 20 20 49 66 20 4e 4e 4e 20 69  -64).   If NNN i
20b0: 73 20 30 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  s 0.** it means 
20c0: 63 6f 70 79 20 74 68 65 20 72 65 73 74 20 6f 66  copy the rest of
20d0: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2e   the input file.
20e0: 20 20 4c 69 74 65 72 61 6c 20 74 65 78 74 20 69    Literal text i
20f0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2100: 2a 2a 20 20 20 20 20 4e 4e 4e 3a 54 54 54 54 54  **     NNN:TTTTT
2110: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e 4e 4e  .**.** where NNN
2120: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2130: 66 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20  f bytes of text 
2140: 28 62 61 73 65 2d 36 34 29 20 61 6e 64 20 54 54  (base-64) and TT
2150: 54 54 54 20 69 73 20 74 68 65 20 74 65 78 74 2e  TTT is the text.
2160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  .**.** The last 
2170: 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66  term is of the f
2180: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e  orm.**.**     NN
2190: 4e 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  N;.**.** In this
21a0: 20 63 61 73 65 2c 20 4e 4e 4e 20 69 73 20 61 20   case, NNN is a 
21b0: 33 32 2d 62 69 74 20 62 69 67 65 6e 64 69 61 6e  32-bit bigendian
21c0: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
21d0: 20 6f 75 74 70 75 74 20 66 69 6c 65 0a 2a 2a 20   output file.** 
21e0: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
21f0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
2200: 74 68 65 20 64 65 6c 74 61 20 61 70 70 6c 69 65  the delta applie
2210: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 41 6c  d correctly.  Al
2220: 6c 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 72 65  l.** numbers are
2230: 20 69 6e 20 62 61 73 65 2d 36 34 2e 0a 2a 2a 0a   in base-64..**.
2240: 2a 2a 20 50 75 72 65 20 74 65 78 74 20 66 69 6c  ** Pure text fil
2250: 65 73 20 67 65 6e 65 72 61 74 65 20 61 20 70 75  es generate a pu
2260: 72 65 20 74 65 78 74 20 64 65 6c 74 61 2e 20 20  re text delta.  
2270: 42 69 6e 61 72 79 20 66 69 6c 65 73 20 67 65 6e  Binary files gen
2280: 65 72 61 74 65 20 61 0a 2a 2a 20 64 65 6c 74 61  erate a.** delta
2290: 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69   that may contai
22a0: 6e 20 73 6f 6d 65 20 62 69 6e 61 72 79 20 64 61  n some binary da
22b0: 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 6c 67 6f 72 69  ta..**.** Algori
22c0: 74 68 6d 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  thm:.**.** The e
22d0: 6e 63 6f 64 65 72 20 66 69 72 73 74 20 62 75 69  ncoder first bui
22e0: 6c 64 73 20 61 20 68 61 73 68 20 74 61 62 6c 65  lds a hash table
22f0: 20 74 6f 20 68 65 6c 70 20 69 74 20 66 69 6e 64   to help it find
2300: 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 70 61 74   matching.** pat
2310: 74 65 72 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  terns in the sou
2320: 72 63 65 20 66 69 6c 65 2e 20 20 31 36 2d 62 79  rce file.  16-by
2330: 74 65 20 63 68 75 6e 6b 73 20 6f 66 20 74 68 65  te chunks of the
2340: 20 73 6f 75 72 63 65 20 66 69 6c 65 0a 2a 2a 20   source file.** 
2350: 73 61 6d 70 6c 65 64 20 61 74 20 65 76 65 6e 6c  sampled at evenl
2360: 79 20 73 70 61 63 65 64 20 69 6e 74 65 72 76 61  y spaced interva
2370: 6c 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70  ls are used to p
2380: 6f 70 75 6c 61 74 65 20 74 68 65 20 68 61 73 68  opulate the hash
2390: 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  .** table..**.**
23a0: 20 4e 65 78 74 20 77 65 20 62 65 67 69 6e 20 73   Next we begin s
23b0: 63 61 6e 6e 69 6e 67 20 74 68 65 20 74 61 72 67  canning the targ
23c0: 65 74 20 66 69 6c 65 20 75 73 69 6e 67 20 61 20  et file using a 
23d0: 73 6c 69 64 69 6e 67 20 31 36 2d 62 79 74 65 0a  sliding 16-byte.
23e0: 2a 2a 20 77 69 6e 64 6f 77 2e 20 20 54 68 65 20  ** window.  The 
23f0: 68 61 73 68 20 6f 66 20 74 68 65 20 31 36 2d 62  hash of the 16-b
2400: 79 74 65 20 77 69 6e 64 6f 77 20 69 6e 20 74 68  yte window in th
2410: 65 20 74 61 72 67 65 74 20 69 73 20 75 73 65 64  e target is used
2420: 20 74 6f 0a 2a 2a 20 73 65 61 72 63 68 20 66 6f   to.** search fo
2430: 72 20 61 20 6d 61 74 63 68 69 6e 67 20 73 65 63  r a matching sec
2440: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 6f 75 72  tion in the sour
2450: 63 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 61  ce file.  When a
2460: 20 6d 61 74 63 68 0a 2a 2a 20 69 73 20 66 6f 75   match.** is fou
2470: 6e 64 2c 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61  nd, a copy comma
2480: 6e 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  nd is added to t
2490: 68 65 20 64 65 6c 74 61 2e 20 20 41 6e 20 65 66  he delta.  An ef
24a0: 66 6f 72 74 20 69 73 0a 2a 2a 20 6d 61 64 65 20  fort is.** made 
24b0: 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 6d 61  to extend the ma
24c0: 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 20 74  tching section t
24d0: 6f 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 63  o regions that c
24e0: 6f 6d 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ome before.** an
24f0: 64 20 61 66 74 65 72 20 74 68 65 20 31 36 2d 62  d after the 16-b
2500: 79 74 65 20 68 61 73 68 20 77 69 6e 64 6f 77 2e  yte hash window.
2510: 20 20 41 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64    A copy command
2520: 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 0a   is only issued.
2530: 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ** if the result
2540: 20 77 6f 75 6c 64 20 75 73 65 20 6c 65 73 73 20   would use less 
2550: 73 70 61 63 65 20 74 68 61 74 20 6a 75 73 74 20  space that just 
2560: 71 75 6f 74 69 6e 67 20 74 68 65 20 74 65 78 74  quoting the text
2570: 0a 2a 2a 20 6c 69 74 65 72 61 6c 6c 79 2e 20 4c  .** literally. L
2580: 69 74 65 72 61 6c 20 74 65 78 74 20 69 73 20 61  iteral text is a
2590: 64 64 65 64 20 74 6f 20 74 68 65 20 64 65 6c 74  dded to the delt
25a0: 61 20 66 6f 72 20 73 65 63 74 69 6f 6e 73 20 74  a for sections t
25b0: 68 61 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 61  hat.** do not ma
25c0: 74 63 68 20 6f 72 20 77 68 69 63 68 20 63 61 6e  tch or which can
25d0: 20 6e 6f 74 20 62 65 20 65 6e 63 6f 64 65 64 20   not be encoded 
25e0: 65 66 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e  efficiently usin
25f0: 67 20 63 6f 70 79 0a 2a 2a 20 63 6f 6d 6d 61 6e  g copy.** comman
2600: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
2610: 74 20 64 65 6c 74 61 5f 63 72 65 61 74 65 28 0a  t delta_create(.
2620: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2630: 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc,      /* The 
2640: 73 6f 75 72 63 65 20 6f 72 20 70 61 74 74 65 72  source or patter
2650: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  n file */.  unsi
2660: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 53 72 63 2c  gned int lenSrc,
2670: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
2680: 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20  the source file 
2690: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
26a0: 2a 7a 4f 75 74 2c 20 20 20 20 20 20 2f 2a 20 54  *zOut,      /* T
26b0: 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 2a  he target file *
26c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
26d0: 20 6c 65 6e 4f 75 74 2c 20 20 20 2f 2a 20 4c 65   lenOut,   /* Le
26e0: 6e 67 74 68 20 6f 66 20 74 68 65 20 74 61 72 67  ngth of the targ
26f0: 65 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  et file */.  cha
2700: 72 20 2a 7a 44 65 6c 74 61 20 20 20 20 20 20 20  r *zDelta       
2710: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2720: 20 64 65 6c 74 61 20 69 6e 74 6f 20 74 68 69 73   delta into this
2730: 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
2740: 69 6e 74 20 69 2c 20 62 61 73 65 3b 0a 20 20 63  int i, base;.  c
2750: 68 61 72 20 2a 7a 4f 72 69 67 44 65 6c 74 61 20  har *zOrigDelta 
2760: 3d 20 7a 44 65 6c 74 61 3b 0a 20 20 68 61 73 68  = zDelta;.  hash
2770: 20 68 3b 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b   h;.  int nHash;
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 61   /* Number of ha
27a0: 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  sh table entries
27b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 6c 61 6e 64 6d   */.  int *landm
27c0: 61 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ark;            
27d0: 20 2f 2a 20 50 72 69 6d 61 72 79 20 68 61 73 68   /* Primary hash
27e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
27f0: 2a 63 6f 6c 6c 69 64 65 3b 20 20 20 20 20 20 20  *collide;       
2800: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 69 73         /* Collis
2810: 69 6f 6e 20 63 68 61 69 6e 20 2a 2f 0a 20 20 69  ion chain */.  i
2820: 6e 74 20 6c 61 73 74 52 65 61 64 20 3d 20 2d 31  nt lastRead = -1
2830: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  ;         /* Las
2840: 74 20 62 79 74 65 20 6f 66 20 7a 53 72 63 20 72  t byte of zSrc r
2850: 65 61 64 20 62 79 20 61 20 43 4f 50 59 20 63 6f  ead by a COPY co
2860: 6d 6d 61 6e 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  mmand */..  /* A
2870: 64 64 20 74 68 65 20 74 61 72 67 65 74 20 66 69  dd the target fi
2880: 6c 65 20 73 69 7a 65 20 74 6f 20 74 68 65 20 62  le size to the b
2890: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
28a0: 64 65 6c 74 61 0a 20 20 2a 2f 0a 20 20 70 75 74  delta.  */.  put
28b0: 49 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a 44 65  Int(lenOut, &zDe
28c0: 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c 74 61  lta);.  *(zDelta
28d0: 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 0a 20 20 2f  ++) = '\n';..  /
28e0: 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 20  * If the source 
28f0: 66 69 6c 65 20 69 73 20 76 65 72 79 20 73 6d 61  file is very sma
2900: 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
2910: 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 2a  t we have no.  *
2920: 2a 20 63 68 61 6e 63 65 20 6f 66 20 65 76 65 72  * chance of ever
2930: 20 64 6f 69 6e 67 20 61 20 63 6f 70 79 20 63 6f   doing a copy co
2940: 6d 6d 61 6e 64 2e 20 20 4a 75 73 74 20 6f 75 74  mmand.  Just out
2950: 70 75 74 20 61 20 73 69 6e 67 6c 65 0a 20 20 2a  put a single.  *
2960: 2a 20 6c 69 74 65 72 61 6c 20 73 65 67 6d 65 6e  * literal segmen
2970: 74 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  t for the entire
2980: 20 74 61 72 67 65 74 20 61 6e 64 20 65 78 69 74   target and exit
2990: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e  ..  */.  if( len
29a0: 53 72 63 3c 3d 4e 48 41 53 48 20 29 7b 0a 20 20  Src<=NHASH ){.  
29b0: 20 20 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2c    putInt(lenOut,
29c0: 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a   &zDelta);.    *
29d0: 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27 3a 27  (zDelta++) = ':'
29e0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65  ;.    memcpy(zDe
29f0: 6c 74 61 2c 20 7a 4f 75 74 2c 20 6c 65 6e 4f 75  lta, zOut, lenOu
2a00: 74 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61 20 2b  t);.    zDelta +
2a10: 3d 20 6c 65 6e 4f 75 74 3b 0a 20 20 20 20 70 75  = lenOut;.    pu
2a20: 74 49 6e 74 28 63 68 65 63 6b 73 75 6d 28 7a 4f  tInt(checksum(zO
2a30: 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26 7a 44  ut, lenOut), &zD
2a40: 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65  elta);.    *(zDe
2a50: 6c 74 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20 20  lta++) = ';';.  
2a60: 20 20 72 65 74 75 72 6e 20 7a 44 65 6c 74 61 20    return zDelta 
2a70: 2d 20 7a 4f 72 69 67 44 65 6c 74 61 3b 0a 20 20  - zOrigDelta;.  
2a80: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
2a90: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
2aa0: 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 6d 61  sed to locate ma
2ab0: 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 73 20  tching sections 
2ac0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 6f 75 72  in the.  ** sour
2ad0: 63 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ce file..  */.  
2ae0: 6e 48 61 73 68 20 3d 20 6c 65 6e 53 72 63 2f 4e  nHash = lenSrc/N
2af0: 48 41 53 48 3b 0a 20 20 63 6f 6c 6c 69 64 65 20  HASH;.  collide 
2b00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2b10: 36 34 28 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  64( (sqlite3_int
2b20: 36 34 29 6e 48 61 73 68 2a 32 2a 73 69 7a 65 6f  64)nHash*2*sizeo
2b30: 66 28 69 6e 74 29 20 29 3b 0a 20 20 6d 65 6d 73  f(int) );.  mems
2b40: 65 74 28 63 6f 6c 6c 69 64 65 2c 20 2d 31 2c 20  et(collide, -1, 
2b50: 6e 48 61 73 68 2a 32 2a 73 69 7a 65 6f 66 28 69  nHash*2*sizeof(i
2b60: 6e 74 29 29 3b 0a 20 20 6c 61 6e 64 6d 61 72 6b  nt));.  landmark
2b70: 20 3d 20 26 63 6f 6c 6c 69 64 65 5b 6e 48 61 73   = &collide[nHas
2b80: 68 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  h];.  for(i=0; i
2b90: 3c 6c 65 6e 53 72 63 2d 4e 48 41 53 48 3b 20 69  <lenSrc-NHASH; i
2ba0: 2b 3d 4e 48 41 53 48 29 7b 0a 20 20 20 20 69 6e  +=NHASH){.    in
2bb0: 74 20 68 76 20 3d 20 68 61 73 68 5f 6f 6e 63 65  t hv = hash_once
2bc0: 28 26 7a 53 72 63 5b 69 5d 29 20 25 20 6e 48 61  (&zSrc[i]) % nHa
2bd0: 73 68 3b 0a 20 20 20 20 63 6f 6c 6c 69 64 65 5b  sh;.    collide[
2be0: 69 2f 4e 48 41 53 48 5d 20 3d 20 6c 61 6e 64 6d  i/NHASH] = landm
2bf0: 61 72 6b 5b 68 76 5d 3b 0a 20 20 20 20 6c 61 6e  ark[hv];.    lan
2c00: 64 6d 61 72 6b 5b 68 76 5d 20 3d 20 69 2f 4e 48  dmark[hv] = i/NH
2c10: 41 53 48 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  ASH;.  }..  /* B
2c20: 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68  egin scanning th
2c30: 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 61 6e  e target file an
2c40: 64 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 70  d generating cop
2c50: 79 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 0a 20  y commands and. 
2c60: 20 2a 2a 20 6c 69 74 65 72 61 6c 20 73 65 63 74   ** literal sect
2c70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 65 6c 74  ions of the delt
2c80: 61 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d  a..  */.  base =
2c90: 20 30 3b 20 20 20 20 2f 2a 20 57 65 20 68 61 76   0;    /* We hav
2ca0: 65 20 61 6c 72 65 61 64 79 20 67 65 6e 65 72 61  e already genera
2cb0: 74 65 64 20 65 76 65 72 79 74 68 69 6e 67 20 62  ted everything b
2cc0: 65 66 6f 72 65 20 7a 4f 75 74 5b 62 61 73 65 5d  efore zOut[base]
2cd0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 62 61 73   */.  while( bas
2ce0: 65 2b 4e 48 41 53 48 3c 6c 65 6e 4f 75 74 20 29  e+NHASH<lenOut )
2cf0: 7b 0a 20 20 20 20 69 6e 74 20 69 53 72 63 2c 20  {.    int iSrc, 
2d00: 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 75 6e 73 69  iBlock;.    unsi
2d10: 67 6e 65 64 20 69 6e 74 20 62 65 73 74 43 6e 74  gned int bestCnt
2d20: 2c 20 62 65 73 74 4f 66 73 74 3d 30 2c 20 62 65  , bestOfst=0, be
2d30: 73 74 4c 69 74 73 7a 3d 30 3b 0a 20 20 20 20 68  stLitsz=0;.    h
2d40: 61 73 68 5f 69 6e 69 74 28 26 68 2c 20 26 7a 4f  ash_init(&h, &zO
2d50: 75 74 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 69  ut[base]);.    i
2d60: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 79   = 0;     /* Try
2d70: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 61 20 6c  ing to match a l
2d80: 61 6e 64 6d 61 72 6b 20 61 67 61 69 6e 73 74 20  andmark against 
2d90: 7a 4f 75 74 5b 62 61 73 65 2b 69 5d 20 2a 2f 0a  zOut[base+i] */.
2da0: 20 20 20 20 62 65 73 74 43 6e 74 20 3d 20 30 3b      bestCnt = 0;
2db0: 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
2dc0: 0a 20 20 20 20 20 20 69 6e 74 20 68 76 3b 0a 20  .      int hv;. 
2dd0: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
2de0: 20 32 35 30 3b 0a 0a 20 20 20 20 20 20 68 76 20   250;..      hv 
2df0: 3d 20 68 61 73 68 5f 33 32 62 69 74 28 26 68 29  = hash_32bit(&h)
2e00: 20 25 20 6e 48 61 73 68 3b 0a 20 20 20 20 20 20   % nHash;.      
2e10: 69 42 6c 6f 63 6b 20 3d 20 6c 61 6e 64 6d 61 72  iBlock = landmar
2e20: 6b 5b 68 76 5d 3b 0a 20 20 20 20 20 20 77 68 69  k[hv];.      whi
2e30: 6c 65 28 20 69 42 6c 6f 63 6b 3e 3d 30 20 26 26  le( iBlock>=0 &&
2e40: 20 28 6c 69 6d 69 74 2d 2d 29 3e 30 20 29 7b 0a   (limit--)>0 ){.
2e50: 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
2e60: 20 20 20 2a 2a 20 54 68 65 20 68 61 73 68 20 77     ** The hash w
2e70: 69 6e 64 6f 77 20 68 61 73 20 69 64 65 6e 74 69  indow has identi
2e80: 66 69 65 64 20 61 20 70 6f 74 65 6e 74 69 61 6c  fied a potential
2e90: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 0a 20   match against. 
2ea0: 20 20 20 20 20 20 20 2a 2a 20 6c 61 6e 64 6d 61         ** landma
2eb0: 72 6b 20 62 6c 6f 63 6b 20 69 42 6c 6f 63 6b 2e  rk block iBlock.
2ec0: 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f    But we need to
2ed0: 20 69 6e 76 65 73 74 69 67 61 74 65 20 66 75 72   investigate fur
2ee0: 74 68 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ther..        **
2ef0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 6f 6f 6b  .        ** Look
2f00: 20 66 6f 72 20 61 20 72 65 67 69 6f 6e 20 69 6e   for a region in
2f10: 20 7a 4f 75 74 20 74 68 61 74 20 6d 61 74 63 68   zOut that match
2f20: 65 73 20 7a 53 72 63 2e 20 41 6e 63 68 6f 72 20  es zSrc. Anchor 
2f30: 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20  the search.     
2f40: 20 20 20 2a 2a 20 61 74 20 7a 53 72 63 5b 69 53     ** at zSrc[iS
2f50: 72 63 5d 20 61 6e 64 20 7a 4f 75 74 5b 62 61 73  rc] and zOut[bas
2f60: 65 2b 69 5d 2e 20 20 44 6f 20 6e 6f 74 20 69 6e  e+i].  Do not in
2f70: 63 6c 75 64 65 20 61 6e 79 74 68 69 6e 67 20 70  clude anything p
2f80: 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 20 20  rior to.        
2f90: 2a 2a 20 7a 4f 75 74 5b 62 61 73 65 5d 20 6f 72  ** zOut[base] or
2fa0: 20 61 66 74 65 72 20 7a 4f 75 74 5b 6f 75 74 4c   after zOut[outL
2fb0: 65 6e 5d 20 6e 6f 72 20 61 6e 79 74 68 69 6e 67  en] nor anything
2fc0: 20 61 66 74 65 72 20 7a 53 72 63 5b 73 72 63 4c   after zSrc[srcL
2fd0: 65 6e 5d 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  en]..        **.
2fe0: 20 20 20 20 20 20 20 20 2a 2a 20 53 65 74 20 63          ** Set c
2ff0: 6e 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  nt equal to the 
3000: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 61  length of the ma
3010: 74 63 68 20 61 6e 64 20 73 65 74 20 6f 66 73 74  tch and set ofst
3020: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
3030: 20 2a 2a 20 7a 53 72 63 5b 6f 66 73 74 5d 20 69   ** zSrc[ofst] i
3040: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
3050: 65 6e 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ent of the match
3060: 2e 20 20 6c 69 74 73 7a 20 69 73 20 74 68 65 20  .  litsz is the 
3070: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 2a  number.        *
3080: 2a 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  * of characters 
3090: 62 65 74 77 65 65 6e 20 7a 4f 75 74 5b 62 61 73  between zOut[bas
30a0: 65 5d 20 61 6e 64 20 74 68 65 20 62 65 67 69 6e  e] and the begin
30b0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 74 63  ning of the matc
30c0: 68 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 7a  h..        ** sz
30d0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6f 76 65   will be the ove
30e0: 72 68 65 61 64 20 28 69 6e 20 62 79 74 65 73 29  rhead (in bytes)
30f0: 20 6e 65 65 64 65 64 20 74 6f 20 65 6e 63 6f 64   needed to encod
3100: 65 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20  e the copy.     
3110: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20     ** command.  
3120: 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  Only generate co
3130: 70 79 20 63 6f 6d 6d 61 6e 64 20 69 66 20 74 68  py command if th
3140: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 74 68  e overhead of th
3150: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
3160: 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6c 65 73  y command is les
3170: 73 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e  s than the amoun
3180: 74 20 6f 66 20 6c 69 74 65 72 61 6c 20 74 65 78  t of literal tex
3190: 74 20 74 6f 20 62 65 20 63 6f 70 69 65 64 2e 0a  t to be copied..
31a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31b0: 20 20 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74     int cnt, ofst
31c0: 2c 20 6c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20  , litsz;.       
31d0: 20 69 6e 74 20 6a 2c 20 6b 2c 20 78 2c 20 79 3b   int j, k, x, y;
31e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  .        int sz;
31f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
3200: 69 74 58 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  itX;..        /*
3210: 20 42 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   Beginning at iS
3220: 72 63 2c 20 6d 61 74 63 68 20 66 6f 72 77 61 72  rc, match forwar
3230: 64 73 20 61 73 20 66 61 72 20 61 73 20 77 65 20  ds as far as we 
3240: 63 61 6e 2e 20 20 6a 20 63 6f 75 6e 74 73 0a 20  can.  j counts. 
3250: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 75         ** the nu
3260: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
3270: 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 2a 2f  rs that match */
3280: 0a 20 20 20 20 20 20 20 20 69 53 72 63 20 3d 20  .        iSrc = 
3290: 69 42 6c 6f 63 6b 2a 4e 48 41 53 48 3b 0a 20 20  iBlock*NHASH;.  
32a0: 20 20 20 20 20 20 79 20 3d 20 62 61 73 65 2b 69        y = base+i
32b0: 3b 0a 20 20 20 20 20 20 20 20 6c 69 6d 69 74 58  ;.        limitX
32c0: 20 3d 20 28 20 6c 65 6e 53 72 63 2d 69 53 72 63   = ( lenSrc-iSrc
32d0: 20 3c 3d 20 6c 65 6e 4f 75 74 2d 79 20 29 20 3f   <= lenOut-y ) ?
32e0: 20 6c 65 6e 53 72 63 20 3a 20 69 53 72 63 20 2b   lenSrc : iSrc +
32f0: 20 6c 65 6e 4f 75 74 20 2d 20 79 3b 0a 20 20 20   lenOut - y;.   
3300: 20 20 20 20 20 66 6f 72 28 78 3d 69 53 72 63 3b       for(x=iSrc;
3310: 20 78 3c 6c 69 6d 69 74 58 3b 20 78 2b 2b 2c 20   x<limitX; x++, 
3320: 79 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y++){.          
3330: 69 66 28 20 7a 53 72 63 5b 78 5d 21 3d 7a 4f 75  if( zSrc[x]!=zOu
3340: 74 5b 79 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  t[y] ) break;.  
3350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3360: 6a 20 3d 20 78 20 2d 20 69 53 72 63 20 2d 20 31  j = x - iSrc - 1
3370: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ;..        /* Be
3380: 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 72 63 2d  ginning at iSrc-
3390: 31 2c 20 6d 61 74 63 68 20 62 61 63 6b 77 61 72  1, match backwar
33a0: 64 73 20 61 73 20 66 61 72 20 61 73 20 77 65 20  ds as far as we 
33b0: 63 61 6e 2e 20 20 6b 20 63 6f 75 6e 74 73 0a 20  can.  k counts. 
33c0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 75         ** the nu
33d0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
33e0: 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 2a 2f  rs that match */
33f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  .        for(k=1
3400: 3b 20 6b 3c 69 53 72 63 20 26 26 20 6b 3c 3d 69  ; k<iSrc && k<=i
3410: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
3420: 20 20 69 66 28 20 7a 53 72 63 5b 69 53 72 63 2d    if( zSrc[iSrc-
3430: 6b 5d 21 3d 7a 4f 75 74 5b 62 61 73 65 2b 69 2d  k]!=zOut[base+i-
3440: 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
3450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 2d      }.        k-
3460: 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  -;..        /* C
3470: 6f 6d 70 75 74 65 20 74 68 65 20 6f 66 66 73 65  ompute the offse
3480: 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20 74 68  t and size of th
3490: 65 20 6d 61 74 63 68 69 6e 67 20 72 65 67 69 6f  e matching regio
34a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 73  n */.        ofs
34b0: 74 20 3d 20 69 53 72 63 2d 6b 3b 0a 20 20 20 20  t = iSrc-k;.    
34c0: 20 20 20 20 63 6e 74 20 3d 20 6a 2b 6b 2b 31 3b      cnt = j+k+1;
34d0: 0a 20 20 20 20 20 20 20 20 6c 69 74 73 7a 20 3d  .        litsz =
34e0: 20 69 2d 6b 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   i-k;  /* Number
34f0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6c 69 74   of bytes of lit
3500: 65 72 61 6c 20 74 65 78 74 20 62 65 66 6f 72 65  eral text before
3510: 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 20 20 20   the copy */.   
3520: 20 20 20 20 20 2f 2a 20 73 7a 20 77 69 6c 6c 20       /* sz will 
3530: 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20  hold the number 
3540: 6f 66 20 62 79 74 65 73 20 6e 65 65 64 65 64 20  of bytes needed 
3550: 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 22 69  to encode the "i
3560: 6e 73 65 72 74 22 0a 20 20 20 20 20 20 20 20 2a  nsert".        *
3570: 2a 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68  * command and th
3580: 65 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 2c 20  e copy command, 
3590: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
35a0: 20 22 69 6e 73 65 72 74 22 20 74 65 78 74 20 2a   "insert" text *
35b0: 2f 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 64  /.        sz = d
35c0: 69 67 69 74 5f 63 6f 75 6e 74 28 69 2d 6b 29 2b  igit_count(i-k)+
35d0: 64 69 67 69 74 5f 63 6f 75 6e 74 28 63 6e 74 29  digit_count(cnt)
35e0: 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28 6f 66 73  +digit_count(ofs
35f0: 74 29 2b 33 3b 0a 20 20 20 20 20 20 20 20 69 66  t)+3;.        if
3600: 28 20 63 6e 74 3e 3d 73 7a 20 26 26 20 63 6e 74  ( cnt>=sz && cnt
3610: 3e 62 65 73 74 43 6e 74 20 29 7b 0a 20 20 20 20  >bestCnt ){.    
3620: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
3630: 72 20 74 68 69 73 20 6d 61 74 63 68 20 6f 6e 6c  r this match onl
3640: 79 20 69 66 20 69 74 20 69 73 20 74 68 65 20 62  y if it is the b
3650: 65 73 74 20 73 6f 20 66 61 72 20 61 6e 64 20 69  est so far and i
3660: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  t.          ** d
3670: 6f 65 73 20 6e 6f 74 20 69 6e 63 72 65 61 73 65  oes not increase
3680: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 2a   the file size *
3690: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  /.          best
36a0: 43 6e 74 20 3d 20 63 6e 74 3b 0a 20 20 20 20 20  Cnt = cnt;.     
36b0: 20 20 20 20 20 62 65 73 74 4f 66 73 74 20 3d 20       bestOfst = 
36c0: 69 53 72 63 2d 6b 3b 0a 20 20 20 20 20 20 20 20  iSrc-k;.        
36d0: 20 20 62 65 73 74 4c 69 74 73 7a 20 3d 20 6c 69    bestLitsz = li
36e0: 74 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  tsz;.        }..
36f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
3700: 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
3710: 6e 67 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ng block */.    
3720: 20 20 20 20 69 42 6c 6f 63 6b 20 3d 20 63 6f 6c      iBlock = col
3730: 6c 69 64 65 5b 69 42 6c 6f 63 6b 5d 3b 0a 20 20  lide[iBlock];.  
3740: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
3750: 57 65 20 68 61 76 65 20 61 20 63 6f 70 79 20 63  We have a copy c
3760: 6f 6d 6d 61 6e 64 20 74 68 61 74 20 64 6f 65 73  ommand that does
3770: 20 6e 6f 74 20 63 61 75 73 65 20 74 68 65 20 64   not cause the d
3780: 65 6c 74 61 20 74 6f 20 62 65 20 6c 61 72 67 65  elta to be large
3790: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20  r.      ** than 
37a0: 61 20 6c 69 74 65 72 61 6c 20 69 6e 73 65 72 74  a literal insert
37b0: 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 63 6f  .  So add the co
37c0: 70 79 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 68  py command to th
37d0: 65 20 64 65 6c 74 61 2e 0a 20 20 20 20 20 20 2a  e delta..      *
37e0: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 65 73 74  /.      if( best
37f0: 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Cnt>0 ){.       
3800: 20 69 66 28 20 62 65 73 74 4c 69 74 73 7a 3e 30   if( bestLitsz>0
3810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
3820: 20 41 64 64 20 61 6e 20 69 6e 73 65 72 74 20 63   Add an insert c
3830: 6f 6d 6d 61 6e 64 20 62 65 66 6f 72 65 20 74 68  ommand before th
3840: 65 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  e copy */.      
3850: 20 20 20 20 70 75 74 49 6e 74 28 62 65 73 74 4c      putInt(bestL
3860: 69 74 73 7a 2c 26 7a 44 65 6c 74 61 29 3b 0a 20  itsz,&zDelta);. 
3870: 20 20 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74           *(zDelt
3880: 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20 20 20  a++) = ':';.    
3890: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65        memcpy(zDe
38a0: 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73 65 5d  lta, &zOut[base]
38b0: 2c 20 62 65 73 74 4c 69 74 73 7a 29 3b 0a 20 20  , bestLitsz);.  
38c0: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b          zDelta +
38d0: 3d 20 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20 20  = bestLitsz;.   
38e0: 20 20 20 20 20 20 20 62 61 73 65 20 2b 3d 20 62         base += b
38f0: 65 73 74 4c 69 74 73 7a 3b 0a 20 20 20 20 20 20  estLitsz;.      
3900: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 61 73 65    }.        base
3910: 20 2b 3d 20 62 65 73 74 43 6e 74 3b 0a 20 20 20   += bestCnt;.   
3920: 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73 74       putInt(best
3930: 43 6e 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20  Cnt, &zDelta);. 
3940: 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b         *(zDelta+
3950: 2b 29 20 3d 20 27 40 27 3b 0a 20 20 20 20 20 20  +) = '@';.      
3960: 20 20 70 75 74 49 6e 74 28 62 65 73 74 4f 66 73    putInt(bestOfs
3970: 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20  t, &zDelta);.   
3980: 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29       *(zDelta++)
3990: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
39a0: 69 66 28 20 62 65 73 74 4f 66 73 74 20 2b 20 62  if( bestOfst + b
39b0: 65 73 74 43 6e 74 20 2d 31 20 3e 20 6c 61 73 74  estCnt -1 > last
39c0: 52 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  Read ){.        
39d0: 20 20 6c 61 73 74 52 65 61 64 20 3d 20 62 65 73    lastRead = bes
39e0: 74 4f 66 73 74 20 2b 20 62 65 73 74 43 6e 74 20  tOfst + bestCnt 
39f0: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
3a00: 20 20 20 20 20 20 20 62 65 73 74 43 6e 74 20 3d         bestCnt =
3a10: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
3a20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
3a30: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
3a40: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
3a50: 6d 65 61 6e 73 20 6e 6f 20 6d 61 74 63 68 20 69  means no match i
3a60: 73 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  s found so far *
3a70: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 61 73 65  /.      if( base
3a80: 2b 69 2b 4e 48 41 53 48 3e 3d 6c 65 6e 4f 75 74  +i+NHASH>=lenOut
3a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
3aa0: 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 74  e have reached t
3ab0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
3ac0: 6c 65 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20  le and have not 
3ad0: 66 6f 75 6e 64 20 61 6e 79 0a 20 20 20 20 20 20  found any.      
3ae0: 20 20 2a 2a 20 6d 61 74 63 68 65 73 2e 20 20 44    ** matches.  D
3af0: 6f 20 61 6e 20 22 69 6e 73 65 72 74 22 20 66 6f  o an "insert" fo
3b00: 72 20 65 76 65 72 79 74 68 69 6e 67 20 74 68 61  r everything tha
3b10: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
3b20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 49   */.        putI
3b30: 6e 74 28 6c 65 6e 4f 75 74 2d 62 61 73 65 2c 20  nt(lenOut-base, 
3b40: 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &zDelta);.      
3b50: 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20    *(zDelta++) = 
3b60: 27 3a 27 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ':';.        mem
3b70: 63 70 79 28 7a 44 65 6c 74 61 2c 20 26 7a 4f 75  cpy(zDelta, &zOu
3b80: 74 5b 62 61 73 65 5d 2c 20 6c 65 6e 4f 75 74 2d  t[base], lenOut-
3b90: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  base);.        z
3ba0: 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f 75 74 2d  Delta += lenOut-
3bb0: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 62 61  base;.        ba
3bc0: 73 65 20 3d 20 6c 65 6e 4f 75 74 3b 0a 20 20 20  se = lenOut;.   
3bd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3be0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64    }..      /* Ad
3bf0: 76 61 6e 63 65 20 74 68 65 20 68 61 73 68 20 62  vance the hash b
3c00: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
3c10: 20 20 4b 65 65 70 20 6c 6f 6f 6b 69 6e 67 20 66    Keep looking f
3c20: 6f 72 20 61 20 6d 61 74 63 68 20 2a 2f 0a 20 20  or a match */.  
3c30: 20 20 20 20 68 61 73 68 5f 6e 65 78 74 28 26 68      hash_next(&h
3c40: 2c 20 7a 4f 75 74 5b 62 61 73 65 2b 69 2b 4e 48  , zOut[base+i+NH
3c50: 41 53 48 5d 29 3b 0a 20 20 20 20 20 20 69 2b 2b  ASH]);.      i++
3c60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
3c70: 20 4f 75 74 70 75 74 20 61 20 66 69 6e 61 6c 20   Output a final 
3c80: 22 69 6e 73 65 72 74 22 20 72 65 63 6f 72 64 20  "insert" record 
3c90: 74 6f 20 67 65 74 20 61 6c 6c 20 74 68 65 20 74  to get all the t
3ca0: 65 78 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ext at the end o
3cb0: 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20  f.  ** the file 
3cc0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
3cd0: 74 63 68 20 61 6e 79 74 68 69 6e 67 20 69 6e 20  tch anything in 
3ce0: 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  the source file.
3cf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 62 61 73 65  .  */.  if( base
3d00: 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20 20 70  <lenOut ){.    p
3d10: 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2d 62 61 73  utInt(lenOut-bas
3d20: 65 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20  e, &zDelta);.   
3d30: 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27   *(zDelta++) = '
3d40: 3a 27 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  :';.    memcpy(z
3d50: 44 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73  Delta, &zOut[bas
3d60: 65 5d 2c 20 6c 65 6e 4f 75 74 2d 62 61 73 65 29  e], lenOut-base)
3d70: 3b 0a 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20  ;.    zDelta += 
3d80: 6c 65 6e 4f 75 74 2d 62 61 73 65 3b 0a 20 20 7d  lenOut-base;.  }
3d90: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
3da0: 20 66 69 6e 61 6c 20 63 68 65 63 6b 73 75 6d 20   final checksum 
3db0: 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 70 75 74  record. */.  put
3dc0: 49 6e 74 28 63 68 65 63 6b 73 75 6d 28 7a 4f 75  Int(checksum(zOu
3dd0: 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26 7a 44 65  t, lenOut), &zDe
3de0: 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c 74 61  lta);.  *(zDelta
3df0: 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20 20 73 71 6c  ++) = ';';.  sql
3e00: 69 74 65 33 5f 66 72 65 65 28 63 6f 6c 6c 69 64  ite3_free(collid
3e10: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65  e);.  return zDe
3e20: 6c 74 61 20 2d 20 7a 4f 72 69 67 44 65 6c 74 61  lta - zOrigDelta
3e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3e40: 6e 20 74 68 65 20 73 69 7a 65 20 28 69 6e 20 62  n the size (in b
3e50: 79 74 65 73 29 20 6f 66 20 74 68 65 20 6f 75 74  ytes) of the out
3e60: 70 75 74 20 66 72 6f 6d 20 61 70 70 6c 79 69 6e  put from applyin
3e70: 67 0a 2a 2a 20 61 20 64 65 6c 74 61 2e 0a 2a 2a  g.** a delta..**
3e80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e90: 20 69 73 20 70 72 6f 76 69 64 65 64 20 73 6f 20   is provided so 
3ea0: 74 68 61 74 20 61 6e 20 70 72 6f 63 65 64 75 72  that an procedur
3eb0: 65 20 74 68 61 74 20 69 73 20 61 62 6c 65 0a 2a  e that is able.*
3ec0: 2a 20 74 6f 20 63 61 6c 6c 20 64 65 6c 74 61 5f  * to call delta_
3ed0: 61 70 70 6c 79 28 29 20 63 61 6e 20 6c 65 61 72  apply() can lear
3ee0: 6e 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  n how much space
3ef0: 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
3f00: 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 20 61  for the output a
3f10: 6e 64 20 68 65 6e 63 65 20 61 6c 6c 6f 63 61 74  nd hence allocat
3f20: 65 20 6e 6f 72 20 6d 6f 72 65 20 73 70 61 63 65  e nor more space
3f30: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 0a   that is really.
3f40: 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
3f50: 61 74 69 63 20 69 6e 74 20 64 65 6c 74 61 5f 6f  atic int delta_o
3f60: 75 74 70 75 74 5f 73 69 7a 65 28 63 6f 6e 73 74  utput_size(const
3f70: 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 69   char *zDelta, i
3f80: 6e 74 20 6c 65 6e 44 65 6c 74 61 29 7b 0a 20 20  nt lenDelta){.  
3f90: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65  int size;.  size
3fa0: 20 3d 20 64 65 6c 74 61 47 65 74 49 6e 74 28 26   = deltaGetInt(&
3fb0: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
3fc0: 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74  a);.  if( *zDelt
3fd0: 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f  a!='\n' ){.    /
3fe0: 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e  * ERROR: size in
3ff0: 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e  teger not termin
4000: 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a  ated by "\n" */.
4010: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65   }.  return size
4030: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  ;.}.../*.** Appl
4040: 79 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a  y a delta..**.**
4050: 20 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   The output buff
4060: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67  er should be big
4070: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
4080: 74 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74  the whole output
4090: 0a 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e  .** file and a N
40a0: 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74  UL terminator at
40b0: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64   the end.  The d
40c0: 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65  elta_output_size
40d0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
40e0: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  ll determine thi
40f0: 73 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a  s size for you..
4100: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20  **.** The delta 
4110: 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  string should be
4120: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
4130: 2e 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61  .  But the delta
4140: 20 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63   string.** may c
4150: 6f 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20  ontain embedded 
4160: 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28  NUL characters (
4170: 69 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64  if the input and
4180: 20 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62   output are.** b
4190: 69 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20  inary files) so 
41a0: 77 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20  we also have to 
41b0: 70 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67  pass in the leng
41c0: 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20  th of the delta 
41d0: 69 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c  in.** the lenDel
41e0: 74 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ta parameter..**
41f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4200: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69  n returns the si
4210: 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
4220: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28   file in bytes (
4230: 65 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65  excluding.** the
4240: 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69   final NUL termi
4250: 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29  nator character)
4260: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
4270: 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69  e delta string i
4280: 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f  s.** malformed o
4290: 72 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  r intended for u
42a0: 73 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65  se with a source
42b0: 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
42c0: 20 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74   zSrc,.** then t
42d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
42e0: 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65  rns -1..**.** Re
42f0: 66 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61  fer to the delta
4300: 5f 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65  _create() docume
4310: 6e 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f  ntation above fo
4320: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  r a description.
4330: 2a 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20  ** of the delta 
4340: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a  file format..*/.
4350: 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 74 61  static int delta
4360: 5f 61 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20  _apply(.  const 
4370: 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20 20  char *zSrc,     
4380: 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 6f   /* The source o
4390: 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20 2a  r pattern file *
43a0: 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20  /.  int lenSrc, 
43b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
43c0: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75 72  ngth of the sour
43d0: 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e  ce file */.  con
43e0: 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c  st char *zDelta,
43f0: 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20      /* Delta to 
4400: 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61 74  apply to the pat
4410: 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  tern */.  int le
4420: 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20 20  nDelta,         
4430: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
4440: 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61  e delta */.  cha
4450: 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20  r *zOut         
4460: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4470: 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68 69   output into thi
4480: 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  s preallocated b
4490: 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e  uffer */.){.  un
44a0: 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74  signed int limit
44b0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
44c0: 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66 64   total = 0;.#ifd
44d0: 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45  ef FOSSIL_ENABLE
44e0: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45 53  _DELTA_CKSUM_TES
44f0: 54 0a 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 4f  T.  char *zOrigO
4500: 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65 6e 64 69  ut = zOut;.#endi
4510: 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20 64 65 6c  f..  limit = del
4520: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
4530: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
4540: 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e  if( *zDelta!='\n
4550: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f  ' ){.    /* ERRO
4560: 52 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20  R: size integer 
4570: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
4580: 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65  y "\n" */.    re
4590: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a  turn -1;.  }.  z
45a0: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
45b0: 61 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  a--;.  while( *z
45c0: 44 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74  Delta && lenDelt
45d0: 61 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  a>0 ){.    unsig
45e0: 6e 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73  ned int cnt, ofs
45f0: 74 3b 0a 20 20 20 20 63 6e 74 20 3d 20 64 65 6c  t;.    cnt = del
4600: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
4610: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
4620: 20 20 73 77 69 74 63 68 28 20 7a 44 65 6c 74 61    switch( zDelta
4630: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
4640: 65 20 27 40 27 3a 20 7b 0a 20 20 20 20 20 20 20  e '@': {.       
4650: 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65   zDelta++; lenDe
4660: 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6f  lta--;.        o
4670: 66 73 74 20 3d 20 64 65 6c 74 61 47 65 74 49 6e  fst = deltaGetIn
4680: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
4690: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  elta);.        i
46a0: 66 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26  f( lenDelta>0 &&
46b0: 20 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20   zDelta[0]!=',' 
46c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
46d0: 45 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d  ERROR: copy comm
46e0: 61 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  and not terminat
46f0: 65 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20  ed by ',' */.   
4700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
4710: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4720: 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65      zDelta++; le
4730: 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20  nDelta--;.      
4740: 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a    total += cnt;.
4750: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61          if( tota
4760: 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  l>limit ){.     
4770: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63       /* ERROR: c
4780: 6f 70 79 20 65 78 63 65 65 64 73 20 6f 75 74 70  opy exceeds outp
4790: 75 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ut file size */.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
47c0: 20 20 20 20 20 20 20 69 66 28 20 6f 66 73 74 2b         if( ofst+
47d0: 63 6e 74 20 3e 20 6c 65 6e 53 72 63 20 29 7b 0a  cnt > lenSrc ){.
47e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
47f0: 4f 52 3a 20 63 6f 70 79 20 65 78 74 65 6e 64 73  OR: copy extends
4800: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 69 6e 70   past end of inp
4810: 75 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ut */.          
4820: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
4840: 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53 72 63 5b  cpy(zOut, &zSrc[
4850: 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a 20 20 20  ofst], cnt);.   
4860: 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74       zOut += cnt
4870: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4890: 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20 20 20 20  ase ':': {.     
48a0: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
48b0: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
48c0: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
48d0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
48e0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
48f0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 69      /* ERROR:  i
4900: 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64 20 67 69  nsert command gi
4910: 76 65 73 20 61 6e 20 6f 75 74 70 75 74 20 6c 61  ves an output la
4920: 72 67 65 72 20 74 68 61 6e 20 70 72 65 64 69 63  rger than predic
4930: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
4940: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4960: 28 20 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29  ( cnt>lenDelta )
4970: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
4980: 52 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f 75  RROR: insert cou
4990: 6e 74 20 65 78 63 65 65 64 73 20 73 69 7a 65 20  nt exceeds size 
49a0: 6f 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20  of delta */.    
49b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
49c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
49d0: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
49e0: 7a 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20  zDelta, cnt);.  
49f0: 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e        zOut += cn
4a00: 74 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74  t;.        zDelt
4a10: 61 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  a += cnt;.      
4a20: 20 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e    lenDelta -= cn
4a30: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
4a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4a50: 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20  case ';': {.    
4a60: 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65      zDelta++; le
4a70: 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20  nDelta--;.      
4a80: 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 23    zOut[0] = 0;.#
4a90: 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41  ifdef FOSSIL_ENA
4aa0: 42 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f  BLE_DELTA_CKSUM_
4ab0: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
4ac0: 20 63 6e 74 21 3d 63 68 65 63 6b 73 75 6d 28 7a   cnt!=checksum(z
4ad0: 4f 72 69 67 4f 75 74 2c 20 74 6f 74 61 6c 29 20  OrigOut, total) 
4ae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
4af0: 45 52 52 4f 52 3a 20 20 62 61 64 20 63 68 65 63  ERROR:  bad chec
4b00: 6b 73 75 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  ksum */.        
4b10: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
4b20: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
4b30: 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c 21        if( total!
4b40: 3d 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  =limit ){.      
4b50: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 67 65      /* ERROR: ge
4b60: 6e 65 72 61 74 65 64 20 73 69 7a 65 20 64 6f 65  nerated size doe
4b70: 73 20 6e 6f 74 20 6d 61 74 63 68 20 70 72 65 64  s not match pred
4b80: 69 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20  icted size */.  
4b90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
4ba0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
4bb0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f 74 61       return tota
4bc0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
4bd0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4be0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e      /* ERROR: un
4bf0: 6b 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70 65 72  known delta oper
4c00: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
4c10: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4c20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
4c30: 2a 20 45 52 52 4f 52 3a 20 75 6e 74 65 72 6d 69  * ERROR: untermi
4c40: 6e 61 74 65 64 20 64 65 6c 74 61 20 2a 2f 0a 20  nated delta */. 
4c50: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
4c60: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
4c70: 6e 73 3a 20 20 64 65 6c 74 61 5f 63 72 65 61 74  ns:  delta_creat
4c80: 65 28 58 2c 59 29 0a 2a 2a 0a 2a 2a 20 52 65 74  e(X,Y).**.** Ret
4c90: 75 72 6e 20 61 20 64 65 6c 74 61 20 66 6f 72 20  urn a delta for 
4ca0: 63 61 72 72 79 69 6e 67 20 58 20 69 6e 74 6f 20  carrying X into 
4cb0: 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
4cc0: 64 20 64 65 6c 74 61 43 72 65 61 74 65 46 75 6e  d deltaCreateFun
4cd0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4ce0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4cf0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4d00: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4d10: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
4d20: 72 20 2a 61 4f 72 69 67 3b 20 69 6e 74 20 6e 4f  r *aOrig; int nO
4d30: 72 69 67 3b 20 20 2f 2a 20 6f 6c 64 20 62 6c 6f  rig;  /* old blo
4d40: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  b */.  const cha
4d50: 72 20 2a 61 4e 65 77 3b 20 20 69 6e 74 20 6e 4e  r *aNew;  int nN
4d60: 65 77 3b 20 20 20 2f 2a 20 6e 65 77 20 62 6c 6f  ew;   /* new blo
4d70: 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 4f 75  b */.  char *aOu
4d80: 74 3b 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f  t;        int nO
4d90: 75 74 3b 20 20 20 2f 2a 20 6f 75 74 70 75 74 20  ut;   /* output 
4da0: 64 65 6c 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65  delta */..  asse
4db0: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20  rt( argc==2 );. 
4dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
4dd0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
4de0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
4df0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
4e00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4e10: 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54  (argv[1])==SQLIT
4e20: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
4e30: 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74  .  nOrig = sqlit
4e40: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
4e50: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67  rgv[0]);.  aOrig
4e60: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
4e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
4e80: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  ob(argv[0]);.  n
4e90: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  New = sqlite3_va
4ea0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
4eb0: 5d 29 3b 0a 20 20 61 4e 65 77 20 3d 20 28 63 6f  ]);.  aNew = (co
4ec0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
4ed0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
4ee0: 76 5b 31 5d 29 3b 0a 20 20 61 4f 75 74 20 3d 20  v[1]);.  aOut = 
4ef0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
4f00: 28 6e 4e 65 77 2b 37 30 29 3b 0a 20 20 69 66 28  (nNew+70);.  if(
4f10: 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   aOut==0 ){.    
4f20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
4f30: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
4f40: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xt);.  }else{.  
4f50: 20 20 6e 4f 75 74 20 3d 20 64 65 6c 74 61 5f 63    nOut = delta_c
4f60: 72 65 61 74 65 28 61 4f 72 69 67 2c 20 6e 4f 72  reate(aOrig, nOr
4f70: 69 67 2c 20 61 4e 65 77 2c 20 6e 4e 65 77 2c 20  ig, aNew, nNew, 
4f80: 61 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  aOut);.    if( n
4f90: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  Out<0 ){.      s
4fa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74  qlite3_free(aOut
4fb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4fc0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4fd0: 6e 74 65 78 74 2c 20 22 63 61 6e 6e 6f 74 20 63  ntext, "cannot c
4fe0: 72 65 61 74 65 20 66 6f 73 73 69 6c 20 64 65 6c  reate fossil del
4ff0: 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ta", -1);.    }e
5000: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5010: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
5020: 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e 4f  ontext, aOut, nO
5030: 75 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ut, sqlite3_free
5040: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5050: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
5060: 6f 6e 73 3a 20 20 64 65 6c 74 61 5f 61 70 70 6c  ons:  delta_appl
5070: 79 28 58 2c 44 29 0a 2a 2a 0a 2a 2a 20 52 65 74  y(X,D).**.** Ret
5080: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  urn the result o
5090: 66 20 61 70 70 6c 79 69 6e 67 20 64 65 6c 74 61  f applying delta
50a0: 20 44 20 74 6f 20 69 6e 70 75 74 20 58 2e 0a 2a   D to input X..*
50b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
50c0: 6c 74 61 41 70 70 6c 79 46 75 6e 63 28 0a 20 20  ltaApplyFunc(.  
50d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
50e0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
50f0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
5100: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4f    const char *aO
5120: 72 69 67 3b 20 20 20 69 6e 74 20 6e 4f 72 69 67  rig;   int nOrig
5130: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
5140: 58 20 69 6e 70 75 74 20 2a 2f 0a 20 20 63 6f 6e  X input */.  con
5150: 73 74 20 63 68 61 72 20 2a 61 44 65 6c 74 61 3b  st char *aDelta;
5160: 20 20 69 6e 74 20 6e 44 65 6c 74 61 3b 20 20 20    int nDelta;   
5170: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
5180: 20 64 65 6c 74 61 20 28 44 29 20 2a 2f 0a 20 20   delta (D) */.  
5190: 63 68 61 72 20 2a 61 4f 75 74 3b 20 20 20 20 20  char *aOut;     
51a0: 20 20 20 20 20 69 6e 74 20 6e 4f 75 74 2c 20 6e       int nOut, n
51b0: 4f 75 74 32 3b 20 20 2f 2a 20 54 68 65 20 6f 75  Out2;  /* The ou
51c0: 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tput */..  asser
51d0: 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  t( argc==2 );.  
51e0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
51f0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
5200: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
5210: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
5220: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
5230: 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  argv[1])==SQLITE
5240: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
5250: 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65    nOrig = sqlite
5260: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5270: 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67 20  gv[0]);.  aOrig 
5280: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5290: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
52a0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 44  b(argv[0]);.  nD
52b0: 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  elta = sqlite3_v
52c0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
52d0: 31 5d 29 3b 0a 20 20 61 44 65 6c 74 61 20 3d 20  1]);.  aDelta = 
52e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
52f0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
5300: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
5310: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 73  Figure out the s
5320: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
5330: 74 20 2a 2f 0a 20 20 6e 4f 75 74 20 3d 20 64 65  t */.  nOut = de
5340: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
5350: 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 29 3b  aDelta, nDelta);
5360: 0a 20 20 69 66 28 20 6e 4f 75 74 3c 30 20 29 7b  .  if( nOut<0 ){
5370: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5380: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5390: 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73  t, "corrupt foss
53a0: 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a  il delta", -1);.
53b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
53c0: 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    aOut = sqlite3
53d0: 5f 6d 61 6c 6c 6f 63 36 34 28 28 73 71 6c 69 74  _malloc64((sqlit
53e0: 65 33 5f 69 6e 74 36 34 29 6e 4f 75 74 2b 31 29  e3_int64)nOut+1)
53f0: 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20  ;.  if( aOut==0 
5400: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5410: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
5420: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  m(context);.  }e
5430: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 32 20 3d  lse{.    nOut2 =
5440: 20 64 65 6c 74 61 5f 61 70 70 6c 79 28 61 4f 72   delta_apply(aOr
5450: 69 67 2c 20 6e 4f 72 69 67 2c 20 61 44 65 6c 74  ig, nOrig, aDelt
5460: 61 2c 20 6e 44 65 6c 74 61 2c 20 61 4f 75 74 29  a, nDelta, aOut)
5470: 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75 74 32 21  ;.    if( nOut2!
5480: 3d 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 73  =nOut ){.      s
5490: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74  qlite3_free(aOut
54a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
54b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
54c0: 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20  ntext, "corrupt 
54d0: 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d  fossil delta", -
54e0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
54f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5500: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
5510: 2c 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71  , aOut, nOut, sq
5520: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
5530: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
5540: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 3a 20   SQL functions: 
5550: 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69   delta_output_si
5560: 7a 65 28 44 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ze(D).**.** Retu
5570: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
5580: 68 65 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  he output that r
5590: 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 70 70 6c  esults from appl
55a0: 79 69 6e 67 20 64 65 6c 74 61 20 44 2e 0a 2a 2f  ying delta D..*/
55b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 6c  .static void del
55c0: 74 61 4f 75 74 70 75 74 53 69 7a 65 46 75 6e 63  taOutputSizeFunc
55d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
55e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
55f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5600: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5610: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
5620: 20 2a 61 44 65 6c 74 61 3b 20 20 69 6e 74 20 6e   *aDelta;  int n
5630: 44 65 6c 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  Delta;       /* 
5640: 54 68 65 20 69 6e 70 75 74 20 64 65 6c 74 61 20  The input delta 
5650: 28 44 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  (D) */.  int nOu
5660: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
5690: 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  t */.  assert( a
56a0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  rgc==1 );.  if( 
56b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
56c0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
56d0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
56e0: 6e 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  n;.  nDelta = sq
56f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5700: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 44  s(argv[0]);.  aD
5710: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
5720: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5730: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
5740: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5750: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5760: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5770: 75 74 20 3d 20 64 65 6c 74 61 5f 6f 75 74 70 75  ut = delta_outpu
5780: 74 5f 73 69 7a 65 28 61 44 65 6c 74 61 2c 20 6e  t_size(aDelta, n
5790: 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e 4f  Delta);.  if( nO
57a0: 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ut<0 ){.    sqli
57b0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
57c0: 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72 75  (context, "corru
57d0: 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 22  pt fossil delta"
57e0: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
57f0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
5800: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5810: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 4f 75 74  nt(context, nOut
5820: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  );.  }.}../*****
5830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 61 62 6c  ********.** Tabl
5880: 65 2d 76 61 6c 75 65 64 20 53 51 4c 20 66 75 6e  e-valued SQL fun
5890: 63 74 69 6f 6e 3a 20 20 20 64 65 6c 74 61 5f 70  ction:   delta_p
58a0: 61 72 73 65 28 44 45 4c 54 41 29 0a 2a 2a 0a 2a  arse(DELTA).**.*
58b0: 2a 20 53 63 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20  * Schema:.**.** 
58c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
58d0: 20 64 65 6c 74 61 5f 70 61 72 73 65 28 0a 2a 2a   delta_parse(.**
58e0: 20 20 20 20 20 20 20 6f 70 20 54 45 58 54 2c 0a         op TEXT,.
58f0: 2a 2a 20 20 20 20 20 20 20 61 31 20 49 4e 54 2c  **       a1 INT,
5900: 0a 2a 2a 20 20 20 20 20 20 20 61 32 20 41 4e 59  .**       a2 ANY
5910: 2c 0a 2a 2a 20 20 20 20 20 20 20 64 65 6c 74 61  ,.**       delta
5920: 20 48 49 44 44 45 4e 20 42 4c 4f 42 0a 2a 2a 20   HIDDEN BLOB.** 
5930: 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 47 69 76      );.**.** Giv
5940: 65 6e 20 61 6e 20 69 6e 70 75 74 20 44 45 4c 54  en an input DELT
5950: 41 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  A, this function
5960: 20 70 61 72 73 65 73 20 74 68 65 20 64 65 6c 74   parses the delt
5970: 61 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  a and returns.**
5980: 20 72 6f 77 73 20 66 6f 72 20 65 61 63 68 20 65   rows for each e
5990: 6e 74 72 79 20 69 6e 20 74 68 65 20 64 65 6c 74  ntry in the delt
59a0: 61 2e 20 20 54 68 65 20 6f 70 20 63 6f 6c 75 6d  a.  The op colum
59b0: 6e 20 68 61 73 20 6f 6e 65 20 6f 66 20 74 68 65  n has one of the
59c0: 0a 2a 2a 20 76 61 6c 75 65 73 20 53 49 5a 45 2c  .** values SIZE,
59d0: 20 43 4f 50 59 2c 20 49 4e 53 45 52 54 2c 20 43   COPY, INSERT, C
59e0: 48 45 43 4b 53 55 4d 2c 20 45 52 52 4f 52 2e 0a  HECKSUM, ERROR..
59f0: 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6e  **.** Assuming n
5a00: 6f 20 65 72 72 6f 72 73 2c 20 74 68 65 20 66 69  o errors, the fi
5a10: 72 73 74 20 72 6f 77 20 68 61 73 20 6f 70 3d 27  rst row has op='
5a20: 53 49 5a 45 27 2e 20 20 61 31 20 69 73 20 74 68  SIZE'.  a1 is th
5a30: 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  e size of.** the
5a40: 20 6f 75 74 70 75 74 20 69 6e 20 62 79 74 65 73   output in bytes
5a50: 20 61 6e 64 20 61 32 20 69 73 20 4e 55 4c 4c 2e   and a2 is NULL.
5a60: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
5a70: 20 69 6e 69 74 69 61 6c 20 53 49 5a 45 20 72 6f   initial SIZE ro
5a80: 77 2c 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  w, there are zer
5a90: 6f 20 6f 72 20 6d 6f 72 65 20 27 43 4f 50 59 27  o or more 'COPY'
5aa0: 20 61 6e 64 2f 6f 72 20 27 49 4e 53 45 52 54 27   and/or 'INSERT'
5ab0: 0a 2a 2a 20 72 6f 77 73 2e 20 20 41 20 43 4f 50  .** rows.  A COP
5ac0: 59 20 72 6f 77 20 6d 65 61 6e 73 20 63 6f 6e 74  Y row means cont
5ad0: 65 6e 74 20 69 73 20 63 6f 70 69 65 64 20 66 72  ent is copied fr
5ae0: 6f 6d 20 74 68 65 20 73 6f 75 72 63 65 20 69 6e  om the source in
5af0: 74 6f 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  to the.** output
5b00: 2e 20 20 43 6f 6c 75 6d 6e 20 61 31 20 69 73 20  .  Column a1 is 
5b10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5b20: 74 65 73 20 74 6f 20 63 6f 70 79 20 61 6e 64 20  tes to copy and 
5b30: 61 32 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  a2 is the offset
5b40: 0a 2a 2a 20 69 6e 74 6f 20 73 6f 75 72 63 65 20  .** into source 
5b50: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 65  from which to be
5b60: 67 69 6e 20 63 6f 70 79 69 6e 67 2e 20 20 41 6e  gin copying.  An
5b70: 20 49 4e 53 45 52 54 20 72 6f 77 20 6d 65 61 6e   INSERT row mean
5b80: 73 20 74 6f 0a 2a 2a 20 69 6e 73 65 72 74 20 74  s to.** insert t
5b90: 65 78 74 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ext into the out
5ba0: 70 75 74 20 73 74 72 65 61 6d 2e 20 20 43 6f 6c  put stream.  Col
5bb0: 75 6d 6e 20 61 31 20 69 73 20 74 68 65 20 6e 75  umn a1 is the nu
5bc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
5bd0: 20 74 6f 20 69 6e 73 65 72 74 20 61 6e 64 20 63   to insert and c
5be0: 6f 6c 75 6d 6e 20 69 73 20 61 20 42 4c 4f 42 20  olumn is a BLOB 
5bf0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
5c00: 65 20 74 65 78 74 20 74 6f 20 62 65 20 69 6e 73  e text to be ins
5c10: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erted..**.** The
5c20: 20 6c 61 73 74 20 72 6f 77 20 6f 66 20 61 20 77   last row of a w
5c30: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 65 6c 74 61  ell-formed delta
5c40: 20 77 69 6c 6c 20 68 61 76 65 20 61 6e 20 6f 70   will have an op
5c50: 20 76 61 6c 75 65 20 6f 66 20 27 43 48 45 43 4b   value of 'CHECK
5c60: 53 55 4d 27 2e 0a 2a 2a 20 54 68 65 20 61 31 20  SUM'..** The a1 
5c70: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 20 74  column will be t
5c80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
5c90: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 61 32 20  checksum and a2 
5ca0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a  will be NULL..**
5cb0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5cc0: 20 64 65 6c 74 61 20 69 73 20 6e 6f 74 20 77 65   delta is not we
5cd0: 6c 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 6e 20  ll-formed, then 
5ce0: 61 20 72 6f 77 20 77 69 74 68 20 61 6e 20 6f 70  a row with an op
5cf0: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 27 45 52   value.** of 'ER
5d00: 52 4f 52 27 20 69 73 20 72 65 74 75 72 6e 65 64  ROR' is returned
5d10: 2e 20 20 54 68 65 20 61 31 20 76 61 6c 75 65 20  .  The a1 value 
5d20: 6f 66 20 74 68 65 20 45 52 52 4f 52 20 72 6f 77  of the ERROR row
5d30: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 0a 2a   is the offset.*
5d40: 2a 20 69 6e 74 6f 20 74 68 65 20 64 65 6c 74 61  * into the delta
5d50: 20 77 68 65 72 65 20 74 68 65 20 65 72 72 6f 72   where the error
5d60: 20 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64   was encountered
5d70: 20 61 6e 64 20 61 32 20 69 73 20 4e 55 4c 4c 2e   and a2 is NULL.
5d80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
5d90: 63 74 20 64 65 6c 74 61 70 61 72 73 65 76 74 61  ct deltaparsevta
5da0: 62 5f 76 74 61 62 20 64 65 6c 74 61 70 61 72 73  b_vtab deltapars
5db0: 65 76 74 61 62 5f 76 74 61 62 3b 0a 74 79 70 65  evtab_vtab;.type
5dc0: 64 65 66 20 73 74 72 75 63 74 20 64 65 6c 74 61  def struct delta
5dd0: 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72  parsevtab_cursor
5de0: 20 64 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f   deltaparsevtab_
5df0: 63 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 64  cursor;.struct d
5e00: 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f 76 74  eltaparsevtab_vt
5e10: 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ab {.  sqlite3_v
5e20: 74 61 62 20 62 61 73 65 3b 20 20 2f 2a 20 42 61  tab base;  /* Ba
5e30: 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20  se class - must 
5e40: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 2f 2a  be first */.  /*
5e50: 20 4e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 69   No additional i
5e60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
5e70: 64 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 64  d */.};.struct d
5e80: 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f 63 75  eltaparsevtab_cu
5e90: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
5ea0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
5eb0: 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  e;  /* Base clas
5ec0: 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73  s - must be firs
5ed0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 65  t */.  char *aDe
5ee0: 6c 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  lta;            
5ef0: 20 20 2f 2a 20 54 68 65 20 64 65 6c 74 61 20 62    /* The delta b
5f00: 65 69 6e 67 20 70 61 72 73 65 64 20 2a 2f 0a 20  eing parsed */. 
5f10: 20 69 6e 74 20 6e 44 65 6c 74 61 3b 20 20 20 20   int nDelta;    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5f30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5f40: 6e 20 74 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20  n the delta */. 
5f50: 20 69 6e 74 20 69 43 75 72 73 6f 72 3b 20 20 20   int iCursor;   
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f70: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6c 6f  urrent cursor lo
5f80: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
5f90: 65 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  eOp;            
5fa0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5fb0: 66 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74  f current operat
5fc0: 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
5fd0: 20 69 6e 74 20 61 31 2c 20 61 32 3b 20 20 20 20   int a1, a2;    
5fe0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
5ff0: 74 6f 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61  to current opera
6000: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  tor */.  int iNe
6010: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
6020: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 75 72 73      /* Next curs
6030: 6f 72 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 0a  or value */.};..
6040: 2f 2a 20 4f 70 65 72 61 74 6f 72 20 6e 61 6d 65  /* Operator name
6050: 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s:.*/.static con
6060: 73 74 20 63 68 61 72 20 2a 61 7a 4f 70 5b 5d 20  st char *azOp[] 
6070: 3d 20 7b 0a 20 20 22 53 49 5a 45 22 2c 20 22 43  = {.  "SIZE", "C
6080: 4f 50 59 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  OPY", "INSERT", 
6090: 22 43 48 45 43 4b 53 55 4d 22 2c 20 22 45 52 52  "CHECKSUM", "ERR
60a0: 4f 52 22 2c 20 22 45 4f 46 22 0a 7d 3b 0a 23 64  OR", "EOF".};.#d
60b0: 65 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53 45  efine DELTAPARSE
60c0: 5f 4f 50 5f 53 49 5a 45 20 20 20 20 20 20 20 20  _OP_SIZE        
60d0: 20 30 0a 23 64 65 66 69 6e 65 20 44 45 4c 54 41   0.#define DELTA
60e0: 50 41 52 53 45 5f 4f 50 5f 43 4f 50 59 20 20 20  PARSE_OP_COPY   
60f0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
6100: 44 45 4c 54 41 50 41 52 53 45 5f 4f 50 5f 49 4e  DELTAPARSE_OP_IN
6110: 53 45 52 54 20 20 20 20 20 20 20 32 0a 23 64 65  SERT       2.#de
6120: 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53 45 5f  fine DELTAPARSE_
6130: 4f 50 5f 43 48 45 43 4b 53 55 4d 20 20 20 20 20  OP_CHECKSUM     
6140: 33 0a 23 64 65 66 69 6e 65 20 44 45 4c 54 41 50  3.#define DELTAP
6150: 41 52 53 45 5f 4f 50 5f 45 52 52 4f 52 20 20 20  ARSE_OP_ERROR   
6160: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 44       4.#define D
6170: 45 4c 54 41 50 41 52 53 45 5f 4f 50 5f 45 4f 46  ELTAPARSE_OP_EOF
6180: 20 20 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a            5../*.
6190: 2a 2a 20 54 68 65 20 64 65 6c 74 61 70 61 72 73  ** The deltapars
61a0: 65 76 74 61 62 43 6f 6e 6e 65 63 74 28 29 20 6d  evtabConnect() m
61b0: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
61c0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
61d0: 0a 2a 2a 20 64 65 6c 74 61 70 61 72 73 65 20 76  .** deltaparse v
61e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
61f0: 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 74 68 69  .** Think of thi
6200: 73 20 72 6f 75 74 69 6e 65 20 61 73 20 74 68 65  s routine as the
6210: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72   constructor for
6220: 20 64 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f   deltaparsevtab_
6230: 76 74 61 62 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  vtab objects..**
6240: 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
6250: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 64 6f  tine needs to do
6260: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31   is:.**.**    (1
6270: 29 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 64  ) Allocate the d
6280: 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f 76 74  eltaparsevtab_vt
6290: 61 62 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e  ab object and in
62a0: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65  itialize all fie
62b0: 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  lds..**.**    (2
62c0: 29 20 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76  ) Tell SQLite (v
62d0: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64  ia the sqlite3_d
62e0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e  eclare_vtab() in
62f0: 74 65 72 66 61 63 65 29 20 77 68 61 74 20 74 68  terface) what th
6300: 65 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75  e.**        resu
6310: 6c 74 20 73 65 74 20 6f 66 20 71 75 65 72 69 65  lt set of querie
6320: 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 69  s against the vi
6330: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  rtual table will
6340: 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a 2f 0a 73   look like..*/.s
6350: 74 61 74 69 63 20 69 6e 74 20 64 65 6c 74 61 70  tatic int deltap
6360: 61 72 73 65 76 74 61 62 43 6f 6e 6e 65 63 74 28  arsevtabConnect(
6370: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
6380: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
6390: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
63a0: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
63b0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
63c0: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
63d0: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 64  r **pzErr.){.  d
63e0: 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f 76 74  eltaparsevtab_vt
63f0: 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  ab *pNew;.  int 
6400: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6410: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6420: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
6430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28  "CREATE TABLE x(
6440: 6f 70 2c 61 31 2c 61 32 2c 64 65 6c 74 61 20 48  op,a1,a2,delta H
6450: 49 44 44 45 4e 29 22 0a 20 20 20 20 20 20 20 29  IDDEN)".       )
6460: 3b 0a 20 20 2f 2a 20 46 6f 72 20 63 6f 6e 76 65  ;.  /* For conve
6470: 6e 69 65 6e 63 65 2c 20 64 65 66 69 6e 65 20 73  nience, define s
6480: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 66 6f  ymbolic names fo
6490: 72 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 65  r the index to e
64a0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 23  ach column. */.#
64b0: 64 65 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53  define DELTAPARS
64c0: 45 56 54 41 42 5f 4f 50 20 20 20 20 20 30 0a 23  EVTAB_OP     0.#
64d0: 64 65 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53  define DELTAPARS
64e0: 45 56 54 41 42 5f 41 31 20 20 20 20 20 31 0a 23  EVTAB_A1     1.#
64f0: 64 65 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53  define DELTAPARS
6500: 45 56 54 41 42 5f 41 32 20 20 20 20 20 32 0a 23  EVTAB_A2     2.#
6510: 64 65 66 69 6e 65 20 44 45 4c 54 41 50 41 52 53  define DELTAPARS
6520: 45 56 54 41 42 5f 44 45 4c 54 41 20 20 33 0a 20  EVTAB_DELTA  3. 
6530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6540: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  OK ){.    pNew =
6550: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
6560: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
6570: 20 29 3b 0a 20 20 20 20 2a 70 70 56 74 61 62 20   );.    *ppVtab 
6580: 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a  = (sqlite3_vtab*
6590: 29 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70  )pNew;.    if( p
65a0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
65b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
65c0: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
65d0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
65e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
65f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
6600: 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 64   method is the d
6610: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 64 65  estructor for de
6620: 6c 74 61 70 61 72 73 65 76 74 61 62 5f 76 74 61  ltaparsevtab_vta
6630: 62 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  b objects..*/.st
6640: 61 74 69 63 20 69 6e 74 20 64 65 6c 74 61 70 61  atic int deltapa
6650: 72 73 65 76 74 61 62 44 69 73 63 6f 6e 6e 65 63  rsevtabDisconnec
6660: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
6670: 70 56 74 61 62 29 7b 0a 20 20 64 65 6c 74 61 70  pVtab){.  deltap
6680: 61 72 73 65 76 74 61 62 5f 76 74 61 62 20 2a 70  arsevtab_vtab *p
6690: 20 3d 20 28 64 65 6c 74 61 70 61 72 73 65 76 74   = (deltaparsevt
66a0: 61 62 5f 76 74 61 62 2a 29 70 56 74 61 62 3b 0a  ab_vtab*)pVtab;.
66b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
66c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
66d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
66e0: 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  Constructor for 
66f0: 61 20 6e 65 77 20 64 65 6c 74 61 70 61 72 73 65  a new deltaparse
6700: 76 74 61 62 5f 63 75 72 73 6f 72 20 6f 62 6a 65  vtab_cursor obje
6710: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
6720: 74 20 64 65 6c 74 61 70 61 72 73 65 76 74 61 62  t deltaparsevtab
6730: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
6740: 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
6750: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
6760: 72 73 6f 72 29 7b 0a 20 20 64 65 6c 74 61 70 61  rsor){.  deltapa
6770: 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  rsevtab_cursor *
6780: 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20 73  pCur;.  pCur = s
6790: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
67a0: 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a  izeof(*pCur) );.
67b0: 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
67c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
67d0: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
67e0: 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ur, 0, sizeof(*p
67f0: 43 75 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73  Cur));.  *ppCurs
6800: 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65  or = &pCur->base
6810: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6820: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6830: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20  estructor for a 
6840: 64 65 6c 74 61 70 61 72 73 65 76 74 61 62 5f 63  deltaparsevtab_c
6850: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
6860: 20 69 6e 74 20 64 65 6c 74 61 70 61 72 73 65 76   int deltaparsev
6870: 74 61 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  tabClose(sqlite3
6880: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
6890: 72 29 7b 0a 20 20 64 65 6c 74 61 70 61 72 73 65  r){.  deltaparse
68a0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
68b0: 72 20 3d 20 28 64 65 6c 74 61 70 61 72 73 65 76  r = (deltaparsev
68c0: 74 61 62 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  tab_cursor*)cur;
68d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
68e0: 70 43 75 72 2d 3e 61 44 65 6c 74 61 29 3b 0a 20  pCur->aDelta);. 
68f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6900: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
6910: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
6920: 2a 2a 20 41 64 76 61 6e 63 65 20 61 20 64 65 6c  ** Advance a del
6930: 74 61 70 61 72 73 65 76 74 61 62 5f 63 75 72 73  taparsevtab_curs
6940: 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72  or to its next r
6950: 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f  ow of output..*/
6960: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 74  .static int delt
6970: 61 70 61 72 73 65 76 74 61 62 4e 65 78 74 28 73  aparsevtabNext(s
6980: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
6990: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 64 65 6c 74  or *cur){.  delt
69a0: 61 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f  aparsevtab_curso
69b0: 72 20 2a 70 43 75 72 20 3d 20 28 64 65 6c 74 61  r *pCur = (delta
69c0: 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72  parsevtab_cursor
69d0: 2a 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *)cur;.  const c
69e0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 20  har *z;.  int i 
69f0: 3d 20 30 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 43  = 0;..  pCur->iC
6a00: 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 69 4e  ursor = pCur->iN
6a10: 65 78 74 3b 0a 20 20 7a 20 3d 20 70 43 75 72 2d  ext;.  z = pCur-
6a20: 3e 61 44 65 6c 74 61 20 2b 20 70 43 75 72 2d 3e  >aDelta + pCur->
6a30: 69 43 75 72 73 6f 72 3b 0a 20 20 70 43 75 72 2d  iCursor;.  pCur-
6a40: 3e 61 31 20 3d 20 64 65 6c 74 61 47 65 74 49 6e  >a1 = deltaGetIn
6a50: 74 28 26 7a 2c 20 26 69 29 3b 0a 20 20 73 77 69  t(&z, &i);.  swi
6a60: 74 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  tch( z[0] ){.   
6a70: 20 63 61 73 65 20 27 40 27 3a 20 7b 0a 20 20 20   case '@': {.   
6a80: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 70 43     z++;.      pC
6a90: 75 72 2d 3e 61 32 20 3d 20 64 65 6c 74 61 47 65  ur->a2 = deltaGe
6aa0: 74 49 6e 74 28 26 7a 2c 20 26 69 29 3b 0a 20 20  tInt(&z, &i);.  
6ab0: 20 20 20 20 70 43 75 72 2d 3e 65 4f 70 20 3d 20      pCur->eOp = 
6ac0: 44 45 4c 54 41 50 41 52 53 45 5f 4f 50 5f 43 4f  DELTAPARSE_OP_CO
6ad0: 50 59 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  PY;.      pCur->
6ae0: 69 4e 65 78 74 20 3d 20 28 69 6e 74 29 28 26 7a  iNext = (int)(&z
6af0: 5b 31 5d 20 2d 20 70 43 75 72 2d 3e 61 44 65 6c  [1] - pCur->aDel
6b00: 74 61 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ta);.      break
6b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6b20: 20 27 3a 27 3a 20 7b 0a 20 20 20 20 20 20 7a 2b   ':': {.      z+
6b30: 2b 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  +;.      pCur->a
6b40: 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  2 = (unsigned in
6b50: 74 29 28 7a 20 2d 20 70 43 75 72 2d 3e 61 44 65  t)(z - pCur->aDe
6b60: 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 43 75 72  lta);.      pCur
6b70: 2d 3e 65 4f 70 20 3d 20 44 45 4c 54 41 50 41 52  ->eOp = DELTAPAR
6b80: 53 45 5f 4f 50 5f 49 4e 53 45 52 54 3b 0a 20 20  SE_OP_INSERT;.  
6b90: 20 20 20 20 70 43 75 72 2d 3e 69 4e 65 78 74 20      pCur->iNext 
6ba0: 3d 20 28 69 6e 74 29 28 26 7a 5b 70 43 75 72 2d  = (int)(&z[pCur-
6bb0: 3e 61 31 5d 20 2d 20 70 43 75 72 2d 3e 61 44 65  >a1] - pCur->aDe
6bc0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lta);.      brea
6bd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6be0: 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 70  e ';': {.      p
6bf0: 43 75 72 2d 3e 65 4f 70 20 3d 20 44 45 4c 54 41  Cur->eOp = DELTA
6c00: 50 41 52 53 45 5f 4f 50 5f 43 48 45 43 4b 53 55  PARSE_OP_CHECKSU
6c10: 4d 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  M;.      pCur->i
6c20: 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 6e 44 65  Next = pCur->nDe
6c30: 6c 74 61 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  lta;.      break
6c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6c50: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
6c60: 20 70 43 75 72 2d 3e 69 4e 65 78 74 3d 3d 70 43   pCur->iNext==pC
6c70: 75 72 2d 3e 6e 44 65 6c 74 61 20 29 7b 0a 20 20  ur->nDelta ){.  
6c80: 20 20 20 20 20 20 70 43 75 72 2d 3e 65 4f 70 20        pCur->eOp 
6c90: 3d 20 44 45 4c 54 41 50 41 52 53 45 5f 4f 50 5f  = DELTAPARSE_OP_
6ca0: 45 4f 46 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EOF;.      }else
6cb0: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
6cc0: 65 4f 70 20 3d 20 44 45 4c 54 41 50 41 52 53 45  eOp = DELTAPARSE
6cd0: 5f 4f 50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  _OP_ERROR;.     
6ce0: 20 20 20 70 43 75 72 2d 3e 69 4e 65 78 74 20 3d     pCur->iNext =
6cf0: 20 70 43 75 72 2d 3e 6e 44 65 6c 74 61 3b 0a 20   pCur->nDelta;. 
6d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6d10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
6d20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6d40: 6e 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  n values of colu
6d50: 6d 6e 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  mns for the row 
6d60: 61 74 20 77 68 69 63 68 20 74 68 65 20 64 65 6c  at which the del
6d70: 74 61 70 61 72 73 65 76 74 61 62 5f 63 75 72 73  taparsevtab_curs
6d80: 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
6d90: 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a  ly pointing..*/.
6da0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 74 61  static int delta
6db0: 70 61 72 73 65 76 74 61 62 43 6f 6c 75 6d 6e 28  parsevtabColumn(
6dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
6dd0: 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f  cursor *cur,   /
6de0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a  * The cursor */.
6df0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6e00: 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a  t *ctx,       /*
6e10: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
6e20: 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  to sqlite3_resul
6e30: 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74  t_...() */.  int
6e40: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
6e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
6e60: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75  h column to retu
6e70: 72 6e 20 2a 2f 0a 29 7b 0a 20 20 64 65 6c 74 61  rn */.){.  delta
6e80: 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72  parsevtab_cursor
6e90: 20 2a 70 43 75 72 20 3d 20 28 64 65 6c 74 61 70   *pCur = (deltap
6ea0: 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72 2a  arsevtab_cursor*
6eb0: 29 63 75 72 3b 0a 20 20 73 77 69 74 63 68 28 20  )cur;.  switch( 
6ec0: 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 44 45  i ){.    case DE
6ed0: 4c 54 41 50 41 52 53 45 56 54 41 42 5f 4f 50 3a  LTAPARSEVTAB_OP:
6ee0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6ef0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
6f00: 2c 20 61 7a 4f 70 5b 70 43 75 72 2d 3e 65 4f 70  , azOp[pCur->eOp
6f10: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
6f20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
6f30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6f40: 73 65 20 44 45 4c 54 41 50 41 52 53 45 56 54 41  se DELTAPARSEVTA
6f50: 42 5f 41 31 3a 20 7b 0a 20 20 20 20 20 20 73 71  B_A1: {.      sq
6f60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6f70: 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 31 29 3b  (ctx, pCur->a1);
6f80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6f90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 44 45 4c    }.    case DEL
6fa0: 54 41 50 41 52 53 45 56 54 41 42 5f 41 32 3a 20  TAPARSEVTAB_A2: 
6fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
6fc0: 2d 3e 65 4f 70 3d 3d 44 45 4c 54 41 50 41 52 53  ->eOp==DELTAPARS
6fd0: 45 5f 4f 50 5f 43 4f 50 59 20 29 7b 0a 20 20 20  E_OP_COPY ){.   
6fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6ff0: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
7000: 72 2d 3e 61 32 29 3b 0a 20 20 20 20 20 20 7d 65  r->a2);.      }e
7010: 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 65 4f  lse if( pCur->eO
7020: 70 3d 3d 44 45 4c 54 41 50 41 52 53 45 5f 4f 50  p==DELTAPARSE_OP
7030: 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20  _INSERT ){.     
7040: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7050: 74 5f 62 6c 6f 62 28 63 74 78 2c 20 70 43 75 72  t_blob(ctx, pCur
7060: 2d 3e 61 44 65 6c 74 61 2b 70 43 75 72 2d 3e 61  ->aDelta+pCur->a
7070: 32 2c 20 70 43 75 72 2d 3e 61 31 2c 0a 20 20 20  2, pCur->a1,.   
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
70a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
70b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
70c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
70d0: 44 45 4c 54 41 50 41 52 53 45 56 54 41 42 5f 44  DELTAPARSEVTAB_D
70e0: 45 4c 54 41 3a 20 7b 0a 20 20 20 20 20 20 73 71  ELTA: {.      sq
70f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
7100: 62 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 44 65  b(ctx, pCur->aDe
7110: 6c 74 61 2c 20 70 43 75 72 2d 3e 6e 44 65 6c 74  lta, pCur->nDelt
7120: 61 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  a, SQLITE_TRANSI
7130: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
7140: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
7150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7170: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
7180: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
7190: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
71a0: 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  ntation, the.** 
71b0: 72 6f 77 69 64 20 69 73 20 74 68 65 20 73 61 6d  rowid is the sam
71c0: 65 20 61 73 20 74 68 65 20 6f 75 74 70 75 74 20  e as the output 
71d0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
71e0: 20 69 6e 74 20 64 65 6c 74 61 70 61 72 73 65 76   int deltaparsev
71f0: 74 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33  tabRowid(sqlite3
7200: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
7210: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
7220: 2a 70 52 6f 77 69 64 29 7b 0a 20 20 64 65 6c 74  *pRowid){.  delt
7230: 61 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f  aparsevtab_curso
7240: 72 20 2a 70 43 75 72 20 3d 20 28 64 65 6c 74 61  r *pCur = (delta
7250: 70 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72  parsevtab_cursor
7260: 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64  *)cur;.  *pRowid
7270: 20 3d 20 70 43 75 72 2d 3e 69 43 75 72 73 6f 72   = pCur->iCursor
7280: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7290: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
72a0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
72b0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 62 65 65  e cursor has bee
72c0: 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66 20 74  n moved off of t
72d0: 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77 20 6f  he last.** row o
72e0: 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61  f output..*/.sta
72f0: 74 69 63 20 69 6e 74 20 64 65 6c 74 61 70 61 72  tic int deltapar
7300: 73 65 76 74 61 62 45 6f 66 28 73 71 6c 69 74 65  sevtabEof(sqlite
7310: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
7320: 75 72 29 7b 0a 20 20 64 65 6c 74 61 70 61 72 73  ur){.  deltapars
7330: 65 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  evtab_cursor *pC
7340: 75 72 20 3d 20 28 64 65 6c 74 61 70 61 72 73 65  ur = (deltaparse
7350: 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 63 75 72  vtab_cursor*)cur
7360: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
7370: 3e 65 4f 70 3d 3d 44 45 4c 54 41 50 41 52 53 45  >eOp==DELTAPARSE
7380: 5f 4f 50 5f 45 4f 46 3b 0a 7d 0a 0a 2f 2a 0a 2a  _OP_EOF;.}../*.*
7390: 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  * This method is
73a0: 20 63 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69   called to "rewi
73b0: 6e 64 22 20 74 68 65 20 64 65 6c 74 61 70 61 72  nd" the deltapar
73c0: 73 65 76 74 61 62 5f 63 75 72 73 6f 72 20 6f 62  sevtab_cursor ob
73d0: 6a 65 63 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ject back.** to 
73e0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66  the first row of
73f0: 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 6d   output.  This m
7400: 65 74 68 6f 64 20 69 73 20 61 6c 77 61 79 73 20  ethod is always 
7410: 63 61 6c 6c 65 64 20 61 74 20 6c 65 61 73 74 0a  called at least.
7420: 2a 2a 20 6f 6e 63 65 20 70 72 69 6f 72 20 74 6f  ** once prior to
7430: 20 61 6e 79 20 63 61 6c 6c 20 74 6f 20 64 65 6c   any call to del
7440: 74 61 70 61 72 73 65 76 74 61 62 43 6f 6c 75 6d  taparsevtabColum
7450: 6e 28 29 20 6f 72 20 64 65 6c 74 61 70 61 72 73  n() or deltapars
7460: 65 76 74 61 62 52 6f 77 69 64 28 29 20 6f 72 20  evtabRowid() or 
7470: 0a 2a 2a 20 64 65 6c 74 61 70 61 72 73 65 76 74  .** deltaparsevt
7480: 61 62 45 6f 66 28 29 2e 0a 2a 2f 0a 73 74 61 74  abEof()..*/.stat
7490: 69 63 20 69 6e 74 20 64 65 6c 74 61 70 61 72 73  ic int deltapars
74a0: 65 76 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73  evtabFilter(.  s
74b0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
74c0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
74d0: 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
74e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
74f0: 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
7500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7510: 61 72 67 76 0a 29 7b 0a 20 20 64 65 6c 74 61 70  argv.){.  deltap
7520: 61 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72 20  arsevtab_cursor 
7530: 2a 70 43 75 72 20 3d 20 28 64 65 6c 74 61 70 61  *pCur = (deltapa
7540: 72 73 65 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  rsevtab_cursor *
7550: 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
7560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 3b 0a 20  const char *a;. 
7570: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 70 43   int i = 0;.  pC
7580: 75 72 2d 3e 65 4f 70 20 3d 20 44 45 4c 54 41 50  ur->eOp = DELTAP
7590: 41 52 53 45 5f 4f 50 5f 45 52 52 4f 52 3b 0a 20  ARSE_OP_ERROR;. 
75a0: 20 69 66 28 20 69 64 78 4e 75 6d 21 3d 31 20 29   if( idxNum!=1 )
75b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
75c0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
75d0: 75 72 2d 3e 6e 44 65 6c 74 61 20 3d 20 73 71 6c  ur->nDelta = sql
75e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
75f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 20 3d  (argv[0]);.  a =
7600: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
7610: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
7620: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
7630: 20 70 43 75 72 2d 3e 6e 44 65 6c 74 61 3d 3d 30   pCur->nDelta==0
7640: 20 7c 7c 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20   || a==0 ){.    
7650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7660: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 44  ;.  }.  pCur->aD
7670: 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  elta = sqlite3_m
7680: 61 6c 6c 6f 63 36 34 28 20 70 43 75 72 2d 3e 6e  alloc64( pCur->n
7690: 44 65 6c 74 61 2b 31 20 29 3b 0a 20 20 69 66 28  Delta+1 );.  if(
76a0: 20 70 43 75 72 2d 3e 61 44 65 6c 74 61 3d 3d 30   pCur->aDelta==0
76b0: 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 44   ){.    pCur->nD
76c0: 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 65  elta = 0;.    re
76d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
76e0: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
76f0: 70 43 75 72 2d 3e 61 44 65 6c 74 61 2c 20 61 2c  pCur->aDelta, a,
7700: 20 70 43 75 72 2d 3e 6e 44 65 6c 74 61 29 3b 0a   pCur->nDelta);.
7710: 20 20 70 43 75 72 2d 3e 61 44 65 6c 74 61 5b 70    pCur->aDelta[p
7720: 43 75 72 2d 3e 6e 44 65 6c 74 61 5d 20 3d 20 30  Cur->nDelta] = 0
7730: 3b 0a 20 20 61 20 3d 20 70 43 75 72 2d 3e 61 44  ;.  a = pCur->aD
7740: 65 6c 74 61 3b 0a 20 20 70 43 75 72 2d 3e 65 4f  elta;.  pCur->eO
7750: 70 20 3d 20 44 45 4c 54 41 50 41 52 53 45 5f 4f  p = DELTAPARSE_O
7760: 50 5f 53 49 5a 45 3b 0a 20 20 70 43 75 72 2d 3e  P_SIZE;.  pCur->
7770: 61 31 20 3d 20 64 65 6c 74 61 47 65 74 49 6e 74  a1 = deltaGetInt
7780: 28 26 61 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  (&a, &i);.  if( 
7790: 61 5b 30 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  a[0]!='\n' ){.  
77a0: 20 20 70 43 75 72 2d 3e 65 4f 70 20 3d 20 44 45    pCur->eOp = DE
77b0: 4c 54 41 50 41 52 53 45 5f 4f 50 5f 45 52 52 4f  LTAPARSE_OP_ERRO
77c0: 52 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 31 20  R;.    pCur->a1 
77d0: 3d 20 70 43 75 72 2d 3e 61 32 20 3d 20 30 3b 0a  = pCur->a2 = 0;.
77e0: 20 20 20 20 70 43 75 72 2d 3e 69 4e 65 78 74 20      pCur->iNext 
77f0: 3d 20 70 43 75 72 2d 3e 6e 44 65 6c 74 61 3b 0a  = pCur->nDelta;.
7800: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7810: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 2b 2b 3b  E_OK;.  }.  a++;
7820: 0a 20 20 70 43 75 72 2d 3e 69 4e 65 78 74 20 3d  .  pCur->iNext =
7830: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28   (unsigned int)(
7840: 61 20 2d 20 70 43 75 72 2d 3e 61 44 65 6c 74 61  a - pCur->aDelta
7850: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7860: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7870: 53 51 4c 69 74 65 20 77 69 6c 6c 20 69 6e 76 6f  SQLite will invo
7880: 6b 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  ke this method o
7890: 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69 6d 65 73  ne or more times
78a0: 20 77 68 69 6c 65 20 70 6c 61 6e 6e 69 6e 67 20   while planning 
78b0: 61 20 71 75 65 72 79 0a 2a 2a 20 74 68 61 74 20  a query.** that 
78c0: 75 73 65 73 20 74 68 65 20 76 69 72 74 75 61 6c  uses the virtual
78d0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
78e0: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63  utine needs to c
78f0: 72 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79  reate.** a query
7900: 20 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69   plan for each i
7910: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f  nvocation and co
7920: 6d 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74  mpute an estimat
7930: 65 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74  ed cost for that
7940: 0a 2a 2a 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 61  .** plan..*/.sta
7950: 74 69 63 20 69 6e 74 20 64 65 6c 74 61 70 61 72  tic int deltapar
7960: 73 65 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  sevtabBestIndex(
7970: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
7980: 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *tab,.  sqlite3_
7990: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
79a0: 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Info.){.  int i;
79b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
79c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
79d0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
79e0: 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  f( pIdxInfo->aCo
79f0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
7a00: 75 6d 6e 20 21 3d 20 44 45 4c 54 41 50 41 52 53  umn != DELTAPARS
7a10: 45 56 54 41 42 5f 44 45 4c 54 41 20 29 20 63 6f  EVTAB_DELTA ) co
7a20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7a30: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
7a40: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 3d  raint[i].usable=
7a50: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7a60: 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
7a70: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
7a80: 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op!=SQLITE_INDEX
7a90: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
7aa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
7ab0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7ac0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
7ad0: 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  vIndex = 1;.    
7ae0: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
7af0: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
7b00: 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  it = 1;.    pIdx
7b10: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
7b20: 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  ost = (double)1;
7b30: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
7b40: 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 31  stimatedRows = 1
7b50: 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
7b60: 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20  >idxNum = 1;.   
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  K;.  }.  pIdxInf
7b90: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
7ba0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
7bb0: 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
7bc0: 6c 65 29 30 78 37 66 66 66 66 66 66 66 3b 0a 20  le)0x7fffffff;. 
7bd0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
7be0: 61 74 65 64 52 6f 77 73 20 3d 20 30 78 37 66 66  atedRows = 0x7ff
7bf0: 66 66 66 66 66 3b 0a 20 20 72 65 74 75 72 6e 20  fffff;.  return 
7c00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
7c10: 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T;.}../*.** This
7c20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
7c30: 74 75 72 65 20 64 65 66 69 6e 65 73 20 61 6c 6c  ture defines all
7c40: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 66 6f 72   the methods for
7c50: 20 74 68 65 20 0a 2a 2a 20 76 69 72 74 75 61 6c   the .** virtual
7c60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
7c70: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
7c80: 20 64 65 6c 74 61 70 61 72 73 65 76 74 61 62 4d   deltaparsevtabM
7c90: 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 2f 2a 20 69  odule = {.  /* i
7ca0: 56 65 72 73 69 6f 6e 20 20 20 20 2a 2f 20 30 2c  Version    */ 0,
7cb0: 0a 20 20 2f 2a 20 78 43 72 65 61 74 65 20 20 20  .  /* xCreate   
7cc0: 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 43 6f    */ 0,.  /* xCo
7cd0: 6e 6e 65 63 74 20 20 20 20 2a 2f 20 64 65 6c 74  nnect    */ delt
7ce0: 61 70 61 72 73 65 76 74 61 62 43 6f 6e 6e 65 63  aparsevtabConnec
7cf0: 74 2c 0a 20 20 2f 2a 20 78 42 65 73 74 49 6e 64  t,.  /* xBestInd
7d00: 65 78 20 20 2a 2f 20 64 65 6c 74 61 70 61 72 73  ex  */ deltapars
7d10: 65 76 74 61 62 42 65 73 74 49 6e 64 65 78 2c 0a  evtabBestIndex,.
7d20: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
7d30: 20 2a 2f 20 64 65 6c 74 61 70 61 72 73 65 76 74   */ deltaparsevt
7d40: 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 0a 20 20  abDisconnect,.  
7d50: 2f 2a 20 78 44 65 73 74 72 6f 79 20 20 20 20 2a  /* xDestroy    *
7d60: 2f 20 30 2c 0a 20 20 2f 2a 20 78 4f 70 65 6e 20  / 0,.  /* xOpen 
7d70: 20 20 20 20 20 20 2a 2f 20 64 65 6c 74 61 70 61        */ deltapa
7d80: 72 73 65 76 74 61 62 4f 70 65 6e 2c 0a 20 20 2f  rsevtabOpen,.  /
7d90: 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20 2a 2f  * xClose      */
7da0: 20 64 65 6c 74 61 70 61 72 73 65 76 74 61 62 43   deltaparsevtabC
7db0: 6c 6f 73 65 2c 0a 20 20 2f 2a 20 78 46 69 6c 74  lose,.  /* xFilt
7dc0: 65 72 20 20 20 20 20 2a 2f 20 64 65 6c 74 61 70  er     */ deltap
7dd0: 61 72 73 65 76 74 61 62 46 69 6c 74 65 72 2c 0a  arsevtabFilter,.
7de0: 20 20 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20    /* xNext      
7df0: 20 2a 2f 20 64 65 6c 74 61 70 61 72 73 65 76 74   */ deltaparsevt
7e00: 61 62 4e 65 78 74 2c 0a 20 20 2f 2a 20 78 45 6f  abNext,.  /* xEo
7e10: 66 20 20 20 20 20 20 20 20 2a 2f 20 64 65 6c 74  f        */ delt
7e20: 61 70 61 72 73 65 76 74 61 62 45 6f 66 2c 0a 20  aparsevtabEof,. 
7e30: 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20   /* xColumn     
7e40: 2a 2f 20 64 65 6c 74 61 70 61 72 73 65 76 74 61  */ deltaparsevta
7e50: 62 43 6f 6c 75 6d 6e 2c 0a 20 20 2f 2a 20 78 52  bColumn,.  /* xR
7e60: 6f 77 69 64 20 20 20 20 20 20 2a 2f 20 64 65 6c  owid      */ del
7e70: 74 61 70 61 72 73 65 76 74 61 62 52 6f 77 69 64  taparsevtabRowid
7e80: 2c 0a 20 20 2f 2a 20 78 55 70 64 61 74 65 20 20  ,.  /* xUpdate  
7e90: 20 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 42     */ 0,.  /* xB
7ea0: 65 67 69 6e 20 20 20 20 20 20 2a 2f 20 30 2c 0a  egin      */ 0,.
7eb0: 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20    /* xSync      
7ec0: 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 43 6f 6d   */ 0,.  /* xCom
7ed0: 6d 69 74 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  mit     */ 0,.  
7ee0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 2a  /* xRollback   *
7ef0: 2f 20 30 2c 0a 20 20 2f 2a 20 78 46 69 6e 64 4d  / 0,.  /* xFindM
7f00: 65 74 68 6f 64 20 2a 2f 20 30 2c 0a 20 20 2f 2a  ethod */ 0,.  /*
7f10: 20 78 52 65 6e 61 6d 65 20 20 20 20 20 2a 2f 20   xRename     */ 
7f20: 30 2c 0a 20 20 2f 2a 20 78 53 61 76 65 70 6f 69  0,.  /* xSavepoi
7f30: 6e 74 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78  nt  */ 0,.  /* x
7f40: 52 65 6c 65 61 73 65 20 20 20 20 2a 2f 20 30 2c  Release    */ 0,
7f50: 0a 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54  .  /* xRollbackT
7f60: 6f 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 53 68  o */ 0,.  /* xSh
7f70: 61 64 6f 77 4e 61 6d 65 20 2a 2f 20 30 0a 7d 3b  adowName */ 0.};
7f80: 0a 0a 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  ....#ifdef _WIN3
7f90: 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  2.__declspec(dll
7fa0: 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69  export).#endif.i
7fb0: 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 73 73 69  nt sqlite3_fossi
7fc0: 6c 64 65 6c 74 61 5f 69 6e 69 74 28 0a 20 20 73  ldelta_init(.  s
7fd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
7fe0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
7ff0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
8000: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
8010: 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
8020: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
8030: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
8040: 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28  INIT2(pApi);.  (
8050: 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20  void)pzErrMsg;  
8060: 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
8070: 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ter */.  rc = sq
8080: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8090: 63 74 69 6f 6e 28 64 62 2c 20 22 64 65 6c 74 61  ction(db, "delta
80a0: 5f 63 72 65 61 74 65 22 2c 20 32 2c 20 53 51 4c  _create", 2, SQL
80b0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 6c 74              delt
80e0: 61 43 72 65 61 74 65 46 75 6e 63 2c 20 30 2c 20  aCreateFunc, 0, 
80f0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
8100: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8110: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8120: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8130: 22 64 65 6c 74 61 5f 61 70 70 6c 79 22 2c 20 32  "delta_apply", 2
8140: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 20 20 20 64 65 6c 74 61 41 70 70 6c 79 46 75 6e     deltaApplyFun
8180: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
8190: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
81a0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
81b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
81c0: 63 74 69 6f 6e 28 64 62 2c 20 22 64 65 6c 74 61  ction(db, "delta
81d0: 5f 6f 75 74 70 75 74 5f 73 69 7a 65 22 2c 20 31  _output_size", 1
81e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
81f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 20 20 20 64 65 6c 74 61 4f 75 74 70 75 74 53 69     deltaOutputSi
8220: 7a 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  zeFunc, 0, 0);. 
8230: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
8240: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
8250: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8260: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 64 65  e_module(db, "de
8270: 6c 74 61 5f 70 61 72 73 65 22 2c 20 26 64 65 6c  lta_parse", &del
8280: 74 61 70 61 72 73 65 76 74 61 62 4d 6f 64 75 6c  taparsevtabModul
8290: 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e, 0);.  }.  ret
82a0: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.