/ Hex Artifact Content
Login

Artifact 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 31 31 2d 30 31  /*.** 2018-11-01
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69 6d  tains code to im
0190: 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 63 68 61  plement the "cha
01a0: 6e 67 65 73 65 74 66 75 7a 7a 22 20 63 6f 6d 6d  ngesetfuzz" comm
01b0: 61 6e 64 20 0a 2a 2a 20 6c 69 6e 65 20 75 74 69  and .** line uti
01c0: 6c 69 74 79 20 66 6f 72 20 66 75 7a 7a 69 6e 67  lity for fuzzing
01d0: 20 63 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 73   changeset blobs
01e0: 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74   without corrupt
01f0: 69 6e 67 20 74 68 65 6d 2e 0a 2a 2f 0a 0a 0a 2f  ing them..*/.../
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 53 41 47  ********.** USAG
0250: 45 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72  E:.**.** This pr
0260: 6f 67 72 61 6d 20 6d 61 79 20 62 65 20 69 6e 76  ogram may be inv
0270: 6f 6b 65 64 20 69 6e 20 74 77 6f 20 77 61 79 73  oked in two ways
0280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 68 61 6e 67 65  :.**.**   change
0290: 73 65 74 66 75 7a 7a 20 49 4e 50 55 54 0a 2a 2a  setfuzz INPUT.**
02a0: 20 20 20 63 68 61 6e 67 65 73 65 74 66 75 7a 7a     changesetfuzz
02b0: 20 49 4e 50 55 54 20 53 45 45 44 20 4e 0a 2a 2a   INPUT SEED N.**
02c0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 49 4e 50  .** Argument INP
02d0: 55 54 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  UT must be the n
02e0: 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 63 6f  ame of a file co
02f0: 6e 74 61 69 6e 69 6e 67 20 61 20 62 69 6e 61 72  ntaining a binar
0300: 79 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 20  y changeset..** 
0310: 49 6e 20 74 68 65 20 66 69 72 73 74 20 66 6f 72  In the first for
0320: 6d 20 61 62 6f 76 65 2c 20 74 68 69 73 20 70 72  m above, this pr
0330: 6f 67 72 61 6d 20 6f 75 74 70 75 74 73 20 61 20  ogram outputs a 
0340: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76  human-readable v
0350: 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  ersion.** of the
0360: 20 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74 2e   same changeset.
0370: 20 54 68 69 73 20 69 73 20 63 68 69 65 66 6c 79   This is chiefly
0380: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
0390: 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  **.** As well as
03a0: 20 63 68 61 6e 67 65 73 65 74 73 2c 20 74 68 69   changesets, thi
03b0: 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 61 6c  s program can al
03c0: 73 6f 20 64 75 6d 70 20 61 6e 64 20 66 75 7a 7a  so dump and fuzz
03d0: 20 70 61 74 63 68 73 65 74 73 2e 0a 2a 2a 20 54   patchsets..** T
03e0: 68 65 20 74 65 72 6d 20 22 63 68 61 6e 67 65 73  he term "changes
03f0: 65 74 22 20 69 73 20 75 73 65 64 20 66 6f 72 20  et" is used for 
0400: 62 6f 74 68 20 70 61 74 63 68 73 65 74 73 20 61  both patchsets a
0410: 6e 64 20 63 68 61 6e 67 65 73 65 74 73 20 66 72  nd changesets fr
0420: 6f 6d 20 74 68 69 73 0a 2a 2a 20 70 6f 69 6e 74  om this.** point
0430: 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68   on..**.** In th
0440: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 2c 20 61  e second form, a
0450: 72 67 75 6d 65 6e 74 73 20 53 45 45 44 20 61 6e  rguments SEED an
0460: 64 20 4e 20 6d 75 73 74 20 62 6f 74 68 20 62 65  d N must both be
0470: 20 69 6e 74 65 67 65 72 73 2e 20 49 6e 20 74 68   integers. In th
0480: 69 73 0a 2a 2a 20 63 61 73 65 2c 20 74 68 69 73  is.** case, this
0490: 20 70 72 6f 67 72 61 6d 20 77 72 69 74 65 73 20   program writes 
04a0: 4e 20 62 69 6e 61 72 79 20 63 68 61 6e 67 65 73  N binary changes
04b0: 65 74 73 20 74 6f 20 64 69 73 6b 2e 20 45 61 63  ets to disk. Eac
04c0: 68 20 6f 75 74 70 75 74 0a 2a 2a 20 63 68 61 6e  h output.** chan
04d0: 67 65 73 65 74 20 69 73 20 61 20 73 6c 69 67 68  geset is a sligh
04e0: 74 6c 79 20 6d 6f 64 69 66 69 65 64 20 2d 20 22  tly modified - "
04f0: 66 75 7a 7a 65 64 22 20 2d 20 76 65 72 73 69 6f  fuzzed" - versio
0500: 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74 2e 20  n of the input. 
0510: 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63  .** The output c
0520: 68 61 6e 67 65 73 65 74 73 20 61 72 65 20 77 72  hangesets are wr
0530: 69 74 74 65 6e 20 74 6f 20 66 69 6c 65 73 20 6e  itten to files n
0540: 61 6d 65 20 22 49 4e 50 55 54 2d 24 6e 22 2c 20  ame "INPUT-$n", 
0550: 77 68 65 72 65 20 24 6e 20 69 73 20 0a 2a 2a 20  where $n is .** 
0560: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65  an integer betwe
0570: 65 6e 20 30 20 61 6e 64 20 4e 2d 31 2c 20 69 6e  en 0 and N-1, in
0580: 63 6c 75 73 69 76 65 2e 20 4f 75 74 70 75 74 20  clusive. Output 
0590: 63 68 61 6e 67 65 73 65 74 73 20 61 72 65 20 61  changesets are a
05a0: 6c 77 61 79 73 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  lways.** well-fo
05b0: 72 6d 65 64 2e 20 50 61 72 61 6d 65 74 65 72 20  rmed. Parameter 
05c0: 53 45 45 44 20 69 73 20 75 73 65 64 20 74 6f 20  SEED is used to 
05d0: 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 2d 20  seed the PRNG - 
05e0: 61 6e 79 20 74 77 6f 20 0a 2a 2a 20 69 6e 76 6f  any two .** invo
05f0: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  cations of this 
0600: 70 72 6f 67 72 61 6d 20 77 69 74 68 20 74 68 65  program with the
0610: 20 73 61 6d 65 20 53 45 45 44 20 61 6e 64 20 69   same SEED and i
0620: 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 20 63  nput changeset c
0630: 72 65 61 74 65 0a 2a 2a 20 74 68 65 20 73 61 6d  reate.** the sam
0640: 65 20 4e 20 6f 75 74 70 75 74 20 63 68 61 6e 67  e N output chang
0650: 65 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  esets..**.** The
0660: 20 77 61 79 73 20 69 6e 20 77 68 69 63 68 20 61   ways in which a
0670: 6e 20 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65  n input changese
0680: 74 20 6d 61 79 20 62 65 20 66 75 7a 7a 65 64 20  t may be fuzzed 
0690: 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  are as follows:.
06a0: 2a 2a 0a 2a 2a 20 20 20 31 2e 20 41 6e 79 20 74  **.**   1. Any t
06b0: 77 6f 20 76 61 6c 75 65 73 20 77 69 74 68 69 6e  wo values within
06c0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 6d   the changeset m
06d0: 61 79 20 62 65 20 65 78 63 68 61 6e 67 65 64 2e  ay be exchanged.
06e0: 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 41 6e 79 20  .**.**   2. Any 
06f0: 54 45 58 54 2c 20 42 4c 4f 42 2c 20 49 4e 54 45  TEXT, BLOB, INTE
0700: 47 45 52 20 6f 72 20 52 45 41 4c 20 76 61 6c 75  GER or REAL valu
0710: 65 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 61  e within the cha
0720: 6e 67 65 73 65 74 20 0a 2a 2a 20 20 20 20 20 20  ngeset .**      
0730: 6d 61 79 20 68 61 76 65 20 61 20 73 69 6e 67 6c  may have a singl
0740: 65 20 62 69 74 20 6f 66 20 69 74 73 20 63 6f 6e  e bit of its con
0750: 74 65 6e 74 20 66 6c 69 70 70 65 64 2e 0a 2a 2a  tent flipped..**
0760: 0a 2a 2a 20 20 20 33 2e 20 41 6e 79 20 76 61 6c  .**   3. Any val
0770: 75 65 20 77 69 74 68 69 6e 20 61 20 63 68 61 6e  ue within a chan
0780: 67 65 73 65 74 20 6d 61 79 20 62 65 20 72 65 70  geset may be rep
0790: 6c 61 63 65 64 20 62 79 20 61 20 70 73 65 75 64  laced by a pseud
07a0: 6f 2d 72 61 6e 64 6f 6d 6c 79 0a 2a 2a 20 20 20  o-randomly.**   
07b0: 20 20 20 67 65 6e 65 72 61 74 65 64 20 76 61 6c     generated val
07c0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ue..**.** The ab
07d0: 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 6e  ove operations n
07e0: 65 76 65 72 20 73 65 74 20 61 20 50 52 49 4d 41  ever set a PRIMA
07f0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 74 6f  RY KEY column to
0800: 20 4e 55 4c 4c 2e 20 4e 6f 72 20 64 6f 20 74 68   NULL. Nor do th
0810: 65 79 0a 2a 2a 20 73 65 74 20 61 6e 79 20 76 61  ey.** set any va
0820: 6c 75 65 20 74 6f 20 22 75 6e 64 65 66 69 6e 65  lue to "undefine
0830: 64 22 2c 20 6f 72 20 72 65 70 6c 61 63 65 20 61  d", or replace a
0840: 6e 79 20 22 75 6e 64 65 66 69 6e 65 64 22 20 76  ny "undefined" v
0850: 61 6c 75 65 20 77 69 74 68 0a 2a 2a 20 61 6e 6f  alue with.** ano
0860: 74 68 65 72 2e 20 41 6e 79 20 73 75 63 68 20 6f  ther. Any such o
0870: 70 65 72 61 74 69 6f 6e 20 72 69 73 6b 73 20 70  peration risks p
0880: 72 6f 64 75 63 69 6e 67 20 61 20 63 68 61 6e 67  roducing a chang
0890: 65 73 65 74 20 74 68 61 74 20 69 73 20 6e 6f 74  eset that is not
08a0: 20 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64   .** well-formed
08b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 34 2e 20 41 20 73  ..**.**   4. A s
08c0: 69 6e 67 6c 65 20 63 68 61 6e 67 65 20 6d 61 79  ingle change may
08d0: 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   be duplicated..
08e0: 2a 2a 0a 2a 2a 20 20 20 35 2e 20 41 20 73 69 6e  **.**   5. A sin
08f0: 67 6c 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62  gle change may b
0900: 65 20 72 65 6d 6f 76 65 64 2c 20 73 6f 20 6c 6f  e removed, so lo
0910: 6e 67 20 61 73 20 74 68 69 73 20 64 6f 65 73 20  ng as this does 
0920: 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74 0a 2a 2a  not mean that.**
0930: 20 20 20 20 20 20 74 68 65 72 65 20 61 72 65 20        there are 
0940: 7a 65 72 6f 20 63 68 61 6e 67 65 73 20 66 6f 6c  zero changes fol
0950: 6c 6f 77 69 6e 67 20 61 20 74 61 62 6c 65 2d 68  lowing a table-h
0960: 65 61 64 65 72 20 77 69 74 68 69 6e 20 74 68 65  eader within the
0970: 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a   changeset..**.*
0980: 2a 20 20 20 36 2e 20 41 20 73 69 6e 67 6c 65 20  *   6. A single 
0990: 63 68 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20  change may have 
09a0: 69 74 73 20 74 79 70 65 20 28 49 4e 53 45 52 54  its type (INSERT
09b0: 2c 20 44 45 4c 45 54 45 2c 20 55 50 44 41 54 45  , DELETE, UPDATE
09c0: 29 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 20 20  ) changed..**   
09d0: 20 20 20 49 66 20 61 6e 20 49 4e 53 45 52 54 20     If an INSERT 
09e0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20  is changed to a 
09f0: 44 45 4c 45 54 45 20 28 6f 72 20 76 69 63 65 20  DELETE (or vice 
0a00: 76 65 72 73 61 29 2c 20 74 68 65 20 74 79 70 65  versa), the type
0a10: 20 69 73 0a 2a 2a 20 20 20 20 20 20 73 69 6d 70   is.**      simp
0a20: 6c 79 20 63 68 61 6e 67 65 64 20 2d 20 6e 6f 20  ly changed - no 
0a30: 6f 74 68 65 72 20 6d 6f 64 69 66 69 63 61 74 69  other modificati
0a40: 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ons are required
0a50: 2e 20 49 66 20 61 6e 20 49 4e 53 45 52 54 0a 2a  . If an INSERT.*
0a60: 2a 20 20 20 20 20 20 6f 72 20 44 45 4c 45 54 45  *      or DELETE
0a70: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61   is changed to a
0a80: 6e 20 55 50 44 41 54 45 2c 20 74 68 65 6e 20 74  n UPDATE, then t
0a90: 68 65 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64  he single record
0aa0: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 0a 2a   is duplicated.*
0ab0: 2a 20 20 20 20 20 20 28 61 73 20 62 6f 74 68 20  *      (as both 
0ac0: 74 68 65 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65  the old.* and ne
0ad0: 77 2e 2a 20 72 65 63 6f 72 64 73 20 6f 66 20 74  w.* records of t
0ae0: 68 65 20 6e 65 77 20 55 50 44 41 54 45 20 63 68  he new UPDATE ch
0af0: 61 6e 67 65 29 2e 20 49 66 20 61 6e 0a 2a 2a 20  ange). If an.** 
0b00: 20 20 20 20 20 55 50 44 41 54 45 20 69 73 20 63       UPDATE is c
0b10: 68 61 6e 67 65 64 20 74 6f 20 61 20 44 45 4c 45  hanged to a DELE
0b20: 54 45 20 6f 72 20 49 4e 53 45 52 54 2c 20 74 68  TE or INSERT, th
0b30: 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 69  e new.* record i
0b40: 73 20 64 69 73 63 61 72 64 65 64 0a 2a 2a 20 20  s discarded.**  
0b50: 20 20 20 20 61 6e 64 20 61 6e 79 20 22 75 6e 64      and any "und
0b60: 65 66 69 6e 65 64 22 20 66 69 65 6c 64 73 20 72  efined" fields r
0b70: 65 70 6c 61 63 65 64 20 77 69 74 68 20 70 73 65  eplaced with pse
0b80: 75 64 6f 2d 72 61 6e 64 6f 6d 6c 79 20 67 65 6e  udo-randomly gen
0b90: 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 76  erated.**      v
0ba0: 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 37  alues..**.**   7
0bb0: 2e 20 41 6e 20 55 50 44 41 54 45 20 63 68 61 6e  . An UPDATE chan
0bc0: 67 65 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73  ge that modifies
0bd0: 20 4e 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73   N table columns
0be0: 20 6d 61 79 20 62 65 20 6d 6f 64 69 66 69 65 64   may be modified
0bf0: 20 73 6f 0a 2a 2a 20 20 20 20 20 20 74 68 61 74   so.**      that
0c00: 20 69 74 20 75 70 64 61 74 65 73 20 4e 2d 31 20   it updates N-1 
0c10: 63 6f 6c 75 6d 6e 73 2c 20 73 6f 20 6c 6f 6e 67  columns, so long
0c20: 20 61 73 20 28 4e 3e 31 29 2e 0a 2a 2a 0a 2a 2a   as (N>1)..**.**
0c30: 20 20 20 38 2e 20 54 68 65 20 22 69 6e 64 69 72     8. The "indir
0c40: 65 63 74 22 20 66 6c 61 67 20 6d 61 79 20 62 65  ect" flag may be
0c50: 20 74 6f 67 67 6c 65 64 20 66 6f 72 20 61 6e 79   toggled for any
0c60: 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 45   change..**.** E
0c70: 6e 74 69 72 65 20 67 72 6f 75 70 20 6f 66 20 63  ntire group of c
0c80: 68 61 6e 67 65 73 20 6d 61 79 20 61 6c 73 6f 20  hanges may also 
0c90: 62 65 20 6f 70 65 72 61 74 65 64 20 6f 6e 3a 0a  be operated on:.
0ca0: 2a 2a 0a 2a 2a 20 20 20 39 2e 20 44 75 70 6c 69  **.**   9. Dupli
0cb0: 63 61 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  cate an existing
0cc0: 20 67 72 6f 75 70 2e 0a 2a 2a 0a 2a 2a 20 20 31   group..**.**  1
0cd0: 30 2e 20 52 65 6d 6f 76 65 20 61 6e 20 65 78 69  0. Remove an exi
0ce0: 73 74 69 6e 67 20 67 72 6f 75 70 2e 0a 2a 2a 0a  sting group..**.
0cf0: 2a 2a 20 20 31 31 2e 20 54 68 65 20 70 6f 73 69  **  11. The posi
0d00: 74 69 6f 6e 73 20 6f 66 20 74 77 6f 20 67 72 6f  tions of two gro
0d10: 75 70 73 20 6d 61 79 20 62 65 20 65 78 63 68 61  ups may be excha
0d20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nged..**.** Ther
0d30: 65 20 61 72 65 20 61 6c 73 6f 20 73 63 68 65 6d  e are also schem
0d40: 61 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a  a changes:.**.**
0d50: 20 20 31 32 2e 20 41 20 6e 6f 6e 2d 50 4b 20 63    12. A non-PK c
0d60: 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 61 64 64  olumn may be add
0d70: 65 64 20 74 6f 20 61 20 74 61 62 6c 65 2e 20 49  ed to a table. I
0d80: 6e 20 74 68 69 73 20 63 61 73 65 20 61 20 4e 55  n this case a NU
0d90: 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 76 61 6c 75  LL .**      valu
0da0: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
0db0: 20 61 6c 6c 20 72 65 63 6f 72 64 73 2e 0a 2a 2a   all records..**
0dc0: 0a 2a 2a 20 20 31 33 2e 20 41 20 50 4b 20 63 6f  .**  13. A PK co
0dd0: 6c 75 6d 6e 20 6d 61 79 20 62 65 20 61 64 64 65  lumn may be adde
0de0: 64 20 74 6f 20 61 20 74 61 62 6c 65 2e 20 49 6e  d to a table. In
0df0: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 6f 6e   this case a non
0e00: 2d 4e 55 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 76  -NULL .**      v
0e10: 61 6c 75 65 20 69 73 20 61 70 70 65 6e 64 65 64  alue is appended
0e20: 20 74 6f 20 61 6c 6c 20 49 4e 53 45 52 54 2c 20   to all INSERT, 
0e30: 44 45 4c 45 54 45 20 61 6e 64 20 55 50 44 41 54  DELETE and UPDAT
0e40: 45 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 73 2e  E old.* records.
0e50: 0a 2a 2a 20 20 20 20 20 20 41 6e 20 22 75 6e 64  .**      An "und
0e60: 65 66 69 6e 65 64 22 20 69 73 20 61 70 70 65 6e  efined" is appen
0e70: 64 65 64 20 74 6f 20 6e 65 77 2e 2a 20 55 50 44  ded to new.* UPD
0e80: 41 54 45 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ATE records..**.
0e90: 2a 2a 20 20 31 34 2e 20 41 20 63 6f 6c 75 6d 6e  **  14. A column
0ea0: 20 6d 61 79 20 62 65 20 72 65 6d 6f 76 65 64 20   may be removed 
0eb0: 66 72 6f 6d 20 61 20 74 61 62 6c 65 2c 20 70 72  from a table, pr
0ec0: 6f 76 69 64 65 64 20 74 68 61 74 20 69 74 20 69  ovided that it i
0ed0: 73 20 6e 6f 74 20 74 68 65 0a 2a 2a 20 20 20 20  s not the.**    
0ee0: 20 20 6f 6e 6c 79 20 50 52 49 4d 41 52 59 20 4b    only PRIMARY K
0ef0: 45 59 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  EY column in the
0f00: 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20   table. In this 
0f10: 63 61 73 65 20 74 68 65 20 63 6f 72 72 65 73 70  case the corresp
0f20: 6f 6e 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  onding.**      f
0f30: 69 65 6c 64 20 69 73 20 72 65 6d 6f 76 65 64 20  ield is removed 
0f40: 66 72 6f 6d 20 61 6c 6c 20 72 65 63 6f 72 64 73  from all records
0f50: 2e 20 49 6e 20 63 61 73 65 73 20 77 68 65 72 65  . In cases where
0f60: 20 74 68 69 73 20 6c 65 61 76 65 73 20 61 6e 20   this leaves an 
0f70: 55 50 44 41 54 45 0a 2a 2a 20 20 20 20 20 20 77  UPDATE.**      w
0f80: 69 74 68 20 6e 6f 20 6e 6f 6e 2d 50 4b 2c 20 6e  ith no non-PK, n
0f90: 6f 6e 2d 75 6e 64 65 66 69 6e 65 64 20 66 69 65  on-undefined fie
0fa0: 6c 64 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20  lds, the entire 
0fb0: 63 68 61 6e 67 65 20 69 73 20 72 65 6d 6f 76 65  change is remove
0fc0: 64 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20  d..*/..#include 
0fd0: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
0fe0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0ff0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
1000: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
1010: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
1020: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
1030: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23  ude <ctype.h>..#
1040: 64 65 66 69 6e 65 20 46 55 5a 5a 5f 56 41 4c 55  define FUZZ_VALU
1050: 45 5f 53 55 42 20 20 20 20 20 20 20 31 20 20 20  E_SUB       1   
1060: 20 2f 2a 20 52 65 70 6c 61 63 65 20 6f 6e 65 20   /* Replace one 
1070: 76 61 6c 75 65 20 77 69 74 68 20 61 20 63 6f 70  value with a cop
1080: 79 20 6f 66 20 61 6e 6f 74 68 65 72 20 2a 2f 0a  y of another */.
1090: 23 64 65 66 69 6e 65 20 46 55 5a 5a 5f 56 41 4c  #define FUZZ_VAL
10a0: 55 45 5f 4d 4f 44 20 20 20 20 20 20 20 32 20 20  UE_MOD       2  
10b0: 20 20 2f 2a 20 4d 6f 64 69 66 79 20 63 6f 6e 74    /* Modify cont
10c0: 65 6e 74 20 62 79 20 31 20 62 69 74 20 2a 2f 0a  ent by 1 bit */.
10d0: 23 64 65 66 69 6e 65 20 46 55 5a 5a 5f 56 41 4c  #define FUZZ_VAL
10e0: 55 45 5f 52 4e 44 20 20 20 20 20 20 20 33 20 20  UE_RND       3  
10f0: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74    /* Replace wit
1100: 68 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  h pseudo-random 
1110: 76 61 6c 75 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  value */..#defin
1120: 65 20 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 44 55  e FUZZ_CHANGE_DU
1130: 50 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 44  P      4    /* D
1140: 75 70 6c 69 63 61 74 65 20 61 6e 20 65 78 69 73  uplicate an exis
1150: 74 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 23  ting change */.#
1160: 64 65 66 69 6e 65 20 46 55 5a 5a 5f 43 48 41 4e  define FUZZ_CHAN
1170: 47 45 5f 44 45 4c 20 20 20 20 20 20 35 20 20 20  GE_DEL      5   
1180: 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 6c 79 20 72   /* Completely r
1190: 65 6d 6f 76 65 20 6f 6e 65 20 63 68 61 6e 67 65  emove one change
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 55 5a 5a   */.#define FUZZ
11b0: 5f 43 48 41 4e 47 45 5f 54 59 50 45 20 20 20 20  _CHANGE_TYPE    
11c0: 20 36 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20   6    /* Change 
11d0: 74 68 65 20 74 79 70 65 20 6f 66 20 6f 6e 65 20  the type of one 
11e0: 63 68 61 6e 67 65 20 2a 2f 0a 23 64 65 66 69 6e  change */.#defin
11f0: 65 20 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 46 49  e FUZZ_CHANGE_FI
1200: 45 4c 44 20 20 20 20 37 20 20 20 20 2f 2a 20 43  ELD    7    /* C
1210: 68 61 6e 67 65 20 61 6e 20 55 50 44 41 54 45 20  hange an UPDATE 
1220: 74 6f 20 6d 6f 64 69 66 79 20 66 65 77 65 72 20  to modify fewer 
1230: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  columns */.#defi
1240: 6e 65 20 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 49  ne FUZZ_CHANGE_I
1250: 4e 44 49 52 45 43 54 20 38 20 20 20 20 2f 2a 20  NDIRECT 8    /* 
1260: 54 6f 67 67 6c 65 20 74 68 65 20 22 69 6e 64 69  Toggle the "indi
1270: 72 65 63 74 22 20 66 6c 61 67 20 6f 66 20 61 20  rect" flag of a 
1280: 63 68 61 6e 67 65 20 2a 2f 0a 0a 23 64 65 66 69  change */..#defi
1290: 6e 65 20 46 55 5a 5a 5f 47 52 4f 55 50 5f 44 55  ne FUZZ_GROUP_DU
12a0: 50 20 20 20 20 20 20 20 39 20 20 20 20 2f 2a 20  P       9    /* 
12b0: 44 75 70 6c 69 63 61 74 65 20 61 20 63 68 61 6e  Duplicate a chan
12c0: 67 65 20 67 72 6f 75 70 20 2a 2f 0a 23 64 65 66  ge group */.#def
12d0: 69 6e 65 20 46 55 5a 5a 5f 47 52 4f 55 50 5f 44  ine FUZZ_GROUP_D
12e0: 45 4c 20 20 20 20 20 20 31 30 20 20 20 20 2f 2a  EL      10    /*
12f0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
1300: 65 20 63 68 61 6e 67 65 20 67 72 6f 75 70 20 2a  e change group *
1310: 2f 0a 23 64 65 66 69 6e 65 20 46 55 5a 5a 5f 47  /.#define FUZZ_G
1320: 52 4f 55 50 5f 53 57 41 50 20 20 20 20 20 31 31  ROUP_SWAP     11
1330: 20 20 20 20 2f 2a 20 45 78 63 68 61 6e 67 65 20      /* Exchange 
1340: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  the position of 
1350: 74 77 6f 20 67 72 6f 75 70 73 20 2a 2f 0a 0a 23  two groups */..#
1360: 64 65 66 69 6e 65 20 46 55 5a 5a 5f 43 4f 4c 55  define FUZZ_COLU
1370: 4d 4e 5f 41 44 44 20 20 20 20 20 31 32 20 20 20  MN_ADD     12   
1380: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
1390: 74 6f 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74  to table definit
13a0: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ion */.#define F
13b0: 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 41 44 44 50 4b  UZZ_COLUMN_ADDPK
13c0: 20 20 20 31 33 20 20 20 20 20 2f 2a 20 41 64 64     13     /* Add
13d0: 20 50 4b 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 61   PK column to ta
13e0: 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a  ble definition *
13f0: 2f 0a 23 64 65 66 69 6e 65 20 46 55 5a 5a 5f 43  /.#define FUZZ_C
1400: 4f 4c 55 4d 4e 5f 44 45 4c 20 20 20 20 20 31 34  OLUMN_DEL     14
1410: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63       /* Remove c
1420: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 74 61 62 6c 65  olumn from table
1430: 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 0a   definition */..
1440: 0a 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ..typedef unsign
1450: 65 64 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65  ed char u8;.type
1460: 64 65 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  def sqlite3_uint
1470: 36 34 20 75 36 34 3b 0a 74 79 70 65 64 65 66 20  64 u64;.typedef 
1480: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36  sqlite3_int64 i6
1490: 34 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  4;.typedef unsig
14a0: 6e 65 64 20 69 6e 74 20 75 33 32 3b 0a 0a 2f 2a  ned int u32;../*
14b0: 0a 2a 2a 20 53 68 6f 77 20 61 20 75 73 61 67 65  .** Show a usage
14c0: 20 6d 65 73 73 61 67 65 20 6f 6e 20 73 74 64 65   message on stde
14d0: 72 72 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f  rr then quit..*/
14e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73 61  .static void usa
14f0: 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ge(const char *a
1500: 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e 74 66  rgv0){.  fprintf
1510: 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
1520: 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45   %s FILENAME ?SE
1530: 45 44 20 4e 3f 5c 6e 22 2c 20 61 72 67 76 30 29  ED N?\n", argv0)
1540: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
1550: 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1560: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 69 73 6b  ontent of a disk
1570: 20 66 69 6c 65 20 69 6e 74 6f 20 61 6e 20 69 6e   file into an in
1580: 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 0a 2a  -memory buffer.*
1590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75  /.static void fu
15a0: 7a 7a 52 65 61 64 46 69 6c 65 28 63 6f 6e 73 74  zzReadFile(const
15b0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15c0: 2c 20 69 6e 74 20 2a 70 53 7a 2c 20 76 6f 69 64  , int *pSz, void
15d0: 20 2a 2a 70 70 42 75 66 29 7b 0a 20 20 46 49 4c   **ppBuf){.  FIL
15e0: 45 20 2a 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E *f;.  sqlite3_
15f0: 69 6e 74 36 34 20 73 7a 3b 0a 20 20 76 6f 69 64  int64 sz;.  void
1600: 20 2a 70 42 75 66 3b 0a 20 20 66 20 3d 20 66 6f   *pBuf;.  f = fo
1610: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  pen(zFilename, "
1620: 72 62 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  rb");.  if( f==0
1630: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1640: 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
1650: 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20  open \"%s\" for 
1660: 72 65 61 64 69 6e 67 5c 6e 22 2c 20 7a 46 69 6c  reading\n", zFil
1670: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 65 78 69 74  ename);.    exit
1680: 28 31 29 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b  (1);.  }.  fseek
1690: 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  (f, 0, SEEK_END)
16a0: 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28 66  ;.  sz = ftell(f
16b0: 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 29 3b 0a  );.  rewind(f);.
16c0: 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33    pBuf = sqlite3
16d0: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 20 3f 20  _malloc64( sz ? 
16e0: 73 7a 20 3a 20 31 20 29 3b 0a 20 20 69 66 28 20  sz : 1 );.  if( 
16f0: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 66  pBuf==0 ){.    f
1700: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1710: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  cannot allocate 
1720: 25 64 20 74 6f 20 68 6f 6c 64 20 63 6f 6e 74 65  %d to hold conte
1730: 6e 74 20 6f 66 20 5c 22 25 73 5c 22 5c 6e 22 2c  nt of \"%s\"\n",
1740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e  .            (in
1750: 74 29 73 7a 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  t)sz, zFilename)
1760: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1770: 20 7d 0a 20 20 69 66 28 20 73 7a 3e 30 20 29 7b   }.  if( sz>0 ){
1780: 0a 20 20 20 20 69 66 28 20 66 72 65 61 64 28 70  .    if( fread(p
1790: 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 73 7a 2c  Buf, (size_t)sz,
17a0: 20 31 2c 20 66 29 21 3d 31 20 29 7b 0a 20 20 20   1, f)!=1 ){.   
17b0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17c0: 72 2c 20 22 63 61 6e 6e 6f 74 20 72 65 61 64 20  r, "cannot read 
17d0: 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20  all %d bytes of 
17e0: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
17f0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 73 7a           (int)sz
1800: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1810: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
1820: 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29   }.    fclose(f)
1830: 3b 0a 20 20 7d 0a 20 20 2a 70 53 7a 20 3d 20 28  ;.  }.  *pSz = (
1840: 69 6e 74 29 73 7a 3b 0a 20 20 2a 70 70 42 75 66  int)sz;.  *ppBuf
1850: 20 3d 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 20 0a   = pBuf;.}../* .
1860: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  ** Write the con
1870: 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20  tents of buffer 
1880: 70 42 75 66 2c 20 73 69 7a 65 20 6e 42 75 66 20  pBuf, size nBuf 
1890: 62 79 74 65 73 2c 20 69 6e 74 6f 20 66 69 6c 65  bytes, into file
18a0: 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20 6f 6e   zFilename.** on
18b0: 20 64 69 73 6b 2e 20 7a 46 69 6c 65 6e 61 6d 65   disk. zFilename
18c0: 2c 20 69 66 20 69 74 20 61 6c 72 65 61 64 79 20  , if it already 
18d0: 65 78 69 73 74 73 2c 20 69 73 20 63 6c 6f 62 62  exists, is clobb
18e0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
18f0: 76 6f 69 64 20 66 75 7a 7a 57 72 69 74 65 46 69  void fuzzWriteFi
1900: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
1910: 46 69 6c 65 6e 61 6d 65 2c 20 76 6f 69 64 20 2a  Filename, void *
1920: 70 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b  pBuf, int nBuf){
1930: 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 66 20  .  FILE *f;.  f 
1940: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
1950: 65 2c 20 22 77 62 22 29 3b 0a 20 20 69 66 28 20  e, "wb");.  if( 
1960: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  f==0 ){.    fpri
1970: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
1980: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20  not open \"%s\" 
1990: 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20  for writing\n", 
19a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
19b0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 69  exit(1);.  }.  i
19c0: 66 28 20 66 77 72 69 74 65 28 70 42 75 66 2c 20  f( fwrite(pBuf, 
19d0: 6e 42 75 66 2c 20 31 2c 20 66 29 21 3d 31 20 29  nBuf, 1, f)!=1 )
19e0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
19f0: 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 77 72  derr, "cannot wr
1a00: 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
1a10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1a20: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1a30: 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 73   fclose(f);.}..s
1a40: 74 61 74 69 63 20 69 6e 74 20 66 75 7a 7a 43 6f  tatic int fuzzCo
1a50: 72 72 75 70 74 28 29 7b 0a 20 20 72 65 74 75 72  rrupt(){.  retur
1a60: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a70: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1ad0: 20 62 6c 6f 63 6b 20 69 73 20 61 20 63 6f 70 79   block is a copy
1ae0: 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   of the implemen
1af0: 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  tation of SQLite
1b00: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c   function.** sql
1b10: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 2e  ite3_randomness.
1b20: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 68 61   This version ha
1b30: 73 20 74 77 6f 20 69 6d 70 6f 72 74 61 6e 74 20  s two important 
1b40: 64 69 66 66 65 72 65 6e 63 65 73 3a 0a 2a 2a 0a  differences:.**.
1b50: 2a 2a 20 20 20 31 2e 20 49 74 20 61 6c 77 61 79  **   1. It alway
1b60: 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  s uses the same 
1b70: 73 65 65 64 2e 20 53 6f 20 74 68 65 20 73 65 71  seed. So the seq
1b80: 75 65 6e 63 65 20 6f 66 20 72 61 6e 64 6f 6d 20  uence of random 
1b90: 64 61 74 61 20 6f 75 74 70 75 74 0a 2a 2a 20 20  data output.**  
1ba0: 20 20 20 20 69 73 20 74 68 65 20 73 61 6d 65 20      is the same 
1bb0: 66 6f 72 20 65 76 65 72 79 20 72 75 6e 20 6f 66  for every run of
1bc0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
1bd0: 0a 2a 2a 20 20 20 32 2e 20 49 74 20 69 73 20 6e  .**   2. It is n
1be0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 0a 2a  ot threadsafe..*
1bf0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1c00: 73 71 6c 69 74 65 33 50 72 6e 67 54 79 70 65 20  sqlite3PrngType 
1c10: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1c20: 72 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  r i, j;         
1c30: 20 20 20 20 2f 2a 20 53 74 61 74 65 20 76 61 72      /* State var
1c40: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 75 6e 73 69  iables */.  unsi
1c50: 67 6e 65 64 20 63 68 61 72 20 73 5b 32 35 36 5d  gned char s[256]
1c60: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1c70: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 2a  tate variables *
1c80: 2f 0a 7d 20 73 71 6c 69 74 65 33 50 72 6e 67 20  /.} sqlite3Prng 
1c90: 3d 20 7b 0a 20 20 20 20 30 78 41 46 2c 20 30 78  = {.    0xAF, 0x
1ca0: 32 38 2c 0a 20 20 7b 0a 20 20 20 20 30 78 37 31  28,.  {.    0x71
1cb0: 2c 20 30 78 46 35 2c 20 30 78 42 34 2c 20 30 78  , 0xF5, 0xB4, 0x
1cc0: 36 45 2c 20 30 78 38 30 2c 20 30 78 41 42 2c 20  6E, 0x80, 0xAB, 
1cd0: 30 78 31 44 2c 20 30 78 42 38 2c 20 0a 20 20 20  0x1D, 0xB8, .   
1ce0: 20 30 78 46 42 2c 20 30 78 42 37 2c 20 30 78 34   0xFB, 0xB7, 0x4
1cf0: 39 2c 20 30 78 42 46 2c 20 30 78 46 46 2c 20 30  9, 0xBF, 0xFF, 0
1d00: 78 37 32 2c 20 30 78 32 44 2c 20 30 78 31 34 2c  x72, 0x2D, 0x14,
1d10: 20 0a 20 20 20 20 30 78 37 39 2c 20 30 78 30 39   .    0x79, 0x09
1d20: 2c 20 30 78 45 33 2c 20 30 78 37 38 2c 20 30 78  , 0xE3, 0x78, 0x
1d30: 37 36 2c 20 30 78 42 30 2c 20 30 78 32 43 2c 20  76, 0xB0, 0x2C, 
1d40: 30 78 30 41 2c 20 0a 20 20 20 20 30 78 38 45 2c  0x0A, .    0x8E,
1d50: 20 30 78 32 33 2c 20 30 78 45 45 2c 20 30 78 44   0x23, 0xEE, 0xD
1d60: 46 2c 20 30 78 45 30 2c 20 30 78 39 41 2c 20 30  F, 0xE0, 0x9A, 0
1d70: 78 32 46 2c 20 30 78 36 37 2c 20 0a 20 20 20 20  x2F, 0x67, .    
1d80: 30 78 45 31 2c 20 30 78 42 45 2c 20 30 78 30 45  0xE1, 0xBE, 0x0E
1d90: 2c 20 30 78 41 37 2c 20 30 78 30 38 2c 20 30 78  , 0xA7, 0x08, 0x
1da0: 39 37 2c 20 30 78 45 42 2c 20 30 78 37 37 2c 20  97, 0xEB, 0x77, 
1db0: 0a 20 20 20 20 30 78 37 38 2c 20 30 78 42 41 2c  .    0x78, 0xBA,
1dc0: 20 30 78 39 44 2c 20 30 78 43 41 2c 20 30 78 34   0x9D, 0xCA, 0x4
1dd0: 39 2c 20 30 78 34 43 2c 20 30 78 36 30 2c 20 30  9, 0x4C, 0x60, 0
1de0: 78 39 41 2c 20 0a 20 20 20 20 30 78 46 36 2c 20  x9A, .    0xF6, 
1df0: 30 78 42 44 2c 20 30 78 44 41 2c 20 30 78 37 46  0xBD, 0xDA, 0x7F
1e00: 2c 20 30 78 42 43 2c 20 30 78 34 38 2c 20 30 78  , 0xBC, 0x48, 0x
1e10: 35 38 2c 20 30 78 35 32 2c 20 0a 20 20 20 20 30  58, 0x52, .    0
1e20: 78 45 35 2c 20 30 78 43 44 2c 20 30 78 38 33 2c  xE5, 0xCD, 0x83,
1e30: 20 30 78 37 32 2c 20 30 78 32 33 2c 20 30 78 35   0x72, 0x23, 0x5
1e40: 32 2c 20 30 78 46 46 2c 20 30 78 36 44 2c 20 0a  2, 0xFF, 0x6D, .
1e50: 20 20 20 20 30 78 45 46 2c 20 30 78 30 46 2c 20      0xEF, 0x0F, 
1e60: 30 78 38 32 2c 20 30 78 32 39 2c 20 30 78 41 30  0x82, 0x29, 0xA0
1e70: 2c 20 30 78 38 33 2c 20 30 78 33 46 2c 20 30 78  , 0x83, 0x3F, 0x
1e80: 37 44 2c 20 0a 20 20 20 20 30 78 41 34 2c 20 30  7D, .    0xA4, 0
1e90: 78 38 38 2c 20 30 78 33 31 2c 20 30 78 45 37 2c  x88, 0x31, 0xE7,
1ea0: 20 30 78 38 38 2c 20 30 78 39 32 2c 20 30 78 33   0x88, 0x92, 0x3
1eb0: 42 2c 20 30 78 39 42 2c 20 0a 20 20 20 20 30 78  B, 0x9B, .    0x
1ec0: 33 42 2c 20 30 78 32 43 2c 20 30 78 43 32 2c 20  3B, 0x2C, 0xC2, 
1ed0: 30 78 34 43 2c 20 30 78 37 31 2c 20 30 78 41 32  0x4C, 0x71, 0xA2
1ee0: 2c 20 30 78 42 30 2c 20 30 78 45 41 2c 20 0a 20  , 0xB0, 0xEA, . 
1ef0: 20 20 20 30 78 33 36 2c 20 30 78 44 30 2c 20 30     0x36, 0xD0, 0
1f00: 78 30 30 2c 20 30 78 46 31 2c 20 30 78 44 33 2c  x00, 0xF1, 0xD3,
1f10: 20 30 78 33 39 2c 20 30 78 31 37 2c 20 30 78 35   0x39, 0x17, 0x5
1f20: 44 2c 20 0a 20 20 20 20 30 78 32 41 2c 20 30 78  D, .    0x2A, 0x
1f30: 37 41 2c 20 30 78 45 34 2c 20 30 78 41 44 2c 20  7A, 0xE4, 0xAD, 
1f40: 30 78 45 31 2c 20 30 78 36 34 2c 20 30 78 43 45  0xE1, 0x64, 0xCE
1f50: 2c 20 30 78 30 46 2c 20 0a 20 20 20 20 30 78 39  , 0x0F, .    0x9
1f60: 43 2c 20 30 78 44 39 2c 20 30 78 46 35 2c 20 30  C, 0xD9, 0xF5, 0
1f70: 78 45 44 2c 20 30 78 42 30 2c 20 30 78 32 32 2c  xED, 0xB0, 0x22,
1f80: 20 30 78 35 45 2c 20 30 78 36 32 2c 20 0a 20 20   0x5E, 0x62, .  
1f90: 20 20 30 78 39 37 2c 20 30 78 30 32 2c 20 30 78    0x97, 0x02, 0x
1fa0: 41 33 2c 20 30 78 38 43 2c 20 30 78 36 37 2c 20  A3, 0x8C, 0x67, 
1fb0: 30 78 38 30 2c 20 30 78 46 43 2c 20 30 78 38 38  0x80, 0xFC, 0x88
1fc0: 2c 20 0a 20 20 20 20 30 78 31 34 2c 20 30 78 30  , .    0x14, 0x0
1fd0: 42 2c 20 30 78 31 35 2c 20 30 78 31 30 2c 20 30  B, 0x15, 0x10, 0
1fe0: 78 30 46 2c 20 30 78 43 37 2c 20 30 78 34 30 2c  x0F, 0xC7, 0x40,
1ff0: 20 30 78 44 34 2c 20 0a 20 20 20 20 30 78 46 31   0xD4, .    0xF1
2000: 2c 20 30 78 46 39 2c 20 30 78 30 45 2c 20 30 78  , 0xF9, 0x0E, 0x
2010: 31 41 2c 20 30 78 43 45 2c 20 30 78 42 39 2c 20  1A, 0xCE, 0xB9, 
2020: 30 78 31 45 2c 20 30 78 41 31 2c 20 0a 20 20 20  0x1E, 0xA1, .   
2030: 20 30 78 37 32 2c 20 30 78 38 45 2c 20 30 78 44   0x72, 0x8E, 0xD
2040: 37 2c 20 30 78 37 38 2c 20 30 78 33 39 2c 20 30  7, 0x78, 0x39, 0
2050: 78 43 44 2c 20 30 78 46 34 2c 20 30 78 35 44 2c  xCD, 0xF4, 0x5D,
2060: 20 0a 20 20 20 20 30 78 32 41 2c 20 30 78 35 39   .    0x2A, 0x59
2070: 2c 20 30 78 32 36 2c 20 30 78 33 34 2c 20 30 78  , 0x26, 0x34, 0x
2080: 46 32 2c 20 30 78 37 33 2c 20 30 78 30 42 2c 20  F2, 0x73, 0x0B, 
2090: 30 78 41 30 2c 20 0a 20 20 20 20 30 78 30 32 2c  0xA0, .    0x02,
20a0: 20 30 78 35 31 2c 20 30 78 32 43 2c 20 30 78 30   0x51, 0x2C, 0x0
20b0: 33 2c 20 30 78 41 33 2c 20 30 78 41 37 2c 20 30  3, 0xA3, 0xA7, 0
20c0: 78 34 33 2c 20 30 78 31 33 2c 20 0a 20 20 20 20  x43, 0x13, .    
20d0: 30 78 45 38 2c 20 30 78 39 38 2c 20 30 78 32 42  0xE8, 0x98, 0x2B
20e0: 2c 20 30 78 44 32 2c 20 30 78 35 33 2c 20 30 78  , 0xD2, 0x53, 0x
20f0: 46 38 2c 20 30 78 45 45 2c 20 30 78 39 31 2c 20  F8, 0xEE, 0x91, 
2100: 0a 20 20 20 20 30 78 37 44 2c 20 30 78 45 37 2c  .    0x7D, 0xE7,
2110: 20 30 78 45 33 2c 20 30 78 44 41 2c 20 30 78 44   0xE3, 0xDA, 0xD
2120: 35 2c 20 30 78 42 42 2c 20 30 78 43 30 2c 20 30  5, 0xBB, 0xC0, 0
2130: 78 39 32 2c 20 0a 20 20 20 20 30 78 39 44 2c 20  x92, .    0x9D, 
2140: 30 78 39 38 2c 20 30 78 30 31 2c 20 30 78 32 43  0x98, 0x01, 0x2C
2150: 2c 20 30 78 46 39 2c 20 30 78 42 39 2c 20 30 78  , 0xF9, 0xB9, 0x
2160: 41 30 2c 20 30 78 45 42 2c 20 0a 20 20 20 20 30  A0, 0xEB, .    0
2170: 78 43 46 2c 20 30 78 33 32 2c 20 30 78 46 41 2c  xCF, 0x32, 0xFA,
2180: 20 30 78 30 31 2c 20 30 78 34 39 2c 20 30 78 41   0x01, 0x49, 0xA
2190: 35 2c 20 30 78 31 44 2c 20 30 78 39 41 2c 20 0a  5, 0x1D, 0x9A, .
21a0: 20 20 20 20 30 78 37 36 2c 20 30 78 38 36 2c 20      0x76, 0x86, 
21b0: 30 78 33 46 2c 20 30 78 34 30 2c 20 30 78 44 34  0x3F, 0x40, 0xD4
21c0: 2c 20 30 78 38 39 2c 20 30 78 38 46 2c 20 30 78  , 0x89, 0x8F, 0x
21d0: 39 43 2c 20 0a 20 20 20 20 30 78 45 32 2c 20 30  9C, .    0xE2, 0
21e0: 78 45 33 2c 20 30 78 31 31 2c 20 30 78 33 31 2c  xE3, 0x11, 0x31,
21f0: 20 30 78 33 37 2c 20 30 78 42 32 2c 20 30 78 34   0x37, 0xB2, 0x4
2200: 39 2c 20 30 78 32 38 2c 20 0a 20 20 20 20 30 78  9, 0x28, .    0x
2210: 33 35 2c 20 30 78 43 30 2c 20 30 78 39 39 2c 20  35, 0xC0, 0x99, 
2220: 30 78 42 36 2c 20 30 78 44 30 2c 20 30 78 42 43  0xB6, 0xD0, 0xBC
2230: 2c 20 30 78 36 36 2c 20 30 78 33 35 2c 20 0a 20  , 0x66, 0x35, . 
2240: 20 20 20 30 78 46 37 2c 20 30 78 38 33 2c 20 30     0xF7, 0x83, 0
2250: 78 35 42 2c 20 30 78 44 37 2c 20 30 78 33 37 2c  x5B, 0xD7, 0x37,
2260: 20 30 78 31 41 2c 20 30 78 32 42 2c 20 30 78 31   0x1A, 0x2B, 0x1
2270: 38 2c 20 0a 20 20 20 20 30 78 41 36 2c 20 30 78  8, .    0xA6, 0x
2280: 46 46 2c 20 30 78 38 44 2c 20 30 78 37 43 2c 20  FF, 0x8D, 0x7C, 
2290: 30 78 38 31 2c 20 30 78 41 38 2c 20 30 78 46 43  0x81, 0xA8, 0xFC
22a0: 2c 20 30 78 39 45 2c 20 0a 20 20 20 20 30 78 43  , 0x9E, .    0xC
22b0: 34 2c 20 30 78 45 43 2c 20 30 78 38 30 2c 20 30  4, 0xEC, 0x80, 0
22c0: 78 44 30 2c 20 30 78 39 38 2c 20 30 78 41 37 2c  xD0, 0x98, 0xA7,
22d0: 20 30 78 37 36 2c 20 30 78 43 43 2c 20 0a 20 20   0x76, 0xCC, .  
22e0: 20 20 30 78 39 43 2c 20 30 78 32 46 2c 20 30 78    0x9C, 0x2F, 0x
22f0: 37 42 2c 20 30 78 46 46 2c 20 30 78 38 45 2c 20  7B, 0xFF, 0x8E, 
2300: 30 78 30 45 2c 20 30 78 42 42 2c 20 30 78 39 30  0x0E, 0xBB, 0x90
2310: 2c 20 0a 20 20 20 20 30 78 41 45 2c 20 30 78 31  , .    0xAE, 0x1
2320: 33 2c 20 30 78 30 36 2c 20 30 78 46 35 2c 20 30  3, 0x06, 0xF5, 0
2330: 78 31 43 2c 20 30 78 34 45 2c 20 30 78 35 32 2c  x1C, 0x4E, 0x52,
2340: 20 30 78 46 37 0a 20 20 7d 0a 7d 3b 0a 0a 2f 2a   0xF7.  }.};../*
2350: 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e   .** Generate an
2360: 64 20 72 65 74 75 72 6e 20 73 69 6e 67 6c 65 20  d return single 
2370: 72 61 6e 64 6f 6d 20 62 79 74 65 20 0a 2a 2f 0a  random byte .*/.
2380: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
2390: 63 68 61 72 20 66 75 7a 7a 52 61 6e 64 6f 6d 42  char fuzzRandomB
23a0: 79 74 65 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73  yte(void){.  uns
23b0: 69 67 6e 65 64 20 63 68 61 72 20 74 3b 0a 20 20  igned char t;.  
23c0: 73 71 6c 69 74 65 33 50 72 6e 67 2e 69 2b 2b 3b  sqlite3Prng.i++;
23d0: 0a 20 20 74 20 3d 20 73 71 6c 69 74 65 33 50 72  .  t = sqlite3Pr
23e0: 6e 67 2e 73 5b 73 71 6c 69 74 65 33 50 72 6e 67  ng.s[sqlite3Prng
23f0: 2e 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33 50 72  .i];.  sqlite3Pr
2400: 6e 67 2e 6a 20 2b 3d 20 74 3b 0a 20 20 73 71 6c  ng.j += t;.  sql
2410: 69 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69 74  ite3Prng.s[sqlit
2420: 65 33 50 72 6e 67 2e 69 5d 20 3d 20 73 71 6c 69  e3Prng.i] = sqli
2430: 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69 74 65  te3Prng.s[sqlite
2440: 33 50 72 6e 67 2e 6a 5d 3b 0a 20 20 73 71 6c 69  3Prng.j];.  sqli
2450: 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69 74 65  te3Prng.s[sqlite
2460: 33 50 72 6e 67 2e 6a 5d 20 3d 20 74 3b 0a 20 20  3Prng.j] = t;.  
2470: 74 20 2b 3d 20 73 71 6c 69 74 65 33 50 72 6e 67  t += sqlite3Prng
2480: 2e 73 5b 73 71 6c 69 74 65 33 50 72 6e 67 2e 69  .s[sqlite3Prng.i
2490: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ];.  return sqli
24a0: 74 65 33 50 72 6e 67 2e 73 5b 74 5d 3b 0a 7d 0a  te3Prng.s[t];.}.
24b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 20  ./*.** Return N 
24c0: 72 61 6e 64 6f 6d 20 62 79 74 65 73 2e 0a 2a 2f  random bytes..*/
24d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 7a  .static void fuz
24e0: 7a 52 61 6e 64 6f 6d 42 6c 6f 62 28 69 6e 74 20  zRandomBlob(int 
24f0: 6e 42 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 63  nBuf, unsigned c
2500: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
2510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2520: 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
2530: 20 20 7a 42 75 66 5b 69 5d 20 3d 20 66 75 7a 7a    zBuf[i] = fuzz
2540: 52 61 6e 64 6f 6d 42 79 74 65 28 29 3b 0a 20 20  RandomByte();.  
2550: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2560: 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67  n a random integ
2570: 65 72 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  er between 0 and
2580: 20 6e 52 61 6e 67 65 20 28 6e 6f 74 20 69 6e 63   nRange (not inc
2590: 6c 75 73 69 76 65 29 2e 0a 2a 2f 0a 73 74 61 74  lusive)..*/.stat
25a0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
25b0: 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 75 6e  fuzzRandomInt(un
25c0: 73 69 67 6e 65 64 20 69 6e 74 20 6e 52 61 6e 67  signed int nRang
25d0: 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  e){.  unsigned i
25e0: 6e 74 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  nt ret;.  assert
25f0: 28 20 6e 52 61 6e 67 65 3e 30 20 29 3b 0a 20 20  ( nRange>0 );.  
2600: 66 75 7a 7a 52 61 6e 64 6f 6d 42 6c 6f 62 28 73  fuzzRandomBlob(s
2610: 69 7a 65 6f 66 28 72 65 74 29 2c 20 28 75 6e 73  izeof(ret), (uns
2620: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 72 65 74  igned char*)&ret
2630: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 74  );.  return (ret
2640: 20 25 20 6e 52 61 6e 67 65 29 3b 0a 7d 0a 0a 73   % nRange);.}..s
2650: 74 61 74 69 63 20 75 36 34 20 66 75 7a 7a 52 61  tatic u64 fuzzRa
2660: 6e 64 6f 6d 55 36 34 28 29 7b 0a 20 20 75 36 34  ndomU64(){.  u64
2670: 20 72 65 74 3b 0a 20 20 66 75 7a 7a 52 61 6e 64   ret;.  fuzzRand
2680: 6f 6d 42 6c 6f 62 28 73 69 7a 65 6f 66 28 72 65  omBlob(sizeof(re
2690: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t), (unsigned ch
26a0: 61 72 2a 29 26 72 65 74 29 3b 0a 20 20 72 65 74  ar*)&ret);.  ret
26b0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74 61 74  urn ret;.}..stat
26c0: 69 63 20 76 6f 69 64 20 66 75 7a 7a 52 61 6e 64  ic void fuzzRand
26d0: 6f 6d 53 65 65 64 28 75 6e 73 69 67 6e 65 64 20  omSeed(unsigned 
26e0: 69 6e 74 20 69 53 65 65 64 29 7b 0a 20 20 69 6e  int iSeed){.  in
26f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2700: 69 3c 32 35 36 3b 20 69 2b 3d 34 29 7b 0a 20 20  i<256; i+=4){.  
2710: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 73 5b    sqlite3Prng.s[
2720: 69 5d 20 5e 3d 20 28 28 69 53 65 65 64 20 3e 3e  i] ^= ((iSeed >>
2730: 20 32 34 29 20 26 20 30 78 46 46 29 3b 0a 20 20   24) & 0xFF);.  
2740: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 73 5b    sqlite3Prng.s[
2750: 69 2b 31 5d 20 5e 3d 20 28 28 69 53 65 65 64 20  i+1] ^= ((iSeed 
2760: 3e 3e 20 31 36 29 20 26 20 30 78 46 46 29 3b 0a  >> 16) & 0xFF);.
2770: 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e      sqlite3Prng.
2780: 73 5b 69 2b 32 5d 20 5e 3d 20 28 28 69 53 65 65  s[i+2] ^= ((iSee
2790: 64 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 29  d >>  8) & 0xFF)
27a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e  ;.    sqlite3Prn
27b0: 67 2e 73 5b 69 2b 33 5d 20 5e 3d 20 28 28 69 53  g.s[i+3] ^= ((iS
27c0: 65 65 64 20 3e 3e 20 20 30 29 20 26 20 30 78 46  eed >>  0) & 0xF
27d0: 46 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20  F);.  }.}./*.** 
27e0: 45 6e 64 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  End of code for 
27f0: 67 65 6e 65 72 61 74 69 6e 67 20 70 73 65 75 64  generating pseud
2800: 6f 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 73 2e  o-random values.
2810: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 74 79 70  **********/..typ
2860: 65 64 65 66 20 73 74 72 75 63 74 20 46 75 7a 7a  edef struct Fuzz
2870: 43 68 61 6e 67 65 73 65 74 20 46 75 7a 7a 43 68  Changeset FuzzCh
2880: 61 6e 67 65 73 65 74 3b 0a 74 79 70 65 64 65 66  angeset;.typedef
2890: 20 73 74 72 75 63 74 20 46 75 7a 7a 43 68 61 6e   struct FuzzChan
28a0: 67 65 73 65 74 47 72 6f 75 70 20 46 75 7a 7a 43  gesetGroup FuzzC
28b0: 68 61 6e 67 65 73 65 74 47 72 6f 75 70 3b 0a 74  hangesetGroup;.t
28c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 75  ypedef struct Fu
28d0: 7a 7a 43 68 61 6e 67 65 20 46 75 7a 7a 43 68 61  zzChange FuzzCha
28e0: 6e 67 65 3b 0a 0a 2f 2a 20 0a 2a 2a 20 4f 62 6a  nge;../* .** Obj
28f0: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ect containing p
2900: 61 72 74 69 61 6c 6c 79 20 70 61 72 73 65 64 20  artially parsed 
2910: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2f 0a 73 74  changeset..*/.st
2920: 72 75 63 74 20 46 75 7a 7a 43 68 61 6e 67 65 73  ruct FuzzChanges
2930: 65 74 20 7b 0a 20 20 69 6e 74 20 62 50 61 74 63  et {.  int bPatc
2940: 68 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  hset;           
2950: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2960: 6f 72 20 61 20 70 61 74 63 68 73 65 74 20 2a 2f  or a patchset */
2970: 0a 20 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74  .  FuzzChangeset
2980: 47 72 6f 75 70 20 2a 2a 61 70 47 72 6f 75 70 3b  Group **apGroup;
2990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 67     /* Array of g
29a0: 72 6f 75 70 73 20 69 6e 20 63 68 61 6e 67 65 73  roups in changes
29b0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 47 72 6f  et */.  int nGro
29c0: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  up;             
29d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29e0: 72 20 6f 66 20 69 74 65 6d 73 20 69 6e 20 6c 69  r of items in li
29f0: 73 74 20 70 47 72 6f 75 70 20 2a 2f 0a 20 20 75  st pGroup */.  u
2a00: 38 20 2a 2a 61 70 56 61 6c 3b 20 20 20 20 20 20  8 **apVal;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a20: 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 76  * Array of all v
2a30: 61 6c 75 65 73 20 69 6e 20 63 68 61 6e 67 65 73  alues in changes
2a40: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  et */.  int nVal
2a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a70: 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20  r of used slots 
2a80: 69 6e 20 61 70 56 61 6c 5b 5d 20 2a 2f 0a 20 20  in apVal[] */.  
2a90: 69 6e 74 20 6e 43 68 61 6e 67 65 3b 20 20 20 20  int nChange;    
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
2ac0: 6e 67 65 73 20 69 6e 20 63 68 61 6e 67 65 73 65  nges in changese
2ad0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 70 64 61  t */.  int nUpda
2ae0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b00: 20 6f 66 20 55 50 44 41 54 45 20 63 68 61 6e 67   of UPDATE chang
2b10: 65 73 20 69 6e 20 63 68 61 6e 67 65 73 65 74 20  es in changeset 
2b20: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
2b30: 65 72 65 20 69 73 20 6f 6e 65 20 6f 62 6a 65 63  ere is one objec
2b40: 74 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66  t of this type f
2b50: 6f 72 20 65 61 63 68 20 63 68 61 6e 67 65 2d 67  or each change-g
2b60: 72 6f 75 70 20 28 74 61 62 6c 65 20 68 65 61 64  roup (table head
2b70: 65 72 29 0a 2a 2a 20 69 6e 20 74 68 65 20 69 6e  er).** in the in
2b80: 70 75 74 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a  put changeset..*
2b90: 2f 0a 73 74 72 75 63 74 20 46 75 7a 7a 43 68 61  /.struct FuzzCha
2ba0: 6e 67 65 73 65 74 47 72 6f 75 70 20 7b 0a 20 20  ngesetGroup {.  
2bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
2be0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c10: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  of columns in ta
2c20: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 50 4b  ble */.  u8 *aPK
2c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 4b 20 61           /* PK a
2c50: 72 72 61 79 20 66 6f 72 20 74 68 69 73 20 74 61  rray for this ta
2c60: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 43 68  ble */.  u8 *aCh
2c70: 61 6e 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  ange;           
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
2c90: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 72  er containing ar
2ca0: 72 61 79 20 6f 66 20 63 68 61 6e 67 65 73 20 2a  ray of changes *
2cb0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 61 6e 67 65  /.  int szChange
2cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cd0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
2ce0: 75 66 66 65 72 20 61 43 68 61 6e 67 65 5b 5d 20  uffer aChange[] 
2cf0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
2d00: 74 20 6e 43 68 61 6e 67 65 3b 20 20 20 20 20 20  t nChange;      
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   Number of chang
2d30: 65 73 20 69 6e 20 62 75 66 66 65 72 20 61 43 68  es in buffer aCh
2d40: 61 6e 67 65 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ange[] */.};../*
2d50: 0a 2a 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20  .** Description 
2d60: 6f 66 20 61 20 66 75 7a 7a 20 63 68 61 6e 67 65  of a fuzz change
2d70: 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20 74   to be applied t
2d80: 6f 20 61 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a  o a changeset..*
2d90: 2f 0a 73 74 72 75 63 74 20 46 75 7a 7a 43 68 61  /.struct FuzzCha
2da0: 6e 67 65 20 7b 0a 20 20 69 6e 74 20 65 54 79 70  nge {.  int eTyp
2db0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2dd0: 66 20 74 68 65 20 46 55 5a 5a 5f 2a 20 63 6f 6e  f the FUZZ_* con
2de0: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2df0: 20 20 69 6e 74 20 69 43 68 61 6e 67 65 3b 20 20    int iChange;  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 2f 2a 20 43 68 61 6e 67 65 20 6f 72 20 55    /* Change or U
2e20: 50 44 41 54 45 20 74 6f 20 6d 6f 64 69 66 79 20  PDATE to modify 
2e30: 2a 2f 0a 20 20 69 6e 74 20 69 47 72 6f 75 70 3b  */.  int iGroup;
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 20 74 6f       /* Group to
2e60: 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 69 6e 74   modify */.  int
2e70: 20 69 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20   iDelete;       
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e90: 46 69 65 6c 64 20 74 6f 20 72 65 6d 6f 76 65 20  Field to remove 
2ea0: 28 46 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 44 45 4c  (FUZZ_COLUMN_DEL
2eb0: 29 20 2a 2f 0a 20 20 75 38 20 2a 70 53 75 62 31  ) */.  u8 *pSub1
2ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ed0: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
2ee0: 65 20 74 68 69 73 20 76 61 6c 75 65 20 77 69 74  e this value wit
2ef0: 68 20 70 53 75 62 32 20 2a 2f 0a 20 20 75 38 20  h pSub2 */.  u8 
2f00: 2a 70 53 75 62 32 3b 20 20 20 20 20 20 20 20 20  *pSub2;         
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 41 6e 64 20 74 68 69 73 20 6f 6e 65 20 77 69 74  And this one wit
2f30: 68 20 70 53 75 62 31 20 2a 2f 0a 20 20 75 38 20  h pSub1 */.  u8 
2f40: 61 53 75 62 5b 31 32 38 5d 3b 20 20 20 20 20 20  aSub[128];      
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f60: 42 75 66 66 65 72 20 66 6f 72 20 73 75 62 73 74  Buffer for subst
2f70: 69 74 75 74 65 20 76 61 6c 75 65 20 2a 2f 0a 20  itute value */. 
2f80: 20 69 6e 74 20 69 43 75 72 72 65 6e 74 3b 20 20   int iCurrent;  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 61 6e   /* Current chan
2fb0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a  ge number */.};.
2fc0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2fd0: 61 6e 64 20 72 65 74 75 72 6e 20 6e 42 79 74 65  and return nByte
2fe0: 20 62 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64   bytes of zeroed
2ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
3000: 69 63 20 76 6f 69 64 20 2a 66 75 7a 7a 4d 61 6c  ic void *fuzzMal
3010: 6c 6f 63 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  loc(sqlite3_int6
3020: 34 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  4 nByte){.  void
3030: 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
3040: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
3050: 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
3060: 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
3070: 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74   0, (size_t)nByt
3080: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
3090: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
30a0: 46 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  Free the buffer 
30b0: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
30c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
30d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30e0: 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 66 72 65  s used.** to fre
30f0: 65 20 62 75 66 66 65 72 73 20 61 6c 6c 6f 63 61  e buffers alloca
3100: 74 65 64 20 62 79 20 66 75 7a 7a 4d 61 6c 6c 6f  ted by fuzzMallo
3110: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  c()..*/.static v
3120: 6f 69 64 20 66 75 7a 7a 46 72 65 65 28 76 6f 69  oid fuzzFree(voi
3130: 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  d *p){.  sqlite3
3140: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
3150: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
3160: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
3170: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
3180: 51 4c 69 74 65 20 76 61 72 69 6e 74 20 74 68 61  QLite varint tha
3190: 74 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 0a  t, assuming the.
31a0: 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20  ** input is not 
31b0: 63 6f 72 72 75 70 74 2c 20 6d 61 79 20 62 65 20  corrupt, may be 
31c0: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
31d0: 37 46 46 46 46 46 46 46 2c 20 69 6e 63 6c 75 73  7FFFFFFF, inclus
31e0: 69 76 65 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72  ive. Before.** r
31f0: 65 74 75 72 6e 69 6e 67 2c 20 74 68 69 73 20 66  eturning, this f
3200: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 28 2a 70  unction sets (*p
3210: 6e 56 61 6c 29 20 74 6f 20 74 68 65 20 76 61 6c  nVal) to the val
3220: 75 65 20 6f 66 20 74 68 61 74 20 76 61 72 69 6e  ue of that varin
3230: 74 2c 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  t, and.** return
3240: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3250: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
3260: 68 61 74 20 69 74 20 74 61 6b 65 73 20 75 70 2e  hat it takes up.
3270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3280: 75 7a 7a 47 65 74 56 61 72 69 6e 74 28 75 38 20  uzzGetVarint(u8 
3290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 56 61 6c 29 7b  *p, int *pnVal){
32a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
32b0: 74 65 33 5f 75 69 6e 74 36 34 20 6e 56 61 6c 20  te3_uint64 nVal 
32c0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
32d0: 69 3c 39 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  i<9; i++){.    n
32e0: 56 61 6c 20 3d 20 28 6e 56 61 6c 3c 3c 37 29 20  Val = (nVal<<7) 
32f0: 2b 20 28 70 5b 69 5d 20 26 20 30 78 37 46 29 3b  + (p[i] & 0x7F);
3300: 0a 20 20 20 20 69 66 28 20 28 70 5b 69 5d 20 26  .    if( (p[i] &
3310: 20 30 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0x80)==0 ){.   
3320: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72     i++;.      br
3330: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3340: 20 2a 70 6e 56 61 6c 20 3d 20 28 69 6e 74 29 6e   *pnVal = (int)n
3350: 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  Val;.  return i;
3360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3370: 76 61 6c 75 65 20 6e 56 61 6c 20 69 6e 74 6f 20  value nVal into 
3380: 74 68 65 20 62 75 66 66 65 72 20 69 6e 64 69 63  the buffer indic
3390: 61 74 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74  ated by argument
33a0: 20 70 20 61 73 20 61 6e 20 53 51 4c 69 74 65 0a   p as an SQLite.
33b0: 2a 2a 20 76 61 72 69 6e 74 2e 20 6e 56 61 6c 20  ** varint. nVal 
33c0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
33d0: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
33e0: 64 20 28 32 5e 32 31 2d 31 29 2c 20 69 6e 63 6c  d (2^21-1), incl
33f0: 75 73 69 76 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  usive..** Return
3400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3410: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ytes written to 
3420: 62 75 66 66 65 72 20 70 2e 0a 2a 2f 0a 73 74 61  buffer p..*/.sta
3430: 74 69 63 20 69 6e 74 20 66 75 7a 7a 50 75 74 56  tic int fuzzPutV
3440: 61 72 69 6e 74 28 75 38 20 2a 70 2c 20 69 6e 74  arint(u8 *p, int
3450: 20 6e 56 61 6c 29 7b 0a 20 20 61 73 73 65 72 74   nVal){.  assert
3460: 28 20 6e 56 61 6c 3e 30 20 26 26 20 6e 56 61 6c  ( nVal>0 && nVal
3470: 3c 32 30 39 37 31 35 32 20 29 3b 0a 20 20 69 66  <2097152 );.  if
3480: 28 20 6e 56 61 6c 3c 31 32 38 20 29 7b 0a 20 20  ( nVal<128 ){.  
3490: 20 20 70 5b 30 5d 20 3d 20 28 75 38 29 6e 56 61    p[0] = (u8)nVa
34a0: 6c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  l;.    return 1;
34b0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 56 61 6c 3c  .  }.  if( nVal<
34c0: 31 36 33 38 34 20 29 7b 0a 20 20 20 20 70 5b 30  16384 ){.    p[0
34d0: 5d 20 3d 20 28 28 6e 56 61 6c 20 3e 3e 20 37 29  ] = ((nVal >> 7)
34e0: 20 26 20 30 78 37 46 29 20 7c 20 30 78 38 30 3b   & 0x7F) | 0x80;
34f0: 0a 20 20 20 20 70 5b 31 5d 20 3d 20 28 6e 56 61  .    p[1] = (nVa
3500: 6c 20 26 20 30 78 37 46 29 3b 0a 20 20 20 20 72  l & 0x7F);.    r
3510: 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20  eturn 2;.  }..  
3520: 70 5b 30 5d 20 3d 20 28 28 6e 56 61 6c 20 3e 3e  p[0] = ((nVal >>
3530: 20 31 34 29 20 26 20 30 78 37 46 29 20 7c 20 30   14) & 0x7F) | 0
3540: 78 38 30 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 28  x80;.  p[1] = ((
3550: 6e 56 61 6c 20 3e 3e 20 37 29 20 26 20 30 78 37  nVal >> 7) & 0x7
3560: 46 29 20 7c 20 30 78 38 30 3b 0a 20 20 70 5b 32  F) | 0x80;.  p[2
3570: 5d 20 3d 20 28 6e 56 61 6c 20 26 20 30 78 37 46  ] = (nVal & 0x7F
3580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 33 3b 0a 7d  );.  return 3;.}
3590: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 36  ../*.** Read a 6
35a0: 34 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e  4-bit big-endian
35b0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
35c0: 72 6f 6d 20 62 75 66 66 65 72 20 61 52 65 63 5b  rom buffer aRec[
35d0: 5d 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  ]. Return.** the
35e0: 20 76 61 6c 75 65 20 72 65 61 64 2e 0a 2a 2f 0a   value read..*/.
35f0: 73 74 61 74 69 63 20 69 36 34 20 66 75 7a 7a 47  static i64 fuzzG
3600: 65 74 49 36 34 28 75 38 20 2a 61 52 65 63 29 7b  etI64(u8 *aRec){
3610: 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 28  .  return (i64)(
3620: 0a 20 20 20 20 20 20 28 28 28 75 36 34 29 61 52  .      (((u64)aR
3630: 65 63 5b 30 5d 29 20 3c 3c 20 35 36 29 0a 20 20  ec[0]) << 56).  
3640: 20 20 2b 20 28 28 28 75 36 34 29 61 52 65 63 5b    + (((u64)aRec[
3650: 31 5d 29 20 3c 3c 20 34 38 29 0a 20 20 20 20 2b  1]) << 48).    +
3660: 20 28 28 28 75 36 34 29 61 52 65 63 5b 32 5d 29   (((u64)aRec[2])
3670: 20 3c 3c 20 34 30 29 0a 20 20 20 20 2b 20 28 28   << 40).    + ((
3680: 28 75 36 34 29 61 52 65 63 5b 33 5d 29 20 3c 3c  (u64)aRec[3]) <<
3690: 20 33 32 29 0a 20 20 20 20 2b 20 28 28 28 75 36   32).    + (((u6
36a0: 34 29 61 52 65 63 5b 34 5d 29 20 3c 3c 20 32 34  4)aRec[4]) << 24
36b0: 29 0a 20 20 20 20 2b 20 28 28 28 75 36 34 29 61  ).    + (((u64)a
36c0: 52 65 63 5b 35 5d 29 20 3c 3c 20 31 36 29 0a 20  Rec[5]) << 16). 
36d0: 20 20 20 2b 20 28 28 28 75 36 34 29 61 52 65 63     + (((u64)aRec
36e0: 5b 36 5d 29 20 3c 3c 20 20 38 29 0a 20 20 20 20  [6]) <<  8).    
36f0: 2b 20 28 28 28 75 36 34 29 61 52 65 63 5b 37 5d  + (((u64)aRec[7]
3700: 29 20 3c 3c 20 20 30 29 0a 20 20 29 3b 0a 7d 0a  ) <<  0).  );.}.
3710: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 76 61 6c  ./*.** Write val
3720: 75 65 20 69 56 61 6c 20 74 6f 20 62 75 66 66 65  ue iVal to buffe
3730: 72 20 61 52 65 63 5b 5d 20 61 73 20 61 6e 20 75  r aRec[] as an u
3740: 6e 73 69 67 6e 65 64 20 36 34 2d 62 69 74 20 62  nsigned 64-bit b
3750: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
3760: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3770: 64 20 66 75 7a 7a 50 75 74 55 36 34 28 75 38 20  d fuzzPutU64(u8 
3780: 2a 61 52 65 63 2c 20 75 36 34 20 69 56 61 6c 29  *aRec, u64 iVal)
3790: 7b 0a 20 20 61 52 65 63 5b 30 5d 20 3d 20 28 69  {.  aRec[0] = (i
37a0: 56 61 6c 3e 3e 35 36 29 20 26 20 30 78 46 46 3b  Val>>56) & 0xFF;
37b0: 0a 20 20 61 52 65 63 5b 31 5d 20 3d 20 28 69 56  .  aRec[1] = (iV
37c0: 61 6c 3e 3e 34 38 29 20 26 20 30 78 46 46 3b 0a  al>>48) & 0xFF;.
37d0: 20 20 61 52 65 63 5b 32 5d 20 3d 20 28 69 56 61    aRec[2] = (iVa
37e0: 6c 3e 3e 34 30 29 20 26 20 30 78 46 46 3b 0a 20  l>>40) & 0xFF;. 
37f0: 20 61 52 65 63 5b 33 5d 20 3d 20 28 69 56 61 6c   aRec[3] = (iVal
3800: 3e 3e 33 32 29 20 26 20 30 78 46 46 3b 0a 20 20  >>32) & 0xFF;.  
3810: 61 52 65 63 5b 34 5d 20 3d 20 28 69 56 61 6c 3e  aRec[4] = (iVal>
3820: 3e 32 34 29 20 26 20 30 78 46 46 3b 0a 20 20 61  >24) & 0xFF;.  a
3830: 52 65 63 5b 35 5d 20 3d 20 28 69 56 61 6c 3e 3e  Rec[5] = (iVal>>
3840: 31 36 29 20 26 20 30 78 46 46 3b 0a 20 20 61 52  16) & 0xFF;.  aR
3850: 65 63 5b 36 5d 20 3d 20 28 69 56 61 6c 3e 3e 20  ec[6] = (iVal>> 
3860: 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 52 65  8) & 0xFF;.  aRe
3870: 63 5b 37 5d 20 3d 20 28 69 56 61 6c 29 20 20 20  c[7] = (iVal)   
3880: 20 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a    & 0xFF;.}../*.
3890: 2a 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c  ** Parse a singl
38a0: 65 20 74 61 62 6c 65 2d 68 65 61 64 65 72 20 66  e table-header f
38b0: 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e 20 41  rom the input. A
38c0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 63 68  llocate a new ch
38d0: 61 6e 67 65 2d 67 72 6f 75 70 0a 2a 2a 20 6f 62  ange-group.** ob
38e0: 6a 65 63 74 20 77 69 74 68 20 74 68 65 20 72 65  ject with the re
38f0: 73 75 6c 74 73 2e 20 52 65 74 75 72 6e 20 53 51  sults. Return SQ
3900: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
3910: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 65 72 72  ssful, or an err
3920: 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68 65 72  or code.** other
3930: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
3940: 69 6e 74 20 66 75 7a 7a 50 61 72 73 65 48 65 61  int fuzzParseHea
3950: 64 65 72 28 0a 20 20 46 75 7a 7a 43 68 61 6e 67  der(.  FuzzChang
3960: 65 73 65 74 20 2a 70 50 61 72 73 65 2c 20 20 20  eset *pParse,   
3970: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
3980: 73 65 74 20 70 61 72 73 65 20 6f 62 6a 65 63 74  set parse object
3990: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 48 64 72   */.  u8 **ppHdr
39a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39b0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
39c0: 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   Iterator */.  u
39d0: 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  8 *pEnd,        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
39f0: 2a 20 31 20 62 79 74 65 20 70 61 73 74 20 45 4f  * 1 byte past EO
3a00: 46 20 2a 2f 0a 20 20 46 75 7a 7a 43 68 61 6e 67  F */.  FuzzChang
3a10: 65 73 65 74 47 72 6f 75 70 20 2a 2a 70 70 47 72  esetGroup **ppGr
3a20: 70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e  p      /* OUT: N
3a30: 65 77 20 63 68 61 6e 67 65 2d 67 72 6f 75 70 20  ew change-group 
3a40: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
3a50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3a60: 4b 3b 0a 20 20 46 75 7a 7a 43 68 61 6e 67 65 73  K;.  FuzzChanges
3a70: 65 74 47 72 6f 75 70 20 2a 70 47 72 70 3b 0a 20  etGroup *pGrp;. 
3a80: 20 75 38 20 63 48 64 72 20 3d 20 28 70 50 61 72   u8 cHdr = (pPar
3a90: 73 65 2d 3e 62 50 61 74 63 68 73 65 74 20 3f 20  se->bPatchset ? 
3aa0: 27 50 27 20 3a 20 27 54 27 29 3b 0a 0a 20 20 61  'P' : 'T');..  a
3ab0: 73 73 65 72 74 28 20 70 45 6e 64 3e 28 2a 70 70  ssert( pEnd>(*pp
3ac0: 48 64 72 29 20 29 3b 0a 20 20 70 47 72 70 20 3d  Hdr) );.  pGrp =
3ad0: 20 28 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 47   (FuzzChangesetG
3ae0: 72 6f 75 70 2a 29 66 75 7a 7a 4d 61 6c 6c 6f 63  roup*)fuzzMalloc
3af0: 28 73 69 7a 65 6f 66 28 46 75 7a 7a 43 68 61 6e  (sizeof(FuzzChan
3b00: 67 65 73 65 74 47 72 6f 75 70 29 29 3b 0a 20 20  gesetGroup));.  
3b10: 69 66 28 20 21 70 47 72 70 20 29 7b 0a 20 20 20  if( !pGrp ){.   
3b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
3b30: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
3b40: 20 75 38 20 2a 70 20 3d 20 2a 70 70 48 64 72 3b   u8 *p = *ppHdr;
3b50: 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 21 3d 63  .    if( p[0]!=c
3b60: 48 64 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Hdr ){.      rc 
3b70: 3d 20 66 75 7a 7a 43 6f 72 72 75 70 74 28 29 3b  = fuzzCorrupt();
3b80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b90: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 70 20 2b    p++;.      p +
3ba0: 3d 20 66 75 7a 7a 47 65 74 56 61 72 69 6e 74 28  = fuzzGetVarint(
3bb0: 70 2c 20 26 70 47 72 70 2d 3e 6e 43 6f 6c 29 3b  p, &pGrp->nCol);
3bc0: 0a 20 20 20 20 20 20 70 47 72 70 2d 3e 61 50 4b  .      pGrp->aPK
3bd0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 2b 3d   = p;.      p +=
3be0: 20 70 47 72 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pGrp->nCol;.   
3bf0: 20 20 20 70 47 72 70 2d 3e 7a 54 61 62 20 3d 20     pGrp->zTab = 
3c00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 3b 0a  (const char*)p;.
3c10: 20 20 20 20 20 20 70 20 3d 20 26 70 5b 73 74 72        p = &p[str
3c20: 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  len((const char*
3c30: 29 70 29 2b 31 5d 3b 0a 0a 20 20 20 20 20 20 69  )p)+1];..      i
3c40: 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20  f( p>=pEnd ){.  
3c50: 20 20 20 20 20 20 72 63 20 3d 20 66 75 7a 7a 43        rc = fuzzC
3c60: 6f 72 72 75 70 74 28 29 3b 0a 20 20 20 20 20 20  orrupt();.      
3c70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 48  }.    }.    *ppH
3c80: 64 72 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 69  dr = p;.  }..  i
3c90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3ca0: 20 29 7b 0a 20 20 20 20 66 75 7a 7a 46 72 65 65   ){.    fuzzFree
3cb0: 28 70 47 72 70 29 3b 0a 20 20 20 20 70 47 72 70  (pGrp);.    pGrp
3cc0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70   = 0;.  }..  *pp
3cd0: 47 72 70 20 3d 20 70 47 72 70 3b 0a 20 20 72 65  Grp = pGrp;.  re
3ce0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3cf0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69  * Argument p poi
3d00: 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
3d10: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 69 6e  containing a sin
3d20: 67 6c 65 20 63 68 61 6e 67 65 73 65 74 2d 72 65  gle changeset-re
3d30: 63 6f 72 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cord value. .** 
3d40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
3d50: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
3d60: 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
3d70: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 62 79 74  the value in byt
3d80: 65 73 2e 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  es. If.** succes
3d90: 73 66 75 6c 2c 20 69 74 20 73 65 74 73 20 28 2a  sful, it sets (*
3da0: 70 53 7a 29 20 74 6f 20 74 68 65 20 73 69 7a 65  pSz) to the size
3db0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
3dc0: 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74  ITE_OK. Or, if t
3dd0: 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 64 6f 65  he.** buffer doe
3de0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
3df0: 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 53 51 4c  valid value, SQL
3e00: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
3e10: 65 74 75 72 6e 65 64 20 61 6e 64 0a 2a 2a 20 74  eturned and.** t
3e20: 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
3e30: 66 20 28 2a 70 53 7a 29 20 69 73 20 75 6e 64 65  f (*pSz) is unde
3e40: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
3e50: 20 69 6e 74 20 66 75 7a 7a 43 68 61 6e 67 65 53   int fuzzChangeS
3e60: 69 7a 65 28 75 38 20 2a 70 2c 20 69 6e 74 20 2a  ize(u8 *p, int *
3e70: 70 53 7a 29 7b 0a 20 20 75 38 20 65 54 79 70 65  pSz){.  u8 eType
3e80: 20 3d 20 70 5b 30 5d 3b 0a 20 20 73 77 69 74 63   = p[0];.  switc
3e90: 68 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20  h( eType ){.    
3ea0: 63 61 73 65 20 30 78 30 30 3a 20 20 20 20 20 20  case 0x00:      
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ec0: 20 75 6e 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20   undefined */.  
3ed0: 20 20 63 61 73 65 20 30 78 30 35 3a 20 20 20 20    case 0x05:    
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 2f 2a 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* null */.     
3f00: 20 2a 70 53 7a 20 3d 20 31 3b 0a 20 20 20 20 20   *pSz = 1;.     
3f10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
3f20: 65 20 30 78 30 31 3a 20 20 20 20 20 20 20 20 20  e 0x01:         
3f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
3f40: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
3f50: 65 20 30 78 30 32 3a 20 20 20 20 20 20 20 20 20  e 0x02:         
3f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65             /* re
3f70: 61 6c 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 7a  al */.      *pSz
3f80: 20 3d 20 39 3b 0a 20 20 20 20 20 20 62 72 65 61   = 9;.      brea
3f90: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 30 78 30  k;..    case 0x0
3fa0: 33 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3:              
3fb0: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 2a 2f        /* text */
3fc0: 0a 20 20 20 20 63 61 73 65 20 30 78 30 34 3a 20  .    case 0x04: 
3fd0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
3fe0: 20 20 20 2f 2a 20 62 6c 6f 62 20 2a 2f 0a 20 20     /* blob */.  
3ff0: 20 20 20 20 69 6e 74 20 6e 54 78 74 3b 0a 20 20      int nTxt;.  
4000: 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
4010: 20 20 73 7a 20 3d 20 66 75 7a 7a 47 65 74 56 61    sz = fuzzGetVa
4020: 72 69 6e 74 28 26 70 5b 31 5d 2c 20 26 6e 54 78  rint(&p[1], &nTx
4030: 74 29 3b 0a 20 20 20 20 20 20 2a 70 53 7a 20 3d  t);.      *pSz =
4040: 20 31 20 2b 20 73 7a 20 2b 20 6e 54 78 74 3b 0a   1 + sz + nTxt;.
4050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4060: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
4070: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 75  .      return fu
4080: 7a 7a 43 6f 72 72 75 70 74 28 29 3b 0a 20 20 7d  zzCorrupt();.  }
4090: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
40a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  _OK;.}../*.** Wh
40b0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
40c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 28 2a 70 70   is called, (*pp
40d0: 52 65 63 29 20 70 6f 69 6e 74 73 20 74 6f 20 74  Rec) points to t
40e0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 0a 2a  he start of a .*
40f0: 2a 20 72 65 63 6f 72 64 20 69 6e 20 61 20 63 68  * record in a ch
4100: 61 6e 67 65 73 65 74 20 62 65 69 6e 67 20 70 61  angeset being pa
4110: 72 73 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rsed. This funct
4120: 69 6f 6e 20 61 64 64 73 20 65 6e 74 72 69 65 73  ion adds entries
4130: 0a 2a 2a 20 74 6f 20 74 68 65 20 70 50 61 72 73  .** to the pPars
4140: 65 2d 3e 61 70 56 61 6c 5b 5d 20 61 72 72 61 79  e->apVal[] array
4150: 20 66 6f 72 20 61 6c 6c 20 76 61 6c 75 65 73 20   for all values 
4160: 61 6e 64 20 61 64 76 61 6e 63 65 73 20 28 2a 70  and advances (*p
4170: 70 52 65 63 29 20 0a 2a 2a 20 74 6f 20 6f 6e 65  pRec) .** to one
4180: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
4190: 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
41a0: 2e 20 41 72 67 75 6d 65 6e 74 20 70 45 6e 64 20  . Argument pEnd 
41b0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 6f 6e 65  points to.** one
41c0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
41d0: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
41e0: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a  changeset..**.**
41f0: 20 41 72 67 75 6d 65 6e 74 20 62 50 6b 4f 6e 6c   Argument bPkOnl
4200: 79 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  y is true if the
4210: 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 70 61   record being pa
4220: 72 73 65 64 20 69 73 20 70 61 72 74 20 6f 66 0a  rsed is part of.
4230: 2a 2a 20 61 20 44 45 4c 45 54 45 20 72 65 63 6f  ** a DELETE reco
4240: 72 64 20 69 6e 20 61 20 70 61 74 63 68 73 65 74  rd in a patchset
4250: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
4260: 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d  all non-primary-
4270: 6b 65 79 0a 2a 2a 20 66 69 65 6c 64 73 20 68 61  key.** fields ha
4280: 76 65 20 62 65 65 6e 20 6f 6d 69 74 74 65 64 20  ve been omitted 
4290: 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
42a0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
42b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
42c0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
42d0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
42e0: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
42f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 7a  /.static int fuz
4300: 7a 50 61 72 73 65 52 65 63 6f 72 64 28 0a 20 20  zParseRecord(.  
4310: 75 38 20 2a 2a 70 70 52 65 63 2c 20 20 20 20 20  u8 **ppRec,     
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 74 65 72 61  /* IN/OUT: Itera
4340: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  tor */.  u8 *pEn
4350: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
4360: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
4370: 62 79 74 65 20 61 66 74 65 72 20 65 6e 64 20 6f  byte after end o
4380: 66 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a  f input data */.
4390: 20 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 20    FuzzChangeset 
43a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
43b0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 70    /* Changeset p
43c0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
43d0: 20 20 69 6e 74 20 62 50 6b 4f 6e 6c 79 20 20 20    int bPkOnly   
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e    /* True if non
4400: 2d 50 4b 20 66 69 65 6c 64 73 20 6f 6d 69 74 74  -PK fields omitt
4410: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
4420: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4430: 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 47 72   FuzzChangesetGr
4440: 6f 75 70 20 2a 70 47 72 70 20 3d 20 70 50 61 72  oup *pGrp = pPar
4450: 73 65 2d 3e 61 70 47 72 6f 75 70 5b 70 50 61 72  se->apGroup[pPar
4460: 73 65 2d 3e 6e 47 72 6f 75 70 2d 31 5d 3b 0a 20  se->nGroup-1];. 
4470: 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 20   int i;.  u8 *p 
4480: 3d 20 2a 70 70 52 65 63 3b 0a 0a 20 20 66 6f 72  = *ppRec;..  for
4490: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
44a0: 5f 4f 4b 20 26 26 20 69 3c 70 47 72 70 2d 3e 6e  _OK && i<pGrp->n
44b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
44c0: 66 28 20 62 50 6b 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( bPkOnly==0 ||
44d0: 20 70 47 72 70 2d 3e 61 50 4b 5b 69 5d 20 29 7b   pGrp->aPK[i] ){
44e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
44f0: 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64       if( p>=pEnd
4500: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4510: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 56 61  if( (pParse->nVa
4520: 6c 20 26 20 28 70 50 61 72 73 65 2d 3e 6e 56 61  l & (pParse->nVa
4530: 6c 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  l-1))==0 ){.    
4540: 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
4550: 50 61 72 73 65 2d 3e 6e 56 61 6c 20 3f 20 70 50  Parse->nVal ? pP
4560: 61 72 73 65 2d 3e 6e 56 61 6c 2a 32 20 3a 20 34  arse->nVal*2 : 4
4570: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 2a 61  ;.        u8 **a
4580: 70 4e 65 77 20 3d 20 28 75 38 2a 2a 29 73 71 6c  pNew = (u8**)sql
4590: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 61  ite3_realloc(pPa
45a0: 72 73 65 2d 3e 61 70 56 61 6c 2c 20 6e 4e 65 77  rse->apVal, nNew
45b0: 2a 73 69 7a 65 6f 66 28 75 38 2a 29 29 3b 0a 20  *sizeof(u8*));. 
45c0: 20 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77         if( apNew
45d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
45e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
45f0: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 6c     pParse->apVal
4600: 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   = apNew;.      
4610: 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
4620: 61 70 56 61 6c 5b 70 50 61 72 73 65 2d 3e 6e 56  apVal[pParse->nV
4630: 61 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20  al++] = p;.     
4640: 20 72 63 20 3d 20 66 75 7a 7a 43 68 61 6e 67 65   rc = fuzzChange
4650: 53 69 7a 65 28 70 2c 20 26 73 7a 29 3b 0a 20 20  Size(p, &sz);.  
4660: 20 20 20 20 70 20 2b 3d 20 73 7a 3b 0a 20 20 20      p += sz;.   
4670: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
4680: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
4690: 3c 70 47 72 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pGrp->nCol ){. 
46a0: 20 20 20 72 63 20 3d 20 66 75 7a 7a 43 6f 72 72     rc = fuzzCorr
46b0: 75 70 74 28 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  upt();.  }..  *p
46c0: 70 52 65 63 20 3d 20 70 3b 0a 20 20 72 65 74 75  pRec = p;.  retu
46d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
46e0: 50 61 72 73 65 20 74 68 65 20 61 72 72 61 79 20  Parse the array 
46f0: 6f 66 20 63 68 61 6e 67 65 73 20 73 74 61 72 74  of changes start
4700: 69 6e 67 20 61 74 20 28 2a 70 70 44 61 74 61 29  ing at (*ppData)
4710: 20 61 6e 64 20 61 64 64 20 65 6e 74 72 69 65 73   and add entries
4720: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 76 61 6c 75   for.** all valu
4730: 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
4740: 2d 3e 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 2e  ->apVal[] array.
4750: 20 41 72 67 75 6d 65 6e 74 20 70 45 6e 64 20 70   Argument pEnd p
4760: 6f 69 6e 74 73 20 74 6f 20 6f 6e 65 20 62 79 74  oints to one byt
4770: 65 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e  e.** past the en
4780: 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 63  d of the input c
4790: 68 61 6e 67 65 73 65 74 2e 20 49 66 20 73 75 63  hangeset. If suc
47a0: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 28 2a 70  cessful, set (*p
47b0: 70 44 61 74 61 29 20 74 6f 20 70 6f 69 6e 74 0a  pData) to point.
47c0: 2a 2a 20 74 6f 20 6f 6e 65 20 62 79 74 65 20 70  ** to one byte p
47d0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
47e0: 68 65 20 63 68 61 6e 67 65 20 61 72 72 61 79 20  he change array 
47f0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4800: 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
4810: 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  se, return an SQ
4820: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
4830: 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
4840: 20 6f 66 20 28 2a 70 70 44 61 74 61 29 20 69 73   of (*ppData) is
4850: 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  .** undefined in
4860: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
4870: 74 61 74 69 63 20 69 6e 74 20 66 75 7a 7a 50 61  tatic int fuzzPa
4880: 72 73 65 43 68 61 6e 67 65 73 28 75 38 20 2a 2a  rseChanges(u8 **
4890: 70 70 44 61 74 61 2c 20 75 38 20 2a 70 45 6e 64  ppData, u8 *pEnd
48a0: 2c 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 20  , FuzzChangeset 
48b0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 75 38 20 63  *pParse){.  u8 c
48c0: 48 64 72 20 3d 20 28 70 50 61 72 73 65 2d 3e 62  Hdr = (pParse->b
48d0: 50 61 74 63 68 73 65 74 20 3f 20 27 50 27 20 3a  Patchset ? 'P' :
48e0: 20 27 54 27 29 3b 0a 20 20 46 75 7a 7a 43 68 61   'T');.  FuzzCha
48f0: 6e 67 65 73 65 74 47 72 6f 75 70 20 2a 70 47 72  ngesetGroup *pGr
4900: 70 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 47 72  p = pParse->apGr
4910: 6f 75 70 5b 70 50 61 72 73 65 2d 3e 6e 47 72 6f  oup[pParse->nGro
4920: 75 70 2d 31 5d 3b 0a 20 20 69 6e 74 20 72 63 20  up-1];.  int rc 
4930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
4940: 38 20 2a 70 20 3d 20 2a 70 70 44 61 74 61 3b 0a  8 *p = *ppData;.
4950: 0a 20 20 70 47 72 70 2d 3e 61 43 68 61 6e 67 65  .  pGrp->aChange
4960: 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 72   = p;.  while( r
4970: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4980: 70 3c 70 45 6e 64 20 26 26 20 70 5b 30 5d 21 3d  p<pEnd && p[0]!=
4990: 63 48 64 72 20 29 7b 0a 20 20 20 20 75 38 20 65  cHdr ){.    u8 e
49a0: 4f 70 20 3d 20 70 5b 30 5d 3b 0a 20 20 20 20 75  Op = p[0];.    u
49b0: 38 20 62 49 6e 64 69 72 65 63 74 20 3d 20 70 5b  8 bIndirect = p[
49c0: 31 5d 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 32 3b  1];..    p += 2;
49d0: 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 51  .    if( eOp==SQ
49e0: 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20  LITE_UPDATE ){. 
49f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 55 70       pParse->nUp
4a00: 64 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  date++;.      if
4a10: 28 20 70 50 61 72 73 65 2d 3e 62 50 61 74 63 68  ( pParse->bPatch
4a20: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
4a30: 20 20 72 63 20 3d 20 66 75 7a 7a 50 61 72 73 65    rc = fuzzParse
4a40: 52 65 63 6f 72 64 28 26 70 2c 20 70 45 6e 64 2c  Record(&p, pEnd,
4a50: 20 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20   pParse, 0);.   
4a60: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
4a70: 66 28 20 65 4f 70 21 3d 53 51 4c 49 54 45 5f 49  f( eOp!=SQLITE_I
4a80: 4e 53 45 52 54 20 26 26 20 65 4f 70 21 3d 53 51  NSERT && eOp!=SQ
4a90: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  LITE_DELETE ){. 
4aa0: 20 20 20 20 20 72 63 20 3d 20 66 75 7a 7a 43 6f       rc = fuzzCo
4ab0: 72 72 75 70 74 28 29 3b 0a 20 20 20 20 7d 0a 20  rrupt();.    }. 
4ac0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
4ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
4ae0: 74 20 62 50 6b 4f 6e 6c 79 20 3d 20 28 65 4f 70  t bPkOnly = (eOp
4af0: 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
4b00: 26 26 20 70 50 61 72 73 65 2d 3e 62 50 61 74 63  && pParse->bPatc
4b10: 68 73 65 74 29 3b 0a 20 20 20 20 20 20 72 63 20  hset);.      rc 
4b20: 3d 20 66 75 7a 7a 50 61 72 73 65 52 65 63 6f 72  = fuzzParseRecor
4b30: 64 28 26 70 2c 20 70 45 6e 64 2c 20 70 50 61 72  d(&p, pEnd, pPar
4b40: 73 65 2c 20 62 50 6b 4f 6e 6c 79 29 3b 0a 20 20  se, bPkOnly);.  
4b50: 20 20 7d 0a 20 20 20 20 70 47 72 70 2d 3e 6e 43    }.    pGrp->nC
4b60: 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 70 50 61  hange++;.    pPa
4b70: 72 73 65 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a  rse->nChange++;.
4b80: 20 20 7d 0a 20 20 70 47 72 70 2d 3e 73 7a 43 68    }.  pGrp->szCh
4b90: 61 6e 67 65 20 3d 20 70 20 2d 20 70 47 72 70 2d  ange = p - pGrp-
4ba0: 3e 61 43 68 61 6e 67 65 3b 0a 0a 20 20 2a 70 70  >aChange;..  *pp
4bb0: 44 61 74 61 20 3d 20 70 3b 0a 20 20 72 65 74 75  Data = p;.  retu
4bc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4bd0: 50 61 72 73 65 20 74 68 65 20 63 68 61 6e 67 65  Parse the change
4be0: 73 65 74 20 73 74 6f 72 65 64 20 69 6e 20 62 75  set stored in bu
4bf0: 66 66 65 72 20 70 43 68 61 6e 67 65 73 65 74 20  ffer pChangeset 
4c00: 28 6e 43 68 61 6e 67 65 73 65 74 20 62 79 74 65  (nChangeset byte
4c10: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 29 2e 20 49  s in.** size). I
4c20: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 77 72  f successful, wr
4c30: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
4c40: 69 6e 74 6f 20 28 2a 70 50 61 72 73 65 29 20 61  into (*pParse) a
4c50: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  nd return.** SQL
4c60: 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 61  ITE_OK. Or, if a
4c70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4c80: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
4c90: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
4ca0: 0a 2a 2a 20 66 69 6e 61 6c 20 73 74 61 74 65 20  .** final state 
4cb0: 6f 66 20 28 2a 70 50 61 72 73 65 29 20 69 73 20  of (*pParse) is 
4cc0: 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
4cd0: 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
4ce0: 63 20 69 6e 74 20 66 75 7a 7a 50 61 72 73 65 43  c int fuzzParseC
4cf0: 68 61 6e 67 65 73 65 74 28 0a 20 20 75 38 20 2a  hangeset(.  u8 *
4d00: 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  pChangeset,     
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
4d20: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4d30: 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20   changeset */.  
4d40: 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20  int nChangeset, 
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
4d70: 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
4d80: 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 20 2a 70  FuzzChangeset *p
4d90: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
4da0: 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 73 20  /* OUT: Results 
4db0: 6f 66 20 70 61 72 73 65 20 2a 2f 0a 29 7b 0a 20  of parse */.){. 
4dc0: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 43 68   u8 *pEnd = &pCh
4dd0: 61 6e 67 65 73 65 74 5b 6e 43 68 61 6e 67 65 73  angeset[nChanges
4de0: 65 74 5d 3b 0a 20 20 75 38 20 2a 70 20 3d 20 70  et];.  u8 *p = p
4df0: 43 68 61 6e 67 65 73 65 74 3b 0a 20 20 69 6e 74  Changeset;.  int
4e00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4e10: 0a 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73  ..  memset(pPars
4e20: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 75 7a  e, 0, sizeof(Fuz
4e30: 7a 43 68 61 6e 67 65 73 65 74 29 29 3b 0a 20 20  zChangeset));.  
4e40: 69 66 28 20 6e 43 68 61 6e 67 65 73 65 74 3e 30  if( nChangeset>0
4e50: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
4e60: 62 50 61 74 63 68 73 65 74 20 3d 20 28 70 43 68  bPatchset = (pCh
4e70: 61 6e 67 65 73 65 74 5b 30 5d 3d 3d 27 50 27 29  angeset[0]=='P')
4e80: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
4e90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
4ea0: 20 70 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 46   p<pEnd ){.    F
4eb0: 75 7a 7a 43 68 61 6e 67 65 73 65 74 47 72 6f 75  uzzChangesetGrou
4ec0: 70 20 2a 70 47 72 70 20 3d 20 30 3b 0a 0a 20 20  p *pGrp = 0;..  
4ed0: 20 20 2f 2a 20 52 65 61 64 20 61 20 74 61 62 6c    /* Read a tabl
4ee0: 65 2d 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  e-header from th
4ef0: 65 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20  e changeset */. 
4f00: 20 20 20 72 63 20 3d 20 66 75 7a 7a 50 61 72 73     rc = fuzzPars
4f10: 65 48 65 61 64 65 72 28 70 50 61 72 73 65 2c 20  eHeader(pParse, 
4f20: 26 70 2c 20 70 45 6e 64 2c 20 26 70 47 72 70 29  &p, pEnd, &pGrp)
4f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
4f40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3d 3d 28  c==SQLITE_OK)==(
4f50: 70 47 72 70 21 3d 30 29 20 29 3b 0a 0a 20 20 20  pGrp!=0) );..   
4f60: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
4f70: 2d 68 65 61 64 65 72 20 77 61 73 20 73 75 63 63  -header was succ
4f80: 65 73 73 66 75 6c 6c 79 20 70 61 72 73 65 64 2c  essfully parsed,
4f90: 20 61 64 64 20 74 68 65 20 6e 65 77 20 63 68 61   add the new cha
4fa0: 6e 67 65 2d 67 72 6f 75 70 0a 20 20 20 20 2a 2a  nge-group.    **
4fb0: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 61 6e   to the array an
4fc0: 64 20 70 61 72 73 65 20 74 68 65 20 61 73 73 6f  d parse the asso
4fd0: 63 69 61 74 65 64 20 63 68 61 6e 67 65 73 2e 20  ciated changes. 
4fe0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
4ff0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5000: 20 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 47    FuzzChangesetG
5010: 72 6f 75 70 20 2a 2a 61 70 4e 65 77 20 3d 20 28  roup **apNew = (
5020: 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 47 72 6f  FuzzChangesetGro
5030: 75 70 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  up**)sqlite3_rea
5040: 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20  lloc64(.        
5050: 20 20 70 50 61 72 73 65 2d 3e 61 70 47 72 6f 75    pParse->apGrou
5060: 70 2c 20 73 69 7a 65 6f 66 28 46 75 7a 7a 43 68  p, sizeof(FuzzCh
5070: 61 6e 67 65 73 65 74 47 72 6f 75 70 2a 29 2a 28  angesetGroup*)*(
5080: 70 50 61 72 73 65 2d 3e 6e 47 72 6f 75 70 2b 31  pParse->nGroup+1
5090: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
50a0: 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b   if( apNew==0 ){
50b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
50c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
50d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
50e0: 20 61 70 4e 65 77 5b 70 50 61 72 73 65 2d 3e 6e   apNew[pParse->n
50f0: 47 72 6f 75 70 5d 20 3d 20 70 47 72 70 3b 0a 20  Group] = pGrp;. 
5100: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
5110: 70 47 72 6f 75 70 20 3d 20 61 70 4e 65 77 3b 0a  pGroup = apNew;.
5120: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5130: 6e 47 72 6f 75 70 2b 2b 3b 0a 20 20 20 20 20 20  nGroup++;.      
5140: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 66 75 7a  }.      rc = fuz
5150: 7a 50 61 72 73 65 43 68 61 6e 67 65 73 28 26 70  zParseChanges(&p
5160: 2c 20 70 45 6e 64 2c 20 70 50 61 72 73 65 29 3b  , pEnd, pParse);
5170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
5180: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5190: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
51a0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
51b0: 28 2a 70 70 52 65 63 29 20 70 6f 69 6e 74 73 20  (*ppRec) points 
51c0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
51d0: 65 20 6f 66 0a 2a 2a 20 61 20 72 65 63 6f 72 64  e of.** a record
51e0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
51f0: 20 63 68 61 6e 67 65 2d 67 72 6f 75 70 20 70 47   change-group pG
5200: 72 70 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  rp. This functio
5210: 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  n attempts.** to
5220: 20 6f 75 74 70 75 74 20 61 20 68 75 6d 61 6e 2d   output a human-
5230: 72 65 61 64 61 62 6c 65 20 76 65 72 73 69 6f 6e  readable version
5240: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   of the record t
5250: 6f 20 73 74 64 6f 75 74 20 61 6e 64 20 61 64 76  o stdout and adv
5260: 61 6e 63 65 0a 2a 2a 20 28 2a 70 70 52 65 63 29  ance.** (*ppRec)
5270: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
5280: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
5290: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
52a0: 72 65 63 6f 72 64 20 62 65 66 6f 72 65 0a 2a 2a  record before.**
52b0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 73   returning. If s
52c0: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
52d0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
52e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
52f0: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5300: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  code..**.** If p
5310: 61 72 61 6d 65 74 65 72 20 62 50 6b 4f 6e 6c 79  arameter bPkOnly
5320: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
5330: 65 6e 20 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61  en all non-prima
5340: 72 79 2d 6b 65 79 20 66 69 65 6c 64 73 20 68 61  ry-key fields ha
5350: 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 6d 69 74 74  ve.** been omitt
5360: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  ed from the reco
5370: 72 64 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  rd. This occurs 
5380: 66 6f 72 20 72 65 63 6f 72 64 73 20 74 68 61 74  for records that
5390: 20 61 72 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20   are part.** of 
53a0: 44 45 4c 45 54 45 20 63 68 61 6e 67 65 73 20 69  DELETE changes i
53b0: 6e 20 70 61 74 63 68 73 65 74 73 2e 0a 2a 2f 0a  n patchsets..*/.
53c0: 73 74 61 74 69 63 20 69 6e 74 20 66 75 7a 7a 50  static int fuzzP
53d0: 72 69 6e 74 52 65 63 6f 72 64 28 46 75 7a 7a 43  rintRecord(FuzzC
53e0: 68 61 6e 67 65 73 65 74 47 72 6f 75 70 20 2a 70  hangesetGroup *p
53f0: 47 72 70 2c 20 75 38 20 2a 2a 70 70 52 65 63 2c  Grp, u8 **ppRec,
5400: 20 69 6e 74 20 62 50 4b 4f 6e 6c 79 29 7b 0a 20   int bPKOnly){. 
5410: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5420: 5f 4f 4b 3b 0a 20 20 75 38 20 2a 70 20 3d 20 2a  _OK;.  u8 *p = *
5430: 70 70 52 65 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  ppRec;.  int i;.
5440: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
5450: 72 65 20 3d 20 22 20 28 22 3b 0a 0a 20 20 66 6f  re = " (";..  fo
5460: 72 28 69 3d 30 3b 20 69 3c 70 47 72 70 2d 3e 6e  r(i=0; i<pGrp->n
5470: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
5480: 66 28 20 62 50 4b 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( bPKOnly==0 ||
5490: 20 70 47 72 70 2d 3e 61 50 4b 5b 69 5d 20 29 7b   pGrp->aPK[i] ){
54a0: 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20  .      u8 eType 
54b0: 3d 20 70 2b 2b 5b 30 5d 3b 0a 20 20 20 20 20 20  = p++[0];.      
54c0: 73 77 69 74 63 68 28 20 65 54 79 70 65 20 29 7b  switch( eType ){
54d0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 78  .        case 0x
54e0: 30 30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  00:             
54f0: 20 20 20 20 20 20 20 2f 2a 20 75 6e 64 65 66 69         /* undefi
5500: 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ned */.         
5510: 20 70 72 69 6e 74 66 28 22 25 73 6e 2f 61 22 2c   printf("%sn/a",
5520: 20 7a 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20   zPre);.        
5530: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
5540: 20 20 63 61 73 65 20 30 78 30 31 3a 20 7b 20 20    case 0x01: {  
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 2f 2a 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  /* integer */.  
5570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5580: 69 6e 74 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a  int64 iVal = 0;.
5590: 20 20 20 20 20 20 20 20 20 20 69 56 61 6c 20 3d            iVal =
55a0: 20 66 75 7a 7a 47 65 74 49 36 34 28 70 29 3b 0a   fuzzGetI64(p);.
55b0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
55c0: 28 22 25 73 25 6c 6c 64 22 2c 20 7a 50 72 65 2c  ("%s%lld", zPre,
55d0: 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   iVal);.        
55e0: 20 20 70 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20    p += 8;.      
55f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5600: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 61     }..        ca
5610: 73 65 20 30 78 30 32 3a 20 7b 20 20 20 20 20 20  se 0x02: {      
5620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
5630: 65 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eal */.         
5640: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
5650: 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Val = 0;.       
5660: 20 20 20 64 6f 75 62 6c 65 20 66 56 61 6c 20 3d     double fVal =
5670: 20 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 20 20   0.0;.          
5680: 69 56 61 6c 20 3d 20 66 75 7a 7a 47 65 74 49 36  iVal = fuzzGetI6
5690: 34 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  4(p);.          
56a0: 6d 65 6d 63 70 79 28 26 66 56 61 6c 2c 20 26 69  memcpy(&fVal, &i
56b0: 56 61 6c 2c 20 38 29 3b 0a 20 20 20 20 20 20 20  Val, 8);.       
56c0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 66 22     printf("%s%f"
56d0: 2c 20 7a 50 72 65 2c 20 66 56 61 6c 29 3b 0a 20  , zPre, fVal);. 
56e0: 20 20 20 20 20 20 20 20 20 70 20 2b 3d 20 38 3b           p += 8;
56f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5700: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
5710: 20 20 20 20 20 63 61 73 65 20 30 78 30 33 3a 20       case 0x03: 
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 2f 2a 20 74 65 78 74 20 2a 2f 0a 20 20     /* text */.  
5740: 20 20 20 20 20 20 63 61 73 65 20 30 78 30 34 3a        case 0x04:
5750: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
5760: 20 20 20 20 2f 2a 20 62 6c 6f 62 20 2a 2f 0a 20      /* blob */. 
5770: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 78           int nTx
5780: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 20 2b  t;.          p +
5790: 3d 20 66 75 7a 7a 47 65 74 56 61 72 69 6e 74 28  = fuzzGetVarint(
57a0: 70 2c 20 26 6e 54 78 74 29 3b 0a 20 20 20 20 20  p, &nTxt);.     
57b0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 25       printf("%s%
57c0: 73 22 2c 20 7a 50 72 65 2c 20 65 54 79 70 65 3d  s", zPre, eType=
57d0: 3d 30 78 30 33 20 3f 20 22 27 22 20 3a 20 22 58  =0x03 ? "'" : "X
57e0: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  '");.          f
57f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 78 74 3b 20  or(i=0; i<nTxt; 
5800: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5810: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 78 30    if( eType==0x0
5820: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
5830: 20 20 20 70 72 69 6e 74 66 28 22 25 63 22 2c 20     printf("%c", 
5840: 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  p[i]);.         
5850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5860: 20 20 20 20 20 20 20 20 63 68 61 72 20 61 48 65          char aHe
5870: 78 5b 31 36 5d 20 3d 20 7b 27 30 27 2c 20 27 31  x[16] = {'0', '1
5880: 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27  ', '2', '3', '4'
5890: 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c  , '5', '6', '7',
58a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27  '8', '9', 'A', '
58d0: 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45  B', 'C', 'D', 'E
58e0: 27 2c 20 27 46 27 0a 20 20 20 20 20 20 20 20 20  ', 'F'.         
58f0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
5900: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63        printf("%c
5910: 22 2c 20 61 48 65 78 5b 20 70 5b 69 5d 3e 3e 34  ", aHex[ p[i]>>4
5920: 20 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ]);.           
5930: 20 20 20 70 72 69 6e 74 66 28 22 25 63 22 2c 20     printf("%c", 
5940: 61 48 65 78 5b 20 70 5b 69 5d 20 26 20 30 78 30  aHex[ p[i] & 0x0
5950: 46 20 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  F ]);.          
5960: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5970: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
5980: 28 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ("'");.         
5990: 20 70 20 2b 3d 20 6e 54 78 74 3b 0a 20 20 20 20   p += nTxt;.    
59a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
59b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
59c0: 63 61 73 65 20 30 78 30 35 3a 20 20 20 20 20 20  case 0x05:      
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
59e0: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
59f0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 4e 55 4c     printf("%sNUL
5a00: 4c 22 2c 20 7a 50 72 65 29 3b 0a 20 20 20 20 20  L", zPre);.     
5a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a20: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 65 20 3d    }.      zPre =
5a30: 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d   ", ";.    }.  }
5a40: 0a 20 20 70 72 69 6e 74 66 28 22 29 22 29 3b 0a  .  printf(")");.
5a50: 0a 20 20 2a 70 70 52 65 63 20 3d 20 70 3b 0a 20  .  *ppRec = p;. 
5a60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5a70: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 68 75 6d  *.** Print a hum
5a80: 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72 73  an-readable vers
5a90: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
5aa0: 2d 68 65 61 64 65 72 20 61 6e 64 20 61 6c 6c 20  -header and all 
5ab0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 0a 2a  changes in the.*
5ac0: 2a 20 63 68 61 6e 67 65 2d 67 72 6f 75 70 20 70  * change-group p
5ad0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5ae0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
5af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 7a  .static void fuz
5b00: 7a 50 72 69 6e 74 47 72 6f 75 70 28 46 75 7a 7a  zPrintGroup(Fuzz
5b10: 43 68 61 6e 67 65 73 65 74 20 2a 70 50 61 72 73  Changeset *pPars
5b20: 65 2c 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74  e, FuzzChangeset
5b30: 47 72 6f 75 70 20 2a 70 47 72 70 29 7b 0a 20 20  Group *pGrp){.  
5b40: 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 3b 0a  int i;.  u8 *p;.
5b50: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5b60: 68 65 61 64 65 72 20 2a 2f 0a 20 20 70 72 69 6e  header */.  prin
5b70: 74 66 28 22 54 41 42 4c 45 3a 20 20 25 73 20 6e  tf("TABLE:  %s n
5b80: 43 6f 6c 3d 25 64 20 61 50 4b 3d 22 2c 20 70 47  Col=%d aPK=", pG
5b90: 72 70 2d 3e 7a 54 61 62 2c 20 70 47 72 70 2d 3e  rp->zTab, pGrp->
5ba0: 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  nCol);.  for(i=0
5bb0: 3b 20 69 3c 70 47 72 70 2d 3e 6e 43 6f 6c 3b 20  ; i<pGrp->nCol; 
5bc0: 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  i++){.    printf
5bd0: 28 22 25 64 22 2c 20 28 69 6e 74 29 70 47 72 70  ("%d", (int)pGrp
5be0: 2d 3e 61 50 4b 5b 69 5d 29 3b 0a 20 20 7d 0a 20  ->aPK[i]);.  }. 
5bf0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 0a   printf("\n");..
5c00: 20 20 2f 2a 20 54 68 65 20 61 72 72 61 79 20 6f    /* The array o
5c10: 66 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 70  f changes */.  p
5c20: 20 3d 20 70 47 72 70 2d 3e 61 43 68 61 6e 67 65   = pGrp->aChange
5c30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5c40: 47 72 70 2d 3e 6e 43 68 61 6e 67 65 3b 20 69 2b  Grp->nChange; i+
5c50: 2b 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +){.    u8 eType
5c60: 20 3d 20 70 5b 30 5d 3b 0a 20 20 20 20 75 38 20   = p[0];.    u8 
5c70: 62 49 6e 64 69 72 65 63 74 20 3d 20 70 5b 31 5d  bIndirect = p[1]
5c80: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73  ;.    printf("%s
5c90: 20 28 69 6e 64 3d 25 64 29 3a 22 2c 0a 20 20 20   (ind=%d):",.   
5ca0: 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51 4c       (eType==SQL
5cb0: 49 54 45 5f 49 4e 53 45 52 54 29 20 3f 20 22 49  ITE_INSERT) ? "I
5cc0: 4e 53 45 52 54 22 20 3a 0a 20 20 20 20 20 20 20  NSERT" :.       
5cd0: 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f   (eType==SQLITE_
5ce0: 44 45 4c 45 54 45 20 3f 20 22 44 45 4c 45 54 45  DELETE ? "DELETE
5cf0: 22 20 3a 20 22 55 50 44 41 54 45 22 29 2c 0a 20  " : "UPDATE"),. 
5d00: 20 20 20 20 20 20 20 62 49 6e 64 69 72 65 63 74         bIndirect
5d10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 20 2b 3d  .    );.    p +=
5d20: 20 32 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   2;..    if( pPa
5d30: 72 73 65 2d 3e 62 50 61 74 63 68 73 65 74 3d 3d  rse->bPatchset==
5d40: 30 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  0 && eType==SQLI
5d50: 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
5d60: 20 20 20 66 75 7a 7a 50 72 69 6e 74 52 65 63 6f     fuzzPrintReco
5d70: 72 64 28 70 47 72 70 2c 20 26 70 2c 20 30 29 3b  rd(pGrp, &p, 0);
5d80: 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 7a 7a 50  .    }.    fuzzP
5d90: 72 69 6e 74 52 65 63 6f 72 64 28 70 47 72 70 2c  rintRecord(pGrp,
5da0: 20 26 70 2c 20 65 54 79 70 65 3d 3d 53 51 4c 49   &p, eType==SQLI
5db0: 54 45 5f 44 45 4c 45 54 45 20 26 26 20 70 50 61  TE_DELETE && pPa
5dc0: 72 73 65 2d 3e 62 50 61 74 63 68 73 65 74 29 3b  rse->bPatchset);
5dd0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
5de0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5df0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
5e00: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
5e10: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
5e20: 65 74 65 72 20 77 69 74 68 20 64 65 74 61 69 6c  eter with detail
5e30: 73 0a 2a 2a 20 6f 66 20 74 68 65 20 63 68 61 6e  s.** of the chan
5e40: 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
5e50: 61 74 74 65 6d 70 74 65 64 20 28 74 79 70 65 20  attempted (type 
5e60: 6f 66 20 63 68 61 6e 67 65 2c 20 74 6f 20 77 68  of change, to wh
5e70: 69 63 68 20 70 61 72 74 20 6f 66 20 74 68 65 0a  ich part of the.
5e80: 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 69 74 20  ** changeset it 
5e90: 61 70 70 6c 69 65 73 20 65 74 63 2e 29 2e 20 49  applies etc.). I
5ea0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
5eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
5ec0: 4f 72 2c 20 69 66 20 61 6e 0a 2a 2a 20 65 72 72  Or, if an.** err
5ed0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
5ee0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
5ef0: 72 20 63 6f 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  r code. .**.** I
5f00: 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
5f10: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
5f20: 74 68 65 6e 20 74 68 65 20 73 65 6c 65 63 74 65  then the selecte
5f30: 64 20 63 68 61 6e 67 65 20 77 6f 75 6c 64 20 68  d change would h
5f40: 61 76 65 0a 2a 2a 20 70 72 6f 64 75 63 65 64 20  ave.** produced 
5f50: 61 20 6e 6f 6e 2d 77 65 6c 6c 2d 66 6f 72 6d 65  a non-well-forme
5f60: 64 20 63 68 61 6e 67 65 73 65 74 2e 20 49 6e 20  d changeset. In 
5f70: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
5f80: 6c 6c 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 63  ller should.** c
5f90: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
5fa0: 6e 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n again..*/.stat
5fb0: 69 63 20 69 6e 74 20 66 75 7a 7a 53 65 6c 65 63  ic int fuzzSelec
5fc0: 74 43 68 61 6e 67 65 28 46 75 7a 7a 43 68 61 6e  tChange(FuzzChan
5fd0: 67 65 73 65 74 20 2a 70 50 61 72 73 65 2c 20 46  geset *pParse, F
5fe0: 75 7a 7a 43 68 61 6e 67 65 20 2a 70 43 68 61 6e  uzzChange *pChan
5ff0: 67 65 29 7b 0a 20 20 69 6e 74 20 69 53 75 62 3b  ge){.  int iSub;
6000: 0a 0a 20 20 6d 65 6d 73 65 74 28 70 43 68 61 6e  ..  memset(pChan
6010: 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 75  ge, 0, sizeof(Fu
6020: 7a 7a 43 68 61 6e 67 65 29 29 3b 0a 20 20 70 43  zzChange));.  pC
6030: 68 61 6e 67 65 2d 3e 65 54 79 70 65 20 3d 20 66  hange->eType = f
6040: 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 46 55 5a  uzzRandomInt(FUZ
6050: 5a 5f 43 4f 4c 55 4d 4e 5f 44 45 4c 29 20 2b 20  Z_COLUMN_DEL) + 
6060: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  1;..  assert( pC
6070: 68 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d 46 55  hange->eType==FU
6080: 5a 5a 5f 56 41 4c 55 45 5f 53 55 42 0a 20 20 20  ZZ_VALUE_SUB.   
6090: 20 20 20 20 7c 7c 20 70 43 68 61 6e 67 65 2d 3e      || pChange->
60a0: 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 56 41 4c 55  eType==FUZZ_VALU
60b0: 45 5f 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  E_MOD.       || 
60c0: 70 43 68 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d  pChange->eType==
60d0: 46 55 5a 5a 5f 56 41 4c 55 45 5f 52 4e 44 0a 20  FUZZ_VALUE_RND. 
60e0: 20 20 20 20 20 20 7c 7c 20 70 43 68 61 6e 67 65        || pChange
60f0: 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48  ->eType==FUZZ_CH
6100: 41 4e 47 45 5f 44 55 50 0a 20 20 20 20 20 20 20  ANGE_DUP.       
6110: 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54 79 70  || pChange->eTyp
6120: 65 3d 3d 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 44  e==FUZZ_CHANGE_D
6130: 45 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 68  EL.       || pCh
6140: 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d 46 55 5a  ange->eType==FUZ
6150: 5a 5f 43 48 41 4e 47 45 5f 54 59 50 45 0a 20 20  Z_CHANGE_TYPE.  
6160: 20 20 20 20 20 7c 7c 20 70 43 68 61 6e 67 65 2d       || pChange-
6170: 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48 41  >eType==FUZZ_CHA
6180: 4e 47 45 5f 46 49 45 4c 44 0a 20 20 20 20 20 20  NGE_FIELD.      
6190: 20 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54 79   || pChange->eTy
61a0: 70 65 3d 3d 46 55 5a 5a 5f 43 48 41 4e 47 45 5f  pe==FUZZ_CHANGE_
61b0: 49 4e 44 49 52 45 43 54 0a 20 20 20 20 20 20 20  INDIRECT.       
61c0: 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54 79 70  || pChange->eTyp
61d0: 65 3d 3d 46 55 5a 5a 5f 47 52 4f 55 50 5f 44 55  e==FUZZ_GROUP_DU
61e0: 50 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 68 61  P.       || pCha
61f0: 6e 67 65 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a  nge->eType==FUZZ
6200: 5f 47 52 4f 55 50 5f 44 45 4c 0a 20 20 20 20 20  _GROUP_DEL.     
6210: 20 20 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54    || pChange->eT
6220: 79 70 65 3d 3d 46 55 5a 5a 5f 47 52 4f 55 50 5f  ype==FUZZ_GROUP_
6230: 53 57 41 50 0a 20 20 20 20 20 20 20 7c 7c 20 70  SWAP.       || p
6240: 43 68 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d 46  Change->eType==F
6250: 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 41 44 44 0a 20  UZZ_COLUMN_ADD. 
6260: 20 20 20 20 20 20 7c 7c 20 70 43 68 61 6e 67 65        || pChange
6270: 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 4f  ->eType==FUZZ_CO
6280: 4c 55 4d 4e 5f 41 44 44 50 4b 0a 20 20 20 20 20  LUMN_ADDPK.     
6290: 20 20 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54    || pChange->eT
62a0: 79 70 65 3d 3d 46 55 5a 5a 5f 43 4f 4c 55 4d 4e  ype==FUZZ_COLUMN
62b0: 5f 44 45 4c 0a 20 20 29 3b 0a 0a 20 20 70 43 68  _DEL.  );..  pCh
62c0: 61 6e 67 65 2d 3e 69 47 72 6f 75 70 20 3d 20 66  ange->iGroup = f
62d0: 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 70 50 61  uzzRandomInt(pPa
62e0: 72 73 65 2d 3e 6e 47 72 6f 75 70 29 3b 0a 20 20  rse->nGroup);.  
62f0: 70 43 68 61 6e 67 65 2d 3e 69 43 68 61 6e 67 65  pChange->iChange
6300: 20 3d 20 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74   = fuzzRandomInt
6310: 28 70 50 61 72 73 65 2d 3e 6e 43 68 61 6e 67 65  (pParse->nChange
6320: 29 3b 0a 20 20 69 66 28 20 70 43 68 61 6e 67 65  );.  if( pChange
6330: 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48  ->eType==FUZZ_CH
6340: 41 4e 47 45 5f 46 49 45 4c 44 20 29 7b 0a 20 20  ANGE_FIELD ){.  
6350: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 55    if( pParse->nU
6360: 70 64 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  pdate==0 ) retur
6370: 6e 20 2d 31 3b 0a 20 20 20 20 70 43 68 61 6e 67  n -1;.    pChang
6380: 65 2d 3e 69 43 68 61 6e 67 65 20 3d 20 66 75 7a  e->iChange = fuz
6390: 7a 52 61 6e 64 6f 6d 49 6e 74 28 70 50 61 72 73  zRandomInt(pPars
63a0: 65 2d 3e 6e 55 70 64 61 74 65 29 3b 0a 20 20 7d  e->nUpdate);.  }
63b0: 0a 0a 20 20 70 43 68 61 6e 67 65 2d 3e 69 44 65  ..  pChange->iDe
63c0: 6c 65 74 65 20 3d 20 2d 31 3b 0a 20 20 69 66 28  lete = -1;.  if(
63d0: 20 70 43 68 61 6e 67 65 2d 3e 65 54 79 70 65 3d   pChange->eType=
63e0: 3d 46 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 44 45 4c  =FUZZ_COLUMN_DEL
63f0: 20 29 7b 0a 20 20 20 20 46 75 7a 7a 43 68 61 6e   ){.    FuzzChan
6400: 67 65 73 65 74 47 72 6f 75 70 20 2a 70 47 72 70  gesetGroup *pGrp
6410: 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 47 72 6f   = pParse->apGro
6420: 75 70 5b 70 43 68 61 6e 67 65 2d 3e 69 47 72 6f  up[pChange->iGro
6430: 75 70 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  up];.    int i;.
6440: 20 20 20 20 70 43 68 61 6e 67 65 2d 3e 69 44 65      pChange->iDe
6450: 6c 65 74 65 20 3d 20 66 75 7a 7a 52 61 6e 64 6f  lete = fuzzRando
6460: 6d 49 6e 74 28 70 47 72 70 2d 3e 6e 43 6f 6c 29  mInt(pGrp->nCol)
6470: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 47 72 70  ;.    for(i=pGrp
6480: 2d 3e 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20  ->nCol-1; i>=0; 
6490: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
64a0: 70 47 72 70 2d 3e 61 50 4b 5b 69 5d 20 26 26 20  pGrp->aPK[i] && 
64b0: 70 43 68 61 6e 67 65 2d 3e 69 44 65 6c 65 74 65  pChange->iDelete
64c0: 21 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=i ) break;.   
64d0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29   }.    if( i<0 )
64e0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
64f0: 0a 20 20 69 66 28 20 70 43 68 61 6e 67 65 2d 3e  .  if( pChange->
6500: 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 47 52 4f 55  eType==FUZZ_GROU
6510: 50 5f 53 57 41 50 20 29 7b 0a 20 20 20 20 46 75  P_SWAP ){.    Fu
6520: 7a 7a 43 68 61 6e 67 65 73 65 74 47 72 6f 75 70  zzChangesetGroup
6530: 20 2a 70 47 72 70 3b 0a 20 20 20 20 69 6e 74 20   *pGrp;.    int 
6540: 69 47 72 70 20 3d 20 70 43 68 61 6e 67 65 2d 3e  iGrp = pChange->
6550: 69 47 72 6f 75 70 3b 0a 20 20 20 20 69 66 28 20  iGroup;.    if( 
6560: 70 50 61 72 73 65 2d 3e 6e 47 72 6f 75 70 3d 3d  pParse->nGroup==
6570: 31 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  1 ) return -1;. 
6580: 20 20 20 77 68 69 6c 65 28 20 69 47 72 70 3d 3d     while( iGrp==
6590: 70 43 68 61 6e 67 65 2d 3e 69 47 72 6f 75 70 20  pChange->iGroup 
65a0: 29 7b 0a 20 20 20 20 20 20 69 47 72 70 20 3d 20  ){.      iGrp = 
65b0: 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 70 50  fuzzRandomInt(pP
65c0: 61 72 73 65 2d 3e 6e 47 72 6f 75 70 29 3b 0a 20  arse->nGroup);. 
65d0: 20 20 20 7d 0a 20 20 20 20 70 47 72 70 20 3d 20     }.    pGrp = 
65e0: 70 50 61 72 73 65 2d 3e 61 70 47 72 6f 75 70 5b  pParse->apGroup[
65f0: 70 43 68 61 6e 67 65 2d 3e 69 47 72 6f 75 70 5d  pChange->iGroup]
6600: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70  ;.    pParse->ap
6610: 47 72 6f 75 70 5b 70 43 68 61 6e 67 65 2d 3e 69  Group[pChange->i
6620: 47 72 6f 75 70 5d 20 3d 20 70 50 61 72 73 65 2d  Group] = pParse-
6630: 3e 61 70 47 72 6f 75 70 5b 69 47 72 70 5d 3b 0a  >apGroup[iGrp];.
6640: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 47 72      pParse->apGr
6650: 6f 75 70 5b 69 47 72 70 5d 20 3d 20 70 47 72 70  oup[iGrp] = pGrp
6660: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 68  ;.  }..  if( pCh
6670: 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d 46 55 5a  ange->eType==FUZ
6680: 5a 5f 56 41 4c 55 45 5f 53 55 42 20 0a 20 20 20  Z_VALUE_SUB .   
6690: 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 65 54 79 70  || pChange->eTyp
66a0: 65 3d 3d 46 55 5a 5a 5f 56 41 4c 55 45 5f 4d 4f  e==FUZZ_VALUE_MO
66b0: 44 20 0a 20 20 20 7c 7c 20 70 43 68 61 6e 67 65  D .   || pChange
66c0: 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 56 41  ->eType==FUZZ_VA
66d0: 4c 55 45 5f 52 4e 44 20 0a 20 20 29 7b 0a 20 20  LUE_RND .  ){.  
66e0: 20 20 69 53 75 62 20 3d 20 66 75 7a 7a 52 61 6e    iSub = fuzzRan
66f0: 64 6f 6d 49 6e 74 28 70 50 61 72 73 65 2d 3e 6e  domInt(pParse->n
6700: 56 61 6c 29 3b 0a 20 20 20 20 70 43 68 61 6e 67  Val);.    pChang
6710: 65 2d 3e 70 53 75 62 31 20 3d 20 70 50 61 72 73  e->pSub1 = pPars
6720: 65 2d 3e 61 70 56 61 6c 5b 69 53 75 62 5d 3b 0a  e->apVal[iSub];.
6730: 20 20 20 20 69 66 28 20 70 43 68 61 6e 67 65 2d      if( pChange-
6740: 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 56 41 4c  >eType==FUZZ_VAL
6750: 55 45 5f 53 55 42 20 29 7b 0a 20 20 20 20 20 20  UE_SUB ){.      
6760: 69 53 75 62 20 3d 20 66 75 7a 7a 52 61 6e 64 6f  iSub = fuzzRando
6770: 6d 49 6e 74 28 70 50 61 72 73 65 2d 3e 6e 56 61  mInt(pParse->nVa
6780: 6c 29 3b 0a 20 20 20 20 20 20 70 43 68 61 6e 67  l);.      pChang
6790: 65 2d 3e 70 53 75 62 32 20 3d 20 70 50 61 72 73  e->pSub2 = pPars
67a0: 65 2d 3e 61 70 56 61 6c 5b 69 53 75 62 5d 3b 0a  e->apVal[iSub];.
67b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67c0: 20 70 43 68 61 6e 67 65 2d 3e 70 53 75 62 32 20   pChange->pSub2 
67d0: 3d 20 70 43 68 61 6e 67 65 2d 3e 61 53 75 62 3b  = pChange->aSub;
67e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
67f0: 70 43 68 61 6e 67 65 2d 3e 65 54 79 70 65 3d 3d  pChange->eType==
6800: 46 55 5a 5a 5f 56 41 4c 55 45 5f 52 4e 44 20 29  FUZZ_VALUE_RND )
6810: 7b 0a 20 20 20 20 20 20 70 43 68 61 6e 67 65 2d  {.      pChange-
6820: 3e 61 53 75 62 5b 30 5d 20 3d 20 28 75 38 29 28  >aSub[0] = (u8)(
6830: 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 35 29  fuzzRandomInt(5)
6840: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 73 77 69   + 1);.      swi
6850: 74 63 68 28 20 70 43 68 61 6e 67 65 2d 3e 61 53  tch( pChange->aS
6860: 75 62 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ub[0] ){.       
6870: 20 63 61 73 65 20 30 78 30 31 3a 20 7b 20 20 20   case 0x01: {   
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6890: 2a 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  * integer */.   
68a0: 20 20 20 20 20 20 20 75 36 34 20 69 56 61 6c 20         u64 iVal 
68b0: 3d 20 66 75 7a 7a 52 61 6e 64 6f 6d 55 36 34 28  = fuzzRandomU64(
68c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 75 7a  );.          fuz
68d0: 7a 50 75 74 55 36 34 28 26 70 43 68 61 6e 67 65  zPutU64(&pChange
68e0: 2d 3e 61 53 75 62 5b 31 5d 2c 20 69 56 61 6c 29  ->aSub[1], iVal)
68f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
6900: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  k;.        }..  
6910: 20 20 20 20 20 20 63 61 73 65 20 30 78 30 32 3a        case 0x02:
6920: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
6930: 20 20 20 20 2f 2a 20 72 65 61 6c 20 2a 2f 0a 20      /* real */. 
6940: 20 20 20 20 20 20 20 20 20 75 36 34 20 69 56 61           u64 iVa
6950: 6c 31 20 3d 20 66 75 7a 7a 52 61 6e 64 6f 6d 55  l1 = fuzzRandomU
6960: 36 34 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  64();.          
6970: 75 36 34 20 69 56 61 6c 32 20 3d 20 66 75 7a 7a  u64 iVal2 = fuzz
6980: 52 61 6e 64 6f 6d 55 36 34 28 29 3b 0a 20 20 20  RandomU64();.   
6990: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 64 20         double d 
69a0: 3d 20 28 64 6f 75 62 6c 65 29 69 56 61 6c 31 20  = (double)iVal1 
69b0: 2f 20 28 64 6f 75 62 6c 65 29 69 56 61 6c 32 3b  / (double)iVal2;
69c0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
69d0: 79 28 26 69 56 61 6c 31 2c 20 26 64 2c 20 73 69  y(&iVal1, &d, si
69e0: 7a 65 6f 66 28 69 56 61 6c 31 29 29 3b 0a 20 20  zeof(iVal1));.  
69f0: 20 20 20 20 20 20 20 20 66 75 7a 7a 50 75 74 55          fuzzPutU
6a00: 36 34 28 26 70 43 68 61 6e 67 65 2d 3e 61 53 75  64(&pChange->aSu
6a10: 62 5b 31 5d 2c 20 69 56 61 6c 31 29 3b 0a 20 20  b[1], iVal1);.  
6a20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6a30: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
6a40: 20 20 63 61 73 65 20 30 78 30 33 3a 20 20 20 20    case 0x03:    
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 2f 2a 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20  /* text */.     
6a70: 20 20 20 63 61 73 65 20 30 78 30 34 3a 20 7b 20     case 0x04: { 
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 2f 2a 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20   /* blob */.    
6aa0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
6ab0: 3d 20 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28  = fuzzRandomInt(
6ac0: 34 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  48);.          p
6ad0: 43 68 61 6e 67 65 2d 3e 61 53 75 62 5b 31 5d 20  Change->aSub[1] 
6ae0: 3d 20 28 75 38 29 6e 42 79 74 65 3b 0a 20 20 20  = (u8)nByte;.   
6af0: 20 20 20 20 20 20 20 66 75 7a 7a 52 61 6e 64 6f         fuzzRando
6b00: 6d 42 6c 6f 62 28 6e 42 79 74 65 2c 20 26 70 43  mBlob(nByte, &pC
6b10: 68 61 6e 67 65 2d 3e 61 53 75 62 5b 32 5d 29 3b  hange->aSub[2]);
6b20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6b30: 43 68 61 6e 67 65 2d 3e 61 53 75 62 5b 30 5d 3d  Change->aSub[0]=
6b40: 3d 30 78 30 33 20 29 7b 0a 20 20 20 20 20 20 20  =0x03 ){.       
6b50: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6b60: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6b70: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
6b90: 68 61 6e 67 65 2d 3e 61 53 75 62 5b 32 2b 69 5d  hange->aSub[2+i]
6ba0: 20 26 3d 20 30 78 37 46 3b 0a 20 20 20 20 20 20   &= 0x7F;.      
6bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
6bd0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6be0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6bf0: 20 69 66 28 20 70 43 68 61 6e 67 65 2d 3e 65 54   if( pChange->eT
6c00: 79 70 65 3d 3d 46 55 5a 5a 5f 56 41 4c 55 45 5f  ype==FUZZ_VALUE_
6c10: 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  MOD ){.      int
6c20: 20 73 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   sz;.      int i
6c30: 4d 6f 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Mod = -1;.      
6c40: 66 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65 28 70  fuzzChangeSize(p
6c50: 43 68 61 6e 67 65 2d 3e 70 53 75 62 31 2c 20 26  Change->pSub1, &
6c60: 73 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  sz);.      memcp
6c70: 79 28 70 43 68 61 6e 67 65 2d 3e 61 53 75 62 2c  y(pChange->aSub,
6c80: 20 70 43 68 61 6e 67 65 2d 3e 70 53 75 62 31 2c   pChange->pSub1,
6c90: 20 73 7a 29 3b 0a 20 20 20 20 20 20 73 77 69 74   sz);.      swit
6ca0: 63 68 28 20 70 43 68 61 6e 67 65 2d 3e 61 53 75  ch( pChange->aSu
6cb0: 62 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  b[0] ){.        
6cc0: 63 61 73 65 20 30 78 30 31 3a 0a 20 20 20 20 20  case 0x01:.     
6cd0: 20 20 20 63 61 73 65 20 30 78 30 32 3a 0a 20 20     case 0x02:.  
6ce0: 20 20 20 20 20 20 20 20 69 4d 6f 64 20 3d 20 66          iMod = f
6cf0: 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 38 29 20  uzzRandomInt(8) 
6d00: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  + 1;.          b
6d10: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63  reak;..        c
6d20: 61 73 65 20 30 78 30 33 3a 20 20 20 20 20 20 20  ase 0x03:       
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d40: 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  text */.        
6d50: 63 61 73 65 20 30 78 30 34 3a 20 7b 20 20 20 20  case 0x04: {    
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6d70: 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 20 20 20   blob */.       
6d80: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
6d90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 46 69 72          int iFir
6da0: 73 74 20 3d 20 31 20 2b 20 66 75 7a 7a 47 65 74  st = 1 + fuzzGet
6db0: 56 61 72 69 6e 74 28 26 70 43 68 61 6e 67 65 2d  Varint(&pChange-
6dc0: 3e 61 53 75 62 5b 31 5d 2c 20 26 6e 42 79 74 65  >aSub[1], &nByte
6dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6de0: 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20 20   nByte>0 ){.    
6df0: 20 20 20 20 20 20 20 20 69 4d 6f 64 20 3d 20 66          iMod = f
6e00: 75 7a 7a 52 61 6e 64 6f 6d 49 6e 74 28 6e 42 79  uzzRandomInt(nBy
6e10: 74 65 29 20 2b 20 69 46 69 72 73 74 3b 0a 20 20  te) + iFirst;.  
6e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6e40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6e50: 20 20 20 20 69 66 28 20 69 4d 6f 64 3e 3d 30 20      if( iMod>=0 
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 6d 61  ){.        u8 ma
6e70: 73 6b 20 3d 20 28 31 20 3c 3c 20 66 75 7a 7a 52  sk = (1 << fuzzR
6e80: 61 6e 64 6f 6d 49 6e 74 28 38 20 2d 20 28 70 43  andomInt(8 - (pC
6e90: 68 61 6e 67 65 2d 3e 61 53 75 62 5b 30 5d 3d 3d  hange->aSub[0]==
6ea0: 30 78 30 33 29 29 29 3b 0a 20 20 20 20 20 20 20  0x03)));.       
6eb0: 20 70 43 68 61 6e 67 65 2d 3e 61 53 75 62 5b 69   pChange->aSub[i
6ec0: 4d 6f 64 5d 20 5e 3d 20 6d 61 73 6b 3b 0a 20 20  Mod] ^= mask;.  
6ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6ee0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6ef0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
6f00: 70 79 20 61 20 73 69 6e 67 6c 65 20 63 68 61 6e  py a single chan
6f10: 67 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ge from the inpu
6f20: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
6f30: 63 68 61 6e 67 65 73 65 74 2c 20 6d 61 6b 69 6e  changeset, makin
6f40: 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63  g.** any modific
6f50: 61 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ations specified
6f60: 20 62 79 20 28 2a 70 46 75 7a 7a 29 2e 0a 2a 2f   by (*pFuzz)..*/
6f70: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 7a 7a  .static int fuzz
6f80: 43 6f 70 79 43 68 61 6e 67 65 28 0a 20 20 46 75  CopyChange(.  Fu
6f90: 7a 7a 43 68 61 6e 67 65 73 65 74 20 2a 70 50 61  zzChangeset *pPa
6fa0: 72 73 65 2c 0a 20 20 69 6e 74 20 69 47 72 70 2c  rse,.  int iGrp,
6fb0: 0a 20 20 46 75 7a 7a 43 68 61 6e 67 65 20 2a 70  .  FuzzChange *p
6fc0: 46 75 7a 7a 2c 0a 20 20 75 38 20 2a 2a 70 70 2c  Fuzz,.  u8 **pp,
6fd0: 20 75 38 20 2a 2a 70 70 4f 75 74 20 20 20 20 20   u8 **ppOut     
6fe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
6ff0: 54 3a 20 49 6e 70 75 74 20 61 6e 64 20 6f 75 74  T: Input and out
7000: 70 75 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a  put pointers */.
7010: 29 7b 0a 20 20 69 6e 74 20 62 50 53 20 3d 20 70  ){.  int bPS = p
7020: 50 61 72 73 65 2d 3e 62 50 61 74 63 68 73 65 74  Parse->bPatchset
7030: 3b 0a 20 20 46 75 7a 7a 43 68 61 6e 67 65 73 65  ;.  FuzzChangese
7040: 74 47 72 6f 75 70 20 2a 70 47 72 70 20 3d 20 70  tGroup *pGrp = p
7050: 50 61 72 73 65 2d 3e 61 70 47 72 6f 75 70 5b 69  Parse->apGroup[i
7060: 47 72 70 5d 3b 0a 20 20 75 38 20 2a 70 20 3d 20  Grp];.  u8 *p = 
7070: 2a 70 70 3b 0a 20 20 75 38 20 2a 70 4f 75 74 20  *pp;.  u8 *pOut 
7080: 3d 20 2a 70 70 4f 75 74 3b 0a 20 20 75 38 20 65  = *ppOut;.  u8 e
7090: 54 79 70 65 20 3d 20 70 2b 2b 5b 30 5d 3b 0a 20  Type = p++[0];. 
70a0: 20 69 6e 74 20 69 52 65 63 3b 0a 20 20 69 6e 74   int iRec;.  int
70b0: 20 6e 52 65 63 20 3d 20 28 28 65 54 79 70 65 3d   nRec = ((eType=
70c0: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 26  =SQLITE_UPDATE &
70d0: 26 20 21 62 50 53 29 20 3f 20 32 20 3a 20 31 29  & !bPS) ? 2 : 1)
70e0: 3b 0a 20 20 69 6e 74 20 69 55 6e 64 65 66 20 3d  ;.  int iUndef =
70f0: 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 64 61   -1;.  int nUpda
7100: 74 65 20 3d 20 30 3b 0a 0a 20 20 75 38 20 65 4e  te = 0;..  u8 eN
7110: 65 77 20 3d 20 65 54 79 70 65 3b 0a 20 20 69 66  ew = eType;.  if
7120: 28 20 70 46 75 7a 7a 2d 3e 69 43 75 72 72 65 6e  ( pFuzz->iCurren
7130: 74 3d 3d 70 46 75 7a 7a 2d 3e 69 43 68 61 6e 67  t==pFuzz->iChang
7140: 65 20 26 26 20 70 46 75 7a 7a 2d 3e 65 54 79 70  e && pFuzz->eTyp
7150: 65 3d 3d 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 54  e==FUZZ_CHANGE_T
7160: 59 50 45 20 29 7b 0a 20 20 20 20 73 77 69 74 63  YPE ){.    switc
7170: 68 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20  h( eType ){.    
7180: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
7190: 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 65 4e  SERT:.        eN
71a0: 65 77 20 3d 20 53 51 4c 49 54 45 5f 44 45 4c 45  ew = SQLITE_DELE
71b0: 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  TE;.        brea
71c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
71d0: 4c 49 54 45 5f 44 45 4c 45 54 45 3a 0a 20 20 20  LITE_DELETE:.   
71e0: 20 20 20 20 20 65 4e 65 77 20 3d 20 53 51 4c 49       eNew = SQLI
71f0: 54 45 5f 55 50 44 41 54 45 3b 0a 20 20 20 20 20  TE_UPDATE;.     
7200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7210: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
7220: 54 45 3a 0a 20 20 20 20 20 20 20 20 65 4e 65 77  TE:.        eNew
7230: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   = SQLITE_INSERT
7240: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
7260: 28 20 70 46 75 7a 7a 2d 3e 69 43 75 72 72 65 6e  ( pFuzz->iCurren
7270: 74 3d 3d 70 46 75 7a 7a 2d 3e 69 43 68 61 6e 67  t==pFuzz->iChang
7280: 65 20 0a 20 20 20 26 26 20 70 46 75 7a 7a 2d 3e  e .   && pFuzz->
7290: 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48 41 4e  eType==FUZZ_CHAN
72a0: 47 45 5f 46 49 45 4c 44 20 26 26 20 65 54 79 70  GE_FIELD && eTyp
72b0: 65 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e==SQLITE_UPDATE
72c0: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  .  ){.    int sz
72d0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
72e0: 20 69 6e 74 20 6e 44 65 66 20 3d 20 30 3b 0a 20   int nDef = 0;. 
72f0: 20 20 20 75 38 20 2a 70 43 73 72 20 3d 20 70 2b     u8 *pCsr = p+
7300: 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
7310: 69 3c 70 47 72 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pGrp->nCol; i+
7320: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
7330: 73 72 5b 30 5d 20 26 26 20 70 47 72 70 2d 3e 61  sr[0] && pGrp->a
7340: 50 4b 5b 69 5d 3d 3d 30 20 29 20 6e 44 65 66 2b  PK[i]==0 ) nDef+
7350: 2b 3b 0a 20 20 20 20 20 20 66 75 7a 7a 43 68 61  +;.      fuzzCha
7360: 6e 67 65 53 69 7a 65 28 70 43 73 72 2c 20 26 73  ngeSize(pCsr, &s
7370: 7a 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b  z);.      pCsr +
7380: 3d 20 73 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sz;.    }.    
7390: 69 66 28 20 6e 44 65 66 3c 3d 31 20 29 20 72 65  if( nDef<=1 ) re
73a0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 6e 44 65  turn -1;.    nDe
73b0: 66 20 3d 20 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e  f = fuzzRandomIn
73c0: 74 28 6e 44 65 66 29 3b 0a 20 20 20 20 70 43 73  t(nDef);.    pCs
73d0: 72 20 3d 20 70 2b 31 3b 0a 20 20 20 20 66 6f 72  r = p+1;.    for
73e0: 28 69 3d 30 3b 20 69 3c 70 47 72 70 2d 3e 6e 43  (i=0; i<pGrp->nC
73f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7400: 69 66 28 20 70 43 73 72 5b 30 5d 20 26 26 20 70  if( pCsr[0] && p
7410: 47 72 70 2d 3e 61 50 4b 5b 69 5d 3d 3d 30 20 29  Grp->aPK[i]==0 )
7420: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44  {.        if( nD
7430: 65 66 3d 3d 30 20 29 20 69 55 6e 64 65 66 20 3d  ef==0 ) iUndef =
7440: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 44 65 66   i;.        nDef
7450: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
7460: 20 20 66 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65    fuzzChangeSize
7470: 28 70 43 73 72 2c 20 26 73 7a 29 3b 0a 20 20 20  (pCsr, &sz);.   
7480: 20 20 20 70 43 73 72 20 2b 3d 20 73 7a 3b 0a 20     pCsr += sz;. 
7490: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
74a0: 6f 70 79 20 74 68 65 20 63 68 61 6e 67 65 20 74  opy the change t
74b0: 79 70 65 20 61 6e 64 20 69 6e 64 69 72 65 63 74  ype and indirect
74c0: 20 66 6c 61 67 2e 20 49 66 20 74 68 65 20 66 75   flag. If the fu
74d0: 7a 7a 20 6d 6f 64 65 20 69 73 0a 20 20 2a 2a 20  zz mode is.  ** 
74e0: 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 49 4e 44 49  FUZZ_CHANGE_INDI
74f0: 52 45 43 54 2c 20 61 6e 64 20 74 68 65 20 63 75  RECT, and the cu
7500: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 69 73 20  rrent change is 
7510: 74 68 65 20 6f 6e 65 20 73 65 6c 65 63 74 65 64  the one selected
7520: 20 66 6f 72 0a 20 20 2a 2a 20 66 75 7a 7a 69 6e   for.  ** fuzzin
7530: 67 2c 20 69 6e 76 65 72 74 20 74 68 65 20 69 6e  g, invert the in
7540: 64 69 72 65 63 74 20 66 6c 61 67 2e 20 20 2a 2f  direct flag.  */
7550: 0a 20 20 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 65  .  *(pOut++) = e
7560: 4e 65 77 3b 0a 20 20 69 66 28 20 70 46 75 7a 7a  New;.  if( pFuzz
7570: 2d 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48  ->eType==FUZZ_CH
7580: 41 4e 47 45 5f 49 4e 44 49 52 45 43 54 20 26 26  ANGE_INDIRECT &&
7590: 20 70 46 75 7a 7a 2d 3e 69 43 75 72 72 65 6e 74   pFuzz->iCurrent
75a0: 3d 3d 70 46 75 7a 7a 2d 3e 69 43 68 61 6e 67 65  ==pFuzz->iChange
75b0: 20 29 7b 0a 20 20 20 20 2a 28 70 4f 75 74 2b 2b   ){.    *(pOut++
75c0: 29 20 3d 20 21 28 2a 28 70 2b 2b 29 29 3b 0a 20  ) = !(*(p++));. 
75d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 28 70 4f   }else{.    *(pO
75e0: 75 74 2b 2b 29 20 3d 20 2a 28 70 2b 2b 29 3b 0a  ut++) = *(p++);.
75f0: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 52 65 63 3d    }..  for(iRec=
7600: 30 3b 20 69 52 65 63 3c 6e 52 65 63 3b 20 69 52  0; iRec<nRec; iR
7610: 65 63 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  ec++){.    int i
7620: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
7630: 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 66  he next record f
7640: 72 6f 6d 20 74 68 65 20 6f 75 74 70 75 74 20 74  rom the output t
7650: 6f 20 74 68 65 20 69 6e 70 75 74 2e 0a 20 20 20  o the input..   
7660: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
7670: 20 69 3c 70 47 72 70 2d 3e 6e 43 6f 6c 3b 20 69   i<pGrp->nCol; i
7680: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  ++){.      int s
7690: 7a 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 6f  z;.      u8 *pCo
76a0: 70 79 20 3d 20 70 3b 0a 0a 20 20 20 20 20 20 2f  py = p;..      /
76b0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
76c0: 61 74 63 68 73 65 74 2c 20 61 6e 64 20 74 68 65  atchset, and the
76d0: 20 69 6e 70 75 74 20 69 73 20 61 20 44 45 4c 45   input is a DELE
76e0: 54 45 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  TE, then the onl
76f0: 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64  y.      ** field
7700: 73 20 70 72 65 73 65 6e 74 20 61 72 65 20 74 68  s present are th
7710: 65 20 50 4b 20 66 69 65 6c 64 73 2e 20 53 6f 2c  e PK fields. So,
7720: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
7730: 61 20 50 4b 2c 20 73 6b 69 70 20 74 6f 20 0a 20  a PK, skip to . 
7740: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74       ** the next
7750: 20 63 6f 6c 75 6d 6e 2e 20 49 66 20 74 68 65 20   column. If the 
7760: 63 75 72 72 65 6e 74 20 66 75 7a 7a 20 69 73 20  current fuzz is 
7770: 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 54 59 50 45  FUZZ_CHANGE_TYPE
7780: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
7790: 77 72 69 74 65 20 61 20 72 61 6e 64 6f 6d 6c 79  write a randomly
77a0: 20 73 65 6c 65 63 74 65 64 20 76 61 6c 75 65 20   selected value 
77b0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
77c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 50 53  */.      if( bPS
77d0: 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
77e0: 45 5f 44 45 4c 45 54 45 20 26 26 20 70 47 72 70  E_DELETE && pGrp
77f0: 2d 3e 61 50 4b 5b 69 5d 3d 3d 30 20 29 7b 0a 20  ->aPK[i]==0 ){. 
7800: 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
7810: 21 3d 65 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !=eNew ){.      
7820: 20 20 20 20 61 73 73 65 72 74 28 20 65 4e 65 77      assert( eNew
7830: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
7840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 20  );.          do 
7850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
7860: 6f 70 79 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  opy = pParse->ap
7870: 56 61 6c 5b 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e  Val[fuzzRandomIn
7880: 74 28 70 50 61 72 73 65 2d 3e 6e 56 61 6c 29 5d  t(pParse->nVal)]
7890: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 77 68 69  ;.          }whi
78a0: 6c 65 28 20 70 43 6f 70 79 5b 30 5d 3d 3d 30 78  le( pCopy[0]==0x
78b0: 30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  00 );.          
78c0: 66 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65 28 70  fuzzChangeSize(p
78d0: 43 6f 70 79 2c 20 26 73 7a 29 3b 0a 20 20 20 20  Copy, &sz);.    
78e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
78f0: 74 2c 20 70 43 6f 70 79 2c 20 73 7a 29 3b 0a 20  t, pCopy, sz);. 
7900: 20 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d           pOut +=
7910: 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   sz;.        }. 
7920: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7930: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7940: 69 66 28 20 70 3d 3d 70 46 75 7a 7a 2d 3e 70 53  if( p==pFuzz->pS
7950: 75 62 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ub1 ){.        p
7960: 43 6f 70 79 20 3d 20 70 46 75 7a 7a 2d 3e 70 53  Copy = pFuzz->pS
7970: 75 62 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ub2;.      }else
7980: 20 69 66 28 20 70 3d 3d 70 46 75 7a 7a 2d 3e 70   if( p==pFuzz->p
7990: 53 75 62 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Sub2 ){.        
79a0: 70 43 6f 70 79 20 3d 20 70 46 75 7a 7a 2d 3e 70  pCopy = pFuzz->p
79b0: 53 75 62 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Sub1;.      }els
79c0: 65 20 69 66 28 20 69 3d 3d 69 55 6e 64 65 66 20  e if( i==iUndef 
79d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 70 79  ){.        pCopy
79e0: 20 3d 20 28 75 38 2a 29 22 5c 30 22 3b 0a 20 20   = (u8*)"\0";.  
79f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
7a00: 20 70 43 6f 70 79 5b 30 5d 3d 3d 30 78 30 30 20   pCopy[0]==0x00 
7a10: 26 26 20 65 4e 65 77 21 3d 65 54 79 70 65 20 26  && eNew!=eType &
7a20: 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
7a30: 55 50 44 41 54 45 20 26 26 20 69 52 65 63 3d 3d  UPDATE && iRec==
7a40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
7a50: 6c 65 28 20 70 43 6f 70 79 5b 30 5d 3d 3d 30 78  le( pCopy[0]==0x
7a60: 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
7a70: 70 43 6f 70 79 20 3d 20 70 50 61 72 73 65 2d 3e  pCopy = pParse->
7a80: 61 70 56 61 6c 5b 66 75 7a 7a 52 61 6e 64 6f 6d  apVal[fuzzRandom
7a90: 49 6e 74 28 70 50 61 72 73 65 2d 3e 6e 56 61 6c  Int(pParse->nVal
7aa0: 29 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  )];.        }.  
7ab0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 5b      }else if( p[
7ac0: 30 5d 3d 3d 30 78 30 30 20 26 26 20 70 43 6f 70  0]==0x00 && pCop
7ad0: 79 5b 30 5d 21 3d 30 78 30 30 20 29 7b 0a 20 20  y[0]!=0x00 ){.  
7ae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
7af0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b00: 20 20 20 20 20 20 69 66 28 20 70 47 72 70 2d 3e        if( pGrp->
7b10: 61 50 4b 5b 69 5d 3e 30 20 26 26 20 70 43 6f 70  aPK[i]>0 && pCop
7b20: 79 5b 30 5d 3d 3d 30 78 30 35 20 29 20 72 65 74  y[0]==0x05 ) ret
7b30: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
7b40: 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75 7a  .      if( (pFuz
7b50: 7a 2d 3e 69 47 72 6f 75 70 21 3d 69 47 72 70 20  z->iGroup!=iGrp 
7b60: 7c 7c 20 69 21 3d 70 46 75 7a 7a 2d 3e 69 44 65  || i!=pFuzz->iDe
7b70: 6c 65 74 65 29 0a 20 20 20 20 20 20 20 26 26 20  lete).       && 
7b80: 28 65 4e 65 77 3d 3d 65 54 79 70 65 20 7c 7c 20  (eNew==eType || 
7b90: 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 55 50  eType!=SQLITE_UP
7ba0: 44 41 54 45 20 7c 7c 20 69 52 65 63 3d 3d 30 29  DATE || iRec==0)
7bb0: 0a 20 20 20 20 20 20 20 26 26 20 28 65 4e 65 77  .       && (eNew
7bc0: 3d 3d 65 54 79 70 65 20 7c 7c 20 65 4e 65 77 21  ==eType || eNew!
7bd0: 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 7c  =SQLITE_DELETE |
7be0: 7c 20 21 62 50 53 20 7c 7c 20 70 47 72 70 2d 3e  | !bPS || pGrp->
7bf0: 61 50 4b 5b 69 5d 29 0a 20 20 20 20 20 20 29 7b  aPK[i]).      ){
7c00: 0a 20 20 20 20 20 20 20 20 66 75 7a 7a 43 68 61  .        fuzzCha
7c10: 6e 67 65 53 69 7a 65 28 70 43 6f 70 79 2c 20 26  ngeSize(pCopy, &
7c20: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  sz);.        mem
7c30: 63 70 79 28 70 4f 75 74 2c 20 70 43 6f 70 79 2c  cpy(pOut, pCopy,
7c40: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4f   sz);.        pO
7c50: 75 74 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ut += sz;.      
7c60: 20 20 6e 55 70 64 61 74 65 20 2b 3d 20 28 70 47    nUpdate += (pG
7c70: 72 70 2d 3e 61 50 4b 5b 69 5d 3d 3d 30 20 26 26  rp->aPK[i]==0 &&
7c80: 20 70 43 6f 70 79 5b 30 5d 21 3d 30 78 30 30 29   pCopy[0]!=0x00)
7c90: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7ca0: 20 66 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65 28   fuzzChangeSize(
7cb0: 70 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 70  p, &sz);.      p
7cc0: 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 7d 0a 0a 20   += sz;.    }.. 
7cd0: 20 20 20 69 66 28 20 69 47 72 70 3d 3d 70 46 75     if( iGrp==pFu
7ce0: 7a 7a 2d 3e 69 47 72 6f 75 70 20 29 7b 0a 20 20  zz->iGroup ){.  
7cf0: 20 20 20 20 69 66 28 20 70 46 75 7a 7a 2d 3e 65      if( pFuzz->e
7d00: 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 4f 4c 55 4d  Type==FUZZ_COLUM
7d10: 4e 5f 41 44 44 20 29 7b 0a 20 20 20 20 20 20 20  N_ADD ){.       
7d20: 20 69 66 28 20 21 62 50 53 20 7c 7c 20 65 54 79   if( !bPS || eTy
7d30: 70 65 21 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  pe!=SQLITE_DELET
7d40: 45 20 29 20 2a 28 70 4f 75 74 2b 2b 29 20 3d 20  E ) *(pOut++) = 
7d50: 30 78 30 35 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0x05;.      }els
7d60: 65 20 69 66 28 20 70 46 75 7a 7a 2d 3e 65 54 79  e if( pFuzz->eTy
7d70: 70 65 3d 3d 46 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f  pe==FUZZ_COLUMN_
7d80: 41 44 44 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  ADDPK ){.       
7d90: 20 69 66 28 20 69 52 65 63 3d 3d 31 20 29 7b 0a   if( iRec==1 ){.
7da0: 20 20 20 20 20 20 20 20 20 20 2a 28 70 4f 75 74            *(pOut
7db0: 2b 2b 29 20 3d 20 30 78 30 30 3b 0a 20 20 20 20  ++) = 0x00;.    
7dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7dd0: 20 20 20 20 20 75 38 20 2a 70 4e 65 77 3b 0a 20       u8 *pNew;. 
7de0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 4e           int szN
7df0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  ew;.          do
7e00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   {.            p
7e10: 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  New = pParse->ap
7e20: 56 61 6c 5b 66 75 7a 7a 52 61 6e 64 6f 6d 49 6e  Val[fuzzRandomIn
7e30: 74 28 70 50 61 72 73 65 2d 3e 6e 56 61 6c 29 5d  t(pParse->nVal)]
7e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 77 68 69  ;.          }whi
7e50: 6c 65 28 20 70 4e 65 77 5b 30 5d 3d 3d 30 78 30  le( pNew[0]==0x0
7e60: 30 20 7c 7c 20 70 4e 65 77 5b 30 5d 3d 3d 30 78  0 || pNew[0]==0x
7e70: 30 35 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  05 );.          
7e80: 66 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65 28 70  fuzzChangeSize(p
7e90: 4e 65 77 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  New, &szNew);.  
7ea0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
7eb0: 4f 75 74 2c 20 70 4e 65 77 2c 20 73 7a 4e 65 77  Out, pNew, szNew
7ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 75  );.          pOu
7ed0: 74 20 2b 3d 20 73 7a 4e 65 77 3b 0a 20 20 20 20  t += szNew;.    
7ee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7ef0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
7f00: 46 75 7a 7a 2d 3e 69 43 75 72 72 65 6e 74 3d 3d  Fuzz->iCurrent==
7f10: 70 46 75 7a 7a 2d 3e 69 43 68 61 6e 67 65 20 29  pFuzz->iChange )
7f20: 7b 0a 20 20 20 20 69 66 28 20 70 46 75 7a 7a 2d  {.    if( pFuzz-
7f30: 3e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 48 41  >eType==FUZZ_CHA
7f40: 4e 47 45 5f 44 55 50 20 29 7b 0a 20 20 20 20 20  NGE_DUP ){.     
7f50: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 4f 75   int nByte = pOu
7f60: 74 20 2d 20 28 2a 70 70 4f 75 74 29 3b 0a 20 20  t - (*ppOut);.  
7f70: 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c      memcpy(pOut,
7f80: 20 2a 70 70 4f 75 74 2c 20 6e 42 79 74 65 29 3b   *ppOut, nByte);
7f90: 0a 20 20 20 20 20 20 70 4f 75 74 20 2b 3d 20 6e  .      pOut += n
7fa0: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Byte;.    }..   
7fb0: 20 69 66 28 20 70 46 75 7a 7a 2d 3e 65 54 79 70   if( pFuzz->eTyp
7fc0: 65 3d 3d 46 55 5a 5a 5f 43 48 41 4e 47 45 5f 44  e==FUZZ_CHANGE_D
7fd0: 45 4c 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74  EL ){.      pOut
7fe0: 20 3d 20 2a 70 70 4f 75 74 3b 0a 20 20 20 20 7d   = *ppOut;.    }
7ff0: 0a 20 20 20 20 69 66 28 20 65 4e 65 77 21 3d 65  .    if( eNew!=e
8000: 54 79 70 65 20 26 26 20 65 4e 65 77 3d 3d 53 51  Type && eNew==SQ
8010: 4c 49 54 45 5f 55 50 44 41 54 45 20 26 26 20 21  LITE_UPDATE && !
8020: 62 50 53 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  bPS ){.      int
8030: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   i;.      u8 *pC
8040: 73 72 20 3d 20 28 2a 70 70 4f 75 74 29 20 2b 20  sr = (*ppOut) + 
8050: 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  2;.      for(i=0
8060: 3b 20 69 3c 70 47 72 70 2d 3e 6e 43 6f 6c 3b 20  ; i<pGrp->nCol; 
8070: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
8080: 74 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 75 38  t sz;.        u8
8090: 20 2a 70 43 6f 70 79 20 3d 20 70 43 73 72 3b 0a   *pCopy = pCsr;.
80a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 47 72 70          if( pGrp
80b0: 2d 3e 61 50 4b 5b 69 5d 20 29 20 70 43 6f 70 79  ->aPK[i] ) pCopy
80c0: 20 3d 20 28 75 38 2a 29 22 5c 30 22 3b 0a 20 20   = (u8*)"\0";.  
80d0: 20 20 20 20 20 20 66 75 7a 7a 43 68 61 6e 67 65        fuzzChange
80e0: 53 69 7a 65 28 70 43 6f 70 79 2c 20 26 73 7a 29  Size(pCopy, &sz)
80f0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
8100: 28 70 4f 75 74 2c 20 70 43 6f 70 79 2c 20 73 7a  (pOut, pCopy, sz
8110: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20  );.        pOut 
8120: 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 66  += sz;.        f
8130: 75 7a 7a 43 68 61 6e 67 65 53 69 7a 65 28 70 43  uzzChangeSize(pC
8140: 73 72 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  sr, &sz);.      
8150: 20 20 70 43 73 72 20 2b 3d 20 73 7a 3b 0a 20 20    pCsr += sz;.  
8160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8170: 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d  .  /* If a colum
8180: 6e 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  n is being delet
8190: 65 64 20 66 72 6f 6d 20 74 68 69 73 20 67 72 6f  ed from this gro
81a0: 75 70 2c 20 61 6e 64 20 74 68 69 73 20 63 68 61  up, and this cha
81b0: 6e 67 65 20 77 61 73 20 61 6e 20 0a 20 20 2a 2a  nge was an .  **
81c0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 74 68 65   UPDATE, and the
81d0: 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 6e 6f  re are now no no
81e0: 6e 2d 50 4b 2c 20 6e 6f 6e 2d 75 6e 64 65 66 69  n-PK, non-undefi
81f0: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
8200: 68 65 20 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2c  he .  ** change,
8210: 20 72 65 6d 6f 76 65 20 69 74 20 61 6c 74 6f 67   remove it altog
8220: 65 74 68 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  ether. */.  if( 
8230: 70 46 75 7a 7a 2d 3e 65 54 79 70 65 3d 3d 46 55  pFuzz->eType==FU
8240: 5a 5a 5f 43 4f 4c 55 4d 4e 5f 44 45 4c 20 26 26  ZZ_COLUMN_DEL &&
8250: 20 70 46 75 7a 7a 2d 3e 69 47 72 6f 75 70 3d 3d   pFuzz->iGroup==
8260: 69 47 72 70 20 0a 20 20 20 26 26 20 65 54 79 70  iGrp .   && eTyp
8270: 65 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e==SQLITE_UPDATE
8280: 20 26 26 20 6e 55 70 64 61 74 65 3d 3d 30 20 0a   && nUpdate==0 .
8290: 20 20 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20    ){.    pOut = 
82a0: 2a 70 70 4f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2a  *ppOut;.  }..  *
82b0: 70 70 20 3d 20 70 3b 0a 20 20 2a 70 70 4f 75 74  pp = p;.  *ppOut
82c0: 20 3d 20 70 4f 75 74 3b 0a 20 20 70 46 75 7a 7a   = pOut;.  pFuzz
82d0: 2d 3e 69 43 75 72 72 65 6e 74 20 2b 3d 20 28 65  ->iCurrent += (e
82e0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 55 50 44  Type==SQLITE_UPD
82f0: 41 54 45 20 7c 7c 20 70 46 75 7a 7a 2d 3e 65 54  ATE || pFuzz->eT
8300: 79 70 65 21 3d 46 55 5a 5a 5f 43 48 41 4e 47 45  ype!=FUZZ_CHANGE
8310: 5f 46 49 45 4c 44 29 3b 0a 20 20 72 65 74 75 72  _FIELD);.  retur
8320: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8330: 2f 2a 0a 2a 2a 20 46 75 7a 7a 20 74 68 65 20 63  /*.** Fuzz the c
8340: 68 61 6e 67 65 73 65 74 20 70 61 72 73 65 64 20  hangeset parsed 
8350: 69 6e 74 6f 20 6f 62 6a 65 63 74 20 70 50 61 72  into object pPar
8360: 73 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  se and write the
8370: 20 72 65 73 75 6c 74 73 20 0a 2a 2a 20 74 6f 20   results .** to 
8380: 66 69 6c 65 20 7a 4f 75 74 20 6f 6e 20 64 69 73  file zOut on dis
8390: 6b 2e 20 41 72 67 75 6d 65 6e 74 20 70 42 75 66  k. Argument pBuf
83a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
83b0: 66 65 72 20 74 68 61 74 20 69 73 20 67 75 61 72  fer that is guar
83c0: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
83d0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
83e0: 68 6f 6c 64 20 74 68 65 20 66 75 7a 7a 65 64 20  hold the fuzzed 
83f0: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a  changeset..**.**
8400: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8410: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
8420: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
8430: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
8440: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
8450: 73 74 61 74 69 63 20 69 6e 74 20 66 75 7a 7a 44  static int fuzzD
8460: 6f 4f 6e 65 46 75 7a 7a 28 0a 20 20 63 6f 6e 73  oOneFuzz(.  cons
8470: 74 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20  t char *zOut,   
8480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8490: 69 6c 65 6e 61 6d 65 20 74 6f 20 77 72 69 74 65  ilename to write
84a0: 20 6d 6f 64 69 66 69 65 64 20 63 68 61 6e 67 65   modified change
84b0: 73 65 74 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a  set to */.  u8 *
84c0: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
84e0: 75 66 66 65 72 20 74 6f 20 75 73 65 20 66 6f 72  uffer to use for
84f0: 20 6d 6f 64 69 66 69 65 64 20 63 68 61 6e 67 65   modified change
8500: 73 65 74 20 2a 2f 0a 20 20 46 75 7a 7a 43 68 61  set */.  FuzzCha
8510: 6e 67 65 73 65 74 20 2a 70 50 61 72 73 65 20 20  ngeset *pParse  
8520: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
8530: 65 20 6f 66 20 69 6e 70 75 74 20 63 68 61 6e 67  e of input chang
8540: 65 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 7a  eset */.){.  Fuz
8550: 7a 43 68 61 6e 67 65 20 63 68 61 6e 67 65 3b 0a  zChange change;.
8560: 20 20 69 6e 74 20 69 47 72 70 3b 0a 20 20 69 6e    int iGrp;.  in
8570: 74 20 72 63 20 3d 20 2d 31 3b 0a 0a 20 20 77 68  t rc = -1;..  wh
8580: 69 6c 65 28 20 72 63 3c 30 20 29 7b 0a 20 20 20  ile( rc<0 ){.   
8590: 20 75 38 20 2a 70 4f 75 74 20 3d 20 70 42 75 66   u8 *pOut = pBuf
85a0: 3b 0a 20 20 20 20 72 63 20 3d 20 66 75 7a 7a 53  ;.    rc = fuzzS
85b0: 65 6c 65 63 74 43 68 61 6e 67 65 28 70 50 61 72  electChange(pPar
85c0: 73 65 2c 20 26 63 68 61 6e 67 65 29 3b 0a 20 20  se, &change);.  
85d0: 20 20 66 6f 72 28 69 47 72 70 3d 30 3b 20 72 63    for(iGrp=0; rc
85e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
85f0: 47 72 70 3c 70 50 61 72 73 65 2d 3e 6e 47 72 6f  Grp<pParse->nGro
8600: 75 70 3b 20 69 47 72 70 2b 2b 29 7b 0a 20 20 20  up; iGrp++){.   
8610: 20 20 20 46 75 7a 7a 43 68 61 6e 67 65 73 65 74     FuzzChangeset
8620: 47 72 6f 75 70 20 2a 70 47 72 70 20 3d 20 70 50  Group *pGrp = pP
8630: 61 72 73 65 2d 3e 61 70 47 72 6f 75 70 5b 69 47  arse->apGroup[iG
8640: 72 70 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  rp];.      int n
8650: 54 61 62 20 3d 20 73 74 72 6c 65 6e 28 70 47 72  Tab = strlen(pGr
8660: 70 2d 3e 7a 54 61 62 29 20 2b 20 31 3b 0a 20 20  p->zTab) + 1;.  
8670: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8680: 20 69 6e 74 20 6e 52 65 70 20 3d 20 31 3b 0a 0a   int nRep = 1;..
8690: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
86a0: 20 69 73 20 74 68 65 20 67 72 6f 75 70 20 74 6f   is the group to
86b0: 20 64 65 6c 65 74 65 20 66 6f 72 20 61 20 46 55   delete for a FU
86c0: 5a 5a 5f 47 52 4f 55 50 5f 44 45 4c 20 63 68 61  ZZ_GROUP_DEL cha
86d0: 6e 67 65 2c 20 6a 75 6d 70 20 74 6f 0a 20 20 20  nge, jump to.   
86e0: 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 67     ** the next g
86f0: 72 6f 75 70 2e 20 55 6e 6c 65 73 73 20 74 68 69  roup. Unless thi
8700: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 67 72  s is the only gr
8710: 6f 75 70 20 69 6e 20 74 68 65 20 63 68 61 6e 67  oup in the chang
8720: 65 73 65 74 20 2d 20 69 6e 0a 20 20 20 20 20 20  eset - in.      
8730: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 69  ** that case thi
8740: 73 20 63 68 61 6e 67 65 20 63 61 6e 6e 6f 74 20  s change cannot 
8750: 62 65 20 61 70 70 6c 69 65 64 2e 0a 20 20 20 20  be applied..    
8760: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
8770: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 46  , if this is a F
8780: 55 5a 5a 5f 47 52 4f 55 50 5f 44 55 50 2c 20 73  UZZ_GROUP_DUP, s
8790: 65 74 20 6e 52 65 70 20 74 6f 20 32 20 74 6f 20  et nRep to 2 to 
87a0: 6f 75 74 70 75 74 20 74 77 6f 0a 20 20 20 20 20  output two.     
87b0: 20 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 74 68   ** copies of th
87c0: 65 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 20 20  e group. */.    
87d0: 20 20 69 66 28 20 63 68 61 6e 67 65 2e 69 47 72    if( change.iGr
87e0: 6f 75 70 3d 3d 69 47 72 70 20 29 7b 0a 20 20 20  oup==iGrp ){.   
87f0: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 2e       if( change.
8800: 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 47 52 4f 55  eType==FUZZ_GROU
8810: 50 5f 44 45 4c 20 29 7b 0a 20 20 20 20 20 20 20  P_DEL ){.       
8820: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
8830: 47 72 6f 75 70 3d 3d 31 20 29 20 72 63 20 3d 20  Group==1 ) rc = 
8840: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  -1;.          co
8850: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8860: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  }.        else i
8870: 66 28 20 63 68 61 6e 67 65 2e 65 54 79 70 65 3d  f( change.eType=
8880: 3d 46 55 5a 5a 5f 47 52 4f 55 50 5f 44 55 50 20  =FUZZ_GROUP_DUP 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65  ){.          nRe
88a0: 70 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  p = 2;.        }
88b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
88c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 65 70 3b  for(j=0; j<nRep;
88d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
88e0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 75 38  nt i;.        u8
88f0: 20 2a 70 53 61 76 65 64 3b 0a 20 20 20 20 20 20   *pSaved;.      
8900: 20 20 75 38 20 2a 70 20 3d 20 70 47 72 70 2d 3e    u8 *p = pGrp->
8910: 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20  aChange;.       
8920: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 47 72 70   int nCol = pGrp
8930: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
8940: 69 6e 74 20 69 50 4b 44 65 6c 20 3d 20 30 3b 0a  int iPKDel = 0;.
8950: 20 20 20 20 20 20 20 20 69 66 28 20 69 47 72 70          if( iGrp
8960: 3d 3d 63 68 61 6e 67 65 2e 69 47 72 6f 75 70 20  ==change.iGroup 
8970: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8980: 20 63 68 61 6e 67 65 2e 65 54 79 70 65 3d 3d 46   change.eType==F
8990: 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 41 44 44 20 0a  UZZ_COLUMN_ADD .
89a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63 68             || ch
89b0: 61 6e 67 65 2e 65 54 79 70 65 3d 3d 46 55 5a 5a  ange.eType==FUZZ
89c0: 5f 43 4f 4c 55 4d 4e 5f 41 44 44 50 4b 20 0a 20  _COLUMN_ADDPK . 
89d0: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
89e0: 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
89f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
8a00: 69 66 28 20 63 68 61 6e 67 65 2e 65 54 79 70 65  if( change.eType
8a10: 3d 3d 46 55 5a 5a 5f 43 4f 4c 55 4d 4e 5f 44 45  ==FUZZ_COLUMN_DE
8a20: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
8a30: 20 6e 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20   nCol--;.       
8a40: 20 20 20 20 20 69 50 4b 44 65 6c 20 3d 20 70 47       iPKDel = pG
8a50: 72 70 2d 3e 61 50 4b 5b 63 68 61 6e 67 65 2e 69  rp->aPK[change.i
8a60: 44 65 6c 65 74 65 5d 3b 0a 20 20 20 20 20 20 20  Delete];.       
8a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
8a90: 74 20 61 20 74 61 62 6c 65 20 68 65 61 64 65 72  t a table header
8aa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 75 74   */.        pOut
8ab0: 2b 2b 5b 30 5d 20 3d 20 70 50 61 72 73 65 2d 3e  ++[0] = pParse->
8ac0: 62 50 61 74 63 68 73 65 74 20 3f 20 27 50 27 20  bPatchset ? 'P' 
8ad0: 3a 20 27 54 27 3b 0a 20 20 20 20 20 20 20 20 70  : 'T';.        p
8ae0: 4f 75 74 20 2b 3d 20 66 75 7a 7a 50 75 74 56 61  Out += fuzzPutVa
8af0: 72 69 6e 74 28 70 4f 75 74 2c 20 6e 43 6f 6c 29  rint(pOut, nCol)
8b00: 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ;..        for(i
8b10: 3d 30 3b 20 69 3c 70 47 72 70 2d 3e 6e 43 6f 6c  =0; i<pGrp->nCol
8b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8b30: 20 20 69 66 28 20 69 47 72 70 21 3d 63 68 61 6e    if( iGrp!=chan
8b40: 67 65 2e 69 47 72 6f 75 70 20 7c 7c 20 69 21 3d  ge.iGroup || i!=
8b50: 63 68 61 6e 67 65 2e 69 44 65 6c 65 74 65 20 29  change.iDelete )
8b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
8b70: 20 76 20 3d 20 70 47 72 70 2d 3e 61 50 4b 5b 69   v = pGrp->aPK[i
8b80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
8b90: 66 28 20 69 50 4b 44 65 6c 20 26 26 20 76 3e 69  f( iPKDel && v>i
8ba0: 50 4b 44 65 6c 20 29 20 76 2d 2d 3b 0a 20 20 20  PKDel ) v--;.   
8bb0: 20 20 20 20 20 20 20 20 20 2a 28 70 4f 75 74 2b           *(pOut+
8bc0: 2b 29 20 3d 20 76 3b 0a 20 20 20 20 20 20 20 20  +) = v;.        
8bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8be0: 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 70        if( nCol>p
8bf0: 47 72 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Grp->nCol ){.   
8c00: 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67         if( chang
8c10: 65 2e 65 54 79 70 65 3d 3d 46 55 5a 5a 5f 43 4f  e.eType==FUZZ_CO
8c20: 4c 55 4d 4e 5f 41 44 44 20 29 7b 0a 20 20 20 20  LUMN_ADD ){.    
8c30: 20 20 20 20 20 20 20 20 2a 28 70 4f 75 74 2b 2b          *(pOut++
8c40: 29 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 20 20  ) = 0x00;.      
8c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8c60: 20 20 20 20 20 20 20 75 38 20 6d 61 78 20 3d 20         u8 max = 
8c70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  0;.            f
8c80: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 70 2d 3e  or(i=0; i<pGrp->
8c90: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8ca0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 47            if( pG
8cb0: 72 70 2d 3e 61 50 4b 5b 69 5d 3e 6d 61 78 20 29  rp->aPK[i]>max )
8cc0: 20 6d 61 78 20 3d 20 70 47 72 70 2d 3e 61 50 4b   max = pGrp->aPK
8cd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
8ce0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
8cf0: 28 70 4f 75 74 2b 2b 29 20 3d 20 6d 61 78 2b 31  (pOut++) = max+1
8d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8d20: 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20 70 47 72  memcpy(pOut, pGr
8d30: 70 2d 3e 7a 54 61 62 2c 20 6e 54 61 62 29 3b 0a  p->zTab, nTab);.
8d40: 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d 20          pOut += 
8d50: 6e 54 61 62 3b 0a 0a 20 20 20 20 20 20 20 20 2f  nTab;..        /
8d60: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 63 68 61  * Output the cha
8d70: 6e 67 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  nge array. */.  
8d80: 20 20 20 20 20 20 70 53 61 76 65 64 20 3d 20 70        pSaved = p
8d90: 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Out;.        for
8da0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
8db0: 5f 4f 4b 20 26 26 20 69 3c 70 47 72 70 2d 3e 6e  _OK && i<pGrp->n
8dc0: 43 68 61 6e 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  Change; i++){.  
8dd0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 75 7a          rc = fuz
8de0: 7a 43 6f 70 79 43 68 61 6e 67 65 28 70 50 61 72  zCopyChange(pPar
8df0: 73 65 2c 20 69 47 72 70 2c 20 26 63 68 61 6e 67  se, iGrp, &chang
8e00: 65 2c 20 26 70 2c 20 26 70 4f 75 74 29 3b 0a 20  e, &p, &pOut);. 
8e10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8e20: 20 69 66 28 20 70 4f 75 74 3d 3d 70 53 61 76 65   if( pOut==pSave
8e30: 64 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20  d ) rc = -1;.   
8e40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8e50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8e60: 20 29 7b 0a 20 20 20 20 20 20 66 75 7a 7a 57 72   ){.      fuzzWr
8e70: 69 74 65 46 69 6c 65 28 7a 4f 75 74 2c 20 70 42  iteFile(zOut, pB
8e80: 75 66 2c 20 70 4f 75 74 2d 70 42 75 66 29 3b 0a  uf, pOut-pBuf);.
8e90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ea0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6d  urn rc;.}..int m
8eb0: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
8ec0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ar **argv){.  in
8ed0: 74 20 6e 52 65 70 65 61 74 20 3d 20 30 3b 20 20  t nRepeat = 0;  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ef0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
8f00: 74 20 66 69 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  t files */.  int
8f10: 20 69 53 65 65 64 20 3d 20 30 3b 20 20 20 20 20   iSeed = 0;     
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f30: 56 61 6c 75 65 20 6f 66 20 50 52 4e 47 20 73 65  Value of PRNG se
8f40: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8f50: 61 72 20 2a 7a 49 6e 70 75 74 3b 20 20 20 20 20  ar *zInput;     
8f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8f70: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
8f80: 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65  .  void *pChange
8f90: 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
8fa0: 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e     /* Input chan
8fb0: 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  geset */.  int n
8fc0: 43 68 61 6e 67 65 73 65 74 20 3d 20 30 3b 20 20  Changeset = 0;  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8fe0: 7a 65 20 6f 66 20 69 6e 70 75 74 20 63 68 61 6e  ze of input chan
8ff0: 67 65 73 65 74 20 69 6e 20 62 79 74 65 73 20 2a  geset in bytes *
9000: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
9030: 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  utput file */.  
9040: 46 75 7a 7a 43 68 61 6e 67 65 73 65 74 20 63 68  FuzzChangeset ch
9050: 61 6e 67 65 73 65 74 3b 20 20 20 20 20 20 20 20  angeset;        
9060: 2f 2a 20 50 61 72 74 69 61 6c 6c 79 20 70 61 72  /* Partially par
9070: 73 65 64 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  sed changeset */
9080: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
9090: 2a 70 42 75 66 20 3d 20 30 3b 0a 0a 20 20 69 66  *pBuf = 0;..  if
90a0: 28 20 61 72 67 63 21 3d 34 20 26 26 20 61 72 67  ( argc!=4 && arg
90b0: 63 21 3d 32 20 29 20 75 73 61 67 65 28 61 72 67  c!=2 ) usage(arg
90c0: 76 5b 30 5d 29 3b 0a 20 20 7a 49 6e 70 75 74 20  v[0]);.  zInput 
90d0: 3d 20 61 72 67 76 5b 31 5d 3b 0a 0a 20 20 66 75  = argv[1];..  fu
90e0: 7a 7a 52 65 61 64 46 69 6c 65 28 7a 49 6e 70 75  zzReadFile(zInpu
90f0: 74 2c 20 26 6e 43 68 61 6e 67 65 73 65 74 2c 20  t, &nChangeset, 
9100: 26 70 43 68 61 6e 67 65 73 65 74 29 3b 0a 20 20  &pChangeset);.  
9110: 72 63 20 3d 20 66 75 7a 7a 50 61 72 73 65 43 68  rc = fuzzParseCh
9120: 61 6e 67 65 73 65 74 28 70 43 68 61 6e 67 65 73  angeset(pChanges
9130: 65 74 2c 20 6e 43 68 61 6e 67 65 73 65 74 2c 20  et, nChangeset, 
9140: 26 63 68 61 6e 67 65 73 65 74 29 3b 0a 0a 20 20  &changeset);..  
9150: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9160: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  K ){.    if( arg
9170: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 66 6f  c==2 ){.      fo
9180: 72 28 69 3d 30 3b 20 69 3c 63 68 61 6e 67 65 73  r(i=0; i<changes
9190: 65 74 2e 6e 47 72 6f 75 70 3b 20 69 2b 2b 29 7b  et.nGroup; i++){
91a0: 0a 20 20 20 20 20 20 20 20 66 75 7a 7a 50 72 69  .        fuzzPri
91b0: 6e 74 47 72 6f 75 70 28 26 63 68 61 6e 67 65 73  ntGroup(&changes
91c0: 65 74 2c 20 63 68 61 6e 67 65 73 65 74 2e 61 70  et, changeset.ap
91d0: 47 72 6f 75 70 5b 69 5d 29 3b 0a 20 20 20 20 20  Group[i]);.     
91e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
91f0: 20 20 20 20 70 42 75 66 20 3d 20 28 75 38 2a 29      pBuf = (u8*)
9200: 66 75 7a 7a 4d 61 6c 6c 6f 63 28 28 73 71 6c 69  fuzzMalloc((sqli
9210: 74 65 33 5f 69 6e 74 36 34 29 6e 43 68 61 6e 67  te3_int64)nChang
9220: 65 73 65 74 2a 32 20 2b 20 31 30 32 34 29 3b 0a  eset*2 + 1024);.
9230: 20 20 20 20 20 20 69 66 28 20 70 42 75 66 3d 3d        if( pBuf==
9240: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
9250: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9260: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9270: 20 20 20 20 20 69 53 65 65 64 20 3d 20 61 74 6f       iSeed = ato
9280: 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  i(argv[2]);.    
9290: 20 20 20 20 6e 52 65 70 65 61 74 20 3d 20 61 74      nRepeat = at
92a0: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  oi(argv[3]);.   
92b0: 20 20 20 20 20 66 75 7a 7a 52 61 6e 64 6f 6d 53       fuzzRandomS
92c0: 65 65 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  eed((unsigned in
92d0: 74 29 69 53 65 65 64 29 3b 0a 20 20 20 20 20 20  t)iSeed);.      
92e0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
92f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52  QLITE_OK && i<nR
9300: 65 70 65 61 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  epeat; i++){.   
9310: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75         char *zOu
9320: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
9330: 6e 74 66 28 22 25 73 2d 25 64 22 2c 20 7a 49 6e  ntf("%s-%d", zIn
9340: 70 75 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  put, i);.       
9350: 20 20 20 72 63 20 3d 20 66 75 7a 7a 44 6f 4f 6e     rc = fuzzDoOn
9360: 65 46 75 7a 7a 28 7a 4f 75 74 2c 20 70 42 75 66  eFuzz(zOut, pBuf
9370: 2c 20 26 63 68 61 6e 67 65 73 65 74 29 3b 0a 20  , &changeset);. 
9380: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9390: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
93a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
93b0: 75 7a 7a 46 72 65 65 28 70 42 75 66 29 3b 0a 20  uzzFree(pBuf);. 
93c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
93d0: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
93e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 70 72  TE_OK ){.    fpr
93f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 65 72  intf(stderr, "er
9400: 72 6f 72 20 77 68 69 6c 65 20 70 72 6f 63 65 73  ror while proces
9410: 73 69 6e 67 20 63 68 61 6e 67 65 73 65 74 3a 20  sing changeset: 
9420: 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d 0a  %d\n", rc);.  }.
9430: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.