/ Hex Artifact Content
Login

Artifact 5f40a0660ff972c0c50f5fd6b33488fdbd2eb0c1244ea95777f8dbd5e529be04:


0000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
0010: 53 51 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f  SQLITESESSION_H_
0020: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
0030: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
0040: 4f 4e 29 0a 23 64 65 66 69 6e 65 20 5f 5f 53 51  ON).#define __SQ
0050: 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f 20 31  LITESESSION_H_ 1
0060: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
0070: 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 68  e we can call th
0080: 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 2b  is stuff from C+
0090: 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 63  +..*/.#ifdef __c
00a0: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
00b0: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 23 69  "C" {.#endif..#i
00c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
00d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  h"../*.** CAPI3R
00e0: 45 46 3a 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65  EF: Session Obje
00f0: 63 74 20 48 61 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20  ct Handle.**.** 
0100: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0110: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 61 20  his object is a 
0120: 5b 73 65 73 73 69 6f 6e 5d 20 74 68 61 74 20 63  [session] that c
0130: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 2a 2a  an be used to.**
0140: 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   record changes 
0150: 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a  to a database..*
0160: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0170: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0180: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0190: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
01a0: 46 3a 20 43 68 61 6e 67 65 73 65 74 20 49 74 65  F: Changeset Ite
01b0: 72 61 74 6f 72 20 48 61 6e 64 6c 65 0a 2a 2a 0a  rator Handle.**.
01c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
01d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 63  f this object ac
01e0: 74 73 20 61 73 20 61 20 63 75 72 73 6f 72 20 66  ts as a cursor f
01f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 0a 2a 2a 20  or iterating.** 
0200: 6f 76 65 72 20 74 68 65 20 65 6c 65 6d 65 6e 74  over the element
0210: 73 20 6f 66 20 61 20 5b 63 68 61 6e 67 65 73 65  s of a [changese
0220: 74 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 5d  t] or [patchset]
0230: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0240: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
0250: 67 65 73 65 74 5f 69 74 65 72 20 73 71 6c 69 74  geset_iter sqlit
0260: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0270: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  r;../*.** CAPI3R
0280: 45 46 3a 20 43 72 65 61 74 65 20 41 20 4e 65 77  EF: Create A New
0290: 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a   Session Object.
02a0: 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20  ** CONSTRUCTOR: 
02b0: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a  sqlite3_session.
02c0: 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  **.** Create a n
02d0: 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63  ew session objec
02e0: 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 64 61  t attached to da
02f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
0300: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
0310: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0320: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
0330: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
0340: 70 53 65 73 73 69 6f 6e 20 61 6e 64 20 53 51 4c  pSession and SQL
0350: 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
0360: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
0370: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 65  or occurs, *ppSe
0380: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
0390: 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69  NULL and an SQLi
03a0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
03b0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f   (e.g. SQLITE_NO
03c0: 4d 45 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64  MEM) is returned
03d0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f  ..**.** It is po
03e0: 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
03f0: 20 6d 75 6c 74 69 70 6c 65 20 73 65 73 73 69 6f   multiple sessio
0400: 6e 20 6f 62 6a 65 63 74 73 20 61 74 74 61 63 68  n objects attach
0410: 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  ed to a single.*
0420: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
0430: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 73 73 69 6f 6e  e..**.** Session
0440: 20 6f 62 6a 65 63 74 73 20 63 72 65 61 74 65 64   objects created
0450: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0460: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64  tion should be d
0470: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 65  eleted using the
0480: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
0490: 69 6f 6e 5f 64 65 6c 65 74 65 28 29 5d 20 66 75  ion_delete()] fu
04a0: 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  nction before th
04b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
04c0: 65 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  e that they.** a
04d0: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  re attached to i
04e0: 73 20 69 74 73 65 6c 66 20 63 6c 6f 73 65 64 2e  s itself closed.
04f0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
0500: 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65   handle is close
0510: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
0520: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
0530: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 6e 20  s deleted, then 
0540: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
0550: 61 6c 6c 69 6e 67 20 61 6e 79 20 73 65 73 73 69  alling any sessi
0560: 6f 6e 0a 2a 2a 20 6d 6f 64 75 6c 65 20 66 75 6e  on.** module fun
0570: 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
0580: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
0590: 5f 64 65 6c 65 74 65 28 29 5d 20 6f 6e 20 74 68  _delete()] on th
05a0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
05b0: 0a 2a 2a 20 61 72 65 20 75 6e 64 65 66 69 6e 65  .** are undefine
05c0: 64 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  d..**.** Because
05d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64   the session mod
05e0: 75 6c 65 20 75 73 65 73 20 74 68 65 20 5b 73 71  ule uses the [sq
05f0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
0600: 68 6f 6f 6b 28 29 5d 20 41 50 49 2c 20 69 74 0a  hook()] API, it.
0610: 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
0620: 6c 65 20 66 6f 72 20 61 6e 20 61 70 70 6c 69 63  le for an applic
0630: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
0640: 72 20 61 20 70 72 65 2d 75 70 64 61 74 65 20 68  r a pre-update h
0650: 6f 6f 6b 20 6f 6e 20 61 0a 2a 2a 20 64 61 74 61  ook on a.** data
0660: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
0670: 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   has one or more
0680: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   session objects
0690: 20 61 74 74 61 63 68 65 64 2e 20 4e 6f 72 20 69   attached. Nor i
06a0: 73 0a 2a 2a 20 69 74 20 70 6f 73 73 69 62 6c 65  s.** it possible
06b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 73   to create a ses
06c0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 74 74 61  sion object atta
06d0: 63 68 65 64 20 74 6f 20 61 20 64 61 74 61 62 61  ched to a databa
06e0: 73 65 20 68 61 6e 64 6c 65 20 66 6f 72 0a 2a 2a  se handle for.**
06f0: 20 77 68 69 63 68 20 61 20 70 72 65 2d 75 70 64   which a pre-upd
0700: 61 74 65 20 68 6f 6f 6b 20 69 73 20 61 6c 72 65  ate hook is alre
0710: 61 64 79 20 64 65 66 69 6e 65 64 2e 20 54 68 65  ady defined. The
0720: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 74 74 65   results of atte
0730: 6d 70 74 69 6e 67 20 0a 2a 2a 20 65 69 74 68 65  mpting .** eithe
0740: 72 20 6f 66 20 74 68 65 73 65 20 74 68 69 6e 67  r of these thing
0750: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
0760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69  .**.** The sessi
0770: 6f 6e 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  on object will b
0780: 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
0790: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
07a0: 74 61 62 6c 65 73 20 69 6e 0a 2a 2a 20 64 61 74  tables in.** dat
07b0: 61 62 61 73 65 20 7a 44 62 2c 20 77 68 65 72 65  abase zDb, where
07c0: 20 7a 44 62 20 69 73 20 65 69 74 68 65 72 20 22   zDb is either "
07d0: 6d 61 69 6e 22 2c 20 6f 72 20 22 74 65 6d 70 22  main", or "temp"
07e0: 2c 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  , or the name of
07f0: 20 61 6e 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   an.** attached 
0800: 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
0810: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
0820: 64 61 74 61 62 61 73 65 20 7a 44 62 20 69 73 20  database zDb is 
0830: 6e 6f 74 20 61 74 74 61 63 68 65 64 0a 2a 2a 20  not attached.** 
0840: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0850: 77 68 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e  when the session
0860: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
0870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0880: 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65  e3session_create
0890: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
08c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
08d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08f0: 61 6d 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20  ame of db (e.g. 
0900: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c  "main") */.  sql
0910: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70  ite3_session **p
0920: 70 53 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20  pSession     /* 
0930: 4f 55 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e  OUT: New session
0940: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f   object */.);../
0950: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
0960: 65 6c 65 74 65 20 41 20 53 65 73 73 69 6f 6e 20  elete A Session 
0970: 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52 55  Object.** DESTRU
0980: 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 73 65  CTOR: sqlite3_se
0990: 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  ssion.**.** Dele
09a0: 74 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  te a session obj
09b0: 65 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ect previously a
09c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 0a  llocated using .
09d0: 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  ** [sqlite3sessi
09e0: 6f 6e 5f 63 72 65 61 74 65 28 29 5d 2e 20 4f 6e  on_create()]. On
09f0: 63 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  ce a session obj
0a00: 65 63 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  ect has been del
0a10: 65 74 65 64 2c 20 74 68 65 0a 2a 2a 20 72 65 73  eted, the.** res
0a20: 75 6c 74 73 20 6f 66 20 61 74 74 65 6d 70 74 69  ults of attempti
0a30: 6e 67 20 74 6f 20 75 73 65 20 70 53 65 73 73 69  ng to use pSessi
0a40: 6f 6e 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  on with any othe
0a50: 72 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65  r session module
0a60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  .** function are
0a70: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
0a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
0a90: 73 20 6d 75 73 74 20 62 65 20 64 65 6c 65 74 65  s must be delete
0aa0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  d before the dat
0ab0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
0ac0: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 72  which they.** ar
0ad0: 65 20 61 74 74 61 63 68 65 64 20 69 73 20 63 6c  e attached is cl
0ae0: 6f 73 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74  osed. Refer to t
0af0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0b00: 20 66 6f 72 20 0a 2a 2a 20 5b 73 71 6c 69 74 65   for .** [sqlite
0b10: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
0b20: 29 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  )] for details..
0b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73  */.void sqlite3s
0b40: 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 73 71  ession_delete(sq
0b50: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
0b60: 53 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f 2a 0a 2a  Session);.../*.*
0b70: 2a 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62  * CAPI3REF: Enab
0b80: 6c 65 20 4f 72 20 44 69 73 61 62 6c 65 20 41 20  le Or Disable A 
0b90: 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a  Session Object.*
0ba0: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
0bb0: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
0bc0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 69 6e 67 20  e the recording 
0be0: 6f 66 20 63 68 61 6e 67 65 73 20 62 79 20 61 20  of changes by a 
0bf0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
0c00: 57 68 65 6e 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  When.** enabled,
0c10: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
0c20: 74 20 72 65 63 6f 72 64 73 20 63 68 61 6e 67 65  t records change
0c30: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
0c40: 74 61 62 61 73 65 2e 20 57 68 65 6e 0a 2a 2a 20  tabase. When.** 
0c50: 64 69 73 61 62 6c 65 64 20 2d 20 69 74 20 64 6f  disabled - it do
0c60: 65 73 20 6e 6f 74 2e 20 41 20 6e 65 77 6c 79 20  es not. A newly 
0c70: 63 72 65 61 74 65 64 20 73 65 73 73 69 6f 6e 20  created session 
0c80: 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c 65  object is enable
0c90: 64 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  d..** Refer to t
0ca0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0cb0: 20 66 6f 72 20 5b 73 71 6c 69 74 65 33 73 65 73   for [sqlite3ses
0cc0: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29  sion_changeset()
0cd0: 5d 20 66 6f 72 20 66 75 72 74 68 65 72 0a 2a 2a  ] for further.**
0ce0: 20 64 65 74 61 69 6c 73 20 72 65 67 61 72 64 69   details regardi
0cf0: 6e 67 20 68 6f 77 20 65 6e 61 62 6c 69 6e 67 20  ng how enabling 
0d00: 61 6e 64 20 64 69 73 61 62 6c 69 6e 67 20 61 20  and disabling a 
0d10: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  session object a
0d20: 66 66 65 63 74 73 0a 2a 2a 20 74 68 65 20 65 76  ffects.** the ev
0d30: 65 6e 74 75 61 6c 20 63 68 61 6e 67 65 73 65 74  entual changeset
0d40: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e 67  s..**.** Passing
0d50: 20 7a 65 72 6f 20 74 6f 20 74 68 69 73 20 66 75   zero to this fu
0d60: 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73 20  nction disables 
0d70: 74 68 65 20 73 65 73 73 69 6f 6e 2e 20 50 61 73  the session. Pas
0d80: 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 2a 2a 20  sing a value.** 
0d90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
0da0: 6f 20 65 6e 61 62 6c 65 73 20 69 74 2e 20 50 61  o enables it. Pa
0db0: 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20 6c 65  ssing a value le
0dc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 69 73 20  ss than zero is 
0dd0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c 20 61 6e 64  a .** no-op, and
0de0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0df0: 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
0e00: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  t state of the s
0e10: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
0e20: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0e30: 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69 6e  ndicates the fin
0e40: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
0e50: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 3a 20  session object: 
0e60: 30 20 69 66 20 0a 2a 2a 20 74 68 65 20 73 65 73  0 if .** the ses
0e70: 73 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64  sion is disabled
0e80: 2c 20 6f 72 20 31 20 69 66 20 69 74 20 69 73 20  , or 1 if it is 
0e90: 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20  enabled..*/.int 
0ea0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
0eb0: 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 65  nable(sqlite3_se
0ec0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
0ed0: 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 3b 0a 0a   int bEnable);..
0ee0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
0ef0: 53 65 74 20 4f 72 20 43 6c 65 61 72 20 74 68 65  Set Or Clear the
0f00: 20 49 6e 64 69 72 65 63 74 20 43 68 61 6e 67 65   Indirect Change
0f10: 20 46 6c 61 67 0a 2a 2a 20 4d 45 54 48 4f 44 3a   Flag.** METHOD:
0f20: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0f30: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 68 61 6e  .**.** Each chan
0f40: 67 65 20 72 65 63 6f 72 64 65 64 20 62 79 20 61  ge recorded by a
0f50: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
0f60: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 65 69 74  is marked as eit
0f70: 68 65 72 20 64 69 72 65 63 74 20 6f 72 0a 2a 2a  her direct or.**
0f80: 20 69 6e 64 69 72 65 63 74 2e 20 41 20 63 68 61   indirect. A cha
0f90: 6e 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nge is marked as
0fa0: 20 69 6e 64 69 72 65 63 74 20 69 66 20 65 69 74   indirect if eit
0fb0: 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  her:.**.** <ul>.
0fc0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 73 65  **   <li> The se
0fd0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 22 69 6e  ssion object "in
0fe0: 64 69 72 65 63 74 22 20 66 6c 61 67 20 69 73 20  direct" flag is 
0ff0: 73 65 74 20 77 68 65 6e 20 74 68 65 20 63 68 61  set when the cha
1000: 6e 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  nge is.**       
1010: 20 6d 61 64 65 2c 20 6f 72 0a 2a 2a 20 20 20 3c   made, or.**   <
1020: 6c 69 3e 20 54 68 65 20 63 68 61 6e 67 65 20 69  li> The change i
1030: 73 20 6d 61 64 65 20 62 79 20 61 6e 20 53 51 4c  s made by an SQL
1040: 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
1050: 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20 0a  ign key action .
1060: 2a 2a 20 20 20 20 20 20 20 20 69 6e 73 74 65 61  **        instea
1070: 64 20 6f 66 20 64 69 72 65 63 74 6c 79 20 61 73  d of directly as
1080: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 75   a result of a u
1090: 73 65 72 73 20 53 51 4c 20 73 74 61 74 65 6d 65  sers SQL stateme
10a0: 6e 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  nt..** </ul>.**.
10b0: 2a 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 72  ** If a single r
10c0: 6f 77 20 69 73 20 61 66 66 65 63 74 65 64 20 62  ow is affected b
10d0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
10e0: 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68 69 6e  operation within
10f0: 20 61 20 73 65 73 73 69 6f 6e 2c 0a 2a 2a 20 74   a session,.** t
1100: 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69  hen the change i
1110: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e 64  s considered ind
1120: 69 72 65 63 74 20 69 66 20 61 6c 6c 20 6f 70 65  irect if all ope
1130: 72 61 74 69 6f 6e 73 20 6d 65 65 74 20 74 68 65  rations meet the
1140: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 66 6f 72   criteria.** for
1150: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68 61   an indirect cha
1160: 6e 67 65 20 61 62 6f 76 65 2c 20 6f 72 20 64 69  nge above, or di
1170: 72 65 63 74 20 6f 74 68 65 72 77 69 73 65 2e 0a  rect otherwise..
1180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1190: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
11a0: 65 74 2c 20 63 6c 65 61 72 20 6f 72 20 71 75 65  et, clear or que
11b0: 72 79 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ry the session o
11c0: 62 6a 65 63 74 20 69 6e 64 69 72 65 63 74 0a 2a  bject indirect.*
11d0: 2a 20 66 6c 61 67 2e 20 20 49 66 20 74 68 65 20  * flag.  If the 
11e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11f0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1200: 75 6e 63 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c  unction is zero,
1210: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 64   then the.** ind
1220: 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 63 6c  irect flag is cl
1230: 65 61 72 65 64 2e 20 49 66 20 69 74 20 69 73 20  eared. If it is 
1240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1250: 6f 2c 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  o, the indirect 
1260: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 20  flag.** is set. 
1270: 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20  Passing a value 
1280: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 64  less than zero d
1290: 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74  oes not modify t
12a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
12b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 69 72  .** of the indir
12c0: 65 63 74 20 66 6c 61 67 2c 20 61 6e 64 20 6d 61  ect flag, and ma
12d0: 79 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65  y be used to que
12e0: 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
12f0: 74 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tate of the .** 
1300: 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 66 6f  indirect flag fo
1310: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1320: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  session object..
1330: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1340: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1350: 20 74 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   the final state
1360: 20 6f 66 20 74 68 65 20 69 6e 64 69 72 65 63 74   of the indirect
1370: 20 66 6c 61 67 3a 20 30 20 69 66 20 0a 2a 2a 20   flag: 0 if .** 
1380: 69 74 20 69 73 20 63 6c 65 61 72 2c 20 6f 72 20  it is clear, or 
1390: 31 20 69 66 20 69 74 20 69 73 20 73 65 74 2e 0a  1 if it is set..
13a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
13b0: 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 73  ssion_indirect(s
13c0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
13d0: 70 53 65 73 73 69 6f 6e 2c 20 69 6e 74 20 62 49  pSession, int bI
13e0: 6e 64 69 72 65 63 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ndirect);../*.**
13f0: 20 43 41 50 49 33 52 45 46 3a 20 41 74 74 61 63   CAPI3REF: Attac
1400: 68 20 41 20 54 61 62 6c 65 20 54 6f 20 41 20 53  h A Table To A S
1410: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
1420: 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33   METHOD: sqlite3
1430: 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 49  _session.**.** I
1440: 66 20 61 72 67 75 6d 65 6e 74 20 7a 54 61 62 20  f argument zTab 
1450: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1460: 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  n it is the name
1470: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 6f 20 61   of a table to a
1480: 74 74 61 63 68 0a 2a 2a 20 74 6f 20 74 68 65 20  ttach.** to the 
1490: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
14a0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14b0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  st argument. All
14c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e   subsequent chan
14d0: 67 65 73 20 0a 2a 2a 20 6d 61 64 65 20 74 6f 20  ges .** made to 
14e0: 74 68 65 20 74 61 62 6c 65 20 77 68 69 6c 65 20  the table while 
14f0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
1500: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69  ct is enabled wi
1510: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 2e 20  ll be recorded. 
1520: 53 65 65 20 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  See .** document
1530: 61 74 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74  ation for [sqlit
1540: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
1550: 73 65 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68  set()] for furth
1560: 65 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  er details..**.*
1570: 2a 20 4f 72 2c 20 69 66 20 61 72 67 75 6d 65 6e  * Or, if argumen
1580: 74 20 7a 54 61 62 20 69 73 20 4e 55 4c 4c 2c 20  t zTab is NULL, 
1590: 74 68 65 6e 20 63 68 61 6e 67 65 73 20 61 72 65  then changes are
15a0: 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 61 6c   recorded for al
15b0: 6c 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74  l tables.** in t
15c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15d0: 61 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65  additional table
15e0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
15f0: 68 65 20 64 61 74 61 62 61 73 65 20 28 62 79 20  he database (by 
1600: 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 22 43  .** executing "C
1610: 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74 61  REATE TABLE" sta
1620: 74 65 6d 65 6e 74 73 29 20 61 66 74 65 72 20 74  tements) after t
1630: 68 69 73 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  his call is made
1640: 2c 20 63 68 61 6e 67 65 73 20 66 6f 72 20 0a 2a  , changes for .*
1650: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  * the new tables
1660: 20 61 72 65 20 61 6c 73 6f 20 72 65 63 6f 72 64   are also record
1670: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  ed..**.** Change
1680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 65  s can only be re
1690: 63 6f 72 64 65 64 20 66 6f 72 20 74 61 62 6c 65  corded for table
16a0: 73 20 74 68 61 74 20 68 61 76 65 20 61 20 50 52  s that have a PR
16b0: 49 4d 41 52 59 20 4b 45 59 20 65 78 70 6c 69 63  IMARY KEY explic
16c0: 69 74 6c 79 0a 2a 2a 20 64 65 66 69 6e 65 64 20  itly.** defined 
16d0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 69 72  as part of their
16e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
16f0: 61 74 65 6d 65 6e 74 2e 20 49 74 20 64 6f 65 73  atement. It does
1700: 20 6e 6f 74 20 6d 61 74 74 65 72 20 69 66 20 74   not matter if t
1710: 68 65 20 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b  he .** PRIMARY K
1720: 45 59 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45  EY is an "INTEGE
1730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28  R PRIMARY KEY" (
1740: 72 6f 77 69 64 20 61 6c 69 61 73 29 20 6f 72 20  rowid alias) or 
1750: 6e 6f 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59  not. The PRIMARY
1760: 0a 2a 2a 20 4b 45 59 20 6d 61 79 20 63 6f 6e 73  .** KEY may cons
1770: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
1780: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 6d 61 79 20 62  column, or may b
1790: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
17a0: 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 74 20 69 73 20  y..** .** It is 
17b0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
17c0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
17d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
17e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
17f0: 4e 6f 72 0a 2a 2a 20 69 73 20 69 74 20 61 6e 20  Nor.** is it an 
1800: 65 72 72 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  error if the nam
1810: 65 64 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  ed table does no
1820: 74 20 68 61 76 65 20 61 20 50 52 49 4d 41 52 59  t have a PRIMARY
1830: 20 4b 45 59 2e 20 48 6f 77 65 76 65 72 2c 0a 2a   KEY. However,.*
1840: 2a 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  * no changes wil
1850: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
1860: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
1870: 20 73 63 65 6e 61 72 69 6f 73 2e 0a 2a 2a 0a 2a   scenarios..**.*
1880: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6e 6f  * Changes are no
1890: 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 69  t recorded for i
18a0: 6e 64 69 76 69 64 75 61 6c 20 72 6f 77 73 20 74  ndividual rows t
18b0: 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76 61  hat have NULL va
18c0: 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  lues stored.** i
18d0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
18e0: 20 74 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b   their PRIMARY K
18f0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
1900: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1910: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
1920: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 77 69  all completes wi
1930: 74 68 6f 75 74 20 65 72 72 6f 72 2e 20 4f 72 2c  thout error. Or,
1940: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1950: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
1960: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65  te error code (e
1970: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
1980: 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ) is returned..*
1990: 2a 0a 2a 2a 20 3c 68 33 3e 53 70 65 63 69 61 6c  *.** <h3>Special
19a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 48 61   sqlite_stat1 Ha
19b0: 6e 64 6c 69 6e 67 3c 2f 68 33 3e 0a 2a 2a 0a 2a  ndling</h3>.**.*
19c0: 2a 20 41 73 20 6f 66 20 53 51 4c 69 74 65 20 76  * As of SQLite v
19d0: 65 72 73 69 6f 6e 20 33 2e 32 32 2e 30 2c 20 74  ersion 3.22.0, t
19e0: 68 65 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  he "sqlite_stat1
19f0: 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 78  " table is an ex
1a00: 63 65 70 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 73  ception to .** s
1a10: 6f 6d 65 20 6f 66 20 74 68 65 20 72 75 6c 65 73  ome of the rules
1a20: 20 61 62 6f 76 65 2e 20 49 6e 20 53 51 4c 69 74   above. In SQLit
1a30: 65 2c 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  e, the schema of
1a40: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 69 73   sqlite_stat1 is
1a50: 3a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  :.**  <pre>.**  
1a60: 26 6e 62 73 70 3b 20 20 20 20 20 43 52 45 41 54  &nbsp;     CREAT
1a70: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
1a80: 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61  tat1(tbl,idx,sta
1a90: 74 29 20 20 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  t)  .**  </pre>.
1aa0: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
1ab0: 68 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  h sqlite_stat1 d
1ac0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 50  oes not have a P
1ad0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 61 6e  RIMARY KEY, chan
1ae0: 67 65 73 20 61 72 65 20 0a 2a 2a 20 72 65 63 6f  ges are .** reco
1af0: 72 64 65 64 20 66 6f 72 20 69 74 20 61 73 20 69  rded for it as i
1b00: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
1b10: 59 20 69 73 20 28 74 62 6c 2c 69 64 78 29 2e 20  Y is (tbl,idx). 
1b20: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 63 68  Additionally, ch
1b30: 61 6e 67 65 73 20 0a 2a 2a 20 61 72 65 20 72 65  anges .** are re
1b40: 63 6f 72 64 65 64 20 66 6f 72 20 72 6f 77 73 20  corded for rows 
1b50: 66 6f 72 20 77 68 69 63 68 20 28 69 64 78 20 49  for which (idx I
1b60: 53 20 4e 55 4c 4c 29 20 69 73 20 74 72 75 65 2e  S NULL) is true.
1b70: 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 73 75   However, for su
1b80: 63 68 0a 2a 2a 20 72 6f 77 73 20 61 20 7a 65 72  ch.** rows a zer
1b90: 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 28 53  o-length blob (S
1ba0: 51 4c 20 76 61 6c 75 65 20 58 27 27 29 20 69 73  QL value X'') is
1bb0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
1bc0: 68 61 6e 67 65 73 65 74 20 6f 72 0a 2a 2a 20 70  hangeset or.** p
1bd0: 61 74 63 68 73 65 74 20 69 6e 73 74 65 61 64 20  atchset instead 
1be0: 6f 66 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e  of a NULL value.
1bf0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 75 63   This allows suc
1c00: 68 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 20  h changesets to 
1c10: 62 65 0a 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  be.** manipulate
1c20: 64 20 62 79 20 6c 65 67 61 63 79 20 69 6d 70 6c  d by legacy impl
1c30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 73  ementations of s
1c40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1c50: 69 6e 76 65 72 74 28 29 2c 0a 2a 2a 20 63 6f 6e  invert(),.** con
1c60: 63 61 74 28 29 20 61 6e 64 20 73 69 6d 69 6c 61  cat() and simila
1c70: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  r..**.** The sql
1c80: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
1c90: 70 6c 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ply() function a
1ca0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
1cb0: 76 65 72 74 73 20 74 68 65 20 0a 2a 2a 20 7a 65  verts the .** ze
1cc0: 72 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 62  ro-length blob b
1cd0: 61 63 6b 20 74 6f 20 61 20 4e 55 4c 4c 20 76 61  ack to a NULL va
1ce0: 6c 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  lue when updatin
1cf0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  g the sqlite_sta
1d00: 74 31 0a 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77  t1.** table. How
1d10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 61 70 70  ever, if the app
1d20: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1d30: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1d40: 6e 65 77 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  new(),.** sqlite
1d50: 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29  3changeset_old()
1d60: 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67   or sqlite3chang
1d70: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 20 6f 6e  eset_conflict on
1d80: 20 61 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a   a changeset .**
1d90: 20 69 74 65 72 61 74 6f 72 20 64 69 72 65 63 74   iterator direct
1da0: 6c 79 20 28 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  ly (including on
1db0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
1dc0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
1dd0: 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61  a.** conflict-ha
1de0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 29 20  ndler callback) 
1df0: 74 68 65 6e 20 74 68 65 20 58 27 27 20 76 61 6c  then the X'' val
1e00: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
1e10: 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  The application.
1e20: 2a 2a 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  ** must translat
1e30: 65 20 58 27 27 20 74 6f 20 4e 55 4c 4c 20 69 74  e X'' to NULL it
1e40: 73 65 6c 66 20 69 66 20 72 65 71 75 69 72 65 64  self if required
1e50: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 67 61 63 79 20 28  ..**.** Legacy (
1e60: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 32 32 2e  older than 3.22.
1e70: 30 29 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  0) versions of t
1e80: 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
1e90: 6c 65 20 63 61 6e 6e 6f 74 20 63 61 70 74 75 72  le cannot captur
1ea0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6d 61 64  e.** changes mad
1eb0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  e to the sqlite_
1ec0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 4c 65 67  stat1 table. Leg
1ed0: 61 63 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  acy versions of 
1ee0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
1ef0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
1f00: 66 75 6e 63 74 69 6f 6e 20 73 69 6c 65 6e 74 6c  function silentl
1f10: 79 20 69 67 6e 6f 72 65 20 61 6e 79 20 6d 6f 64  y ignore any mod
1f20: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1f30: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1f40: 31 20 74 61 62 6c 65 20 74 68 61 74 20 61 72 65  1 table that are
1f50: 20 70 61 72 74 20 6f 66 20 61 20 63 68 61 6e 67   part of a chang
1f60: 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
1f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f80: 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 0a  session_attach(.
1f90: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
1fa0: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
1fb0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
1fc0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1fd0: 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ff0: 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a  e name */.);../*
2000: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 65  .** CAPI3REF: Se
2010: 74 20 61 20 74 61 62 6c 65 20 66 69 6c 74 65 72  t a table filter
2020: 20 6f 6e 20 61 20 53 65 73 73 69 6f 6e 20 4f 62   on a Session Ob
2030: 6a 65 63 74 2e 0a 2a 2a 20 4d 45 54 48 4f 44 3a  ject..** METHOD:
2040: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
2050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
2060: 64 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  d argument (xFil
2070: 74 65 72 29 20 69 73 20 74 68 65 20 22 66 69 6c  ter) is the "fil
2080: 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 2e 20 46  ter callback". F
2090: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 72 6f  or changes to ro
20a0: 77 73 20 0a 2a 2a 20 69 6e 20 74 61 62 6c 65 73  ws .** in tables
20b0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 74   that are not at
20c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 53 65  tached to the Se
20d0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
20e0: 65 20 66 69 6c 74 65 72 20 69 73 20 63 61 6c 6c  e filter is call
20f0: 65 64 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ed.** to determi
2100: 6e 65 20 77 68 65 74 68 65 72 20 63 68 61 6e 67  ne whether chang
2110: 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 27  es to the table'
2120: 73 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62 65  s rows should be
2130: 20 74 72 61 63 6b 65 64 20 6f 72 20 6e 6f 74 2e   tracked or not.
2140: 20 0a 2a 2a 20 49 66 20 78 46 69 6c 74 65 72 20   .** If xFilter 
2150: 72 65 74 75 72 6e 73 20 30 2c 20 63 68 61 6e 67  returns 0, chang
2160: 65 73 20 69 73 20 6e 6f 74 20 74 72 61 63 6b 65  es is not tracke
2170: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e 63  d. Note that onc
2180: 65 20 61 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a  e a table is .**
2190: 20 61 74 74 61 63 68 65 64 2c 20 78 46 69 6c 74   attached, xFilt
21a0: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  er will not be c
21b0: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a  alled again..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65 73 73  void sqlite3sess
21d0: 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72  ion_table_filter
21e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
21f0: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20  ion *pSession,  
2200: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f      /* Session o
2210: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 28 2a  bject */.  int(*
2220: 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f  xFilter)(.    vo
2230: 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
2240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2250: 6f 70 79 20 6f 66 20 74 68 69 72 64 20 61 72 67  opy of third arg
2260: 20 74 6f 20 5f 66 69 6c 74 65 72 5f 74 61 62 6c   to _filter_tabl
2270: 65 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  e() */.    const
2280: 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20   char *zTab     
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
22a0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20  e name */.  ),. 
22b0: 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20   void *pCtx     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
22e0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 46 69  nt passed to xFi
22f0: 6c 74 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  lter */.);../*.*
2300: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
2310: 72 61 74 65 20 41 20 43 68 61 6e 67 65 73 65 74  rate A Changeset
2320: 20 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20   From A Session 
2330: 4f 62 6a 65 63 74 0a 2a 2a 20 4d 45 54 48 4f 44  Object.** METHOD
2340: 3a 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f  : sqlite3_sessio
2350: 6e 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  n.**.** Obtain a
2360: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74 61   changeset conta
2370: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  ining changes to
2380: 20 74 68 65 20 74 61 62 6c 65 73 20 61 74 74 61   the tables atta
2390: 63 68 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ched to the .** 
23a0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
23b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  st argument. If 
23d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 0a 2a 2a 20  successful, .** 
23e0: 73 65 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74  set *ppChangeset
23f0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
2400: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2410: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 0a   the changeset .
2420: 2a 2a 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  ** and *pnChange
2430: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
2440: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
2450: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
2460: 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 53 51   returning.** SQ
2470: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
2480: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
2490: 20 62 6f 74 68 20 2a 70 70 43 68 61 6e 67 65 73   both *ppChanges
24a0: 65 74 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  et and *pnChange
24b0: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 61  set to.** zero a
24c0: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
24d0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24e0: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
24f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
2500: 72 6f 20 6f 72 20 6d 6f 72 65 20 49 4e 53 45 52  ro or more INSER
2510: 54 2c 20 55 50 44 41 54 45 20 61 6e 64 2f 6f 72  T, UPDATE and/or
2520: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 73 2c   DELETE changes,
2530: 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
2540: 6e 74 69 6e 67 20 61 20 63 68 61 6e 67 65 20 74  nting a change t
2550: 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  o a single row o
2560: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 74 61  f an attached ta
2570: 62 6c 65 2e 20 41 6e 20 49 4e 53 45 52 54 0a 2a  ble. An INSERT.*
2580: 2a 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e  * change contain
2590: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
25a0: 65 61 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20  each field of a 
25b0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 72 6f 77  new database row
25c0: 2e 20 41 20 44 45 4c 45 54 45 0a 2a 2a 20 63 6f  . A DELETE.** co
25d0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 72 69 67 69  ntains the origi
25e0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 65 61  nal values of ea
25f0: 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20 64 65  ch field of a de
2600: 6c 65 74 65 64 20 64 61 74 61 62 61 73 65 20 72  leted database r
2610: 6f 77 2e 20 41 6e 0a 2a 2a 20 55 50 44 41 54 45  ow. An.** UPDATE
2620: 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e 73   change contains
2630: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61   the original va
2640: 6c 75 65 73 20 6f 66 20 65 61 63 68 20 66 69 65  lues of each fie
2650: 6c 64 20 6f 66 20 61 6e 20 75 70 64 61 74 65 64  ld of an updated
2660: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 72 6f 77  .** database row
2670: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2680: 75 70 64 61 74 65 64 20 76 61 6c 75 65 73 20 66  updated values f
2690: 6f 72 20 65 61 63 68 20 75 70 64 61 74 65 64 20  or each updated 
26a0: 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d 6b 65 79 0a  non-primary-key.
26b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 69 73  ** column. It is
26c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
26d0: 72 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e  r an UPDATE chan
26e0: 67 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ge to represent 
26f0: 61 20 63 68 61 6e 67 65 20 74 68 61 74 0a 2a 2a  a change that.**
2700: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 76 61   modifies the va
2710: 6c 75 65 73 20 6f 66 20 70 72 69 6d 61 72 79 20  lues of primary 
2720: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  key columns. If 
2730: 73 75 63 68 20 61 20 63 68 61 6e 67 65 20 69 73  such a change is
2740: 20 6d 61 64 65 2c 20 69 74 0a 2a 2a 20 69 73 20   made, it.** is 
2750: 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 61  represented in a
2760: 20 63 68 61 6e 67 65 73 65 74 20 61 73 20 61 20   changeset as a 
2770: 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64 20  DELETE followed 
2780: 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a  by an INSERT..**
2790: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
27a0: 6e 6f 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72  not recorded for
27b0: 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65 20   rows that have 
27c0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 73 74 6f 72  NULL values stor
27d0: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a  ed in one or .**
27e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 69 72 20 50   more of their P
27f0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
2800: 6e 73 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f  ns. If such a ro
2810: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 6f 72  w is inserted or
2820: 20 64 65 6c 65 74 65 64 2c 0a 2a 2a 20 6e 6f 20   deleted,.** no 
2830: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  corresponding ch
2840: 61 6e 67 65 20 69 73 20 70 72 65 73 65 6e 74 20  ange is present 
2850: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
2860: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
2870: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
2880: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72  If an existing r
2890: 6f 77 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  ow with one or m
28a0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ore NULL values 
28b0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 50 52 49  stored in.** PRI
28c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
28d0: 20 69 73 20 75 70 64 61 74 65 64 20 73 6f 20 74   is updated so t
28e0: 68 61 74 20 61 6c 6c 20 50 52 49 4d 41 52 59 20  hat all PRIMARY 
28f0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  KEY columns are 
2900: 6e 6f 6e 2d 4e 55 4c 4c 2c 0a 2a 2a 20 6f 6e 6c  non-NULL,.** onl
2910: 79 20 61 6e 20 49 4e 53 45 52 54 20 69 73 20 61  y an INSERT is a
2920: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 63 68  ppears in the ch
2930: 61 6e 67 65 73 65 74 2e 20 53 69 6d 69 6c 61 72  angeset. Similar
2940: 6c 79 2c 20 69 66 20 61 6e 20 65 78 69 73 74 69  ly, if an existi
2950: 6e 67 20 72 6f 77 0a 2a 2a 20 77 69 74 68 20 6e  ng row.** with n
2960: 6f 6e 2d 4e 55 4c 4c 20 50 52 49 4d 41 52 59 20  on-NULL PRIMARY 
2970: 4b 45 59 20 76 61 6c 75 65 73 20 69 73 20 75 70  KEY values is up
2980: 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  dated so that on
2990: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
29a0: 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20  .** PRIMARY KEY 
29b0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 73 65 74 20  columns are set 
29c0: 74 6f 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  to NULL, the res
29d0: 75 6c 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  ulting changeset
29e0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 44   contains a.** D
29f0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 6f 6e 6c  ELETE change onl
2a00: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  y..**.** The con
2a10: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
2a20: 65 73 65 74 20 6d 61 79 20 62 65 20 74 72 61 76  eset may be trav
2a30: 65 72 73 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ersed using an i
2a40: 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 0a  terator created.
2a50: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71  ** using the [sq
2a60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
2a70: 74 61 72 74 28 29 5d 20 41 50 49 2e 20 41 20 63  tart()] API. A c
2a80: 68 61 6e 67 65 73 65 74 20 6d 61 79 20 62 65 20  hangeset may be 
2a90: 61 70 70 6c 69 65 64 20 74 6f 0a 2a 2a 20 61 20  applied to.** a 
2aa0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
2ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 73 63 68 65 6d  compatible schem
2ac0: 61 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c  a using the [sql
2ad0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
2ae0: 70 6c 79 28 29 5d 0a 2a 2a 20 41 50 49 2e 0a 2a  ply()].** API..*
2af0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 61 20 63 68  *.** Within a ch
2b00: 61 6e 67 65 73 65 74 20 67 65 6e 65 72 61 74 65  angeset generate
2b10: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2b20: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
2b30: 72 65 6c 61 74 65 64 20 74 6f 20 61 0a 2a 2a 20  related to a.** 
2b40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65  single table are
2b50: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2b60: 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  r. In other word
2b70: 73 2c 20 77 68 65 6e 20 69 74 65 72 61 74 69 6e  s, when iteratin
2b80: 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20 63  g through.** a c
2b90: 68 61 6e 67 65 73 65 74 20 6f 72 20 77 68 65 6e  hangeset or when
2ba0: 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e   applying a chan
2bb0: 67 65 73 65 74 20 74 6f 20 61 20 64 61 74 61 62  geset to a datab
2bc0: 61 73 65 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73  ase, all changes
2bd0: 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 61   related.** to a
2be0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
2bf0: 65 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  e processed befo
2c00: 72 65 20 6d 6f 76 69 6e 67 20 6f 6e 20 74 6f 20  re moving on to 
2c10: 74 68 65 20 6e 65 78 74 20 74 61 62 6c 65 2e 20  the next table. 
2c20: 54 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73 6f  Tables.** are so
2c30: 72 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  rted in the same
2c40: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2c50: 74 68 65 79 20 77 65 72 65 20 61 74 74 61 63 68  they were attach
2c60: 65 64 20 28 6f 72 20 61 75 74 6f 2d 61 74 74 61  ed (or auto-atta
2c70: 63 68 65 64 29 0a 2a 2a 20 74 6f 20 74 68 65 20  ched).** to the 
2c80: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
2c90: 6f 62 6a 65 63 74 2e 20 54 68 65 20 6f 72 64 65  object. The orde
2ca0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 63  r in which the c
2cb0: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
2cc0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  o.** a single ta
2cd0: 62 6c 65 20 61 72 65 20 73 74 6f 72 65 64 20 69  ble are stored i
2ce0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
2cf0: 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  ** Following a s
2d00: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
2d10: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2d20: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
2d30: 6e 73 69 62 69 6c 69 74 79 20 6f 66 0a 2a 2a 20  nsibility of.** 
2d40: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
2d50: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
2d60: 65 20 62 75 66 66 65 72 20 74 68 61 74 20 2a 70  e buffer that *p
2d70: 70 43 68 61 6e 67 65 73 65 74 20 70 6f 69 6e 74  pChangeset point
2d80: 73 20 74 6f 20 75 73 69 6e 67 0a 2a 2a 20 5b 73  s to using.** [s
2d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 5d 2e 0a  qlite3_free()]..
2da0: 2a 2a 0a 2a 2a 20 3c 68 33 3e 43 68 61 6e 67 65  **.** <h3>Change
2db0: 73 65 74 20 47 65 6e 65 72 61 74 69 6f 6e 3c 2f  set Generation</
2dc0: 68 33 3e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  h3>.**.** Once a
2dd0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
2de0: 61 74 74 61 63 68 65 64 20 74 6f 20 61 20 73 65  attached to a se
2df0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
2e00: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
2e10: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
2e20: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
2e30: 65 73 20 6f 66 20 61 6c 6c 20 6e 65 77 20 72 6f  es of all new ro
2e40: 77 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ws inserted into
2e50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 49   the table..** I
2e60: 74 20 61 6c 73 6f 20 72 65 63 6f 72 64 73 20 74  t also records t
2e70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 72 69 6d  he original prim
2e80: 61 72 79 20 6b 65 79 20 61 6e 64 20 6f 74 68 65  ary key and othe
2e90: 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  r column values 
2ea0: 6f 66 20 61 6e 79 0a 2a 2a 20 64 65 6c 65 74 65  of any.** delete
2eb0: 64 20 6f 72 20 75 70 64 61 74 65 64 20 72 6f 77  d or updated row
2ec0: 73 2e 20 46 6f 72 20 65 61 63 68 20 75 6e 69 71  s. For each uniq
2ed0: 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ue primary key v
2ee0: 61 6c 75 65 2c 20 64 61 74 61 20 69 73 20 6f 6e  alue, data is on
2ef0: 6c 79 0a 2a 2a 20 72 65 63 6f 72 64 65 64 20 6f  ly.** recorded o
2f00: 6e 63 65 20 2d 20 74 68 65 20 66 69 72 73 74 20  nce - the first 
2f10: 74 69 6d 65 20 61 20 72 6f 77 20 77 69 74 68 20  time a row with 
2f20: 73 61 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  said primary key
2f30: 20 69 73 20 69 6e 73 65 72 74 65 64 2c 0a 2a 2a   is inserted,.**
2f40: 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65   updated or dele
2f50: 74 65 64 20 69 6e 20 74 68 65 20 6c 69 66 65 74  ted in the lifet
2f60: 69 6d 65 20 6f 66 20 74 68 65 20 73 65 73 73 69  ime of the sessi
2f70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  on..**.** There 
2f80: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
2f90: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2fa0: 20 70 61 72 61 67 72 61 70 68 3a 20 77 68 65 6e   paragraph: when
2fb0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
2fc0: 65 64 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f  ed,.** updated o
2fd0: 72 20 64 65 6c 65 74 65 64 2c 20 69 66 20 6f 6e  r deleted, if on
2fe0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
2ff0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
3000: 75 6d 6e 73 20 63 6f 6e 74 61 69 6e 20 61 0a 2a  umns contain a.*
3010: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6e 6f  * NULL value, no
3020: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
3030: 68 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 0a 2a  hange is made..*
3040: 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
3050: 20 6f 62 6a 65 63 74 20 74 68 65 72 65 66 6f 72   object therefor
3060: 65 20 61 63 63 75 6d 75 6c 61 74 65 73 20 74 77  e accumulates tw
3070: 6f 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  o types of recor
3080: 64 73 20 2d 20 74 68 6f 73 65 0a 2a 2a 20 74 68  ds - those.** th
3090: 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 70 72  at consist of pr
30a0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
30b0: 20 6f 6e 6c 79 20 28 63 72 65 61 74 65 64 20 77   only (created w
30c0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 73  hen the user ins
30d0: 65 72 74 73 0a 2a 2a 20 61 20 6e 65 77 20 72 65  erts.** a new re
30e0: 63 6f 72 64 29 20 61 6e 64 20 74 68 6f 73 65 20  cord) and those 
30f0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
3100: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
3110: 76 61 6c 75 65 73 20 61 6e 64 20 74 68 65 0a 2a  values and the.*
3120: 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * original value
3130: 73 20 6f 66 20 6f 74 68 65 72 20 74 61 62 6c 65  s of other table
3140: 20 63 6f 6c 75 6d 6e 73 20 28 63 72 65 61 74 65   columns (create
3150: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 73  d when the users
3160: 20 64 65 6c 65 74 65 73 0a 2a 2a 20 6f 72 20 75   deletes.** or u
3170: 70 64 61 74 65 73 20 61 20 72 65 63 6f 72 64 29  pdates a record)
3180: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
3190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31a0: 6c 6c 65 64 2c 20 74 68 65 20 72 65 71 75 65 73  lled, the reques
31b0: 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69 73  ted changeset is
31c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a   created using.*
31d0: 2a 20 62 6f 74 68 20 74 68 65 20 61 63 63 75 6d  * both the accum
31e0: 75 6c 61 74 65 64 20 72 65 63 6f 72 64 73 20 61  ulated records a
31f0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
3200: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
3210: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
3220: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a   Specifically:.*
3230: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
3240: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63  li> For each rec
3250: 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79  ord generated by
3260: 20 61 6e 20 69 6e 73 65 72 74 2c 20 74 68 65 20   an insert, the 
3270: 64 61 74 61 62 61 73 65 20 69 73 20 71 75 65 72  database is quer
3280: 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ied.**        fo
3290: 72 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 6d  r a row with a m
32a0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
32b0: 6b 65 79 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  key. If one is f
32c0: 6f 75 6e 64 2c 20 61 6e 20 49 4e 53 45 52 54 0a  ound, an INSERT.
32d0: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
32e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
32f0: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 6e   changeset. If n
3300: 6f 20 73 75 63 68 20 72 6f 77 20 69 73 20 66 6f  o such row is fo
3310: 75 6e 64 2c 20 6e 6f 20 63 68 61 6e 67 65 20 0a  und, no change .
3320: 2a 2a 20 20 20 20 20 20 20 20 69 73 20 61 64 64  **        is add
3330: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
3340: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  set..**.**   <li
3350: 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72  > For each recor
3360: 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  d generated by a
3370: 6e 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  n update or dele
3380: 74 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  te, the database
3390: 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 71   is .**        q
33a0: 75 65 72 69 65 64 20 66 6f 72 20 61 20 72 6f 77  ueried for a row
33b0: 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
33c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
33d0: 20 73 75 63 68 20 61 20 72 6f 77 20 69 73 0a 2a   such a row is.*
33e0: 2a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 61  *        found a
33f0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
3400: 66 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72  f the non-primar
3410: 79 20 6b 65 79 20 66 69 65 6c 64 73 20 68 61 76  y key fields hav
3420: 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e been.**       
3430: 20 6d 6f 64 69 66 69 65 64 20 66 72 6f 6d 20 74   modified from t
3440: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61  heir original va
3450: 6c 75 65 73 2c 20 61 6e 20 55 50 44 41 54 45 20  lues, an UPDATE 
3460: 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20  change is added 
3470: 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  to .**        th
3480: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 4f 72 2c  e changeset. Or,
3490: 20 69 66 20 6e 6f 20 73 75 63 68 20 72 6f 77 20   if no such row 
34a0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
34b0: 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45 20  table, a DELETE 
34c0: 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67  .**        chang
34d0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20  e changeset. If 
34f0: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 77  there is a row w
3500: 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
3510: 2a 20 20 20 20 20 20 20 20 70 72 69 6d 61 72 79  *        primary
3520: 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
3530: 62 61 73 65 2c 20 62 75 74 20 61 6c 6c 20 66 69  base, but all fi
3540: 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  elds contain the
3550: 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  ir original.**  
3560: 20 20 20 20 20 20 76 61 6c 75 65 73 2c 20 6e 6f        values, no
3570: 20 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64   change is added
3580: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65   to the changese
3590: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
35a0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 2c 20 61 6d  * This means, am
35b0: 6f 6e 67 73 74 20 6f 74 68 65 72 20 74 68 69 6e  ongst other thin
35c0: 67 73 2c 20 74 68 61 74 20 69 66 20 61 20 72 6f  gs, that if a ro
35d0: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  w is inserted an
35e0: 64 20 74 68 65 6e 20 6c 61 74 65 72 0a 2a 2a 20  d then later.** 
35f0: 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 61 20  deleted while a 
3600: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
3610: 73 20 61 63 74 69 76 65 2c 20 6e 65 69 74 68 65  s active, neithe
3620: 72 20 74 68 65 20 69 6e 73 65 72 74 20 6e 6f 72  r the insert nor
3630: 20 74 68 65 20 64 65 6c 65 74 65 0a 2a 2a 20 77   the delete.** w
3640: 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20 69  ill be present i
3650: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
3660: 20 4f 72 20 69 66 20 61 20 72 6f 77 20 69 73 20   Or if a row is 
3670: 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 6e  deleted and then
3680: 20 6c 61 74 65 72 20 61 20 0a 2a 2a 20 72 6f 77   later a .** row
3690: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
36a0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
36b0: 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c 65  s inserted while
36c0: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
36d0: 74 20 69 73 0a 2a 2a 20 61 63 74 69 76 65 2c 20  t is.** active, 
36e0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63 68  the resulting ch
36f0: 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63 6f 6e  angeset will con
3700: 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45 20 63  tain an UPDATE c
3710: 68 61 6e 67 65 20 69 6e 73 74 65 61 64 20 6f 66  hange instead of
3720: 0a 2a 2a 20 61 20 44 45 4c 45 54 45 20 61 6e 64  .** a DELETE and
3730: 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a 0a 2a   an INSERT..**.*
3740: 2a 20 57 68 65 6e 20 61 20 73 65 73 73 69 6f 6e  * When a session
3750: 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73 61 62   object is disab
3760: 6c 65 64 20 28 73 65 65 20 74 68 65 20 5b 73 71  led (see the [sq
3770: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61  lite3session_ena
3780: 62 6c 65 28 29 5d 20 41 50 49 29 2c 0a 2a 2a 20  ble()] API),.** 
3790: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 63 63 75  it does not accu
37a0: 6d 75 6c 61 74 65 20 72 65 63 6f 72 64 73 20 77  mulate records w
37b0: 68 65 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73  hen rows are ins
37c0: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
37d0: 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 54 68  r deleted..** Th
37e0: 69 73 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f  is may appear to
37f0: 20 68 61 76 65 20 73 6f 6d 65 20 63 6f 75 6e 74   have some count
3800: 65 72 2d 69 6e 74 75 69 74 69 76 65 20 65 66 66  er-intuitive eff
3810: 65 63 74 73 20 69 66 20 61 20 73 69 6e 67 6c 65  ects if a single
3820: 20 72 6f 77 0a 2a 2a 20 69 73 20 77 72 69 74 74   row.** is writt
3830: 65 6e 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20  en to more than 
3840: 6f 6e 63 65 20 64 75 72 69 6e 67 20 61 20 73 65  once during a se
3850: 73 73 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70  ssion. For examp
3860: 6c 65 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a 20  le, if a row.** 
3870: 69 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c  is inserted whil
3880: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
3890: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ct is enabled, t
38a0: 68 65 6e 20 6c 61 74 65 72 20 64 65 6c 65 74 65  hen later delete
38b0: 64 20 77 68 69 6c 65 20 0a 2a 2a 20 74 68 65 20  d while .** the 
38c0: 73 61 6d 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a  same session obj
38d0: 65 63 74 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ect is disabled,
38e0: 20 6e 6f 20 49 4e 53 45 52 54 20 72 65 63 6f 72   no INSERT recor
38f0: 64 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  d will appear in
3900: 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65   the.** changese
3910: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
3920: 68 65 20 64 65 6c 65 74 65 20 74 6f 6f 6b 20 70  he delete took p
3930: 6c 61 63 65 20 77 68 69 6c 65 20 74 68 65 20 73  lace while the s
3940: 65 73 73 69 6f 6e 20 77 61 73 20 64 69 73 61 62  ession was disab
3950: 6c 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  led..** Or, if o
3960: 6e 65 20 66 69 65 6c 64 20 6f 66 20 61 20 72 6f  ne field of a ro
3970: 77 20 69 73 20 75 70 64 61 74 65 64 20 77 68 69  w is updated whi
3980: 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 69 73 20  le a session is 
3990: 64 69 73 61 62 6c 65 64 2c 20 61 6e 64 20 0a 2a  disabled, and .*
39a0: 2a 20 61 6e 6f 74 68 65 72 20 66 69 65 6c 64 20  * another field 
39b0: 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20  of the same row 
39c0: 69 73 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  is updated while
39d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
39e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 0a 2a 2a 20  enabled, the.** 
39f0: 72 65 73 75 6c 74 69 6e 67 20 63 68 61 6e 67 65  resulting change
3a00: 73 65 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  set will contain
3a10: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
3a20: 65 20 74 68 61 74 20 75 70 64 61 74 65 73 20 62  e that updates b
3a30: 6f 74 68 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 69  oth fields..*/.i
3a40: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
3a50: 6e 5f 63 68 61 6e 67 65 73 65 74 28 0a 20 20 73  n_changeset(.  s
3a60: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
3a70: 70 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f  pSession,      /
3a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
3a90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
3aa0: 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20  ngeset,         
3ab0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
3ac0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
3ad0: 2a 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a  *ppChangeset */.
3ae0: 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67    void **ppChang
3af0: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
3b00: 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72    /* OUT: Buffer
3b10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
3b20: 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  geset */.);../*.
3b30: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4c 6f 61  ** CAPI3REF: Loa
3b40: 64 20 54 68 65 20 44 69 66 66 65 72 65 6e 63 65  d The Difference
3b50: 20 42 65 74 77 65 65 6e 20 54 61 62 6c 65 73 20   Between Tables 
3b60: 49 6e 74 6f 20 41 20 53 65 73 73 69 6f 6e 0a 2a  Into A Session.*
3b70: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
3b80: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
3b90: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
3ba0: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
3bb0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a   the session obj
3bc0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
3bd0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
3be0: 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
3bf0: 6f 6e 20 61 74 74 61 63 68 65 73 20 74 61 62 6c  on attaches tabl
3c00: 65 20 7a 54 62 6c 20 69 6e 20 74 68 65 20 73 61  e zTbl in the sa
3c10: 6d 65 20 6d 61 6e 6e 65 72 20 61 73 20 74 68 65  me manner as the
3c20: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
3c30: 69 6f 6e 5f 61 74 74 61 63 68 28 29 5d 20 66 75  ion_attach()] fu
3c40: 6e 63 74 69 6f 6e 2e 20 49 66 20 7a 54 62 6c 20  nction. If zTbl 
3c50: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
3c60: 6f 72 20 69 66 20 69 74 0a 2a 2a 20 64 6f 65 73  or if it.** does
3c70: 20 6e 6f 74 20 68 61 76 65 20 61 20 70 72 69 6d   not have a prim
3c80: 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75  ary key, this fu
3c90: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
3ca0: 70 20 28 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  p (but does not 
3cb0: 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 65 72 72  return.** an err
3cc0: 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  or)..**.** Argum
3cd0: 65 6e 74 20 7a 46 72 6f 6d 44 62 20 6d 75 73 74  ent zFromDb must
3ce0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
3cf0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
3d00: 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
3d10: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
3d20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
3d30: 65 20 68 61 6e 64 6c 65 20 61 73 20 74 68 65 20  e handle as the 
3d40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  hat contains .**
3d60: 20 61 20 74 61 62 6c 65 20 63 6f 6d 70 61 74 69   a table compati
3d70: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ble with the tab
3d80: 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  le attached to t
3d90: 68 65 20 73 65 73 73 69 6f 6e 20 62 79 20 74 68  he session by th
3da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
3db0: 41 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69  A table is consi
3dc0: 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65  dered compatible
3dd0: 20 69 66 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75   if it:.**.** <u
3de0: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73  l>.**   <li> Has
3df0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 0a   the same name,.
3e00: 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68  **   <li> Has th
3e10: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f  e same set of co
3e20: 6c 75 6d 6e 73 20 64 65 63 6c 61 72 65 64 20 69  lumns declared i
3e30: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
3e40: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
3e50: 48 61 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  Has the same PRI
3e60: 4d 41 52 59 20 4b 45 59 20 64 65 66 69 6e 69 74  MARY KEY definit
3e70: 69 6f 6e 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  ion..** </ul>.**
3e80: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
3e90: 73 20 61 72 65 20 6e 6f 74 20 63 6f 6d 70 61 74  s are not compat
3ea0: 69 62 6c 65 2c 20 53 51 4c 49 54 45 5f 53 43 48  ible, SQLITE_SCH
3eb0: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 2e  EMA is returned.
3ec0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 73 0a 2a   If the tables.*
3ed0: 2a 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  * are compatible
3ee0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 68 61 76 65   but do not have
3ef0: 20 61 6e 79 20 50 52 49 4d 41 52 59 20 4b 45 59   any PRIMARY KEY
3f00: 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 69 73 20   columns, it is 
3f10: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  not an error.** 
3f20: 62 75 74 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  but no changes a
3f30: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
3f40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
3f50: 41 73 20 77 69 74 68 20 6f 74 68 65 72 20 73 65  As with other se
3f60: 73 73 69 6f 6e 0a 2a 2a 20 41 50 49 73 2c 20 74  ssion.** APIs, t
3f70: 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 50 52  ables without PR
3f80: 49 4d 41 52 59 20 4b 45 59 73 20 61 72 65 20 73  IMARY KEYs are s
3f90: 69 6d 70 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a  imply ignored..*
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 61 64 64 73 20 61 20 73 65 74 20 6f 66  on adds a set of
3fc0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3fd0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3fe0: 68 61 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  hat could be.** 
3ff0: 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  used to update t
4000: 68 65 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  he table in data
4010: 62 61 73 65 20 7a 46 72 6f 6d 20 28 63 61 6c 6c  base zFrom (call
4020: 20 74 68 69 73 20 74 68 65 20 22 66 72 6f 6d 2d   this the "from-
4030: 74 61 62 6c 65 22 29 20 0a 2a 2a 20 73 6f 20 74  table") .** so t
4040: 68 61 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hat its content 
4050: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
4060: 68 65 20 74 61 62 6c 65 20 61 74 74 61 63 68 65  he table attache
4070: 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e  d to the session
4080: 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 28 63 61 6c   .** object (cal
4090: 6c 20 74 68 69 73 20 74 68 65 20 22 74 6f 2d 74  l this the "to-t
40a0: 61 62 6c 65 22 29 2e 20 53 70 65 63 69 66 69 63  able"). Specific
40b0: 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  ally:.**.** <ul>
40c0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65  .**   <li> For e
40d0: 61 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79  ach row (primary
40e0: 20 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74   key) that exist
40f0: 73 20 69 6e 20 74 68 65 20 74 6f 2d 74 61 62 6c  s in the to-tabl
4100: 65 20 62 75 74 20 6e 6f 74 20 69 6e 20 0a 2a 2a  e but not in .**
4110: 20 20 20 20 20 74 68 65 20 66 72 6f 6d 2d 74 61       the from-ta
4120: 62 6c 65 2c 20 61 6e 20 49 4e 53 45 52 54 20 72  ble, an INSERT r
4130: 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
4140: 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  o the session ob
4150: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c  ject..**.**   <l
4160: 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  i> For each row 
4170: 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68  (primary key) th
4180: 61 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  at exists in the
4190: 20 74 6f 2d 74 61 62 6c 65 20 62 75 74 20 6e 6f   to-table but no
41a0: 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20 74 68 65  t in .**     the
41b0: 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20 61 20 44   from-table, a D
41c0: 45 4c 45 54 45 20 72 65 63 6f 72 64 20 69 73 20  ELETE record is 
41d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 73  added to the ses
41e0: 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  sion object..**.
41f0: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
4200: 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79 20  ch row (primary 
4210: 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74 73  key) that exists
4220: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 2c   in both tables,
4230: 20 62 75 74 20 66 65 61 74 75 72 65 73 20 0a 2a   but features .*
4240: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
4250: 6e 6f 6e 2d 50 4b 20 76 61 6c 75 65 73 20 69 6e  non-PK values in
4260: 20 65 61 63 68 2c 20 61 6e 20 55 50 44 41 54 45   each, an UPDATE
4270: 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
4280: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   to the.**     s
4290: 65 73 73 69 6f 6e 2e 20 20 0a 2a 2a 20 3c 2f 75  ession.  .** </u
42a0: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 61 72  l>.**.** To clar
42b0: 69 66 79 2c 20 69 66 20 74 68 69 73 20 66 75 6e  ify, if this fun
42c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
42d0: 61 6e 64 20 74 68 65 6e 20 61 20 63 68 61 6e 67  and then a chang
42e0: 65 73 65 74 20 63 6f 6e 73 74 72 75 63 74 65 64  eset constructed
42f0: 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 74  .** using [sqlit
4300: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
4310: 73 65 74 28 29 5d 2c 20 74 68 65 6e 20 61 66 74  set()], then aft
4320: 65 72 20 61 70 70 6c 79 69 6e 67 20 74 68 61 74  er applying that
4330: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 0a 2a   changeset to .*
4340: 2a 20 64 61 74 61 62 61 73 65 20 7a 46 72 6f 6d  * database zFrom
4350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4360: 20 74 68 65 20 74 77 6f 20 63 6f 6d 70 61 74 69   the two compati
4370: 62 6c 65 20 74 61 62 6c 65 73 20 77 6f 75 6c 64  ble tables would
4380: 20 62 65 20 0a 2a 2a 20 69 64 65 6e 74 69 63 61   be .** identica
4390: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 61 6e 20 65  l..**.** It an e
43a0: 72 72 6f 72 20 69 66 20 64 61 74 61 62 61 73 65  rror if database
43b0: 20 7a 46 72 6f 6d 20 64 6f 65 73 20 6e 6f 74 20   zFrom does not 
43c0: 65 78 69 73 74 20 6f 72 20 64 6f 65 73 20 6e 6f  exist or does no
43d0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  t contain the.**
43e0: 20 72 65 71 75 69 72 65 64 20 63 6f 6d 70 61 74   required compat
43f0: 69 62 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ible table..**.*
4400: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
4410: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  on successful, S
4420: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
4430: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
4440: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
4450: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
4460: 73 20 63 61 73 65 2c 20 69 66 20 61 72 67 75 6d  s case, if argum
4470: 65 6e 74 20 70 7a 45 72 72 4d 73 67 20 69 73 20  ent pzErrMsg is 
4480: 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 7a 45 72 72  not NULL, *pzErr
4490: 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
44a0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
44b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
44c0: 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
44d0: 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
44e0: 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
44f0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
4500: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
4510: 74 6f 20 66 72 65 65 20 74 68 69 73 20 62 75 66  to free this buf
4520: 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  fer using.** sql
4530: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
4540: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
4550: 6f 6e 5f 64 69 66 66 28 0a 20 20 73 71 6c 69 74  on_diff(.  sqlit
4560: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73  e3_session *pSes
4570: 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68  sion,.  const ch
4580: 61 72 20 2a 7a 46 72 6f 6d 44 62 2c 0a 20 20 63  ar *zFromDb,.  c
4590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
45a0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
45b0: 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41  sg.);.../*.** CA
45c0: 50 49 33 52 45 46 3a 20 47 65 6e 65 72 61 74 65  PI3REF: Generate
45d0: 20 41 20 50 61 74 63 68 73 65 74 20 46 72 6f 6d   A Patchset From
45e0: 20 41 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63   A Session Objec
45f0: 74 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  t.** METHOD: sql
4600: 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a  ite3_session.**.
4610: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
4620: 65 73 20 62 65 74 77 65 65 6e 20 61 20 70 61 74  es between a pat
4630: 63 68 73 65 74 20 61 6e 64 20 61 20 63 68 61 6e  chset and a chan
4640: 67 65 73 65 74 20 61 72 65 20 74 68 61 74 3a 0a  geset are that:.
4650: 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20  **.** <ul>.**   
4660: 3c 6c 69 3e 20 44 45 4c 45 54 45 20 72 65 63 6f  <li> DELETE reco
4670: 72 64 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 74  rds consist of t
4680: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66  he primary key f
4690: 69 65 6c 64 73 20 6f 6e 6c 79 2e 20 54 68 65 20  ields only. The 
46a0: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 69 67 69  .**        origi
46b0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 6f 74  nal values of ot
46c0: 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 6f  her fields are o
46d0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 20 20 3c 6c 69  mitted..**   <li
46e0: 3e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76  > The original v
46f0: 61 6c 75 65 73 20 6f 66 20 61 6e 79 20 6d 6f 64  alues of any mod
4700: 69 66 69 65 64 20 66 69 65 6c 64 73 20 61 72 65  ified fields are
4710: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 0a 2a   omitted from .*
4720: 2a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  *        UPDATE 
4730: 72 65 63 6f 72 64 73 2e 0a 2a 2a 20 3c 2f 75 6c  records..** </ul
4740: 3e 0a 2a 2a 0a 2a 2a 20 41 20 70 61 74 63 68 73  >.**.** A patchs
4750: 65 74 20 62 6c 6f 62 20 6d 61 79 20 62 65 20 75  et blob may be u
4760: 73 65 64 20 77 69 74 68 20 75 70 20 74 6f 20 64  sed with up to d
4770: 61 74 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ate versions of 
4780: 61 6c 6c 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63  all .** sqlite3c
4790: 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41 50 49  hangeset_xxx API
47a0: 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 63 65 70   functions excep
47b0: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68 61  t for sqlite3cha
47c0: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 29 2c  ngeset_invert(),
47d0: 20 0a 2a 2a 20 77 68 69 63 68 20 72 65 74 75 72   .** which retur
47e0: 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
47f0: 54 20 69 66 20 69 74 20 69 73 20 70 61 73 73 65  T if it is passe
4800: 64 20 61 20 70 61 74 63 68 73 65 74 2e 20 53 69  d a patchset. Si
4810: 6d 69 6c 61 72 6c 79 2c 0a 2a 2a 20 61 74 74 65  milarly,.** atte
4820: 6d 70 74 69 6e 67 20 74 6f 20 75 73 65 20 61 20  mpting to use a 
4830: 70 61 74 63 68 73 65 74 20 62 6c 6f 62 20 77 69  patchset blob wi
4840: 74 68 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20  th old versions 
4850: 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
4860: 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41  3changeset_xxx A
4870: 50 49 73 20 61 6c 73 6f 20 70 72 6f 76 6f 6b 65  PIs also provoke
4880: 73 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  s an SQLITE_CORR
4890: 55 50 54 20 65 72 72 6f 72 2e 20 0a 2a 2a 0a 2a  UPT error. .**.*
48a0: 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 6e 6f  * Because the no
48b0: 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 22 6f  n-primary key "o
48c0: 6c 64 2e 2a 22 20 66 69 65 6c 64 73 20 61 72 65  ld.*" fields are
48d0: 20 6f 6d 69 74 74 65 64 2c 20 6e 6f 20 0a 2a 2a   omitted, no .**
48e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
48f0: 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 73  T_DATA conflicts
4900: 20 63 61 6e 20 62 65 20 64 65 74 65 63 74 65 64   can be detected
4910: 20 6f 72 20 72 65 70 6f 72 74 65 64 20 69 66 20   or reported if 
4920: 61 20 70 61 74 63 68 73 65 74 0a 2a 2a 20 69 73  a patchset.** is
4930: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
4940: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4950: 61 70 70 6c 79 28 29 20 41 50 49 2e 20 4f 74 68  apply() API. Oth
4960: 65 72 20 63 6f 6e 66 6c 69 63 74 20 74 79 70 65  er conflict type
4970: 73 20 77 6f 72 6b 0a 2a 2a 20 69 6e 20 74 68 65  s work.** in the
4980: 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
4990: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 2a 2a 0a   changesets..**.
49a0: 2a 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69  ** Changes withi
49b0: 6e 20 61 20 70 61 74 63 68 73 65 74 20 61 72 65  n a patchset are
49c0: 20 6f 72 64 65 72 65 64 20 69 6e 20 74 68 65 20   ordered in the 
49d0: 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20  same way as for 
49e0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 67 65  changesets.** ge
49f0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73  nerated by the s
4a00: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4a10: 61 6e 67 65 73 65 74 28 29 20 66 75 6e 63 74 69  angeset() functi
4a20: 6f 6e 20 28 69 2e 65 2e 20 61 6c 6c 20 63 68 61  on (i.e. all cha
4a30: 6e 67 65 73 20 66 6f 72 0a 2a 2a 20 61 20 73 69  nges for.** a si
4a40: 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67  ngle table are g
4a50: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2c  rouped together,
4a60: 20 74 61 62 6c 65 73 20 61 70 70 65 61 72 20 69   tables appear i
4a70: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
4a80: 68 69 63 68 0a 2a 2a 20 74 68 65 79 20 77 65 72  hich.** they wer
4a90: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
4aa0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
4ab0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
4ac0: 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
4ad0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  t(.  sqlite3_ses
4ae0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
4af0: 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20       /* Session 
4b00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
4b10: 2a 70 6e 50 61 74 63 68 73 65 74 2c 20 20 20 20  *pnPatchset,    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4b30: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
4b40: 65 72 20 61 74 20 2a 70 70 50 61 74 63 68 73 65  er at *ppPatchse
4b50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
4b60: 50 61 74 63 68 73 65 74 20 20 20 20 20 20 20 20  Patchset        
4b70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
4b80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4b90: 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 29 3b 0a   patchset */.);.
4ba0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
4bb0: 20 54 65 73 74 20 69 66 20 61 20 63 68 61 6e 67   Test if a chang
4bc0: 65 73 65 74 20 68 61 73 20 72 65 63 6f 72 64 65  eset has recorde
4bd0: 64 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 0a 2a  d any changes..*
4be0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
4bf0: 7a 65 72 6f 20 69 66 20 6e 6f 20 63 68 61 6e 67  zero if no chang
4c00: 65 73 20 74 6f 20 61 74 74 61 63 68 65 64 20 74  es to attached t
4c10: 61 62 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20  ables have been 
4c20: 72 65 63 6f 72 64 65 64 20 62 79 20 0a 2a 2a 20  recorded by .** 
4c30: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
4c40: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4c50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4c60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6f   Otherwise, if o
4c70: 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 63  ne or .** more c
4c80: 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
4c90: 20 72 65 63 6f 72 64 65 64 2c 20 72 65 74 75 72   recorded, retur
4ca0: 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 76  n zero..**.** Ev
4cb0: 65 6e 20 69 66 20 74 68 69 73 20 66 75 6e 63 74  en if this funct
4cc0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
4cd0: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
4ce0: 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 0a 2a 2a   that calling.**
4cf0: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
4d00: 5f 63 68 61 6e 67 65 73 65 74 28 29 5d 20 6f 6e  _changeset()] on
4d10: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 68 61 6e   the session han
4d20: 64 6c 65 20 6d 61 79 20 73 74 69 6c 6c 20 72 65  dle may still re
4d30: 74 75 72 6e 20 61 0a 2a 2a 20 63 68 61 6e 67 65  turn a.** change
4d40: 73 65 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  set that contain
4d50: 73 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 54 68  s no changes. Th
4d60: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 68  is can happen wh
4d70: 65 6e 20 61 20 72 6f 77 20 69 6e 20 0a 2a 2a 20  en a row in .** 
4d80: 61 6e 20 61 74 74 61 63 68 65 64 20 74 61 62 6c  an attached tabl
4d90: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 6e  e is modified an
4da0: 64 20 74 68 65 6e 20 6c 61 74 65 72 20 6f 6e 20  d then later on 
4db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  the original val
4dc0: 75 65 73 20 0a 2a 2a 20 61 72 65 20 72 65 73 74  ues .** are rest
4dd0: 6f 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  ored. However, i
4de0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
4df0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
4e00: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
4e10: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
4e20: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
4e30: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
4e40: 65 74 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  et() will return
4e50: 20 61 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74   a .** changeset
4e60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
4e70: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 69 6e 74   changes..*/.int
4e80: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
4e90: 69 73 65 6d 70 74 79 28 73 71 6c 69 74 65 33 5f  isempty(sqlite3_
4ea0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
4eb0: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  n);../*.** CAPI3
4ec0: 52 45 46 3a 20 43 72 65 61 74 65 20 41 6e 20 49  REF: Create An I
4ed0: 74 65 72 61 74 6f 72 20 54 6f 20 54 72 61 76 65  terator To Trave
4ee0: 72 73 65 20 41 20 43 68 61 6e 67 65 73 65 74 20  rse A Changeset 
4ef0: 0a 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a  .** CONSTRUCTOR:
4f00: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
4f10: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 43 72  et_iter.**.** Cr
4f20: 65 61 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72  eate an iterator
4f30: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
4f40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
4f50: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
4f60: 65 73 65 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63  eset..** If succ
4f70: 65 73 73 66 75 6c 2c 20 2a 70 70 20 69 73 20 73  essful, *pp is s
4f80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
4f90: 68 65 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64  he iterator hand
4fa0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
4fb0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
4fc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4fe0: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 7a 65  *pp is set to ze
4ff0: 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a 20 53 51 4c  ro and an.** SQL
5000: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
5020: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5030: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
5040: 20 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65   used to advance
5050: 20 61 6e 64 20 71 75 65 72 79 20 61 20 63 68 61   and query a cha
5060: 6e 67 65 73 65 74 20 0a 2a 2a 20 69 74 65 72 61  ngeset .** itera
5070: 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 74  tor created by t
5080: 68 69 73 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a  his function:.**
5090: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
50a0: 69 3e 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  i> [sqlite3chang
50b0: 65 73 65 74 5f 6e 65 78 74 28 29 5d 0a 2a 2a 20  eset_next()].** 
50c0: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
50d0: 68 61 6e 67 65 73 65 74 5f 6f 70 28 29 5d 0a 2a  hangeset_op()].*
50e0: 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65  *   <li> [sqlite
50f0: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29  3changeset_new()
5100: 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c  ].**   <li> [sql
5110: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c  ite3changeset_ol
5120: 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  d()].** </ul>.**
5130: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
5140: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
5150: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
5160: 65 6e 74 75 61 6c 6c 79 20 64 65 73 74 72 6f 79  entually destroy
5170: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
5180: 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
5190: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
51a0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2e  set_finalize()].
51b0: 20 54 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74   The buffer cont
51c0: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 68  aining the.** ch
51d0: 61 6e 67 65 73 65 74 20 28 70 43 68 61 6e 67 65  angeset (pChange
51e0: 73 65 74 29 20 6d 75 73 74 20 72 65 6d 61 69 6e  set) must remain
51f0: 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 61 66 74   valid until aft
5200: 65 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  er the iterator 
5210: 69 73 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  is.** destroyed.
5220: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
5230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 6c  the changeset bl
5240: 6f 62 20 77 61 73 20 63 72 65 61 74 65 64 20 62  ob was created b
5250: 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  y one of the.** 
5260: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
5270: 63 68 61 6e 67 65 73 65 74 28 29 5d 2c 20 5b 73  changeset()], [s
5280: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5290: 63 6f 6e 63 61 74 28 29 5d 20 6f 72 0a 2a 2a 20  concat()] or.** 
52a0: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
52b0: 74 5f 69 6e 76 65 72 74 28 29 5d 20 66 75 6e 63  t_invert()] func
52c0: 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68 61 6e 67  tions, all chang
52d0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  es within the ch
52e0: 61 6e 67 65 73 65 74 20 0a 2a 2a 20 74 68 61 74  angeset .** that
52f0: 20 61 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67   apply to a sing
5300: 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f  le table are gro
5310: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 54  uped together. T
5320: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
5330: 68 65 6e 20 0a 2a 2a 20 61 6e 20 61 70 70 6c 69  hen .** an appli
5340: 63 61 74 69 6f 6e 20 69 74 65 72 61 74 65 73 20  cation iterates 
5350: 74 68 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65  through a change
5360: 73 65 74 20 75 73 69 6e 67 20 61 6e 20 69 74 65  set using an ite
5370: 72 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79  rator created by
5380: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
5390: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
53a0: 74 68 61 74 20 72 65 6c 61 74 65 20 74 6f 20 61  that relate to a
53b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
53c0: 65 20 76 69 73 69 74 65 64 20 0a 2a 2a 20 63 6f  e visited .** co
53d0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 20 54 68 65  nsecutively. The
53e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
53f0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
5400: 72 20 77 69 6c 6c 20 76 69 73 69 74 20 61 20 63  r will visit a c
5410: 68 61 6e 67 65 20 0a 2a 2a 20 74 68 65 20 61 70  hange .** the ap
5420: 70 6c 69 65 73 20 74 6f 20 74 61 62 6c 65 20 58  plies to table X
5430: 2c 20 74 68 65 6e 20 6f 6e 65 20 66 6f 72 20 74  , then one for t
5440: 61 62 6c 65 20 59 2c 20 61 6e 64 20 74 68 65 6e  able Y, and then
5450: 20 6c 61 74 65 72 20 6f 6e 20 76 69 73 69 74 20   later on visit 
5460: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 63 68 61 6e  .** another chan
5470: 67 65 20 66 6f 72 20 74 61 62 6c 65 20 58 2e 0a  ge for table X..
5480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5490: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 0a 20  angeset_start(. 
54a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
54b0: 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20  et_iter **pp,   
54c0: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68 61   /* OUT: New cha
54d0: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
54e0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
54f0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
5500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5510: 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74  ize of changeset
5520: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a   blob in bytes *
5530: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67  /.  void *pChang
5540: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
5550: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5560: 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e  o blob containin
5570: 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29  g changeset */.)
5580: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  ;.../*.** CAPI3R
5590: 45 46 3a 20 41 64 76 61 6e 63 65 20 41 20 43 68  EF: Advance A Ch
55a0: 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72  angeset Iterator
55b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
55c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
55d0: 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  er.**.** This fu
55e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
55f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 69 74 65  be used with ite
5600: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
5610: 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 5b 73  y function.** [s
5620: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5630: 73 74 61 72 74 28 29 5d 2e 20 49 66 20 69 74 20  start()]. If it 
5640: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  is called on an 
5650: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
5660: 74 6f 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74  to.** a conflict
5670: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
5680: 6b 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  k by [sqlite3cha
5690: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
56a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 0a 2a   SQLITE_MISUSE.*
56b0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
56c0: 64 20 74 68 65 20 63 61 6c 6c 20 68 61 73 20 6e  d the call has n
56d0: 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o effect..**.** 
56e0: 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
56f0: 72 20 61 6e 20 69 74 65 72 61 74 6f 72 20 69 73  r an iterator is
5700: 20 63 72 65 61 74 65 64 20 62 79 20 73 71 6c 69   created by sqli
5710: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
5720: 72 74 28 29 2c 20 69 74 0a 2a 2a 20 64 6f 65 73  rt(), it.** does
5730: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
5740: 79 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  y change in the 
5750: 63 68 61 6e 67 65 73 65 74 2e 20 41 73 73 75 6d  changeset. Assum
5760: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
5770: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 65 6d 70 74  t.** is not empt
5780: 79 2c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  y, the first cal
5790: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
57a0: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
57b0: 69 74 65 72 61 74 6f 72 20 74 6f 0a 2a 2a 20 70  iterator to.** p
57c0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
57d0: 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  t change in the 
57e0: 63 68 61 6e 67 65 73 65 74 2e 20 45 61 63 68 20  changeset. Each 
57f0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
5800: 61 64 76 61 6e 63 65 73 0a 2a 2a 20 74 68 65 20  advances.** the 
5810: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
5820: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  t to the next ch
5830: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
5840: 67 65 73 65 74 20 28 69 66 20 61 6e 79 29 2e 20  geset (if any). 
5850: 49 66 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 6f  If.** no error o
5860: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
5870: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
5880: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 67 65 20   a valid change 
5890: 61 66 74 65 72 20 61 20 63 61 6c 6c 0a 2a 2a 20  after a call.** 
58a0: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
58b0: 73 65 74 5f 6e 65 78 74 28 29 20 68 61 73 20 61  set_next() has a
58c0: 64 76 61 6e 63 65 64 20 69 74 2c 20 53 51 4c 49  dvanced it, SQLI
58d0: 54 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e  TE_ROW is return
58e0: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
58f0: 65 2c 20 69 66 20 61 6c 6c 20 63 68 61 6e 67 65  e, if all change
5900: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
5910: 65 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  et have already 
5920: 62 65 65 6e 20 76 69 73 69 74 65 64 2c 0a 2a 2a  been visited,.**
5930: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
5940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5950: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5960: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
5970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5980: 72 6e 65 64 2e 20 50 6f 73 73 69 62 6c 65 20 65  rned. Possible e
5990: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 73 20 69  rror .** codes i
59a0: 6e 63 6c 75 64 65 20 53 51 4c 49 54 45 5f 43 4f  nclude SQLITE_CO
59b0: 52 52 55 50 54 20 28 69 66 20 74 68 65 20 63 68  RRUPT (if the ch
59c0: 61 6e 67 65 73 65 74 20 62 75 66 66 65 72 20 69  angeset buffer i
59d0: 73 20 63 6f 72 72 75 70 74 29 20 6f 72 20 0a 2a  s corrupt) or .*
59e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
59f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5a00: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 73 71 6c  angeset_next(sql
5a10: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
5a20: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
5a30: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
5a40: 74 61 69 6e 20 54 68 65 20 43 75 72 72 65 6e 74  tain The Current
5a50: 20 4f 70 65 72 61 74 69 6f 6e 20 46 72 6f 6d 20   Operation From 
5a60: 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72  A Changeset Iter
5a70: 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20  ator.** METHOD: 
5a80: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
5a90: 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65  t_iter.**.** The
5aa0: 20 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20   pIter argument 
5ab0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5ac0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68  unction may eith
5ad0: 65 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f  er be an iterato
5ae0: 72 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  r.** passed to a
5af0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
5b00: 72 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  r by [sqlite3cha
5b10: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
5b20: 20 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a   or an iterator.
5b30: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73  ** created by [s
5b40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5b50: 73 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65  start()]. In the
5b60: 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68   latter case, th
5b70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
5b80: 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65   call to [sqlite
5b90: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
5ba0: 29 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74  )] must have ret
5bb0: 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 5f 52 4f  urned [SQLITE_RO
5bc0: 57 5d 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 69  W]. If this.** i
5bd0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  s not the case, 
5be0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
5bf0: 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49  turns [SQLITE_MI
5c00: 53 55 53 45 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  SUSE]..**.** If 
5c10: 61 72 67 75 6d 65 6e 74 20 70 7a 54 61 62 20 69  argument pzTab i
5c20: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5c30: 20 2a 70 7a 54 61 62 20 69 73 20 73 65 74 20 74   *pzTab is set t
5c40: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20  o point to a.** 
5c50: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 75  nul-terminated u
5c60: 74 66 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  tf-8 encoded str
5c70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
5c80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5c90: 61 62 6c 65 0a 2a 2a 20 61 66 66 65 63 74 65 64  able.** affected
5ca0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
5cb0: 63 68 61 6e 67 65 2e 20 54 68 65 20 62 75 66 66  change. The buff
5cc0: 65 72 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  er remains valid
5cd0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 0a 2a 2a   until either.**
5ce0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
5cf0: 74 5f 6e 65 78 74 28 29 20 69 73 20 63 61 6c 6c  t_next() is call
5d00: 65 64 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ed on the iterat
5d10: 6f 72 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  or or until the 
5d20: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  .** conflict-han
5d30: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  dler function re
5d40: 74 75 72 6e 73 2e 20 49 66 20 70 6e 43 6f 6c 20  turns. If pnCol 
5d50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
5d60: 6e 20 2a 70 6e 43 6f 6c 20 69 73 20 0a 2a 2a 20  n *pnCol is .** 
5d70: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
5d80: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
5d90: 74 68 65 20 74 61 62 6c 65 20 61 66 66 65 63 74  the table affect
5da0: 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 67 65  ed by the change
5db0: 2e 20 49 66 0a 2a 2a 20 70 62 49 6e 63 6f 72 72  . If.** pbIncorr
5dc0: 65 63 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ect is not NULL,
5dd0: 20 74 68 65 6e 20 2a 70 62 49 6e 64 69 72 65 63   then *pbIndirec
5de0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
5df0: 20 28 31 29 20 69 66 20 74 68 65 20 63 68 61 6e   (1) if the chan
5e00: 67 65 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 64 69  ge.** is an indi
5e10: 72 65 63 74 20 63 68 61 6e 67 65 2c 20 6f 72 20  rect change, or 
5e20: 66 61 6c 73 65 20 28 30 29 20 6f 74 68 65 72 77  false (0) otherw
5e30: 69 73 65 2e 20 53 65 65 20 74 68 65 20 64 6f 63  ise. See the doc
5e40: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a  umentation for.*
5e50: 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  * [sqlite3sessio
5e60: 6e 5f 69 6e 64 69 72 65 63 74 28 29 5d 20 66 6f  n_indirect()] fo
5e70: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5e80: 6f 66 20 64 69 72 65 63 74 20 61 6e 64 20 69 6e  of direct and in
5e90: 64 69 72 65 63 74 0a 2a 2a 20 63 68 61 6e 67 65  direct.** change
5ea0: 73 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70  s. Finally, if p
5eb0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  Op is not NULL, 
5ec0: 74 68 65 6e 20 2a 70 4f 70 20 69 73 20 73 65 74  then *pOp is set
5ed0: 20 74 6f 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 5b   to one of .** [
5ee0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2c 20  SQLITE_INSERT], 
5ef0: 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d 20  [SQLITE_DELETE] 
5f00: 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54  or [SQLITE_UPDAT
5f10: 45 5d 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  E], depending on
5f20: 20 74 68 65 20 0a 2a 2a 20 74 79 70 65 20 6f 66   the .** type of
5f30: 20 63 68 61 6e 67 65 20 74 68 61 74 20 74 68 65   change that the
5f40: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
5f50: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
5f60: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
5f70: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
5f80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
5f90: 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
5fa0: 20 6f 63 63 75 72 2c 20 61 6e 0a 2a 2a 20 53 51   occur, an.** SQ
5fb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5fc0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
5fd0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6f   values of the o
5fe0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5ff0: 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 74 72  may not.** be tr
6000: 75 73 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  usted in this ca
6010: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6020: 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 0a  e3changeset_op(.
6030: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
6040: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
6050: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
6060: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
6070: 63 68 61 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20  char **pzTab,   
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6090: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61 62  : Pointer to tab
60a0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  le name */.  int
60b0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60d0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
60e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
60f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 70 2c 20 20  */.  int *pOp,  
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
6120: 49 54 45 5f 49 4e 53 45 52 54 2c 20 44 45 4c 45  ITE_INSERT, DELE
6130: 54 45 20 6f 72 20 55 50 44 41 54 45 20 2a 2f 0a  TE or UPDATE */.
6140: 20 20 69 6e 74 20 2a 70 62 49 6e 64 69 72 65 63    int *pbIndirec
6150: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
6160: 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 66    /* OUT: True f
6170: 6f 72 20 61 6e 20 27 69 6e 64 69 72 65 63 74 27  or an 'indirect'
6180: 20 63 68 61 6e 67 65 20 2a 2f 0a 29 3b 0a 0a 2f   change */.);../
6190: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f  *.** CAPI3REF: O
61a0: 62 74 61 69 6e 20 54 68 65 20 50 72 69 6d 61 72  btain The Primar
61b0: 79 20 4b 65 79 20 44 65 66 69 6e 69 74 69 6f 6e  y Key Definition
61c0: 20 4f 66 20 41 20 54 61 62 6c 65 0a 2a 2a 20 4d   Of A Table.** M
61d0: 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63  ETHOD: sqlite3_c
61e0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a  hangeset_iter.**
61f0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 6d 6f 64  .** For each mod
6200: 69 66 69 65 64 20 74 61 62 6c 65 2c 20 61 20 63  ified table, a c
6210: 68 61 6e 67 65 73 65 74 20 69 6e 63 6c 75 64 65  hangeset include
6220: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
6230: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
6240: 20 3c 6c 69 3e 20 54 68 65 20 6e 75 6d 62 65 72   <li> The number
6250: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6260: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a  he table, and.**
6270: 20 20 20 3c 6c 69 3e 20 57 68 69 63 68 20 6f 66     <li> Which of
6280: 20 74 68 6f 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   those columns m
6290: 61 6b 65 20 75 70 20 74 68 65 20 74 61 62 6c 65  ake up the table
62a0: 73 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  s PRIMARY KEY..*
62b0: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68  * </ul>.**.** Th
62c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
62d0: 73 65 64 20 74 6f 20 66 69 6e 64 20 77 68 69 63  sed to find whic
62e0: 68 20 63 6f 6c 75 6d 6e 73 20 63 6f 6d 70 72 69  h columns compri
62f0: 73 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  se the PRIMARY K
6300: 45 59 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  EY of.** the tab
6310: 6c 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  le modified by t
6320: 68 65 20 63 68 61 6e 67 65 20 74 68 61 74 20 69  he change that i
6330: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
6340: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
6350: 6f 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  o..** If success
6360: 66 75 6c 2c 20 2a 70 61 62 50 4b 20 69 73 20 73  ful, *pabPK is s
6370: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
6380: 6e 20 61 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20  n array of nCol 
6390: 65 6e 74 72 69 65 73 2c 20 77 68 65 72 65 0a 2a  entries, where.*
63a0: 2a 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  * nCol is the nu
63b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
63c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45 6c  in the table. El
63d0: 65 6d 65 6e 74 73 20 6f 66 20 2a 70 61 62 50 4b  ements of *pabPK
63e0: 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 30   are set to.** 0
63f0: 78 30 31 20 69 66 20 74 68 65 20 63 6f 72 72 65  x01 if the corre
6400: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
6410: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  is part of the t
6420: 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
6430: 79 2c 20 6f 72 0a 2a 2a 20 30 78 30 30 20 69 66  y, or.** 0x00 if
6440: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a   it is not..**.*
6450: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 6e  * If argument pn
6460: 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Col is not NULL,
6470: 20 74 68 65 6e 20 2a 70 6e 43 6f 6c 20 69 73 20   then *pnCol is 
6480: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6490: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  r of columns.** 
64a0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
64b0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
64c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
64d0: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
64e0: 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
64f0: 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 65 6e  to a valid.** en
6500: 74 72 79 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55  try, SQLITE_MISU
6510: 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SE is returned a
6520: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  nd the output va
6530: 72 69 61 62 6c 65 73 20 7a 65 72 6f 65 64 2e 20  riables zeroed. 
6540: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
6550: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6560: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
6570: 75 74 20 76 61 72 69 61 62 6c 65 73 20 70 6f 70  ut variables pop
6580: 75 6c 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ulated as descri
6590: 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2f  bed.** above..*/
65a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
65b0: 67 65 73 65 74 5f 70 6b 28 0a 20 20 73 71 6c 69  geset_pk(.  sqli
65c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
65d0: 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49  er *pIter,  /* I
65e0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
65f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6600: 72 20 2a 2a 70 61 62 50 4b 2c 20 20 20 20 20 20  r **pabPK,      
6610: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
6620: 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 20 2d 20 74  y of boolean - t
6630: 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c 73 20  rue for PK cols 
6640: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 20  */.  int *pnCol 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
6670: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
6680: 6e 20 6f 75 74 70 75 74 20 61 72 72 61 79 20 2a  n output array *
6690: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
66a0: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6f 6c 64  3REF: Obtain old
66b0: 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  .* Values From A
66c0: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
66d0: 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  tor.** METHOD: s
66e0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
66f0: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _iter.**.** The 
6700: 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70  pIter argument p
6710: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
6720: 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65  nction may eithe
6730: 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72  r be an iterator
6740: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20  .** passed to a 
6750: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
6760: 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   by [sqlite3chan
6770: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20  geset_apply()], 
6780: 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a  or an iterator.*
6790: 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71  * created by [sq
67a0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
67b0: 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20  tart()]. In the 
67c0: 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68 65  latter case, the
67d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
67e0: 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33  call to [sqlite3
67f0: 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29  changeset_next()
6800: 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74 75  ] must have retu
6810: 72 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e  rned SQLITE_ROW.
6820: 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65   .** Furthermore
6830: 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65  , it may only be
6840: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 74   called if the t
6850: 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68  ype of change th
6860: 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  at the iterator.
6870: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
6880: 6e 74 73 20 74 6f 20 69 73 20 65 69 74 68 65 72  nts to is either
6890: 20 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d   [SQLITE_DELETE]
68a0: 20 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41   or [SQLITE_UPDA
68b0: 54 45 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  TE]. Otherwise,.
68c0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
68d0: 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45   returns [SQLITE
68e0: 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20 73 65 74  _MISUSE] and set
68f0: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e 55  s *ppValue to NU
6900: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  LL..**.** Argume
6910: 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65 20  nt iVal must be 
6920: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
6930: 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20  equal to 0, and 
6940: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75  less than the nu
6950: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mber.** of colum
6960: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
6970: 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20  affected by the 
6980: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e 20  current change. 
6990: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53  Otherwise,.** [S
69a0: 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73 20  QLITE_RANGE] is 
69b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
69c0: 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  Value is set to 
69d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  NULL..**.** If s
69e0: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
69f0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
6a00: 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20  pValue to point 
6a10: 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a 2a  to a protected.*
6a20: 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  * sqlite3_value 
6a30: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
6a40: 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76 61  g the iVal'th va
6a50: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 76 65 63  lue from the vec
6a60: 74 6f 72 20 6f 66 20 0a 2a 2a 20 6f 72 69 67 69  tor of .** origi
6a70: 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73  nal row values s
6a80: 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
6a90: 20 74 68 65 20 55 50 44 41 54 45 20 6f 72 20 44   the UPDATE or D
6aa0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 61 6e 64  ELETE change and
6ab0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
6ac0: 54 45 5f 4f 4b 2e 20 54 68 65 20 6e 61 6d 65 20  TE_OK. The name 
6ad0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
6ae0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 66  comes from the f
6af0: 61 63 74 20 74 68 61 74 20 74 68 69 73 20 0a 2a  act that this .*
6b00: 2a 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  * is similar to 
6b10: 74 68 65 20 22 6f 6c 64 2e 2a 22 20 63 6f 6c 75  the "old.*" colu
6b20: 6d 6e 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  mns available to
6b30: 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
6b40: 65 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a  e triggers..**.*
6b50: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
6b60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e  error occurs (e.
6b70: 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  g. an OOM condit
6b80: 69 6f 6e 29 2c 20 61 6e 20 53 51 4c 69 74 65 20  ion), an SQLite 
6b90: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
6ba0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
6bb0: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
6bc0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
6bd0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
6be0: 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  ld(.  sqlite3_ch
6bf0: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
6c00: 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ter,  /* Changes
6c10: 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  et iterator */. 
6c20: 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20   int iVal,      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
6c50: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
6c60: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20  alue **ppValue  
6c70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f         /* OUT: O
6c80: 6c 64 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c  ld value (or NUL
6c90: 4c 20 70 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b  L pointer) */.);
6ca0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
6cb0: 3a 20 4f 62 74 61 69 6e 20 6e 65 77 2e 2a 20 56  : Obtain new.* V
6cc0: 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43 68 61  alues From A Cha
6cd0: 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a  ngeset Iterator.
6ce0: 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74  ** METHOD: sqlit
6cf0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
6d00: 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65  r.**.** The pIte
6d10: 72 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  r argument passe
6d20: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
6d30: 6f 6e 20 6d 61 79 20 65 69 74 68 65 72 20 62 65  on may either be
6d40: 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20   an iterator.** 
6d50: 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66  passed to a conf
6d60: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 20  lict-handler by 
6d70: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
6d80: 74 5f 61 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61  t_apply()], or a
6d90: 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72  n iterator.** cr
6da0: 65 61 74 65 64 20 62 79 20 5b 73 71 6c 69 74 65  eated by [sqlite
6db0: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
6dc0: 28 29 5d 2e 20 49 6e 20 74 68 65 20 6c 61 74 74  ()]. In the latt
6dd0: 65 72 20 63 61 73 65 2c 20 74 68 65 20 6d 6f 73  er case, the mos
6de0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c  t recent.** call
6df0: 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   to [sqlite3chan
6e00: 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75  geset_next()] mu
6e10: 73 74 20 68 61 76 65 20 72 65 74 75 72 6e 65 64  st have returned
6e20: 20 53 51 4c 49 54 45 5f 52 4f 57 2e 20 0a 2a 2a   SQLITE_ROW. .**
6e30: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 74   Furthermore, it
6e40: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
6e50: 6c 65 64 20 69 66 20 74 68 65 20 74 79 70 65 20  led if the type 
6e60: 6f 66 20 63 68 61 6e 67 65 20 74 68 61 74 20 74  of change that t
6e70: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63  he iterator.** c
6e80: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
6e90: 74 6f 20 69 73 20 65 69 74 68 65 72 20 5b 53 51  to is either [SQ
6ea0: 4c 49 54 45 5f 55 50 44 41 54 45 5d 20 6f 72 20  LITE_UPDATE] or 
6eb0: 5b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2e  [SQLITE_INSERT].
6ec0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
6ed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
6ee0: 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49 53  urns [SQLITE_MIS
6ef0: 55 53 45 5d 20 61 6e 64 20 73 65 74 73 20 2a 70  USE] and sets *p
6f00: 70 56 61 6c 75 65 20 74 6f 20 4e 55 4c 4c 2e 0a  pValue to NULL..
6f10: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69  **.** Argument i
6f20: 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  Val must be grea
6f30: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
6f40: 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73 73  l to 0, and less
6f50: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
6f60: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  .** of columns i
6f70: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66 65  n the table affe
6f80: 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  cted by the curr
6f90: 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68 65  ent change. Othe
6fa0: 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49 54  rwise,.** [SQLIT
6fb0: 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74 75  E_RANGE] is retu
6fc0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75  rned and *ppValu
6fd0: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
6fe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
6ff0: 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
7000: 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61 6c  tion sets *ppVal
7010: 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ue to point to a
7020: 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73 71   protected.** sq
7030: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
7040: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ct containing th
7050: 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65 20  e iVal'th value 
7060: 66 72 6f 6d 20 74 68 65 20 76 65 63 74 6f 72 20  from the vector 
7070: 6f 66 20 0a 2a 2a 20 6e 65 77 20 72 6f 77 20 76  of .** new row v
7080: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20  alues stored as 
7090: 70 61 72 74 20 6f 66 20 74 68 65 20 55 50 44 41  part of the UPDA
70a0: 54 45 20 6f 72 20 49 4e 53 45 52 54 20 63 68 61  TE or INSERT cha
70b0: 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  nge and.** retur
70c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ns SQLITE_OK. If
70d0: 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
70e0: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 64 6f 65  n UPDATE and doe
70f0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 0a 2a 2a  s not include.**
7100: 20 61 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72   a new value for
7110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
7120: 6f 6c 75 6d 6e 2c 20 2a 70 70 56 61 6c 75 65 20  olumn, *ppValue 
7130: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
7140: 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
7150: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 6e   returned. The n
7160: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
7170: 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
7180: 68 65 20 66 61 63 74 20 74 68 61 74 20 0a 2a 2a  he fact that .**
7190: 20 74 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   this is similar
71a0: 20 74 6f 20 74 68 65 20 22 6e 65 77 2e 2a 22 20   to the "new.*" 
71b0: 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62 6c  columns availabl
71c0: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
71d0: 65 6c 65 74 65 20 0a 2a 2a 20 74 72 69 67 67 65  elete .** trigge
71e0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d  rs..**.** If som
71f0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  e other error oc
7200: 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
7210: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e  M condition), an
7220: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7230: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7240: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
7250: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
7260: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7270: 6e 67 65 73 65 74 5f 6e 65 77 28 0a 20 20 73 71  ngeset_new(.  sq
7280: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7290: 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
72a0: 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
72b0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61  tor */.  int iVa
72c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
72e0: 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  mn number */.  s
72f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
7300: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 2f  pValue         /
7310: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65  * OUT: New value
7320: 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   (or NULL pointe
7330: 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r) */.);../*.** 
7340: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
7350: 20 43 6f 6e 66 6c 69 63 74 69 6e 67 20 52 6f 77   Conflicting Row
7360: 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43   Values From A C
7370: 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f  hangeset Iterato
7380: 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  r.** METHOD: sql
7390: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
73a0: 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ter.**.** This f
73b0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
73c0: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
73d0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
73e0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a  s passed to a.**
73f0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
7400: 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20 5b 73  r callback by [s
7410: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7420: 61 70 70 6c 79 28 29 5d 20 77 69 74 68 20 65 69  apply()] with ei
7430: 74 68 65 72 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f  ther.** [SQLITE_
7440: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20  CHANGESET_DATA] 
7450: 6f 72 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  or [SQLITE_CHANG
7460: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 5d 2e 20  ESET_CONFLICT]. 
7470: 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
7480: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  .** is called on
7490: 20 61 6e 79 20 6f 74 68 65 72 20 69 74 65 72 61   any other itera
74a0: 74 6f 72 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53  tor, [SQLITE_MIS
74b0: 55 53 45 5d 20 69 73 20 72 65 74 75 72 6e 65 64  USE] is returned
74c0: 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 0a 2a 2a   and *ppValue.**
74d0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
74e0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
74f0: 69 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65  iVal must be gre
7500: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
7510: 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73  al to 0, and les
7520: 73 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  s than the numbe
7530: 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  r.** of columns 
7540: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66  in the table aff
7550: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
7560: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68  rent change. Oth
7570: 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49  erwise,.** [SQLI
7580: 54 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74  TE_RANGE] is ret
7590: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
75a0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
75b0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  L..**.** If succ
75c0: 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
75d0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61  ction sets *ppVa
75e0: 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
75f0: 61 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73  a protected.** s
7600: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
7610: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
7620: 68 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65  he iVal'th value
7630: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 22 63   from the .** "c
7640: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 22 20  onflicting row" 
7650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7660: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
7670: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c  lict-handler cal
7680: 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 72 65 74  lback.** and ret
7690: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
76a0: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
76b0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
76c0: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
76d0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
76e0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
76f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
7700: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
7710: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
7720: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
7730: 65 74 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  et_conflict(.  s
7740: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7750: 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
7760: 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
7770: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56  ator */.  int iV
7780: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
7790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
77a0: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
77b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
77c0: 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
77d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 66 72  /* OUT: Value fr
77e0: 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  om conflicting r
77f0: 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.);../*.** 
7800: 43 41 50 49 33 52 45 46 3a 20 44 65 74 65 72 6d  CAPI3REF: Determ
7810: 69 6e 65 20 54 68 65 20 4e 75 6d 62 65 72 20 4f  ine The Number O
7820: 66 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f  f Foreign Key Co
7830: 6e 73 74 72 61 69 6e 74 20 56 69 6f 6c 61 74 69  nstraint Violati
7840: 6f 6e 73 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  ons.** METHOD: s
7850: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7860: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _iter.**.** This
7870: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
7880: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ly be called wit
7890: 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  h an iterator pa
78a0: 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a 20 53 51  ssed to an.** SQ
78b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46  LITE_CHANGESET_F
78c0: 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f 6e 66 6c  OREIGN_KEY confl
78d0: 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ict handler call
78e0: 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
78f0: 73 65 0a 2a 2a 20 69 74 20 73 65 74 73 20 74 68  se.** it sets th
7900: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
7910: 65 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  e to the total n
7920: 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77 6e 20 66  umber of known f
7930: 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 76 69  oreign key.** vi
7940: 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  olations in the 
7950: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
7960: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
7970: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
7980: 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
7990: 61 73 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  ases this functi
79a0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
79b0: 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69 6e 74  E_MISUSE..*/.int
79c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
79d0: 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 0a  t_fk_conflicts(.
79e0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
79f0: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
7a00: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69    /* Changeset i
7a10: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
7a20: 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20   *pnOut         
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 46  OUT: Number of F
7a50: 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 2a 2f 0a  K violations */.
7a60: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  );.../*.** CAPI3
7a70: 52 45 46 3a 20 46 69 6e 61 6c 69 7a 65 20 41 20  REF: Finalize A 
7a80: 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74  Changeset Iterat
7a90: 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71  or.** METHOD: sq
7aa0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7ab0: 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  iter.**.** This 
7ac0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
7ad0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 6e 20   to finalize an 
7ae0: 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61 74  iterator allocat
7af0: 65 64 20 77 69 74 68 0a 2a 2a 20 5b 73 71 6c 69  ed with.** [sqli
7b00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
7b10: 72 74 28 29 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rt()]..**.** Thi
7b20: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7b30: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7b40: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
7b50: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a  eated using the.
7b60: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
7b70: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 20 66 75  eset_start()] fu
7b80: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 61 70  nction. If an ap
7b90: 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
7ba0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
7bb0: 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f   with an iterato
7bc0: 72 20 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f  r passed to a co
7bd0: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62  nflict-handler b
7be0: 79 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61  y.** [sqlite3cha
7bf0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
7c00: 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d   [SQLITE_MISUSE]
7c10: 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   is immediately 
7c20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7c30: 0a 2a 2a 20 63 61 6c 6c 20 68 61 73 20 6e 6f 20  .** call has no 
7c40: 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  effect..**.** If
7c50: 20 61 6e 20 65 72 72 6f 72 20 77 61 73 20 65 6e   an error was en
7c60: 63 6f 75 6e 74 65 72 65 64 20 77 69 74 68 69 6e  countered within
7c70: 20 61 20 63 61 6c 6c 20 74 6f 20 61 6e 20 73 71   a call to an sq
7c80: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 78  lite3changeset_x
7c90: 78 78 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  xx().** function
7ca0: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 61 6e   (for example an
7cb0: 20 5b 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   [SQLITE_CORRUPT
7cc0: 5d 20 69 6e 20 5b 73 71 6c 69 74 65 33 63 68 61  ] in [sqlite3cha
7cd0: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6f  ngeset_next()] o
7ce0: 72 20 61 6e 20 0a 2a 2a 20 5b 53 51 4c 49 54 45  r an .** [SQLITE
7cf0: 5f 4e 4f 4d 45 4d 5d 20 69 6e 20 5b 73 71 6c 69  _NOMEM] in [sqli
7d00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77  te3changeset_new
7d10: 28 29 5d 29 20 74 68 65 6e 20 61 6e 20 65 72 72  ()]) then an err
7d20: 6f 72 20 63 6f 64 65 20 63 6f 72 72 65 73 70 6f  or code correspo
7d30: 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 61 74  nding.** to that
7d40: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
7d50: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7d60: 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
7d70: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
7d80: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69  returned. This i
7d90: 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66  s to allow the f
7da0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65 72 6e  ollowing pattern
7db0: 20 28 70 73 65 75 64 6f 2d 63 6f 64 65 29 3a 0a   (pseudo-code):.
7dc0: 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20  **.** <pre>.**  
7dd0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
7de0: 74 5f 73 74 61 72 74 28 29 3b 0a 2a 2a 20 20 20  t_start();.**   
7df0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
7e00: 57 3d 3d 73 71 6c 69 74 65 33 63 68 61 6e 67 65  W==sqlite3change
7e10: 73 65 74 5f 6e 65 78 74 28 29 20 29 7b 0a 2a 2a  set_next() ){.**
7e20: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
7e30: 68 69 6e 67 20 77 69 74 68 20 63 68 61 6e 67 65  hing with change
7e40: 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 72 63  ..**   }.**   rc
7e50: 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
7e60: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 3b 0a  set_finalize();.
7e70: 2a 2a 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  **   if( rc!=SQL
7e80: 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20  ITE_OK ){.**    
7e90: 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 68 61 73   // An error has
7ea0: 20 6f 63 63 75 72 72 65 64 20 0a 2a 2a 20 20 20   occurred .**   
7eb0: 7d 0a 2a 2a 20 3c 2f 70 72 65 3e 0a 2a 2f 0a 69  }.** </pre>.*/.i
7ec0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
7ed0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c  set_finalize(sql
7ee0: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
7ef0: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
7f00: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6e  .** CAPI3REF: In
7f10: 76 65 72 74 20 41 20 43 68 61 6e 67 65 73 65 74  vert A Changeset
7f20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7f30: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
7f40: 22 69 6e 76 65 72 74 22 20 61 20 63 68 61 6e 67  "invert" a chang
7f50: 65 73 65 74 20 6f 62 6a 65 63 74 2e 20 41 70 70  eset object. App
7f60: 6c 79 69 6e 67 20 61 6e 20 69 6e 76 65 72 74 65  lying an inverte
7f70: 64 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74  d.** changeset t
7f80: 6f 20 61 20 64 61 74 61 62 61 73 65 20 72 65 76  o a database rev
7f90: 65 72 73 65 73 20 74 68 65 20 65 66 66 65 63 74  erses the effect
7fa0: 73 20 6f 66 20 61 70 70 6c 79 69 6e 67 20 74 68  s of applying th
7fb0: 65 20 75 6e 69 6e 76 65 72 74 65 64 0a 2a 2a 20  e uninverted.** 
7fc0: 63 68 61 6e 67 65 73 65 74 2e 20 53 70 65 63 69  changeset. Speci
7fd0: 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c  fically:.**.** <
7fe0: 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61  ul>.**   <li> Ea
7ff0: 63 68 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ch DELETE change
8000: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61   is changed to a
8010: 6e 20 49 4e 53 45 52 54 2c 20 61 6e 64 0a 2a 2a  n INSERT, and.**
8020: 20 20 20 3c 6c 69 3e 20 45 61 63 68 20 49 4e 53     <li> Each INS
8030: 45 52 54 20 63 68 61 6e 67 65 20 69 73 20 63 68  ERT change is ch
8040: 61 6e 67 65 64 20 74 6f 20 61 20 44 45 4c 45 54  anged to a DELET
8050: 45 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e  E, and.**   <li>
8060: 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54 45   For each UPDATE
8070: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 6f 6c 64   change, the old
8080: 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a 20 76 61 6c  .* and new.* val
8090: 75 65 73 20 61 72 65 20 65 78 63 68 61 6e 67 65  ues are exchange
80a0: 64 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  d..** </ul>.**.*
80b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
80c0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
80d0: 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
80e0: 63 68 20 63 68 61 6e 67 65 73 20 61 70 70 65 61  ch changes appea
80f0: 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  r within.** the 
8100: 63 68 61 6e 67 65 73 65 74 2e 20 49 74 20 6d 65  changeset. It me
8110: 72 65 6c 79 20 72 65 76 65 72 73 65 73 20 74 68  rely reverses th
8120: 65 20 73 65 6e 73 65 20 6f 66 20 65 61 63 68 20  e sense of each 
8130: 69 6e 64 69 76 69 64 75 61 6c 20 63 68 61 6e 67  individual chang
8140: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
8150: 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
8160: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
8170: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 76  ntaining the inv
8180: 65 72 74 65 64 20 63 68 61 6e 67 65 73 65 74 0a  erted changeset.
8190: 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
81a0: 2a 70 70 4f 75 74 2c 20 74 68 65 20 73 69 7a 65  *ppOut, the size
81b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 62 75 66   of the same buf
81c0: 66 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e  fer is stored in
81d0: 20 2a 70 6e 4f 75 74 2c 20 61 6e 64 0a 2a 2a 20   *pnOut, and.** 
81e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
81f0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
8200: 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74 68 20  or occurs, both 
8210: 2a 70 6e 4f 75 74 20 61 6e 64 20 2a 70 70 4f 75  *pnOut and *ppOu
8220: 74 20 61 72 65 0a 2a 2a 20 7a 65 72 6f 65 64 20  t are.** zeroed 
8230: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
8240: 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
8250: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  d..**.** It is t
8260: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
8270: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
8280: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
8290: 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
82a0: 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 2a 70 70 4f  ).** on the *ppO
82b0: 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 72  ut pointer to fr
82c0: 65 65 20 74 68 65 20 62 75 66 66 65 72 20 61 6c  ee the buffer al
82d0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  location followi
82e0: 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
82f0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  .** call to this
8300: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8310: 20 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 54   WARNING/TODO: T
8320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 75 72  his function cur
8330: 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rently assumes t
8340: 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 69 73  hat the input is
8350: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 63 68 61 6e   a valid.** chan
8360: 67 65 73 65 74 2e 20 49 66 20 69 74 20 69 73 20  geset. If it is 
8370: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 73  not, the results
8380: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
8390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
83a0: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 0a  angeset_invert(.
83b0: 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74    int nIn, const
83c0: 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20   void *pIn,     
83d0: 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67    /* Input chang
83e0: 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  eset */.  int *p
83f0: 6e 4f 75 74 2c 20 76 6f 69 64 20 2a 2a 70 70 4f  nOut, void **ppO
8400: 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ut        /* OUT
8410: 3a 20 49 6e 76 65 72 73 65 20 6f 66 20 69 6e 70  : Inverse of inp
8420: 75 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ut */.);../*.** 
8430: 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 63 61 74  CAPI3REF: Concat
8440: 65 6e 61 74 65 20 54 77 6f 20 43 68 61 6e 67 65  enate Two Change
8450: 73 65 74 20 4f 62 6a 65 63 74 73 0a 2a 2a 0a 2a  set Objects.**.*
8460: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8470: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 63 61  is used to conca
8480: 74 65 6e 61 74 65 20 74 77 6f 20 63 68 61 6e 67  tenate two chang
8490: 65 73 65 74 73 2c 20 41 20 61 6e 64 20 42 2c 20  esets, A and B, 
84a0: 69 6e 74 6f 20 61 20 0a 2a 2a 20 73 69 6e 67 6c  into a .** singl
84b0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 68 65  e changeset. The
84c0: 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 68 61   result is a cha
84d0: 6e 67 65 73 65 74 20 65 71 75 69 76 61 6c 65 6e  ngeset equivalen
84e0: 74 20 74 6f 20 61 70 70 6c 79 69 6e 67 0a 2a 2a  t to applying.**
84f0: 20 63 68 61 6e 67 65 73 65 74 20 41 20 66 6f 6c   changeset A fol
8500: 6c 6f 77 65 64 20 62 79 20 63 68 61 6e 67 65 73  lowed by changes
8510: 65 74 20 42 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  et B. .**.** Thi
8520: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 62 69  s function combi
8530: 6e 65 73 20 74 68 65 20 74 77 6f 20 69 6e 70 75  nes the two inpu
8540: 74 20 63 68 61 6e 67 65 73 65 74 73 20 75 73 69  t changesets usi
8550: 6e 67 20 61 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ng an .** sqlite
8560: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  3_changegroup ob
8570: 6a 65 63 74 2e 20 43 61 6c 6c 69 6e 67 20 69 74  ject. Calling it
8580: 20 70 72 6f 64 75 63 65 73 20 73 69 6d 69 6c 61   produces simila
8590: 72 20 72 65 73 75 6c 74 73 20 61 73 20 74 68 65  r results as the
85a0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  .** following co
85b0: 64 65 20 66 72 61 67 6d 65 6e 74 3a 0a 2a 2a 0a  de fragment:.**.
85c0: 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20 20 73 71  ** <pre>.**   sq
85d0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
85e0: 70 20 2a 70 47 72 70 3b 0a 2a 2a 20 20 20 72 63  p *pGrp;.**   rc
85f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67   = sqlite3_chang
8600: 65 67 72 6f 75 70 5f 6e 65 77 28 26 70 47 72 70  egroup_new(&pGrp
8610: 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d  );.**   if( rc==
8620: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
8630: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
8640: 6f 75 70 5f 61 64 64 28 70 47 72 70 2c 20 6e 41  oup_add(pGrp, nA
8650: 2c 20 70 41 29 3b 0a 2a 2a 20 20 20 69 66 28 20  , pA);.**   if( 
8660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8670: 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
8680: 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72 70  gegroup_add(pGrp
8690: 2c 20 6e 42 2c 20 70 42 29 3b 0a 2a 2a 20 20 20  , nB, pB);.**   
86a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
86b0: 4b 20 29 7b 0a 2a 2a 20 20 20 20 20 72 63 20 3d  K ){.**     rc =
86c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
86d0: 6f 75 70 5f 6f 75 74 70 75 74 28 70 47 72 70 2c  oup_output(pGrp,
86e0: 20 70 6e 4f 75 74 2c 20 70 70 4f 75 74 29 3b 0a   pnOut, ppOut);.
86f0: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
8700: 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 2a     *ppOut = 0;.*
8710: 2a 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 30  *     *pnOut = 0
8720: 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70 72  ;.**   }.** </pr
8730: 65 3e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  e>.**.** Refer t
8740: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68  o the sqlite3_ch
8750: 61 6e 67 65 67 72 6f 75 70 20 64 6f 63 75 6d 65  angegroup docume
8760: 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  ntation below fo
8770: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
8780: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
8790: 65 74 5f 63 6f 6e 63 61 74 28 0a 20 20 69 6e 74  et_concat(.  int
87a0: 20 6e 41 2c 20 20 20 20 20 20 20 20 20 20 20 20   nA,            
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
87d0: 69 6e 20 62 75 66 66 65 72 20 70 41 20 2a 2f 0a  in buffer pA */.
87e0: 20 20 76 6f 69 64 20 2a 70 41 2c 20 20 20 20 20    void *pA,     
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8810: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
8820: 67 20 63 68 61 6e 67 65 73 65 74 20 41 20 2a 2f  g changeset A */
8830: 0a 20 20 69 6e 74 20 6e 42 2c 20 20 20 20 20 20  .  int nB,      
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8860: 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20  bytes in buffer 
8870: 70 42 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  pB */.  void *pB
8880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8890: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88a0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
88b0: 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65  taining changese
88c0: 74 20 42 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  t B */.  int *pn
88d0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
88e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
88f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8900: 20 69 6e 20 6f 75 74 70 75 74 20 63 68 61 6e 67   in output chang
8910: 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  eset */.  void *
8920: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8940: 3a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  : Buffer contain
8950: 69 6e 67 20 6f 75 74 70 75 74 20 63 68 61 6e 67  ing output chang
8960: 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a  eset */.);.../*.
8970: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 68 61  ** CAPI3REF: Cha
8980: 6e 67 65 67 72 6f 75 70 20 48 61 6e 64 6c 65 0a  ngegroup Handle.
8990: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 67 72  **.** A changegr
89a0: 6f 75 70 20 69 73 20 61 6e 20 6f 62 6a 65 63 74  oup is an object
89b0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65   used to combine
89c0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 0a 2a 2a   two or more .**
89d0: 20 5b 63 68 61 6e 67 65 73 65 74 73 5d 20 6f 72   [changesets] or
89e0: 20 5b 70 61 74 63 68 73 65 74 73 5d 0a 2a 2f 0a   [patchsets].*/.
89f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
8a00: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
8a10: 75 70 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  up sqlite3_chang
8a20: 65 67 72 6f 75 70 3b 0a 0a 2f 2a 0a 2a 2a 20 43  egroup;../*.** C
8a30: 41 50 49 33 52 45 46 3a 20 43 72 65 61 74 65 20  API3REF: Create 
8a40: 41 20 4e 65 77 20 43 68 61 6e 67 65 67 72 6f 75  A New Changegrou
8a50: 70 20 4f 62 6a 65 63 74 0a 2a 2a 20 43 4f 4e 53  p Object.** CONS
8a60: 54 52 55 43 54 4f 52 3a 20 73 71 6c 69 74 65 33  TRUCTOR: sqlite3
8a70: 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 0a  _changegroup.**.
8a80: 2a 2a 20 41 6e 20 73 71 6c 69 74 65 33 5f 63 68  ** An sqlite3_ch
8a90: 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63 74  angegroup object
8aa0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 62   is used to comb
8ab0: 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ine two or more 
8ac0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 28 6f  changesets.** (o
8ad0: 72 20 70 61 74 63 68 73 65 74 73 29 20 69 6e 74  r patchsets) int
8ae0: 6f 20 61 20 73 69 6e 67 6c 65 20 63 68 61 6e 67  o a single chang
8af0: 65 73 65 74 20 28 6f 72 20 70 61 74 63 68 73 65  eset (or patchse
8b00: 74 29 2e 20 41 20 73 69 6e 67 6c 65 20 63 68 61  t). A single cha
8b10: 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 6f 62 6a 65  ngegroup.** obje
8b20: 63 74 20 6d 61 79 20 63 6f 6d 62 69 6e 65 20 63  ct may combine c
8b30: 68 61 6e 67 65 73 65 74 73 20 6f 72 20 70 61 74  hangesets or pat
8b40: 63 68 73 65 74 73 2c 20 62 75 74 20 6e 6f 74 20  chsets, but not 
8b50: 62 6f 74 68 2e 20 54 68 65 20 6f 75 74 70 75 74  both. The output
8b60: 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 6e   is.** always in
8b70: 20 74 68 65 20 73 61 6d 65 20 66 6f 72 6d 61 74   the same format
8b80: 20 61 73 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a   as the input..*
8b90: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
8ba0: 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
8bb0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
8bc0: 5f 4f 4b 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  _OK and populate
8bd0: 73 20 28 2a 70 70 29 20 77 69 74 68 0a 2a 2a 20  s (*pp) with.** 
8be0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
8bf0: 65 77 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ew sqlite3_chang
8c00: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 62 65  egroup object be
8c10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
8c20: 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 73 68  The caller.** sh
8c30: 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
8c40: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
8c50: 64 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 20 61  d object using a
8c60: 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
8c70: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8c80: 64 65 6c 65 74 65 28 29 2e 20 49 66 20 61 6e 20  delete(). If an 
8c90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8ca0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
8cb0: 64 65 0a 2a 2a 20 28 69 2e 65 2e 20 53 51 4c 49  de.** (i.e. SQLI
8cc0: 54 45 5f 4e 4f 4d 45 4d 29 20 69 73 20 72 65 74  TE_NOMEM) is ret
8cd0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
8ce0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
8cf0: 0a 2a 2a 20 54 68 65 20 75 73 75 61 6c 20 75 73  .** The usual us
8d00: 61 67 65 20 70 61 74 74 65 72 6e 20 66 6f 72 20  age pattern for 
8d10: 61 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  an sqlite3_chang
8d20: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 69 73  egroup object is
8d30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8d40: 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ul>.**   <li
8d50: 3e 20 49 74 20 69 73 20 63 72 65 61 74 65 64 20  > It is created 
8d60: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8d70: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8d80: 75 70 5f 6e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20  up_new()..**.** 
8d90: 20 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d    <li> Zero or m
8da0: 6f 72 65 20 63 68 61 6e 67 65 73 65 74 73 20 28  ore changesets (
8db0: 6f 72 20 70 61 74 63 68 73 65 74 73 29 20 61 72  or patchsets) ar
8dc0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  e added to the o
8dd0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
8de0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
8df0: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
8e00: 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  d()..**.**   <li
8e10: 3e 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  > The result of 
8e20: 63 6f 6d 62 69 6e 69 6e 67 20 61 6c 6c 20 69 6e  combining all in
8e30: 70 75 74 20 63 68 61 6e 67 65 73 65 74 73 20 74  put changesets t
8e40: 6f 67 65 74 68 65 72 20 69 73 20 6f 62 74 61 69  ogether is obtai
8e50: 6e 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 62  ned .**        b
8e60: 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
8e70: 6e 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20  n via a call to 
8e80: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8e90: 75 70 5f 6f 75 74 70 75 74 28 29 2e 0a 2a 2a 0a  up_output()..**.
8ea0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6f 62  **   <li> The ob
8eb0: 6a 65 63 74 20 69 73 20 64 65 6c 65 74 65 64 20  ject is deleted 
8ec0: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8ed0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8ee0: 75 70 5f 64 65 6c 65 74 65 28 29 2e 0a 2a 2a 20  up_delete()..** 
8ef0: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  </ul>.**.** Any 
8f00: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
8f10: 74 6f 20 61 64 64 28 29 20 61 6e 64 20 6f 75 74  to add() and out
8f20: 70 75 74 28 29 20 6d 61 79 20 62 65 20 6d 61 64  put() may be mad
8f30: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 61  e between the ca
8f40: 6c 6c 73 20 74 6f 0a 2a 2a 20 6e 65 77 28 29 20  lls to.** new() 
8f50: 61 6e 64 20 64 65 6c 65 74 65 28 29 2c 20 61 6e  and delete(), an
8f60: 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 0a  d in any order..
8f70: 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  **.** As well as
8f80: 20 74 68 65 20 72 65 67 75 6c 61 72 20 73 71 6c   the regular sql
8f90: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8fa0: 61 64 64 28 29 20 61 6e 64 20 0a 2a 2a 20 73 71  add() and .** sq
8fb0: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
8fc0: 5f 6f 75 74 70 75 74 28 29 20 66 75 6e 63 74 69  _output() functi
8fd0: 6f 6e 73 2c 20 61 6c 73 6f 20 61 76 61 69 6c 61  ons, also availa
8fe0: 62 6c 65 20 61 72 65 20 74 68 65 20 73 74 72 65  ble are the stre
8ff0: 61 6d 69 6e 67 0a 2a 2a 20 76 65 72 73 69 6f 6e  aming.** version
9000: 73 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  s sqlite3changeg
9010: 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 29 20  roup_add_strm() 
9020: 61 6e 64 20 73 71 6c 69 74 65 33 63 68 61 6e 67  and sqlite3chang
9030: 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74  egroup_output_st
9040: 72 6d 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rm()..*/.int sql
9050: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
9060: 6e 65 77 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  new(sqlite3_chan
9070: 67 65 67 72 6f 75 70 20 2a 2a 70 70 29 3b 0a 0a  gegroup **pp);..
9080: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
9090: 41 64 64 20 41 20 43 68 61 6e 67 65 73 65 74 20  Add A Changeset 
90a0: 54 6f 20 41 20 43 68 61 6e 67 65 67 72 6f 75 70  To A Changegroup
90b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
90c0: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a  te3_changegroup.
90d0: 2a 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 63 68  **.** Add all ch
90e0: 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68 65  anges within the
90f0: 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72 20 70   changeset (or p
9100: 61 74 63 68 73 65 74 29 20 69 6e 20 62 75 66 66  atchset) in buff
9110: 65 72 20 70 44 61 74 61 20 28 73 69 7a 65 0a 2a  er pData (size.*
9120: 2a 20 6e 44 61 74 61 20 62 79 74 65 73 29 20 74  * nData bytes) t
9130: 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  o the changegrou
9140: 70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  p. .**.** If the
9150: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 73   buffer contains
9160: 20 61 20 70 61 74 63 68 73 65 74 2c 20 74 68 65   a patchset, the
9170: 6e 20 61 6c 6c 20 70 72 69 6f 72 20 63 61 6c 6c  n all prior call
9180: 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  s to this functi
9190: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  on.** on the sam
91a0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  e changegroup ob
91b0: 6a 65 63 74 20 6d 75 73 74 20 61 6c 73 6f 20 68  ject must also h
91c0: 61 76 65 20 73 70 65 63 69 66 69 65 64 20 70 61  ave specified pa
91d0: 74 63 68 73 65 74 73 2e 20 4f 72 2c 20 69 66 0a  tchsets. Or, if.
91e0: 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  ** the buffer co
91f0: 6e 74 61 69 6e 73 20 61 20 63 68 61 6e 67 65 73  ntains a changes
9200: 65 74 2c 20 73 6f 20 6d 75 73 74 20 68 61 76 65  et, so must have
9210: 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c   the earlier cal
9220: 6c 73 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75  ls to this.** fu
9230: 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
9240: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  e, SQLITE_ERROR 
9250: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
9260: 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 61  no changes are a
9270: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  dded.** to the c
9280: 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  hangegroup..**.*
9290: 2a 20 52 6f 77 73 20 77 69 74 68 69 6e 20 74 68  * Rows within th
92a0: 65 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20  e changeset and 
92b0: 63 68 61 6e 67 65 67 72 6f 75 70 20 61 72 65 20  changegroup are 
92c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
92d0: 65 20 76 61 6c 75 65 73 20 69 6e 0a 2a 2a 20 74  e values in.** t
92e0: 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b 45 59  heir PRIMARY KEY
92f0: 20 63 6f 6c 75 6d 6e 73 2e 20 41 20 63 68 61 6e   columns. A chan
9300: 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ge in the change
9310: 73 65 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65  set is considere
9320: 64 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 74 6f  d to.** apply to
9330: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73   the same row as
9340: 20 61 20 63 68 61 6e 67 65 20 61 6c 72 65 61 64   a change alread
9350: 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  y present in the
9360: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 69 66 0a   changegroup if.
9370: 2a 2a 20 74 68 65 20 74 77 6f 20 72 6f 77 73 20  ** the two rows 
9380: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 70 72  have the same pr
9390: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
93a0: 20 43 68 61 6e 67 65 73 20 74 6f 20 72 6f 77 73   Changes to rows
93b0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 6c 72   that do not alr
93c0: 65 61 64 79 20 61 70 70 65 61 72 20 69 6e 20 74  eady appear in t
93d0: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 61  he changegroup a
93e0: 72 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 63 6f 70  re.** simply cop
93f0: 69 65 64 20 69 6e 74 6f 20 69 74 2e 20 4f 72 2c  ied into it. Or,
9400: 20 69 66 20 62 6f 74 68 20 74 68 65 20 6e 65 77   if both the new
9410: 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20 74   changeset and t
9420: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a  he changegroup.*
9430: 2a 20 63 6f 6e 74 61 69 6e 20 63 68 61 6e 67 65  * contain change
9440: 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
9450: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
9460: 65 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 73  e final contents
9470: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67   of the.** chang
9480: 65 67 72 6f 75 70 20 64 65 70 65 6e 64 73 20 6f  egroup depends o
9490: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 65 61  n the type of ea
94a0: 63 68 20 63 68 61 6e 67 65 2c 20 61 73 20 66 6f  ch change, as fo
94b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 74 61  llows:.**.** <ta
94c0: 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73 74 79  ble border=1 sty
94d0: 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a  le="margin-left:
94e0: 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74  8ex;margin-right
94f0: 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74 72 3e  :8ex">.**   <tr>
9500: 3c 74 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65  <th style="white
9510: 2d 73 70 61 63 65 3a 70 72 65 22 3e 45 78 69 73  -space:pre">Exis
9520: 74 69 6e 67 20 43 68 61 6e 67 65 20 20 3c 2f 74  ting Change  </t
9530: 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68 20  h>.**       <th 
9540: 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61  style="white-spa
9550: 63 65 3a 70 72 65 22 3e 4e 65 77 20 43 68 61 6e  ce:pre">New Chan
9560: 67 65 20 20 20 20 20 20 20 3c 2f 74 68 3e 0a 2a  ge       </th>.*
9570: 2a 20 20 20 20 20 20 20 3c 74 68 3e 4f 75 74 70  *       <th>Outp
9580: 75 74 20 43 68 61 6e 67 65 0a 2a 2a 20 20 20 3c  ut Change.**   <
9590: 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  tr><td>INSERT <t
95a0: 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a  d>INSERT <td>.**
95b0: 20 20 20 20 20 20 20 54 68 65 20 6e 65 77 20 63         The new c
95c0: 68 61 6e 67 65 20 69 73 20 69 67 6e 6f 72 65 64  hange is ignored
95d0: 2e 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73  . This case does
95e0: 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20 74 68   not occur if th
95f0: 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 63  e new.**       c
9600: 68 61 6e 67 65 73 65 74 20 77 61 73 20 72 65 63  hangeset was rec
9610: 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  orded immediatel
9620: 79 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  y after the chan
9630: 67 65 73 65 74 73 20 61 6c 72 65 61 64 79 0a 2a  gesets already.*
9640: 2a 20 20 20 20 20 20 20 61 64 64 65 64 20 74 6f  *       added to
9650: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
9660: 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49  ..**   <tr><td>I
9670: 4e 53 45 52 54 20 3c 74 64 3e 55 50 44 41 54 45  NSERT <td>UPDATE
9680: 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54   <td>.**       T
9690: 68 65 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65  he INSERT change
96a0: 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
96b0: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54 68 65  changegroup. The
96c0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 0a   values in the .
96d0: 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  **       INSERT 
96e0: 63 68 61 6e 67 65 20 61 72 65 20 6d 6f 64 69 66  change are modif
96f0: 69 65 64 20 61 73 20 69 66 20 74 68 65 20 72 6f  ied as if the ro
9700: 77 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 62  w was inserted b
9710: 79 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65  y the.**       e
9720: 78 69 73 74 69 6e 67 20 63 68 61 6e 67 65 20 61  xisting change a
9730: 6e 64 20 74 68 65 6e 20 75 70 64 61 74 65 64 20  nd then updated 
9740: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
9750: 20 6e 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20   new change..** 
9760: 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54    <tr><td>INSERT
9770: 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e   <td>DELETE <td>
9780: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78  .**       The ex
9790: 69 73 74 69 6e 67 20 49 4e 53 45 52 54 20 69 73  isting INSERT is
97a0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
97b0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54  e changegroup. T
97c0: 68 65 20 44 45 4c 45 54 45 20 69 73 0a 2a 2a 20  he DELETE is.** 
97d0: 20 20 20 20 20 20 6e 6f 74 20 61 64 64 65 64 2e        not added.
97e0: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50  .**   <tr><td>UP
97f0: 44 41 54 45 20 3c 74 64 3e 49 4e 53 45 52 54 20  DATE <td>INSERT 
9800: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68  <td>.**       Th
9810: 65 20 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20  e new change is 
9820: 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61  ignored. This ca
9830: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  se does not occu
9840: 72 20 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r if the new.** 
9850: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20        changeset 
9860: 77 61 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d  was recorded imm
9870: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
9880: 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c  he changesets al
9890: 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61  ready.**       a
98a0: 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e  dded to the chan
98b0: 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74  gegroup..**   <t
98c0: 72 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64  r><td>UPDATE <td
98d0: 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20  >UPDATE <td>.** 
98e0: 20 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69        The existi
98f0: 6e 67 20 55 50 44 41 54 45 20 72 65 6d 61 69 6e  ng UPDATE remain
9900: 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 61  s within the cha
9910: 6e 67 65 67 72 6f 75 70 2e 20 49 74 20 69 73 20  ngegroup. It is 
9920: 61 6d 65 6e 64 65 64 20 0a 2a 2a 20 20 20 20 20  amended .**     
9930: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 63    so that the ac
9940: 63 6f 6d 70 61 6e 79 69 6e 67 20 76 61 6c 75 65  companying value
9950: 73 20 61 72 65 20 61 73 20 69 66 20 74 68 65 20  s are as if the 
9960: 72 6f 77 20 77 61 73 20 75 70 64 61 74 65 64 20  row was updated 
9970: 6f 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 62  once .**       b
9980: 79 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  y the existing c
9990: 68 61 6e 67 65 20 61 6e 64 20 74 68 65 6e 20 61  hange and then a
99a0: 67 61 69 6e 20 62 79 20 74 68 65 20 6e 65 77 20  gain by the new 
99b0: 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 3c 74 72  change..**   <tr
99c0: 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e  ><td>UPDATE <td>
99d0: 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20  DELETE <td>.**  
99e0: 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69 6e       The existin
99f0: 67 20 55 50 44 41 54 45 20 69 73 20 72 65 70 6c  g UPDATE is repl
9a00: 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  aced by the new 
9a10: 44 45 4c 45 54 45 20 77 69 74 68 69 6e 20 74 68  DELETE within th
9a20: 65 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67  e.**       chang
9a30: 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72  egroup..**   <tr
9a40: 3e 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e  ><td>DELETE <td>
9a50: 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20  INSERT <td>.**  
9a60: 20 20 20 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d       If one or m
9a70: 6f 72 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ore of the colum
9a80: 6e 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  n values in the 
9a90: 72 6f 77 20 69 6e 73 65 72 74 65 64 20 62 79 20  row inserted by 
9aa0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77  the.**       new
9ab0: 20 63 68 61 6e 67 65 20 64 69 66 66 65 72 20 66   change differ f
9ac0: 72 6f 6d 20 74 68 6f 73 65 20 69 6e 20 74 68 65  rom those in the
9ad0: 20 72 6f 77 20 64 65 6c 65 74 65 64 20 62 79 20   row deleted by 
9ae0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 0a 2a 2a  the existing .**
9af0: 20 20 20 20 20 20 20 63 68 61 6e 67 65 2c 20 74         change, t
9b00: 68 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45  he existing DELE
9b10: 54 45 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  TE is replaced b
9b20: 79 20 61 6e 20 55 50 44 41 54 45 20 77 69 74 68  y an UPDATE with
9b30: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
9b40: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 4f 74 68  changegroup. Oth
9b50: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
9b60: 6e 73 65 72 74 65 64 20 72 6f 77 20 69 73 20 65  nserted row is e
9b70: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
9b80: 0a 2a 2a 20 20 20 20 20 20 20 61 73 20 74 68 65  .**       as the
9b90: 20 64 65 6c 65 74 65 64 20 72 6f 77 2c 20 74 68   deleted row, th
9ba0: 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45 54  e existing DELET
9bb0: 45 20 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63  E is simply disc
9bc0: 61 72 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e  arded..**   <tr>
9bd0: 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 55  <td>DELETE <td>U
9be0: 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  PDATE <td>.**   
9bf0: 20 20 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e      The new chan
9c00: 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54  ge is ignored. T
9c10: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
9c20: 74 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e  t occur if the n
9c30: 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e  ew.**       chan
9c40: 67 65 73 65 74 20 77 61 73 20 72 65 63 6f 72 64  geset was record
9c50: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
9c60: 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 73  fter the changes
9c70: 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ets already.**  
9c80: 20 20 20 20 20 61 64 64 65 64 20 74 6f 20 74 68       added to th
9c90: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a  e changegroup..*
9ca0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45  *   <tr><td>DELE
9cb0: 54 45 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74  TE <td>DELETE <t
9cc0: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
9cd0: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
9ce0: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
9cf0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
9d00: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
9d10: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
9d20: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
9d30: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
9d40: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
9d50: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
9d60: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
9d70: 67 72 6f 75 70 2e 0a 2a 2a 20 3c 2f 74 61 62 6c  group..** </tabl
9d80: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
9d90: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20 63 6f  new changeset co
9da0: 6e 74 61 69 6e 73 20 63 68 61 6e 67 65 73 20 74  ntains changes t
9db0: 6f 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  o a table that i
9dc0: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
9dd0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 68 61 6e  t.** in the chan
9de0: 67 65 67 72 6f 75 70 2c 20 74 68 65 6e 20 74 68  gegroup, then th
9df0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9e00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 70 6f 73 69  mns and the posi
9e10: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 70  tion of the.** p
9e20: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
9e30: 6e 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ns for the table
9e40: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 69 73 74   must be consist
9e50: 65 6e 74 2e 20 49 66 20 74 68 69 73 20 69 73 20  ent. If this is 
9e60: 6e 6f 74 20 74 68 65 0a 2a 2a 20 63 61 73 65 2c  not the.** case,
9e70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9e80: 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
9e90: 5f 53 43 48 45 4d 41 2e 20 49 66 20 74 68 65 20  _SCHEMA. If the 
9ea0: 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 0a  input changeset.
9eb0: 2a 2a 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ** appears to be
9ec0: 20 63 6f 72 72 75 70 74 20 61 6e 64 20 74 68 65   corrupt and the
9ed0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
9ee0: 65 74 65 63 74 65 64 2c 20 53 51 4c 49 54 45 5f  etected, SQLITE_
9ef0: 43 4f 52 52 55 50 54 20 69 73 0a 2a 2a 20 72 65  CORRUPT is.** re
9f00: 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61  turned. Or, if a
9f10: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
9f20: 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
9f30: 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69   during processi
9f40: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  ng, this.** func
9f50: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
9f60: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 61 6c  ITE_NOMEM. In al
9f70: 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20 65  l cases, if an e
9f80: 72 72 6f 72 20 6f 63 63 75 72 73 20 74 68 65 0a  rror occurs the.
9f90: 2a 2a 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  ** final content
9fa0: 73 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67  s of the changeg
9fb0: 72 6f 75 70 20 69 73 20 75 6e 64 65 66 69 6e 65  roup is undefine
9fc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  d..**.** If no e
9fd0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
9fe0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
9ff0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
a000: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
a010: 64 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  d(sqlite3_change
a020: 67 72 6f 75 70 2a 2c 20 69 6e 74 20 6e 44 61 74  group*, int nDat
a030: 61 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 3b  a, void *pData);
a040: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
a050: 3a 20 4f 62 74 61 69 6e 20 41 20 43 6f 6d 70 6f  : Obtain A Compo
a060: 73 69 74 65 20 43 68 61 6e 67 65 73 65 74 20 46  site Changeset F
a070: 72 6f 6d 20 41 20 43 68 61 6e 67 65 67 72 6f 75  rom A Changegrou
a080: 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  p.** METHOD: sql
a090: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
a0a0: 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  .**.** Obtain a 
a0b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
a0c0: 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 6f  g a changeset (o
a0d0: 72 20 70 61 74 63 68 73 65 74 29 20 72 65 70 72  r patchset) repr
a0e0: 65 73 65 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20  esenting the.** 
a0f0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
a100: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67 72   of the changegr
a110: 6f 75 70 2e 20 49 66 20 74 68 65 20 69 6e 70 75  oup. If the inpu
a120: 74 73 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ts to the change
a130: 67 72 6f 75 70 0a 2a 2a 20 77 65 72 65 20 74 68  group.** were th
a140: 65 6d 73 65 6c 76 65 73 20 63 68 61 6e 67 65 73  emselves changes
a150: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a160: 69 73 20 61 20 63 68 61 6e 67 65 73 65 74 2e 20  is a changeset. 
a170: 4f 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 69 6e  Or, if the.** in
a180: 70 75 74 73 20 77 65 72 65 20 70 61 74 63 68 73  puts were patchs
a190: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a1a0: 69 73 20 61 6c 73 6f 20 61 20 70 61 74 63 68 73  is also a patchs
a1b0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 69 74  et..**.** As wit
a1c0: 68 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  h the output of 
a1d0: 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
a1e0: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 61  on_changeset() a
a1f0: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 73 65 73  nd.** sqlite3ses
a200: 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 29 20  sion_patchset() 
a210: 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63  functions, all c
a220: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
a230: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 74 61  o a single.** ta
a240: 62 6c 65 20 61 72 65 20 67 72 6f 75 70 65 64 20  ble are grouped 
a250: 74 6f 67 65 74 68 65 72 20 69 6e 20 74 68 65 20  together in the 
a260: 6f 75 74 70 75 74 20 6f 66 20 74 68 69 73 20 66  output of this f
a270: 75 6e 63 74 69 6f 6e 2e 20 54 61 62 6c 65 73 20  unction. Tables 
a280: 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 74 68 65  appear.** in the
a290: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 66   same order as f
a2a0: 6f 72 20 74 68 65 20 76 65 72 79 20 66 69 72 73  or the very firs
a2b0: 74 20 63 68 61 6e 67 65 73 65 74 20 61 64 64 65  t changeset adde
a2c0: 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  d to the changeg
a2d0: 72 6f 75 70 2e 0a 2a 2a 20 49 66 20 74 68 65 20  roup..** If the 
a2e0: 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
a2f0: 75 65 6e 74 20 63 68 61 6e 67 65 73 65 74 73 20  uent changesets 
a300: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
a310: 6e 67 65 67 72 6f 75 70 20 63 6f 6e 74 61 69 6e  ngegroup contain
a320: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 66 6f 72 20  .** changes for 
a330: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
a340: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
a350: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74   first changeset
a360: 2c 20 74 68 65 79 20 61 72 65 0a 2a 2a 20 61 70  , they are.** ap
a370: 70 65 6e 64 65 64 20 6f 6e 74 6f 20 74 68 65 20  pended onto the 
a380: 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 70 75  end of the outpu
a390: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 67 61  t changeset, aga
a3a0: 69 6e 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  in in the order 
a3b0: 69 6e 0a 2a 2a 20 77 68 69 63 68 20 74 68 65 79  in.** which they
a3c0: 20 61 72 65 20 66 69 72 73 74 20 65 6e 63 6f 75   are first encou
a3d0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
a3e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a3f0: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
a400: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a410: 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
a420: 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 28  t.** variables (
a430: 2a 70 6e 44 61 74 61 29 20 61 6e 64 20 28 2a 70  *pnData) and (*p
a440: 70 44 61 74 61 29 20 61 72 65 20 73 65 74 20 74  pData) are set t
a450: 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
a460: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
a470: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
a480: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
a490: 73 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65  s are set to the
a4a0: 20 73 69 7a 65 20 6f 66 20 61 6e 64 20 61 20 0a   size of and a .
a4b0: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
a4c0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  e output buffer,
a4d0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 49   respectively. I
a4e0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
a4f0: 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
a500: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
a510: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
a520: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 62 75 66  lly free the buf
a530: 66 65 72 20 75 73 69 6e 67 20 61 0a 2a 2a 20 63  fer using a.** c
a540: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  all to sqlite3_f
a550: 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
a560: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a570: 5f 6f 75 74 70 75 74 28 0a 20 20 73 71 6c 69 74  _output(.  sqlit
a580: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c  e3_changegroup*,
a590: 0a 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 2c 20  .  int *pnData, 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
a5c0: 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
a5d0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76   in bytes */.  v
a5e0: 6f 69 64 20 2a 2a 70 70 44 61 74 61 20 20 20 20  oid **ppData    
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
a610: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
a620: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  */.);../*.** CAP
a630: 49 33 52 45 46 3a 20 44 65 6c 65 74 65 20 41 20  I3REF: Delete A 
a640: 43 68 61 6e 67 65 67 72 6f 75 70 20 4f 62 6a 65  Changegroup Obje
a650: 63 74 0a 2a 2a 20 44 45 53 54 52 55 43 54 4f 52  ct.** DESTRUCTOR
a660: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
a670: 67 72 6f 75 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  group.*/.void sq
a680: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a690: 5f 64 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  _delete(sqlite3_
a6a0: 63 68 61 6e 67 65 67 72 6f 75 70 2a 29 3b 0a 0a  changegroup*);..
a6b0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
a6c0: 41 70 70 6c 79 20 41 20 43 68 61 6e 67 65 73 65  Apply A Changese
a6d0: 74 20 54 6f 20 41 20 44 61 74 61 62 61 73 65 0a  t To A Database.
a6e0: 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 63 68  **.** Apply a ch
a6f0: 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
a700: 73 65 74 20 74 6f 20 61 20 64 61 74 61 62 61 73  set to a databas
a710: 65 2e 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f  e. These functio
a720: 6e 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ns attempt to.**
a730: 20 75 70 64 61 74 65 20 74 68 65 20 22 6d 61 69   update the "mai
a740: 6e 22 20 64 61 74 61 62 61 73 65 20 61 74 74 61  n" database atta
a750: 63 68 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 64  ched to handle d
a760: 62 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 67  b with the chang
a770: 65 73 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 74  es found in.** t
a780: 68 65 20 63 68 61 6e 67 65 73 65 74 20 70 61 73  he changeset pas
a790: 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
a7a0: 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
a7b0: 75 6d 65 6e 74 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  uments. .**.** T
a7c0: 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
a7d0: 6e 74 20 28 78 46 69 6c 74 65 72 29 20 70 61 73  nt (xFilter) pas
a7e0: 73 65 64 20 74 6f 20 74 68 65 73 65 20 66 75 6e  sed to these fun
a7f0: 63 74 69 6f 6e 73 20 69 73 20 74 68 65 20 22 66  ctions is the "f
a800: 69 6c 74 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ilter.** callbac
a810: 6b 22 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  k". If it is not
a820: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 6f 72 20   NULL, then for 
a830: 65 61 63 68 20 74 61 62 6c 65 20 61 66 66 65 63  each table affec
a840: 74 65 64 20 62 79 20 61 74 20 6c 65 61 73 74 20  ted by at least 
a850: 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67 65 20 69 6e  one.** change in
a860: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
a870: 74 68 65 20 66 69 6c 74 65 72 20 63 61 6c 6c 62  the filter callb
a880: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ack is invoked w
a890: 69 74 68 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ith.** the table
a8a0: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 73 65 63   name as the sec
a8b0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e  ond argument, an
a8c0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
a8d0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 0a  context pointer.
a8e0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
a8f0: 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74 20   sixth argument 
a900: 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 49 66  as the first. If
a910: 20 74 68 65 20 22 66 69 6c 74 65 72 20 63 61 6c   the "filter cal
a920: 6c 62 61 63 6b 22 0a 2a 2a 20 72 65 74 75 72 6e  lback".** return
a930: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6e 6f 20  s zero, then no 
a940: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
a950: 74 6f 20 61 70 70 6c 79 20 61 6e 79 20 63 68 61  to apply any cha
a960: 6e 67 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nges to the tabl
a970: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
a980: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   if the return v
a990: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
a9a0: 20 6f 72 20 74 68 65 20 78 46 69 6c 74 65 72 20   or the xFilter 
a9b0: 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 69  argument to.** i
a9c0: 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 63 68 61 6e  s NULL, all chan
a9d0: 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ges related to t
a9e0: 68 65 20 74 61 62 6c 65 20 61 72 65 20 61 74 74  he table are att
a9f0: 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  empted..**.** Fo
aa00: 72 20 65 61 63 68 20 74 61 62 6c 65 20 74 68 61  r each table tha
aa10: 74 20 69 73 20 6e 6f 74 20 65 78 63 6c 75 64 65  t is not exclude
aa20: 64 20 62 79 20 74 68 65 20 66 69 6c 74 65 72 20  d by the filter 
aa30: 63 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 20 66  callback, this f
aa40: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 74 65 73 74  unction .** test
aa50: 73 20 74 68 61 74 20 74 68 65 20 74 61 72 67 65  s that the targe
aa60: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  t database conta
aa70: 69 6e 73 20 61 20 63 6f 6d 70 61 74 69 62 6c 65  ins a compatible
aa80: 20 74 61 62 6c 65 2e 20 41 20 74 61 62 6c 65 20   table. A table 
aa90: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
aaa0: 64 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 66 20  d compatible if 
aab0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
aac0: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
aad0: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
aae0: 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61  li> The table ha
aaf0: 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
ab00: 61 73 20 74 68 65 20 6e 61 6d 65 20 72 65 63 6f  as the name reco
ab10: 72 64 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20  rded in the .** 
ab20: 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74         changeset
ab30: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
ab40: 54 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 74  The table has at
ab50: 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
ab60: 6f 6c 75 6d 6e 73 20 61 73 20 72 65 63 6f 72 64  olumns as record
ab70: 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20  ed in the .**   
ab80: 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 2c 20       changeset, 
ab90: 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68  and.**   <li> Th
aba0: 65 20 74 61 62 6c 65 20 68 61 73 20 70 72 69 6d  e table has prim
abb0: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
abc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 6f 73 69  in the same posi
abd0: 74 69 6f 6e 20 61 73 20 0a 2a 2a 20 20 20 20 20  tion as .**     
abe0: 20 20 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74     recorded in t
abf0: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a  he changeset..**
ac00: 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 49 66 20   </ul>.**.** If 
ac10: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  there is no comp
ac20: 61 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 69 74  atible table, it
ac30: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
ac40: 2c 20 62 75 74 20 6e 6f 6e 65 20 6f 66 20 74 68  , but none of th
ac50: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 61 73 73  e.** changes ass
ac60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ac70: 20 74 61 62 6c 65 20 61 72 65 20 61 70 70 6c 69   table are appli
ac80: 65 64 2e 20 41 20 77 61 72 6e 69 6e 67 20 6d 65  ed. A warning me
ac90: 73 73 61 67 65 20 69 73 20 69 73 73 75 65 64 0a  ssage is issued.
aca0: 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
acb0: 65 33 5f 6c 6f 67 28 29 20 6d 65 63 68 61 6e 69  e3_log() mechani
acc0: 73 6d 20 77 69 74 68 20 74 68 65 20 65 72 72 6f  sm with the erro
acd0: 72 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 53 43  r code SQLITE_SC
ace0: 48 45 4d 41 2e 20 41 74 20 6d 6f 73 74 0a 2a 2a  HEMA. At most.**
acf0: 20 6f 6e 65 20 73 75 63 68 20 77 61 72 6e 69 6e   one such warnin
ad00: 67 20 69 73 20 69 73 73 75 65 64 20 66 6f 72 20  g is issued for 
ad10: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
ad20: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  e changeset..**.
ad30: 2a 2a 20 46 6f 72 20 65 61 63 68 20 63 68 61 6e  ** For each chan
ad40: 67 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ge for which the
ad50: 72 65 20 69 73 20 61 20 63 6f 6d 70 61 74 69 62  re is a compatib
ad60: 6c 65 20 74 61 62 6c 65 2c 20 61 6e 20 61 74 74  le table, an att
ad70: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a  empt is made .**
ad80: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
ad90: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 20 61 63  able contents ac
ada0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 55  cording to the U
adb0: 50 44 41 54 45 2c 20 49 4e 53 45 52 54 20 6f 72  PDATE, INSERT or
adc0: 20 44 45 4c 45 54 45 20 0a 2a 2a 20 63 68 61 6e   DELETE .** chan
add0: 67 65 2e 20 49 66 20 61 20 63 68 61 6e 67 65 20  ge. If a change 
ade0: 63 61 6e 6e 6f 74 20 62 65 20 61 70 70 6c 69 65  cannot be applie
adf0: 64 20 63 6c 65 61 6e 6c 79 2c 20 74 68 65 20 63  d cleanly, the c
ae00: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
ae10: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 73  .** function pas
ae20: 73 65 64 20 61 73 20 74 68 65 20 66 69 66 74 68  sed as the fifth
ae30: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
ae40: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
ae50: 70 6c 79 28 29 20 6d 61 79 20 62 65 20 0a 2a 2a  ply() may be .**
ae60: 20 69 6e 76 6f 6b 65 64 2e 20 41 20 64 65 73 63   invoked. A desc
ae70: 72 69 70 74 69 6f 6e 20 6f 66 20 65 78 61 63 74  ription of exact
ae80: 6c 79 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 66  ly when the conf
ae90: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20  lict handler is 
aea0: 69 6e 76 6f 6b 65 64 20 66 6f 72 20 0a 2a 2a 20  invoked for .** 
aeb0: 65 61 63 68 20 74 79 70 65 20 6f 66 20 63 68 61  each type of cha
aec0: 6e 67 65 20 69 73 20 62 65 6c 6f 77 2e 0a 2a 2a  nge is below..**
aed0: 0a 2a 2a 20 55 6e 6c 69 6b 65 20 74 68 65 20 78  .** Unlike the x
aee0: 46 69 6c 74 65 72 20 61 72 67 75 6d 65 6e 74 2c  Filter argument,
aef0: 20 78 43 6f 6e 66 6c 69 63 74 20 6d 61 79 20 6e   xConflict may n
af00: 6f 74 20 62 65 20 70 61 73 73 65 64 20 4e 55 4c  ot be passed NUL
af10: 4c 2e 20 54 68 65 20 72 65 73 75 6c 74 73 0a 2a  L. The results.*
af20: 2a 20 6f 66 20 70 61 73 73 69 6e 67 20 61 6e 79  * of passing any
af30: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
af40: 20 61 20 76 61 6c 69 64 20 66 75 6e 63 74 69 6f   a valid functio
af50: 6e 20 70 6f 69 6e 74 65 72 20 61 73 20 74 68 65  n pointer as the
af60: 20 78 43 6f 6e 66 6c 69 63 74 0a 2a 2a 20 61 72   xConflict.** ar
af70: 67 75 6d 65 6e 74 20 61 72 65 20 75 6e 64 65 66  gument are undef
af80: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  ined..**.** Each
af90: 20 74 69 6d 65 20 74 68 65 20 63 6f 6e 66 6c 69   time the confli
afa0: 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct handler funct
afb0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ion is invoked, 
afc0: 69 74 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6f  it must return o
afd0: 6e 65 0a 2a 2a 20 6f 66 20 5b 53 51 4c 49 54 45  ne.** of [SQLITE
afe0: 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 5d  _CHANGESET_OMIT]
aff0: 2c 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  , [SQLITE_CHANGE
b000: 53 45 54 5f 41 42 4f 52 54 5d 20 6f 72 20 0a 2a  SET_ABORT] or .*
b010: 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  * [SQLITE_CHANGE
b020: 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e 20 53 51  SET_REPLACE]. SQ
b030: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
b040: 45 50 4c 41 43 45 20 6d 61 79 20 6f 6e 6c 79 20  EPLACE may only 
b050: 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  be returned.** i
b060: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b070: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
b080: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
b090: 64 6c 65 72 20 69 73 20 65 69 74 68 65 72 0a 2a  dler is either.*
b0a0: 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  * SQLITE_CHANGES
b0b0: 45 54 5f 44 41 54 41 20 6f 72 20 53 51 4c 49 54  ET_DATA or SQLIT
b0c0: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
b0d0: 4c 49 43 54 2e 20 49 66 20 74 68 65 20 63 6f 6e  LICT. If the con
b0e0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 0a 2a 2a  flict-handler.**
b0f0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6c 6c 65   returns an ille
b100: 67 61 6c 20 76 61 6c 75 65 2c 20 61 6e 79 20 63  gal value, any c
b110: 68 61 6e 67 65 73 20 61 6c 72 65 61 64 79 20 6d  hanges already m
b120: 61 64 65 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ade are rolled b
b130: 61 63 6b 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ack and.** the c
b140: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68  all to sqlite3ch
b150: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
b160: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d  returns SQLITE_M
b170: 49 53 55 53 45 2e 20 44 69 66 66 65 72 65 6e 74  ISUSE. Different
b180: 20 0a 2a 2a 20 61 63 74 69 6f 6e 73 20 61 72 65   .** actions are
b190: 20 74 61 6b 65 6e 20 62 79 20 73 71 6c 69 74 65   taken by sqlite
b1a0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
b1b0: 28 29 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  () depending on 
b1c0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
b1d0: 75 72 6e 65 64 20 62 79 20 65 61 63 68 20 69 6e  urned by each in
b1e0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  vocation of the 
b1f0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
b200: 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 66 65 72   function. Refer
b210: 20 74 6f 0a 2a 2a 20 74 68 65 20 64 6f 63 75 6d   to.** the docum
b220: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
b230: 20 74 68 72 65 65 20 0a 2a 2a 20 5b 53 51 4c 49   three .** [SQLI
b240: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
b250: 54 7c 61 76 61 69 6c 61 62 6c 65 20 72 65 74 75  T|available retu
b260: 72 6e 20 76 61 6c 75 65 73 5d 20 66 6f 72 20 64  rn values] for d
b270: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 3c 64  etails..**.** <d
b280: 6c 3e 0a 2a 2a 20 3c 64 74 3e 44 45 4c 45 54 45  l>.** <dt>DELETE
b290: 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20   Changes<dd>.** 
b2a0: 20 20 46 6f 72 20 65 61 63 68 20 44 45 4c 45 54    For each DELET
b2b0: 45 20 63 68 61 6e 67 65 2c 20 74 68 65 20 66 75  E change, the fu
b2c0: 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
b2d0: 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
b2e0: 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f 6e 74 61  base .**   conta
b2f0: 69 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20 74  ins a row with t
b300: 68 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20  he same primary 
b310: 6b 65 79 20 76 61 6c 75 65 20 28 6f 72 20 76 61  key value (or va
b320: 6c 75 65 73 29 20 61 73 20 74 68 65 20 0a 2a 2a  lues) as the .**
b330: 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20     original row 
b340: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
b350: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
b360: 49 66 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 20  If it does, and 
b370: 74 68 65 20 76 61 6c 75 65 73 20 0a 2a 2a 20 20  the values .**  
b380: 20 73 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20 6e   stored in all n
b390: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 63  on-primary key c
b3a0: 6f 6c 75 6d 6e 73 20 61 6c 73 6f 20 6d 61 74 63  olumns also matc
b3b0: 68 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  h the values sto
b3c0: 72 65 64 20 69 6e 20 0a 2a 2a 20 20 20 74 68 65  red in .**   the
b3d0: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20 72   changeset the r
b3e0: 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ow is deleted fr
b3f0: 6f 6d 20 74 68 65 20 74 61 72 67 65 74 20 64 61  om the target da
b400: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
b410: 49 66 20 61 20 72 6f 77 20 77 69 74 68 20 6d 61  If a row with ma
b420: 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  tching primary k
b430: 65 79 20 76 61 6c 75 65 73 20 69 73 20 66 6f 75  ey values is fou
b440: 6e 64 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20 6d  nd, but one or m
b450: 6f 72 65 20 6f 66 0a 2a 2a 20 20 20 74 68 65 20  ore of.**   the 
b460: 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20  non-primary key 
b470: 66 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 73 20  fields contains 
b480: 61 20 76 61 6c 75 65 20 64 69 66 66 65 72 65 6e  a value differen
b490: 74 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  t from the origi
b4a0: 6e 61 6c 0a 2a 2a 20 20 20 72 6f 77 20 76 61 6c  nal.**   row val
b4b0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
b4c0: 20 63 68 61 6e 67 65 73 65 74 2c 20 74 68 65 20   changeset, the 
b4d0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
b4e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
b4f0: 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b    invoked with [
b500: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
b510: 5f 44 41 54 41 5d 20 61 73 20 74 68 65 20 73 65  _DATA] as the se
b520: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
b530: 66 20 74 68 65 0a 2a 2a 20 20 20 64 61 74 61 62  f the.**   datab
b540: 61 73 65 20 74 61 62 6c 65 20 68 61 73 20 6d 6f  ase table has mo
b550: 72 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20  re columns than 
b560: 61 72 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20  are recorded in 
b570: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 0a 2a  the changeset,.*
b580: 2a 20 20 20 6f 6e 6c 79 20 74 68 65 20 76 61 6c  *   only the val
b590: 75 65 73 20 6f 66 20 74 68 6f 73 65 20 6e 6f 6e  ues of those non
b5a0: 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66 69 65  -primary key fie
b5b0: 6c 64 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  lds are compared
b5c0: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 20 20 74 68   against.**   th
b5d0: 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
b5e0: 73 65 20 63 6f 6e 74 65 6e 74 73 20 2d 20 61 6e  se contents - an
b5f0: 79 20 74 72 61 69 6c 69 6e 67 20 64 61 74 61 62  y trailing datab
b600: 61 73 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ase table column
b610: 73 0a 2a 2a 20 20 20 61 72 65 20 69 67 6e 6f 72  s.**   are ignor
b620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e  ed..**.**   If n
b630: 6f 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68  o row with match
b640: 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ing primary key 
b650: 76 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 20  values is found 
b660: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
b670: 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69  .**   the confli
b680: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
b690: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
b6a0: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
b6b0: 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a  GESET_NOTFOUND].
b6c0: 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73 20 74  **   passed as t
b6d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b6e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74  nt..**.**   If t
b6f0: 68 65 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  he DELETE operat
b700: 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64  ion is attempted
b710: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 72 65 74  , but SQLite ret
b720: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53  urns SQLITE_CONS
b730: 54 52 41 49 4e 54 0a 2a 2a 20 20 20 28 77 68 69  TRAINT.**   (whi
b740: 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
b750: 65 6e 20 69 66 20 61 20 66 6f 72 65 69 67 6e 20  en if a foreign 
b760: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
b770: 73 20 76 69 6f 6c 61 74 65 64 29 2c 20 74 68 65  s violated), the
b780: 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69 63 74 2d 68  .**   conflict-h
b790: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
b7a0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
b7b0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
b7c0: 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 0a 2a 2a  T_CONSTRAINT].**
b7d0: 20 20 20 70 61 73 73 65 64 20 61 73 20 74 68 65     passed as the
b7e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b7f0: 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20  . This includes 
b800: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74  the case where t
b810: 68 65 20 44 45 4c 45 54 45 0a 2a 2a 20 20 20 6f  he DELETE.**   o
b820: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65  peration is atte
b830: 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 61 6e  mpted because an
b840: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
b850: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   the conflict ha
b860: 6e 64 6c 65 72 0a 2a 2a 20 20 20 66 75 6e 63 74  ndler.**   funct
b870: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 5b 53 51  ion returned [SQ
b880: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
b890: 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a 2a 2a 20 3c  EPLACE]..**.** <
b8a0: 64 74 3e 49 4e 53 45 52 54 20 43 68 61 6e 67 65  dt>INSERT Change
b8b0: 73 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f 72 20 65  s<dd>.**   For e
b8c0: 61 63 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67  ach INSERT chang
b8d0: 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
b8e0: 20 6d 61 64 65 20 74 6f 20 69 6e 73 65 72 74 20   made to insert 
b8f0: 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  the new row into
b900: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
b910: 73 65 2e 20 49 66 20 74 68 65 20 63 68 61 6e 67  se. If the chang
b920: 65 73 65 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e  eset row contain
b930: 73 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 74  s fewer fields t
b940: 68 61 6e 20 74 68 65 0a 2a 2a 20 20 20 64 61 74  han the.**   dat
b950: 61 62 61 73 65 20 74 61 62 6c 65 2c 20 74 68 65  abase table, the
b960: 20 74 72 61 69 6c 69 6e 67 20 66 69 65 6c 64 73   trailing fields
b970: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 77   are populated w
b980: 69 74 68 20 74 68 65 69 72 20 64 65 66 61 75 6c  ith their defaul
b990: 74 0a 2a 2a 20 20 20 76 61 6c 75 65 73 2e 0a 2a  t.**   values..*
b9a0: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 61 74  *.**   If the at
b9b0: 74 65 6d 70 74 20 74 6f 20 69 6e 73 65 72 74 20  tempt to insert 
b9c0: 74 68 65 20 72 6f 77 20 66 61 69 6c 73 20 62 65  the row fails be
b9d0: 63 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61  cause the databa
b9e0: 73 65 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 20  se already .**  
b9f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20   contains a row 
ba00: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72  with the same pr
ba10: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
ba20: 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  , the conflict h
ba30: 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66 75 6e 63  andler.**   func
ba40: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
ba50: 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64 20  with the second 
ba60: 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74 6f 20  argument set to 
ba70: 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48  .**   [SQLITE_CH
ba80: 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54  ANGESET_CONFLICT
ba90: 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  ]..**.**   If th
baa0: 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6e 73  e attempt to ins
bab0: 65 72 74 20 74 68 65 20 72 6f 77 20 66 61 69 6c  ert the row fail
bac0: 73 20 62 65 63 61 75 73 65 20 6f 66 20 73 6f 6d  s because of som
bad0: 65 20 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  e other constrai
bae0: 6e 74 0a 2a 2a 20 20 20 76 69 6f 6c 61 74 69 6f  nt.**   violatio
baf0: 6e 20 28 65 2e 67 2e 20 4e 4f 54 20 4e 55 4c 4c  n (e.g. NOT NULL
bb00: 20 6f 72 20 55 4e 49 51 55 45 29 2c 20 74 68 65   or UNIQUE), the
bb10: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
bb20: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  r function is .*
bb30: 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68  *   invoked with
bb40: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
bb50: 6d 65 6e 74 20 73 65 74 20 74 6f 20 5b 53 51 4c  ment set to [SQL
bb60: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
bb70: 4e 53 54 52 41 49 4e 54 5d 2e 0a 2a 2a 20 20 20  NSTRAINT]..**   
bb80: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68  This includes th
bb90: 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  e case where the
bba0: 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
bbb0: 6e 20 69 73 20 72 65 2d 61 74 74 65 6d 70 74 65  n is re-attempte
bbc0: 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 20 20  d because .**   
bbd0: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
bbe0: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  to the conflict 
bbf0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
bc00: 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 20 20   returned .**   
bc10: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
bc20: 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a 2a  T_REPLACE]..**.*
bc30: 2a 20 3c 64 74 3e 55 50 44 41 54 45 20 43 68 61  * <dt>UPDATE Cha
bc40: 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f  nges<dd>.**   Fo
bc50: 72 20 65 61 63 68 20 55 50 44 41 54 45 20 63 68  r each UPDATE ch
bc60: 61 6e 67 65 2c 20 74 68 65 20 66 75 6e 63 74 69  ange, the functi
bc70: 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  on checks if the
bc80: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
bc90: 20 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20   .**   contains 
bca0: 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73  a row with the s
bcb0: 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ame primary key 
bcc0: 76 61 6c 75 65 20 28 6f 72 20 76 61 6c 75 65 73  value (or values
bcd0: 29 20 61 73 20 74 68 65 20 0a 2a 2a 20 20 20 6f  ) as the .**   o
bce0: 72 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75  riginal row valu
bcf0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
bd00: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 69   changeset. If i
bd10: 74 20 64 6f 65 73 2c 20 61 6e 64 20 74 68 65 20  t does, and the 
bd20: 76 61 6c 75 65 73 20 0a 2a 2a 20 20 20 73 74 6f  values .**   sto
bd30: 72 65 64 20 69 6e 20 61 6c 6c 20 6d 6f 64 69 66  red in all modif
bd40: 69 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  ied non-primary 
bd50: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f  key columns also
bd60: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
bd70: 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e  s.**   stored in
bd80: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74   the changeset t
bd90: 68 65 20 72 6f 77 20 69 73 20 75 70 64 61 74 65  he row is update
bda0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 72  d within the tar
bdb0: 67 65 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  get database..**
bdc0: 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77  .**   If a row w
bdd0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69  ith matching pri
bde0: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20  mary key values 
bdf0: 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e  is found, but on
be00: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20  e or more of.** 
be10: 20 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6e    the modified n
be20: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66  on-primary key f
be30: 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 73 20 61  ields contains a
be40: 20 76 61 6c 75 65 20 64 69 66 66 65 72 65 6e 74   value different
be50: 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 20 20 6f 72   from an.**   or
be60: 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65  iginal row value
be70: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
be80: 68 61 6e 67 65 73 65 74 2c 20 74 68 65 20 63 6f  hangeset, the co
be90: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
bea0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20  unction.**   is 
beb0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b 53 51  invoked with [SQ
bec0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
bed0: 41 54 41 5d 20 61 73 20 74 68 65 20 73 65 63 6f  ATA] as the seco
bee0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  nd argument. Sin
bef0: 63 65 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 63  ce.**   UPDATE c
bf00: 68 61 6e 67 65 73 20 6f 6e 6c 79 20 63 6f 6e 74  hanges only cont
bf10: 61 69 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 6e  ain values for n
bf20: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66  on-primary key f
bf30: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 0a 2a  ields that are.*
bf40: 2a 20 20 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  *   to be modifi
bf50: 65 64 2c 20 6f 6e 6c 79 20 74 68 6f 73 65 20 66  ed, only those f
bf60: 69 65 6c 64 73 20 6e 65 65 64 20 74 6f 20 6d 61  ields need to ma
bf70: 74 63 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  tch the original
bf80: 20 76 61 6c 75 65 73 20 74 6f 0a 2a 2a 20 20 20   values to.**   
bf90: 61 76 6f 69 64 20 74 68 65 20 53 51 4c 49 54 45  avoid the SQLITE
bfa0: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
bfb0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
bfc0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
bfd0: 20 20 20 49 66 20 6e 6f 20 72 6f 77 20 77 69 74     If no row wit
bfe0: 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d 61  h matching prima
bff0: 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69 73  ry key values is
c000: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
c010: 74 61 62 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65  tabase,.**   the
c020: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
c030: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  r function is in
c040: 76 6f 6b 65 64 20 77 69 74 68 20 5b 53 51 4c 49  voked with [SQLI
c050: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  TE_CHANGESET_NOT
c060: 46 4f 55 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73  FOUND].**   pass
c070: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
c080: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
c090: 20 20 20 49 66 20 74 68 65 20 55 50 44 41 54 45     If the UPDATE
c0a0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74   operation is at
c0b0: 74 65 6d 70 74 65 64 2c 20 62 75 74 20 53 51 4c  tempted, but SQL
c0c0: 69 74 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ite returns .** 
c0d0: 20 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41    SQLITE_CONSTRA
c0e0: 49 4e 54 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63  INT, the conflic
c0f0: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
c100: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
c110: 74 68 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45  th .**   [SQLITE
c120: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54  _CHANGESET_CONST
c130: 52 41 49 4e 54 5d 20 70 61 73 73 65 64 20 61 73  RAINT] passed as
c140: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
c150: 6d 65 6e 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20  ment..**   This 
c160: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 61 73  includes the cas
c170: 65 20 77 68 65 72 65 20 74 68 65 20 55 50 44 41  e where the UPDA
c180: 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  TE operation is 
c190: 61 74 74 65 6d 70 74 65 64 20 61 66 74 65 72 20  attempted after 
c1a0: 0a 2a 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72  .**   an earlier
c1b0: 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e   call to the con
c1c0: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75  flict handler fu
c1d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 0a  nction returned.
c1e0: 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48 41  **   [SQLITE_CHA
c1f0: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e  NGESET_REPLACE].
c200: 20 20 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2a 0a 2a    .** </dl>.**.*
c210: 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
c220: 65 78 65 63 75 74 65 20 53 51 4c 20 73 74 61 74  execute SQL stat
c230: 65 6d 65 6e 74 73 2c 20 69 6e 63 6c 75 64 69 6e  ements, includin
c240: 67 20 74 68 6f 73 65 20 74 68 61 74 20 77 72 69  g those that wri
c250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62  te to the.** tab
c260: 6c 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  le that the call
c270: 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74 6f 2c  back related to,
c280: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
c290: 20 78 43 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62   xConflict callb
c2a0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  ack..** This can
c2b0: 20 62 65 20 75 73 65 64 20 74 6f 20 66 75 72 74   be used to furt
c2c0: 68 65 72 20 63 75 73 74 6f 6d 69 7a 65 20 74 68  her customize th
c2d0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 63  e applications c
c2e0: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c  onflict.** resol
c2f0: 75 74 69 6f 6e 20 73 74 72 61 74 65 67 79 2e 0a  ution strategy..
c300: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 68 61 6e 67 65  **.** All change
c310: 73 20 6d 61 64 65 20 62 79 20 74 68 65 73 65 20  s made by these 
c320: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 65 6e  functions are en
c330: 63 6c 6f 73 65 64 20 69 6e 20 61 20 73 61 76 65  closed in a save
c340: 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
c350: 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68  n..** If any oth
c360: 65 72 20 65 72 72 6f 72 20 28 61 73 69 64 65 20  er error (aside 
c370: 66 72 6f 6d 20 61 20 63 6f 6e 73 74 72 61 69 6e  from a constrain
c380: 74 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 61  t failure when a
c390: 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a 2a 2a 20  ttempting to.** 
c3a0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72  write to the tar
c3b0: 67 65 74 20 64 61 74 61 62 61 73 65 29 20 6f 63  get database) oc
c3c0: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 73  curs, then the s
c3d0: 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
c3e0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 72 6f 6c 6c 65  tion is.** rolle
c3f0: 64 20 62 61 63 6b 2c 20 72 65 73 74 6f 72 69 6e  d back, restorin
c400: 67 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  g the target dat
c410: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
c420: 67 69 6e 61 6c 20 73 74 61 74 65 2c 20 61 6e 64  ginal state, and
c430: 20 61 6e 20 0a 2a 2a 20 53 51 4c 69 74 65 20 65   an .** SQLite e
c440: 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
c450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c460: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
c470: 72 73 20 28 70 70 52 65 62 61 73 65 29 20 61 6e  rs (ppRebase) an
c480: 64 20 28 70 6e 52 65 62 61 73 65 29 20 61 72 65  d (pnRebase) are
c490: 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 0a 2a 2a   non-NULL and.**
c4a0: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 61 20   the input is a 
c4b0: 63 68 61 6e 67 65 73 65 74 20 28 6e 6f 74 20 61  changeset (not a
c4c0: 20 70 61 74 63 68 73 65 74 29 2c 20 74 68 65 6e   patchset), then
c4d0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
c4e0: 74 5f 61 70 70 6c 79 5f 76 32 28 29 0a 2a 2a 20  t_apply_v2().** 
c4f0: 6d 61 79 20 73 65 74 20 28 2a 70 70 52 65 62 61  may set (*ppReba
c500: 73 65 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  se) to point to 
c510: 61 20 22 72 65 62 61 73 65 22 20 74 68 61 74 20  a "rebase" that 
c520: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
c530: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
c540: 5f 72 65 62 61 73 65 72 20 41 50 49 73 20 62 75  _rebaser APIs bu
c550: 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
c560: 72 6e 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63  rning. In this c
c570: 61 73 65 20 28 2a 70 6e 52 65 62 61 73 65 29 0a  ase (*pnRebase).
c580: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
c590: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
c5a0: 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20 49 74  fer in bytes. It
c5b0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
c5c0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
c5d0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
c5e0: 75 61 6c 6c 79 20 66 72 65 65 20 61 6e 79 20 73  ually free any s
c5f0: 75 63 68 20 62 75 66 66 65 72 20 75 73 69 6e 67  uch buffer using
c600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
c610: 20 54 68 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   The buffer.** i
c620: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 64  s only allocated
c630: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 69   and populated i
c640: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  f one or more co
c650: 6e 66 6c 69 63 74 73 20 77 65 72 65 20 65 6e 63  nflicts were enc
c660: 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 77 68 69 6c  ountered.** whil
c670: 65 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 70  e applying the p
c680: 61 74 63 68 73 65 74 2e 20 53 65 65 20 63 6f 6d  atchset. See com
c690: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
c6a0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65  g the sqlite3_re
c6b0: 62 61 73 65 72 0a 2a 2a 20 41 50 49 73 20 66 6f  baser.** APIs fo
c6c0: 72 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  r further detail
c6d0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
c6e0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
c6f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61      /* Apply cha
c720: 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62  nge to "main" db
c730: 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20   of this handle 
c740: 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65  */.  int nChange
c750: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
c760: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c770: 63 68 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74  changeset in byt
c780: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  es */.  void *pC
c790: 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20  hangeset,       
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
c7b0: 65 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  eset blob */.  i
c7c0: 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20  nt(*xFilter)(.  
c7d0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68  /* Copy of sixth
c800: 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29   arg to _apply()
c810: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
c820: 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20  ar *zTab        
c830: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e        /* Table n
c840: 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e  ame */.  ),.  in
c850: 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20  t(*xConflict)(. 
c860: 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20     void *pCtx,  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74   /* Copy of sixt
c890: 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28  h arg to _apply(
c8a0: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f  ) */.    int eCo
c8b0: 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20  nflict,         
c8c0: 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20         /* DATA, 
c8d0: 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43  MISSING, CONFLIC
c8e0: 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f  T, CONSTRAINT */
c8f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61  .    sqlite3_cha
c900: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20  ngeset_iter *p  
c910: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73     /* Handle des
c920: 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61  cribing change a
c930: 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  nd conflict */. 
c940: 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   ),.  void *pCtx
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
c970: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
c980: 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29  o xConflict */.)
c990: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  ;.int sqlite3cha
c9a0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28  ngeset_apply_v2(
c9b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e     /* Apply chan
c9e0: 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20  ge to "main" db 
c9f0: 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a  of this handle *
ca00: 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73  /.  int nChanges
ca10: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
ca20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 63      /* Size of c
ca30: 68 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74 65  hangeset in byte
ca40: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68  s */.  void *pCh
ca50: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
ca60: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
ca70: 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e  set blob */.  in
ca80: 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20  t(*xFilter)(.   
ca90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cab0: 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20  * Copy of sixth 
cac0: 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20  arg to _apply() 
cad0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
cae0: 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20  r *zTab         
caf0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
cb00: 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74  me */.  ),.  int
cb10: 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20  (*xConflict)(.  
cb20: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68  /* Copy of sixth
cb50: 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29   arg to _apply()
cb60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e   */.    int eCon
cb70: 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20 20  flict,          
cb80: 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d        /* DATA, M
cb90: 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54  ISSING, CONFLICT
cba0: 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a  , CONSTRAINT */.
cbb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e      sqlite3_chan
cbc0: 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20  geset_iter *p   
cbd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63    /* Handle desc
cbe0: 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e  ribing change an
cbf0: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
cc00: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  ),.  void *pCtx,
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
cc30: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
cc40: 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20   xConflict */.  
cc50: 76 6f 69 64 20 2a 2a 70 70 52 65 62 61 73 65 2c  void **ppRebase,
cc60: 20 69 6e 74 20 2a 70 6e 52 65 62 61 73 65 0a 29   int *pnRebase.)
cc70: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52  ;../* .** CAPI3R
cc80: 45 46 3a 20 43 6f 6e 73 74 61 6e 74 73 20 50 61  EF: Constants Pa
cc90: 73 73 65 64 20 54 6f 20 54 68 65 20 43 6f 6e 66  ssed To The Conf
cca0: 6c 69 63 74 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a  lict Handler.**.
ccb0: 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d  ** Values that m
ccc0: 61 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20  ay be passed as 
ccd0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
cce0: 65 6e 74 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63  ent to a conflic
ccf0: 74 2d 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  t-handler..**.**
cd00: 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c   <dl>.** <dt>SQL
cd10: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
cd20: 54 41 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 65 20  TA<dd>.**   The 
cd30: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
cd40: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
cd50: 20 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20   CHANGESET_DATA 
cd60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
cd70: 67 75 6d 65 6e 74 0a 2a 2a 20 20 20 77 68 65 6e  gument.**   when
cd80: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 44 45   processing a DE
cd90: 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 63  LETE or UPDATE c
cda0: 68 61 6e 67 65 20 69 66 20 61 20 72 6f 77 20 77  hange if a row w
cdb0: 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65 64  ith the required
cdc0: 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b 45  .**   PRIMARY KE
cdd0: 59 20 66 69 65 6c 64 73 20 69 73 20 70 72 65 73  Y fields is pres
cde0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
cdf0: 61 73 65 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20  ase, but one or 
ce00: 6d 6f 72 65 20 6f 74 68 65 72 20 0a 2a 2a 20 20  more other .**  
ce10: 20 28 6e 6f 6e 20 70 72 69 6d 61 72 79 2d 6b 65   (non primary-ke
ce20: 79 29 20 66 69 65 6c 64 73 20 6d 6f 64 69 66 69  y) fields modifi
ce30: 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65  ed by the update
ce40: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
ce50: 74 68 65 20 0a 2a 2a 20 20 20 65 78 70 65 63 74  the .**   expect
ce60: 65 64 20 22 62 65 66 6f 72 65 22 20 76 61 6c 75  ed "before" valu
ce70: 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65  es..** .**   The
ce80: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
ce90: 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  , in this case, 
cea0: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
ceb0: 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 61 74  row with the mat
cec0: 63 68 69 6e 67 0a 2a 2a 20 20 20 70 72 69 6d 61  ching.**   prima
ced0: 72 79 20 6b 65 79 2e 0a 2a 2a 20 0a 2a 2a 20 3c  ry key..** .** <
cee0: 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  dt>SQLITE_CHANGE
cef0: 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 3c 64 64 3e  SET_NOTFOUND<dd>
cf00: 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69  .**   The confli
cf10: 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e  ct handler is in
cf20: 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47  voked with CHANG
cf30: 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 20 61 73  ESET_NOTFOUND as
cf40: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 20   the second.**  
cf50: 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 70   argument when p
cf60: 72 6f 63 65 73 73 69 6e 67 20 61 20 44 45 4c 45  rocessing a DELE
cf70: 54 45 20 6f 72 20 55 50 44 41 54 45 20 63 68 61  TE or UPDATE cha
cf80: 6e 67 65 20 69 66 20 61 20 72 6f 77 20 77 69 74  nge if a row wit
cf90: 68 20 74 68 65 0a 2a 2a 20 20 20 72 65 71 75 69  h the.**   requi
cfa0: 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  red PRIMARY KEY 
cfb0: 66 69 65 6c 64 73 20 69 73 20 6e 6f 74 20 70 72  fields is not pr
cfc0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
cfd0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  abase..** .**   
cfe0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  There is no conf
cff0: 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20 74  licting row in t
d000: 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 72 65  his case. The re
d010: 73 75 6c 74 73 20 6f 66 20 69 6e 76 6f 6b 69 6e  sults of invokin
d020: 67 20 74 68 65 0a 2a 2a 20 20 20 73 71 6c 69 74  g the.**   sqlit
d030: 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66  e3changeset_conf
d040: 6c 69 63 74 28 29 20 41 50 49 20 61 72 65 20 75  lict() API are u
d050: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 0a 2a 2a  ndefined..** .**
d060: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
d070: 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 3c 64  GESET_CONFLICT<d
d080: 64 3e 0a 2a 2a 20 20 20 43 48 41 4e 47 45 53 45  d>.**   CHANGESE
d090: 54 5f 43 4f 4e 46 4c 49 43 54 20 69 73 20 70 61  T_CONFLICT is pa
d0a0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d0b0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
d0c0: 68 65 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20  he conflict.**  
d0d0: 20 68 61 6e 64 6c 65 72 20 77 68 69 6c 65 20 70   handler while p
d0e0: 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 49 4e 53  rocessing an INS
d0f0: 45 52 54 20 63 68 61 6e 67 65 20 69 66 20 74 68  ERT change if th
d100: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 6f 75 6c  e operation woul
d110: 64 20 72 65 73 75 6c 74 20 0a 2a 2a 20 20 20 69  d result .**   i
d120: 6e 20 64 75 70 6c 69 63 61 74 65 20 70 72 69 6d  n duplicate prim
d130: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 2e 0a  ary key values..
d140: 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e  ** .**   The con
d150: 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20  flicting row in 
d160: 74 68 69 73 20 63 61 73 65 20 69 73 20 74 68 65  this case is the
d170: 20 64 61 74 61 62 61 73 65 20 72 6f 77 20 77 69   database row wi
d180: 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a  th the matching.
d190: 2a 2a 20 20 20 70 72 69 6d 61 72 79 20 6b 65 79  **   primary key
d1a0: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  ..**.** <dt>SQLI
d1b0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46 4f 52  TE_CHANGESET_FOR
d1c0: 45 49 47 4e 5f 4b 45 59 3c 64 64 3e 0a 2a 2a 20  EIGN_KEY<dd>.** 
d1d0: 20 20 49 66 20 66 6f 72 65 69 67 6e 20 6b 65 79    If foreign key
d1e0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 65 6e 61   handling is ena
d1f0: 62 6c 65 64 2c 20 61 6e 64 20 61 70 70 6c 79 69  bled, and applyi
d200: 6e 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 6c  ng a changeset l
d210: 65 61 76 65 73 20 74 68 65 0a 2a 2a 20 20 20 64  eaves the.**   d
d220: 61 74 61 62 61 73 65 20 69 6e 20 61 20 73 74 61  atabase in a sta
d230: 74 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 6f  te containing fo
d240: 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
d250: 69 6f 6e 73 2c 20 74 68 65 20 63 6f 6e 66 6c 69  ions, the confli
d260: 63 74 20 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72  ct .**   handler
d270: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
d280: 20 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49   CHANGESET_FOREI
d290: 47 4e 5f 4b 45 59 20 61 73 20 74 68 65 20 73 65  GN_KEY as the se
d2a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
d2b0: 20 20 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20     exactly once 
d2c0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 61 6e 67  before the chang
d2d0: 65 73 65 74 20 69 73 20 63 6f 6d 6d 69 74 74 65  eset is committe
d2e0: 64 2e 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69  d. If the confli
d2f0: 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  ct handler.**   
d300: 72 65 74 75 72 6e 73 20 43 48 41 4e 47 45 53 45  returns CHANGESE
d310: 54 5f 4f 4d 49 54 2c 20 74 68 65 20 63 68 61 6e  T_OMIT, the chan
d320: 67 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ges, including t
d330: 68 6f 73 65 20 74 68 61 74 20 63 61 75 73 65 64  hose that caused
d340: 20 74 68 65 0a 2a 2a 20 20 20 66 6f 72 65 69 67   the.**   foreig
d350: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
d360: 20 76 69 6f 6c 61 74 69 6f 6e 2c 20 61 72 65 20   violation, are 
d370: 63 6f 6d 6d 69 74 74 65 64 2e 20 4f 72 2c 20 69  committed. Or, i
d380: 66 20 69 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  f it returns.** 
d390: 20 20 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52    CHANGESET_ABOR
d3a0: 54 2c 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  T, the changeset
d3b0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
d3c0: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 20 63 75 72 72  .**.**   No curr
d3d0: 65 6e 74 20 6f 72 20 63 6f 6e 66 6c 69 63 74 69  ent or conflicti
d3e0: 6e 67 20 72 6f 77 20 69 6e 66 6f 72 6d 61 74 69  ng row informati
d3f0: 6f 6e 20 69 73 20 70 72 6f 76 69 64 65 64 2e 20  on is provided. 
d400: 54 68 65 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  The only functio
d410: 6e 0a 2a 2a 20 20 20 69 74 20 69 73 20 70 6f 73  n.**   it is pos
d420: 73 69 62 6c 65 20 74 6f 20 63 61 6c 6c 20 6f 6e  sible to call on
d430: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 71   the supplied sq
d440: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
d450: 69 74 65 72 20 68 61 6e 64 6c 65 0a 2a 2a 20 20  iter handle.**  
d460: 20 69 73 20 73 71 6c 69 74 65 33 63 68 61 6e 67   is sqlite3chang
d470: 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74  eset_fk_conflict
d480: 73 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e  s()..** .** <dt>
d490: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
d4a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3c 64 64 3e 0a  _CONSTRAINT<dd>.
d4b0: 2a 2a 20 20 20 49 66 20 61 6e 79 20 6f 74 68 65  **   If any othe
d4c0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  r constraint vio
d4d0: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 20 77 68  lation occurs wh
d4e0: 69 6c 65 20 61 70 70 6c 79 69 6e 67 20 61 20 63  ile applying a c
d4f0: 68 61 6e 67 65 20 28 69 2e 65 2e 20 0a 2a 2a 20  hange (i.e. .** 
d500: 20 20 61 20 55 4e 49 51 55 45 2c 20 43 48 45 43    a UNIQUE, CHEC
d510: 4b 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  K or NOT NULL co
d520: 6e 73 74 72 61 69 6e 74 29 2c 20 74 68 65 20 63  nstraint), the c
d530: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
d540: 69 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64  is .**   invoked
d550: 20 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f   with CHANGESET_
d560: 43 4f 4e 53 54 52 41 49 4e 54 20 61 73 20 74 68  CONSTRAINT as th
d570: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d580: 74 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 72  t..** .**   Ther
d590: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 6c 69 63 74  e is no conflict
d5a0: 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 69 73 20  ing row in this 
d5b0: 63 61 73 65 2e 20 54 68 65 20 72 65 73 75 6c 74  case. The result
d5c0: 73 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68  s of invoking th
d5d0: 65 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 63 68  e.**   sqlite3ch
d5e0: 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74  angeset_conflict
d5f0: 28 29 20 41 50 49 20 61 72 65 20 75 6e 64 65 66  () API are undef
d600: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 3c 2f 64 6c  ined..**.** </dl
d610: 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  >.*/.#define SQL
d620: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
d630: 54 41 20 20 20 20 20 20 20 20 31 0a 23 64 65 66  TA        1.#def
d640: 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  ine SQLITE_CHANG
d650: 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  ESET_NOTFOUND   
d660: 20 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   2.#define SQLIT
d670: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
d680: 4c 49 43 54 20 20 20 20 33 0a 23 64 65 66 69 6e  LICT    3.#defin
d690: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
d6a0: 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 34  ET_CONSTRAINT  4
d6b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
d6c0: 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47  CHANGESET_FOREIG
d6d0: 4e 5f 4b 45 59 20 35 0a 0a 2f 2a 20 0a 2a 2a 20  N_KEY 5../* .** 
d6e0: 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 73 74 61  CAPI3REF: Consta
d6f0: 6e 74 73 20 52 65 74 75 72 6e 65 64 20 42 79 20  nts Returned By 
d700: 54 68 65 20 43 6f 6e 66 6c 69 63 74 20 48 61 6e  The Conflict Han
d710: 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e  dler.**.** A con
d720: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61  flict handler ca
d730: 6c 6c 62 61 63 6b 20 6d 75 73 74 20 72 65 74 75  llback must retu
d740: 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  rn one of the fo
d750: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 76 61  llowing three va
d760: 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e  lues..**.** <dl>
d770: 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43  .** <dt>SQLITE_C
d780: 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 3c 64 64  HANGESET_OMIT<dd
d790: 3e 0a 2a 2a 20 20 20 49 66 20 61 20 63 6f 6e 66  >.**   If a conf
d7a0: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 72 65 74  lict handler ret
d7b0: 75 72 6e 73 20 74 68 69 73 20 76 61 6c 75 65 20  urns this value 
d7c0: 6e 6f 20 73 70 65 63 69 61 6c 20 61 63 74 69 6f  no special actio
d7d0: 6e 20 69 73 20 74 61 6b 65 6e 2e 20 54 68 65 0a  n is taken. The.
d7e0: 2a 2a 20 20 20 63 68 61 6e 67 65 20 74 68 61 74  **   change that
d7f0: 20 63 61 75 73 65 64 20 74 68 65 20 63 6f 6e 66   caused the conf
d800: 6c 69 63 74 20 69 73 20 6e 6f 74 20 61 70 70 6c  lict is not appl
d810: 69 65 64 2e 20 54 68 65 20 73 65 73 73 69 6f 6e  ied. The session
d820: 20 6d 6f 64 75 6c 65 20 0a 2a 2a 20 20 20 63 6f   module .**   co
d830: 6e 74 69 6e 75 65 73 20 74 6f 20 74 68 65 20 6e  ntinues to the n
d840: 65 78 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68  ext change in th
d850: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  e changeset..**.
d860: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
d870: 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 3c  ANGESET_REPLACE<
d880: 64 64 3e 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  dd>.**   This va
d890: 6c 75 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lue may only be 
d8a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d8b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d8c0: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 0a  to the conflict.
d8d0: 2a 2a 20 20 20 68 61 6e 64 6c 65 72 20 77 61 73  **   handler was
d8e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
d8f0: 54 5f 44 41 54 41 20 6f 72 20 53 51 4c 49 54 45  T_DATA or SQLITE
d900: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c  _CHANGESET_CONFL
d910: 49 43 54 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ICT. If this.** 
d920: 20 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73    is not the cas
d930: 65 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  e, any changes a
d940: 70 70 6c 69 65 64 20 73 6f 20 66 61 72 20 61 72  pplied so far ar
d950: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
d960: 64 20 74 68 65 20 0a 2a 2a 20 20 20 63 61 6c 6c  d the .**   call
d970: 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67   to sqlite3chang
d980: 65 73 65 74 5f 61 70 70 6c 79 28 29 20 72 65 74  eset_apply() ret
d990: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55  urns SQLITE_MISU
d9a0: 53 45 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 43  SE..**.**   If C
d9b0: 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
d9c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
d9d0: 61 6e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  an SQLITE_CHANGE
d9e0: 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63  SET_DATA conflic
d9f0: 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72 2c 20  t.**   handler, 
da00: 74 68 65 6e 20 74 68 65 20 63 6f 6e 66 6c 69 63  then the conflic
da10: 74 69 6e 67 20 72 6f 77 20 69 73 20 65 69 74 68  ting row is eith
da20: 65 72 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  er updated or de
da30: 6c 65 74 65 64 2c 20 64 65 70 65 6e 64 69 6e 67  leted, depending
da40: 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20 74 79 70  .**   on the typ
da50: 65 20 6f 66 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a  e of change..**.
da60: 2a 2a 20 20 20 49 66 20 43 48 41 4e 47 45 53 45  **   If CHANGESE
da70: 54 5f 52 45 50 4c 41 43 45 20 69 73 20 72 65 74  T_REPLACE is ret
da80: 75 72 6e 65 64 20 62 79 20 61 6e 20 53 51 4c 49  urned by an SQLI
da90: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
daa0: 46 4c 49 43 54 20 63 6f 6e 66 6c 69 63 74 0a 2a  FLICT conflict.*
dab0: 2a 20 20 20 68 61 6e 64 6c 65 72 2c 20 74 68 65  *   handler, the
dac0: 6e 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  n the conflictin
dad0: 67 20 72 6f 77 20 69 73 20 72 65 6d 6f 76 65 64  g row is removed
dae0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
daf0: 73 65 20 61 6e 64 20 61 0a 2a 2a 20 20 20 73 65  se and a.**   se
db00: 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20  cond attempt to 
db10: 61 70 70 6c 79 20 74 68 65 20 63 68 61 6e 67 65  apply the change
db20: 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 69   is made. If thi
db30: 73 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70 74  s second attempt
db40: 20 66 61 69 6c 73 2c 0a 2a 2a 20 20 20 74 68 65   fails,.**   the
db50: 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20 69 73   original row is
db60: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
db70: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
db80: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2a 0a   continuing..**.
db90: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
dba0: 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 3c 64 64  ANGESET_ABORT<dd
dbb0: 3e 0a 2a 2a 20 20 20 49 66 20 74 68 69 73 20 76  >.**   If this v
dbc0: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
dbd0: 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 70  , any changes ap
dbe0: 70 6c 69 65 64 20 73 6f 20 66 61 72 20 61 72 65  plied so far are
dbf0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 0a 2a 2a   rolled back .**
dc00: 20 20 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20     and the call 
dc10: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
dc20: 73 65 74 5f 61 70 70 6c 79 28 29 20 72 65 74 75  set_apply() retu
dc30: 72 6e 73 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  rns SQLITE_ABORT
dc40: 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64  ..** </dl>.*/.#d
dc50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
dc60: 4e 47 45 53 45 54 5f 4f 4d 49 54 20 20 20 20 20  NGESET_OMIT     
dc70: 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    0.#define SQLI
dc80: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50  TE_CHANGESET_REP
dc90: 4c 41 43 45 20 20 20 20 31 0a 23 64 65 66 69 6e  LACE    1.#defin
dca0: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
dcb0: 45 54 5f 41 42 4f 52 54 20 20 20 20 20 20 32 0a  ET_ABORT      2.
dcc0: 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52 45 46  ./* .** CAPI3REF
dcd0: 3a 20 52 65 62 61 73 69 6e 67 20 63 68 61 6e 67  : Rebasing chang
dce0: 65 73 65 74 73 0a 2a 2a 0a 2a 2a 20 53 75 70 70  esets.**.** Supp
dcf0: 6f 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ose there is a s
dd00: 69 74 65 20 68 6f 73 74 69 6e 67 20 61 20 64 61  ite hosting a da
dd10: 74 61 62 61 73 65 20 69 6e 20 73 74 61 74 65 20  tabase in state 
dd20: 53 30 2e 20 41 6e 64 20 74 68 61 74 0a 2a 2a 20  S0. And that.** 
dd30: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72  modifications ar
dd40: 65 20 6d 61 64 65 20 74 68 61 74 20 6d 6f 76 65  e made that move
dd50: 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 74   that database t
dd60: 6f 20 73 74 61 74 65 20 53 31 20 61 6e 64 20 61  o state S1 and a
dd70: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 72 65  .** changeset re
dd80: 63 6f 72 64 65 64 20 28 74 68 65 20 22 6c 6f 63  corded (the "loc
dd90: 61 6c 22 20 63 68 61 6e 67 65 73 65 74 29 2e 20  al" changeset). 
dda0: 54 68 65 6e 2c 20 61 20 63 68 61 6e 67 65 73 65  Then, a changese
ddb0: 74 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 53 30  t based.** on S0
ddc0: 20 69 73 20 72 65 63 65 69 76 65 64 20 66 72 6f   is received fro
ddd0: 6d 20 61 6e 6f 74 68 65 72 20 73 69 74 65 20 28  m another site (
dde0: 74 68 65 20 22 72 65 6d 6f 74 65 22 20 63 68 61  the "remote" cha
ddf0: 6e 67 65 73 65 74 29 20 61 6e 64 20 0a 2a 2a 20  ngeset) and .** 
de00: 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 64  applied to the d
de10: 61 74 61 62 61 73 65 2e 20 54 68 65 20 64 61 74  atabase. The dat
de20: 61 62 61 73 65 20 69 73 20 74 68 65 6e 20 69 6e  abase is then in
de30: 20 73 74 61 74 65 20 0a 2a 2a 20 28 53 31 2b 22   state .** (S1+"
de40: 72 65 6d 6f 74 65 22 29 2c 20 77 68 65 72 65 20  remote"), where 
de50: 74 68 65 20 65 78 61 63 74 20 73 74 61 74 65 20  the exact state 
de60: 64 65 70 65 6e 64 73 20 6f 6e 20 61 6e 79 20 63  depends on any c
de70: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c  onflict.** resol
de80: 75 74 69 6f 6e 20 64 65 63 69 73 69 6f 6e 73 20  ution decisions 
de90: 28 4f 4d 49 54 20 6f 72 20 52 45 50 4c 41 43 45  (OMIT or REPLACE
dea0: 29 20 6d 61 64 65 20 77 68 69 6c 65 20 61 70 70  ) made while app
deb0: 6c 79 69 6e 67 20 22 72 65 6d 6f 74 65 22 2e 0a  lying "remote"..
dec0: 2a 2a 20 52 65 62 61 73 69 6e 67 20 61 20 63 68  ** Rebasing a ch
ded0: 61 6e 67 65 73 65 74 20 69 73 20 74 6f 20 75 70  angeset is to up
dee0: 64 61 74 65 20 69 74 20 74 6f 20 74 61 6b 65 20  date it to take 
def0: 74 68 6f 73 65 20 63 6f 6e 66 6c 69 63 74 20 0a  those conflict .
df00: 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 64 65  ** resolution de
df10: 63 69 73 69 6f 6e 73 20 69 6e 74 6f 20 61 63 63  cisions into acc
df20: 6f 75 6e 74 2c 20 73 6f 20 74 68 61 74 20 74 68  ount, so that th
df30: 65 20 73 61 6d 65 20 63 6f 6e 66 6c 69 63 74 73  e same conflicts
df40: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  .** do not have 
df50: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 20 65  to be resolved e
df60: 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
df70: 6e 65 74 77 6f 72 6b 2e 20 0a 2a 2a 0a 2a 2a 20  network. .**.** 
df80: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
df90: 62 6f 74 68 20 74 68 65 20 6c 6f 63 61 6c 20 61  both the local a
dfa0: 6e 64 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65  nd remote change
dfb0: 73 65 74 73 20 63 6f 6e 74 61 69 6e 20 61 6e 0a  sets contain an.
dfc0: 2a 2a 20 49 4e 53 45 52 54 20 6f 66 20 74 68 65  ** INSERT of the
dfd0: 20 73 61 6d 65 20 6b 65 79 20 6f 6e 20 22 43 52   same key on "CR
dfe0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
dff0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 22  PRIMARY KEY, b)"
e000: 3a 0a 2a 2a 0a 2a 2a 20 20 20 6c 6f 63 61 6c 3a  :.**.**   local:
e010: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e020: 20 56 41 4c 55 45 53 28 31 2c 20 27 76 31 27 29   VALUES(1, 'v1')
e030: 3b 0a 2a 2a 20 20 20 72 65 6d 6f 74 65 3a 20 49  ;.**   remote: I
e040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e050: 4c 55 45 53 28 31 2c 20 27 76 32 27 29 3b 0a 2a  LUES(1, 'v2');.*
e060: 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6e  *.** and the con
e070: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
e080: 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 65   is REPLACE, the
e090: 6e 20 74 68 65 20 49 4e 53 45 52 54 20 63 68 61  n the INSERT cha
e0a0: 6e 67 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  nge is.** remove
e0b0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c  d from the local
e0c0: 20 63 68 61 6e 67 65 73 65 74 20 28 69 74 20 77   changeset (it w
e0d0: 61 73 20 6f 76 65 72 72 69 64 64 65 6e 29 2e 20  as overridden). 
e0e0: 4f 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  Or, if the.** co
e0f0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
e100: 6e 20 77 61 73 20 22 4f 4d 49 54 22 2c 20 74 68  n was "OMIT", th
e110: 65 6e 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61  en the local cha
e120: 6e 67 65 73 65 74 20 69 73 20 6d 6f 64 69 66 69  ngeset is modifi
e130: 65 64 0a 2a 2a 20 74 6f 20 69 6e 73 74 65 61 64  ed.** to instead
e140: 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20   contain:.**.** 
e150: 20 20 20 20 20 20 20 20 20 20 55 50 44 41 54 45            UPDATE
e160: 20 74 31 20 53 45 54 20 62 20 3d 20 27 76 32 27   t1 SET b = 'v2'
e170: 20 57 48 45 52 45 20 61 3d 31 3b 0a 2a 2a 0a 2a   WHERE a=1;.**.*
e180: 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69 6e  * Changes within
e190: 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67   the local chang
e1a0: 65 73 65 74 20 61 72 65 20 72 65 62 61 73 65 64  eset are rebased
e1b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e1c0: 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 4c  ** <dl>.** <dt>L
e1d0: 6f 63 61 6c 20 49 4e 53 45 52 54 3c 64 64 3e 0a  ocal INSERT<dd>.
e1e0: 2a 2a 20 20 20 54 68 69 73 20 6d 61 79 20 6f 6e  **   This may on
e1f0: 6c 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ly conflict with
e200: 20 61 20 72 65 6d 6f 74 65 20 49 4e 53 45 52 54   a remote INSERT
e210: 2e 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  . If the conflic
e220: 74 20 0a 2a 2a 20 20 20 72 65 73 6f 6c 75 74 69  t .**   resoluti
e230: 6f 6e 20 77 61 73 20 4f 4d 49 54 2c 20 74 68 65  on was OMIT, the
e240: 6e 20 61 64 64 20 61 6e 20 55 50 44 41 54 45 20  n add an UPDATE 
e250: 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 72 65  change to the re
e260: 62 61 73 65 64 0a 2a 2a 20 20 20 63 68 61 6e 67  based.**   chang
e270: 65 73 65 74 2e 20 4f 72 2c 20 69 66 20 74 68 65  eset. Or, if the
e280: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
e290: 74 69 6f 6e 20 77 61 73 20 52 45 50 4c 41 43 45  tion was REPLACE
e2a0: 2c 20 61 64 64 0a 2a 2a 20 20 20 6e 6f 74 68 69  , add.**   nothi
e2b0: 6e 67 20 74 6f 20 74 68 65 20 72 65 62 61 73 65  ng to the rebase
e2c0: 64 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  d changeset..**.
e2d0: 2a 2a 20 3c 64 74 3e 4c 6f 63 61 6c 20 44 45 4c  ** <dt>Local DEL
e2e0: 45 54 45 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 69  ETE<dd>.**   Thi
e2f0: 73 20 6d 61 79 20 63 6f 6e 66 6c 69 63 74 20 77  s may conflict w
e300: 69 74 68 20 61 20 72 65 6d 6f 74 65 20 55 50 44  ith a remote UPD
e310: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 2e 20 49  ATE or DELETE. I
e320: 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
e330: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 70 6f 73 73 69  .**   only possi
e340: 62 6c 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ble resolution i
e350: 73 20 4f 4d 49 54 2e 20 49 66 20 74 68 65 20 72  s OMIT. If the r
e360: 65 6d 6f 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  emote operation 
e370: 77 61 73 20 61 0a 2a 2a 20 20 20 44 45 4c 45 54  was a.**   DELET
e380: 45 2c 20 74 68 65 6e 20 61 64 64 20 6e 6f 20 63  E, then add no c
e390: 68 61 6e 67 65 20 74 6f 20 74 68 65 20 72 65 62  hange to the reb
e3a0: 61 73 65 64 20 63 68 61 6e 67 65 73 65 74 2e 20  ased changeset. 
e3b0: 49 66 20 74 68 65 20 72 65 6d 6f 74 65 0a 2a 2a  If the remote.**
e3c0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73     operation was
e3d0: 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68 65 6e   an UPDATE, then
e3e0: 20 74 68 65 20 6f 6c 64 2e 2a 20 66 69 65 6c 64   the old.* field
e3f0: 73 20 6f 66 20 63 68 61 6e 67 65 20 61 72 65 20  s of change are 
e400: 75 70 64 61 74 65 64 0a 2a 2a 20 20 20 74 6f 20  updated.**   to 
e410: 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 2e  reflect the new.
e420: 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
e430: 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 3c 64  UPDATE..**.** <d
e440: 74 3e 4c 6f 63 61 6c 20 55 50 44 41 54 45 3c 64  t>Local UPDATE<d
e450: 64 3e 0a 2a 2a 20 20 20 54 68 69 73 20 6d 61 79  d>.**   This may
e460: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61   conflict with a
e470: 20 72 65 6d 6f 74 65 20 55 50 44 41 54 45 20 6f   remote UPDATE o
e480: 72 20 44 45 4c 45 54 45 2e 20 49 66 20 69 74 20  r DELETE. If it 
e490: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 77  conflicts.**   w
e4a0: 69 74 68 20 61 20 44 45 4c 45 54 45 2c 20 61 6e  ith a DELETE, an
e4b0: 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  d the conflict r
e4c0: 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20 4f 4d  esolution was OM
e4d0: 49 54 2c 20 74 68 65 6e 20 74 68 65 20 75 70 64  IT, then the upd
e4e0: 61 74 65 0a 2a 2a 20 20 20 69 73 20 63 68 61 6e  ate.**   is chan
e4f0: 67 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 53 45  ged into an INSE
e500: 52 54 2e 20 41 6e 79 20 75 6e 64 65 66 69 6e 65  RT. Any undefine
e510: 64 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  d values in the 
e520: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 0a 2a 2a 20  new.* record.** 
e530: 20 20 66 72 6f 6d 20 74 68 65 20 75 70 64 61 74    from the updat
e540: 65 20 63 68 61 6e 67 65 20 61 72 65 20 66 69 6c  e change are fil
e550: 6c 65 64 20 69 6e 20 75 73 69 6e 67 20 74 68 65  led in using the
e560: 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
e570: 6f 6d 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66  om.**   the conf
e580: 6c 69 63 74 69 6e 67 20 44 45 4c 45 54 45 2e 20  licting DELETE. 
e590: 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
e5a0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77  ict resolution w
e5b0: 61 73 20 52 45 50 4c 41 43 45 2c 0a 2a 2a 20 20  as REPLACE,.**  
e5c0: 20 74 68 65 20 55 50 44 41 54 45 20 63 68 61 6e   the UPDATE chan
e5d0: 67 65 20 69 73 20 73 69 6d 70 6c 79 20 6f 6d 69  ge is simply omi
e5e0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  tted from the re
e5f0: 62 61 73 65 64 20 63 68 61 6e 67 65 73 65 74 2e  based changeset.
e600: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 63 6f 6e 66  .**.**   If conf
e610: 6c 69 63 74 20 69 73 20 77 69 74 68 20 61 20 72  lict is with a r
e620: 65 6d 6f 74 65 20 55 50 44 41 54 45 20 61 6e 64  emote UPDATE and
e630: 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20   the resolution 
e640: 69 73 20 4f 4d 49 54 2c 20 74 68 65 6e 0a 2a 2a  is OMIT, then.**
e650: 20 20 20 74 68 65 20 6f 6c 64 2e 2a 20 76 61 6c     the old.* val
e660: 75 65 73 20 61 72 65 20 72 65 62 61 73 65 64 20  ues are rebased 
e670: 75 73 69 6e 67 20 74 68 65 20 6e 65 77 2e 2a 20  using the new.* 
e680: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72 65  values in the re
e690: 6d 6f 74 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65  mote.**   change
e6a0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 72 65 73  . Or, if the res
e6b0: 6f 6c 75 74 69 6f 6e 20 69 73 20 52 45 50 4c 41  olution is REPLA
e6c0: 43 45 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  CE, then the cha
e6d0: 6e 67 65 20 69 73 20 63 6f 70 69 65 64 0a 2a 2a  nge is copied.**
e6e0: 20 20 20 69 6e 74 6f 20 74 68 65 20 72 65 62 61     into the reba
e6f0: 73 65 64 20 63 68 61 6e 67 65 73 65 74 20 77 69  sed changeset wi
e700: 74 68 20 75 70 64 61 74 65 73 20 74 6f 20 63 6f  th updates to co
e710: 6c 75 6d 6e 73 20 61 6c 73 6f 20 75 70 64 61 74  lumns also updat
e720: 65 64 20 62 79 0a 2a 2a 20 20 20 74 68 65 20 63  ed by.**   the c
e730: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 6d 6f 74  onflicting remot
e740: 65 20 55 50 44 41 54 45 20 72 65 6d 6f 76 65 64  e UPDATE removed
e750: 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
e760: 6e 6f 20 63 6f 6c 75 6d 6e 73 20 77 6f 75 6c 64  no columns would
e770: 20 0a 2a 2a 20 20 20 62 65 20 75 70 64 61 74 65   .**   be update
e780: 64 2c 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  d, the change is
e790: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 3c 2f 64   omitted..** </d
e7a0: 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 6c 6f 63 61 6c  l>.**.** A local
e7b0: 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 72   change may be r
e7c0: 65 62 61 73 65 64 20 61 67 61 69 6e 73 74 20 6d  ebased against m
e7d0: 75 6c 74 69 70 6c 65 20 72 65 6d 6f 74 65 20 63  ultiple remote c
e7e0: 68 61 6e 67 65 73 20 0a 2a 2a 20 73 69 6d 75 6c  hanges .** simul
e7f0: 74 61 6e 65 6f 75 73 6c 79 2e 20 49 66 20 61 20  taneously. If a 
e800: 73 69 6e 67 6c 65 20 6b 65 79 20 69 73 20 6d 6f  single key is mo
e810: 64 69 66 69 65 64 20 62 79 20 6d 75 6c 74 69 70  dified by multip
e820: 6c 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 63 68  le remote .** ch
e830: 61 6e 67 65 73 65 74 73 2c 20 74 68 65 79 20 61  angesets, they a
e840: 72 65 20 63 6f 6d 62 69 6e 65 64 20 61 73 20 66  re combined as f
e850: 6f 6c 6c 6f 77 73 20 62 65 66 6f 72 65 20 74 68  ollows before th
e860: 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65  e local changese
e870: 74 0a 2a 2a 20 69 73 20 72 65 62 61 73 65 64 3a  t.** is rebased:
e880: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
e890: 20 20 3c 6c 69 3e 20 49 66 20 74 68 65 72 65 20    <li> If there 
e8a0: 68 61 73 20 62 65 65 6e 20 6f 6e 65 20 6f 72 20  has been one or 
e8b0: 6d 6f 72 65 20 52 45 50 4c 41 43 45 20 72 65 73  more REPLACE res
e8c0: 6f 6c 75 74 69 6f 6e 73 20 6f 6e 20 61 0a 2a 2a  olutions on a.**
e8d0: 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 69 74           key, it
e8e0: 20 69 73 20 72 65 62 61 73 65 64 20 61 63 63 6f   is rebased acco
e8f0: 72 64 69 6e 67 20 74 6f 20 61 20 52 45 50 4c 41  rding to a REPLA
e900: 43 45 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 6c 69  CE..**.**    <li
e910: 3e 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  > If there have 
e920: 62 65 65 6e 20 6e 6f 20 52 45 50 4c 41 43 45 20  been no REPLACE 
e930: 72 65 73 6f 6c 75 74 69 6f 6e 73 20 6f 6e 20 61  resolutions on a
e940: 20 6b 65 79 2c 20 74 68 65 6e 0a 2a 2a 20 20 20   key, then.**   
e950: 20 20 20 20 20 20 74 68 65 20 6c 6f 63 61 6c 20        the local 
e960: 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 65 62  changeset is reb
e970: 61 73 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ased according t
e980: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
e990: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  t.**         of 
e9a0: 74 68 65 20 4f 4d 49 54 20 72 65 73 6f 6c 75 74  the OMIT resolut
e9b0: 69 6f 6e 73 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  ions..** </ul>.*
e9c0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63  *.** Note that c
e9d0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
e9e0: 6f 6e 73 20 66 72 6f 6d 20 6d 75 6c 74 69 70 6c  ons from multipl
e9f0: 65 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73  e remote changes
ea00: 65 74 73 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 62  ets are .** comb
ea10: 69 6e 65 64 20 6f 6e 20 61 20 70 65 72 2d 66 69  ined on a per-fi
ea20: 65 6c 64 20 62 61 73 69 73 2c 20 6e 6f 74 20 70  eld basis, not p
ea30: 65 72 2d 72 6f 77 2e 20 54 68 69 73 20 6d 65 61  er-row. This mea
ea40: 6e 73 20 74 68 61 74 20 69 6e 20 74 68 65 20 0a  ns that in the .
ea50: 2a 2a 20 63 61 73 65 20 6f 66 20 6d 75 6c 74 69  ** case of multi
ea60: 70 6c 65 20 72 65 6d 6f 74 65 20 55 50 44 41 54  ple remote UPDAT
ea70: 45 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 73 6f  E operations, so
ea80: 6d 65 20 66 69 65 6c 64 73 20 6f 66 20 61 20 73  me fields of a s
ea90: 69 6e 67 6c 65 20 0a 2a 2a 20 6c 6f 63 61 6c 20  ingle .** local 
eaa0: 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 72 65  change may be re
eab0: 62 61 73 65 64 20 66 6f 72 20 52 45 50 4c 41 43  based for REPLAC
eac0: 45 20 77 68 69 6c 65 20 6f 74 68 65 72 73 20 61  E while others a
ead0: 72 65 20 72 65 62 61 73 65 64 20 66 6f 72 20 0a  re rebased for .
eae0: 2a 2a 20 4f 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 49  ** OMIT..**.** I
eaf0: 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 62 61 73  n order to rebas
eb00: 65 20 61 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  e a local change
eb10: 73 65 74 2c 20 74 68 65 20 72 65 6d 6f 74 65 20  set, the remote 
eb20: 63 68 61 6e 67 65 73 65 74 20 6d 75 73 74 20 66  changeset must f
eb30: 69 72 73 74 0a 2a 2a 20 62 65 20 61 70 70 6c 69  irst.** be appli
eb40: 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20  ed to the local 
eb50: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 73  database using s
eb60: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
eb70: 61 70 70 6c 79 5f 76 32 28 29 20 61 6e 64 0a 2a  apply_v2() and.*
eb80: 2a 20 74 68 65 20 62 75 66 66 65 72 20 6f 66 20  * the buffer of 
eb90: 72 65 62 61 73 65 20 69 6e 66 6f 72 6d 61 74 69  rebase informati
eba0: 6f 6e 20 63 61 70 74 75 72 65 64 2e 20 54 68 65  on captured. The
ebb0: 6e 3a 0a 2a 2a 0a 2a 2a 20 3c 6f 6c 3e 0a 2a 2a  n:.**.** <ol>.**
ebc0: 20 20 20 3c 6c 69 3e 20 41 6e 20 73 71 6c 69 74     <li> An sqlit
ebd0: 65 33 5f 72 65 62 61 73 65 72 20 6f 62 6a 65 63  e3_rebaser objec
ebe0: 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20  t is created by 
ebf0: 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 20 20 20 20  calling .**     
ec00: 20 20 20 73 71 6c 69 74 65 33 72 65 62 61 73 65     sqlite3rebase
ec10: 72 5f 63 72 65 61 74 65 28 29 2e 0a 2a 2a 20 20  r_create()..**  
ec20: 20 3c 6c 69 3e 20 54 68 65 20 6e 65 77 20 6f 62   <li> The new ob
ec30: 6a 65 63 74 20 69 73 20 63 6f 6e 66 69 67 75 72  ject is configur
ec40: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 62 61  ed with the reba
ec50: 73 65 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e  se buffer obtain
ec60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20  ed from.**      
ec70: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
ec80: 65 74 5f 61 70 70 6c 79 5f 76 32 28 29 20 62 79  et_apply_v2() by
ec90: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
eca0: 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67 75 72  rebaser_configur
ecb0: 65 28 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 49  e()..**        I
ecc0: 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e  f the local chan
ecd0: 67 65 73 65 74 20 69 73 20 74 6f 20 62 65 20 72  geset is to be r
ece0: 65 62 61 73 65 64 20 61 67 61 69 6e 73 74 20 6d  ebased against m
ecf0: 75 6c 74 69 70 6c 65 20 72 65 6d 6f 74 65 0a 2a  ultiple remote.*
ed00: 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  *        changes
ed10: 65 74 73 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ets, then sqlite
ed20: 33 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67 75  3rebaser_configu
ed30: 72 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 63  re() should be c
ed40: 61 6c 6c 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  alled.**        
ed50: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
ed60: 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
ed70: 72 20 74 68 61 74 20 74 68 65 20 6d 75 6c 74 69  r that the multi
ed80: 70 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 71  ple.**        sq
ed90: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
eda0: 70 70 6c 79 5f 76 32 28 29 20 63 61 6c 6c 73 20  pply_v2() calls 
edb0: 77 65 72 65 20 6d 61 64 65 2e 0a 2a 2a 20 20 20  were made..**   
edc0: 3c 6c 69 3e 20 45 61 63 68 20 6c 6f 63 61 6c 20  <li> Each local 
edd0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 65 62  changeset is reb
ede0: 61 73 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ased by calling 
edf0: 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 72  sqlite3rebaser_r
ee00: 65 62 61 73 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c  ebase()..**   <l
ee10: 69 3e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 72  i> The sqlite3_r
ee20: 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20 69 73  ebaser object is
ee30: 20 64 65 6c 65 74 65 64 20 62 79 20 63 61 6c 6c   deleted by call
ee40: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 73 71  ing.**        sq
ee50: 6c 69 74 65 33 72 65 62 61 73 65 72 5f 64 65 6c  lite3rebaser_del
ee60: 65 74 65 28 29 2e 0a 2a 2a 20 3c 2f 6f 6c 3e 0a  ete()..** </ol>.
ee70: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
ee80: 74 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  t sqlite3_rebase
ee90: 72 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  r sqlite3_rebase
eea0: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 52 45  r;../*.** CAPIRE
eeb0: 46 3a 20 43 72 65 61 74 65 20 61 20 63 68 61 6e  F: Create a chan
eec0: 67 65 73 65 74 20 72 65 62 61 73 65 72 20 6f 62  geset rebaser ob
eed0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f  ject..**.** Allo
eee0: 63 61 74 65 20 61 20 6e 65 77 20 63 68 61 6e 67  cate a new chang
eef0: 65 73 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a  eset rebaser obj
ef00: 65 63 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  ect. If successf
ef10: 75 6c 2c 20 73 65 74 20 28 2a 70 70 4e 65 77 29  ul, set (*ppNew)
ef20: 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
ef30: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
ef40: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ef50: 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
ef60: 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
ef70: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
ef80: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
ef90: 64 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  de (e.g. SQLITE_
efa0: 4e 4f 4d 45 4d 29 20 61 6e 64 20 73 65 74 20 28  NOMEM) and set (
efb0: 2a 70 70 4e 65 77 29 20 0a 2a 2a 20 74 6f 20 4e  *ppNew) .** to N
efc0: 55 4c 4c 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ULL. .*/.int sql
efd0: 69 74 65 33 72 65 62 61 73 65 72 5f 63 72 65 61  ite3rebaser_crea
efe0: 74 65 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73  te(sqlite3_rebas
eff0: 65 72 20 2a 2a 70 70 4e 65 77 29 3b 0a 0a 2f 2a  er **ppNew);../*
f000: 0a 2a 2a 20 43 41 50 49 52 45 46 3a 20 43 6f 6e  .** CAPIREF: Con
f010: 66 69 67 75 72 65 20 61 20 63 68 61 6e 67 65 73  figure a changes
f020: 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63  et rebaser objec
f030: 74 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  t..**.** Configu
f040: 72 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  re the changeset
f050: 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20   rebaser object 
f060: 74 6f 20 72 65 62 61 73 65 20 63 68 61 6e 67 65  to rebase change
f070: 73 65 74 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a  sets according.*
f080: 2a 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  * to the conflic
f090: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 73 20 64 65  t resolutions de
f0a0: 73 63 72 69 62 65 64 20 62 79 20 62 75 66 66 65  scribed by buffe
f0b0: 72 20 70 52 65 62 61 73 65 20 28 73 69 7a 65 20  r pRebase (size 
f0c0: 6e 52 65 62 61 73 65 0a 2a 2a 20 62 79 74 65 73  nRebase.** bytes
f0d0: 29 2c 20 77 68 69 63 68 20 6d 75 73 74 20 68 61  ), which must ha
f0e0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
f0f0: 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73   from a previous
f100: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
f110: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
f120: 6c 79 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  ly_v2()..*/.int 
f130: 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63  sqlite3rebaser_c
f140: 6f 6e 66 69 67 75 72 65 28 0a 20 20 73 71 6c 69  onfigure(.  sqli
f150: 74 65 33 5f 72 65 62 61 73 65 72 2a 2c 20 0a 20  te3_rebaser*, . 
f160: 20 69 6e 74 20 6e 52 65 62 61 73 65 2c 20 63 6f   int nRebase, co
f170: 6e 73 74 20 76 6f 69 64 20 2a 70 52 65 62 61 73  nst void *pRebas
f180: 65 0a 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  e.); ../*.** CAP
f190: 49 52 45 46 3a 20 52 65 62 61 73 65 20 61 20 63  IREF: Rebase a c
f1a0: 68 61 6e 67 65 73 65 74 0a 2a 2a 0a 2a 2a 20 41  hangeset.**.** A
f1b0: 72 67 75 6d 65 6e 74 20 70 49 6e 20 6d 75 73 74  rgument pIn must
f1c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
f1d0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
f1e0: 63 68 61 6e 67 65 73 65 74 20 6e 49 6e 20 62 79  changeset nIn by
f1f0: 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20  tes.** in size. 
f200: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
f210: 6c 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75  locates and popu
f220: 6c 61 74 65 73 20 61 20 62 75 66 66 65 72 20 77  lates a buffer w
f230: 69 74 68 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  ith a copy.** of
f240: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 72   the changeset r
f250: 65 62 61 73 65 64 20 72 65 62 61 73 65 64 20 61  ebased rebased a
f260: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
f270: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66  configuration of
f280: 20 74 68 65 0a 2a 2a 20 72 65 62 61 73 65 72 20   the.** rebaser 
f290: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
f2a0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
f2b0: 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  ent. If successf
f2c0: 75 6c 2c 20 28 2a 70 70 4f 75 74 29 0a 2a 2a 20  ul, (*ppOut).** 
f2d0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
f2e0: 74 6f 20 74 68 65 20 6e 65 77 20 62 75 66 66 65  to the new buffe
f2f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
f300: 20 72 65 62 61 73 65 64 20 63 68 61 6e 67 73 65   rebased changse
f310: 74 20 61 6e 64 20 0a 2a 2a 20 28 2a 70 6e 4f 75  t and .** (*pnOu
f320: 74 29 20 74 6f 20 69 74 73 20 73 69 7a 65 20 69  t) to its size i
f330: 6e 20 62 79 74 65 73 20 61 6e 64 20 53 51 4c 49  n bytes and SQLI
f340: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
f350: 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  It is the.** res
f360: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
f370: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
f380: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
f390: 20 6e 65 77 20 62 75 66 66 65 72 20 75 73 69 6e   new buffer usin
f3a0: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
f3b0: 65 28 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  e(). Otherwise, 
f3c0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
f3d0: 72 73 2c 20 28 2a 70 70 4f 75 74 29 20 61 6e 64  rs, (*ppOut) and
f3e0: 20 28 2a 70 6e 4f 75 74 29 0a 2a 2a 20 61 72 65   (*pnOut).** are
f3f0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
f400: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
f410: 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 0a   code returned..
f420: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 65  */.int sqlite3re
f430: 62 61 73 65 72 5f 72 65 62 61 73 65 28 0a 20 20  baser_rebase(.  
f440: 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 2a  sqlite3_rebaser*
f450: 2c 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e  ,.  int nIn, con
f460: 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c 20 0a 20  st void *pIn, . 
f470: 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69   int *pnOut, voi
f480: 64 20 2a 2a 70 70 4f 75 74 20 0a 29 3b 0a 0a 2f  d **ppOut .);../
f490: 2a 0a 2a 2a 20 43 41 50 49 52 45 46 3a 20 44 65  *.** CAPIREF: De
f4a0: 6c 65 74 65 20 61 20 63 68 61 6e 67 65 73 65 74  lete a changeset
f4b0: 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e   rebaser object.
f4c0: 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
f4d0: 65 20 63 68 61 6e 67 65 73 65 74 20 72 65 62 61  e changeset reba
f4e0: 73 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 61  ser object and a
f4f0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65  ll associated re
f500: 73 6f 75 72 63 65 73 2e 20 54 68 65 72 65 0a 2a  sources. There.*
f510: 2a 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  * should be one 
f520: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
f530: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
f540: 75 63 63 65 73 73 66 75 6c 20 69 6e 76 6f 63 61  uccessful invoca
f550: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 73 71 6c 69 74  tion.** of sqlit
f560: 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74 65  e3rebaser_create
f570: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f580: 74 65 33 72 65 62 61 73 65 72 5f 64 65 6c 65 74  te3rebaser_delet
f590: 65 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  e(sqlite3_rebase
f5a0: 72 20 2a 70 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43  r *p); ../*.** C
f5b0: 41 50 49 33 52 45 46 3a 20 53 74 72 65 61 6d 69  API3REF: Streami
f5c0: 6e 67 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 41  ng Versions of A
f5d0: 50 49 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  PI functions..**
f5e0: 0a 2a 2a 20 54 68 65 20 73 69 78 20 73 74 72 65  .** The six stre
f5f0: 61 6d 69 6e 67 20 41 50 49 20 78 78 78 5f 73 74  aming API xxx_st
f600: 72 6d 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 73  rm() functions s
f610: 65 72 76 65 20 73 69 6d 69 6c 61 72 20 70 75 72  erve similar pur
f620: 70 6f 73 65 73 20 74 6f 20 74 68 65 20 0a 2a 2a  poses to the .**
f630: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e   corresponding n
f640: 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 41 50 49  on-streaming API
f650: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
f660: 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  * <table border=
f670: 31 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d  1 style="margin-
f680: 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d  left:8ex;margin-
f690: 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20  right:8ex">.**  
f6a0: 20 3c 74 72 3e 3c 74 68 3e 53 74 72 65 61 6d 69   <tr><th>Streami
f6b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e  ng function<th>N
f6c0: 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 65 71 75  on-streaming equ
f6d0: 69 76 61 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20  ivalent</th>.** 
f6e0: 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
f6f0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
f700: 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65  _strm<td>[sqlite
f710: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
f720: 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  ] .**   <tr><td>
f730: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
f740: 5f 63 6f 6e 63 61 74 5f 73 74 72 6d 3c 74 64 3e  _concat_strm<td>
f750: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
f760: 74 5f 63 6f 6e 63 61 74 5d 20 0a 2a 2a 20 20 20  t_concat] .**   
f770: 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63  <tr><td>sqlite3c
f780: 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f  hangeset_invert_
f790: 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33  strm<td>[sqlite3
f7a0: 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74  changeset_invert
f7b0: 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  ] .**   <tr><td>
f7c0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
f7d0: 5f 73 74 61 72 74 5f 73 74 72 6d 3c 74 64 3e 5b  _start_strm<td>[
f7e0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
f7f0: 5f 73 74 61 72 74 5d 20 0a 2a 2a 20 20 20 3c 74  _start] .**   <t
f800: 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 73 65 73  r><td>sqlite3ses
f810: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5f 73  sion_changeset_s
f820: 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33 73  trm<td>[sqlite3s
f830: 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
f840: 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  ] .**   <tr><td>
f850: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70  sqlite3session_p
f860: 61 74 63 68 73 65 74 5f 73 74 72 6d 3c 74 64 3e  atchset_strm<td>
f870: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
f880: 70 61 74 63 68 73 65 74 5d 20 0a 2a 2a 20 3c 2f  patchset] .** </
f890: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e  table>.**.** Non
f8a0: 2d 73 74 72 65 61 6d 69 6e 67 20 66 75 6e 63 74  -streaming funct
f8b0: 69 6f 6e 73 20 74 68 61 74 20 61 63 63 65 70 74  ions that accept
f8c0: 20 63 68 61 6e 67 65 73 65 74 73 20 28 6f 72 20   changesets (or 
f8d0: 70 61 74 63 68 73 65 74 73 29 20 61 73 20 69 6e  patchsets) as in
f8e0: 70 75 74 0a 2a 2a 20 72 65 71 75 69 72 65 20 74  put.** require t
f8f0: 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 63  hat the entire c
f900: 68 61 6e 67 65 73 65 74 20 62 65 20 73 74 6f 72  hangeset be stor
f910: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ed in a single b
f920: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
f930: 20 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20   .** Similarly, 
f940: 74 68 6f 73 65 20 74 68 61 74 20 72 65 74 75 72  those that retur
f950: 6e 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  n a changeset or
f960: 20 70 61 74 63 68 73 65 74 20 64 6f 20 73 6f 20   patchset do so 
f970: 62 79 20 72 65 74 75 72 6e 69 6e 67 20 0a 2a 2a  by returning .**
f980: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
f990: 73 69 6e 67 6c 65 20 6c 61 72 67 65 20 62 75 66  single large buf
f9a0: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  fer allocated us
f9b0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
f9c0: 6f 63 28 29 2e 20 0a 2a 2a 20 4e 6f 72 6d 61 6c  oc(). .** Normal
f9d0: 6c 79 20 74 68 69 73 20 69 73 20 63 6f 6e 76 65  ly this is conve
f9e0: 6e 69 65 6e 74 2e 20 48 6f 77 65 76 65 72 2c 20  nient. However, 
f9f0: 69 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f  if an applicatio
fa00: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 20 0a  n running in a .
fa10: 2a 2a 20 6c 6f 77 2d 6d 65 6d 6f 72 79 20 65 6e  ** low-memory en
fa20: 76 69 72 6f 6e 6d 65 6e 74 20 69 73 20 72 65 71  vironment is req
fa30: 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
fa40: 76 65 72 79 20 6c 61 72 67 65 20 63 68 61 6e 67  very large chang
fa50: 65 73 65 74 73 2c 20 74 68 65 0a 2a 2a 20 6c 61  esets, the.** la
fa60: 72 67 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d  rge contiguous m
fa70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fa80: 73 20 72 65 71 75 69 72 65 64 20 63 61 6e 20 62  s required can b
fa90: 65 63 6f 6d 65 20 6f 6e 65 72 6f 75 73 2e 0a 2a  ecome onerous..*
faa0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
fab0: 20 61 76 6f 69 64 20 74 68 69 73 20 70 72 6f 62   avoid this prob
fac0: 6c 65 6d 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  lem, instead of 
fad0: 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 20 62  a single large b
fae0: 75 66 66 65 72 2c 20 69 6e 70 75 74 0a 2a 2a 20  uffer, input.** 
faf0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 73  is passed to a s
fb00: 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e  treaming API fun
fb10: 63 74 69 6f 6e 73 20 62 79 20 77 61 79 20 6f 66  ctions by way of
fb20: 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   a callback func
fb30: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65  tion that.** the
fb40: 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65   sessions module
fb50: 20 69 6e 76 6f 6b 65 73 20 74 6f 20 69 6e 63 72   invokes to incr
fb60: 65 6d 65 6e 74 61 6c 6c 79 20 72 65 71 75 65 73  ementally reques
fb70: 74 20 69 6e 70 75 74 20 64 61 74 61 20 61 73 20  t input data as 
fb80: 69 74 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65  it is.** require
fb90: 64 2e 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  d. In all cases,
fba0: 20 61 20 70 61 69 72 20 6f 66 20 41 50 49 20 66   a pair of API f
fbb0: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
fbc0: 72 73 20 73 75 63 68 20 61 73 0a 2a 2a 0a 2a 2a  rs such as.**.**
fbd0: 20 20 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e 62 73    <pre>.**  &nbs
fbe0: 70 3b 20 20 20 20 20 69 6e 74 20 6e 43 68 61 6e  p;     int nChan
fbf0: 67 65 73 65 74 2c 0a 2a 2a 20 20 26 6e 62 73 70  geset,.**  &nbsp
fc00: 3b 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68 61  ;     void *pCha
fc10: 6e 67 65 73 65 74 2c 0a 2a 2a 20 20 3c 2f 70 72  ngeset,.**  </pr
fc20: 65 3e 0a 2a 2a 0a 2a 2a 20 49 73 20 72 65 70 6c  e>.**.** Is repl
fc30: 61 63 65 64 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20  aced by:.**.**  
fc40: 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b  <pre>.**  &nbsp;
fc50: 20 20 20 20 20 69 6e 74 20 28 2a 78 49 6e 70 75       int (*xInpu
fc60: 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  t)(void *pIn, vo
fc70: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
fc80: 70 6e 44 61 74 61 29 2c 0a 2a 2a 20 20 26 6e 62  pnData),.**  &nb
fc90: 73 70 3b 20 20 20 20 20 76 6f 69 64 20 2a 70 49  sp;     void *pI
fca0: 6e 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a  n,.**  </pre>.**
fcb0: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 74 68  .** Each time th
fcc0: 65 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63  e xInput callbac
fcd0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  k is invoked by 
fce0: 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64  the sessions mod
fcf0: 75 6c 65 2c 20 74 68 65 20 66 69 72 73 74 0a 2a  ule, the first.*
fd00: 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
fd10: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
fd20: 68 65 20 73 75 70 70 6c 69 65 64 20 70 49 6e 20  he supplied pIn 
fd30: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 2e  context pointer.
fd40: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
fd50: 61 72 67 75 6d 65 6e 74 2c 20 70 44 61 74 61 2c  argument, pData,
fd60: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
fd70: 66 65 72 20 28 2a 70 6e 44 61 74 61 29 20 62 79  fer (*pnData) by
fd80: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 41 73 73  tes in size. Ass
fd90: 75 6d 69 6e 67 20 6e 6f 20 0a 2a 2a 20 65 72 72  uming no .** err
fda0: 6f 72 20 6f 63 63 75 72 73 20 74 68 65 20 78 49  or occurs the xI
fdb0: 6e 70 75 74 20 6d 65 74 68 6f 64 20 73 68 6f 75  nput method shou
fdc0: 6c 64 20 63 6f 70 79 20 75 70 20 74 6f 20 28 2a  ld copy up to (*
fdd0: 70 6e 44 61 74 61 29 20 62 79 74 65 73 20 6f 66  pnData) bytes of
fde0: 20 64 61 74 61 20 0a 2a 2a 20 69 6e 74 6f 20 74   data .** into t
fdf0: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 73 65  he buffer and se
fe00: 74 20 28 2a 70 6e 44 61 74 61 29 20 74 6f 20 74  t (*pnData) to t
fe10: 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72  he actual number
fe20: 20 6f 66 20 62 79 74 65 73 20 63 6f 70 69 65 64   of bytes copied
fe30: 20 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75   .** before retu
fe40: 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
fe50: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
fe60: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61   completely exha
fe70: 75 73 74 65 64 2c 20 28 2a 70 6e 44 61 74 61 29  usted, (*pnData)
fe80: 20 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 73   .** should be s
fe90: 65 74 20 74 6f 20 7a 65 72 6f 20 74 6f 20 69 6e  et to zero to in
fea0: 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c  dicate this. Or,
feb0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
fec0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 0a  urs, an SQLite .
fed0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 73 68  ** error code sh
fee0: 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64  ould be returned
fef0: 2e 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  . In all cases, 
ff00: 69 66 20 61 6e 20 78 49 6e 70 75 74 20 63 61 6c  if an xInput cal
ff10: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
ff20: 20 61 6e 20 65 72 72 6f 72 2c 20 61 6c 6c 20 70   an error, all p
ff30: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 61 62 61  rocessing is aba
ff40: 6e 64 6f 6e 65 64 20 61 6e 64 20 74 68 65 20 73  ndoned and the s
ff50: 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e  treaming API fun
ff60: 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
ff70: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
ff80: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
ff90: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
ffa0: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 73 71  n the case of sq
ffb0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
ffc0: 74 61 72 74 5f 73 74 72 6d 28 29 2c 20 74 68 65  tart_strm(), the
ffd0: 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b   xInput callback
ffe0: 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b   may be.** invok
fff0: 65 64 20 62 79 20 74 68 65 20 73 65 73 73 69 6f  ed by the sessio
10000 6e 73 20 6d 6f 64 75 6c 65 20 61 74 20 61 6e 79  ns module at any
10010 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68   point during th
10020 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
10030 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 2e 20 49  e.** iterator. I
10040 66 20 73 75 63 68 20 61 6e 20 78 49 6e 70 75 74  f such an xInput
10050 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
10060 73 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 65 20  s an error, the 
10070 69 74 65 72 61 74 6f 72 20 65 6e 74 65 72 73 0a  iterator enters.
10080 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
10090 65 2c 20 77 68 65 72 65 62 79 20 61 6c 6c 20 73  e, whereby all s
100a0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
100b0 74 6f 20 69 74 65 72 61 74 6f 72 20 66 75 6e 63  to iterator func
100c0 74 69 6f 6e 73 20 0a 2a 2a 20 69 6d 6d 65 64 69  tions .** immedi
100d0 61 74 65 6c 79 20 66 61 69 6c 20 77 69 74 68 20  ately fail with 
100e0 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
100f0 6f 64 65 20 61 73 20 72 65 74 75 72 6e 65 64 20  ode as returned 
10100 62 79 20 78 49 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a  by xInput..**.**
10110 20 53 69 6d 69 6c 61 72 6c 79 2c 20 73 74 72 65   Similarly, stre
10120 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69  aming API functi
10130 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
10140 63 68 61 6e 67 65 73 65 74 73 20 28 6f 72 20 70  changesets (or p
10150 61 74 63 68 73 65 74 73 29 0a 2a 2a 20 72 65 74  atchsets).** ret
10160 75 72 6e 20 74 68 65 6d 20 69 6e 20 63 68 75 6e  urn them in chun
10170 6b 73 20 62 79 20 77 61 79 20 6f 66 20 61 20 63  ks by way of a c
10180 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
10190 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 20   instead of via 
101a0 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
101b0 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 20 62  a single large b
101c0 75 66 66 65 72 2e 20 49 6e 20 74 68 69 73 20 63  uffer. In this c
101d0 61 73 65 2c 20 61 20 70 61 69 72 20 6f 66 20 70  ase, a pair of p
101e0 61 72 61 6d 65 74 65 72 73 20 73 75 63 68 0a 2a  arameters such.*
101f0 2a 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72  * as:.**.**  <pr
10200 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20  e>.**  &nbsp;   
10210 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 73    int *pnChanges
10220 65 74 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20  et,.**  &nbsp;  
10230 20 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e     void **ppChan
10240 67 65 73 65 74 2c 0a 2a 2a 20 20 3c 2f 70 72 65  geset,.**  </pre
10250 3e 0a 2a 2a 0a 2a 2a 20 49 73 20 72 65 70 6c 61  >.**.** Is repla
10260 63 65 64 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c  ced by:.**.**  <
10270 70 72 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20  pre>.**  &nbsp; 
10280 20 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75      int (*xOutpu
10290 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
102a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
102b0 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 2a 2a  , int nData),.**
102c0 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69    &nbsp;     voi
102d0 64 20 2a 70 4f 75 74 0a 2a 2a 20 20 3c 2f 70 72  d *pOut.**  </pr
102e0 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4f 75  e>.**.** The xOu
102f0 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 69 73  tput callback is
10300 20 69 6e 76 6f 6b 65 64 20 7a 65 72 6f 20 6f 72   invoked zero or
10310 20 6d 6f 72 65 20 74 69 6d 65 73 20 74 6f 20 72   more times to r
10320 65 74 75 72 6e 20 64 61 74 61 20 74 6f 0a 2a 2a  eturn data to.**
10330 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
10340 2e 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  . The first para
10350 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
10360 65 61 63 68 20 63 61 6c 6c 20 69 73 20 61 20 63  each call is a c
10370 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 70 4f  opy of the.** pO
10380 75 74 20 70 6f 69 6e 74 65 72 20 73 75 70 70 6c  ut pointer suppl
10390 69 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ied by the appli
103a0 63 61 74 69 6f 6e 2e 20 54 68 65 20 73 65 63 6f  cation. The seco
103b0 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 70 44  nd parameter, pD
103c0 61 74 61 2c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ata,.** points t
103d0 6f 20 61 20 62 75 66 66 65 72 20 6e 44 61 74 61  o a buffer nData
103e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
103f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 68  ontaining the ch
10400 75 6e 6b 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2a  unk of output.**
10410 20 64 61 74 61 20 62 65 69 6e 67 20 72 65 74 75   data being retu
10420 72 6e 65 64 2e 20 49 66 20 74 68 65 20 78 4f 75  rned. If the xOu
10430 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 73 75  tput callback su
10440 63 63 65 73 73 66 75 6c 6c 79 20 70 72 6f 63 65  ccessfully proce
10450 73 73 65 73 20 74 68 65 0a 2a 2a 20 73 75 70 70  sses the.** supp
10460 6c 69 65 64 20 64 61 74 61 2c 20 69 74 20 73 68  lied data, it sh
10470 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
10480 54 45 5f 4f 4b 20 74 6f 20 69 6e 64 69 63 61 74  TE_OK to indicat
10490 65 20 73 75 63 63 65 73 73 2e 20 4f 74 68 65 72  e success. Other
104a0 77 69 73 65 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  wise,.** it shou
104b0 6c 64 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  ld return some o
104c0 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f  ther SQLite erro
104d0 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  r code. In this 
104e0 63 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  case processing.
104f0 2a 2a 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c  ** is immediatel
10500 79 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e 64 20  y abandoned and 
10510 74 68 65 20 73 74 72 65 61 6d 69 6e 67 20 41 50  the streaming AP
10520 49 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  I function retur
10530 6e 73 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  ns a copy.** of 
10540 74 68 65 20 78 4f 75 74 70 75 74 20 65 72 72 6f  the xOutput erro
10550 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 61 70  r code to the ap
10560 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  plication..**.**
10570 20 54 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f   The sessions mo
10580 64 75 6c 65 20 6e 65 76 65 72 20 69 6e 76 6f 6b  dule never invok
10590 65 73 20 61 6e 20 78 4f 75 74 70 75 74 20 63 61  es an xOutput ca
105a0 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
105b0 74 68 69 72 64 20 0a 2a 2a 20 70 61 72 61 6d 65  third .** parame
105c0 74 65 72 20 73 65 74 20 74 6f 20 61 20 76 61 6c  ter set to a val
105d0 75 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  ue less than or 
105e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 4f  equal to zero. O
105f0 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 2c 0a  ther than this,.
10600 2a 2a 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 73  ** no guarantees
10610 20 61 72 65 20 6d 61 64 65 20 61 73 20 74 6f 20   are made as to 
10620 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
10630 63 68 75 6e 6b 73 20 6f 66 20 64 61 74 61 20 72  chunks of data r
10640 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
10650 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
10660 5f 61 70 70 6c 79 5f 73 74 72 6d 28 0a 20 20 73  _apply_strm(.  s
10670 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10690 2a 20 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74  * Apply change t
106a0 6f 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74  o "main" db of t
106b0 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  his handle */.  
106c0 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f  int (*xInput)(vo
106d0 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
106e0 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
106f0 61 29 2c 20 2f 2a 20 49 6e 70 75 74 20 66 75 6e  a), /* Input fun
10700 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
10710 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pIn,           
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10740 2a 20 46 69 72 73 74 20 61 72 67 20 66 6f 72 20  * First arg for 
10750 78 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 28  xInput */.  int(
10760 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76  *xFilter)(.    v
10770 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10790 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61 72  Copy of sixth ar
107a0 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f  g to _apply() */
107b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
107c0 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20  *zTab           
107d0 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
107e0 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a   */.  ),.  int(*
107f0 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20 20  xConflict)(.    
10800 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10820 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61   Copy of sixth a
10830 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a  rg to _apply() *
10840 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c  /.    int eConfl
10850 69 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ict,            
10860 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53      /* DATA, MIS
10870 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20  SING, CONFLICT, 
10880 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20  CONSTRAINT */.  
10890 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
108a0 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20 20  set_iter *p     
108b0 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72 69  /* Handle descri
108c0 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20  bing change and 
108d0 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c  conflict */.  ),
108e0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20  .  void *pCtx   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
10910 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
10920 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29 3b 0a 69  Conflict */.);.i
10930 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
10940 73 65 74 5f 61 70 70 6c 79 5f 76 32 5f 73 74 72  set_apply_v2_str
10950 6d 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m(.  sqlite3 *db
10960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10970 20 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68       /* Apply ch
10980 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64  ange to "main" d
10990 62 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65  b of this handle
109a0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70   */.  int (*xInp
109b0 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  ut)(void *pIn, v
109c0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
109d0 2a 70 6e 44 61 74 61 29 2c 20 2f 2a 20 49 6e 70  *pnData), /* Inp
109e0 75 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ut function */. 
109f0 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20   void *pIn,     
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
10a30 67 20 66 6f 72 20 78 49 6e 70 75 74 20 2a 2f 0a  g for xInput */.
10a40 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72 29 28    int(*xFilter)(
10a50 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  .    void *pCtx,
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69     /* Copy of si
10a80 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c  xth arg to _appl
10a90 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  y() */.    const
10aa0 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20   char *zTab     
10ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
10ac0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20  e name */.  ),. 
10ad0 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29   int(*xConflict)
10ae0 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78  (.    void *pCtx
10af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10b00 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73      /* Copy of s
10b10 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70  ixth arg to _app
10b20 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ly() */.    int 
10b30 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20 20  eConflict,      
10b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41 54            /* DAT
10b50 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46  A, MISSING, CONF
10b60 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54  LICT, CONSTRAINT
10b70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
10b80 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
10b90 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20  p     /* Handle 
10ba0 64 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e 67  describing chang
10bb0 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a  e and conflict *
10bc0 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70  /.  ),.  void *p
10bd0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
10be0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10bf0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
10c00 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a  d to xConflict *
10c10 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 52 65 62  /.  void **ppReb
10c20 61 73 65 2c 20 69 6e 74 20 2a 70 6e 52 65 62 61  ase, int *pnReba
10c30 73 65 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  se.);.int sqlite
10c40 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
10c50 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a  t_strm(.  int (*
10c60 78 49 6e 70 75 74 41 29 28 76 6f 69 64 20 2a 70  xInputA)(void *p
10c70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  In, void *pData,
10c80 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20   int *pnData),. 
10c90 20 76 6f 69 64 20 2a 70 49 6e 41 2c 0a 20 20 69   void *pInA,.  i
10ca0 6e 74 20 28 2a 78 49 6e 70 75 74 42 29 28 76 6f  nt (*xInputB)(vo
10cb0 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
10cc0 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
10cd0 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 42  a),.  void *pInB
10ce0 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75  ,.  int (*xOutpu
10cf0 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
10d00 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
10d10 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20  , int nData),.  
10d20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e  void *pOut.);.in
10d30 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
10d40 65 74 5f 69 6e 76 65 72 74 5f 73 74 72 6d 28 0a  et_invert_strm(.
10d50 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
10d60 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20  void *pIn, void 
10d70 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44  *pData, int *pnD
10d80 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49  ata),.  void *pI
10d90 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70  n,.  int (*xOutp
10da0 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ut)(void *pOut, 
10db0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
10dc0 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20  a, int nData),. 
10dd0 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69   void *pOut.);.i
10de0 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
10df0 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28 0a  set_start_strm(.
10e00 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
10e10 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 0a 20  set_iter **pp,. 
10e20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76   int (*xInput)(v
10e30 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a  oid *pIn, void *
10e40 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61  pData, int *pnDa
10e50 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e  ta),.  void *pIn
10e60 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .);.int sqlite3s
10e70 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
10e80 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
10e90 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
10ea0 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  on,.  int (*xOut
10eb0 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
10ec0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
10ed0 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
10ee0 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a    void *pOut.);.
10ef0 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
10f00 6f 6e 5f 70 61 74 63 68 73 65 74 5f 73 74 72 6d  on_patchset_strm
10f10 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
10f20 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20  ion *pSession,. 
10f30 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28   int (*xOutput)(
10f40 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73  void *pOut, cons
10f50 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
10f60 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69  nt nData),.  voi
10f70 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73  d *pOut.);.int s
10f80 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
10f90 70 5f 61 64 64 5f 73 74 72 6d 28 73 71 6c 69 74  p_add_strm(sqlit
10fa0 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c  e3_changegroup*,
10fb0 20 0a 20 20 20 20 69 6e 74 20 28 2a 78 49 6e 70   .    int (*xInp
10fc0 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  ut)(void *pIn, v
10fd0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
10fe0 2a 70 6e 44 61 74 61 29 2c 0a 20 20 20 20 76 6f  *pnData),.    vo
10ff0 69 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73  id *pIn.);.int s
11000 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
11010 70 5f 6f 75 74 70 75 74 5f 73 74 72 6d 28 73 71  p_output_strm(sq
11020 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
11030 70 2a 2c 0a 20 20 20 20 69 6e 74 20 28 2a 78 4f  p*,.    int (*xO
11040 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
11050 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
11060 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
11070 2c 20 0a 20 20 20 20 76 6f 69 64 20 2a 70 4f 75  , .    void *pOu
11080 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.);.int sqlite3
11090 72 65 62 61 73 65 72 5f 72 65 62 61 73 65 5f 73  rebaser_rebase_s
110a0 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 72  trm(.  sqlite3_r
110b0 65 62 61 73 65 72 20 2a 70 52 65 62 61 73 65 72  ebaser *pRebaser
110c0 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  ,.  int (*xInput
110d0 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
110e0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
110f0 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
11100 70 49 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75  pIn,.  int (*xOu
11110 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74  tput)(void *pOut
11120 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44  , const void *pD
11130 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c  ata, int nData),
11140 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b  .  void *pOut.);
11150 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  .../*.** Make su
11160 72 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74  re we can call t
11170 68 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43  his stuff from C
11180 2b 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ++..*/.#ifdef __
11190 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23 65 6e 64  cplusplus.}.#end
111a0 69 66 0a 0a 23 65 6e 64 69 66 20 20 2f 2a 20 21  if..#endif  /* !
111b0 64 65 66 69 6e 65 64 28 5f 5f 53 51 4c 49 54 45  defined(__SQLITE
111c0 53 45 53 53 49 4f 4e 5f 48 5f 29 20 26 26 20 64  SESSION_H_) && d
111d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
111e0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 2a 2f  ABLE_SESSION) */
111f0 0a                                               .