/ Hex Artifact Content
Login

Artifact 54d6356f5769d3695e5f63d719c6ee27671b2614973a2b675a3ff4d30d574233:


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 2a 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  **.** The behavi
5490: 6f 72 20 6f 66 20 73 71 6c 69 74 65 33 63 68 61  or of sqlite3cha
54a0: 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 76 32 28  ngeset_start_v2(
54b0: 29 20 61 6e 64 20 69 74 73 20 73 74 72 65 61 6d  ) and its stream
54c0: 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a  ing equivalent.*
54d0: 2a 20 6d 61 79 20 62 65 20 6d 6f 64 69 66 69 65  * may be modifie
54e0: 64 20 62 79 20 70 61 73 73 69 6e 67 20 61 20 63  d by passing a c
54f0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
5500: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
5510: 45 54 53 54 41 52 54 5f 49 4e 56 45 52 54 20 7c  ETSTART_INVERT |
5520: 20 73 75 70 70 6f 72 74 65 64 20 66 6c 61 67 73   supported flags
5530: 5d 20 61 73 20 74 68 65 20 34 74 68 20 70 61 72  ] as the 4th par
5540: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ameter..**.** No
5550: 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
5560: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
5570: 72 74 5f 76 32 28 29 20 41 50 49 20 69 73 20 73  rt_v2() API is s
5580: 74 69 6c 6c 20 3c 62 3e 65 78 70 65 72 69 6d 65  till <b>experime
5590: 6e 74 61 6c 3c 2f 62 3e 0a 2a 2a 20 61 6e 64 20  ntal</b>.** and 
55a0: 74 68 65 72 65 66 6f 72 65 20 73 75 62 6a 65 63  therefore subjec
55b0: 74 20 74 6f 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  t to change..*/.
55c0: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
55d0: 65 73 65 74 5f 73 74 61 72 74 28 0a 20 20 73 71  eset_start(.  sq
55e0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
55f0: 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f 2a  iter **pp,    /*
5600: 20 4f 55 54 3a 20 4e 65 77 20 63 68 61 6e 67 65   OUT: New change
5610: 73 65 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e  set iterator han
5620: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  dle */.  int nCh
5630: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
5640: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5650: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 62 6c   of changeset bl
5660: 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ob in bytes */. 
5670: 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65   void *pChangese
5680: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
5690: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
56a0: 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  lob containing c
56b0: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 69  hangeset */.);.i
56c0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
56d0: 73 65 74 5f 73 74 61 72 74 5f 76 32 28 0a 20 20  set_start_v2(.  
56e0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
56f0: 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20  t_iter **pp,    
5700: 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68 61 6e  /* OUT: New chan
5710: 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 68  geset iterator h
5720: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
5730: 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20  Changeset,      
5740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5750: 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20  ze of changeset 
5760: 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f  blob in bytes */
5770: 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65  .  void *pChange
5780: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
5790: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
57a0: 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67   blob containing
57b0: 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20   changeset */.  
57c0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 2f 2a 20 53 45 53 53 49 4f 4e 5f 43 48 41 4e 47  /* SESSION_CHANG
57f0: 45 53 45 54 53 54 41 52 54 5f 2a 20 66 6c 61 67  ESETSTART_* flag
5800: 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.);../*.** C
5810: 41 50 49 33 52 45 46 3a 20 46 6c 61 67 73 20 66  API3REF: Flags f
5820: 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  or sqlite3change
5830: 73 65 74 5f 73 74 61 72 74 5f 76 32 0a 2a 2a 0a  set_start_v2.**.
5840: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
5850: 20 66 6c 61 67 73 20 6d 61 79 20 70 61 73 73 65   flags may passe
5860: 64 20 76 69 61 20 74 68 65 20 34 74 68 20 70 61  d via the 4th pa
5870: 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 5b 73  rameter to.** [s
5880: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5890: 73 74 61 72 74 5f 76 32 5d 20 61 6e 64 20 5b 73  start_v2] and [s
58a0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
58b0: 73 74 61 72 74 5f 76 32 5f 73 74 72 6d 5d 3a 0a  start_v2_strm]:.
58c0: 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  **.** <dt>SQLITE
58d0: 5f 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f  _CHANGESETAPPLY_
58e0: 49 4e 56 45 52 54 20 3c 64 64 3e 0a 2a 2a 20 20  INVERT <dd>.**  
58f0: 20 49 6e 76 65 72 74 20 74 68 65 20 63 68 61 6e   Invert the chan
5900: 67 65 73 65 74 20 77 68 69 6c 65 20 69 74 65 72  geset while iter
5910: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 74  ating through it
5920: 2e 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  . This is equiva
5930: 6c 65 6e 74 20 74 6f 0a 2a 2a 20 20 20 69 6e 76  lent to.**   inv
5940: 65 72 74 69 6e 67 20 61 20 63 68 61 6e 67 65 73  erting a changes
5950: 65 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  et using sqlite3
5960: 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74  changeset_invert
5970: 28 29 20 62 65 66 6f 72 65 20 61 70 70 6c 79 69  () before applyi
5980: 6e 67 20 69 74 2e 0a 2a 2a 20 20 20 49 74 20 69  ng it..**   It i
5990: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73 70  s an error to sp
59a0: 65 63 69 66 79 20 74 68 69 73 20 66 6c 61 67 20  ecify this flag 
59b0: 77 69 74 68 20 61 20 70 61 74 63 68 73 65 74 2e  with a patchset.
59c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
59d0: 54 45 5f 43 48 41 4e 47 45 53 45 54 53 54 41 52  TE_CHANGESETSTAR
59e0: 54 5f 49 4e 56 45 52 54 20 20 20 20 20 20 20 20  T_INVERT        
59f0: 30 78 30 30 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 43  0x0002.../*.** C
5a00: 41 50 49 33 52 45 46 3a 20 41 64 76 61 6e 63 65  API3REF: Advance
5a10: 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65   A Changeset Ite
5a20: 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a  rator.** METHOD:
5a30: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5a40: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68  et_iter.**.** Th
5a50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
5a60: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
5a70: 68 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61  h iterators crea
5a80: 74 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a  ted by function.
5a90: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
5aa0: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49  eset_start()]. I
5ab0: 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 6f  f it is called o
5ac0: 6e 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  n an iterator pa
5ad0: 73 73 65 64 20 74 6f 0a 2a 2a 20 61 20 63 6f 6e  ssed to.** a con
5ae0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61  flict-handler ca
5af0: 6c 6c 62 61 63 6b 20 62 79 20 5b 73 71 6c 69 74  llback by [sqlit
5b00: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
5b10: 79 28 29 5d 2c 20 53 51 4c 49 54 45 5f 4d 49 53  y()], SQLITE_MIS
5b20: 55 53 45 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  USE.** is return
5b30: 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  ed and the call 
5b40: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 2a  has no effect..*
5b50: 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
5b60: 20 61 66 74 65 72 20 61 6e 20 69 74 65 72 61 74   after an iterat
5b70: 6f 72 20 69 73 20 63 72 65 61 74 65 64 20 62 79  or is created by
5b80: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
5b90: 74 5f 73 74 61 72 74 28 29 2c 20 69 74 0a 2a 2a  t_start(), it.**
5ba0: 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
5bb0: 74 6f 20 61 6e 79 20 63 68 61 6e 67 65 20 69 6e  to any change in
5bc0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
5bd0: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 68 61  Assuming the cha
5be0: 6e 67 65 73 65 74 0a 2a 2a 20 69 73 20 6e 6f 74  ngeset.** is not
5bf0: 20 65 6d 70 74 79 2c 20 74 68 65 20 66 69 72 73   empty, the firs
5c00: 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  t call to this f
5c10: 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73  unction advances
5c20: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
5c30: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
5c40: 20 66 69 72 73 74 20 63 68 61 6e 67 65 20 69 6e   first change in
5c50: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
5c60: 45 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  Each subsequent 
5c70: 63 61 6c 6c 20 61 64 76 61 6e 63 65 73 0a 2a 2a  call advances.**
5c80: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
5c90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
5ca0: 78 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65  xt change in the
5cb0: 20 63 68 61 6e 67 65 73 65 74 20 28 69 66 20 61   changeset (if a
5cc0: 6e 79 29 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 72  ny). If.** no er
5cd0: 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
5ce0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
5cf0: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 63 68  ts to a valid ch
5d00: 61 6e 67 65 20 61 66 74 65 72 20 61 20 63 61 6c  ange after a cal
5d10: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 63  l.** to sqlite3c
5d20: 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20  hangeset_next() 
5d30: 68 61 73 20 61 64 76 61 6e 63 65 64 20 69 74 2c  has advanced it,
5d40: 20 53 51 4c 49 54 45 5f 52 4f 57 20 69 73 20 72   SQLITE_ROW is r
5d50: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
5d60: 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 63  erwise, if all c
5d70: 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68  hanges in the ch
5d80: 61 6e 67 65 73 65 74 20 68 61 76 65 20 61 6c 72  angeset have alr
5d90: 65 61 64 79 20 62 65 65 6e 20 76 69 73 69 74 65  eady been visite
5da0: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  d,.** SQLITE_DON
5db0: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E is returned..*
5dc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5dd0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
5de0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
5df0: 20 72 65 74 75 72 6e 65 64 2e 20 50 6f 73 73 69   returned. Possi
5e00: 62 6c 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ble error .** co
5e10: 64 65 73 20 69 6e 63 6c 75 64 65 20 53 51 4c 49  des include SQLI
5e20: 54 45 5f 43 4f 52 52 55 50 54 20 28 69 66 20 74  TE_CORRUPT (if t
5e30: 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 75 66  he changeset buf
5e40: 66 65 72 20 69 73 20 63 6f 72 72 75 70 74 29 20  fer is corrupt) 
5e50: 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
5e60: 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
5e70: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  te3changeset_nex
5e80: 74 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t(sqlite3_change
5e90: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 29  set_iter *pIter)
5ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
5eb0: 46 3a 20 4f 62 74 61 69 6e 20 54 68 65 20 43 75  F: Obtain The Cu
5ec0: 72 72 65 6e 74 20 4f 70 65 72 61 74 69 6f 6e 20  rrent Operation 
5ed0: 46 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74  From A Changeset
5ee0: 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54   Iterator.** MET
5ef0: 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  HOD: sqlite3_cha
5f00: 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a  ngeset_iter.**.*
5f10: 2a 20 54 68 65 20 70 49 74 65 72 20 61 72 67 75  * The pIter argu
5f20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
5f30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
5f40: 20 65 69 74 68 65 72 20 62 65 20 61 6e 20 69 74   either be an it
5f50: 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64  erator.** passed
5f60: 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   to a conflict-h
5f70: 61 6e 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74  andler by [sqlit
5f80: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
5f90: 79 28 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72  y()], or an iter
5fa0: 61 74 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20  ator.** created 
5fb0: 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  by [sqlite3chang
5fc0: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49  eset_start()]. I
5fd0: 6e 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  n the latter cas
5fe0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  e, the most rece
5ff0: 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73  nt.** call to [s
6000: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
6010: 6e 65 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76  next()] must hav
6020: 65 20 72 65 74 75 72 6e 65 64 20 5b 53 51 4c 49  e returned [SQLI
6030: 54 45 5f 52 4f 57 5d 2e 20 49 66 20 74 68 69 73  TE_ROW]. If this
6040: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
6050: 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
6060: 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49  on returns [SQLI
6070: 54 45 5f 4d 49 53 55 53 45 5d 2e 0a 2a 2a 0a 2a  TE_MISUSE]..**.*
6080: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 7a  * If argument pz
6090: 54 61 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Tab is not NULL,
60a0: 20 74 68 65 6e 20 2a 70 7a 54 61 62 20 69 73 20   then *pzTab is 
60b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
60c0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
60d0: 74 65 64 20 75 74 66 2d 38 20 65 6e 63 6f 64 65  ted utf-8 encode
60e0: 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
60f0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
6100: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 61 66 66  the table.** aff
6110: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
6120: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 54 68 65  rent change. The
6130: 20 62 75 66 66 65 72 20 72 65 6d 61 69 6e 73 20   buffer remains 
6140: 76 61 6c 69 64 20 75 6e 74 69 6c 20 65 69 74 68  valid until eith
6150: 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68 61  er.** sqlite3cha
6160: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20 69 73  ngeset_next() is
6170: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 69   called on the i
6180: 74 65 72 61 74 6f 72 20 6f 72 20 75 6e 74 69 6c  terator or until
6190: 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 66 6c 69 63   the .** conflic
61a0: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
61b0: 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 20 70  on returns. If p
61c0: 6e 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nCol is not NULL
61d0: 2c 20 74 68 65 6e 20 2a 70 6e 43 6f 6c 20 69 73  , then *pnCol is
61e0: 20 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20   .** set to the 
61f0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6200: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  s in the table a
6210: 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20 63  ffected by the c
6220: 68 61 6e 67 65 2e 20 49 66 0a 2a 2a 20 70 62 49  hange. If.** pbI
6230: 6e 64 69 72 65 63 74 20 69 73 20 6e 6f 74 20 4e  ndirect is not N
6240: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 62 49 6e 64  ULL, then *pbInd
6250: 69 72 65 63 74 20 69 73 20 73 65 74 20 74 6f 20  irect is set to 
6260: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20  true (1) if the 
6270: 63 68 61 6e 67 65 0a 2a 2a 20 69 73 20 61 6e 20  change.** is an 
6280: 69 6e 64 69 72 65 63 74 20 63 68 61 6e 67 65 2c  indirect change,
6290: 20 6f 72 20 66 61 6c 73 65 20 28 30 29 20 6f 74   or false (0) ot
62a0: 68 65 72 77 69 73 65 2e 20 53 65 65 20 74 68 65  herwise. See the
62b0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
62c0: 6f 72 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65  or.** [sqlite3se
62d0: 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 29  ssion_indirect()
62e0: 5d 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ] for a descript
62f0: 69 6f 6e 20 6f 66 20 64 69 72 65 63 74 20 61 6e  ion of direct an
6300: 64 20 69 6e 64 69 72 65 63 74 0a 2a 2a 20 63 68  d indirect.** ch
6310: 61 6e 67 65 73 2e 20 46 69 6e 61 6c 6c 79 2c 20  anges. Finally, 
6320: 69 66 20 70 4f 70 20 69 73 20 6e 6f 74 20 4e 55  if pOp is not NU
6330: 4c 4c 2c 20 74 68 65 6e 20 2a 70 4f 70 20 69 73  LL, then *pOp is
6340: 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f 66 20 0a   set to one of .
6350: 2a 2a 20 5b 53 51 4c 49 54 45 5f 49 4e 53 45 52  ** [SQLITE_INSER
6360: 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 44 45 4c 45  T], [SQLITE_DELE
6370: 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 55  TE] or [SQLITE_U
6380: 50 44 41 54 45 5d 2c 20 64 65 70 65 6e 64 69 6e  PDATE], dependin
6390: 67 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 74 79 70  g on the .** typ
63a0: 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68 61 74  e of change that
63b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
63c0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
63d0: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  o..**.** If no e
63e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
63f0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6400: 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
6410: 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 0a 2a  does occur, an.*
6420: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
6430: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6440: 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   The values of t
6450: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
6460: 6c 65 73 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62  les may not.** b
6470: 65 20 74 72 75 73 74 65 64 20 69 6e 20 74 68 69  e trusted in thi
6480: 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
6490: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
64a0: 6f 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  op(.  sqlite3_ch
64b0: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
64c0: 74 65 72 2c 20 20 2f 2a 20 49 74 65 72 61 74 6f  ter,  /* Iterato
64d0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
64e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 62  nst char **pzTab
64f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6500: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
6510: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
6520: 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   int *pnCol,    
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
6550: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  of columns in ta
6560: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ble */.  int *pO
6570: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
6590: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
65a0: 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
65b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 64   */.  int *pbInd
65c0: 69 72 65 63 74 20 20 20 20 20 20 20 20 20 20 20  irect           
65d0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
65e0: 75 65 20 66 6f 72 20 61 6e 20 27 69 6e 64 69 72  ue for an 'indir
65f0: 65 63 74 27 20 63 68 61 6e 67 65 20 2a 2f 0a 29  ect' change */.)
6600: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
6610: 46 3a 20 4f 62 74 61 69 6e 20 54 68 65 20 50 72  F: Obtain The Pr
6620: 69 6d 61 72 79 20 4b 65 79 20 44 65 66 69 6e 69  imary Key Defini
6630: 74 69 6f 6e 20 4f 66 20 41 20 54 61 62 6c 65 0a  tion Of A Table.
6640: 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74  ** METHOD: sqlit
6650: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
6660: 72 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  r.**.** For each
6670: 20 6d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 2c   modified table,
6680: 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 63   a changeset inc
6690: 6c 75 64 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ludes the follow
66a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  ing:.**.** <ul>.
66b0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6e 75  **   <li> The nu
66c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
66d0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e  in the table, an
66e0: 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 57 68 69 63  d.**   <li> Whic
66f0: 68 20 6f 66 20 74 68 6f 73 65 20 63 6f 6c 75 6d  h of those colum
6700: 6e 73 20 6d 61 6b 65 20 75 70 20 74 68 65 20 74  ns make up the t
6710: 61 62 6c 65 73 20 50 52 49 4d 41 52 59 20 4b 45  ables PRIMARY KE
6720: 59 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  Y..** </ul>.**.*
6730: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6740: 69 73 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20  is used to find 
6750: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 63 6f  which columns co
6760: 6d 70 72 69 73 65 20 74 68 65 20 50 52 49 4d 41  mprise the PRIMA
6770: 52 59 20 4b 45 59 20 6f 66 0a 2a 2a 20 74 68 65  RY KEY of.** the
6780: 20 74 61 62 6c 65 20 6d 6f 64 69 66 69 65 64 20   table modified 
6790: 62 79 20 74 68 65 20 63 68 61 6e 67 65 20 74 68  by the change th
67a0: 61 74 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  at iterator pIte
67b0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
67c0: 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 20 73 75 63  ts to..** If suc
67d0: 63 65 73 73 66 75 6c 2c 20 2a 70 61 62 50 4b 20  cessful, *pabPK 
67e0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
67f0: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  to an array of n
6800: 43 6f 6c 20 65 6e 74 72 69 65 73 2c 20 77 68 65  Col entries, whe
6810: 72 65 0a 2a 2a 20 6e 43 6f 6c 20 69 73 20 74 68  re.** nCol is th
6820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
6830: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
6840: 2e 20 45 6c 65 6d 65 6e 74 73 20 6f 66 20 2a 70  . Elements of *p
6850: 61 62 50 4b 20 61 72 65 20 73 65 74 20 74 6f 0a  abPK are set to.
6860: 2a 2a 20 30 78 30 31 20 69 66 20 74 68 65 20 63  ** 0x01 if the c
6870: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
6880: 75 6d 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74  umn is part of t
6890: 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72  he tables primar
68a0: 79 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 30 78 30  y key, or.** 0x0
68b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  0 if it is not..
68c0: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
68d0: 74 20 70 6e 43 6f 6c 20 69 73 20 6e 6f 74 20 4e  t pnCol is not N
68e0: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 43 6f 6c  ULL, then *pnCol
68f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6900: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
6910: 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
6920: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
6930: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6940: 65 64 20 77 68 65 6e 20 74 68 65 20 69 74 65 72  ed when the iter
6950: 61 74 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f  ator does not po
6960: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a  int to a valid.*
6970: 2a 20 65 6e 74 72 79 2c 20 53 51 4c 49 54 45 5f  * entry, SQLITE_
6980: 4d 49 53 55 53 45 20 69 73 20 72 65 74 75 72 6e  MISUSE is return
6990: 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
69a0: 74 20 76 61 72 69 61 62 6c 65 73 20 7a 65 72 6f  t variables zero
69b0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ed. Otherwise,.*
69c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
69d0: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
69e0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
69f0: 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20 64 65   populated as de
6a00: 73 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65  scribed.** above
6a10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a20: 63 68 61 6e 67 65 73 65 74 5f 70 6b 28 0a 20 20  changeset_pk(.  
6a30: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
6a40: 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20  t_iter *pIter,  
6a50: 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65  /* Iterator obje
6a60: 63 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ct */.  unsigned
6a70: 20 63 68 61 72 20 2a 2a 70 61 62 50 4b 2c 20 20   char **pabPK,  
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
6a90: 41 72 72 61 79 20 6f 66 20 62 6f 6f 6c 65 61 6e  Array of boolean
6aa0: 20 2d 20 74 72 75 65 20 66 6f 72 20 50 4b 20 63   - true for PK c
6ab0: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ols */.  int *pn
6ac0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
6ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
6ae0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
6af0: 65 73 20 69 6e 20 6f 75 74 70 75 74 20 61 72 72  es in output arr
6b00: 61 79 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ay */.);../*.** 
6b10: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
6b20: 20 6f 6c 64 2e 2a 20 56 61 6c 75 65 73 20 46 72   old.* Values Fr
6b30: 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20 49  om A Changeset I
6b40: 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f  terator.** METHO
6b50: 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  D: sqlite3_chang
6b60: 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20  eset_iter.**.** 
6b70: 54 68 65 20 70 49 74 65 72 20 61 72 67 75 6d 65  The pIter argume
6b80: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
6b90: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65  s function may e
6ba0: 69 74 68 65 72 20 62 65 20 61 6e 20 69 74 65 72  ither be an iter
6bb0: 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 74  ator.** passed t
6bc0: 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  o a conflict-han
6bd0: 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74 65 33  dler by [sqlite3
6be0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
6bf0: 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72 61 74  )], or an iterat
6c00: 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  or.** created by
6c10: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
6c20: 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49 6e 20  et_start()]. In 
6c30: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 2c  the latter case,
6c40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6c50: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c  .** call to [sql
6c60: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
6c70: 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76 65 20  xt()] must have 
6c80: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
6c90: 52 4f 57 2e 20 0a 2a 2a 20 46 75 72 74 68 65 72  ROW. .** Further
6ca0: 6d 6f 72 65 2c 20 69 74 20 6d 61 79 20 6f 6e 6c  more, it may onl
6cb0: 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  y be called if t
6cc0: 68 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67  he type of chang
6cd0: 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  e that the itera
6ce0: 74 6f 72 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  tor.** currently
6cf0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 65 69   points to is ei
6d00: 74 68 65 72 20 5b 53 51 4c 49 54 45 5f 44 45 4c  ther [SQLITE_DEL
6d10: 45 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ETE] or [SQLITE_
6d20: 55 50 44 41 54 45 5d 2e 20 4f 74 68 65 72 77 69  UPDATE]. Otherwi
6d30: 73 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  se,.** this func
6d40: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51  tion returns [SQ
6d50: 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 61 6e 64  LITE_MISUSE] and
6d60: 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20 74   sets *ppValue t
6d70: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72  o NULL..**.** Ar
6d80: 67 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74  gument iVal must
6d90: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
6da0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20   or equal to 0, 
6db0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68  and less than th
6dc0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
6dd0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
6de0: 62 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20  ble affected by 
6df0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
6e00: 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ge. Otherwise,.*
6e10: 2a 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d  * [SQLITE_RANGE]
6e20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
6e30: 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65 74   *ppValue is set
6e40: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
6e50: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
6e60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
6e70: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f  s *ppValue to po
6e80: 69 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74  int to a protect
6e90: 65 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61  ed.** sqlite3_va
6ea0: 6c 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  lue object conta
6eb0: 69 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74  ining the iVal't
6ec0: 68 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  h value from the
6ed0: 20 76 65 63 74 6f 72 20 6f 66 20 0a 2a 2a 20 6f   vector of .** o
6ee0: 72 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75  riginal row valu
6ef0: 65 73 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  es stored as par
6f00: 74 20 6f 66 20 74 68 65 20 55 50 44 41 54 45 20  t of the UPDATE 
6f10: 6f 72 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  or DELETE change
6f20: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 73 20   and.** returns 
6f30: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 6e  SQLITE_OK. The n
6f40: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
6f50: 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
6f60: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 69  he fact that thi
6f70: 73 20 0a 2a 2a 20 69 73 20 73 69 6d 69 6c 61 72  s .** is similar
6f80: 20 74 6f 20 74 68 65 20 22 6f 6c 64 2e 2a 22 20   to the "old.*" 
6f90: 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62 6c  columns availabl
6fa0: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
6fb0: 65 6c 65 74 65 20 74 72 69 67 67 65 72 73 2e 0a  elete triggers..
6fc0: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
6fd0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
6fe0: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
6ff0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
7000: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
7010: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
7020: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
7030: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
7040: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
7050: 65 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69 74 65  et_old(.  sqlite
7060: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
7070: 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61   *pIter,  /* Cha
7080: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
7090: 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c 20 20  */.  int iVal,  
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
70c0: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
70d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c  e3_value **ppVal
70e0: 75 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ue         /* OU
70f0: 54 3a 20 4f 6c 64 20 76 61 6c 75 65 20 28 6f 72  T: Old value (or
7100: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 29 20 2a   NULL pointer) *
7110: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
7120: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6e 65 77  3REF: Obtain new
7130: 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  .* Values From A
7140: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
7150: 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  tor.** METHOD: s
7160: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7170: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _iter.**.** The 
7180: 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70  pIter argument p
7190: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
71a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65  nction may eithe
71b0: 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72  r be an iterator
71c0: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20  .** passed to a 
71d0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
71e0: 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   by [sqlite3chan
71f0: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20  geset_apply()], 
7200: 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a  or an iterator.*
7210: 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71  * created by [sq
7220: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
7230: 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20  tart()]. In the 
7240: 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68 65  latter case, the
7250: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
7260: 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33  call to [sqlite3
7270: 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29  changeset_next()
7280: 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74 75  ] must have retu
7290: 72 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e  rned SQLITE_ROW.
72a0: 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65   .** Furthermore
72b0: 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65  , it may only be
72c0: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 74   called if the t
72d0: 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68  ype of change th
72e0: 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  at the iterator.
72f0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
7300: 6e 74 73 20 74 6f 20 69 73 20 65 69 74 68 65 72  nts to is either
7310: 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54 45 5d   [SQLITE_UPDATE]
7320: 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49 4e 53 45   or [SQLITE_INSE
7330: 52 54 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  RT]. Otherwise,.
7340: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
7350: 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45   returns [SQLITE
7360: 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20 73 65 74  _MISUSE] and set
7370: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e 55  s *ppValue to NU
7380: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  LL..**.** Argume
7390: 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65 20  nt iVal must be 
73a0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
73b0: 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20  equal to 0, and 
73c0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75  less than the nu
73d0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mber.** of colum
73e0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
73f0: 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20  affected by the 
7400: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e 20  current change. 
7410: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53  Otherwise,.** [S
7420: 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73 20  QLITE_RANGE] is 
7430: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
7440: 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  Value is set to 
7450: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  NULL..**.** If s
7460: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
7470: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
7480: 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20  pValue to point 
7490: 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a 2a  to a protected.*
74a0: 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  * sqlite3_value 
74b0: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
74c0: 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76 61  g the iVal'th va
74d0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 76 65 63  lue from the vec
74e0: 74 6f 72 20 6f 66 20 0a 2a 2a 20 6e 65 77 20 72  tor of .** new r
74f0: 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  ow values stored
7500: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
7510: 55 50 44 41 54 45 20 6f 72 20 49 4e 53 45 52 54  UPDATE or INSERT
7520: 20 63 68 61 6e 67 65 20 61 6e 64 0a 2a 2a 20 72   change and.** r
7530: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
7540: 2e 20 49 66 20 74 68 65 20 63 68 61 6e 67 65 20  . If the change 
7550: 69 73 20 61 6e 20 55 50 44 41 54 45 20 61 6e 64  is an UPDATE and
7560: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
7570: 65 0a 2a 2a 20 61 20 6e 65 77 20 76 61 6c 75 65  e.** a new value
7580: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
7590: 65 64 20 63 6f 6c 75 6d 6e 2c 20 2a 70 70 56 61  ed column, *ppVa
75a0: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
75b0: 4c 4c 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  LL and .** SQLIT
75c0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
75d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
75e0: 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  unction comes fr
75f0: 6f 6d 20 74 68 65 20 66 61 63 74 20 74 68 61 74  om the fact that
7600: 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 73 69 6d   .** this is sim
7610: 69 6c 61 72 20 74 6f 20 74 68 65 20 22 6e 65 77  ilar to the "new
7620: 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69  .*" columns avai
7630: 6c 61 62 6c 65 20 74 6f 20 75 70 64 61 74 65 20  lable to update 
7640: 6f 72 20 64 65 6c 65 74 65 20 0a 2a 2a 20 74 72  or delete .** tr
7650: 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  iggers..**.** If
7660: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
7670: 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61  r occurs (e.g. a
7680: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29  n OOM condition)
7690: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
76a0: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
76b0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
76c0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
76d0: 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  L..*/.int sqlite
76e0: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 0a  3changeset_new(.
76f0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
7700: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
7710: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69    /* Changeset i
7720: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
7730: 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   iVal,          
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7750: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f  Column number */
7760: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7770: 20 2a 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20   **ppValue      
7780: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76     /* OUT: New v
7790: 61 6c 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f  alue (or NULL po
77a0: 69 6e 74 65 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a  inter) */.);../*
77b0: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
77c0: 74 61 69 6e 20 43 6f 6e 66 6c 69 63 74 69 6e 67  tain Conflicting
77d0: 20 52 6f 77 20 56 61 6c 75 65 73 20 46 72 6f 6d   Row Values From
77e0: 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65   A Changeset Ite
77f0: 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a  rator.** METHOD:
7800: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
7810: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68  et_iter.**.** Th
7820: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7830: 6c 64 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ld only be used 
7840: 77 69 74 68 20 69 74 65 72 61 74 6f 72 20 6f 62  with iterator ob
7850: 6a 65 63 74 73 20 70 61 73 73 65 64 20 74 6f 20  jects passed to 
7860: 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61  a.** conflict-ha
7870: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 62  ndler callback b
7880: 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  y [sqlite3change
7890: 73 65 74 5f 61 70 70 6c 79 28 29 5d 20 77 69 74  set_apply()] wit
78a0: 68 20 65 69 74 68 65 72 0a 2a 2a 20 5b 53 51 4c  h either.** [SQL
78b0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
78c0: 54 41 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 43  TA] or [SQLITE_C
78d0: 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43  HANGESET_CONFLIC
78e0: 54 5d 2e 20 49 66 20 74 68 69 73 20 66 75 6e 63  T]. If this func
78f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
7900: 64 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 69  d on any other i
7910: 74 65 72 61 74 6f 72 2c 20 5b 53 51 4c 49 54 45  terator, [SQLITE
7920: 5f 4d 49 53 55 53 45 5d 20 69 73 20 72 65 74 75  _MISUSE] is retu
7930: 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75  rned and *ppValu
7940: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 4e  e.** is set to N
7950: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ULL..**.** Argum
7960: 65 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65  ent iVal must be
7970: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
7980: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64   equal to 0, and
7990: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e   less than the n
79a0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75  umber.** of colu
79b0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
79c0: 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65   affected by the
79d0: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e   current change.
79e0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b   Otherwise,.** [
79f0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73  SQLITE_RANGE] is
7a00: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
7a10: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
7a20: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
7a30: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
7a40: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
7a50: 70 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74  ppValue to point
7a60: 20 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a   to a protected.
7a70: 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ** sqlite3_value
7a80: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   object containi
7a90: 6e 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76  ng the iVal'th v
7aa0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  alue from the .*
7ab0: 2a 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  * "conflicting r
7ac0: 6f 77 22 20 61 73 73 6f 63 69 61 74 65 64 20 77  ow" associated w
7ad0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
7ae0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
7af0: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64   callback.** and
7b00: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
7b10: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d  OK..**.** If som
7b20: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  e other error oc
7b30: 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
7b40: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e  M condition), an
7b50: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7b60: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7b70: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
7b80: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
7b90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7ba0: 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 28  ngeset_conflict(
7bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
7bc0: 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
7bd0: 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20  ,  /* Changeset 
7be0: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
7bf0: 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20 20  t iVal,         
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c10: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a   Column number *
7c20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
7c30: 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20 20 20  e **ppValue     
7c40: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
7c50: 65 20 66 72 6f 6d 20 63 6f 6e 66 6c 69 63 74 69  e from conflicti
7c60: 6e 67 20 72 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f 2a  ng row */.);../*
7c70: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65  .** CAPI3REF: De
7c80: 74 65 72 6d 69 6e 65 20 54 68 65 20 4e 75 6d 62  termine The Numb
7c90: 65 72 20 4f 66 20 46 6f 72 65 69 67 6e 20 4b 65  er Of Foreign Ke
7ca0: 79 20 43 6f 6e 73 74 72 61 69 6e 74 20 56 69 6f  y Constraint Vio
7cb0: 6c 61 74 69 6f 6e 73 0a 2a 2a 20 4d 45 54 48 4f  lations.** METHO
7cc0: 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  D: sqlite3_chang
7cd0: 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20  eset_iter.**.** 
7ce0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
7cf0: 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
7d00: 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f   with an iterato
7d10: 72 20 70 61 73 73 65 64 20 74 6f 20 61 6e 0a 2a  r passed to an.*
7d20: 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  * SQLITE_CHANGES
7d30: 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 63  ET_FOREIGN_KEY c
7d40: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
7d50: 63 61 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  callback. In thi
7d60: 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 73 65 74  s case.** it set
7d70: 73 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  s the output var
7d80: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 74 6f 74  iable to the tot
7d90: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 6e 6f  al number of kno
7da0: 77 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a  wn foreign key.*
7db0: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e 20  * violations in 
7dc0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
7dd0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74  database and ret
7de0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
7df0: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  **.** In all oth
7e00: 65 72 20 63 61 73 65 73 20 74 68 69 73 20 66 75  er cases this fu
7e10: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
7e20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f  QLITE_MISUSE..*/
7e30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
7e40: 67 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63  geset_fk_conflic
7e50: 74 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  ts(.  sqlite3_ch
7e60: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
7e70: 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ter,  /* Changes
7e80: 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  et iterator */. 
7e90: 20 69 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20   int *pnOut     
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
7ec0: 6f 66 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  of FK violations
7ed0: 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43   */.);.../*.** C
7ee0: 41 50 49 33 52 45 46 3a 20 46 69 6e 61 6c 69 7a  API3REF: Finaliz
7ef0: 65 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74  e A Changeset It
7f00: 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44  erator.** METHOD
7f10: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
7f20: 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54  set_iter.**.** T
7f30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7f40: 75 73 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  used to finalize
7f50: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 6c 6c   an iterator all
7f60: 6f 63 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 5b  ocated with.** [
7f70: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
7f80: 5f 73 74 61 72 74 28 29 5d 2e 0a 2a 2a 0a 2a 2a  _start()]..**.**
7f90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
7fa0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7fb0: 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72  lled on iterator
7fc0: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
7fd0: 74 68 65 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63  the.** [sqlite3c
7fe0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29  hangeset_start()
7ff0: 5d 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61  ] function. If a
8000: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  n application ca
8010: 6c 6c 73 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  lls this.** func
8020: 74 69 6f 6e 20 77 69 74 68 20 61 6e 20 69 74 65  tion with an ite
8030: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
8040: 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  a conflict-handl
8050: 65 72 20 62 79 0a 2a 2a 20 5b 73 71 6c 69 74 65  er by.** [sqlite
8060: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
8070: 28 29 5d 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53  ()], [SQLITE_MIS
8080: 55 53 45 5d 20 69 73 20 69 6d 6d 65 64 69 61 74  USE] is immediat
8090: 65 6c 79 20 72 65 74 75 72 6e 65 64 20 61 6e 64  ely returned and
80a0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 68 61 73   the.** call has
80b0: 20 6e 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a   no effect..**.*
80c0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 77 61  * If an error wa
80d0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 69  s encountered wi
80e0: 74 68 69 6e 20 61 20 63 61 6c 6c 20 74 6f 20 61  thin a call to a
80f0: 6e 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  n sqlite3changes
8100: 65 74 5f 78 78 78 28 29 0a 2a 2a 20 66 75 6e 63  et_xxx().** func
8110: 74 69 6f 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c  tion (for exampl
8120: 65 20 61 6e 20 5b 53 51 4c 49 54 45 5f 43 4f 52  e an [SQLITE_COR
8130: 52 55 50 54 5d 20 69 6e 20 5b 73 71 6c 69 74 65  RUPT] in [sqlite
8140: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
8150: 29 5d 20 6f 72 20 61 6e 20 0a 2a 2a 20 5b 53 51  )] or an .** [SQ
8160: 4c 49 54 45 5f 4e 4f 4d 45 4d 5d 20 69 6e 20 5b  LITE_NOMEM] in [
8170: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
8180: 5f 6e 65 77 28 29 5d 29 20 74 68 65 6e 20 61 6e  _new()]) then an
8190: 20 65 72 72 6f 72 20 63 6f 64 65 20 63 6f 72 72   error code corr
81a0: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
81b0: 74 68 61 74 20 65 72 72 6f 72 20 69 73 20 72 65  that error is re
81c0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
81d0: 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69  unction. Otherwi
81e0: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
81f0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 54 68  .** returned. Th
8200: 69 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77 20 74  is is to allow t
8210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74  he following pat
8220: 74 65 72 6e 20 28 70 73 65 75 64 6f 2d 63 6f 64  tern (pseudo-cod
8230: 65 29 3a 0a 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a  e):.**.** <pre>.
8240: 2a 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e  **   sqlite3chan
8250: 67 65 73 65 74 5f 73 74 61 72 74 28 29 3b 0a 2a  geset_start();.*
8260: 2a 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  *   while( SQLIT
8270: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 63 68  E_ROW==sqlite3ch
8280: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20 29  angeset_next() )
8290: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73  {.**     // Do s
82a0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 63 68  omething with ch
82b0: 61 6e 67 65 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  ange..**   }.** 
82c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68    rc = sqlite3ch
82d0: 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65  angeset_finalize
82e0: 28 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 21  ();.**   if( rc!
82f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a  =SQLITE_OK ){.**
8300: 20 20 20 20 20 2f 2f 20 41 6e 20 65 72 72 6f 72       // An error
8310: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 0a 2a   has occurred .*
8320: 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70 72 65 3e 0a  *   }.** </pre>.
8330: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
8340: 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65  angeset_finalize
8350: 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
8360: 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 29 3b  et_iter *pIter);
8370: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
8380: 3a 20 49 6e 76 65 72 74 20 41 20 43 68 61 6e 67  : Invert A Chang
8390: 65 73 65 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eset.**.** This 
83a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
83b0: 20 74 6f 20 22 69 6e 76 65 72 74 22 20 61 20 63   to "invert" a c
83c0: 68 61 6e 67 65 73 65 74 20 6f 62 6a 65 63 74 2e  hangeset object.
83d0: 20 41 70 70 6c 79 69 6e 67 20 61 6e 20 69 6e 76   Applying an inv
83e0: 65 72 74 65 64 0a 2a 2a 20 63 68 61 6e 67 65 73  erted.** changes
83f0: 65 74 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  et to a database
8400: 20 72 65 76 65 72 73 65 73 20 74 68 65 20 65 66   reverses the ef
8410: 66 65 63 74 73 20 6f 66 20 61 70 70 6c 79 69 6e  fects of applyin
8420: 67 20 74 68 65 20 75 6e 69 6e 76 65 72 74 65 64  g the uninverted
8430: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 2e 20 53  .** changeset. S
8440: 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a  pecifically:.**.
8450: 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ul>.**   <li
8460: 3e 20 45 61 63 68 20 44 45 4c 45 54 45 20 63 68  > Each DELETE ch
8470: 61 6e 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  ange is changed 
8480: 74 6f 20 61 6e 20 49 4e 53 45 52 54 2c 20 61 6e  to an INSERT, an
8490: 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61 63 68  d.**   <li> Each
84a0: 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 69   INSERT change i
84b0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 44  s changed to a D
84c0: 45 4c 45 54 45 2c 20 61 6e 64 0a 2a 2a 20 20 20  ELETE, and.**   
84d0: 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 55 50  <li> For each UP
84e0: 44 41 54 45 20 63 68 61 6e 67 65 2c 20 74 68 65  DATE change, the
84f0: 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a   old.* and new.*
8500: 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 63 68   values are exch
8510: 61 6e 67 65 64 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a  anged..** </ul>.
8520: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
8530: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  ion does not cha
8540: 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e  nge the order in
8550: 20 77 68 69 63 68 20 63 68 61 6e 67 65 73 20 61   which changes a
8560: 70 70 65 61 72 20 77 69 74 68 69 6e 0a 2a 2a 20  ppear within.** 
8570: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 49  the changeset. I
8580: 74 20 6d 65 72 65 6c 79 20 72 65 76 65 72 73 65  t merely reverse
8590: 73 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 65  s the sense of e
85a0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63  ach individual c
85b0: 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hange..**.** If 
85c0: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
85d0: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
85e0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
85f0: 20 69 6e 76 65 72 74 65 64 20 63 68 61 6e 67 65   inverted change
8600: 73 65 74 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  set.** is stored
8610: 20 69 6e 20 2a 70 70 4f 75 74 2c 20 74 68 65 20   in *ppOut, the 
8620: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 61 6d 65  size of the same
8630: 20 62 75 66 66 65 72 20 69 73 20 73 74 6f 72 65   buffer is store
8640: 64 20 69 6e 20 2a 70 6e 4f 75 74 2c 20 61 6e 64  d in *pnOut, and
8650: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
8660: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
8670: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62   error occurs, b
8680: 6f 74 68 20 2a 70 6e 4f 75 74 20 61 6e 64 20 2a  oth *pnOut and *
8690: 70 70 4f 75 74 20 61 72 65 0a 2a 2a 20 7a 65 72  ppOut are.** zer
86a0: 6f 65 64 20 61 6e 64 20 61 6e 20 53 51 4c 69 74  oed and an SQLit
86b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
86c0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  urned..**.** It 
86d0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
86e0: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
86f0: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8700: 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
8710: 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ree().** on the 
8720: 2a 70 70 4f 75 74 20 70 6f 69 6e 74 65 72 20 74  *ppOut pointer t
8730: 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
8740: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 6c  r allocation fol
8750: 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73  lowing a success
8760: 66 75 6c 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ful .** call to 
8770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8780: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 2f 54 4f 44  *.** WARNING/TOD
8790: 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
87a0: 20 63 75 72 72 65 6e 74 6c 79 20 61 73 73 75 6d   currently assum
87b0: 65 73 20 74 68 61 74 20 74 68 65 20 69 6e 70 75  es that the inpu
87c0: 74 20 69 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20  t is a valid.** 
87d0: 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 69 74  changeset. If it
87e0: 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65 73   is not, the res
87f0: 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e  ults are undefin
8800: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8810: 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  e3changeset_inve
8820: 72 74 28 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 63  rt(.  int nIn, c
8830: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c 20  onst void *pIn, 
8840: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
8850: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e  hangeset */.  in
8860: 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20 2a  t *pnOut, void *
8870: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *ppOut        /*
8880: 20 4f 55 54 3a 20 49 6e 76 65 72 73 65 20 6f 66   OUT: Inverse of
8890: 20 69 6e 70 75 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a   input */.);../*
88a0: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f  .** CAPI3REF: Co
88b0: 6e 63 61 74 65 6e 61 74 65 20 54 77 6f 20 43 68  ncatenate Two Ch
88c0: 61 6e 67 65 73 65 74 20 4f 62 6a 65 63 74 73 0a  angeset Objects.
88d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
88e0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
88f0: 6f 6e 63 61 74 65 6e 61 74 65 20 74 77 6f 20 63  oncatenate two c
8900: 68 61 6e 67 65 73 65 74 73 2c 20 41 20 61 6e 64  hangesets, A and
8910: 20 42 2c 20 69 6e 74 6f 20 61 20 0a 2a 2a 20 73   B, into a .** s
8920: 69 6e 67 6c 65 20 63 68 61 6e 67 65 73 65 74 2e  ingle changeset.
8930: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
8940: 20 63 68 61 6e 67 65 73 65 74 20 65 71 75 69 76   changeset equiv
8950: 61 6c 65 6e 74 20 74 6f 20 61 70 70 6c 79 69 6e  alent to applyin
8960: 67 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 41  g.** changeset A
8970: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 63 68 61   followed by cha
8980: 6e 67 65 73 65 74 20 42 2e 20 0a 2a 2a 0a 2a 2a  ngeset B. .**.**
8990: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
89a0: 6f 6d 62 69 6e 65 73 20 74 68 65 20 74 77 6f 20  ombines the two 
89b0: 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 73  input changesets
89c0: 20 75 73 69 6e 67 20 61 6e 20 0a 2a 2a 20 73 71   using an .** sq
89d0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
89e0: 70 20 6f 62 6a 65 63 74 2e 20 43 61 6c 6c 69 6e  p object. Callin
89f0: 67 20 69 74 20 70 72 6f 64 75 63 65 73 20 73 69  g it produces si
8a00: 6d 69 6c 61 72 20 72 65 73 75 6c 74 73 20 61 73  milar results as
8a10: 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
8a20: 67 20 63 6f 64 65 20 66 72 61 67 6d 65 6e 74 3a  g code fragment:
8a30: 0a 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20  .**.** <pre>.** 
8a40: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
8a50: 67 72 6f 75 70 20 2a 70 47 72 70 3b 0a 2a 2a 20  group *pGrp;.** 
8a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
8a70: 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28 26  hangegroup_new(&
8a80: 70 47 72 70 29 3b 0a 2a 2a 20 20 20 69 66 28 20  pGrp);.**   if( 
8a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8aa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
8ab0: 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72 70  gegroup_add(pGrp
8ac0: 2c 20 6e 41 2c 20 70 41 29 3b 0a 2a 2a 20 20 20  , nA, pA);.**   
8ad0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8ae0: 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
8af0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 28  changegroup_add(
8b00: 70 47 72 70 2c 20 6e 42 2c 20 70 42 29 3b 0a 2a  pGrp, nB, pB);.*
8b10: 2a 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  *   if( rc==SQLI
8b20: 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20 20  TE_OK ){.**     
8b30: 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
8b40: 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 70  gegroup_output(p
8b50: 47 72 70 2c 20 70 6e 4f 75 74 2c 20 70 70 4f 75  Grp, pnOut, ppOu
8b60: 74 29 3b 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a  t);.**   }else{.
8b70: 2a 2a 20 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  **     *ppOut = 
8b80: 30 3b 0a 2a 2a 20 20 20 20 20 2a 70 6e 4f 75 74  0;.**     *pnOut
8b90: 20 3d 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 20   = 0;.**   }.** 
8ba0: 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 52 65 66  </pre>.**.** Ref
8bb0: 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  er to the sqlite
8bc0: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 64 6f  3_changegroup do
8bd0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  cumentation belo
8be0: 77 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  w for details..*
8bf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
8c00: 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 28 0a 20  ngeset_concat(. 
8c10: 20 69 6e 74 20 6e 41 2c 20 20 20 20 20 20 20 20   int nA,        
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
8c40: 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 70 41  tes in buffer pA
8c50: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 2c 20   */.  void *pA, 
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8c80: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
8c90: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20  ining changeset 
8ca0: 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 2c 20 20  A */.  int nB,  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8cd0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66   of bytes in buf
8ce0: 66 65 72 20 70 42 20 2a 2f 0a 20 20 76 6f 69 64  fer pB */.  void
8cf0: 20 2a 70 42 2c 20 20 20 20 20 20 20 20 20 20 20   *pB,           
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8d10: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
8d20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
8d30: 67 65 73 65 74 20 42 20 2a 2f 0a 20 20 69 6e 74  geset B */.  int
8d40: 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20 20 20   *pnOut,        
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d60: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  OUT: Number of b
8d70: 79 74 65 73 20 69 6e 20 6f 75 74 70 75 74 20 63  ytes in output c
8d80: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f  hangeset */.  vo
8d90: 69 64 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  id **ppOut      
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8db0: 20 4f 55 54 3a 20 42 75 66 66 65 72 20 63 6f 6e   OUT: Buffer con
8dc0: 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20 63  taining output c
8dd0: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a  hangeset */.);..
8de0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
8df0: 20 43 68 61 6e 67 65 67 72 6f 75 70 20 48 61 6e   Changegroup Han
8e00: 64 6c 65 0a 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e  dle.**.** A chan
8e10: 67 65 67 72 6f 75 70 20 69 73 20 61 6e 20 6f 62  gegroup is an ob
8e20: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 6f 6d  ject used to com
8e30: 62 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  bine two or more
8e40: 20 0a 2a 2a 20 5b 63 68 61 6e 67 65 73 65 74 73   .** [changesets
8e50: 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 73 5d  ] or [patchsets]
8e60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
8e70: 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ct sqlite3_chang
8e80: 65 67 72 6f 75 70 20 73 71 6c 69 74 65 33 5f 63  egroup sqlite3_c
8e90: 68 61 6e 67 65 67 72 6f 75 70 3b 0a 0a 2f 2a 0a  hangegroup;../*.
8ea0: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 72 65  ** CAPI3REF: Cre
8eb0: 61 74 65 20 41 20 4e 65 77 20 43 68 61 6e 67 65  ate A New Change
8ec0: 67 72 6f 75 70 20 4f 62 6a 65 63 74 0a 2a 2a 20  group Object.** 
8ed0: 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20 73 71 6c  CONSTRUCTOR: sql
8ee0: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
8ef0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 73 71 6c 69 74 65  .**.** An sqlite
8f00: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  3_changegroup ob
8f10: 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20  ject is used to 
8f20: 63 6f 6d 62 69 6e 65 20 74 77 6f 20 6f 72 20 6d  combine two or m
8f30: 6f 72 65 20 63 68 61 6e 67 65 73 65 74 73 0a 2a  ore changesets.*
8f40: 2a 20 28 6f 72 20 70 61 74 63 68 73 65 74 73 29  * (or patchsets)
8f50: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63   into a single c
8f60: 68 61 6e 67 65 73 65 74 20 28 6f 72 20 70 61 74  hangeset (or pat
8f70: 63 68 73 65 74 29 2e 20 41 20 73 69 6e 67 6c 65  chset). A single
8f80: 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 20   changegroup.** 
8f90: 6f 62 6a 65 63 74 20 6d 61 79 20 63 6f 6d 62 69  object may combi
8fa0: 6e 65 20 63 68 61 6e 67 65 73 65 74 73 20 6f 72  ne changesets or
8fb0: 20 70 61 74 63 68 73 65 74 73 2c 20 62 75 74 20   patchsets, but 
8fc0: 6e 6f 74 20 62 6f 74 68 2e 20 54 68 65 20 6f 75  not both. The ou
8fd0: 74 70 75 74 20 69 73 0a 2a 2a 20 61 6c 77 61 79  tput is.** alway
8fe0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 6f  s in the same fo
8ff0: 72 6d 61 74 20 61 73 20 74 68 65 20 69 6e 70 75  rmat as the inpu
9000: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
9010: 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
9020: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
9030: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 70 6f 70 75  LITE_OK and popu
9040: 6c 61 74 65 73 20 28 2a 70 70 29 20 77 69 74 68  lates (*pp) with
9050: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
9060: 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 63   a new sqlite3_c
9070: 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63  hangegroup objec
9080: 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
9090: 6e 67 2e 20 54 68 65 20 63 61 6c 6c 65 72 0a 2a  ng. The caller.*
90a0: 2a 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  * should eventua
90b0: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65 74  lly free the ret
90c0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 75 73 69  urned object usi
90d0: 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a  ng a call to .**
90e0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
90f0: 6f 75 70 5f 64 65 6c 65 74 65 28 29 2e 20 49 66  oup_delete(). If
9100: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9110: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
9120: 72 20 63 6f 64 65 0a 2a 2a 20 28 69 2e 65 2e 20  r code.** (i.e. 
9130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 73  SQLITE_NOMEM) is
9140: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
9150: 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
9160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 75 61  ..**.** The usua
9170: 6c 20 75 73 61 67 65 20 70 61 74 74 65 72 6e 20  l usage pattern 
9180: 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 63  for an sqlite3_c
9190: 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63  hangegroup objec
91a0: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
91b0: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
91c0: 20 3c 6c 69 3e 20 49 74 20 69 73 20 63 72 65 61   <li> It is crea
91d0: 74 65 64 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  ted using a call
91e0: 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67   to sqlite3chang
91f0: 65 67 72 6f 75 70 5f 6e 65 77 28 29 2e 0a 2a 2a  egroup_new()..**
9200: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5a 65 72 6f 20  .**   <li> Zero 
9210: 6f 72 20 6d 6f 72 65 20 63 68 61 6e 67 65 73 65  or more changese
9220: 74 73 20 28 6f 72 20 70 61 74 63 68 73 65 74 73  ts (or patchsets
9230: 29 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  ) are added to t
9240: 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  he object.**    
9250: 20 20 20 20 62 79 20 63 61 6c 6c 69 6e 67 20 73      by calling s
9260: 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
9270: 70 5f 61 64 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  p_add()..**.**  
9280: 20 3c 6c 69 3e 20 54 68 65 20 72 65 73 75 6c 74   <li> The result
9290: 20 6f 66 20 63 6f 6d 62 69 6e 69 6e 67 20 61 6c   of combining al
92a0: 6c 20 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65  l input changese
92b0: 74 73 20 74 6f 67 65 74 68 65 72 20 69 73 20 6f  ts together is o
92c0: 62 74 61 69 6e 65 64 20 0a 2a 2a 20 20 20 20 20  btained .**     
92d0: 20 20 20 62 79 20 74 68 65 20 61 70 70 6c 69 63     by the applic
92e0: 61 74 69 6f 6e 20 76 69 61 20 61 20 63 61 6c 6c  ation via a call
92f0: 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67   to sqlite3chang
9300: 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 29 2e  egroup_output().
9310: 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68  .**.**   <li> Th
9320: 65 20 6f 62 6a 65 63 74 20 69 73 20 64 65 6c 65  e object is dele
9330: 74 65 64 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  ted using a call
9340: 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67   to sqlite3chang
9350: 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28 29 2e  egroup_delete().
9360: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
9370: 41 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  Any number of ca
9380: 6c 6c 73 20 74 6f 20 61 64 64 28 29 20 61 6e 64  lls to add() and
9390: 20 6f 75 74 70 75 74 28 29 20 6d 61 79 20 62 65   output() may be
93a0: 20 6d 61 64 65 20 62 65 74 77 65 65 6e 20 74 68   made between th
93b0: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 6e 65  e calls to.** ne
93c0: 77 28 29 20 61 6e 64 20 64 65 6c 65 74 65 28 29  w() and delete()
93d0: 2c 20 61 6e 64 20 69 6e 20 61 6e 79 20 6f 72 64  , and in any ord
93e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  er..**.** As wel
93f0: 6c 20 61 73 20 74 68 65 20 72 65 67 75 6c 61 72  l as the regular
9400: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
9410: 6f 75 70 5f 61 64 64 28 29 20 61 6e 64 20 0a 2a  oup_add() and .*
9420: 2a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  * sqlite3changeg
9430: 72 6f 75 70 5f 6f 75 74 70 75 74 28 29 20 66 75  roup_output() fu
9440: 6e 63 74 69 6f 6e 73 2c 20 61 6c 73 6f 20 61 76  nctions, also av
9450: 61 69 6c 61 62 6c 65 20 61 72 65 20 74 68 65 20  ailable are the 
9460: 73 74 72 65 61 6d 69 6e 67 0a 2a 2a 20 76 65 72  streaming.** ver
9470: 73 69 6f 6e 73 20 73 71 6c 69 74 65 33 63 68 61  sions sqlite3cha
9480: 6e 67 65 67 72 6f 75 70 5f 61 64 64 5f 73 74 72  ngegroup_add_str
9490: 6d 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 63  m() and sqlite3c
94a0: 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75  hangegroup_outpu
94b0: 74 5f 73 74 72 6d 28 29 2e 0a 2a 2f 0a 69 6e 74  t_strm()..*/.int
94c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
94d0: 6f 75 70 5f 6e 65 77 28 73 71 6c 69 74 65 33 5f  oup_new(sqlite3_
94e0: 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 2a 70 70  changegroup **pp
94f0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  );../*.** CAPI3R
9500: 45 46 3a 20 41 64 64 20 41 20 43 68 61 6e 67 65  EF: Add A Change
9510: 73 65 74 20 54 6f 20 41 20 43 68 61 6e 67 65 67  set To A Changeg
9520: 72 6f 75 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20  roup.** METHOD: 
9530: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
9540: 6f 75 70 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 6c  oup.**.** Add al
9550: 6c 20 63 68 61 6e 67 65 73 20 77 69 74 68 69 6e  l changes within
9560: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 28   the changeset (
9570: 6f 72 20 70 61 74 63 68 73 65 74 29 20 69 6e 20  or patchset) in 
9580: 62 75 66 66 65 72 20 70 44 61 74 61 20 28 73 69  buffer pData (si
9590: 7a 65 0a 2a 2a 20 6e 44 61 74 61 20 62 79 74 65  ze.** nData byte
95a0: 73 29 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  s) to the change
95b0: 67 72 6f 75 70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  group. .**.** If
95c0: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74   the buffer cont
95d0: 61 69 6e 73 20 61 20 70 61 74 63 68 73 65 74 2c  ains a patchset,
95e0: 20 74 68 65 6e 20 61 6c 6c 20 70 72 69 6f 72 20   then all prior 
95f0: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 66 75  calls to this fu
9600: 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65  nction.** on the
9610: 20 73 61 6d 65 20 63 68 61 6e 67 65 67 72 6f 75   same changegrou
9620: 70 20 6f 62 6a 65 63 74 20 6d 75 73 74 20 61 6c  p object must al
9630: 73 6f 20 68 61 76 65 20 73 70 65 63 69 66 69 65  so have specifie
9640: 64 20 70 61 74 63 68 73 65 74 73 2e 20 4f 72 2c  d patchsets. Or,
9650: 20 69 66 0a 2a 2a 20 74 68 65 20 62 75 66 66 65   if.** the buffe
9660: 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 68 61  r contains a cha
9670: 6e 67 65 73 65 74 2c 20 73 6f 20 6d 75 73 74 20  ngeset, so must 
9680: 68 61 76 65 20 74 68 65 20 65 61 72 6c 69 65 72  have the earlier
9690: 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 0a 2a   calls to this.*
96a0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  * function. Othe
96b0: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 45 52  rwise, SQLITE_ER
96c0: 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64 20  ROR is returned 
96d0: 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  and no changes a
96e0: 72 65 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  re added.** to t
96f0: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a  he changegroup..
9700: 2a 2a 0a 2a 2a 20 52 6f 77 73 20 77 69 74 68 69  **.** Rows withi
9710: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  n the changeset 
9720: 61 6e 64 20 63 68 61 6e 67 65 67 72 6f 75 70 20  and changegroup 
9730: 61 72 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  are identified b
9740: 79 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 0a  y the values in.
9750: 2a 2a 20 74 68 65 69 72 20 50 52 49 4d 41 52 59  ** their PRIMARY
9760: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 20 41 20   KEY columns. A 
9770: 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68  change in the ch
9780: 61 6e 67 65 73 65 74 20 69 73 20 63 6f 6e 73 69  angeset is consi
9790: 64 65 72 65 64 20 74 6f 0a 2a 2a 20 61 70 70 6c  dered to.** appl
97a0: 79 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f  y to the same ro
97b0: 77 20 61 73 20 61 20 63 68 61 6e 67 65 20 61 6c  w as a change al
97c0: 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e  ready present in
97d0: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
97e0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 77 6f 20 72   if.** the two r
97f0: 6f 77 73 20 68 61 76 65 20 74 68 65 20 73 61 6d  ows have the sam
9800: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
9810: 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 74 6f 20  *.** Changes to 
9820: 72 6f 77 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  rows that do not
9830: 20 61 6c 72 65 61 64 79 20 61 70 70 65 61 72 20   already appear 
9840: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  in the changegro
9850: 75 70 20 61 72 65 0a 2a 2a 20 73 69 6d 70 6c 79  up are.** simply
9860: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 69 74 2e   copied into it.
9870: 20 4f 72 2c 20 69 66 20 62 6f 74 68 20 74 68 65   Or, if both the
9880: 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20 61   new changeset a
9890: 6e 64 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  nd the changegro
98a0: 75 70 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 63 68  up.** contain ch
98b0: 61 6e 67 65 73 20 74 68 61 74 20 61 70 70 6c 79  anges that apply
98c0: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   to a single row
98d0: 2c 20 74 68 65 20 66 69 6e 61 6c 20 63 6f 6e 74  , the final cont
98e0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ents of the.** c
98f0: 68 61 6e 67 65 67 72 6f 75 70 20 64 65 70 65 6e  hangegroup depen
9900: 64 73 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f  ds on the type o
9910: 66 20 65 61 63 68 20 63 68 61 6e 67 65 2c 20 61  f each change, a
9920: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
9930: 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 31   <table border=1
9940: 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c   style="margin-l
9950: 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d 72  eft:8ex;margin-r
9960: 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20 20  ight:8ex">.**   
9970: 3c 74 72 3e 3c 74 68 20 73 74 79 6c 65 3d 22 77  <tr><th style="w
9980: 68 69 74 65 2d 73 70 61 63 65 3a 70 72 65 22 3e  hite-space:pre">
9990: 45 78 69 73 74 69 6e 67 20 43 68 61 6e 67 65 20  Existing Change 
99a0: 20 3c 2f 74 68 3e 0a 2a 2a 20 20 20 20 20 20 20   </th>.**       
99b0: 3c 74 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65  <th style="white
99c0: 2d 73 70 61 63 65 3a 70 72 65 22 3e 4e 65 77 20  -space:pre">New 
99d0: 43 68 61 6e 67 65 20 20 20 20 20 20 20 3c 2f 74  Change       </t
99e0: 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68 3e  h>.**       <th>
99f0: 4f 75 74 70 75 74 20 43 68 61 6e 67 65 0a 2a 2a  Output Change.**
9a00: 20 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53 45 52     <tr><td>INSER
9a10: 54 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64  T <td>INSERT <td
9a20: 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6e  >.**       The n
9a30: 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67 6e  ew change is ign
9a40: 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65 20  ored. This case 
9a50: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 69  does not occur i
9a60: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20 20  f the new.**    
9a70: 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61 73     changeset was
9a80: 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64 69   recorded immedi
9a90: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
9aa0: 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65 61  changesets alrea
9ab0: 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64 65  dy.**       adde
9ac0: 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  d to the changeg
9ad0: 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c  roup..**   <tr><
9ae0: 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 55 50  td>INSERT <td>UP
9af0: 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20  DATE <td>.**    
9b00: 20 20 20 54 68 65 20 49 4e 53 45 52 54 20 63 68     The INSERT ch
9b10: 61 6e 67 65 20 72 65 6d 61 69 6e 73 20 69 6e 20  ange remains in 
9b20: 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e  the changegroup.
9b30: 20 54 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74   The values in t
9b40: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 49 4e 53  he .**       INS
9b50: 45 52 54 20 63 68 61 6e 67 65 20 61 72 65 20 6d  ERT change are m
9b60: 6f 64 69 66 69 65 64 20 61 73 20 69 66 20 74 68  odified as if th
9b70: 65 20 72 6f 77 20 77 61 73 20 69 6e 73 65 72 74  e row was insert
9b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 20  ed by the.**    
9b90: 20 20 20 65 78 69 73 74 69 6e 67 20 63 68 61 6e     existing chan
9ba0: 67 65 20 61 6e 64 20 74 68 65 6e 20 75 70 64 61  ge and then upda
9bb0: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
9bc0: 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 2e   the new change.
9bd0: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49 4e  .**   <tr><td>IN
9be0: 53 45 52 54 20 3c 74 64 3e 44 45 4c 45 54 45 20  SERT <td>DELETE 
9bf0: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68  <td>.**       Th
9c00: 65 20 65 78 69 73 74 69 6e 67 20 49 4e 53 45 52  e existing INSER
9c10: 54 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  T is removed fro
9c20: 6d 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  m the changegrou
9c30: 70 2e 20 54 68 65 20 44 45 4c 45 54 45 20 69 73  p. The DELETE is
9c40: 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 20 61 64  .**       not ad
9c50: 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  ded..**   <tr><t
9c60: 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 49 4e 53  d>UPDATE <td>INS
9c70: 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20  ERT <td>.**     
9c80: 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65    The new change
9c90: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54 68 69   is ignored. Thi
9ca0: 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  s case does not 
9cb0: 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e 65 77  occur if the new
9cc0: 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65  .**       change
9cd0: 73 65 74 20 77 61 73 20 72 65 63 6f 72 64 65 64  set was recorded
9ce0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
9cf0: 65 72 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  er the changeset
9d00: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  s already.**    
9d10: 20 20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20     added to the 
9d20: 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20  changegroup..** 
9d30: 20 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54 45    <tr><td>UPDATE
9d40: 20 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e   <td>UPDATE <td>
9d50: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78  .**       The ex
9d60: 69 73 74 69 6e 67 20 55 50 44 41 54 45 20 72 65  isting UPDATE re
9d70: 6d 61 69 6e 73 20 77 69 74 68 69 6e 20 74 68 65  mains within the
9d80: 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 49 74   changegroup. It
9d90: 20 69 73 20 61 6d 65 6e 64 65 64 20 0a 2a 2a 20   is amended .** 
9da0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
9db0: 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e 67 20 76  e accompanying v
9dc0: 61 6c 75 65 73 20 61 72 65 20 61 73 20 69 66 20  alues are as if 
9dd0: 74 68 65 20 72 6f 77 20 77 61 73 20 75 70 64 61  the row was upda
9de0: 74 65 64 20 6f 6e 63 65 20 0a 2a 2a 20 20 20 20  ted once .**    
9df0: 20 20 20 62 79 20 74 68 65 20 65 78 69 73 74 69     by the existi
9e00: 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20 74 68  ng change and th
9e10: 65 6e 20 61 67 61 69 6e 20 62 79 20 74 68 65 20  en again by the 
9e20: 6e 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 20  new change..**  
9e30: 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54 45 20   <tr><td>UPDATE 
9e40: 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 0a  <td>DELETE <td>.
9e50: 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78 69  **       The exi
9e60: 73 74 69 6e 67 20 55 50 44 41 54 45 20 69 73 20  sting UPDATE is 
9e70: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
9e80: 6e 65 77 20 44 45 4c 45 54 45 20 77 69 74 68 69  new DELETE withi
9e90: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 63  n the.**       c
9ea0: 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 20  hangegroup..**  
9eb0: 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45 20   <tr><td>DELETE 
9ec0: 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a  <td>INSERT <td>.
9ed0: 2a 2a 20 20 20 20 20 20 20 49 66 20 6f 6e 65 20  **       If one 
9ee0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 63  or more of the c
9ef0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 69 6e 20  olumn values in 
9f00: 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74 65 64  the row inserted
9f10: 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   by the.**      
9f20: 20 6e 65 77 20 63 68 61 6e 67 65 20 64 69 66 66   new change diff
9f30: 65 72 20 66 72 6f 6d 20 74 68 6f 73 65 20 69 6e  er from those in
9f40: 20 74 68 65 20 72 6f 77 20 64 65 6c 65 74 65 64   the row deleted
9f50: 20 62 79 20 74 68 65 20 65 78 69 73 74 69 6e 67   by the existing
9f60: 20 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67   .**       chang
9f70: 65 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  e, the existing 
9f80: 44 45 4c 45 54 45 20 69 73 20 72 65 70 6c 61 63  DELETE is replac
9f90: 65 64 20 62 79 20 61 6e 20 55 50 44 41 54 45 20  ed by an UPDATE 
9fa0: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 20 20  within the.**   
9fb0: 20 20 20 20 63 68 61 6e 67 65 67 72 6f 75 70 2e      changegroup.
9fc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
9fd0: 68 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77 20  he inserted row 
9fe0: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
9ff0: 61 6d 65 20 0a 2a 2a 20 20 20 20 20 20 20 61 73  ame .**       as
a000: 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 77   the deleted row
a010: 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 44  , the existing D
a020: 45 4c 45 54 45 20 69 73 20 73 69 6d 70 6c 79 20  ELETE is simply 
a030: 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 20 20 20  discarded..**   
a040: 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45 20 3c  <tr><td>DELETE <
a050: 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a  td>UPDATE <td>.*
a060: 2a 20 20 20 20 20 20 20 54 68 65 20 6e 65 77 20  *       The new 
a070: 63 68 61 6e 67 65 20 69 73 20 69 67 6e 6f 72 65  change is ignore
a080: 64 2e 20 54 68 69 73 20 63 61 73 65 20 64 6f 65  d. This case doe
a090: 73 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20 74  s not occur if t
a0a0: 68 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20  he new.**       
a0b0: 63 68 61 6e 67 65 73 65 74 20 77 61 73 20 72 65  changeset was re
a0c0: 63 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74 65  corded immediate
a0d0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ly after the cha
a0e0: 6e 67 65 73 65 74 73 20 61 6c 72 65 61 64 79 0a  ngesets already.
a0f0: 2a 2a 20 20 20 20 20 20 20 61 64 64 65 64 20 74  **       added t
a100: 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  o the changegrou
a110: 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  p..**   <tr><td>
a120: 44 45 4c 45 54 45 20 3c 74 64 3e 44 45 4c 45 54  DELETE <td>DELET
a130: 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20  E <td>.**       
a140: 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 20 69  The new change i
a150: 73 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20  s ignored. This 
a160: 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  case does not oc
a170: 63 75 72 20 69 66 20 74 68 65 20 6e 65 77 0a 2a  cur if the new.*
a180: 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 65  *       changese
a190: 74 20 77 61 73 20 72 65 63 6f 72 64 65 64 20 69  t was recorded i
a1a0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
a1b0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20   the changesets 
a1c0: 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 20  already.**      
a1d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68   added to the ch
a1e0: 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 3c 2f  angegroup..** </
a1f0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
a200: 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65  the new changese
a210: 74 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 6e 67  t contains chang
a220: 65 73 20 74 6f 20 61 20 74 61 62 6c 65 20 74 68  es to a table th
a230: 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  at is already pr
a240: 65 73 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65 20  esent.** in the 
a250: 63 68 61 6e 67 65 67 72 6f 75 70 2c 20 74 68 65  changegroup, the
a260: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
a270: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
a280: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 0a  position of the.
a290: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63  ** primary key c
a2a0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 74  olumns for the t
a2b0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63 6f 6e  able must be con
a2c0: 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73  sistent. If this
a2d0: 20 69 73 20 6e 6f 74 20 74 68 65 0a 2a 2a 20 63   is not the.** c
a2e0: 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
a2f0: 6f 6e 20 66 61 69 6c 73 20 77 69 74 68 20 53 51  on fails with SQ
a300: 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 49 66 20  LITE_SCHEMA. If 
a310: 74 68 65 20 69 6e 70 75 74 20 63 68 61 6e 67 65  the input change
a320: 73 65 74 0a 2a 2a 20 61 70 70 65 61 72 73 20 74  set.** appears t
a330: 6f 20 62 65 20 63 6f 72 72 75 70 74 20 61 6e 64  o be corrupt and
a340: 20 74 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20   the corruption 
a350: 69 73 20 64 65 74 65 63 74 65 64 2c 20 53 51 4c  is detected, SQL
a360: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 0a 2a  ITE_CORRUPT is.*
a370: 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  * returned. Or, 
a380: 69 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  if an out-of-mem
a390: 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  ory condition oc
a3a0: 63 75 72 73 20 64 75 72 69 6e 67 20 70 72 6f 63  curs during proc
a3b0: 65 73 73 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20  essing, this.** 
a3c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a3d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49   SQLITE_NOMEM. I
a3e0: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 69 66 20  n all cases, if 
a3f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
a400: 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 63 6f 6e  the.** final con
a410: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 61  tents of the cha
a420: 6e 67 65 67 72 6f 75 70 20 69 73 20 75 6e 64 65  ngegroup is unde
a430: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fined..**.** If 
a440: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
a450: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
a460: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
a470: 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
a480: 70 5f 61 64 64 28 73 71 6c 69 74 65 33 5f 63 68  p_add(sqlite3_ch
a490: 61 6e 67 65 67 72 6f 75 70 2a 2c 20 69 6e 74 20  angegroup*, int 
a4a0: 6e 44 61 74 61 2c 20 76 6f 69 64 20 2a 70 44 61  nData, void *pDa
a4b0: 74 61 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  ta);../*.** CAPI
a4c0: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 41 20 43  3REF: Obtain A C
a4d0: 6f 6d 70 6f 73 69 74 65 20 43 68 61 6e 67 65 73  omposite Changes
a4e0: 65 74 20 46 72 6f 6d 20 41 20 43 68 61 6e 67 65  et From A Change
a4f0: 67 72 6f 75 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a  group.** METHOD:
a500: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
a510: 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69  roup.**.** Obtai
a520: 6e 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  n a buffer conta
a530: 69 6e 69 6e 67 20 61 20 63 68 61 6e 67 65 73 65  ining a changese
a540: 74 20 28 6f 72 20 70 61 74 63 68 73 65 74 29 20  t (or patchset) 
a550: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
a560: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  .** current cont
a570: 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 61 6e  ents of the chan
a580: 67 65 67 72 6f 75 70 2e 20 49 66 20 74 68 65 20  gegroup. If the 
a590: 69 6e 70 75 74 73 20 74 6f 20 74 68 65 20 63 68  inputs to the ch
a5a0: 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 77 65 72  angegroup.** wer
a5b0: 65 20 74 68 65 6d 73 65 6c 76 65 73 20 63 68 61  e themselves cha
a5c0: 6e 67 65 73 65 74 73 2c 20 74 68 65 20 6f 75 74  ngesets, the out
a5d0: 70 75 74 20 69 73 20 61 20 63 68 61 6e 67 65 73  put is a changes
a5e0: 65 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 2a  et. Or, if the.*
a5f0: 2a 20 69 6e 70 75 74 73 20 77 65 72 65 20 70 61  * inputs were pa
a600: 74 63 68 73 65 74 73 2c 20 74 68 65 20 6f 75 74  tchsets, the out
a610: 70 75 74 20 69 73 20 61 6c 73 6f 20 61 20 70 61  put is also a pa
a620: 74 63 68 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 73  tchset..**.** As
a630: 20 77 69 74 68 20 74 68 65 20 6f 75 74 70 75 74   with the output
a640: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 73   of the sqlite3s
a650: 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
a660: 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
a670: 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
a680: 74 28 29 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61  t() functions, a
a690: 6c 6c 20 63 68 61 6e 67 65 73 20 72 65 6c 61 74  ll changes relat
a6a0: 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  ed to a single.*
a6b0: 2a 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f 75  * table are grou
a6c0: 70 65 64 20 74 6f 67 65 74 68 65 72 20 69 6e 20  ped together in 
a6d0: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
a6e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 61 62  is function. Tab
a6f0: 6c 65 73 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e  les appear.** in
a700: 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20   the same order 
a710: 61 73 20 66 6f 72 20 74 68 65 20 76 65 72 79 20  as for the very 
a720: 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 20  first changeset 
a730: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
a740: 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 49 66 20  ngegroup..** If 
a750: 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
a760: 62 73 65 71 75 65 6e 74 20 63 68 61 6e 67 65 73  bsequent changes
a770: 65 74 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  ets added to the
a780: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 63 6f 6e   changegroup con
a790: 74 61 69 6e 0a 2a 2a 20 63 68 61 6e 67 65 73 20  tain.** changes 
a7a0: 66 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  for tables that 
a7b0: 64 6f 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  do not appear in
a7c0: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e 67   the first chang
a7d0: 65 73 65 74 2c 20 74 68 65 79 20 61 72 65 0a 2a  eset, they are.*
a7e0: 2a 20 61 70 70 65 6e 64 65 64 20 6f 6e 74 6f 20  * appended onto 
a7f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
a800: 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74 2c  utput changeset,
a810: 20 61 67 61 69 6e 20 69 6e 20 74 68 65 20 6f 72   again in the or
a820: 64 65 72 20 69 6e 0a 2a 2a 20 77 68 69 63 68 20  der in.** which 
a830: 74 68 65 79 20 61 72 65 20 66 69 72 73 74 20 65  they are first e
a840: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
a850: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
a860: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
a870: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
a880: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
a890: 75 74 70 75 74 0a 2a 2a 20 76 61 72 69 61 62 6c  utput.** variabl
a8a0: 65 73 20 28 2a 70 6e 44 61 74 61 29 20 61 6e 64  es (*pnData) and
a8b0: 20 28 2a 70 70 44 61 74 61 29 20 61 72 65 20 73   (*ppData) are s
a8c0: 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69  et to 0. Otherwi
a8d0: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  se, SQLITE_OK.**
a8e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
a8f0: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
a900: 61 62 6c 65 73 20 61 72 65 20 73 65 74 20 74 6f  ables are set to
a910: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 64   the size of and
a920: 20 61 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74   a .** pointer t
a930: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
a940: 66 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c  fer, respectivel
a950: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
a960: 69 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  it is the.** res
a970: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
a980: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
a990: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
a9a0: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 61 0a   buffer using a.
a9b0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
a9c0: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
a9d0: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  t sqlite3changeg
a9e0: 72 6f 75 70 5f 6f 75 74 70 75 74 28 0a 20 20 73  roup_output(.  s
a9f0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
aa00: 75 70 2a 2c 0a 20 20 69 6e 74 20 2a 70 6e 44 61  up*,.  int *pnDa
aa10: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
aa20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
aa30: 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
aa40: 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
aa50: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 44 61 74 61  .  void **ppData
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
aa80: 65 72 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  er to output buf
aa90: 66 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  fer */.);../*.**
aaa0: 20 43 41 50 49 33 52 45 46 3a 20 44 65 6c 65 74   CAPI3REF: Delet
aab0: 65 20 41 20 43 68 61 6e 67 65 67 72 6f 75 70 20  e A Changegroup 
aac0: 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52 55  Object.** DESTRU
aad0: 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 63 68  CTOR: sqlite3_ch
aae0: 61 6e 67 65 67 72 6f 75 70 0a 2a 2f 0a 76 6f 69  angegroup.*/.voi
aaf0: 64 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  d sqlite3changeg
ab00: 72 6f 75 70 5f 64 65 6c 65 74 65 28 73 71 6c 69  roup_delete(sqli
ab10: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a  te3_changegroup*
ab20: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  );../*.** CAPI3R
ab30: 45 46 3a 20 41 70 70 6c 79 20 41 20 43 68 61 6e  EF: Apply A Chan
ab40: 67 65 73 65 74 20 54 6f 20 41 20 44 61 74 61 62  geset To A Datab
ab50: 61 73 65 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20  ase.**.** Apply 
ab60: 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70  a changeset or p
ab70: 61 74 63 68 73 65 74 20 74 6f 20 61 20 64 61 74  atchset to a dat
ab80: 61 62 61 73 65 2e 20 54 68 65 73 65 20 66 75 6e  abase. These fun
ab90: 63 74 69 6f 6e 73 20 61 74 74 65 6d 70 74 20 74  ctions attempt t
aba0: 6f 0a 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20  o.** update the 
abb0: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 20  "main" database 
abc0: 61 74 74 61 63 68 65 64 20 74 6f 20 68 61 6e 64  attached to hand
abd0: 6c 65 20 64 62 20 77 69 74 68 20 74 68 65 20 63  le db with the c
abe0: 68 61 6e 67 65 73 20 66 6f 75 6e 64 20 69 6e 0a  hanges found in.
abf0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  ** the changeset
ac00: 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
ac10: 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
ac20: 20 61 72 67 75 6d 65 6e 74 73 2e 20 0a 2a 2a 0a   arguments. .**.
ac30: 2a 2a 20 54 68 65 20 66 6f 75 72 74 68 20 61 72  ** The fourth ar
ac40: 67 75 6d 65 6e 74 20 28 78 46 69 6c 74 65 72 29  gument (xFilter)
ac50: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 73 65   passed to these
ac60: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74 68   functions is th
ac70: 65 20 22 66 69 6c 74 65 72 0a 2a 2a 20 63 61 6c  e "filter.** cal
ac80: 6c 62 61 63 6b 22 2e 20 49 66 20 69 74 20 69 73  lback". If it is
ac90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
aca0: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 61  for each table a
acb0: 66 66 65 63 74 65 64 20 62 79 20 61 74 20 6c 65  ffected by at le
acc0: 61 73 74 20 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67  ast one.** chang
acd0: 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  e in the changes
ace0: 65 74 2c 20 74 68 65 20 66 69 6c 74 65 72 20 63  et, the filter c
acf0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
ad00: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 74  ed with.** the t
ad10: 61 62 6c 65 20 6e 61 6d 65 20 61 73 20 74 68 65  able name as the
ad20: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
ad30: 2c 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  , and a copy of 
ad40: 74 68 65 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e  the context poin
ad50: 74 65 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  ter.** passed as
ad60: 20 74 68 65 20 73 69 78 74 68 20 61 72 67 75 6d   the sixth argum
ad70: 65 6e 74 20 61 73 20 74 68 65 20 66 69 72 73 74  ent as the first
ad80: 2e 20 49 66 20 74 68 65 20 22 66 69 6c 74 65 72  . If the "filter
ad90: 20 63 61 6c 6c 62 61 63 6b 22 0a 2a 2a 20 72 65   callback".** re
ada0: 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
adb0: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
adc0: 61 64 65 20 74 6f 20 61 70 70 6c 79 20 61 6e 79  ade to apply any
add0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
ade0: 74 61 62 6c 65 2e 0a 2a 2a 20 4f 74 68 65 72 77  table..** Otherw
adf0: 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 74 75  ise, if the retu
ae00: 72 6e 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  rn value is non-
ae10: 7a 65 72 6f 20 6f 72 20 74 68 65 20 78 46 69 6c  zero or the xFil
ae20: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a  ter argument to.
ae30: 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20  ** is NULL, all 
ae40: 63 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20  changes related 
ae50: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  to the table are
ae60: 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a   attempted..**.*
ae70: 2a 20 46 6f 72 20 65 61 63 68 20 74 61 62 6c 65  * For each table
ae80: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 65 78 63   that is not exc
ae90: 6c 75 64 65 64 20 62 79 20 74 68 65 20 66 69 6c  luded by the fil
aea0: 74 65 72 20 63 61 6c 6c 62 61 63 6b 2c 20 74 68  ter callback, th
aeb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
aec0: 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20 74  tests that the t
aed0: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63  arget database c
aee0: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 70 61 74  ontains a compat
aef0: 69 62 6c 65 20 74 61 62 6c 65 2e 20 41 20 74 61  ible table. A ta
af00: 62 6c 65 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  ble is .** consi
af10: 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65  dered compatible
af20: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
af30: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
af40: 65 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a  e:.**.** <ul>.**
af50: 20 20 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c     <li> The tabl
af60: 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  e has the same n
af70: 61 6d 65 20 61 73 20 74 68 65 20 6e 61 6d 65 20  ame as the name 
af80: 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20  recorded in the 
af90: 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67  .**        chang
afa0: 65 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c  eset, and.**   <
afb0: 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61  li> The table ha
afc0: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61  s at least as ma
afd0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 72 65  ny columns as re
afe0: 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a 2a  corded in the .*
aff0: 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  *        changes
b000: 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69  et, and.**   <li
b010: 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61 73 20  > The table has 
b020: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
b030: 6d 6e 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  mns in the same 
b040: 70 6f 73 69 74 69 6f 6e 20 61 73 20 0a 2a 2a 20  position as .** 
b050: 20 20 20 20 20 20 20 72 65 63 6f 72 64 65 64 20         recorded 
b060: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
b070: 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a  ..** </ul>.**.**
b080: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
b090: 63 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65  compatible table
b0a0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  , it is not an e
b0b0: 72 72 6f 72 2c 20 62 75 74 20 6e 6f 6e 65 20 6f  rror, but none o
b0c0: 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73  f the.** changes
b0d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
b0e0: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 61   the table are a
b0f0: 70 70 6c 69 65 64 2e 20 41 20 77 61 72 6e 69 6e  pplied. A warnin
b100: 67 20 6d 65 73 73 61 67 65 20 69 73 20 69 73 73  g message is iss
b110: 75 65 64 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ued.** via the s
b120: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65 63  qlite3_log() mec
b130: 68 61 6e 69 73 6d 20 77 69 74 68 20 74 68 65 20  hanism with the 
b140: 65 72 72 6f 72 20 63 6f 64 65 20 53 51 4c 49 54  error code SQLIT
b150: 45 5f 53 43 48 45 4d 41 2e 20 41 74 20 6d 6f 73  E_SCHEMA. At mos
b160: 74 0a 2a 2a 20 6f 6e 65 20 73 75 63 68 20 77 61  t.** one such wa
b170: 72 6e 69 6e 67 20 69 73 20 69 73 73 75 65 64 20  rning is issued 
b180: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
b190: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
b1a0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
b1b0: 63 68 61 6e 67 65 20 66 6f 72 20 77 68 69 63 68  change for which
b1c0: 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6d 70   there is a comp
b1d0: 61 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 61 6e  atible table, an
b1e0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
b1f0: 20 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 74   .** to modify t
b200: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  he table content
b210: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
b220: 68 65 20 55 50 44 41 54 45 2c 20 49 4e 53 45 52  he UPDATE, INSER
b230: 54 20 6f 72 20 44 45 4c 45 54 45 20 0a 2a 2a 20  T or DELETE .** 
b240: 63 68 61 6e 67 65 2e 20 49 66 20 61 20 63 68 61  change. If a cha
b250: 6e 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 70  nge cannot be ap
b260: 70 6c 69 65 64 20 63 6c 65 61 6e 6c 79 2c 20 74  plied cleanly, t
b270: 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
b280: 6c 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ler .** function
b290: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
b2a0: 69 66 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  ifth argument to
b2b0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
b2c0: 74 5f 61 70 70 6c 79 28 29 20 6d 61 79 20 62 65  t_apply() may be
b2d0: 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 41 20   .** invoked. A 
b2e0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65  description of e
b2f0: 78 61 63 74 6c 79 20 77 68 65 6e 20 74 68 65 20  xactly when the 
b300: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
b310: 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20   is invoked for 
b320: 0a 2a 2a 20 65 61 63 68 20 74 79 70 65 20 6f 66  .** each type of
b330: 20 63 68 61 6e 67 65 20 69 73 20 62 65 6c 6f 77   change is below
b340: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 74  ..**.** Unlike t
b350: 68 65 20 78 46 69 6c 74 65 72 20 61 72 67 75 6d  he xFilter argum
b360: 65 6e 74 2c 20 78 43 6f 6e 66 6c 69 63 74 20 6d  ent, xConflict m
b370: 61 79 20 6e 6f 74 20 62 65 20 70 61 73 73 65 64  ay not be passed
b380: 20 4e 55 4c 4c 2e 20 54 68 65 20 72 65 73 75 6c   NULL. The resul
b390: 74 73 0a 2a 2a 20 6f 66 20 70 61 73 73 69 6e 67  ts.** of passing
b3a0: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
b3b0: 74 68 61 6e 20 61 20 76 61 6c 69 64 20 66 75 6e  than a valid fun
b3c0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61 73  ction pointer as
b3d0: 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 0a 2a   the xConflict.*
b3e0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 75  * argument are u
b3f0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  ndefined..**.** 
b400: 45 61 63 68 20 74 69 6d 65 20 74 68 65 20 63 6f  Each time the co
b410: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66  nflict handler f
b420: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
b430: 65 64 2c 20 69 74 20 6d 75 73 74 20 72 65 74 75  ed, it must retu
b440: 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20 5b 53 51  rn one.** of [SQ
b450: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f  LITE_CHANGESET_O
b460: 4d 49 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 43 48  MIT], [SQLITE_CH
b470: 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 5d 20 6f  ANGESET_ABORT] o
b480: 72 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 48  r .** [SQLITE_CH
b490: 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d  ANGESET_REPLACE]
b4a0: 2e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  . SQLITE_CHANGES
b4b0: 45 54 5f 52 45 50 4c 41 43 45 20 6d 61 79 20 6f  ET_REPLACE may o
b4c0: 6e 6c 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a  nly be returned.
b4d0: 2a 2a 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ** if the second
b4e0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
b4f0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   to the conflict
b500: 20 68 61 6e 64 6c 65 72 20 69 73 20 65 69 74 68   handler is eith
b510: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48 41  er.** SQLITE_CHA
b520: 4e 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 53  NGESET_DATA or S
b530: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
b540: 43 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68 65  CONFLICT. If the
b550: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
b560: 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
b570: 69 6c 6c 65 67 61 6c 20 76 61 6c 75 65 2c 20 61  illegal value, a
b580: 6e 79 20 63 68 61 6e 67 65 73 20 61 6c 72 65 61  ny changes alrea
b590: 64 79 20 6d 61 64 65 20 61 72 65 20 72 6f 6c 6c  dy made are roll
b5a0: 65 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 74  ed back and.** t
b5b0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
b5c0: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
b5d0: 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49  y() returns SQLI
b5e0: 54 45 5f 4d 49 53 55 53 45 2e 20 44 69 66 66 65  TE_MISUSE. Diffe
b5f0: 72 65 6e 74 20 0a 2a 2a 20 61 63 74 69 6f 6e 73  rent .** actions
b600: 20 61 72 65 20 74 61 6b 65 6e 20 62 79 20 73 71   are taken by sq
b610: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
b620: 70 70 6c 79 28 29 20 64 65 70 65 6e 64 69 6e 67  pply() depending
b630: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   on the value.**
b640: 20 72 65 74 75 72 6e 65 64 20 62 79 20 65 61 63   returned by eac
b650: 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  h invocation of 
b660: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  the conflict-han
b670: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 52  dler function. R
b680: 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 64  efer to.** the d
b690: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
b6a0: 20 74 68 65 20 74 68 72 65 65 20 0a 2a 2a 20 5b   the three .** [
b6b0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
b6c0: 5f 4f 4d 49 54 7c 61 76 61 69 6c 61 62 6c 65 20  _OMIT|available 
b6d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 5d 20 66  return values] f
b6e0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  or details..**.*
b6f0: 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 44 45  * <dl>.** <dt>DE
b700: 4c 45 54 45 20 43 68 61 6e 67 65 73 3c 64 64 3e  LETE Changes<dd>
b710: 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20 44  .**   For each D
b720: 45 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 74 68  ELETE change, th
b730: 65 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  e function check
b740: 73 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20  s if the target 
b750: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 63  database .**   c
b760: 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77 69  ontains a row wi
b770: 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69 6d  th the same prim
b780: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20 28 6f  ary key value (o
b790: 72 20 76 61 6c 75 65 73 29 20 61 73 20 74 68 65  r values) as the
b7a0: 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20   .**   original 
b7b0: 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65  row values store
b7c0: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
b7d0: 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  et. If it does, 
b7e0: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 0a  and the values .
b7f0: 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20 61  **   stored in a
b800: 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b  ll non-primary k
b810: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f 20  ey columns also 
b820: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 73  match the values
b830: 20 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a 20 20   stored in .**  
b840: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74   the changeset t
b850: 68 65 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65  he row is delete
b860: 64 20 66 72 6f 6d 20 74 68 65 20 74 61 72 67 65  d from the targe
b870: 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  t database..**.*
b880: 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77 69 74  *   If a row wit
b890: 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d 61  h matching prima
b8a0: 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69 73  ry key values is
b8b0: 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e 65 20   found, but one 
b8c0: 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20 20 20  or more of.**   
b8d0: 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  the non-primary 
b8e0: 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74 61  key fields conta
b8f0: 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66 66  ins a value diff
b900: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
b910: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 72 6f 77  riginal.**   row
b920: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
b930: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
b940: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  the conflict-han
b950: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  dler function is
b960: 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69  .**   invoked wi
b970: 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  th [SQLITE_CHANG
b980: 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68  ESET_DATA] as th
b990: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b9a0: 74 2e 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 64  t. If the.**   d
b9b0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 68 61  atabase table ha
b9c0: 73 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 74  s more columns t
b9d0: 68 61 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64  han are recorded
b9e0: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
b9f0: 74 2c 0a 2a 2a 20 20 20 6f 6e 6c 79 20 74 68 65  t,.**   only the
ba00: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
ba10: 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79   non-primary key
ba20: 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6d 70   fields are comp
ba30: 61 72 65 64 20 61 67 61 69 6e 73 74 0a 2a 2a 20  ared against.** 
ba40: 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61    the current da
ba50: 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 73 20  tabase contents 
ba60: 2d 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 64  - any trailing d
ba70: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 63 6f  atabase table co
ba80: 6c 75 6d 6e 73 0a 2a 2a 20 20 20 61 72 65 20 69  lumns.**   are i
ba90: 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  gnored..**.**   
baa0: 49 66 20 6e 6f 20 72 6f 77 20 77 69 74 68 20 6d  If no row with m
bab0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
bac0: 6b 65 79 20 76 61 6c 75 65 73 20 69 73 20 66 6f  key values is fo
bad0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
bae0: 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65 20 63 6f  ase,.**   the co
baf0: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
bb00: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
bb10: 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f  ed with [SQLITE_
bb20: 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55  CHANGESET_NOTFOU
bb30: 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20  ND].**   passed 
bb40: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
bb50: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  gument..**.**   
bb60: 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 6f 70  If the DELETE op
bb70: 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65 6d  eration is attem
bb80: 70 74 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65  pted, but SQLite
bb90: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
bba0: 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 20 20  CONSTRAINT.**   
bbb0: 28 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20  (which can only 
bbc0: 68 61 70 70 65 6e 20 69 66 20 61 20 66 6f 72 65  happen if a fore
bbd0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
bbe0: 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 29 2c  nt is violated),
bbf0: 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69   the.**   confli
bc00: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
bc10: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
bc20: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
bc30: 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54  GESET_CONSTRAINT
bc40: 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73  ].**   passed as
bc50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
bc60: 6d 65 6e 74 2e 20 54 68 69 73 20 69 6e 63 6c 75  ment. This inclu
bc70: 64 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65  des the case whe
bc80: 72 65 20 74 68 65 20 44 45 4c 45 54 45 0a 2a 2a  re the DELETE.**
bc90: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20     operation is 
bca0: 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75 73  attempted becaus
bcb0: 65 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  e an earlier cal
bcc0: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  l to the conflic
bcd0: 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66  t handler.**   f
bce0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
bcf0: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
bd00: 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a  ET_REPLACE]..**.
bd10: 2a 2a 20 3c 64 74 3e 49 4e 53 45 52 54 20 43 68  ** <dt>INSERT Ch
bd20: 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46  anges<dd>.**   F
bd30: 6f 72 20 65 61 63 68 20 49 4e 53 45 52 54 20 63  or each INSERT c
bd40: 68 61 6e 67 65 2c 20 61 6e 20 61 74 74 65 6d 70  hange, an attemp
bd50: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e 73  t is made to ins
bd60: 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
bd70: 69 6e 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64 61  into.**   the da
bd80: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 63  tabase. If the c
bd90: 68 61 6e 67 65 73 65 74 20 72 6f 77 20 63 6f 6e  hangeset row con
bda0: 74 61 69 6e 73 20 66 65 77 65 72 20 66 69 65 6c  tains fewer fiel
bdb0: 64 73 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 20  ds than the.**  
bdc0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
bdd0: 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 66 69   the trailing fi
bde0: 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
bdf0: 65 64 20 77 69 74 68 20 74 68 65 69 72 20 64 65  ed with their de
be00: 66 61 75 6c 74 0a 2a 2a 20 20 20 76 61 6c 75 65  fault.**   value
be10: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  s..**.**   If th
be20: 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6e 73  e attempt to ins
be30: 65 72 74 20 74 68 65 20 72 6f 77 20 66 61 69 6c  ert the row fail
be40: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 64 61  s because the da
be50: 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 20 0a  tabase already .
be60: 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20  **   contains a 
be70: 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61 6d  row with the sam
be80: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  e primary key va
be90: 6c 75 65 73 2c 20 74 68 65 20 63 6f 6e 66 6c 69  lues, the confli
bea0: 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  ct handler.**   
beb0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
bec0: 6b 65 64 20 77 69 74 68 20 74 68 65 20 73 65 63  ked with the sec
bed0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 65 74  ond argument set
bee0: 20 74 6f 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54   to .**   [SQLIT
bef0: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
bf00: 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  LICT]..**.**   I
bf10: 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
bf20: 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f 77 20   insert the row 
bf30: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
bf40: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 73   some other cons
bf50: 74 72 61 69 6e 74 0a 2a 2a 20 20 20 76 69 6f 6c  traint.**   viol
bf60: 61 74 69 6f 6e 20 28 65 2e 67 2e 20 4e 4f 54 20  ation (e.g. NOT 
bf70: 4e 55 4c 4c 20 6f 72 20 55 4e 49 51 55 45 29 2c  NULL or UNIQUE),
bf80: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   the conflict ha
bf90: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69  ndler function i
bfa0: 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20  s .**   invoked 
bfb0: 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64 20  with the second 
bfc0: 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74 6f 20  argument set to 
bfd0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
bfe0: 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 2e 0a 2a  T_CONSTRAINT]..*
bff0: 2a 20 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65  *   This include
c000: 73 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  s the case where
c010: 20 74 68 65 20 49 4e 53 45 52 54 20 6f 70 65 72   the INSERT oper
c020: 61 74 69 6f 6e 20 69 73 20 72 65 2d 61 74 74 65  ation is re-atte
c030: 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 0a 2a  mpted because .*
c040: 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72 20 63  *   an earlier c
c050: 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c  all to the confl
c060: 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  ict handler func
c070: 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 0a 2a  tion returned .*
c080: 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  *   [SQLITE_CHAN
c090: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a  GESET_REPLACE]..
c0a0: 2a 2a 0a 2a 2a 20 3c 64 74 3e 55 50 44 41 54 45  **.** <dt>UPDATE
c0b0: 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20   Changes<dd>.** 
c0c0: 20 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54    For each UPDAT
c0d0: 45 20 63 68 61 6e 67 65 2c 20 74 68 65 20 66 75  E change, the fu
c0e0: 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
c0f0: 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
c100: 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f 6e 74 61  base .**   conta
c110: 69 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20 74  ins a row with t
c120: 68 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20  he same primary 
c130: 6b 65 79 20 76 61 6c 75 65 20 28 6f 72 20 76 61  key value (or va
c140: 6c 75 65 73 29 20 61 73 20 74 68 65 20 0a 2a 2a  lues) as the .**
c150: 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20     original row 
c160: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
c170: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
c180: 49 66 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 20  If it does, and 
c190: 74 68 65 20 76 61 6c 75 65 73 20 0a 2a 2a 20 20  the values .**  
c1a0: 20 73 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20 6d   stored in all m
c1b0: 6f 64 69 66 69 65 64 20 6e 6f 6e 2d 70 72 69 6d  odified non-prim
c1c0: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
c1d0: 61 6c 73 6f 20 6d 61 74 63 68 20 74 68 65 20 76  also match the v
c1e0: 61 6c 75 65 73 0a 2a 2a 20 20 20 73 74 6f 72 65  alues.**   store
c1f0: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
c200: 65 74 20 74 68 65 20 72 6f 77 20 69 73 20 75 70  et the row is up
c210: 64 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  dated within the
c220: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
c230: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 72  ..**.**   If a r
c240: 6f 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67  ow with matching
c250: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
c260: 75 65 73 20 69 73 20 66 6f 75 6e 64 2c 20 62 75  ues is found, bu
c270: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  t one or more of
c280: 0a 2a 2a 20 20 20 74 68 65 20 6d 6f 64 69 66 69  .**   the modifi
c290: 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b  ed non-primary k
c2a0: 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74 61 69  ey fields contai
c2b0: 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66 66 65  ns a value diffe
c2c0: 72 65 6e 74 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20  rent from an.** 
c2d0: 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20 76    original row v
c2e0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
c2f0: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 74 68  he changeset, th
c300: 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  e conflict-handl
c310: 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  er function.**  
c320: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
c330: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
c340: 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68 65 20  ET_DATA] as the 
c350: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
c360: 20 53 69 6e 63 65 0a 2a 2a 20 20 20 55 50 44 41   Since.**   UPDA
c370: 54 45 20 63 68 61 6e 67 65 73 20 6f 6e 6c 79 20  TE changes only 
c380: 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73 20 66  contain values f
c390: 6f 72 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b  or non-primary k
c3a0: 65 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ey fields that a
c3b0: 72 65 0a 2a 2a 20 20 20 74 6f 20 62 65 20 6d 6f  re.**   to be mo
c3c0: 64 69 66 69 65 64 2c 20 6f 6e 6c 79 20 74 68 6f  dified, only tho
c3d0: 73 65 20 66 69 65 6c 64 73 20 6e 65 65 64 20 74  se fields need t
c3e0: 6f 20 6d 61 74 63 68 20 74 68 65 20 6f 72 69 67  o match the orig
c3f0: 69 6e 61 6c 20 76 61 6c 75 65 73 20 74 6f 0a 2a  inal values to.*
c400: 2a 20 20 20 61 76 6f 69 64 20 74 68 65 20 53 51  *   avoid the SQ
c410: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
c420: 41 54 41 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  ATA conflict-han
c430: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  dler callback..*
c440: 2a 0a 2a 2a 20 20 20 49 66 20 6e 6f 20 72 6f 77  *.**   If no row
c450: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70   with matching p
c460: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
c470: 73 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  s is found in th
c480: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 20  e database,.**  
c490: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
c4a0: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69  ndler function i
c4b0: 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b  s invoked with [
c4c0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
c4d0: 5f 4e 4f 54 46 4f 55 4e 44 5d 0a 2a 2a 20 20 20  _NOTFOUND].**   
c4e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
c4f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
c500: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 55 50  *.**   If the UP
c510: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 69  DATE operation i
c520: 73 20 61 74 74 65 6d 70 74 65 64 2c 20 62 75 74  s attempted, but
c530: 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 73 20   SQLite returns 
c540: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 43 4f 4e  .**   SQLITE_CON
c550: 53 54 52 41 49 4e 54 2c 20 74 68 65 20 63 6f 6e  STRAINT, the con
c560: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66 75  flict-handler fu
c570: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
c580: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 5b 53 51  d with .**   [SQ
c590: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43  LITE_CHANGESET_C
c5a0: 4f 4e 53 54 52 41 49 4e 54 5d 20 70 61 73 73 65  ONSTRAINT] passe
c5b0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
c5c0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 54  argument..**   T
c5d0: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68 65  his includes the
c5e0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
c5f0: 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
c600: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61 66   is attempted af
c610: 74 65 72 20 0a 2a 2a 20 20 20 61 6e 20 65 61 72  ter .**   an ear
c620: 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 74 68 65  lier call to the
c630: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
c640: 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  r function retur
c650: 6e 65 64 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45  ned.**   [SQLITE
c660: 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41  _CHANGESET_REPLA
c670: 43 45 5d 2e 20 20 0a 2a 2a 20 3c 2f 64 6c 3e 0a  CE].  .** </dl>.
c680: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 73 61 66 65  **.** It is safe
c690: 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 20   to execute SQL 
c6a0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e 63 6c  statements, incl
c6b0: 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61 74  uding those that
c6c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a   write to the.**
c6d0: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
c6e0: 63 61 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64  callback related
c6f0: 20 74 6f 2c 20 66 72 6f 6d 20 77 69 74 68 69 6e   to, from within
c700: 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 20 63   the xConflict c
c710: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
c720: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
c730: 66 75 72 74 68 65 72 20 63 75 73 74 6f 6d 69 7a  further customiz
c740: 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
c750: 6e 73 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72  ns conflict.** r
c760: 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65  esolution strate
c770: 67 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 68  gy..**.** All ch
c780: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
c790: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ese functions ar
c7a0: 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 61 20  e enclosed in a 
c7b0: 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
c7c0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ction..** If any
c7d0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 28 61 73   other error (as
c7e0: 69 64 65 20 66 72 6f 6d 20 61 20 63 6f 6e 73 74  ide from a const
c7f0: 72 61 69 6e 74 20 66 61 69 6c 75 72 65 20 77 68  raint failure wh
c800: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
c810: 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
c820: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
c830: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  ) occurs, then t
c840: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61  he savepoint tra
c850: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 72  nsaction is.** r
c860: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 72 65 73 74  olled back, rest
c870: 6f 72 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  oring the target
c880: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
c890: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2c   original state,
c8a0: 20 61 6e 64 20 61 6e 20 0a 2a 2a 20 53 51 4c 69   and an .** SQLi
c8b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  te error code re
c8c0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c8d0: 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
c8e0: 6d 65 74 65 72 73 20 28 70 70 52 65 62 61 73 65  meters (ppRebase
c8f0: 29 20 61 6e 64 20 28 70 6e 52 65 62 61 73 65 29  ) and (pnRebase)
c900: 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e   are non-NULL an
c910: 64 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 69  d.** the input i
c920: 73 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 6e  s a changeset (n
c930: 6f 74 20 61 20 70 61 74 63 68 73 65 74 29 2c 20  ot a patchset), 
c940: 74 68 65 6e 20 73 71 6c 69 74 65 33 63 68 61 6e  then sqlite3chan
c950: 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28 29  geset_apply_v2()
c960: 0a 2a 2a 20 6d 61 79 20 73 65 74 20 28 2a 70 70  .** may set (*pp
c970: 52 65 62 61 73 65 29 20 74 6f 20 70 6f 69 6e 74  Rebase) to point
c980: 20 74 6f 20 61 20 22 72 65 62 61 73 65 22 20 74   to a "rebase" t
c990: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
c9a0: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 73 71 6c  with the .** sql
c9b0: 69 74 65 33 5f 72 65 62 61 73 65 72 20 41 50 49  ite3_rebaser API
c9c0: 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  s buffer before 
c9d0: 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20 74 68  returning. In th
c9e0: 69 73 20 63 61 73 65 20 28 2a 70 6e 52 65 62 61  is case (*pnReba
c9f0: 73 65 29 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  se).** is set to
ca00: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
ca10: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
ca20: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
ca30: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
ca40: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
ca50: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 61  ventually free a
ca60: 6e 79 20 73 75 63 68 20 62 75 66 66 65 72 20 75  ny such buffer u
ca70: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
ca80: 65 28 29 2e 20 54 68 65 20 62 75 66 66 65 72 0a  e(). The buffer.
ca90: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 63  ** is only alloc
caa0: 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
cab0: 65 64 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed if one or mor
cac0: 65 20 63 6f 6e 66 6c 69 63 74 73 20 77 65 72 65  e conflicts were
cad0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20   encountered.** 
cae0: 77 68 69 6c 65 20 61 70 70 6c 79 69 6e 67 20 74  while applying t
caf0: 68 65 20 70 61 74 63 68 73 65 74 2e 20 53 65 65  he patchset. See
cb00: 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75   comments surrou
cb10: 6e 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  nding the sqlite
cb20: 33 5f 72 65 62 61 73 65 72 0a 2a 2a 20 41 50 49  3_rebaser.** API
cb30: 73 20 66 6f 72 20 66 75 72 74 68 65 72 20 64 65  s for further de
cb40: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tails..**.** The
cb50: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 73 71 6c   behavior of sql
cb60: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
cb70: 70 6c 79 5f 76 32 28 29 20 61 6e 64 20 69 74 73  ply_v2() and its
cb80: 20 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69 76   streaming equiv
cb90: 61 6c 65 6e 74 0a 2a 2a 20 6d 61 79 20 62 65 20  alent.** may be 
cba0: 6d 6f 64 69 66 69 65 64 20 62 79 20 70 61 73 73  modified by pass
cbb0: 69 6e 67 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ing a combinatio
cbc0: 6e 20 6f 66 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f  n of.** [SQLITE_
cbd0: 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f 4e  CHANGESETAPPLY_N
cbe0: 4f 53 41 56 45 50 4f 49 4e 54 20 7c 20 73 75 70  OSAVEPOINT | sup
cbf0: 70 6f 72 74 65 64 20 66 6c 61 67 73 5d 20 61 73  ported flags] as
cc00: 20 74 68 65 20 39 74 68 20 70 61 72 61 6d 65 74   the 9th paramet
cc10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  er..**.** Note t
cc20: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 63  hat the sqlite3c
cc30: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76  hangeset_apply_v
cc40: 32 28 29 20 41 50 49 20 69 73 20 73 74 69 6c 6c  2() API is still
cc50: 20 3c 62 3e 65 78 70 65 72 69 6d 65 6e 74 61 6c   <b>experimental
cc60: 3c 2f 62 3e 0a 2a 2a 20 61 6e 64 20 74 68 65 72  </b>.** and ther
cc70: 65 66 6f 72 65 20 73 75 62 6a 65 63 74 20 74 6f  efore subject to
cc80: 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
cc90: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
cca0: 5f 61 70 70 6c 79 28 0a 20 20 73 71 6c 69 74 65  _apply(.  sqlite
ccb0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ccc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
ccd0: 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61  ly change to "ma
cce0: 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68  in" db of this h
ccf0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
cd00: 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20  Changeset,      
cd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cd20: 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20  ze of changeset 
cd30: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f  in bytes */.  vo
cd40: 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20  id *pChangeset, 
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd60: 20 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20   Changeset blob 
cd70: 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65  */.  int(*xFilte
cd80: 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  r)(.    void *pC
cd90: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
cda0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
cdb0: 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
cdc0: 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f  pply() */.    co
cdd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20  nst char *zTab  
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cdf0: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29  able name */.  )
ce00: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69  ,.  int(*xConfli
ce10: 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  ct)(.    void *p
ce20: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
ce30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
ce40: 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
ce50: 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69  apply() */.    i
ce60: 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20  nt eConflict,   
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce80: 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43  DATA, MISSING, C
ce90: 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41  ONFLICT, CONSTRA
cea0: 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INT */.    sqlit
ceb0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
cec0: 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64  r *p     /* Hand
ced0: 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68  le describing ch
cee0: 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63  ange and conflic
cef0: 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64  t */.  ),.  void
cf00: 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20 20   *pCtx          
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cf20: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
cf30: 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63  ssed to xConflic
cf40: 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  t */.);.int sqli
cf50: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
cf60: 6c 79 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  ly_v2(.  sqlite3
cf70: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
cf80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
cf90: 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
cfa0: 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
cfb0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ndle */.  int nC
cfc0: 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20  hangeset,       
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cfe0: 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 69  e of changeset i
cff0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69  n bytes */.  voi
d000: 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20 20  d *pChangeset,  
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d020: 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20 2a  Changeset blob *
d030: 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72  /.  int(*xFilter
d040: 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
d050: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
d060: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
d070: 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
d080: 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e  ply() */.    con
d090: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20  st char *zTab   
d0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d0b0: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c  ble name */.  ),
d0c0: 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63  .  int(*xConflic
d0d0: 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  t)(.    void *pC
d0e0: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
d0f0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
d100: 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
d110: 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e  pply() */.    in
d120: 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20  t eConflict,    
d130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
d140: 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f  ATA, MISSING, CO
d150: 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49  NFLICT, CONSTRAI
d160: 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NT */.    sqlite
d170: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
d180: 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c   *p     /* Handl
d190: 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61  e describing cha
d1a0: 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74  nge and conflict
d1b0: 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20   */.  ),.  void 
d1c0: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
d1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d1e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
d1f0: 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74  sed to xConflict
d200: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 52   */.  void **ppR
d210: 65 62 61 73 65 2c 20 69 6e 74 20 2a 70 6e 52 65  ebase, int *pnRe
d220: 62 61 73 65 2c 20 2f 2a 20 4f 55 54 3a 20 52 65  base, /* OUT: Re
d230: 62 61 73 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  base data */.  i
d240: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d260: 2a 20 53 45 53 53 49 4f 4e 5f 43 48 41 4e 47 45  * SESSION_CHANGE
d270: 53 45 54 41 50 50 4c 59 5f 2a 20 66 6c 61 67 73  SETAPPLY_* flags
d280: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41   */.);../*.** CA
d290: 50 49 33 52 45 46 3a 20 46 6c 61 67 73 20 66 6f  PI3REF: Flags fo
d2a0: 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  r sqlite3changes
d2b0: 65 74 5f 61 70 70 6c 79 5f 76 32 0a 2a 2a 0a 2a  et_apply_v2.**.*
d2c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d2d0: 66 6c 61 67 73 20 6d 61 79 20 70 61 73 73 65 64  flags may passed
d2e0: 20 76 69 61 20 74 68 65 20 39 74 68 20 70 61 72   via the 9th par
d2f0: 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 5b 73 71  ameter to.** [sq
d300: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
d310: 70 70 6c 79 5f 76 32 5d 20 61 6e 64 20 5b 73 71  pply_v2] and [sq
d320: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
d330: 70 70 6c 79 5f 76 32 5f 73 74 72 6d 5d 3a 0a 2a  pply_v2_strm]:.*
d340: 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74  *.** <dl>.** <dt
d350: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
d360: 54 41 50 50 4c 59 5f 4e 4f 53 41 56 45 50 4f 49  TAPPLY_NOSAVEPOI
d370: 4e 54 20 3c 64 64 3e 0a 2a 2a 20 20 20 55 73 75  NT <dd>.**   Usu
d380: 61 6c 6c 79 2c 20 74 68 65 20 73 65 73 73 69 6f  ally, the sessio
d390: 6e 73 20 6d 6f 64 75 6c 65 20 65 6e 63 6c 6f 73  ns module enclos
d3a0: 65 73 20 61 6c 6c 20 6f 70 65 72 61 74 69 6f 6e  es all operation
d3b0: 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 0a 2a  s performed by.*
d3c0: 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  *   a single cal
d3d0: 6c 20 74 6f 20 61 70 70 6c 79 5f 76 32 28 29 20  l to apply_v2() 
d3e0: 6f 72 20 61 70 70 6c 79 5f 76 32 5f 73 74 72 6d  or apply_v2_strm
d3f0: 28 29 20 69 6e 20 61 20 5b 53 41 56 45 50 4f 49  () in a [SAVEPOI
d400: 4e 54 5d 2e 20 54 68 65 0a 2a 2a 20 20 20 53 41  NT]. The.**   SA
d410: 56 45 50 4f 49 4e 54 20 69 73 20 63 6f 6d 6d 69  VEPOINT is commi
d420: 74 74 65 64 20 69 66 20 74 68 65 20 63 68 61 6e  tted if the chan
d430: 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65  geset or patchse
d440: 74 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  t is successfull
d450: 79 0a 2a 2a 20 20 20 61 70 70 6c 69 65 64 2c 20  y.**   applied, 
d460: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  or rolled back i
d470: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d480: 73 2e 20 53 70 65 63 69 66 79 69 6e 67 20 74 68  s. Specifying th
d490: 69 73 20 66 6c 61 67 0a 2a 2a 20 20 20 63 61 75  is flag.**   cau
d4a0: 73 65 73 20 74 68 65 20 73 65 73 73 69 6f 6e 73  ses the sessions
d4b0: 20 6d 6f 64 75 6c 65 20 74 6f 20 6f 6d 69 74 20   module to omit 
d4c0: 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  this savepoint. 
d4d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66  In this case, if
d4e0: 20 74 68 65 0a 2a 2a 20 20 20 63 61 6c 6c 65 72   the.**   caller
d4f0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
d500: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
d510: 70 6f 69 6e 74 20 77 68 65 6e 20 61 70 70 6c 79  point when apply
d520: 5f 76 32 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  _v2() is called,
d530: 20 0a 2a 2a 20 20 20 69 74 20 6d 61 79 20 72 65   .**   it may re
d540: 76 65 72 74 20 74 68 65 20 70 61 72 74 69 61 6c  vert the partial
d550: 6c 79 20 61 70 70 6c 69 65 64 20 63 68 61 6e 67  ly applied chang
d560: 65 73 65 74 20 62 79 20 72 6f 6c 6c 69 6e 67 20  eset by rolling 
d570: 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 3c  it back..**.** <
d580: 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  dt>SQLITE_CHANGE
d590: 53 45 54 41 50 50 4c 59 5f 49 4e 56 45 52 54 20  SETAPPLY_INVERT 
d5a0: 3c 64 64 3e 0a 2a 2a 20 20 20 49 6e 76 65 72 74  <dd>.**   Invert
d5b0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62   the changeset b
d5c0: 65 66 6f 72 65 20 61 70 70 6c 79 69 6e 67 20 69  efore applying i
d5d0: 74 2e 20 54 68 69 73 20 69 73 20 65 71 75 69 76  t. This is equiv
d5e0: 61 6c 65 6e 74 20 74 6f 20 69 6e 76 65 72 74 69  alent to inverti
d5f0: 6e 67 0a 2a 2a 20 20 20 61 20 63 68 61 6e 67 65  ng.**   a change
d600: 73 65 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65  set using sqlite
d610: 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72  3changeset_inver
d620: 74 28 29 20 62 65 66 6f 72 65 20 61 70 70 6c 79  t() before apply
d630: 69 6e 67 20 69 74 2e 20 49 74 20 69 73 0a 2a 2a  ing it. It is.**
d640: 20 20 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73     an error to s
d650: 70 65 63 69 66 79 20 74 68 69 73 20 66 6c 61 67  pecify this flag
d660: 20 77 69 74 68 20 61 20 70 61 74 63 68 73 65 74   with a patchset
d670: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
d680: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41 50 50  ITE_CHANGESETAPP
d690: 4c 59 5f 4e 4f 53 41 56 45 50 4f 49 4e 54 20 20  LY_NOSAVEPOINT  
d6a0: 20 30 78 30 30 30 31 0a 23 64 65 66 69 6e 65 20   0x0001.#define 
d6b0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
d6c0: 41 50 50 4c 59 5f 49 4e 56 45 52 54 20 20 20 20  APPLY_INVERT    
d6d0: 20 20 20 20 30 78 30 30 30 32 0a 0a 2f 2a 20 0a      0x0002../* .
d6e0: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e  ** CAPI3REF: Con
d6f0: 73 74 61 6e 74 73 20 50 61 73 73 65 64 20 54 6f  stants Passed To
d700: 20 54 68 65 20 43 6f 6e 66 6c 69 63 74 20 48 61   The Conflict Ha
d710: 6e 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ndler.**.** Valu
d720: 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  es that may be p
d730: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d740: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
d750: 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  a conflict-handl
d760: 65 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a  er..**.** <dl>.*
d770: 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41  * <dt>SQLITE_CHA
d780: 4e 47 45 53 45 54 5f 44 41 54 41 3c 64 64 3e 0a  NGESET_DATA<dd>.
d790: 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63  **   The conflic
d7a0: 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76  t handler is inv
d7b0: 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47 45  oked with CHANGE
d7c0: 53 45 54 5f 44 41 54 41 20 61 73 20 74 68 65 20  SET_DATA as the 
d7d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
d7e0: 2a 2a 20 20 20 77 68 65 6e 20 70 72 6f 63 65 73  **   when proces
d7f0: 73 69 6e 67 20 61 20 44 45 4c 45 54 45 20 6f 72  sing a DELETE or
d800: 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 20 69   UPDATE change i
d810: 66 20 61 20 72 6f 77 20 77 69 74 68 20 74 68 65  f a row with the
d820: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 50   required.**   P
d830: 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64  RIMARY KEY field
d840: 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  s is present in 
d850: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62 75  the database, bu
d860: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 74  t one or more ot
d870: 68 65 72 20 0a 2a 2a 20 20 20 28 6e 6f 6e 20 70  her .**   (non p
d880: 72 69 6d 61 72 79 2d 6b 65 79 29 20 66 69 65 6c  rimary-key) fiel
d890: 64 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  ds modified by t
d8a0: 68 65 20 75 70 64 61 74 65 20 64 6f 20 6e 6f 74  he update do not
d8b0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 0a 2a 2a   contain the .**
d8c0: 20 20 20 65 78 70 65 63 74 65 64 20 22 62 65 66     expected "bef
d8d0: 6f 72 65 22 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  ore" values..** 
d8e0: 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69  .**   The confli
d8f0: 63 74 69 6e 67 20 72 6f 77 2c 20 69 6e 20 74 68  cting row, in th
d900: 69 73 20 63 61 73 65 2c 20 69 73 20 74 68 65 20  is case, is the 
d910: 64 61 74 61 62 61 73 65 20 72 6f 77 20 77 69 74  database row wit
d920: 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 2a  h the matching.*
d930: 2a 20 20 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  *   primary key.
d940: 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  .** .** <dt>SQLI
d950: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  TE_CHANGESET_NOT
d960: 46 4f 55 4e 44 3c 64 64 3e 0a 2a 2a 20 20 20 54  FOUND<dd>.**   T
d970: 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
d980: 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ler is invoked w
d990: 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f 4e 4f  ith CHANGESET_NO
d9a0: 54 46 4f 55 4e 44 20 61 73 20 74 68 65 20 73 65  TFOUND as the se
d9b0: 63 6f 6e 64 0a 2a 2a 20 20 20 61 72 67 75 6d 65  cond.**   argume
d9c0: 6e 74 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  nt when processi
d9d0: 6e 67 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55  ng a DELETE or U
d9e0: 50 44 41 54 45 20 63 68 61 6e 67 65 20 69 66 20  PDATE change if 
d9f0: 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 0a 2a  a row with the.*
da00: 2a 20 20 20 72 65 71 75 69 72 65 64 20 50 52 49  *   required PRI
da10: 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 73 20  MARY KEY fields 
da20: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
da30: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
da40: 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 72 65 20 69  ** .**   There i
da50: 73 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67  s no conflicting
da60: 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61 73   row in this cas
da70: 65 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  e. The results o
da80: 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 0a 2a  f invoking the.*
da90: 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  *   sqlite3chang
daa0: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 28 29 20  eset_conflict() 
dab0: 41 50 49 20 61 72 65 20 75 6e 64 65 66 69 6e 65  API are undefine
dac0: 64 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51  d..** .** <dt>SQ
dad0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43  LITE_CHANGESET_C
dae0: 4f 4e 46 4c 49 43 54 3c 64 64 3e 0a 2a 2a 20 20  ONFLICT<dd>.**  
daf0: 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c   CHANGESET_CONFL
db00: 49 43 54 20 69 73 20 70 61 73 73 65 64 20 61 73  ICT is passed as
db10: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
db20: 6d 65 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e 66  ment to the conf
db30: 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65  lict.**   handle
db40: 72 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  r while processi
db50: 6e 67 20 61 6e 20 49 4e 53 45 52 54 20 63 68 61  ng an INSERT cha
db60: 6e 67 65 20 69 66 20 74 68 65 20 6f 70 65 72 61  nge if the opera
db70: 74 69 6f 6e 20 77 6f 75 6c 64 20 72 65 73 75 6c  tion would resul
db80: 74 20 0a 2a 2a 20 20 20 69 6e 20 64 75 70 6c 69  t .**   in dupli
db90: 63 61 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  cate primary key
dba0: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a 2a 2a 20   values..** .** 
dbb0: 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e    The conflictin
dbc0: 67 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61  g row in this ca
dbd0: 73 65 20 69 73 20 74 68 65 20 64 61 74 61 62 61  se is the databa
dbe0: 73 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  se row with the 
dbf0: 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 20 20 70 72  matching.**   pr
dc00: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
dc10: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
dc20: 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  GESET_FOREIGN_KE
dc30: 59 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 66 6f  Y<dd>.**   If fo
dc40: 72 65 69 67 6e 20 6b 65 79 20 68 61 6e 64 6c 69  reign key handli
dc50: 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  ng is enabled, a
dc60: 6e 64 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68  nd applying a ch
dc70: 61 6e 67 65 73 65 74 20 6c 65 61 76 65 73 20 74  angeset leaves t
dc80: 68 65 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  he.**   database
dc90: 20 69 6e 20 61 20 73 74 61 74 65 20 63 6f 6e 74   in a state cont
dca0: 61 69 6e 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  aining foreign k
dcb0: 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 74  ey violations, t
dcc0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20  he conflict .** 
dcd0: 20 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76    handler is inv
dce0: 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47 45  oked with CHANGE
dcf0: 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20  SET_FOREIGN_KEY 
dd00: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
dd10: 67 75 6d 65 6e 74 0a 2a 2a 20 20 20 65 78 61 63  gument.**   exac
dd20: 74 6c 79 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  tly once before 
dd30: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73  the changeset is
dd40: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
dd50: 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
dd60: 6c 65 72 0a 2a 2a 20 20 20 72 65 74 75 72 6e 73  ler.**   returns
dd70: 20 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 2c   CHANGESET_OMIT,
dd80: 20 74 68 65 20 63 68 61 6e 67 65 73 2c 20 69 6e   the changes, in
dd90: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68  cluding those th
dda0: 61 74 20 63 61 75 73 65 64 20 74 68 65 0a 2a 2a  at caused the.**
ddb0: 20 20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63     foreign key c
ddc0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
ddd0: 69 6f 6e 2c 20 61 72 65 20 63 6f 6d 6d 69 74 74  ion, are committ
dde0: 65 64 2e 20 4f 72 2c 20 69 66 20 69 74 20 72 65  ed. Or, if it re
ddf0: 74 75 72 6e 73 0a 2a 2a 20 20 20 43 48 41 4e 47  turns.**   CHANG
de00: 45 53 45 54 5f 41 42 4f 52 54 2c 20 74 68 65 20  ESET_ABORT, the 
de10: 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 6f 6c  changeset is rol
de20: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
de30: 20 20 4e 6f 20 63 75 72 72 65 6e 74 20 6f 72 20    No current or 
de40: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20  conflicting row 
de50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
de60: 72 6f 76 69 64 65 64 2e 20 54 68 65 20 6f 6e 6c  rovided. The onl
de70: 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  y function.**   
de80: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
de90: 6f 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 75  o call on the su
dea0: 70 70 6c 69 65 64 20 73 71 6c 69 74 65 33 5f 63  pplied sqlite3_c
deb0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 68 61  hangeset_iter ha
dec0: 6e 64 6c 65 0a 2a 2a 20 20 20 69 73 20 73 71 6c  ndle.**   is sql
ded0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 6b  ite3changeset_fk
dee0: 5f 63 6f 6e 66 6c 69 63 74 73 28 29 2e 0a 2a 2a  _conflicts()..**
def0: 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f   .** <dt>SQLITE_
df00: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
df10: 41 49 4e 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66  AINT<dd>.**   If
df20: 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 73 74   any other const
df30: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20  raint violation 
df40: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 70 70  occurs while app
df50: 6c 79 69 6e 67 20 61 20 63 68 61 6e 67 65 20 28  lying a change (
df60: 69 2e 65 2e 20 0a 2a 2a 20 20 20 61 20 55 4e 49  i.e. .**   a UNI
df70: 51 55 45 2c 20 43 48 45 43 4b 20 6f 72 20 4e 4f  QUE, CHECK or NO
df80: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
df90: 74 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  t), the conflict
dfa0: 20 68 61 6e 64 6c 65 72 20 69 73 20 0a 2a 2a 20   handler is .** 
dfb0: 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43    invoked with C
dfc0: 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41  HANGESET_CONSTRA
dfd0: 49 4e 54 20 61 73 20 74 68 65 20 73 65 63 6f 6e  INT as the secon
dfe0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 0a  d argument..** .
dff0: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
e000: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
e010: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 54   in this case. T
e020: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 69 6e  he results of in
e030: 76 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  voking the.**   
e040: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
e050: 5f 63 6f 6e 66 6c 69 63 74 28 29 20 41 50 49 20  _conflict() API 
e060: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
e070: 2a 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64  *.** </dl>.*/.#d
e080: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
e090: 4e 47 45 53 45 54 5f 44 41 54 41 20 20 20 20 20  NGESET_DATA     
e0a0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
e0b0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f  ITE_CHANGESET_NO
e0c0: 54 46 4f 55 4e 44 20 20 20 20 32 0a 23 64 65 66  TFOUND    2.#def
e0d0: 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  ine SQLITE_CHANG
e0e0: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 20 20  ESET_CONFLICT   
e0f0: 20 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   3.#define SQLIT
e100: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53  E_CHANGESET_CONS
e110: 54 52 41 49 4e 54 20 20 34 0a 23 64 65 66 69 6e  TRAINT  4.#defin
e120: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
e130: 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 35  ET_FOREIGN_KEY 5
e140: 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52 45  ../* .** CAPI3RE
e150: 46 3a 20 43 6f 6e 73 74 61 6e 74 73 20 52 65 74  F: Constants Ret
e160: 75 72 6e 65 64 20 42 79 20 54 68 65 20 43 6f 6e  urned By The Con
e170: 66 6c 69 63 74 20 48 61 6e 64 6c 65 72 0a 2a 2a  flict Handler.**
e180: 0a 2a 2a 20 41 20 63 6f 6e 66 6c 69 63 74 20 68  .** A conflict h
e190: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
e1a0: 6d 75 73 74 20 72 65 74 75 72 6e 20 6f 6e 65 20  must return one 
e1b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e1c0: 20 74 68 72 65 65 20 76 61 6c 75 65 73 2e 0a 2a   three values..*
e1d0: 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74  *.** <dl>.** <dt
e1e0: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
e1f0: 54 5f 4f 4d 49 54 3c 64 64 3e 0a 2a 2a 20 20 20  T_OMIT<dd>.**   
e200: 49 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 68 61  If a conflict ha
e210: 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20 74 68  ndler returns th
e220: 69 73 20 76 61 6c 75 65 20 6e 6f 20 73 70 65 63  is value no spec
e230: 69 61 6c 20 61 63 74 69 6f 6e 20 69 73 20 74 61  ial action is ta
e240: 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20 20 20 63 68  ken. The.**   ch
e250: 61 6e 67 65 20 74 68 61 74 20 63 61 75 73 65 64  ange that caused
e260: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 69 73   the conflict is
e270: 20 6e 6f 74 20 61 70 70 6c 69 65 64 2e 20 54 68   not applied. Th
e280: 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65  e session module
e290: 20 0a 2a 2a 20 20 20 63 6f 6e 74 69 6e 75 65 73   .**   continues
e2a0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61   to the next cha
e2b0: 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67  nge in the chang
e2c0: 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e  eset..**.** <dt>
e2d0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
e2e0: 5f 52 45 50 4c 41 43 45 3c 64 64 3e 0a 2a 2a 20  _REPLACE<dd>.** 
e2f0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
e300: 20 6f 6e 6c 79 20 62 65 20 72 65 74 75 72 6e 65   only be returne
e310: 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
e320: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
e330: 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61  conflict.**   ha
e340: 6e 64 6c 65 72 20 77 61 73 20 53 51 4c 49 54 45  ndler was SQLITE
e350: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
e360: 6f 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  or SQLITE_CHANGE
e370: 53 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66  SET_CONFLICT. If
e380: 20 74 68 69 73 0a 2a 2a 20 20 20 69 73 20 6e 6f   this.**   is no
e390: 74 20 74 68 65 20 63 61 73 65 2c 20 61 6e 79 20  t the case, any 
e3a0: 63 68 61 6e 67 65 73 20 61 70 70 6c 69 65 64 20  changes applied 
e3b0: 73 6f 20 66 61 72 20 61 72 65 20 72 6f 6c 6c 65  so far are rolle
e3c0: 64 20 62 61 63 6b 20 61 6e 64 20 74 68 65 20 0a  d back and the .
e3d0: 2a 2a 20 20 20 63 61 6c 6c 20 74 6f 20 73 71 6c  **   call to sql
e3e0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
e3f0: 70 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51  ply() returns SQ
e400: 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2a 0a  LITE_MISUSE..**.
e410: 2a 2a 20 20 20 49 66 20 43 48 41 4e 47 45 53 45  **   If CHANGESE
e420: 54 5f 52 45 50 4c 41 43 45 20 69 73 20 72 65 74  T_REPLACE is ret
e430: 75 72 6e 65 64 20 62 79 20 61 6e 20 53 51 4c 49  urned by an SQLI
e440: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54  TE_CHANGESET_DAT
e450: 41 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20  A conflict.**   
e460: 68 61 6e 64 6c 65 72 2c 20 74 68 65 6e 20 74 68  handler, then th
e470: 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
e480: 77 20 69 73 20 65 69 74 68 65 72 20 75 70 64 61  w is either upda
e490: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2c 20  ted or deleted, 
e4a0: 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f  depending.**   o
e4b0: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 63 68  n the type of ch
e4c0: 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66  ange..**.**   If
e4d0: 20 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41   CHANGESET_REPLA
e4e0: 43 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  CE is returned b
e4f0: 79 20 61 6e 20 53 51 4c 49 54 45 5f 43 48 41 4e  y an SQLITE_CHAN
e500: 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 63  GESET_CONFLICT c
e510: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e  onflict.**   han
e520: 64 6c 65 72 2c 20 74 68 65 6e 20 74 68 65 20 63  dler, then the c
e530: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69  onflicting row i
e540: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
e550: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
e560: 61 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 61 74  a.**   second at
e570: 74 65 6d 70 74 20 74 6f 20 61 70 70 6c 79 20 74  tempt to apply t
e580: 68 65 20 63 68 61 6e 67 65 20 69 73 20 6d 61 64  he change is mad
e590: 65 2e 20 49 66 20 74 68 69 73 20 73 65 63 6f 6e  e. If this secon
e5a0: 64 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  d attempt fails,
e5b0: 0a 2a 2a 20 20 20 74 68 65 20 6f 72 69 67 69 6e  .**   the origin
e5c0: 61 6c 20 72 6f 77 20 69 73 20 72 65 73 74 6f 72  al row is restor
e5d0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
e5e0: 73 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  se before contin
e5f0: 75 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e  uing..**.** <dt>
e600: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
e610: 5f 41 42 4f 52 54 3c 64 64 3e 0a 2a 2a 20 20 20  _ABORT<dd>.**   
e620: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
e630: 20 72 65 74 75 72 6e 65 64 2c 20 61 6e 79 20 63   returned, any c
e640: 68 61 6e 67 65 73 20 61 70 70 6c 69 65 64 20 73  hanges applied s
e650: 6f 20 66 61 72 20 61 72 65 20 72 6f 6c 6c 65 64  o far are rolled
e660: 20 62 61 63 6b 20 0a 2a 2a 20 20 20 61 6e 64 20   back .**   and 
e670: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
e680: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
e690: 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ly() returns SQL
e6a0: 49 54 45 5f 41 42 4f 52 54 2e 0a 2a 2a 20 3c 2f  ITE_ABORT..** </
e6b0: 64 6c 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  dl>.*/.#define S
e6c0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
e6d0: 4f 4d 49 54 20 20 20 20 20 20 20 30 0a 23 64 65  OMIT       0.#de
e6e0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e  fine SQLITE_CHAN
e6f0: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 20 20  GESET_REPLACE   
e700: 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   1.#define SQLIT
e710: 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52  E_CHANGESET_ABOR
e720: 54 20 20 20 20 20 20 32 0a 0a 2f 2a 20 0a 2a 2a  T      2../* .**
e730: 20 43 41 50 49 33 52 45 46 3a 20 52 65 62 61 73   CAPI3REF: Rebas
e740: 69 6e 67 20 63 68 61 6e 67 65 73 65 74 73 0a 2a  ing changesets.*
e750: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a  * EXPERIMENTAL.*
e760: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
e770: 72 65 20 69 73 20 61 20 73 69 74 65 20 68 6f 73  re is a site hos
e780: 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ting a database 
e790: 69 6e 20 73 74 61 74 65 20 53 30 2e 20 41 6e 64  in state S0. And
e7a0: 20 74 68 61 74 0a 2a 2a 20 6d 6f 64 69 66 69 63   that.** modific
e7b0: 61 74 69 6f 6e 73 20 61 72 65 20 6d 61 64 65 20  ations are made 
e7c0: 74 68 61 74 20 6d 6f 76 65 20 74 68 61 74 20 64  that move that d
e7d0: 61 74 61 62 61 73 65 20 74 6f 20 73 74 61 74 65  atabase to state
e7e0: 20 53 31 20 61 6e 64 20 61 0a 2a 2a 20 63 68 61   S1 and a.** cha
e7f0: 6e 67 65 73 65 74 20 72 65 63 6f 72 64 65 64 20  ngeset recorded 
e800: 28 74 68 65 20 22 6c 6f 63 61 6c 22 20 63 68 61  (the "local" cha
e810: 6e 67 65 73 65 74 29 2e 20 54 68 65 6e 2c 20 61  ngeset). Then, a
e820: 20 63 68 61 6e 67 65 73 65 74 20 62 61 73 65 64   changeset based
e830: 0a 2a 2a 20 6f 6e 20 53 30 20 69 73 20 72 65 63  .** on S0 is rec
e840: 65 69 76 65 64 20 66 72 6f 6d 20 61 6e 6f 74 68  eived from anoth
e850: 65 72 20 73 69 74 65 20 28 74 68 65 20 22 72 65  er site (the "re
e860: 6d 6f 74 65 22 20 63 68 61 6e 67 65 73 65 74 29  mote" changeset)
e870: 20 61 6e 64 20 0a 2a 2a 20 61 70 70 6c 69 65 64   and .** applied
e880: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
e890: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  . The database i
e8a0: 73 20 74 68 65 6e 20 69 6e 20 73 74 61 74 65 20  s then in state 
e8b0: 0a 2a 2a 20 28 53 31 2b 22 72 65 6d 6f 74 65 22  .** (S1+"remote"
e8c0: 29 2c 20 77 68 65 72 65 20 74 68 65 20 65 78 61  ), where the exa
e8d0: 63 74 20 73 74 61 74 65 20 64 65 70 65 6e 64 73  ct state depends
e8e0: 20 6f 6e 20 61 6e 79 20 63 6f 6e 66 6c 69 63 74   on any conflict
e8f0: 0a 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 64  .** resolution d
e900: 65 63 69 73 69 6f 6e 73 20 28 4f 4d 49 54 20 6f  ecisions (OMIT o
e910: 72 20 52 45 50 4c 41 43 45 29 20 6d 61 64 65 20  r REPLACE) made 
e920: 77 68 69 6c 65 20 61 70 70 6c 79 69 6e 67 20 22  while applying "
e930: 72 65 6d 6f 74 65 22 2e 0a 2a 2a 20 52 65 62 61  remote"..** Reba
e940: 73 69 6e 67 20 61 20 63 68 61 6e 67 65 73 65 74  sing a changeset
e950: 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 69 74   is to update it
e960: 20 74 6f 20 74 61 6b 65 20 74 68 6f 73 65 20 63   to take those c
e970: 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20 72 65 73 6f  onflict .** reso
e980: 6c 75 74 69 6f 6e 20 64 65 63 69 73 69 6f 6e 73  lution decisions
e990: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20 73   into account, s
e9a0: 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
e9b0: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 64 6f 20  conflicts.** do 
e9c0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20 72  not have to be r
e9d0: 65 73 6f 6c 76 65 64 20 65 6c 73 65 77 68 65 72  esolved elsewher
e9e0: 65 20 69 6e 20 74 68 65 20 6e 65 74 77 6f 72 6b  e in the network
e9f0: 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  . .**.** For exa
ea00: 6d 70 6c 65 2c 20 69 66 20 62 6f 74 68 20 74 68  mple, if both th
ea10: 65 20 6c 6f 63 61 6c 20 61 6e 64 20 72 65 6d 6f  e local and remo
ea20: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f  te changesets co
ea30: 6e 74 61 69 6e 20 61 6e 0a 2a 2a 20 49 4e 53 45  ntain an.** INSE
ea40: 52 54 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6b  RT of the same k
ea50: 65 79 20 6f 6e 20 22 43 52 45 41 54 45 20 54 41  ey on "CREATE TA
ea60: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
ea70: 20 4b 45 59 2c 20 62 29 22 3a 0a 2a 2a 0a 2a 2a   KEY, b)":.**.**
ea80: 20 20 20 6c 6f 63 61 6c 3a 20 20 49 4e 53 45 52     local:  INSER
ea90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
eaa0: 28 31 2c 20 27 76 31 27 29 3b 0a 2a 2a 20 20 20  (1, 'v1');.**   
eab0: 72 65 6d 6f 74 65 3a 20 49 4e 53 45 52 54 20 49  remote: INSERT I
eac0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
ead0: 20 27 76 32 27 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e   'v2');.**.** an
eae0: 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  d the conflict r
eaf0: 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 52 45 50  esolution is REP
eb00: 4c 41 43 45 2c 20 74 68 65 6e 20 74 68 65 20 49  LACE, then the I
eb10: 4e 53 45 52 54 20 63 68 61 6e 67 65 20 69 73 0a  NSERT change is.
eb20: 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ** removed from 
eb30: 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  the local change
eb40: 73 65 74 20 28 69 74 20 77 61 73 20 6f 76 65 72  set (it was over
eb50: 72 69 64 64 65 6e 29 2e 20 4f 72 2c 20 69 66 20  ridden). Or, if 
eb60: 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20  the.** conflict 
eb70: 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20 22  resolution was "
eb80: 4f 4d 49 54 22 2c 20 74 68 65 6e 20 74 68 65 20  OMIT", then the 
eb90: 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74 20  local changeset 
eba0: 69 73 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 74  is modified.** t
ebb0: 6f 20 69 6e 73 74 65 61 64 20 63 6f 6e 74 61 69  o instead contai
ebc0: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  n:.**.**        
ebd0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
ebe0: 20 62 20 3d 20 27 76 32 27 20 57 48 45 52 45 20   b = 'v2' WHERE 
ebf0: 61 3d 31 3b 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  a=1;.**.** Chang
ec00: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 6c 6f  es within the lo
ec10: 63 61 6c 20 63 68 61 6e 67 65 73 65 74 20 61 72  cal changeset ar
ec20: 65 20 72 65 62 61 73 65 64 20 61 73 20 66 6f 6c  e rebased as fol
ec30: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e  lows:.**.** <dl>
ec40: 0a 2a 2a 20 3c 64 74 3e 4c 6f 63 61 6c 20 49 4e  .** <dt>Local IN
ec50: 53 45 52 54 3c 64 64 3e 0a 2a 2a 20 20 20 54 68  SERT<dd>.**   Th
ec60: 69 73 20 6d 61 79 20 6f 6e 6c 79 20 63 6f 6e 66  is may only conf
ec70: 6c 69 63 74 20 77 69 74 68 20 61 20 72 65 6d 6f  lict with a remo
ec80: 74 65 20 49 4e 53 45 52 54 2e 20 49 66 20 74 68  te INSERT. If th
ec90: 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20 20  e conflict .**  
eca0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20   resolution was 
ecb0: 4f 4d 49 54 2c 20 74 68 65 6e 20 61 64 64 20 61  OMIT, then add a
ecc0: 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 20  n UPDATE change 
ecd0: 74 6f 20 74 68 65 20 72 65 62 61 73 65 64 0a 2a  to the rebased.*
ece0: 2a 20 20 20 63 68 61 6e 67 65 73 65 74 2e 20 4f  *   changeset. O
ecf0: 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69  r, if the confli
ed00: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61  ct resolution wa
ed10: 73 20 52 45 50 4c 41 43 45 2c 20 61 64 64 0a 2a  s REPLACE, add.*
ed20: 2a 20 20 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  *   nothing to t
ed30: 68 65 20 72 65 62 61 73 65 64 20 63 68 61 6e 67  he rebased chang
ed40: 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e  eset..**.** <dt>
ed50: 4c 6f 63 61 6c 20 44 45 4c 45 54 45 3c 64 64 3e  Local DELETE<dd>
ed60: 0a 2a 2a 20 20 20 54 68 69 73 20 6d 61 79 20 63  .**   This may c
ed70: 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61 20 72  onflict with a r
ed80: 65 6d 6f 74 65 20 55 50 44 41 54 45 20 6f 72 20  emote UPDATE or 
ed90: 44 45 4c 45 54 45 2e 20 49 6e 20 62 6f 74 68 20  DELETE. In both 
eda0: 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 20 20 6f  cases the.**   o
edb0: 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 72 65 73  nly possible res
edc0: 6f 6c 75 74 69 6f 6e 20 69 73 20 4f 4d 49 54 2e  olution is OMIT.
edd0: 20 49 66 20 74 68 65 20 72 65 6d 6f 74 65 20 6f   If the remote o
ede0: 70 65 72 61 74 69 6f 6e 20 77 61 73 20 61 0a 2a  peration was a.*
edf0: 2a 20 20 20 44 45 4c 45 54 45 2c 20 74 68 65 6e  *   DELETE, then
ee00: 20 61 64 64 20 6e 6f 20 63 68 61 6e 67 65 20 74   add no change t
ee10: 6f 20 74 68 65 20 72 65 62 61 73 65 64 20 63 68  o the rebased ch
ee20: 61 6e 67 65 73 65 74 2e 20 49 66 20 74 68 65 20  angeset. If the 
ee30: 72 65 6d 6f 74 65 0a 2a 2a 20 20 20 6f 70 65 72  remote.**   oper
ee40: 61 74 69 6f 6e 20 77 61 73 20 61 6e 20 55 50 44  ation was an UPD
ee50: 41 54 45 2c 20 74 68 65 6e 20 74 68 65 20 6f 6c  ATE, then the ol
ee60: 64 2e 2a 20 66 69 65 6c 64 73 20 6f 66 20 63 68  d.* fields of ch
ee70: 61 6e 67 65 20 61 72 65 20 75 70 64 61 74 65 64  ange are updated
ee80: 0a 2a 2a 20 20 20 74 6f 20 72 65 66 6c 65 63 74  .**   to reflect
ee90: 20 74 68 65 20 6e 65 77 2e 2a 20 76 61 6c 75 65   the new.* value
eea0: 73 20 69 6e 20 74 68 65 20 55 50 44 41 54 45 2e  s in the UPDATE.
eeb0: 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 4c 6f 63 61 6c  .**.** <dt>Local
eec0: 20 55 50 44 41 54 45 3c 64 64 3e 0a 2a 2a 20 20   UPDATE<dd>.**  
eed0: 20 54 68 69 73 20 6d 61 79 20 63 6f 6e 66 6c 69   This may confli
eee0: 63 74 20 77 69 74 68 20 61 20 72 65 6d 6f 74 65  ct with a remote
eef0: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
ef00: 45 2e 20 49 66 20 69 74 20 63 6f 6e 66 6c 69 63  E. If it conflic
ef10: 74 73 0a 2a 2a 20 20 20 77 69 74 68 20 61 20 44  ts.**   with a D
ef20: 45 4c 45 54 45 2c 20 61 6e 64 20 74 68 65 20 63  ELETE, and the c
ef30: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
ef40: 6f 6e 20 77 61 73 20 4f 4d 49 54 2c 20 74 68 65  on was OMIT, the
ef50: 6e 20 74 68 65 20 75 70 64 61 74 65 0a 2a 2a 20  n the update.** 
ef60: 20 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74    is changed int
ef70: 6f 20 61 6e 20 49 4e 53 45 52 54 2e 20 41 6e 79  o an INSERT. Any
ef80: 20 75 6e 64 65 66 69 6e 65 64 20 76 61 6c 75 65   undefined value
ef90: 73 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 72  s in the new.* r
efa0: 65 63 6f 72 64 0a 2a 2a 20 20 20 66 72 6f 6d 20  ecord.**   from 
efb0: 74 68 65 20 75 70 64 61 74 65 20 63 68 61 6e 67  the update chang
efc0: 65 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  e are filled in 
efd0: 75 73 69 6e 67 20 74 68 65 20 6f 6c 64 2e 2a 20  using the old.* 
efe0: 76 61 6c 75 65 73 20 66 72 6f 6d 0a 2a 2a 20 20  values from.**  
eff0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67   the conflicting
f000: 20 44 45 4c 45 54 45 2e 20 4f 72 2c 20 69 66 20   DELETE. Or, if 
f010: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
f020: 6f 6c 75 74 69 6f 6e 20 77 61 73 20 52 45 50 4c  olution was REPL
f030: 41 43 45 2c 0a 2a 2a 20 20 20 74 68 65 20 55 50  ACE,.**   the UP
f040: 44 41 54 45 20 63 68 61 6e 67 65 20 69 73 20 73  DATE change is s
f050: 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 66 72  imply omitted fr
f060: 6f 6d 20 74 68 65 20 72 65 62 61 73 65 64 20 63  om the rebased c
f070: 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  hangeset..**.** 
f080: 20 20 49 66 20 63 6f 6e 66 6c 69 63 74 20 69 73    If conflict is
f090: 20 77 69 74 68 20 61 20 72 65 6d 6f 74 65 20 55   with a remote U
f0a0: 50 44 41 54 45 20 61 6e 64 20 74 68 65 20 72 65  PDATE and the re
f0b0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 4f 4d 49 54  solution is OMIT
f0c0: 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 65 20  , then.**   the 
f0d0: 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 61 72 65  old.* values are
f0e0: 20 72 65 62 61 73 65 64 20 75 73 69 6e 67 20 74   rebased using t
f0f0: 68 65 20 6e 65 77 2e 2a 20 76 61 6c 75 65 73 20  he new.* values 
f100: 69 6e 20 74 68 65 20 72 65 6d 6f 74 65 0a 2a 2a  in the remote.**
f110: 20 20 20 63 68 61 6e 67 65 2e 20 4f 72 2c 20 69     change. Or, i
f120: 66 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e  f the resolution
f130: 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 65   is REPLACE, the
f140: 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20  n the change is 
f150: 63 6f 70 69 65 64 0a 2a 2a 20 20 20 69 6e 74 6f  copied.**   into
f160: 20 74 68 65 20 72 65 62 61 73 65 64 20 63 68 61   the rebased cha
f170: 6e 67 65 73 65 74 20 77 69 74 68 20 75 70 64 61  ngeset with upda
f180: 74 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 61  tes to columns a
f190: 6c 73 6f 20 75 70 64 61 74 65 64 20 62 79 0a 2a  lso updated by.*
f1a0: 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  *   the conflict
f1b0: 69 6e 67 20 72 65 6d 6f 74 65 20 55 50 44 41 54  ing remote UPDAT
f1c0: 45 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 74 68  E removed. If th
f1d0: 69 73 20 6d 65 61 6e 73 20 6e 6f 20 63 6f 6c 75  is means no colu
f1e0: 6d 6e 73 20 77 6f 75 6c 64 20 0a 2a 2a 20 20 20  mns would .**   
f1f0: 62 65 20 75 70 64 61 74 65 64 2c 20 74 68 65 20  be updated, the 
f200: 63 68 61 6e 67 65 20 69 73 20 6f 6d 69 74 74 65  change is omitte
f210: 64 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2a 0a 2a  d..** </dl>.**.*
f220: 2a 20 41 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  * A local change
f230: 20 6d 61 79 20 62 65 20 72 65 62 61 73 65 64 20   may be rebased 
f240: 61 67 61 69 6e 73 74 20 6d 75 6c 74 69 70 6c 65  against multiple
f250: 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73 20   remote changes 
f260: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
f270: 6c 79 2e 20 49 66 20 61 20 73 69 6e 67 6c 65 20  ly. If a single 
f280: 6b 65 79 20 69 73 20 6d 6f 64 69 66 69 65 64 20  key is modified 
f290: 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 6d 6f  by multiple remo
f2a0: 74 65 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74  te .** changeset
f2b0: 73 2c 20 74 68 65 79 20 61 72 65 20 63 6f 6d 62  s, they are comb
f2c0: 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 20  ined as follows 
f2d0: 62 65 66 6f 72 65 20 74 68 65 20 6c 6f 63 61 6c  before the local
f2e0: 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 69 73   changeset.** is
f2f0: 20 72 65 62 61 73 65 64 3a 0a 2a 2a 0a 2a 2a 20   rebased:.**.** 
f300: 3c 75 6c 3e 0a 2a 2a 20 20 20 20 3c 6c 69 3e 20  <ul>.**    <li> 
f310: 49 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  If there has bee
f320: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 52 45  n one or more RE
f330: 50 4c 41 43 45 20 72 65 73 6f 6c 75 74 69 6f 6e  PLACE resolution
f340: 73 20 6f 6e 20 61 0a 2a 2a 20 20 20 20 20 20 20  s on a.**       
f350: 20 20 6b 65 79 2c 20 69 74 20 69 73 20 72 65 62    key, it is reb
f360: 61 73 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ased according t
f370: 6f 20 61 20 52 45 50 4c 41 43 45 2e 0a 2a 2a 0a  o a REPLACE..**.
f380: 2a 2a 20 20 20 20 3c 6c 69 3e 20 49 66 20 74 68  **    <li> If th
f390: 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
f3a0: 20 52 45 50 4c 41 43 45 20 72 65 73 6f 6c 75 74   REPLACE resolut
f3b0: 69 6f 6e 73 20 6f 6e 20 61 20 6b 65 79 2c 20 74  ions on a key, t
f3c0: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  hen.**         t
f3d0: 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73  he local changes
f3e0: 65 74 20 69 73 20 72 65 62 61 73 65 64 20 61 63  et is rebased ac
f3f0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6d  cording to the m
f400: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 20 20  ost recent.**   
f410: 20 20 20 20 20 20 6f 66 20 74 68 65 20 4f 4d 49        of the OMI
f420: 54 20 72 65 73 6f 6c 75 74 69 6f 6e 73 2e 0a 2a  T resolutions..*
f430: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 4e 6f  * </ul>.**.** No
f440: 74 65 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  te that conflict
f450: 20 72 65 73 6f 6c 75 74 69 6f 6e 73 20 66 72 6f   resolutions fro
f460: 6d 20 6d 75 6c 74 69 70 6c 65 20 72 65 6d 6f 74  m multiple remot
f470: 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 72 65  e changesets are
f480: 20 0a 2a 2a 20 63 6f 6d 62 69 6e 65 64 20 6f 6e   .** combined on
f490: 20 61 20 70 65 72 2d 66 69 65 6c 64 20 62 61 73   a per-field bas
f4a0: 69 73 2c 20 6e 6f 74 20 70 65 72 2d 72 6f 77 2e  is, not per-row.
f4b0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
f4c0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 61 73 65   in the .** case
f4d0: 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 72 65 6d   of multiple rem
f4e0: 6f 74 65 20 55 50 44 41 54 45 20 6f 70 65 72 61  ote UPDATE opera
f4f0: 74 69 6f 6e 73 2c 20 73 6f 6d 65 20 66 69 65 6c  tions, some fiel
f500: 64 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a  ds of a single .
f510: 2a 2a 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 20  ** local change 
f520: 6d 61 79 20 62 65 20 72 65 62 61 73 65 64 20 66  may be rebased f
f530: 6f 72 20 52 45 50 4c 41 43 45 20 77 68 69 6c 65  or REPLACE while
f540: 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 62 61   others are reba
f550: 73 65 64 20 66 6f 72 20 0a 2a 2a 20 4f 4d 49 54  sed for .** OMIT
f560: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
f570: 20 74 6f 20 72 65 62 61 73 65 20 61 20 6c 6f 63   to rebase a loc
f580: 61 6c 20 63 68 61 6e 67 65 73 65 74 2c 20 74 68  al changeset, th
f590: 65 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73  e remote changes
f5a0: 65 74 20 6d 75 73 74 20 66 69 72 73 74 0a 2a 2a  et must first.**
f5b0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 74   be applied to t
f5c0: 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  he local databas
f5d0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 63  e using sqlite3c
f5e0: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76  hangeset_apply_v
f5f0: 32 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 62  2() and.** the b
f600: 75 66 66 65 72 20 6f 66 20 72 65 62 61 73 65 20  uffer of rebase 
f610: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 70 74  information capt
f620: 75 72 65 64 2e 20 54 68 65 6e 3a 0a 2a 2a 0a 2a  ured. Then:.**.*
f630: 2a 20 3c 6f 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e  * <ol>.**   <li>
f640: 20 41 6e 20 73 71 6c 69 74 65 33 5f 72 65 62 61   An sqlite3_reba
f650: 73 65 72 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ser object is cr
f660: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
f670: 20 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69   .**        sqli
f680: 74 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74  te3rebaser_creat
f690: 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54  e()..**   <li> T
f6a0: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
f6b0: 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68   configured with
f6c0: 20 74 68 65 20 72 65 62 61 73 65 20 62 75 66 66   the rebase buff
f6d0: 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  er obtained from
f6e0: 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74  .**        sqlit
f6f0: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
f700: 79 5f 76 32 28 29 20 62 79 20 63 61 6c 6c 69 6e  y_v2() by callin
f710: 67 20 73 71 6c 69 74 65 33 72 65 62 61 73 65 72  g sqlite3rebaser
f720: 5f 63 6f 6e 66 69 67 75 72 65 28 29 2e 0a 2a 2a  _configure()..**
f730: 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 6c          If the l
f740: 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74 20 69  ocal changeset i
f750: 73 20 74 6f 20 62 65 20 72 65 62 61 73 65 64 20  s to be rebased 
f760: 61 67 61 69 6e 73 74 20 6d 75 6c 74 69 70 6c 65  against multiple
f770: 20 72 65 6d 6f 74 65 0a 2a 2a 20 20 20 20 20 20   remote.**      
f780: 20 20 63 68 61 6e 67 65 73 65 74 73 2c 20 74 68    changesets, th
f790: 65 6e 20 73 71 6c 69 74 65 33 72 65 62 61 73 65  en sqlite3rebase
f7a0: 72 5f 63 6f 6e 66 69 67 75 72 65 28 29 20 73 68  r_configure() sh
f7b0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 0a 2a  ould be called.*
f7c0: 2a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c  *        multipl
f7d0: 65 20 74 69 6d 65 73 2c 20 69 6e 20 74 68 65 20  e times, in the 
f7e0: 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61 74 20  same order that 
f7f0: 74 68 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  the multiple.** 
f800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63 68         sqlite3ch
f810: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32  angeset_apply_v2
f820: 28 29 20 63 61 6c 6c 73 20 77 65 72 65 20 6d 61  () calls were ma
f830: 64 65 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61  de..**   <li> Ea
f840: 63 68 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73  ch local changes
f850: 65 74 20 69 73 20 72 65 62 61 73 65 64 20 62 79  et is rebased by
f860: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
f870: 72 65 62 61 73 65 72 5f 72 65 62 61 73 65 28 29  rebaser_rebase()
f880: 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20  ..**   <li> The 
f890: 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20  sqlite3_rebaser 
f8a0: 6f 62 6a 65 63 74 20 69 73 20 64 65 6c 65 74 65  object is delete
f8b0: 64 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  d by calling.** 
f8c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 72 65         sqlite3re
f8d0: 62 61 73 65 72 5f 64 65 6c 65 74 65 28 29 2e 0a  baser_delete()..
f8e0: 2a 2a 20 3c 2f 6f 6c 3e 0a 2a 2f 0a 74 79 70 65  ** </ol>.*/.type
f8f0: 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74  def struct sqlit
f900: 65 33 5f 72 65 62 61 73 65 72 20 73 71 6c 69 74  e3_rebaser sqlit
f910: 65 33 5f 72 65 62 61 73 65 72 3b 0a 0a 2f 2a 0a  e3_rebaser;../*.
f920: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 72 65  ** CAPI3REF: Cre
f930: 61 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ate a changeset 
f940: 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a  rebaser object..
f950: 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a  ** EXPERIMENTAL.
f960: 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
f970: 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20 72   new changeset r
f980: 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 20 49  ebaser object. I
f990: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
f9a0: 74 20 28 2a 70 70 4e 65 77 29 20 74 6f 0a 2a 2a  t (*ppNew) to.**
f9b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
f9c0: 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
f9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
f9e0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
f9f0: 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c  error.** occurs,
fa00: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
fa10: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65 2e  e error code (e.
fa20: 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  g. SQLITE_NOMEM)
fa30: 20 61 6e 64 20 73 65 74 20 28 2a 70 70 4e 65 77   and set (*ppNew
fa40: 29 20 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 0a  ) .** to NULL. .
fa50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 65  */.int sqlite3re
fa60: 62 61 73 65 72 5f 63 72 65 61 74 65 28 73 71 6c  baser_create(sql
fa70: 69 74 65 33 5f 72 65 62 61 73 65 72 20 2a 2a 70  ite3_rebaser **p
fa80: 70 4e 65 77 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41  pNew);../*.** CA
fa90: 50 49 33 52 45 46 3a 20 43 6f 6e 66 69 67 75 72  PI3REF: Configur
faa0: 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 72 65  e a changeset re
fab0: 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  baser object..**
fac0: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a 2a   EXPERIMENTAL.**
fad0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  .** Configure th
fae0: 65 20 63 68 61 6e 67 65 73 65 74 20 72 65 62 61  e changeset reba
faf0: 73 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  ser object to re
fb00: 62 61 73 65 20 63 68 61 6e 67 65 73 65 74 73 20  base changesets 
fb10: 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20  according.** to 
fb20: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
fb30: 6f 6c 75 74 69 6f 6e 73 20 64 65 73 63 72 69 62  olutions describ
fb40: 65 64 20 62 79 20 62 75 66 66 65 72 20 70 52 65  ed by buffer pRe
fb50: 62 61 73 65 20 28 73 69 7a 65 20 6e 52 65 62 61  base (size nReba
fb60: 73 65 0a 2a 2a 20 62 79 74 65 73 29 2c 20 77 68  se.** bytes), wh
fb70: 69 63 68 20 6d 75 73 74 20 68 61 76 65 20 62 65  ich must have be
fb80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
fb90: 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
fba0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68   to.** sqlite3ch
fbb0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32  angeset_apply_v2
fbc0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
fbd0: 65 33 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67  e3rebaser_config
fbe0: 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 72  ure(.  sqlite3_r
fbf0: 65 62 61 73 65 72 2a 2c 20 0a 20 20 69 6e 74 20  ebaser*, .  int 
fc00: 6e 52 65 62 61 73 65 2c 20 63 6f 6e 73 74 20 76  nRebase, const v
fc10: 6f 69 64 20 2a 70 52 65 62 61 73 65 0a 29 3b 20  oid *pRebase.); 
fc20: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
fc30: 3a 20 52 65 62 61 73 65 20 61 20 63 68 61 6e 67  : Rebase a chang
fc40: 65 73 65 74 0a 2a 2a 20 45 58 50 45 52 49 4d 45  eset.** EXPERIME
fc50: 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  NTAL.**.** Argum
fc60: 65 6e 74 20 70 49 6e 20 6d 75 73 74 20 70 6f 69  ent pIn must poi
fc70: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
fc80: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 68 61 6e  ontaining a chan
fc90: 67 65 73 65 74 20 6e 49 6e 20 62 79 74 65 73 0a  geset nIn bytes.
fca0: 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  ** in size. This
fcb0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
fcc0: 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  tes and populate
fcd0: 73 20 61 20 62 75 66 66 65 72 20 77 69 74 68 20  s a buffer with 
fce0: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
fcf0: 20 63 68 61 6e 67 65 73 65 74 20 72 65 62 61 73   changeset rebas
fd00: 65 64 20 72 65 62 61 73 65 64 20 61 63 63 6f 72  ed rebased accor
fd10: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6e 66  ding to the conf
fd20: 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iguration of the
fd30: 0a 2a 2a 20 72 65 62 61 73 65 72 20 6f 62 6a 65  .** rebaser obje
fd40: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
fd50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
fd60: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
fd70: 28 2a 70 70 4f 75 74 29 0a 2a 2a 20 69 73 20 73  (*ppOut).** is s
fd80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
fd90: 68 65 20 6e 65 77 20 62 75 66 66 65 72 20 63 6f  he new buffer co
fda0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 62  ntaining the reb
fdb0: 61 73 65 64 20 63 68 61 6e 67 73 65 74 20 61 6e  ased changset an
fdc0: 64 20 0a 2a 2a 20 28 2a 70 6e 4f 75 74 29 20 74  d .** (*pnOut) t
fdd0: 6f 20 69 74 73 20 73 69 7a 65 20 69 6e 20 62 79  o its size in by
fde0: 74 65 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  tes and SQLITE_O
fdf0: 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  K returned. It i
fe00: 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
fe10: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
fe20: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
fe30: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 6e 65 77  lly free the new
fe40: 20 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a 2a   buffer using.**
fe50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
fe60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
fe70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fe80: 28 2a 70 70 4f 75 74 29 20 61 6e 64 20 28 2a 70  (*ppOut) and (*p
fe90: 6e 4f 75 74 29 0a 2a 2a 20 61 72 65 20 73 65 74  nOut).** are set
fea0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 6e 20   to zero and an 
feb0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
fec0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  e returned..*/.i
fed0: 6e 74 20 73 71 6c 69 74 65 33 72 65 62 61 73 65  nt sqlite3rebase
fee0: 72 5f 72 65 62 61 73 65 28 0a 20 20 73 71 6c 69  r_rebase(.  sqli
fef0: 74 65 33 5f 72 65 62 61 73 65 72 2a 2c 0a 20 20  te3_rebaser*,.  
ff00: 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74 20 76  int nIn, const v
ff10: 6f 69 64 20 2a 70 49 6e 2c 20 0a 20 20 69 6e 74  oid *pIn, .  int
ff20: 20 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20 2a 2a   *pnOut, void **
ff30: 70 70 4f 75 74 20 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ppOut .);../*.**
ff40: 20 43 41 50 49 33 52 45 46 3a 20 44 65 6c 65 74   CAPI3REF: Delet
ff50: 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 72 65  e a changeset re
ff60: 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  baser object..**
ff70: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a 2a   EXPERIMENTAL.**
ff80: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63  .** Delete the c
ff90: 68 61 6e 67 65 73 65 74 20 72 65 62 61 73 65 72  hangeset rebaser
ffa0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 61 6c 6c 20   object and all 
ffb0: 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75  associated resou
ffc0: 72 63 65 73 2e 20 54 68 65 72 65 0a 2a 2a 20 73  rces. There.** s
ffd0: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 63 61 6c  hould be one cal
ffe0: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
fff0: 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 75 63 63  on for each succ
10000 65 73 73 66 75 6c 20 69 6e 76 6f 63 61 74 69 6f  essful invocatio
10010 6e 0a 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33 72  n.** of sqlite3r
10020 65 62 61 73 65 72 5f 63 72 65 61 74 65 28 29 2e  ebaser_create().
10030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10040 72 65 62 61 73 65 72 5f 64 65 6c 65 74 65 28 73  rebaser_delete(s
10050 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20 2a  qlite3_rebaser *
10060 70 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  p); ../*.** CAPI
10070 33 52 45 46 3a 20 53 74 72 65 61 6d 69 6e 67 20  3REF: Streaming 
10080 56 65 72 73 69 6f 6e 73 20 6f 66 20 41 50 49 20  Versions of API 
10090 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
100a0 20 54 68 65 20 73 69 78 20 73 74 72 65 61 6d 69   The six streami
100b0 6e 67 20 41 50 49 20 78 78 78 5f 73 74 72 6d 28  ng API xxx_strm(
100c0 29 20 66 75 6e 63 74 69 6f 6e 73 20 73 65 72 76  ) functions serv
100d0 65 20 73 69 6d 69 6c 61 72 20 70 75 72 70 6f 73  e similar purpos
100e0 65 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 6f  es to the .** co
100f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 6f 6e 2d  rresponding non-
10100 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75  streaming API fu
10110 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 3c  nctions:.**.** <
10120 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73  table border=1 s
10130 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66  tyle="margin-lef
10140 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67  t:8ex;margin-rig
10150 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74  ht:8ex">.**   <t
10160 72 3e 3c 74 68 3e 53 74 72 65 61 6d 69 6e 67 20  r><th>Streaming 
10170 66 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e 6f 6e 2d  function<th>Non-
10180 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69 76 61  streaming equiva
10190 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20 20 20 3c  lent</th>.**   <
101a0 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63 68  tr><td>sqlite3ch
101b0 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73 74  angeset_apply_st
101c0 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68  rm<td>[sqlite3ch
101d0 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5d 20 0a  angeset_apply] .
101e0 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c  **   <tr><td>sql
101f0 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
10200 70 6c 79 5f 73 74 72 6d 5f 76 32 3c 74 64 3e 5b  ply_strm_v2<td>[
10210 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
10220 5f 61 70 70 6c 79 5f 76 32 5d 20 0a 2a 2a 20 20  _apply_v2] .**  
10230 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33   <tr><td>sqlite3
10240 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74  changeset_concat
10250 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65  _strm<td>[sqlite
10260 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
10270 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64  t] .**   <tr><td
10280 3e 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  >sqlite3changese
10290 74 5f 69 6e 76 65 72 74 5f 73 74 72 6d 3c 74 64  t_invert_strm<td
102a0 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  >[sqlite3changes
102b0 65 74 5f 69 6e 76 65 72 74 5d 20 0a 2a 2a 20 20  et_invert] .**  
102c0 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33   <tr><td>sqlite3
102d0 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f  changeset_start_
102e0 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33  strm<td>[sqlite3
102f0 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5d  changeset_start]
10300 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73   .**   <tr><td>s
10310 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
10320 61 6e 67 65 73 65 74 5f 73 74 72 6d 3c 74 64 3e  angeset_strm<td>
10330 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
10340 63 68 61 6e 67 65 73 65 74 5d 20 0a 2a 2a 20 20  changeset] .**  
10350 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33   <tr><td>sqlite3
10360 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74  session_patchset
10370 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65  _strm<td>[sqlite
10380 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
10390 74 5d 20 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e 0a  t] .** </table>.
103a0 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 73 74 72 65 61 6d  **.** Non-stream
103b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ing functions th
103c0 61 74 20 61 63 63 65 70 74 20 63 68 61 6e 67 65  at accept change
103d0 73 65 74 73 20 28 6f 72 20 70 61 74 63 68 73 65  sets (or patchse
103e0 74 73 29 20 61 73 20 69 6e 70 75 74 0a 2a 2a 20  ts) as input.** 
103f0 72 65 71 75 69 72 65 20 74 68 61 74 20 74 68 65  require that the
10400 20 65 6e 74 69 72 65 20 63 68 61 6e 67 65 73 65   entire changese
10410 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  t be stored in a
10420 20 73 69 6e 67 6c 65 20 62 75 66 66 65 72 20 69   single buffer i
10430 6e 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 20 53 69  n memory. .** Si
10440 6d 69 6c 61 72 6c 79 2c 20 74 68 6f 73 65 20 74  milarly, those t
10450 68 61 74 20 72 65 74 75 72 6e 20 61 20 63 68 61  hat return a cha
10460 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73  ngeset or patchs
10470 65 74 20 64 6f 20 73 6f 20 62 79 20 72 65 74 75  et do so by retu
10480 72 6e 69 6e 67 20 0a 2a 2a 20 61 20 70 6f 69 6e  rning .** a poin
10490 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
104a0 6c 61 72 67 65 20 62 75 66 66 65 72 20 61 6c 6c  large buffer all
104b0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
104c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 0a  ite3_malloc(). .
104d0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 20 74 68 69 73  ** Normally this
104e0 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e 20   is convenient. 
104f0 48 6f 77 65 76 65 72 2c 20 69 66 20 61 6e 20 61  However, if an a
10500 70 70 6c 69 63 61 74 69 6f 6e 20 72 75 6e 6e 69  pplication runni
10510 6e 67 20 69 6e 20 61 20 0a 2a 2a 20 6c 6f 77 2d  ng in a .** low-
10520 6d 65 6d 6f 72 79 20 65 6e 76 69 72 6f 6e 6d 65  memory environme
10530 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74  nt is required t
10540 6f 20 68 61 6e 64 6c 65 20 76 65 72 79 20 6c 61  o handle very la
10550 72 67 65 20 63 68 61 6e 67 65 73 65 74 73 2c 20  rge changesets, 
10560 74 68 65 0a 2a 2a 20 6c 61 72 67 65 20 63 6f 6e  the.** large con
10570 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 61  tiguous memory a
10580 6c 6c 6f 63 61 74 69 6f 6e 73 20 72 65 71 75 69  llocations requi
10590 72 65 64 20 63 61 6e 20 62 65 63 6f 6d 65 20 6f  red can become o
105a0 6e 65 72 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  nerous..**.** In
105b0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
105c0 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 69 6e  this problem, in
105d0 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c  stead of a singl
105e0 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2c 20  e large buffer, 
105f0 69 6e 70 75 74 0a 2a 2a 20 69 73 20 70 61 73 73  input.** is pass
10600 65 64 20 74 6f 20 61 20 73 74 72 65 61 6d 69 6e  ed to a streamin
10610 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  g API functions 
10620 62 79 20 77 61 79 20 6f 66 20 61 20 63 61 6c 6c  by way of a call
10630 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 68  back function th
10640 61 74 0a 2a 2a 20 74 68 65 20 73 65 73 73 69 6f  at.** the sessio
10650 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 76 6f 6b 65  ns module invoke
10660 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s to incremental
10670 6c 79 20 72 65 71 75 65 73 74 20 69 6e 70 75 74  ly request input
10680 20 64 61 74 61 20 61 73 20 69 74 20 69 73 0a 2a   data as it is.*
10690 2a 20 72 65 71 75 69 72 65 64 2e 20 49 6e 20 61  * required. In a
106a0 6c 6c 20 63 61 73 65 73 2c 20 61 20 70 61 69 72  ll cases, a pair
106b0 20 6f 66 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   of API function
106c0 20 70 61 72 61 6d 65 74 65 72 73 20 73 75 63 68   parameters such
106d0 20 61 73 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e   as.**.**  <pre>
106e0 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20  .**  &nbsp;     
106f0 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 0a  int nChangeset,.
10700 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76  **  &nbsp;     v
10710 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c  oid *pChangeset,
10720 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a  .**  </pre>.**.*
10730 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20 62 79  * Is replaced by
10740 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a  :.**.**  <pre>.*
10750 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e  *  &nbsp;     in
10760 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64  t (*xInput)(void
10770 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61   *pIn, void *pDa
10780 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29  ta, int *pnData)
10790 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  ,.**  &nbsp;    
107a0 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 2a 2a 20 20   void *pIn,.**  
107b0 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 45 61 63  </pre>.**.** Eac
107c0 68 20 74 69 6d 65 20 74 68 65 20 78 49 6e 70 75  h time the xInpu
107d0 74 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  t callback is in
107e0 76 6f 6b 65 64 20 62 79 20 74 68 65 20 73 65 73  voked by the ses
107f0 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 2c 20 74 68  sions module, th
10800 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
10810 65 6e 74 20 70 61 73 73 65 64 20 69 73 20 61 20  ent passed is a 
10820 63 6f 70 79 20 6f 66 20 74 68 65 20 73 75 70 70  copy of the supp
10830 6c 69 65 64 20 70 49 6e 20 63 6f 6e 74 65 78 74  lied pIn context
10840 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 65   pointer. The se
10850 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
10860 74 2c 20 70 44 61 74 61 2c 20 70 6f 69 6e 74 73  t, pData, points
10870 20 74 6f 20 61 20 62 75 66 66 65 72 20 28 2a 70   to a buffer (*p
10880 6e 44 61 74 61 29 20 62 79 74 65 73 20 69 6e 20  nData) bytes in 
10890 73 69 7a 65 2e 20 41 73 73 75 6d 69 6e 67 20 6e  size. Assuming n
108a0 6f 20 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  o .** error occu
108b0 72 73 20 74 68 65 20 78 49 6e 70 75 74 20 6d 65  rs the xInput me
108c0 74 68 6f 64 20 73 68 6f 75 6c 64 20 63 6f 70 79  thod should copy
108d0 20 75 70 20 74 6f 20 28 2a 70 6e 44 61 74 61 29   up to (*pnData)
108e0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 0a   bytes of data .
108f0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ** into the buff
10900 65 72 20 61 6e 64 20 73 65 74 20 28 2a 70 6e 44  er and set (*pnD
10910 61 74 61 29 20 74 6f 20 74 68 65 20 61 63 74 75  ata) to the actu
10920 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
10930 65 73 20 63 6f 70 69 65 64 20 0a 2a 2a 20 62 65  es copied .** be
10940 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
10950 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
10960 20 69 6e 70 75 74 20 69 73 20 63 6f 6d 70 6c 65   input is comple
10970 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2c 20  tely exhausted, 
10980 28 2a 70 6e 44 61 74 61 29 20 0a 2a 2a 20 73 68  (*pnData) .** sh
10990 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 7a  ould be set to z
109a0 65 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ero to indicate 
109b0 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 61 6e 20  this. Or, if an 
109c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
109d0 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f   SQLite .** erro
109e0 72 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  r code should be
109f0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 61 6c   returned. In al
10a00 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20 78  l cases, if an x
10a10 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 72  Input callback r
10a20 65 74 75 72 6e 73 0a 2a 2a 20 61 6e 20 65 72 72  eturns.** an err
10a30 6f 72 2c 20 61 6c 6c 20 70 72 6f 63 65 73 73 69  or, all processi
10a40 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20  ng is abandoned 
10a50 61 6e 64 20 74 68 65 20 73 74 72 65 61 6d 69 6e  and the streamin
10a60 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 0a 2a  g API function.*
10a70 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  * returns a copy
10a80 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   of the error co
10a90 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10aa0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
10ab0 61 73 65 20 6f 66 20 73 71 6c 69 74 65 33 63 68  ase of sqlite3ch
10ac0 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74  angeset_start_st
10ad0 72 6d 28 29 2c 20 74 68 65 20 78 49 6e 70 75 74  rm(), the xInput
10ae0 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 62 65   callback may be
10af0 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  .** invoked by t
10b00 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
10b10 6c 65 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20  le at any point 
10b20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74  during the lifet
10b30 69 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 74  ime of the.** it
10b40 65 72 61 74 6f 72 2e 20 49 66 20 73 75 63 68 20  erator. If such 
10b50 61 6e 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61  an xInput callba
10b60 63 6b 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ck returns an er
10b70 72 6f 72 2c 20 74 68 65 20 69 74 65 72 61 74 6f  ror, the iterato
10b80 72 20 65 6e 74 65 72 73 0a 2a 2a 20 61 6e 20 65  r enters.** an e
10b90 72 72 6f 72 20 73 74 61 74 65 2c 20 77 68 65 72  rror state, wher
10ba0 65 62 79 20 61 6c 6c 20 73 75 62 73 65 71 75 65  eby all subseque
10bb0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 69 74 65 72  nt calls to iter
10bc0 61 74 6f 72 20 66 75 6e 63 74 69 6f 6e 73 20 0a  ator functions .
10bd0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
10be0 61 69 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d  ail with the sam
10bf0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 73 20  e error code as 
10c00 72 65 74 75 72 6e 65 64 20 62 79 20 78 49 6e 70  returned by xInp
10c10 75 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d 69 6c 61  ut..**.** Simila
10c20 72 6c 79 2c 20 73 74 72 65 61 6d 69 6e 67 20 41  rly, streaming A
10c30 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  PI functions tha
10c40 74 20 72 65 74 75 72 6e 20 63 68 61 6e 67 65 73  t return changes
10c50 65 74 73 20 28 6f 72 20 70 61 74 63 68 73 65 74  ets (or patchset
10c60 73 29 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  s).** return the
10c70 6d 20 69 6e 20 63 68 75 6e 6b 73 20 62 79 20 77  m in chunks by w
10c80 61 79 20 6f 66 20 61 20 63 61 6c 6c 62 61 63 6b  ay of a callback
10c90 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 74 65 61   function instea
10ca0 64 20 6f 66 20 76 69 61 20 61 0a 2a 2a 20 70 6f  d of via a.** po
10cb0 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
10cc0 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 20  e large buffer. 
10cd0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 20  In this case, a 
10ce0 70 61 69 72 20 6f 66 20 70 61 72 61 6d 65 74 65  pair of paramete
10cf0 72 73 20 73 75 63 68 0a 2a 2a 20 61 73 3a 0a 2a  rs such.** as:.*
10d00 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  *.**  <pre>.**  
10d10 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20 2a  &nbsp;     int *
10d20 70 6e 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20  pnChangeset,.** 
10d30 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69 64   &nbsp;     void
10d40 20 2a 2a 70 70 43 68 61 6e 67 65 73 65 74 2c 0a   **ppChangeset,.
10d50 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a  **  </pre>.**.**
10d60 20 49 73 20 72 65 70 6c 61 63 65 64 20 62 79 3a   Is replaced by:
10d70 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a  .**.**  <pre>.**
10d80 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74    &nbsp;     int
10d90 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64   (*xOutput)(void
10da0 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f   *pOut, const vo
10db0 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
10dc0 44 61 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73 70  Data),.**  &nbsp
10dd0 3b 20 20 20 20 20 76 6f 69 64 20 2a 70 4f 75 74  ;     void *pOut
10de0 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a  .**  </pre>.**.*
10df0 2a 20 54 68 65 20 78 4f 75 74 70 75 74 20 63 61  * The xOutput ca
10e00 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
10e10 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74  d zero or more t
10e20 69 6d 65 73 20 74 6f 20 72 65 74 75 72 6e 20 64  imes to return d
10e30 61 74 61 20 74 6f 0a 2a 2a 20 74 68 65 20 61 70  ata to.** the ap
10e40 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68 65 20 66  plication. The f
10e50 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 70  irst parameter p
10e60 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 63 61  assed to each ca
10e70 6c 6c 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ll is a copy of 
10e80 74 68 65 0a 2a 2a 20 70 4f 75 74 20 70 6f 69 6e  the.** pOut poin
10e90 74 65 72 20 73 75 70 70 6c 69 65 64 20 62 79 20  ter supplied by 
10ea0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
10eb0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
10ec0 6d 65 74 65 72 2c 20 70 44 61 74 61 2c 0a 2a 2a  meter, pData,.**
10ed0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
10ee0 66 65 72 20 6e 44 61 74 61 20 62 79 74 65 73 20  fer nData bytes 
10ef0 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
10f00 6e 67 20 74 68 65 20 63 68 75 6e 6b 20 6f 66 20  ng the chunk of 
10f10 6f 75 74 70 75 74 0a 2a 2a 20 64 61 74 61 20 62  output.** data b
10f20 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 20 49  eing returned. I
10f30 66 20 74 68 65 20 78 4f 75 74 70 75 74 20 63 61  f the xOutput ca
10f40 6c 6c 62 61 63 6b 20 73 75 63 63 65 73 73 66 75  llback successfu
10f50 6c 6c 79 20 70 72 6f 63 65 73 73 65 73 20 74 68  lly processes th
10f60 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 64 61  e.** supplied da
10f70 74 61 2c 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ta, it should re
10f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 74  turn SQLITE_OK t
10f90 6f 20 69 6e 64 69 63 61 74 65 20 73 75 63 63 65  o indicate succe
10fa0 73 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ss. Otherwise,.*
10fb0 2a 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  * it should retu
10fc0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51  rn some other SQ
10fd0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
10fe0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 70 72   In this case pr
10ff0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 69 73 20 69  ocessing.** is i
11000 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 61 6e 64  mmediately aband
11010 6f 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 72  oned and the str
11020 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74  eaming API funct
11030 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ion returns a co
11040 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 75  py.** of the xOu
11050 74 70 75 74 20 65 72 72 6f 72 20 63 6f 64 65 20  tput error code 
11060 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  to the applicati
11070 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  on..**.** The se
11080 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 6e 65  ssions module ne
11090 76 65 72 20 69 6e 76 6f 6b 65 73 20 61 6e 20 78  ver invokes an x
110a0 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20  Output callback 
110b0 77 69 74 68 20 74 68 65 20 74 68 69 72 64 20 0a  with the third .
110c0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 73 65 74  ** parameter set
110d0 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73 73   to a value less
110e0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
110f0 6f 20 7a 65 72 6f 2e 20 4f 74 68 65 72 20 74 68  o zero. Other th
11100 61 6e 20 74 68 69 73 2c 0a 2a 2a 20 6e 6f 20 67  an this,.** no g
11110 75 61 72 61 6e 74 65 65 73 20 61 72 65 20 6d 61  uarantees are ma
11120 64 65 20 61 73 20 74 6f 20 74 68 65 20 73 69 7a  de as to the siz
11130 65 20 6f 66 20 74 68 65 20 63 68 75 6e 6b 73 20  e of the chunks 
11140 6f 66 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  of data returned
11150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11160 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
11170 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 20  strm(.  sqlite3 
11180 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11190 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79          /* Apply
111a0 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e   change to "main
111b0 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e  " db of this han
111c0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  dle */.  int (*x
111d0 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e  Input)(void *pIn
111e0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  , void *pData, i
111f0 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a 20  nt *pnData), /* 
11200 49 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 20 2a  Input function *
11210 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20  /.  void *pIn,  
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11250 20 61 72 67 20 66 6f 72 20 78 49 6e 70 75 74 20   arg for xInput 
11260 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65  */.  int(*xFilte
11270 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  r)(.    void *pC
11280 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
11290 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
112a0 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
112b0 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f  pply() */.    co
112c0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20  nst char *zTab  
112d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
112e0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29  able name */.  )
112f0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69  ,.  int(*xConfli
11300 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  ct)(.    void *p
11310 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
11320 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
11330 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
11340 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69  apply() */.    i
11350 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20  nt eConflict,   
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11370 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43  DATA, MISSING, C
11380 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41  ONFLICT, CONSTRA
11390 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INT */.    sqlit
113a0 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
113b0 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64  r *p     /* Hand
113c0 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68  le describing ch
113d0 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63  ange and conflic
113e0 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64  t */.  ),.  void
113f0 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20 20   *pCtx          
11400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11410 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
11420 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63  ssed to xConflic
11430 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  t */.);.int sqli
11440 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
11450 6c 79 5f 76 32 5f 73 74 72 6d 28 0a 20 20 73 71  ly_v2_strm(.  sq
11460 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11480 20 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f   Apply change to
11490 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68   "main" db of th
114a0 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  is handle */.  i
114b0 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
114c0 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
114d0 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
114e0 29 2c 20 2f 2a 20 49 6e 70 75 74 20 66 75 6e 63  ), /* Input func
114f0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
11500 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pIn,            
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11530 20 46 69 72 73 74 20 61 72 67 20 66 6f 72 20 78   First arg for x
11540 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 28 2a  Input */.  int(*
11550 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f  xFilter)(.    vo
11560 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
11570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11580 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61 72 67  opy of sixth arg
11590 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a   to _apply() */.
115a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
115b0 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20  zTab            
115c0 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
115d0 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78  */.  ),.  int(*x
115e0 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20 20 76  Conflict)(.    v
115f0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11610 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61 72  Copy of sixth ar
11620 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f  g to _apply() */
11630 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69  .    int eConfli
11640 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
11650 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53     /* DATA, MISS
11660 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43  ING, CONFLICT, C
11670 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20  ONSTRAINT */.   
11680 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
11690 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20 20 2f  et_iter *p     /
116a0 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72 69 62  * Handle describ
116b0 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20 63  ing change and c
116c0 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a  onflict */.  ),.
116d0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
11700 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
11710 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 76 6f 69  onflict */.  voi
11720 64 20 2a 2a 70 70 52 65 62 61 73 65 2c 20 69 6e  d **ppRebase, in
11730 74 20 2a 70 6e 52 65 62 61 73 65 2c 0a 20 20 69  t *pnRebase,.  i
11740 6e 74 20 66 6c 61 67 73 0a 29 3b 0a 69 6e 74 20  nt flags.);.int 
11750 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
11760 5f 63 6f 6e 63 61 74 5f 73 74 72 6d 28 0a 20 20  _concat_strm(.  
11770 69 6e 74 20 28 2a 78 49 6e 70 75 74 41 29 28 76  int (*xInputA)(v
11780 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a  oid *pIn, void *
11790 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61  pData, int *pnDa
117a0 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e  ta),.  void *pIn
117b0 41 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75  A,.  int (*xInpu
117c0 74 42 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  tB)(void *pIn, v
117d0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
117e0 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  *pnData),.  void
117f0 20 2a 70 49 6e 42 2c 0a 20 20 69 6e 74 20 28 2a   *pInB,.  int (*
11800 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70  xOutput)(void *p
11810 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Out, const void 
11820 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
11830 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74  a),.  void *pOut
11840 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .);.int sqlite3c
11850 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f  hangeset_invert_
11860 73 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a 78 49  strm(.  int (*xI
11870 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
11880 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
11890 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
118a0 69 64 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28  id *pIn,.  int (
118b0 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
118c0 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
118d0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
118e0 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75  ta),.  void *pOu
118f0 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.);.int sqlite3
11900 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f  changeset_start_
11910 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f  strm(.  sqlite3_
11920 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
11930 2a 70 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e  *pp,.  int (*xIn
11940 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20  put)(void *pIn, 
11950 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
11960 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69   *pnData),.  voi
11970 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71  d *pIn.);.int sq
11980 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
11990 74 61 72 74 5f 76 32 5f 73 74 72 6d 28 0a 20 20  tart_v2_strm(.  
119a0 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
119b0 74 5f 69 74 65 72 20 2a 2a 70 70 2c 0a 20 20 69  t_iter **pp,.  i
119c0 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
119d0 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
119e0 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
119f0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a  ),.  void *pIn,.
11a00 20 20 69 6e 74 20 66 6c 61 67 73 0a 29 3b 0a 69    int flags.);.i
11a10 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
11a20 6e 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72 6d  n_changeset_strm
11a30 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
11a40 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20  ion *pSession,. 
11a50 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28   int (*xOutput)(
11a60 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73  void *pOut, cons
11a70 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
11a80 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69  nt nData),.  voi
11a90 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73  d *pOut.);.int s
11aa0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
11ab0 74 63 68 73 65 74 5f 73 74 72 6d 28 0a 20 20 73  tchset_strm(.  s
11ac0 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
11ad0 70 53 65 73 73 69 6f 6e 2c 0a 20 20 69 6e 74 20  pSession,.  int 
11ae0 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20  (*xOutput)(void 
11af0 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69  *pOut, const voi
11b00 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
11b10 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f  ata),.  void *pO
11b20 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  ut.);.int sqlite
11b30 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64  3changegroup_add
11b40 5f 73 74 72 6d 28 73 71 6c 69 74 65 33 5f 63 68  _strm(sqlite3_ch
11b50 61 6e 67 65 67 72 6f 75 70 2a 2c 20 0a 20 20 20  angegroup*, .   
11b60 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76   int (*xInput)(v
11b70 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a  oid *pIn, void *
11b80 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61  pData, int *pnDa
11b90 74 61 29 2c 0a 20 20 20 20 76 6f 69 64 20 2a 70  ta),.    void *p
11ba0 49 6e 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  In.);.int sqlite
11bb0 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74  3changegroup_out
11bc0 70 75 74 5f 73 74 72 6d 28 73 71 6c 69 74 65 33  put_strm(sqlite3
11bd0 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c 0a 20  _changegroup*,. 
11be0 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74     int (*xOutput
11bf0 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f  )(void *pOut, co
11c00 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
11c10 20 69 6e 74 20 6e 44 61 74 61 29 2c 20 0a 20 20   int nData), .  
11c20 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a    void *pOut.);.
11c30 69 6e 74 20 73 71 6c 69 74 65 33 72 65 62 61 73  int sqlite3rebas
11c40 65 72 5f 72 65 62 61 73 65 5f 73 74 72 6d 28 0a  er_rebase_strm(.
11c50 20 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65    sqlite3_rebase
11c60 72 20 2a 70 52 65 62 61 73 65 72 2c 0a 20 20 69  r *pRebaser,.  i
11c70 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
11c80 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
11c90 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
11ca0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a  ),.  void *pIn,.
11cb0 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29    int (*xOutput)
11cc0 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e  (void *pOut, con
11cd0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
11ce0 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f  int nData),.  vo
11cf0 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 0a 2f 2a 0a  id *pOut.);../*.
11d00 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e  ** CAPI3REF: Con
11d10 66 69 67 75 72 65 20 67 6c 6f 62 61 6c 20 70 61  figure global pa
11d20 72 61 6d 65 74 65 72 73 0a 2a 2a 0a 2a 2a 20 54  rameters.**.** T
11d30 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  he sqlite3sessio
11d40 6e 5f 63 6f 6e 66 69 67 28 29 20 69 6e 74 65 72  n_config() inter
11d50 66 61 63 65 20 69 73 20 75 73 65 64 20 74 6f 20  face is used to 
11d60 6d 61 6b 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66  make global conf
11d70 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 63 68 61  iguration.** cha
11d80 6e 67 65 73 20 74 6f 20 74 68 65 20 73 65 73 73  nges to the sess
11d90 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 20 6f  ions module in o
11da0 72 64 65 72 20 74 6f 20 74 75 6e 65 20 69 74 20  rder to tune it 
11db0 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 63 20  to the specific 
11dc0 6e 65 65 64 73 20 0a 2a 2a 20 6f 66 20 74 68 65  needs .** of the
11dd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a   application..**
11de0 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 73  .** The sqlite3s
11df0 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 20  ession_config() 
11e00 69 6e 74 65 72 66 61 63 65 20 69 73 20 6e 6f 74  interface is not
11e10 20 74 68 72 65 61 64 73 61 66 65 2e 20 49 66 20   threadsafe. If 
11e20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a  it is invoked.**
11e30 20 77 68 69 6c 65 20 61 6e 79 20 6f 74 68 65 72   while any other
11e40 20 74 68 72 65 61 64 20 69 73 20 69 6e 73 69 64   thread is insid
11e50 65 20 61 6e 79 20 6f 74 68 65 72 20 73 65 73 73  e any other sess
11e60 69 6f 6e 73 20 6d 65 74 68 6f 64 20 74 68 65 6e  ions method then
11e70 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
11e80 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 46  are undefined. F
11e90 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 69  urthermore, if i
11ea0 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  t is invoked aft
11eb0 65 72 20 61 6e 79 20 73 65 73 73 69 6f 6e 73 0a  er any sessions.
11ec0 2a 2a 20 72 65 6c 61 74 65 64 20 6f 62 6a 65 63  ** related objec
11ed0 74 73 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ts have been cre
11ee0 61 74 65 64 2c 20 74 68 65 20 72 65 73 75 6c 74  ated, the result
11ef0 73 20 61 72 65 20 61 6c 73 6f 20 75 6e 64 65 66  s are also undef
11f00 69 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ined. .**.** The
11f10 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
11f20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 73 65  to the sqlite3se
11f30 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 20 66  ssion_config() f
11f40 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
11f50 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51  one.** of the SQ
11f60 4c 49 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f 4e  LITE_SESSION_CON
11f70 46 49 47 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74  FIG_XXX constant
11f80 73 20 64 65 66 69 6e 65 64 20 62 65 6c 6f 77 2e  s defined below.
11f90 20 54 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70 72   The .** interpr
11fa0 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 28  etation of the (
11fb0 76 6f 69 64 2a 29 20 76 61 6c 75 65 20 70 61 73  void*) value pas
11fc0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
11fd0 64 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a  d parameter and.
11fe0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  ** the effect of
11ff0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
12000 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  nction depends o
12010 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
12020 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 72 61  he first.** para
12030 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c  meter..**.** <dl
12040 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f  >.** <dt>SQLITE_
12050 53 45 53 53 49 4f 4e 5f 43 4f 4e 46 49 47 5f 53  SESSION_CONFIG_S
12060 54 52 4d 53 49 5a 45 3c 64 64 3e 0a 2a 2a 20 20  TRMSIZE<dd>.**  
12070 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
12080 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c  e sessions modul
12090 65 20 73 74 72 65 61 6d 69 6e 67 20 69 6e 74 65  e streaming inte
120a0 72 66 61 63 65 73 20 61 74 74 65 6d 70 74 20 74  rfaces attempt t
120b0 6f 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 61 6e  o input.**    an
120c0 64 20 6f 75 74 70 75 74 20 64 61 74 61 20 69 6e  d output data in
120d0 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31   approximately 1
120e0 20 4b 69 42 20 63 68 75 6e 6b 73 2e 20 54 68 69   KiB chunks. Thi
120f0 73 20 6f 70 65 72 61 6e 64 20 6d 61 79 20 62 65  s operand may be
12100 20 75 73 65 64 0a 2a 2a 20 20 20 20 74 6f 20 73   used.**    to s
12110 65 74 20 61 6e 64 20 71 75 65 72 79 20 74 68 65  et and query the
12120 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63   value of this c
12130 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
12140 74 69 6e 67 2e 20 54 68 65 20 70 6f 69 6e 74 65  ting. The pointe
12150 72 0a 2a 2a 20 20 20 20 70 61 73 73 65 64 20 61  r.**    passed a
12160 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
12170 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
12180 20 74 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 74   to a value of t
12190 79 70 65 20 28 69 6e 74 29 2e 0a 2a 2a 20 20 20  ype (int)..**   
121a0 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
121b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
121c0 2c 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20  , it is used as 
121d0 74 68 65 20 6e 65 77 20 73 74 72 65 61 6d 69 6e  the new streamin
121e0 67 20 64 61 74 61 0a 2a 2a 20 20 20 20 63 68 75  g data.**    chu
121f0 6e 6b 20 73 69 7a 65 20 66 6f 72 20 62 6f 74 68  nk size for both
12200 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75   input and outpu
12210 74 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  t. Before return
12220 69 6e 67 2c 20 74 68 65 20 28 69 6e 74 29 20 76  ing, the (int) v
12230 61 6c 75 65 0a 2a 2a 20 20 20 20 70 6f 69 6e 74  alue.**    point
12240 65 64 20 74 6f 20 62 79 20 70 41 72 67 20 69 73  ed to by pArg is
12250 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 6e 61   set to the fina
12260 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  l value of the s
12270 74 72 65 61 6d 69 6e 67 20 69 6e 74 65 72 66 61  treaming interfa
12280 63 65 0a 2a 2a 20 20 20 20 63 68 75 6e 6b 20 73  ce.**    chunk s
12290 69 7a 65 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2a  ize..** </dl>.**
122a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
122b0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
122c0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
122d0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
122e0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 74  error code.** ot
122f0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
12300 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
12310 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 76 6f  onfig(int op, vo
12320 69 64 20 2a 70 41 72 67 29 3b 0a 0a 2f 2a 0a 2a  id *pArg);../*.*
12330 2a 20 43 41 50 49 33 52 45 46 3a 20 56 61 6c 75  * CAPI3REF: Valu
12340 65 73 20 66 6f 72 20 73 71 6c 69 74 65 33 73 65  es for sqlite3se
12350 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 2e 0a  ssion_config()..
12360 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  */.#define SQLIT
12370 45 5f 53 45 53 53 49 4f 4e 5f 43 4f 4e 46 49 47  E_SESSION_CONFIG
12380 5f 53 54 52 4d 53 49 5a 45 20 31 0a 0a 2f 2a 0a  _STRMSIZE 1../*.
12390 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
123a0 63 61 6e 20 63 61 6c 6c 20 74 68 69 73 20 73 74  can call this st
123b0 75 66 66 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f  uff from C++..*/
123c0 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70  .#ifdef __cplusp
123d0 6c 75 73 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65  lus.}.#endif..#e
123e0 6e 64 69 66 20 20 2f 2a 20 21 64 65 66 69 6e 65  ndif  /* !define
123f0 64 28 5f 5f 53 51 4c 49 54 45 53 45 53 53 49 4f  d(__SQLITESESSIO
12400 4e 5f 48 5f 29 20 26 26 20 64 65 66 69 6e 65 64  N_H_) && defined
12410 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
12420 45 53 53 49 4f 4e 29 20 2a 2f 0a                 ESSION) */.