/ Hex Artifact Content
Login

Artifact 2e1584b030fbd841cefdce15ba984871978d305f586da2d1972f6e1958fa10b1:


0000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
0010: 53 51 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f  SQLITESESSION_H_
0020: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
0030: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
0040: 4f 4e 29 0a 23 64 65 66 69 6e 65 20 5f 5f 53 51  ON).#define __SQ
0050: 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f 20 31  LITESESSION_H_ 1
0060: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
0070: 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 68  e we can call th
0080: 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 2b  is stuff from C+
0090: 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 63  +..*/.#ifdef __c
00a0: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
00b0: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 23 69  "C" {.#endif..#i
00c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
00d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  h"../*.** CAPI3R
00e0: 45 46 3a 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65  EF: Session Obje
00f0: 63 74 20 48 61 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20  ct Handle.**.** 
0100: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0110: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 61 20  his object is a 
0120: 5b 73 65 73 73 69 6f 6e 5d 20 74 68 61 74 20 63  [session] that c
0130: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 2a 2a  an be used to.**
0140: 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   record changes 
0150: 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a  to a database..*
0160: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0170: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0180: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0190: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
01a0: 46 3a 20 43 68 61 6e 67 65 73 65 74 20 49 74 65  F: Changeset Ite
01b0: 72 61 74 6f 72 20 48 61 6e 64 6c 65 0a 2a 2a 0a  rator Handle.**.
01c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
01d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 63  f this object ac
01e0: 74 73 20 61 73 20 61 20 63 75 72 73 6f 72 20 66  ts as a cursor f
01f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 0a 2a 2a 20  or iterating.** 
0200: 6f 76 65 72 20 74 68 65 20 65 6c 65 6d 65 6e 74  over the element
0210: 73 20 6f 66 20 61 20 5b 63 68 61 6e 67 65 73 65  s of a [changese
0220: 74 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 5d  t] or [patchset]
0230: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0240: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
0250: 67 65 73 65 74 5f 69 74 65 72 20 73 71 6c 69 74  geset_iter sqlit
0260: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0270: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  r;../*.** CAPI3R
0280: 45 46 3a 20 43 72 65 61 74 65 20 41 20 4e 65 77  EF: Create A New
0290: 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a   Session Object.
02a0: 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20  ** CONSTRUCTOR: 
02b0: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a  sqlite3_session.
02c0: 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  **.** Create a n
02d0: 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63  ew session objec
02e0: 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 64 61  t attached to da
02f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
0300: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
0310: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0320: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
0330: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
0340: 70 53 65 73 73 69 6f 6e 20 61 6e 64 20 53 51 4c  pSession and SQL
0350: 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
0360: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
0370: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 65  or occurs, *ppSe
0380: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
0390: 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69  NULL and an SQLi
03a0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
03b0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f   (e.g. SQLITE_NO
03c0: 4d 45 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64  MEM) is returned
03d0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f  ..**.** It is po
03e0: 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
03f0: 20 6d 75 6c 74 69 70 6c 65 20 73 65 73 73 69 6f   multiple sessio
0400: 6e 20 6f 62 6a 65 63 74 73 20 61 74 74 61 63 68  n objects attach
0410: 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  ed to a single.*
0420: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
0430: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 73 73 69 6f 6e  e..**.** Session
0440: 20 6f 62 6a 65 63 74 73 20 63 72 65 61 74 65 64   objects created
0450: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0460: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64  tion should be d
0470: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 65  eleted using the
0480: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
0490: 69 6f 6e 5f 64 65 6c 65 74 65 28 29 5d 20 66 75  ion_delete()] fu
04a0: 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  nction before th
04b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
04c0: 65 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  e that they.** a
04d0: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  re attached to i
04e0: 73 20 69 74 73 65 6c 66 20 63 6c 6f 73 65 64 2e  s itself closed.
04f0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
0500: 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65   handle is close
0510: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
0520: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
0530: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 6e 20  s deleted, then 
0540: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
0550: 61 6c 6c 69 6e 67 20 61 6e 79 20 73 65 73 73 69  alling any sessi
0560: 6f 6e 0a 2a 2a 20 6d 6f 64 75 6c 65 20 66 75 6e  on.** module fun
0570: 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
0580: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
0590: 5f 64 65 6c 65 74 65 28 29 5d 20 6f 6e 20 74 68  _delete()] on th
05a0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
05b0: 0a 2a 2a 20 61 72 65 20 75 6e 64 65 66 69 6e 65  .** are undefine
05c0: 64 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  d..**.** Because
05d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64   the session mod
05e0: 75 6c 65 20 75 73 65 73 20 74 68 65 20 5b 73 71  ule uses the [sq
05f0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
0600: 68 6f 6f 6b 28 29 5d 20 41 50 49 2c 20 69 74 0a  hook()] API, it.
0610: 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
0620: 6c 65 20 66 6f 72 20 61 6e 20 61 70 70 6c 69 63  le for an applic
0630: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
0640: 72 20 61 20 70 72 65 2d 75 70 64 61 74 65 20 68  r a pre-update h
0650: 6f 6f 6b 20 6f 6e 20 61 0a 2a 2a 20 64 61 74 61  ook on a.** data
0660: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
0670: 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   has one or more
0680: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   session objects
0690: 20 61 74 74 61 63 68 65 64 2e 20 4e 6f 72 20 69   attached. Nor i
06a0: 73 0a 2a 2a 20 69 74 20 70 6f 73 73 69 62 6c 65  s.** it possible
06b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 73   to create a ses
06c0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 74 74 61  sion object atta
06d0: 63 68 65 64 20 74 6f 20 61 20 64 61 74 61 62 61  ched to a databa
06e0: 73 65 20 68 61 6e 64 6c 65 20 66 6f 72 0a 2a 2a  se handle for.**
06f0: 20 77 68 69 63 68 20 61 20 70 72 65 2d 75 70 64   which a pre-upd
0700: 61 74 65 20 68 6f 6f 6b 20 69 73 20 61 6c 72 65  ate hook is alre
0710: 61 64 79 20 64 65 66 69 6e 65 64 2e 20 54 68 65  ady defined. The
0720: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 74 74 65   results of atte
0730: 6d 70 74 69 6e 67 20 0a 2a 2a 20 65 69 74 68 65  mpting .** eithe
0740: 72 20 6f 66 20 74 68 65 73 65 20 74 68 69 6e 67  r of these thing
0750: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
0760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69  .**.** The sessi
0770: 6f 6e 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  on object will b
0780: 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
0790: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
07a0: 74 61 62 6c 65 73 20 69 6e 0a 2a 2a 20 64 61 74  tables in.** dat
07b0: 61 62 61 73 65 20 7a 44 62 2c 20 77 68 65 72 65  abase zDb, where
07c0: 20 7a 44 62 20 69 73 20 65 69 74 68 65 72 20 22   zDb is either "
07d0: 6d 61 69 6e 22 2c 20 6f 72 20 22 74 65 6d 70 22  main", or "temp"
07e0: 2c 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  , or the name of
07f0: 20 61 6e 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   an.** attached 
0800: 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
0810: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
0820: 64 61 74 61 62 61 73 65 20 7a 44 62 20 69 73 20  database zDb is 
0830: 6e 6f 74 20 61 74 74 61 63 68 65 64 0a 2a 2a 20  not attached.** 
0840: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0850: 77 68 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e  when the session
0860: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
0870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0880: 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65  e3session_create
0890: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
08c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
08d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08f0: 61 6d 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20  ame of db (e.g. 
0900: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c  "main") */.  sql
0910: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70  ite3_session **p
0920: 70 53 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20  pSession     /* 
0930: 4f 55 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e  OUT: New session
0940: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f   object */.);../
0950: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
0960: 65 6c 65 74 65 20 41 20 53 65 73 73 69 6f 6e 20  elete A Session 
0970: 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52 55  Object.** DESTRU
0980: 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 73 65  CTOR: sqlite3_se
0990: 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  ssion.**.** Dele
09a0: 74 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  te a session obj
09b0: 65 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ect previously a
09c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 0a  llocated using .
09d0: 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  ** [sqlite3sessi
09e0: 6f 6e 5f 63 72 65 61 74 65 28 29 5d 2e 20 4f 6e  on_create()]. On
09f0: 63 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  ce a session obj
0a00: 65 63 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  ect has been del
0a10: 65 74 65 64 2c 20 74 68 65 0a 2a 2a 20 72 65 73  eted, the.** res
0a20: 75 6c 74 73 20 6f 66 20 61 74 74 65 6d 70 74 69  ults of attempti
0a30: 6e 67 20 74 6f 20 75 73 65 20 70 53 65 73 73 69  ng to use pSessi
0a40: 6f 6e 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  on with any othe
0a50: 72 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65  r session module
0a60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  .** function are
0a70: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
0a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
0a90: 73 20 6d 75 73 74 20 62 65 20 64 65 6c 65 74 65  s must be delete
0aa0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  d before the dat
0ab0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
0ac0: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 72  which they.** ar
0ad0: 65 20 61 74 74 61 63 68 65 64 20 69 73 20 63 6c  e attached is cl
0ae0: 6f 73 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74  osed. Refer to t
0af0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0b00: 20 66 6f 72 20 0a 2a 2a 20 5b 73 71 6c 69 74 65   for .** [sqlite
0b10: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
0b20: 29 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  )] for details..
0b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73  */.void sqlite3s
0b40: 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 73 71  ession_delete(sq
0b50: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
0b60: 53 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f 2a 0a 2a  Session);.../*.*
0b70: 2a 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62  * CAPI3REF: Enab
0b80: 6c 65 20 4f 72 20 44 69 73 61 62 6c 65 20 41 20  le Or Disable A 
0b90: 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a  Session Object.*
0ba0: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
0bb0: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
0bc0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 69 6e 67 20  e the recording 
0be0: 6f 66 20 63 68 61 6e 67 65 73 20 62 79 20 61 20  of changes by a 
0bf0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
0c00: 57 68 65 6e 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  When.** enabled,
0c10: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
0c20: 74 20 72 65 63 6f 72 64 73 20 63 68 61 6e 67 65  t records change
0c30: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
0c40: 74 61 62 61 73 65 2e 20 57 68 65 6e 0a 2a 2a 20  tabase. When.** 
0c50: 64 69 73 61 62 6c 65 64 20 2d 20 69 74 20 64 6f  disabled - it do
0c60: 65 73 20 6e 6f 74 2e 20 41 20 6e 65 77 6c 79 20  es not. A newly 
0c70: 63 72 65 61 74 65 64 20 73 65 73 73 69 6f 6e 20  created session 
0c80: 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c 65  object is enable
0c90: 64 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  d..** Refer to t
0ca0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0cb0: 20 66 6f 72 20 5b 73 71 6c 69 74 65 33 73 65 73   for [sqlite3ses
0cc0: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29  sion_changeset()
0cd0: 5d 20 66 6f 72 20 66 75 72 74 68 65 72 0a 2a 2a  ] for further.**
0ce0: 20 64 65 74 61 69 6c 73 20 72 65 67 61 72 64 69   details regardi
0cf0: 6e 67 20 68 6f 77 20 65 6e 61 62 6c 69 6e 67 20  ng how enabling 
0d00: 61 6e 64 20 64 69 73 61 62 6c 69 6e 67 20 61 20  and disabling a 
0d10: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  session object a
0d20: 66 66 65 63 74 73 0a 2a 2a 20 74 68 65 20 65 76  ffects.** the ev
0d30: 65 6e 74 75 61 6c 20 63 68 61 6e 67 65 73 65 74  entual changeset
0d40: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e 67  s..**.** Passing
0d50: 20 7a 65 72 6f 20 74 6f 20 74 68 69 73 20 66 75   zero to this fu
0d60: 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73 20  nction disables 
0d70: 74 68 65 20 73 65 73 73 69 6f 6e 2e 20 50 61 73  the session. Pas
0d80: 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 2a 2a 20  sing a value.** 
0d90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
0da0: 6f 20 65 6e 61 62 6c 65 73 20 69 74 2e 20 50 61  o enables it. Pa
0db0: 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20 6c 65  ssing a value le
0dc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 69 73 20  ss than zero is 
0dd0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c 20 61 6e 64  a .** no-op, and
0de0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0df0: 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
0e00: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  t state of the s
0e10: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
0e20: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0e30: 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69 6e  ndicates the fin
0e40: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
0e50: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 3a 20  session object: 
0e60: 30 20 69 66 20 0a 2a 2a 20 74 68 65 20 73 65 73  0 if .** the ses
0e70: 73 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64  sion is disabled
0e80: 2c 20 6f 72 20 31 20 69 66 20 69 74 20 69 73 20  , or 1 if it is 
0e90: 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20  enabled..*/.int 
0ea0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
0eb0: 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 65  nable(sqlite3_se
0ec0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
0ed0: 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 3b 0a 0a   int bEnable);..
0ee0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
0ef0: 53 65 74 20 4f 72 20 43 6c 65 61 72 20 74 68 65  Set Or Clear the
0f00: 20 49 6e 64 69 72 65 63 74 20 43 68 61 6e 67 65   Indirect Change
0f10: 20 46 6c 61 67 0a 2a 2a 20 4d 45 54 48 4f 44 3a   Flag.** METHOD:
0f20: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0f30: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 68 61 6e  .**.** Each chan
0f40: 67 65 20 72 65 63 6f 72 64 65 64 20 62 79 20 61  ge recorded by a
0f50: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
0f60: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 65 69 74  is marked as eit
0f70: 68 65 72 20 64 69 72 65 63 74 20 6f 72 0a 2a 2a  her direct or.**
0f80: 20 69 6e 64 69 72 65 63 74 2e 20 41 20 63 68 61   indirect. A cha
0f90: 6e 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nge is marked as
0fa0: 20 69 6e 64 69 72 65 63 74 20 69 66 20 65 69 74   indirect if eit
0fb0: 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  her:.**.** <ul>.
0fc0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 73 65  **   <li> The se
0fd0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 22 69 6e  ssion object "in
0fe0: 64 69 72 65 63 74 22 20 66 6c 61 67 20 69 73 20  direct" flag is 
0ff0: 73 65 74 20 77 68 65 6e 20 74 68 65 20 63 68 61  set when the cha
1000: 6e 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  nge is.**       
1010: 20 6d 61 64 65 2c 20 6f 72 0a 2a 2a 20 20 20 3c   made, or.**   <
1020: 6c 69 3e 20 54 68 65 20 63 68 61 6e 67 65 20 69  li> The change i
1030: 73 20 6d 61 64 65 20 62 79 20 61 6e 20 53 51 4c  s made by an SQL
1040: 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
1050: 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20 0a  ign key action .
1060: 2a 2a 20 20 20 20 20 20 20 20 69 6e 73 74 65 61  **        instea
1070: 64 20 6f 66 20 64 69 72 65 63 74 6c 79 20 61 73  d of directly as
1080: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 75   a result of a u
1090: 73 65 72 73 20 53 51 4c 20 73 74 61 74 65 6d 65  sers SQL stateme
10a0: 6e 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  nt..** </ul>.**.
10b0: 2a 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 72  ** If a single r
10c0: 6f 77 20 69 73 20 61 66 66 65 63 74 65 64 20 62  ow is affected b
10d0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
10e0: 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68 69 6e  operation within
10f0: 20 61 20 73 65 73 73 69 6f 6e 2c 0a 2a 2a 20 74   a session,.** t
1100: 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69  hen the change i
1110: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e 64  s considered ind
1120: 69 72 65 63 74 20 69 66 20 61 6c 6c 20 6f 70 65  irect if all ope
1130: 72 61 74 69 6f 6e 73 20 6d 65 65 74 20 74 68 65  rations meet the
1140: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 66 6f 72   criteria.** for
1150: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68 61   an indirect cha
1160: 6e 67 65 20 61 62 6f 76 65 2c 20 6f 72 20 64 69  nge above, or di
1170: 72 65 63 74 20 6f 74 68 65 72 77 69 73 65 2e 0a  rect otherwise..
1180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1190: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
11a0: 65 74 2c 20 63 6c 65 61 72 20 6f 72 20 71 75 65  et, clear or que
11b0: 72 79 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ry the session o
11c0: 62 6a 65 63 74 20 69 6e 64 69 72 65 63 74 0a 2a  bject indirect.*
11d0: 2a 20 66 6c 61 67 2e 20 20 49 66 20 74 68 65 20  * flag.  If the 
11e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11f0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1200: 75 6e 63 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c  unction is zero,
1210: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 64   then the.** ind
1220: 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 63 6c  irect flag is cl
1230: 65 61 72 65 64 2e 20 49 66 20 69 74 20 69 73 20  eared. If it is 
1240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1250: 6f 2c 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  o, the indirect 
1260: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 20  flag.** is set. 
1270: 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20  Passing a value 
1280: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 64  less than zero d
1290: 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74  oes not modify t
12a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
12b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 69 72  .** of the indir
12c0: 65 63 74 20 66 6c 61 67 2c 20 61 6e 64 20 6d 61  ect flag, and ma
12d0: 79 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65  y be used to que
12e0: 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
12f0: 74 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tate of the .** 
1300: 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 66 6f  indirect flag fo
1310: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1320: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  session object..
1330: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1340: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1350: 20 74 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   the final state
1360: 20 6f 66 20 74 68 65 20 69 6e 64 69 72 65 63 74   of the indirect
1370: 20 66 6c 61 67 3a 20 30 20 69 66 20 0a 2a 2a 20   flag: 0 if .** 
1380: 69 74 20 69 73 20 63 6c 65 61 72 2c 20 6f 72 20  it is clear, or 
1390: 31 20 69 66 20 69 74 20 69 73 20 73 65 74 2e 0a  1 if it is set..
13a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
13b0: 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 73  ssion_indirect(s
13c0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
13d0: 70 53 65 73 73 69 6f 6e 2c 20 69 6e 74 20 62 49  pSession, int bI
13e0: 6e 64 69 72 65 63 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ndirect);../*.**
13f0: 20 43 41 50 49 33 52 45 46 3a 20 41 74 74 61 63   CAPI3REF: Attac
1400: 68 20 41 20 54 61 62 6c 65 20 54 6f 20 41 20 53  h A Table To A S
1410: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
1420: 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33   METHOD: sqlite3
1430: 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 49  _session.**.** I
1440: 66 20 61 72 67 75 6d 65 6e 74 20 7a 54 61 62 20  f argument zTab 
1450: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1460: 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  n it is the name
1470: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 6f 20 61   of a table to a
1480: 74 74 61 63 68 0a 2a 2a 20 74 6f 20 74 68 65 20  ttach.** to the 
1490: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
14a0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14b0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  st argument. All
14c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e   subsequent chan
14d0: 67 65 73 20 0a 2a 2a 20 6d 61 64 65 20 74 6f 20  ges .** made to 
14e0: 74 68 65 20 74 61 62 6c 65 20 77 68 69 6c 65 20  the table while 
14f0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
1500: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69  ct is enabled wi
1510: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 2e 20  ll be recorded. 
1520: 53 65 65 20 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  See .** document
1530: 61 74 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74  ation for [sqlit
1540: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
1550: 73 65 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68  set()] for furth
1560: 65 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  er details..**.*
1570: 2a 20 4f 72 2c 20 69 66 20 61 72 67 75 6d 65 6e  * Or, if argumen
1580: 74 20 7a 54 61 62 20 69 73 20 4e 55 4c 4c 2c 20  t zTab is NULL, 
1590: 74 68 65 6e 20 63 68 61 6e 67 65 73 20 61 72 65  then changes are
15a0: 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 61 6c   recorded for al
15b0: 6c 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74  l tables.** in t
15c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15d0: 61 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65  additional table
15e0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
15f0: 68 65 20 64 61 74 61 62 61 73 65 20 28 62 79 20  he database (by 
1600: 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 22 43  .** executing "C
1610: 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74 61  REATE TABLE" sta
1620: 74 65 6d 65 6e 74 73 29 20 61 66 74 65 72 20 74  tements) after t
1630: 68 69 73 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  his call is made
1640: 2c 20 63 68 61 6e 67 65 73 20 66 6f 72 20 0a 2a  , changes for .*
1650: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  * the new tables
1660: 20 61 72 65 20 61 6c 73 6f 20 72 65 63 6f 72 64   are also record
1670: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  ed..**.** Change
1680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 65  s can only be re
1690: 63 6f 72 64 65 64 20 66 6f 72 20 74 61 62 6c 65  corded for table
16a0: 73 20 74 68 61 74 20 68 61 76 65 20 61 20 50 52  s that have a PR
16b0: 49 4d 41 52 59 20 4b 45 59 20 65 78 70 6c 69 63  IMARY KEY explic
16c0: 69 74 6c 79 0a 2a 2a 20 64 65 66 69 6e 65 64 20  itly.** defined 
16d0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 69 72  as part of their
16e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
16f0: 61 74 65 6d 65 6e 74 2e 20 49 74 20 64 6f 65 73  atement. It does
1700: 20 6e 6f 74 20 6d 61 74 74 65 72 20 69 66 20 74   not matter if t
1710: 68 65 20 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b  he .** PRIMARY K
1720: 45 59 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45  EY is an "INTEGE
1730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28  R PRIMARY KEY" (
1740: 72 6f 77 69 64 20 61 6c 69 61 73 29 20 6f 72 20  rowid alias) or 
1750: 6e 6f 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59  not. The PRIMARY
1760: 0a 2a 2a 20 4b 45 59 20 6d 61 79 20 63 6f 6e 73  .** KEY may cons
1770: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
1780: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 6d 61 79 20 62  column, or may b
1790: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
17a0: 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 74 20 69 73 20  y..** .** It is 
17b0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
17c0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
17d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
17e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
17f0: 4e 6f 72 0a 2a 2a 20 69 73 20 69 74 20 61 6e 20  Nor.** is it an 
1800: 65 72 72 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  error if the nam
1810: 65 64 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  ed table does no
1820: 74 20 68 61 76 65 20 61 20 50 52 49 4d 41 52 59  t have a PRIMARY
1830: 20 4b 45 59 2e 20 48 6f 77 65 76 65 72 2c 0a 2a   KEY. However,.*
1840: 2a 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  * no changes wil
1850: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
1860: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
1870: 20 73 63 65 6e 61 72 69 6f 73 2e 0a 2a 2a 0a 2a   scenarios..**.*
1880: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6e 6f  * Changes are no
1890: 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 69  t recorded for i
18a0: 6e 64 69 76 69 64 75 61 6c 20 72 6f 77 73 20 74  ndividual rows t
18b0: 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76 61  hat have NULL va
18c0: 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  lues stored.** i
18d0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
18e0: 20 74 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b   their PRIMARY K
18f0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
1900: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1910: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
1920: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 77 69  all completes wi
1930: 74 68 6f 75 74 20 65 72 72 6f 72 2e 20 4f 72 2c  thout error. Or,
1940: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1950: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
1960: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65  te error code (e
1970: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
1980: 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ) is returned..*
1990: 2a 0a 2a 2a 20 3c 68 33 3e 53 70 65 63 69 61 6c  *.** <h3>Special
19a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 48 61   sqlite_stat1 Ha
19b0: 6e 64 6c 69 6e 67 3c 2f 68 33 3e 0a 2a 2a 0a 2a  ndling</h3>.**.*
19c0: 2a 20 41 73 20 6f 66 20 53 51 4c 69 74 65 20 76  * As of SQLite v
19d0: 65 72 73 69 6f 6e 20 33 2e 32 32 2e 30 2c 20 74  ersion 3.22.0, t
19e0: 68 65 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  he "sqlite_stat1
19f0: 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 78  " table is an ex
1a00: 63 65 70 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 73  ception to .** s
1a10: 6f 6d 65 20 6f 66 20 74 68 65 20 72 75 6c 65 73  ome of the rules
1a20: 20 61 62 6f 76 65 2e 20 49 6e 20 53 51 4c 69 74   above. In SQLit
1a30: 65 2c 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  e, the schema of
1a40: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 69 73   sqlite_stat1 is
1a50: 3a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  :.**  <pre>.**  
1a60: 26 6e 62 73 70 3b 20 20 20 20 20 43 52 45 41 54  &nbsp;     CREAT
1a70: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
1a80: 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61  tat1(tbl,idx,sta
1a90: 74 29 20 20 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  t)  .**  </pre>.
1aa0: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
1ab0: 68 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  h sqlite_stat1 d
1ac0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 50  oes not have a P
1ad0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 61 6e  RIMARY KEY, chan
1ae0: 67 65 73 20 61 72 65 20 0a 2a 2a 20 72 65 63 6f  ges are .** reco
1af0: 72 64 65 64 20 66 6f 72 20 69 74 20 61 73 20 69  rded for it as i
1b00: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
1b10: 59 20 69 73 20 28 74 62 6c 2c 69 64 78 29 2e 20  Y is (tbl,idx). 
1b20: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 63 68  Additionally, ch
1b30: 61 6e 67 65 73 20 0a 2a 2a 20 61 72 65 20 72 65  anges .** are re
1b40: 63 6f 72 64 65 64 20 66 6f 72 20 72 6f 77 73 20  corded for rows 
1b50: 66 6f 72 20 77 68 69 63 68 20 28 69 64 78 20 49  for which (idx I
1b60: 53 20 4e 55 4c 4c 29 20 69 73 20 74 72 75 65 2e  S NULL) is true.
1b70: 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 73 75   However, for su
1b80: 63 68 0a 2a 2a 20 72 6f 77 73 20 61 20 7a 65 72  ch.** rows a zer
1b90: 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 28 53  o-length blob (S
1ba0: 51 4c 20 76 61 6c 75 65 20 58 27 27 29 20 69 73  QL value X'') is
1bb0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
1bc0: 68 61 6e 67 65 73 65 74 20 6f 72 0a 2a 2a 20 70  hangeset or.** p
1bd0: 61 74 63 68 73 65 74 20 69 6e 73 74 65 61 64 20  atchset instead 
1be0: 6f 66 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e  of a NULL value.
1bf0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 75 63   This allows suc
1c00: 68 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 20  h changesets to 
1c10: 62 65 0a 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  be.** manipulate
1c20: 64 20 62 79 20 6c 65 67 61 63 79 20 69 6d 70 6c  d by legacy impl
1c30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 73  ementations of s
1c40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1c50: 69 6e 76 65 72 74 28 29 2c 0a 2a 2a 20 63 6f 6e  invert(),.** con
1c60: 63 61 74 28 29 20 61 6e 64 20 73 69 6d 69 6c 61  cat() and simila
1c70: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  r..**.** The sql
1c80: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
1c90: 70 6c 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ply() function a
1ca0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
1cb0: 76 65 72 74 73 20 74 68 65 20 0a 2a 2a 20 7a 65  verts the .** ze
1cc0: 72 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 62  ro-length blob b
1cd0: 61 63 6b 20 74 6f 20 61 20 4e 55 4c 4c 20 76 61  ack to a NULL va
1ce0: 6c 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  lue when updatin
1cf0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  g the sqlite_sta
1d00: 74 31 0a 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77  t1.** table. How
1d10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 61 70 70  ever, if the app
1d20: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1d30: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1d40: 6e 65 77 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  new(),.** sqlite
1d50: 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29  3changeset_old()
1d60: 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67   or sqlite3chang
1d70: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 20 6f 6e  eset_conflict on
1d80: 20 61 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a   a changeset .**
1d90: 20 69 74 65 72 61 74 6f 72 20 64 69 72 65 63 74   iterator direct
1da0: 6c 79 20 28 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  ly (including on
1db0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
1dc0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
1dd0: 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61  a.** conflict-ha
1de0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 29 20  ndler callback) 
1df0: 74 68 65 6e 20 74 68 65 20 58 27 27 20 76 61 6c  then the X'' val
1e00: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
1e10: 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  The application.
1e20: 2a 2a 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  ** must translat
1e30: 65 20 58 27 27 20 74 6f 20 4e 55 4c 4c 20 69 74  e X'' to NULL it
1e40: 73 65 6c 66 20 69 66 20 72 65 71 75 69 72 65 64  self if required
1e50: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 67 61 63 79 20 28  ..**.** Legacy (
1e60: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 32 32 2e  older than 3.22.
1e70: 30 29 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  0) versions of t
1e80: 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
1e90: 6c 65 20 63 61 6e 6e 6f 74 20 63 61 70 74 75 72  le cannot captur
1ea0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6d 61 64  e.** changes mad
1eb0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  e to the sqlite_
1ec0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 4c 65 67  stat1 table. Leg
1ed0: 61 63 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  acy versions of 
1ee0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
1ef0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
1f00: 66 75 6e 63 74 69 6f 6e 20 73 69 6c 65 6e 74 6c  function silentl
1f10: 79 20 69 67 6e 6f 72 65 20 61 6e 79 20 6d 6f 64  y ignore any mod
1f20: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1f30: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1f40: 31 20 74 61 62 6c 65 20 74 68 61 74 20 61 72 65  1 table that are
1f50: 20 70 61 72 74 20 6f 66 20 61 20 63 68 61 6e 67   part of a chang
1f60: 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
1f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f80: 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 0a  session_attach(.
1f90: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
1fa0: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
1fb0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
1fc0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1fd0: 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ff0: 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a  e name */.);../*
2000: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 65  .** CAPI3REF: Se
2010: 74 20 61 20 74 61 62 6c 65 20 66 69 6c 74 65 72  t a table filter
2020: 20 6f 6e 20 61 20 53 65 73 73 69 6f 6e 20 4f 62   on a Session Ob
2030: 6a 65 63 74 2e 0a 2a 2a 20 4d 45 54 48 4f 44 3a  ject..** METHOD:
2040: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
2050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
2060: 64 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  d argument (xFil
2070: 74 65 72 29 20 69 73 20 74 68 65 20 22 66 69 6c  ter) is the "fil
2080: 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 2e 20 46  ter callback". F
2090: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 72 6f  or changes to ro
20a0: 77 73 20 0a 2a 2a 20 69 6e 20 74 61 62 6c 65 73  ws .** in tables
20b0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 74   that are not at
20c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 53 65  tached to the Se
20d0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
20e0: 65 20 66 69 6c 74 65 72 20 69 73 20 63 61 6c 6c  e filter is call
20f0: 65 64 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ed.** to determi
2100: 6e 65 20 77 68 65 74 68 65 72 20 63 68 61 6e 67  ne whether chang
2110: 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 27  es to the table'
2120: 73 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62 65  s rows should be
2130: 20 74 72 61 63 6b 65 64 20 6f 72 20 6e 6f 74 2e   tracked or not.
2140: 20 0a 2a 2a 20 49 66 20 78 46 69 6c 74 65 72 20   .** If xFilter 
2150: 72 65 74 75 72 6e 73 20 30 2c 20 63 68 61 6e 67  returns 0, chang
2160: 65 73 20 69 73 20 6e 6f 74 20 74 72 61 63 6b 65  es is not tracke
2170: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e 63  d. Note that onc
2180: 65 20 61 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a  e a table is .**
2190: 20 61 74 74 61 63 68 65 64 2c 20 78 46 69 6c 74   attached, xFilt
21a0: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  er will not be c
21b0: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a  alled again..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65 73 73  void sqlite3sess
21d0: 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72  ion_table_filter
21e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
21f0: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20  ion *pSession,  
2200: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f      /* Session o
2210: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 28 2a  bject */.  int(*
2220: 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f  xFilter)(.    vo
2230: 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
2240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2250: 6f 70 79 20 6f 66 20 74 68 69 72 64 20 61 72 67  opy of third arg
2260: 20 74 6f 20 5f 66 69 6c 74 65 72 5f 74 61 62 6c   to _filter_tabl
2270: 65 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  e() */.    const
2280: 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20   char *zTab     
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
22a0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20  e name */.  ),. 
22b0: 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20   void *pCtx     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
22e0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 46 69  nt passed to xFi
22f0: 6c 74 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  lter */.);../*.*
2300: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
2310: 72 61 74 65 20 41 20 43 68 61 6e 67 65 73 65 74  rate A Changeset
2320: 20 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20   From A Session 
2330: 4f 62 6a 65 63 74 0a 2a 2a 20 4d 45 54 48 4f 44  Object.** METHOD
2340: 3a 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f  : sqlite3_sessio
2350: 6e 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  n.**.** Obtain a
2360: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74 61   changeset conta
2370: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  ining changes to
2380: 20 74 68 65 20 74 61 62 6c 65 73 20 61 74 74 61   the tables atta
2390: 63 68 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ched to the .** 
23a0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
23b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  st argument. If 
23d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 0a 2a 2a 20  successful, .** 
23e0: 73 65 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74  set *ppChangeset
23f0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
2400: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2410: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 0a   the changeset .
2420: 2a 2a 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  ** and *pnChange
2430: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
2440: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
2450: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
2460: 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 53 51   returning.** SQ
2470: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
2480: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
2490: 20 62 6f 74 68 20 2a 70 70 43 68 61 6e 67 65 73   both *ppChanges
24a0: 65 74 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  et and *pnChange
24b0: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 61  set to.** zero a
24c0: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
24d0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24e0: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
24f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
2500: 72 6f 20 6f 72 20 6d 6f 72 65 20 49 4e 53 45 52  ro or more INSER
2510: 54 2c 20 55 50 44 41 54 45 20 61 6e 64 2f 6f 72  T, UPDATE and/or
2520: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 73 2c   DELETE changes,
2530: 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
2540: 6e 74 69 6e 67 20 61 20 63 68 61 6e 67 65 20 74  nting a change t
2550: 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  o a single row o
2560: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 74 61  f an attached ta
2570: 62 6c 65 2e 20 41 6e 20 49 4e 53 45 52 54 0a 2a  ble. An INSERT.*
2580: 2a 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e  * change contain
2590: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
25a0: 65 61 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20  each field of a 
25b0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 72 6f 77  new database row
25c0: 2e 20 41 20 44 45 4c 45 54 45 0a 2a 2a 20 63 6f  . A DELETE.** co
25d0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 72 69 67 69  ntains the origi
25e0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 65 61  nal values of ea
25f0: 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20 64 65  ch field of a de
2600: 6c 65 74 65 64 20 64 61 74 61 62 61 73 65 20 72  leted database r
2610: 6f 77 2e 20 41 6e 0a 2a 2a 20 55 50 44 41 54 45  ow. An.** UPDATE
2620: 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e 73   change contains
2630: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61   the original va
2640: 6c 75 65 73 20 6f 66 20 65 61 63 68 20 66 69 65  lues of each fie
2650: 6c 64 20 6f 66 20 61 6e 20 75 70 64 61 74 65 64  ld of an updated
2660: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 72 6f 77  .** database row
2670: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2680: 75 70 64 61 74 65 64 20 76 61 6c 75 65 73 20 66  updated values f
2690: 6f 72 20 65 61 63 68 20 75 70 64 61 74 65 64 20  or each updated 
26a0: 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d 6b 65 79 0a  non-primary-key.
26b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 69 73  ** column. It is
26c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
26d0: 72 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e  r an UPDATE chan
26e0: 67 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ge to represent 
26f0: 61 20 63 68 61 6e 67 65 20 74 68 61 74 0a 2a 2a  a change that.**
2700: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 76 61   modifies the va
2710: 6c 75 65 73 20 6f 66 20 70 72 69 6d 61 72 79 20  lues of primary 
2720: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  key columns. If 
2730: 73 75 63 68 20 61 20 63 68 61 6e 67 65 20 69 73  such a change is
2740: 20 6d 61 64 65 2c 20 69 74 0a 2a 2a 20 69 73 20   made, it.** is 
2750: 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 61  represented in a
2760: 20 63 68 61 6e 67 65 73 65 74 20 61 73 20 61 20   changeset as a 
2770: 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64 20  DELETE followed 
2780: 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a  by an INSERT..**
2790: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
27a0: 6e 6f 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72  not recorded for
27b0: 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65 20   rows that have 
27c0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 73 74 6f 72  NULL values stor
27d0: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a  ed in one or .**
27e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 69 72 20 50   more of their P
27f0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
2800: 6e 73 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f  ns. If such a ro
2810: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 6f 72  w is inserted or
2820: 20 64 65 6c 65 74 65 64 2c 0a 2a 2a 20 6e 6f 20   deleted,.** no 
2830: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  corresponding ch
2840: 61 6e 67 65 20 69 73 20 70 72 65 73 65 6e 74 20  ange is present 
2850: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
2860: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
2870: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
2880: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72  If an existing r
2890: 6f 77 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  ow with one or m
28a0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ore NULL values 
28b0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 50 52 49  stored in.** PRI
28c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
28d0: 20 69 73 20 75 70 64 61 74 65 64 20 73 6f 20 74   is updated so t
28e0: 68 61 74 20 61 6c 6c 20 50 52 49 4d 41 52 59 20  hat all PRIMARY 
28f0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  KEY columns are 
2900: 6e 6f 6e 2d 4e 55 4c 4c 2c 0a 2a 2a 20 6f 6e 6c  non-NULL,.** onl
2910: 79 20 61 6e 20 49 4e 53 45 52 54 20 69 73 20 61  y an INSERT is a
2920: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 63 68  ppears in the ch
2930: 61 6e 67 65 73 65 74 2e 20 53 69 6d 69 6c 61 72  angeset. Similar
2940: 6c 79 2c 20 69 66 20 61 6e 20 65 78 69 73 74 69  ly, if an existi
2950: 6e 67 20 72 6f 77 0a 2a 2a 20 77 69 74 68 20 6e  ng row.** with n
2960: 6f 6e 2d 4e 55 4c 4c 20 50 52 49 4d 41 52 59 20  on-NULL PRIMARY 
2970: 4b 45 59 20 76 61 6c 75 65 73 20 69 73 20 75 70  KEY values is up
2980: 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  dated so that on
2990: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
29a0: 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20  .** PRIMARY KEY 
29b0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 73 65 74 20  columns are set 
29c0: 74 6f 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  to NULL, the res
29d0: 75 6c 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  ulting changeset
29e0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 44   contains a.** D
29f0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 6f 6e 6c  ELETE change onl
2a00: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  y..**.** The con
2a10: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
2a20: 65 73 65 74 20 6d 61 79 20 62 65 20 74 72 61 76  eset may be trav
2a30: 65 72 73 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ersed using an i
2a40: 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 0a  terator created.
2a50: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71  ** using the [sq
2a60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
2a70: 74 61 72 74 28 29 5d 20 41 50 49 2e 20 41 20 63  tart()] API. A c
2a80: 68 61 6e 67 65 73 65 74 20 6d 61 79 20 62 65 20  hangeset may be 
2a90: 61 70 70 6c 69 65 64 20 74 6f 0a 2a 2a 20 61 20  applied to.** a 
2aa0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
2ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 73 63 68 65 6d  compatible schem
2ac0: 61 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c  a using the [sql
2ad0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
2ae0: 70 6c 79 28 29 5d 0a 2a 2a 20 41 50 49 2e 0a 2a  ply()].** API..*
2af0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 61 20 63 68  *.** Within a ch
2b00: 61 6e 67 65 73 65 74 20 67 65 6e 65 72 61 74 65  angeset generate
2b10: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2b20: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
2b30: 72 65 6c 61 74 65 64 20 74 6f 20 61 0a 2a 2a 20  related to a.** 
2b40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65  single table are
2b50: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2b60: 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  r. In other word
2b70: 73 2c 20 77 68 65 6e 20 69 74 65 72 61 74 69 6e  s, when iteratin
2b80: 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20 63  g through.** a c
2b90: 68 61 6e 67 65 73 65 74 20 6f 72 20 77 68 65 6e  hangeset or when
2ba0: 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e   applying a chan
2bb0: 67 65 73 65 74 20 74 6f 20 61 20 64 61 74 61 62  geset to a datab
2bc0: 61 73 65 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73  ase, all changes
2bd0: 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 61   related.** to a
2be0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
2bf0: 65 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  e processed befo
2c00: 72 65 20 6d 6f 76 69 6e 67 20 6f 6e 20 74 6f 20  re moving on to 
2c10: 74 68 65 20 6e 65 78 74 20 74 61 62 6c 65 2e 20  the next table. 
2c20: 54 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73 6f  Tables.** are so
2c30: 72 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  rted in the same
2c40: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2c50: 74 68 65 79 20 77 65 72 65 20 61 74 74 61 63 68  they were attach
2c60: 65 64 20 28 6f 72 20 61 75 74 6f 2d 61 74 74 61  ed (or auto-atta
2c70: 63 68 65 64 29 0a 2a 2a 20 74 6f 20 74 68 65 20  ched).** to the 
2c80: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
2c90: 6f 62 6a 65 63 74 2e 20 54 68 65 20 6f 72 64 65  object. The orde
2ca0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 63  r in which the c
2cb0: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
2cc0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  o.** a single ta
2cd0: 62 6c 65 20 61 72 65 20 73 74 6f 72 65 64 20 69  ble are stored i
2ce0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
2cf0: 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  ** Following a s
2d00: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
2d10: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2d20: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
2d30: 6e 73 69 62 69 6c 69 74 79 20 6f 66 0a 2a 2a 20  nsibility of.** 
2d40: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
2d50: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
2d60: 65 20 62 75 66 66 65 72 20 74 68 61 74 20 2a 70  e buffer that *p
2d70: 70 43 68 61 6e 67 65 73 65 74 20 70 6f 69 6e 74  pChangeset point
2d80: 73 20 74 6f 20 75 73 69 6e 67 0a 2a 2a 20 5b 73  s to using.** [s
2d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 5d 2e 0a  qlite3_free()]..
2da0: 2a 2a 0a 2a 2a 20 3c 68 33 3e 43 68 61 6e 67 65  **.** <h3>Change
2db0: 73 65 74 20 47 65 6e 65 72 61 74 69 6f 6e 3c 2f  set Generation</
2dc0: 68 33 3e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  h3>.**.** Once a
2dd0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
2de0: 61 74 74 61 63 68 65 64 20 74 6f 20 61 20 73 65  attached to a se
2df0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
2e00: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
2e10: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
2e20: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
2e30: 65 73 20 6f 66 20 61 6c 6c 20 6e 65 77 20 72 6f  es of all new ro
2e40: 77 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ws inserted into
2e50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 49   the table..** I
2e60: 74 20 61 6c 73 6f 20 72 65 63 6f 72 64 73 20 74  t also records t
2e70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 72 69 6d  he original prim
2e80: 61 72 79 20 6b 65 79 20 61 6e 64 20 6f 74 68 65  ary key and othe
2e90: 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  r column values 
2ea0: 6f 66 20 61 6e 79 0a 2a 2a 20 64 65 6c 65 74 65  of any.** delete
2eb0: 64 20 6f 72 20 75 70 64 61 74 65 64 20 72 6f 77  d or updated row
2ec0: 73 2e 20 46 6f 72 20 65 61 63 68 20 75 6e 69 71  s. For each uniq
2ed0: 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ue primary key v
2ee0: 61 6c 75 65 2c 20 64 61 74 61 20 69 73 20 6f 6e  alue, data is on
2ef0: 6c 79 0a 2a 2a 20 72 65 63 6f 72 64 65 64 20 6f  ly.** recorded o
2f00: 6e 63 65 20 2d 20 74 68 65 20 66 69 72 73 74 20  nce - the first 
2f10: 74 69 6d 65 20 61 20 72 6f 77 20 77 69 74 68 20  time a row with 
2f20: 73 61 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  said primary key
2f30: 20 69 73 20 69 6e 73 65 72 74 65 64 2c 0a 2a 2a   is inserted,.**
2f40: 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65   updated or dele
2f50: 74 65 64 20 69 6e 20 74 68 65 20 6c 69 66 65 74  ted in the lifet
2f60: 69 6d 65 20 6f 66 20 74 68 65 20 73 65 73 73 69  ime of the sessi
2f70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  on..**.** There 
2f80: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
2f90: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2fa0: 20 70 61 72 61 67 72 61 70 68 3a 20 77 68 65 6e   paragraph: when
2fb0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
2fc0: 65 64 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f  ed,.** updated o
2fd0: 72 20 64 65 6c 65 74 65 64 2c 20 69 66 20 6f 6e  r deleted, if on
2fe0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
2ff0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
3000: 75 6d 6e 73 20 63 6f 6e 74 61 69 6e 20 61 0a 2a  umns contain a.*
3010: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6e 6f  * NULL value, no
3020: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
3030: 68 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 0a 2a  hange is made..*
3040: 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
3050: 20 6f 62 6a 65 63 74 20 74 68 65 72 65 66 6f 72   object therefor
3060: 65 20 61 63 63 75 6d 75 6c 61 74 65 73 20 74 77  e accumulates tw
3070: 6f 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  o types of recor
3080: 64 73 20 2d 20 74 68 6f 73 65 0a 2a 2a 20 74 68  ds - those.** th
3090: 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 70 72  at consist of pr
30a0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
30b0: 20 6f 6e 6c 79 20 28 63 72 65 61 74 65 64 20 77   only (created w
30c0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 73  hen the user ins
30d0: 65 72 74 73 0a 2a 2a 20 61 20 6e 65 77 20 72 65  erts.** a new re
30e0: 63 6f 72 64 29 20 61 6e 64 20 74 68 6f 73 65 20  cord) and those 
30f0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
3100: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
3110: 76 61 6c 75 65 73 20 61 6e 64 20 74 68 65 0a 2a  values and the.*
3120: 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * original value
3130: 73 20 6f 66 20 6f 74 68 65 72 20 74 61 62 6c 65  s of other table
3140: 20 63 6f 6c 75 6d 6e 73 20 28 63 72 65 61 74 65   columns (create
3150: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 73  d when the users
3160: 20 64 65 6c 65 74 65 73 0a 2a 2a 20 6f 72 20 75   deletes.** or u
3170: 70 64 61 74 65 73 20 61 20 72 65 63 6f 72 64 29  pdates a record)
3180: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
3190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31a0: 6c 6c 65 64 2c 20 74 68 65 20 72 65 71 75 65 73  lled, the reques
31b0: 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69 73  ted changeset is
31c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a   created using.*
31d0: 2a 20 62 6f 74 68 20 74 68 65 20 61 63 63 75 6d  * both the accum
31e0: 75 6c 61 74 65 64 20 72 65 63 6f 72 64 73 20 61  ulated records a
31f0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
3200: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
3210: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
3220: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a   Specifically:.*
3230: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
3240: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63  li> For each rec
3250: 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79  ord generated by
3260: 20 61 6e 20 69 6e 73 65 72 74 2c 20 74 68 65 20   an insert, the 
3270: 64 61 74 61 62 61 73 65 20 69 73 20 71 75 65 72  database is quer
3280: 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ied.**        fo
3290: 72 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 6d  r a row with a m
32a0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
32b0: 6b 65 79 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  key. If one is f
32c0: 6f 75 6e 64 2c 20 61 6e 20 49 4e 53 45 52 54 0a  ound, an INSERT.
32d0: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
32e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
32f0: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 6e   changeset. If n
3300: 6f 20 73 75 63 68 20 72 6f 77 20 69 73 20 66 6f  o such row is fo
3310: 75 6e 64 2c 20 6e 6f 20 63 68 61 6e 67 65 20 0a  und, no change .
3320: 2a 2a 20 20 20 20 20 20 20 20 69 73 20 61 64 64  **        is add
3330: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
3340: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  set..**.**   <li
3350: 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72  > For each recor
3360: 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  d generated by a
3370: 6e 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  n update or dele
3380: 74 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  te, the database
3390: 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 71   is .**        q
33a0: 75 65 72 69 65 64 20 66 6f 72 20 61 20 72 6f 77  ueried for a row
33b0: 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
33c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
33d0: 20 73 75 63 68 20 61 20 72 6f 77 20 69 73 0a 2a   such a row is.*
33e0: 2a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 61  *        found a
33f0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
3400: 66 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72  f the non-primar
3410: 79 20 6b 65 79 20 66 69 65 6c 64 73 20 68 61 76  y key fields hav
3420: 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e been.**       
3430: 20 6d 6f 64 69 66 69 65 64 20 66 72 6f 6d 20 74   modified from t
3440: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61  heir original va
3450: 6c 75 65 73 2c 20 61 6e 20 55 50 44 41 54 45 20  lues, an UPDATE 
3460: 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20  change is added 
3470: 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  to .**        th
3480: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 4f 72 2c  e changeset. Or,
3490: 20 69 66 20 6e 6f 20 73 75 63 68 20 72 6f 77 20   if no such row 
34a0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
34b0: 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45 20  table, a DELETE 
34c0: 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67  .**        chang
34d0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20  e changeset. If 
34f0: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 77  there is a row w
3500: 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
3510: 2a 20 20 20 20 20 20 20 20 70 72 69 6d 61 72 79  *        primary
3520: 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
3530: 62 61 73 65 2c 20 62 75 74 20 61 6c 6c 20 66 69  base, but all fi
3540: 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  elds contain the
3550: 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  ir original.**  
3560: 20 20 20 20 20 20 76 61 6c 75 65 73 2c 20 6e 6f        values, no
3570: 20 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64   change is added
3580: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65   to the changese
3590: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
35a0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 2c 20 61 6d  * This means, am
35b0: 6f 6e 67 73 74 20 6f 74 68 65 72 20 74 68 69 6e  ongst other thin
35c0: 67 73 2c 20 74 68 61 74 20 69 66 20 61 20 72 6f  gs, that if a ro
35d0: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  w is inserted an
35e0: 64 20 74 68 65 6e 20 6c 61 74 65 72 0a 2a 2a 20  d then later.** 
35f0: 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 61 20  deleted while a 
3600: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
3610: 73 20 61 63 74 69 76 65 2c 20 6e 65 69 74 68 65  s active, neithe
3620: 72 20 74 68 65 20 69 6e 73 65 72 74 20 6e 6f 72  r the insert nor
3630: 20 74 68 65 20 64 65 6c 65 74 65 0a 2a 2a 20 77   the delete.** w
3640: 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20 69  ill be present i
3650: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
3660: 20 4f 72 20 69 66 20 61 20 72 6f 77 20 69 73 20   Or if a row is 
3670: 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 6e  deleted and then
3680: 20 6c 61 74 65 72 20 61 20 0a 2a 2a 20 72 6f 77   later a .** row
3690: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
36a0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
36b0: 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c 65  s inserted while
36c0: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
36d0: 74 20 69 73 0a 2a 2a 20 61 63 74 69 76 65 2c 20  t is.** active, 
36e0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63 68  the resulting ch
36f0: 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63 6f 6e  angeset will con
3700: 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45 20 63  tain an UPDATE c
3710: 68 61 6e 67 65 20 69 6e 73 74 65 61 64 20 6f 66  hange instead of
3720: 0a 2a 2a 20 61 20 44 45 4c 45 54 45 20 61 6e 64  .** a DELETE and
3730: 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a 0a 2a   an INSERT..**.*
3740: 2a 20 57 68 65 6e 20 61 20 73 65 73 73 69 6f 6e  * When a session
3750: 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73 61 62   object is disab
3760: 6c 65 64 20 28 73 65 65 20 74 68 65 20 5b 73 71  led (see the [sq
3770: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61  lite3session_ena
3780: 62 6c 65 28 29 5d 20 41 50 49 29 2c 0a 2a 2a 20  ble()] API),.** 
3790: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 63 63 75  it does not accu
37a0: 6d 75 6c 61 74 65 20 72 65 63 6f 72 64 73 20 77  mulate records w
37b0: 68 65 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73  hen rows are ins
37c0: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
37d0: 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 54 68  r deleted..** Th
37e0: 69 73 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f  is may appear to
37f0: 20 68 61 76 65 20 73 6f 6d 65 20 63 6f 75 6e 74   have some count
3800: 65 72 2d 69 6e 74 75 69 74 69 76 65 20 65 66 66  er-intuitive eff
3810: 65 63 74 73 20 69 66 20 61 20 73 69 6e 67 6c 65  ects if a single
3820: 20 72 6f 77 0a 2a 2a 20 69 73 20 77 72 69 74 74   row.** is writt
3830: 65 6e 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20  en to more than 
3840: 6f 6e 63 65 20 64 75 72 69 6e 67 20 61 20 73 65  once during a se
3850: 73 73 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70  ssion. For examp
3860: 6c 65 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a 20  le, if a row.** 
3870: 69 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c  is inserted whil
3880: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
3890: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ct is enabled, t
38a0: 68 65 6e 20 6c 61 74 65 72 20 64 65 6c 65 74 65  hen later delete
38b0: 64 20 77 68 69 6c 65 20 0a 2a 2a 20 74 68 65 20  d while .** the 
38c0: 73 61 6d 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a  same session obj
38d0: 65 63 74 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ect is disabled,
38e0: 20 6e 6f 20 49 4e 53 45 52 54 20 72 65 63 6f 72   no INSERT recor
38f0: 64 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  d will appear in
3900: 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65   the.** changese
3910: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
3920: 68 65 20 64 65 6c 65 74 65 20 74 6f 6f 6b 20 70  he delete took p
3930: 6c 61 63 65 20 77 68 69 6c 65 20 74 68 65 20 73  lace while the s
3940: 65 73 73 69 6f 6e 20 77 61 73 20 64 69 73 61 62  ession was disab
3950: 6c 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  led..** Or, if o
3960: 6e 65 20 66 69 65 6c 64 20 6f 66 20 61 20 72 6f  ne field of a ro
3970: 77 20 69 73 20 75 70 64 61 74 65 64 20 77 68 69  w is updated whi
3980: 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 69 73 20  le a session is 
3990: 64 69 73 61 62 6c 65 64 2c 20 61 6e 64 20 0a 2a  disabled, and .*
39a0: 2a 20 61 6e 6f 74 68 65 72 20 66 69 65 6c 64 20  * another field 
39b0: 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20  of the same row 
39c0: 69 73 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  is updated while
39d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
39e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 0a 2a 2a 20  enabled, the.** 
39f0: 72 65 73 75 6c 74 69 6e 67 20 63 68 61 6e 67 65  resulting change
3a00: 73 65 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  set will contain
3a10: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
3a20: 65 20 74 68 61 74 20 75 70 64 61 74 65 73 20 62  e that updates b
3a30: 6f 74 68 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 69  oth fields..*/.i
3a40: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
3a50: 6e 5f 63 68 61 6e 67 65 73 65 74 28 0a 20 20 73  n_changeset(.  s
3a60: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
3a70: 70 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f  pSession,      /
3a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
3a90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
3aa0: 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20  ngeset,         
3ab0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
3ac0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
3ad0: 2a 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a  *ppChangeset */.
3ae0: 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67    void **ppChang
3af0: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
3b00: 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72    /* OUT: Buffer
3b10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
3b20: 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  geset */.);../*.
3b30: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4c 6f 61  ** CAPI3REF: Loa
3b40: 64 20 54 68 65 20 44 69 66 66 65 72 65 6e 63 65  d The Difference
3b50: 20 42 65 74 77 65 65 6e 20 54 61 62 6c 65 73 20   Between Tables 
3b60: 49 6e 74 6f 20 41 20 53 65 73 73 69 6f 6e 0a 2a  Into A Session.*
3b70: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
3b80: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
3b90: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
3ba0: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
3bb0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a   the session obj
3bc0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
3bd0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
3be0: 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
3bf0: 6f 6e 20 61 74 74 61 63 68 65 73 20 74 61 62 6c  on attaches tabl
3c00: 65 20 7a 54 62 6c 20 69 6e 20 74 68 65 20 73 61  e zTbl in the sa
3c10: 6d 65 20 6d 61 6e 6e 65 72 20 61 73 20 74 68 65  me manner as the
3c20: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
3c30: 69 6f 6e 5f 61 74 74 61 63 68 28 29 5d 20 66 75  ion_attach()] fu
3c40: 6e 63 74 69 6f 6e 2e 20 49 66 20 7a 54 62 6c 20  nction. If zTbl 
3c50: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
3c60: 6f 72 20 69 66 20 69 74 0a 2a 2a 20 64 6f 65 73  or if it.** does
3c70: 20 6e 6f 74 20 68 61 76 65 20 61 20 70 72 69 6d   not have a prim
3c80: 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75  ary key, this fu
3c90: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
3ca0: 70 20 28 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  p (but does not 
3cb0: 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 65 72 72  return.** an err
3cc0: 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  or)..**.** Argum
3cd0: 65 6e 74 20 7a 46 72 6f 6d 44 62 20 6d 75 73 74  ent zFromDb must
3ce0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
3cf0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
3d00: 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
3d10: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
3d20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
3d30: 65 20 68 61 6e 64 6c 65 20 61 73 20 74 68 65 20  e handle as the 
3d40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  hat contains .**
3d60: 20 61 20 74 61 62 6c 65 20 63 6f 6d 70 61 74 69   a table compati
3d70: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ble with the tab
3d80: 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  le attached to t
3d90: 68 65 20 73 65 73 73 69 6f 6e 20 62 79 20 74 68  he session by th
3da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
3db0: 41 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69  A table is consi
3dc0: 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65  dered compatible
3dd0: 20 69 66 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75   if it:.**.** <u
3de0: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73  l>.**   <li> Has
3df0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 0a   the same name,.
3e00: 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68  **   <li> Has th
3e10: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f  e same set of co
3e20: 6c 75 6d 6e 73 20 64 65 63 6c 61 72 65 64 20 69  lumns declared i
3e30: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
3e40: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
3e50: 48 61 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  Has the same PRI
3e60: 4d 41 52 59 20 4b 45 59 20 64 65 66 69 6e 69 74  MARY KEY definit
3e70: 69 6f 6e 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  ion..** </ul>.**
3e80: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
3e90: 73 20 61 72 65 20 6e 6f 74 20 63 6f 6d 70 61 74  s are not compat
3ea0: 69 62 6c 65 2c 20 53 51 4c 49 54 45 5f 53 43 48  ible, SQLITE_SCH
3eb0: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 2e  EMA is returned.
3ec0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 73 0a 2a   If the tables.*
3ed0: 2a 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  * are compatible
3ee0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 68 61 76 65   but do not have
3ef0: 20 61 6e 79 20 50 52 49 4d 41 52 59 20 4b 45 59   any PRIMARY KEY
3f00: 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 69 73 20   columns, it is 
3f10: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  not an error.** 
3f20: 62 75 74 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  but no changes a
3f30: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
3f40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
3f50: 41 73 20 77 69 74 68 20 6f 74 68 65 72 20 73 65  As with other se
3f60: 73 73 69 6f 6e 0a 2a 2a 20 41 50 49 73 2c 20 74  ssion.** APIs, t
3f70: 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 50 52  ables without PR
3f80: 49 4d 41 52 59 20 4b 45 59 73 20 61 72 65 20 73  IMARY KEYs are s
3f90: 69 6d 70 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a  imply ignored..*
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 61 64 64 73 20 61 20 73 65 74 20 6f 66  on adds a set of
3fc0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3fd0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3fe0: 68 61 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  hat could be.** 
3ff0: 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  used to update t
4000: 68 65 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  he table in data
4010: 62 61 73 65 20 7a 46 72 6f 6d 20 28 63 61 6c 6c  base zFrom (call
4020: 20 74 68 69 73 20 74 68 65 20 22 66 72 6f 6d 2d   this the "from-
4030: 74 61 62 6c 65 22 29 20 0a 2a 2a 20 73 6f 20 74  table") .** so t
4040: 68 61 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hat its content 
4050: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
4060: 68 65 20 74 61 62 6c 65 20 61 74 74 61 63 68 65  he table attache
4070: 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e  d to the session
4080: 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 28 63 61 6c   .** object (cal
4090: 6c 20 74 68 69 73 20 74 68 65 20 22 74 6f 2d 74  l this the "to-t
40a0: 61 62 6c 65 22 29 2e 20 53 70 65 63 69 66 69 63  able"). Specific
40b0: 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  ally:.**.** <ul>
40c0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65  .**   <li> For e
40d0: 61 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79  ach row (primary
40e0: 20 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74   key) that exist
40f0: 73 20 69 6e 20 74 68 65 20 74 6f 2d 74 61 62 6c  s in the to-tabl
4100: 65 20 62 75 74 20 6e 6f 74 20 69 6e 20 0a 2a 2a  e but not in .**
4110: 20 20 20 20 20 74 68 65 20 66 72 6f 6d 2d 74 61       the from-ta
4120: 62 6c 65 2c 20 61 6e 20 49 4e 53 45 52 54 20 72  ble, an INSERT r
4130: 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
4140: 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  o the session ob
4150: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c  ject..**.**   <l
4160: 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  i> For each row 
4170: 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68  (primary key) th
4180: 61 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  at exists in the
4190: 20 74 6f 2d 74 61 62 6c 65 20 62 75 74 20 6e 6f   to-table but no
41a0: 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20 74 68 65  t in .**     the
41b0: 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20 61 20 44   from-table, a D
41c0: 45 4c 45 54 45 20 72 65 63 6f 72 64 20 69 73 20  ELETE record is 
41d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 73  added to the ses
41e0: 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  sion object..**.
41f0: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
4200: 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79 20  ch row (primary 
4210: 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74 73  key) that exists
4220: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 2c   in both tables,
4230: 20 62 75 74 20 66 65 61 74 75 72 65 73 20 0a 2a   but features .*
4240: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
4250: 6e 6f 6e 2d 50 4b 20 76 61 6c 75 65 73 20 69 6e  non-PK values in
4260: 20 65 61 63 68 2c 20 61 6e 20 55 50 44 41 54 45   each, an UPDATE
4270: 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
4280: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   to the.**     s
4290: 65 73 73 69 6f 6e 2e 20 20 0a 2a 2a 20 3c 2f 75  ession.  .** </u
42a0: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 61 72  l>.**.** To clar
42b0: 69 66 79 2c 20 69 66 20 74 68 69 73 20 66 75 6e  ify, if this fun
42c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
42d0: 61 6e 64 20 74 68 65 6e 20 61 20 63 68 61 6e 67  and then a chang
42e0: 65 73 65 74 20 63 6f 6e 73 74 72 75 63 74 65 64  eset constructed
42f0: 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 74  .** using [sqlit
4300: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
4310: 73 65 74 28 29 5d 2c 20 74 68 65 6e 20 61 66 74  set()], then aft
4320: 65 72 20 61 70 70 6c 79 69 6e 67 20 74 68 61 74  er applying that
4330: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 0a 2a   changeset to .*
4340: 2a 20 64 61 74 61 62 61 73 65 20 7a 46 72 6f 6d  * database zFrom
4350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4360: 20 74 68 65 20 74 77 6f 20 63 6f 6d 70 61 74 69   the two compati
4370: 62 6c 65 20 74 61 62 6c 65 73 20 77 6f 75 6c 64  ble tables would
4380: 20 62 65 20 0a 2a 2a 20 69 64 65 6e 74 69 63 61   be .** identica
4390: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 61 6e 20 65  l..**.** It an e
43a0: 72 72 6f 72 20 69 66 20 64 61 74 61 62 61 73 65  rror if database
43b0: 20 7a 46 72 6f 6d 20 64 6f 65 73 20 6e 6f 74 20   zFrom does not 
43c0: 65 78 69 73 74 20 6f 72 20 64 6f 65 73 20 6e 6f  exist or does no
43d0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  t contain the.**
43e0: 20 72 65 71 75 69 72 65 64 20 63 6f 6d 70 61 74   required compat
43f0: 69 62 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ible table..**.*
4400: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
4410: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  on successful, S
4420: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
4430: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
4440: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
4450: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
4460: 73 20 63 61 73 65 2c 20 69 66 20 61 72 67 75 6d  s case, if argum
4470: 65 6e 74 20 70 7a 45 72 72 4d 73 67 20 69 73 20  ent pzErrMsg is 
4480: 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 7a 45 72 72  not NULL, *pzErr
4490: 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
44a0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
44b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
44c0: 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
44d0: 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
44e0: 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
44f0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
4500: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
4510: 74 6f 20 66 72 65 65 20 74 68 69 73 20 62 75 66  to free this buf
4520: 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  fer using.** sql
4530: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
4540: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
4550: 6f 6e 5f 64 69 66 66 28 0a 20 20 73 71 6c 69 74  on_diff(.  sqlit
4560: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73  e3_session *pSes
4570: 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68  sion,.  const ch
4580: 61 72 20 2a 7a 46 72 6f 6d 44 62 2c 0a 20 20 63  ar *zFromDb,.  c
4590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
45a0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
45b0: 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41  sg.);.../*.** CA
45c0: 50 49 33 52 45 46 3a 20 47 65 6e 65 72 61 74 65  PI3REF: Generate
45d0: 20 41 20 50 61 74 63 68 73 65 74 20 46 72 6f 6d   A Patchset From
45e0: 20 41 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63   A Session Objec
45f0: 74 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  t.** METHOD: sql
4600: 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a  ite3_session.**.
4610: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
4620: 65 73 20 62 65 74 77 65 65 6e 20 61 20 70 61 74  es between a pat
4630: 63 68 73 65 74 20 61 6e 64 20 61 20 63 68 61 6e  chset and a chan
4640: 67 65 73 65 74 20 61 72 65 20 74 68 61 74 3a 0a  geset are that:.
4650: 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20  **.** <ul>.**   
4660: 3c 6c 69 3e 20 44 45 4c 45 54 45 20 72 65 63 6f  <li> DELETE reco
4670: 72 64 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 74  rds consist of t
4680: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66  he primary key f
4690: 69 65 6c 64 73 20 6f 6e 6c 79 2e 20 54 68 65 20  ields only. The 
46a0: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 69 67 69  .**        origi
46b0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 6f 74  nal values of ot
46c0: 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 6f  her fields are o
46d0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 20 20 3c 6c 69  mitted..**   <li
46e0: 3e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76  > The original v
46f0: 61 6c 75 65 73 20 6f 66 20 61 6e 79 20 6d 6f 64  alues of any mod
4700: 69 66 69 65 64 20 66 69 65 6c 64 73 20 61 72 65  ified fields are
4710: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 0a 2a   omitted from .*
4720: 2a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  *        UPDATE 
4730: 72 65 63 6f 72 64 73 2e 0a 2a 2a 20 3c 2f 75 6c  records..** </ul
4740: 3e 0a 2a 2a 0a 2a 2a 20 41 20 70 61 74 63 68 73  >.**.** A patchs
4750: 65 74 20 62 6c 6f 62 20 6d 61 79 20 62 65 20 75  et blob may be u
4760: 73 65 64 20 77 69 74 68 20 75 70 20 74 6f 20 64  sed with up to d
4770: 61 74 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ate versions of 
4780: 61 6c 6c 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63  all .** sqlite3c
4790: 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41 50 49  hangeset_xxx API
47a0: 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 63 65 70   functions excep
47b0: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68 61  t for sqlite3cha
47c0: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 29 2c  ngeset_invert(),
47d0: 20 0a 2a 2a 20 77 68 69 63 68 20 72 65 74 75 72   .** which retur
47e0: 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
47f0: 54 20 69 66 20 69 74 20 69 73 20 70 61 73 73 65  T if it is passe
4800: 64 20 61 20 70 61 74 63 68 73 65 74 2e 20 53 69  d a patchset. Si
4810: 6d 69 6c 61 72 6c 79 2c 0a 2a 2a 20 61 74 74 65  milarly,.** atte
4820: 6d 70 74 69 6e 67 20 74 6f 20 75 73 65 20 61 20  mpting to use a 
4830: 70 61 74 63 68 73 65 74 20 62 6c 6f 62 20 77 69  patchset blob wi
4840: 74 68 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20  th old versions 
4850: 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
4860: 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41  3changeset_xxx A
4870: 50 49 73 20 61 6c 73 6f 20 70 72 6f 76 6f 6b 65  PIs also provoke
4880: 73 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  s an SQLITE_CORR
4890: 55 50 54 20 65 72 72 6f 72 2e 20 0a 2a 2a 0a 2a  UPT error. .**.*
48a0: 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 6e 6f  * Because the no
48b0: 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 22 6f  n-primary key "o
48c0: 6c 64 2e 2a 22 20 66 69 65 6c 64 73 20 61 72 65  ld.*" fields are
48d0: 20 6f 6d 69 74 74 65 64 2c 20 6e 6f 20 0a 2a 2a   omitted, no .**
48e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
48f0: 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 73  T_DATA conflicts
4900: 20 63 61 6e 20 62 65 20 64 65 74 65 63 74 65 64   can be detected
4910: 20 6f 72 20 72 65 70 6f 72 74 65 64 20 69 66 20   or reported if 
4920: 61 20 70 61 74 63 68 73 65 74 0a 2a 2a 20 69 73  a patchset.** is
4930: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
4940: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4950: 61 70 70 6c 79 28 29 20 41 50 49 2e 20 4f 74 68  apply() API. Oth
4960: 65 72 20 63 6f 6e 66 6c 69 63 74 20 74 79 70 65  er conflict type
4970: 73 20 77 6f 72 6b 0a 2a 2a 20 69 6e 20 74 68 65  s work.** in the
4980: 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
4990: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 2a 2a 0a   changesets..**.
49a0: 2a 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69  ** Changes withi
49b0: 6e 20 61 20 70 61 74 63 68 73 65 74 20 61 72 65  n a patchset are
49c0: 20 6f 72 64 65 72 65 64 20 69 6e 20 74 68 65 20   ordered in the 
49d0: 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20  same way as for 
49e0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 67 65  changesets.** ge
49f0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73  nerated by the s
4a00: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4a10: 61 6e 67 65 73 65 74 28 29 20 66 75 6e 63 74 69  angeset() functi
4a20: 6f 6e 20 28 69 2e 65 2e 20 61 6c 6c 20 63 68 61  on (i.e. all cha
4a30: 6e 67 65 73 20 66 6f 72 0a 2a 2a 20 61 20 73 69  nges for.** a si
4a40: 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67  ngle table are g
4a50: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2c  rouped together,
4a60: 20 74 61 62 6c 65 73 20 61 70 70 65 61 72 20 69   tables appear i
4a70: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
4a80: 68 69 63 68 0a 2a 2a 20 74 68 65 79 20 77 65 72  hich.** they wer
4a90: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
4aa0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
4ab0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
4ac0: 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
4ad0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  t(.  sqlite3_ses
4ae0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
4af0: 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20       /* Session 
4b00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
4b10: 2a 70 6e 50 61 74 63 68 73 65 74 2c 20 20 20 20  *pnPatchset,    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4b30: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
4b40: 65 72 20 61 74 20 2a 70 70 50 61 74 63 68 73 65  er at *ppPatchse
4b50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
4b60: 50 61 74 63 68 73 65 74 20 20 20 20 20 20 20 20  Patchset        
4b70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
4b80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4b90: 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 29 3b 0a   patchset */.);.
4ba0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
4bb0: 20 54 65 73 74 20 69 66 20 61 20 63 68 61 6e 67   Test if a chang
4bc0: 65 73 65 74 20 68 61 73 20 72 65 63 6f 72 64 65  eset has recorde
4bd0: 64 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 0a 2a  d any changes..*
4be0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
4bf0: 7a 65 72 6f 20 69 66 20 6e 6f 20 63 68 61 6e 67  zero if no chang
4c00: 65 73 20 74 6f 20 61 74 74 61 63 68 65 64 20 74  es to attached t
4c10: 61 62 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20  ables have been 
4c20: 72 65 63 6f 72 64 65 64 20 62 79 20 0a 2a 2a 20  recorded by .** 
4c30: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
4c40: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4c50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4c60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6f   Otherwise, if o
4c70: 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 63  ne or .** more c
4c80: 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
4c90: 20 72 65 63 6f 72 64 65 64 2c 20 72 65 74 75 72   recorded, retur
4ca0: 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 76  n zero..**.** Ev
4cb0: 65 6e 20 69 66 20 74 68 69 73 20 66 75 6e 63 74  en if this funct
4cc0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
4cd0: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
4ce0: 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 0a 2a 2a   that calling.**
4cf0: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
4d00: 5f 63 68 61 6e 67 65 73 65 74 28 29 5d 20 6f 6e  _changeset()] on
4d10: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 68 61 6e   the session han
4d20: 64 6c 65 20 6d 61 79 20 73 74 69 6c 6c 20 72 65  dle may still re
4d30: 74 75 72 6e 20 61 0a 2a 2a 20 63 68 61 6e 67 65  turn a.** change
4d40: 73 65 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  set that contain
4d50: 73 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 54 68  s no changes. Th
4d60: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 68  is can happen wh
4d70: 65 6e 20 61 20 72 6f 77 20 69 6e 20 0a 2a 2a 20  en a row in .** 
4d80: 61 6e 20 61 74 74 61 63 68 65 64 20 74 61 62 6c  an attached tabl
4d90: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 6e  e is modified an
4da0: 64 20 74 68 65 6e 20 6c 61 74 65 72 20 6f 6e 20  d then later on 
4db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  the original val
4dc0: 75 65 73 20 0a 2a 2a 20 61 72 65 20 72 65 73 74  ues .** are rest
4dd0: 6f 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  ored. However, i
4de0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
4df0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
4e00: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
4e10: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
4e20: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
4e30: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
4e40: 65 74 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  et() will return
4e50: 20 61 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74   a .** changeset
4e60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
4e70: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 69 6e 74   changes..*/.int
4e80: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
4e90: 69 73 65 6d 70 74 79 28 73 71 6c 69 74 65 33 5f  isempty(sqlite3_
4ea0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
4eb0: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  n);../*.** CAPI3
4ec0: 52 45 46 3a 20 43 72 65 61 74 65 20 41 6e 20 49  REF: Create An I
4ed0: 74 65 72 61 74 6f 72 20 54 6f 20 54 72 61 76 65  terator To Trave
4ee0: 72 73 65 20 41 20 43 68 61 6e 67 65 73 65 74 20  rse A Changeset 
4ef0: 0a 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a  .** CONSTRUCTOR:
4f00: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
4f10: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 43 72  et_iter.**.** Cr
4f20: 65 61 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72  eate an iterator
4f30: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
4f40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
4f50: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
4f60: 65 73 65 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63  eset..** If succ
4f70: 65 73 73 66 75 6c 2c 20 2a 70 70 20 69 73 20 73  essful, *pp is s
4f80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
4f90: 68 65 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64  he iterator hand
4fa0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
4fb0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
4fc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4fe0: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 7a 65  *pp is set to ze
4ff0: 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a 20 53 51 4c  ro and an.** SQL
5000: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
5020: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5030: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
5040: 20 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65   used to advance
5050: 20 61 6e 64 20 71 75 65 72 79 20 61 20 63 68 61   and query a cha
5060: 6e 67 65 73 65 74 20 0a 2a 2a 20 69 74 65 72 61  ngeset .** itera
5070: 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 74  tor created by t
5080: 68 69 73 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a  his function:.**
5090: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
50a0: 69 3e 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  i> [sqlite3chang
50b0: 65 73 65 74 5f 6e 65 78 74 28 29 5d 0a 2a 2a 20  eset_next()].** 
50c0: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
50d0: 68 61 6e 67 65 73 65 74 5f 6f 70 28 29 5d 0a 2a  hangeset_op()].*
50e0: 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65  *   <li> [sqlite
50f0: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29  3changeset_new()
5100: 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c  ].**   <li> [sql
5110: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c  ite3changeset_ol
5120: 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  d()].** </ul>.**
5130: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
5140: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
5150: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
5160: 65 6e 74 75 61 6c 6c 79 20 64 65 73 74 72 6f 79  entually destroy
5170: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
5180: 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
5190: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
51a0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2e  set_finalize()].
51b0: 20 54 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74   The buffer cont
51c0: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 68  aining the.** ch
51d0: 61 6e 67 65 73 65 74 20 28 70 43 68 61 6e 67 65  angeset (pChange
51e0: 73 65 74 29 20 6d 75 73 74 20 72 65 6d 61 69 6e  set) must remain
51f0: 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 61 66 74   valid until aft
5200: 65 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  er the iterator 
5210: 69 73 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  is.** destroyed.
5220: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
5230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 6c  the changeset bl
5240: 6f 62 20 77 61 73 20 63 72 65 61 74 65 64 20 62  ob was created b
5250: 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  y one of the.** 
5260: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
5270: 63 68 61 6e 67 65 73 65 74 28 29 5d 2c 20 5b 73  changeset()], [s
5280: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5290: 63 6f 6e 63 61 74 28 29 5d 20 6f 72 0a 2a 2a 20  concat()] or.** 
52a0: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
52b0: 74 5f 69 6e 76 65 72 74 28 29 5d 20 66 75 6e 63  t_invert()] func
52c0: 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68 61 6e 67  tions, all chang
52d0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  es within the ch
52e0: 61 6e 67 65 73 65 74 20 0a 2a 2a 20 74 68 61 74  angeset .** that
52f0: 20 61 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67   apply to a sing
5300: 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f  le table are gro
5310: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 54  uped together. T
5320: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
5330: 68 65 6e 20 0a 2a 2a 20 61 6e 20 61 70 70 6c 69  hen .** an appli
5340: 63 61 74 69 6f 6e 20 69 74 65 72 61 74 65 73 20  cation iterates 
5350: 74 68 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65  through a change
5360: 73 65 74 20 75 73 69 6e 67 20 61 6e 20 69 74 65  set using an ite
5370: 72 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79  rator created by
5380: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
5390: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
53a0: 74 68 61 74 20 72 65 6c 61 74 65 20 74 6f 20 61  that relate to a
53b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
53c0: 65 20 76 69 73 69 74 65 64 20 0a 2a 2a 20 63 6f  e visited .** co
53d0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 20 54 68 65  nsecutively. The
53e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
53f0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
5400: 72 20 77 69 6c 6c 20 76 69 73 69 74 20 61 20 63  r will visit a c
5410: 68 61 6e 67 65 20 0a 2a 2a 20 74 68 65 20 61 70  hange .** the ap
5420: 70 6c 69 65 73 20 74 6f 20 74 61 62 6c 65 20 58  plies to table X
5430: 2c 20 74 68 65 6e 20 6f 6e 65 20 66 6f 72 20 74  , then one for t
5440: 61 62 6c 65 20 59 2c 20 61 6e 64 20 74 68 65 6e  able Y, and then
5450: 20 6c 61 74 65 72 20 6f 6e 20 76 69 73 69 74 20   later on visit 
5460: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 63 68 61 6e  .** another chan
5470: 67 65 20 66 6f 72 20 74 61 62 6c 65 20 58 2e 0a  ge for table X..
5480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5490: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 0a 20  angeset_start(. 
54a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
54b0: 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20  et_iter **pp,   
54c0: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68 61   /* OUT: New cha
54d0: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
54e0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
54f0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
5500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5510: 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74  ize of changeset
5520: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a   blob in bytes *
5530: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67  /.  void *pChang
5540: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
5550: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5560: 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e  o blob containin
5570: 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29  g changeset */.)
5580: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  ;.../*.** CAPI3R
5590: 45 46 3a 20 41 64 76 61 6e 63 65 20 41 20 43 68  EF: Advance A Ch
55a0: 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72  angeset Iterator
55b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
55c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
55d0: 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  er.**.** This fu
55e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
55f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 69 74 65  be used with ite
5600: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
5610: 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 5b 73  y function.** [s
5620: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5630: 73 74 61 72 74 28 29 5d 2e 20 49 66 20 69 74 20  start()]. If it 
5640: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  is called on an 
5650: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
5660: 74 6f 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74  to.** a conflict
5670: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
5680: 6b 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  k by [sqlite3cha
5690: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
56a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 0a 2a   SQLITE_MISUSE.*
56b0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
56c0: 64 20 74 68 65 20 63 61 6c 6c 20 68 61 73 20 6e  d the call has n
56d0: 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o effect..**.** 
56e0: 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
56f0: 72 20 61 6e 20 69 74 65 72 61 74 6f 72 20 69 73  r an iterator is
5700: 20 63 72 65 61 74 65 64 20 62 79 20 73 71 6c 69   created by sqli
5710: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
5720: 72 74 28 29 2c 20 69 74 0a 2a 2a 20 64 6f 65 73  rt(), it.** does
5730: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
5740: 79 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  y change in the 
5750: 63 68 61 6e 67 65 73 65 74 2e 20 41 73 73 75 6d  changeset. Assum
5760: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
5770: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 65 6d 70 74  t.** is not empt
5780: 79 2c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  y, the first cal
5790: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
57a0: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
57b0: 69 74 65 72 61 74 6f 72 20 74 6f 0a 2a 2a 20 70  iterator to.** p
57c0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
57d0: 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  t change in the 
57e0: 63 68 61 6e 67 65 73 65 74 2e 20 45 61 63 68 20  changeset. Each 
57f0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
5800: 61 64 76 61 6e 63 65 73 0a 2a 2a 20 74 68 65 20  advances.** the 
5810: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
5820: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  t to the next ch
5830: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
5840: 67 65 73 65 74 20 28 69 66 20 61 6e 79 29 2e 20  geset (if any). 
5850: 49 66 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 6f  If.** no error o
5860: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
5870: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
5880: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 67 65 20   a valid change 
5890: 61 66 74 65 72 20 61 20 63 61 6c 6c 0a 2a 2a 20  after a call.** 
58a0: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
58b0: 73 65 74 5f 6e 65 78 74 28 29 20 68 61 73 20 61  set_next() has a
58c0: 64 76 61 6e 63 65 64 20 69 74 2c 20 53 51 4c 49  dvanced it, SQLI
58d0: 54 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e  TE_ROW is return
58e0: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
58f0: 65 2c 20 69 66 20 61 6c 6c 20 63 68 61 6e 67 65  e, if all change
5900: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
5910: 65 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  et have already 
5920: 62 65 65 6e 20 76 69 73 69 74 65 64 2c 0a 2a 2a  been visited,.**
5930: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
5940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5950: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5960: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
5970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5980: 72 6e 65 64 2e 20 50 6f 73 73 69 62 6c 65 20 65  rned. Possible e
5990: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 73 20 69  rror .** codes i
59a0: 6e 63 6c 75 64 65 20 53 51 4c 49 54 45 5f 43 4f  nclude SQLITE_CO
59b0: 52 52 55 50 54 20 28 69 66 20 74 68 65 20 63 68  RRUPT (if the ch
59c0: 61 6e 67 65 73 65 74 20 62 75 66 66 65 72 20 69  angeset buffer i
59d0: 73 20 63 6f 72 72 75 70 74 29 20 6f 72 20 0a 2a  s corrupt) or .*
59e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
59f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5a00: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 73 71 6c  angeset_next(sql
5a10: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
5a20: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
5a30: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
5a40: 74 61 69 6e 20 54 68 65 20 43 75 72 72 65 6e 74  tain The Current
5a50: 20 4f 70 65 72 61 74 69 6f 6e 20 46 72 6f 6d 20   Operation From 
5a60: 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72  A Changeset Iter
5a70: 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20  ator.** METHOD: 
5a80: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
5a90: 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65  t_iter.**.** The
5aa0: 20 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20   pIter argument 
5ab0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5ac0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68  unction may eith
5ad0: 65 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f  er be an iterato
5ae0: 72 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  r.** passed to a
5af0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
5b00: 72 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  r by [sqlite3cha
5b10: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
5b20: 20 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a   or an iterator.
5b30: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73  ** created by [s
5b40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5b50: 73 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65  start()]. In the
5b60: 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68   latter case, th
5b70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
5b80: 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65   call to [sqlite
5b90: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
5ba0: 29 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74  )] must have ret
5bb0: 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 5f 52 4f  urned [SQLITE_RO
5bc0: 57 5d 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 69  W]. If this.** i
5bd0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  s not the case, 
5be0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
5bf0: 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49  turns [SQLITE_MI
5c00: 53 55 53 45 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  SUSE]..**.** If 
5c10: 61 72 67 75 6d 65 6e 74 20 70 7a 54 61 62 20 69  argument pzTab i
5c20: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5c30: 20 2a 70 7a 54 61 62 20 69 73 20 73 65 74 20 74   *pzTab is set t
5c40: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20  o point to a.** 
5c50: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 75  nul-terminated u
5c60: 74 66 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  tf-8 encoded str
5c70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
5c80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5c90: 61 62 6c 65 0a 2a 2a 20 61 66 66 65 63 74 65 64  able.** affected
5ca0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
5cb0: 63 68 61 6e 67 65 2e 20 54 68 65 20 62 75 66 66  change. The buff
5cc0: 65 72 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  er remains valid
5cd0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 0a 2a 2a   until either.**
5ce0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
5cf0: 74 5f 6e 65 78 74 28 29 20 69 73 20 63 61 6c 6c  t_next() is call
5d00: 65 64 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ed on the iterat
5d10: 6f 72 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  or or until the 
5d20: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  .** conflict-han
5d30: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  dler function re
5d40: 74 75 72 6e 73 2e 20 49 66 20 70 6e 43 6f 6c 20  turns. If pnCol 
5d50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
5d60: 6e 20 2a 70 6e 43 6f 6c 20 69 73 20 0a 2a 2a 20  n *pnCol is .** 
5d70: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
5d80: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
5d90: 74 68 65 20 74 61 62 6c 65 20 61 66 66 65 63 74  the table affect
5da0: 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 67 65  ed by the change
5db0: 2e 20 49 66 0a 2a 2a 20 70 62 49 6e 63 6f 72 72  . If.** pbIncorr
5dc0: 65 63 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ect is not NULL,
5dd0: 20 74 68 65 6e 20 2a 70 62 49 6e 64 69 72 65 63   then *pbIndirec
5de0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
5df0: 20 28 31 29 20 69 66 20 74 68 65 20 63 68 61 6e   (1) if the chan
5e00: 67 65 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 64 69  ge.** is an indi
5e10: 72 65 63 74 20 63 68 61 6e 67 65 2c 20 6f 72 20  rect change, or 
5e20: 66 61 6c 73 65 20 28 30 29 20 6f 74 68 65 72 77  false (0) otherw
5e30: 69 73 65 2e 20 53 65 65 20 74 68 65 20 64 6f 63  ise. See the doc
5e40: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a  umentation for.*
5e50: 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  * [sqlite3sessio
5e60: 6e 5f 69 6e 64 69 72 65 63 74 28 29 5d 20 66 6f  n_indirect()] fo
5e70: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5e80: 6f 66 20 64 69 72 65 63 74 20 61 6e 64 20 69 6e  of direct and in
5e90: 64 69 72 65 63 74 0a 2a 2a 20 63 68 61 6e 67 65  direct.** change
5ea0: 73 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70  s. Finally, if p
5eb0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  Op is not NULL, 
5ec0: 74 68 65 6e 20 2a 70 4f 70 20 69 73 20 73 65 74  then *pOp is set
5ed0: 20 74 6f 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 5b   to one of .** [
5ee0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2c 20  SQLITE_INSERT], 
5ef0: 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d 20  [SQLITE_DELETE] 
5f00: 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54  or [SQLITE_UPDAT
5f10: 45 5d 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  E], depending on
5f20: 20 74 68 65 20 0a 2a 2a 20 74 79 70 65 20 6f 66   the .** type of
5f30: 20 63 68 61 6e 67 65 20 74 68 61 74 20 74 68 65   change that the
5f40: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
5f50: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
5f60: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
5f70: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
5f80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
5f90: 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
5fa0: 20 6f 63 63 75 72 2c 20 61 6e 0a 2a 2a 20 53 51   occur, an.** SQ
5fb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5fc0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
5fd0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6f   values of the o
5fe0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5ff0: 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 74 72  may not.** be tr
6000: 75 73 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  usted in this ca
6010: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6020: 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 0a  e3changeset_op(.
6030: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
6040: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
6050: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
6060: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
6070: 63 68 61 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20  char **pzTab,   
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6090: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61 62  : Pointer to tab
60a0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  le name */.  int
60b0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60d0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
60e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
60f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 70 2c 20 20  */.  int *pOp,  
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
6120: 49 54 45 5f 49 4e 53 45 52 54 2c 20 44 45 4c 45  ITE_INSERT, DELE
6130: 54 45 20 6f 72 20 55 50 44 41 54 45 20 2a 2f 0a  TE or UPDATE */.
6140: 20 20 69 6e 74 20 2a 70 62 49 6e 64 69 72 65 63    int *pbIndirec
6150: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
6160: 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 66    /* OUT: True f
6170: 6f 72 20 61 6e 20 27 69 6e 64 69 72 65 63 74 27  or an 'indirect'
6180: 20 63 68 61 6e 67 65 20 2a 2f 0a 29 3b 0a 0a 2f   change */.);../
6190: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f  *.** CAPI3REF: O
61a0: 62 74 61 69 6e 20 54 68 65 20 50 72 69 6d 61 72  btain The Primar
61b0: 79 20 4b 65 79 20 44 65 66 69 6e 69 74 69 6f 6e  y Key Definition
61c0: 20 4f 66 20 41 20 54 61 62 6c 65 0a 2a 2a 20 4d   Of A Table.** M
61d0: 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63  ETHOD: sqlite3_c
61e0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a  hangeset_iter.**
61f0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 6d 6f 64  .** For each mod
6200: 69 66 69 65 64 20 74 61 62 6c 65 2c 20 61 20 63  ified table, a c
6210: 68 61 6e 67 65 73 65 74 20 69 6e 63 6c 75 64 65  hangeset include
6220: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
6230: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
6240: 20 3c 6c 69 3e 20 54 68 65 20 6e 75 6d 62 65 72   <li> The number
6250: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6260: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a  he table, and.**
6270: 20 20 20 3c 6c 69 3e 20 57 68 69 63 68 20 6f 66     <li> Which of
6280: 20 74 68 6f 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   those columns m
6290: 61 6b 65 20 75 70 20 74 68 65 20 74 61 62 6c 65  ake up the table
62a0: 73 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  s PRIMARY KEY..*
62b0: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68  * </ul>.**.** Th
62c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
62d0: 73 65 64 20 74 6f 20 66 69 6e 64 20 77 68 69 63  sed to find whic
62e0: 68 20 63 6f 6c 75 6d 6e 73 20 63 6f 6d 70 72 69  h columns compri
62f0: 73 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  se the PRIMARY K
6300: 45 59 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  EY of.** the tab
6310: 6c 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  le modified by t
6320: 68 65 20 63 68 61 6e 67 65 20 74 68 61 74 20 69  he change that i
6330: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
6340: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
6350: 6f 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  o..** If success
6360: 66 75 6c 2c 20 2a 70 61 62 50 4b 20 69 73 20 73  ful, *pabPK is s
6370: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
6380: 6e 20 61 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20  n array of nCol 
6390: 65 6e 74 72 69 65 73 2c 20 77 68 65 72 65 0a 2a  entries, where.*
63a0: 2a 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  * nCol is the nu
63b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
63c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45 6c  in the table. El
63d0: 65 6d 65 6e 74 73 20 6f 66 20 2a 70 61 62 50 4b  ements of *pabPK
63e0: 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 30   are set to.** 0
63f0: 78 30 31 20 69 66 20 74 68 65 20 63 6f 72 72 65  x01 if the corre
6400: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
6410: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  is part of the t
6420: 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
6430: 79 2c 20 6f 72 0a 2a 2a 20 30 78 30 30 20 69 66  y, or.** 0x00 if
6440: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a   it is not..**.*
6450: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 6e  * If argument pn
6460: 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Col is not NULL,
6470: 20 74 68 65 6e 20 2a 70 6e 43 6f 6c 20 69 73 20   then *pnCol is 
6480: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6490: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  r of columns.** 
64a0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
64b0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
64c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
64d0: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
64e0: 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
64f0: 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 65 6e  to a valid.** en
6500: 74 72 79 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55  try, SQLITE_MISU
6510: 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SE is returned a
6520: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  nd the output va
6530: 72 69 61 62 6c 65 73 20 7a 65 72 6f 65 64 2e 20  riables zeroed. 
6540: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
6550: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6560: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
6570: 75 74 20 76 61 72 69 61 62 6c 65 73 20 70 6f 70  ut variables pop
6580: 75 6c 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ulated as descri
6590: 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2f  bed.** above..*/
65a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
65b0: 67 65 73 65 74 5f 70 6b 28 0a 20 20 73 71 6c 69  geset_pk(.  sqli
65c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
65d0: 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49  er *pIter,  /* I
65e0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
65f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6600: 72 20 2a 2a 70 61 62 50 4b 2c 20 20 20 20 20 20  r **pabPK,      
6610: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
6620: 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 20 2d 20 74  y of boolean - t
6630: 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c 73 20  rue for PK cols 
6640: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 20  */.  int *pnCol 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
6670: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
6680: 6e 20 6f 75 74 70 75 74 20 61 72 72 61 79 20 2a  n output array *
6690: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
66a0: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6f 6c 64  3REF: Obtain old
66b0: 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  .* Values From A
66c0: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
66d0: 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  tor.** METHOD: s
66e0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
66f0: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _iter.**.** The 
6700: 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70  pIter argument p
6710: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
6720: 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65  nction may eithe
6730: 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72  r be an iterator
6740: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20  .** passed to a 
6750: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
6760: 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   by [sqlite3chan
6770: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20  geset_apply()], 
6780: 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a  or an iterator.*
6790: 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71  * created by [sq
67a0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
67b0: 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20  tart()]. In the 
67c0: 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68 65  latter case, the
67d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
67e0: 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33  call to [sqlite3
67f0: 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29  changeset_next()
6800: 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74 75  ] must have retu
6810: 72 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e  rned SQLITE_ROW.
6820: 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65   .** Furthermore
6830: 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65  , it may only be
6840: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 74   called if the t
6850: 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68  ype of change th
6860: 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  at the iterator.
6870: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
6880: 6e 74 73 20 74 6f 20 69 73 20 65 69 74 68 65 72  nts to is either
6890: 20 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d   [SQLITE_DELETE]
68a0: 20 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41   or [SQLITE_UPDA
68b0: 54 45 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  TE]. Otherwise,.
68c0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
68d0: 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45   returns [SQLITE
68e0: 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20 73 65 74  _MISUSE] and set
68f0: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e 55  s *ppValue to NU
6900: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  LL..**.** Argume
6910: 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65 20  nt iVal must be 
6920: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
6930: 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20  equal to 0, and 
6940: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75  less than the nu
6950: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mber.** of colum
6960: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
6970: 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20  affected by the 
6980: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e 20  current change. 
6990: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53  Otherwise,.** [S
69a0: 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73 20  QLITE_RANGE] is 
69b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
69c0: 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  Value is set to 
69d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  NULL..**.** If s
69e0: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
69f0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
6a00: 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20  pValue to point 
6a10: 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a 2a  to a protected.*
6a20: 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  * sqlite3_value 
6a30: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
6a40: 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76 61  g the iVal'th va
6a50: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 76 65 63  lue from the vec
6a60: 74 6f 72 20 6f 66 20 0a 2a 2a 20 6f 72 69 67 69  tor of .** origi
6a70: 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73  nal row values s
6a80: 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
6a90: 20 74 68 65 20 55 50 44 41 54 45 20 6f 72 20 44   the UPDATE or D
6aa0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 61 6e 64  ELETE change and
6ab0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
6ac0: 54 45 5f 4f 4b 2e 20 54 68 65 20 6e 61 6d 65 20  TE_OK. The name 
6ad0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
6ae0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 66  comes from the f
6af0: 61 63 74 20 74 68 61 74 20 74 68 69 73 20 0a 2a  act that this .*
6b00: 2a 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  * is similar to 
6b10: 74 68 65 20 22 6f 6c 64 2e 2a 22 20 63 6f 6c 75  the "old.*" colu
6b20: 6d 6e 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  mns available to
6b30: 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
6b40: 65 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a  e triggers..**.*
6b50: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
6b60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e  error occurs (e.
6b70: 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  g. an OOM condit
6b80: 69 6f 6e 29 2c 20 61 6e 20 53 51 4c 69 74 65 20  ion), an SQLite 
6b90: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
6ba0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
6bb0: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
6bc0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
6bd0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
6be0: 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  ld(.  sqlite3_ch
6bf0: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
6c00: 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ter,  /* Changes
6c10: 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  et iterator */. 
6c20: 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20   int iVal,      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
6c50: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
6c60: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20  alue **ppValue  
6c70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f         /* OUT: O
6c80: 6c 64 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c  ld value (or NUL
6c90: 4c 20 70 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b  L pointer) */.);
6ca0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
6cb0: 3a 20 4f 62 74 61 69 6e 20 6e 65 77 2e 2a 20 56  : Obtain new.* V
6cc0: 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43 68 61  alues From A Cha
6cd0: 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a  ngeset Iterator.
6ce0: 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74  ** METHOD: sqlit
6cf0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
6d00: 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65  r.**.** The pIte
6d10: 72 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  r argument passe
6d20: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
6d30: 6f 6e 20 6d 61 79 20 65 69 74 68 65 72 20 62 65  on may either be
6d40: 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20   an iterator.** 
6d50: 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66  passed to a conf
6d60: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 20  lict-handler by 
6d70: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
6d80: 74 5f 61 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61  t_apply()], or a
6d90: 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72  n iterator.** cr
6da0: 65 61 74 65 64 20 62 79 20 5b 73 71 6c 69 74 65  eated by [sqlite
6db0: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
6dc0: 28 29 5d 2e 20 49 6e 20 74 68 65 20 6c 61 74 74  ()]. In the latt
6dd0: 65 72 20 63 61 73 65 2c 20 74 68 65 20 6d 6f 73  er case, the mos
6de0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c  t recent.** call
6df0: 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   to [sqlite3chan
6e00: 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75  geset_next()] mu
6e10: 73 74 20 68 61 76 65 20 72 65 74 75 72 6e 65 64  st have returned
6e20: 20 53 51 4c 49 54 45 5f 52 4f 57 2e 20 0a 2a 2a   SQLITE_ROW. .**
6e30: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 74   Furthermore, it
6e40: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
6e50: 6c 65 64 20 69 66 20 74 68 65 20 74 79 70 65 20  led if the type 
6e60: 6f 66 20 63 68 61 6e 67 65 20 74 68 61 74 20 74  of change that t
6e70: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63  he iterator.** c
6e80: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
6e90: 74 6f 20 69 73 20 65 69 74 68 65 72 20 5b 53 51  to is either [SQ
6ea0: 4c 49 54 45 5f 55 50 44 41 54 45 5d 20 6f 72 20  LITE_UPDATE] or 
6eb0: 5b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2e  [SQLITE_INSERT].
6ec0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
6ed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
6ee0: 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49 53  urns [SQLITE_MIS
6ef0: 55 53 45 5d 20 61 6e 64 20 73 65 74 73 20 2a 70  USE] and sets *p
6f00: 70 56 61 6c 75 65 20 74 6f 20 4e 55 4c 4c 2e 0a  pValue to NULL..
6f10: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69  **.** Argument i
6f20: 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  Val must be grea
6f30: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
6f40: 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73 73  l to 0, and less
6f50: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
6f60: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  .** of columns i
6f70: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66 65  n the table affe
6f80: 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  cted by the curr
6f90: 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68 65  ent change. Othe
6fa0: 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49 54  rwise,.** [SQLIT
6fb0: 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74 75  E_RANGE] is retu
6fc0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75  rned and *ppValu
6fd0: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
6fe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
6ff0: 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
7000: 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61 6c  tion sets *ppVal
7010: 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ue to point to a
7020: 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73 71   protected.** sq
7030: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
7040: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ct containing th
7050: 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65 20  e iVal'th value 
7060: 66 72 6f 6d 20 74 68 65 20 76 65 63 74 6f 72 20  from the vector 
7070: 6f 66 20 0a 2a 2a 20 6e 65 77 20 72 6f 77 20 76  of .** new row v
7080: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20  alues stored as 
7090: 70 61 72 74 20 6f 66 20 74 68 65 20 55 50 44 41  part of the UPDA
70a0: 54 45 20 6f 72 20 49 4e 53 45 52 54 20 63 68 61  TE or INSERT cha
70b0: 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  nge and.** retur
70c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ns SQLITE_OK. If
70d0: 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
70e0: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 64 6f 65  n UPDATE and doe
70f0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 0a 2a 2a  s not include.**
7100: 20 61 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72   a new value for
7110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
7120: 6f 6c 75 6d 6e 2c 20 2a 70 70 56 61 6c 75 65 20  olumn, *ppValue 
7130: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
7140: 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
7150: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 6e   returned. The n
7160: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
7170: 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
7180: 68 65 20 66 61 63 74 20 74 68 61 74 20 0a 2a 2a  he fact that .**
7190: 20 74 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   this is similar
71a0: 20 74 6f 20 74 68 65 20 22 6e 65 77 2e 2a 22 20   to the "new.*" 
71b0: 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62 6c  columns availabl
71c0: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
71d0: 65 6c 65 74 65 20 0a 2a 2a 20 74 72 69 67 67 65  elete .** trigge
71e0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d  rs..**.** If som
71f0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  e other error oc
7200: 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
7210: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e  M condition), an
7220: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7230: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7240: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
7250: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
7260: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7270: 6e 67 65 73 65 74 5f 6e 65 77 28 0a 20 20 73 71  ngeset_new(.  sq
7280: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7290: 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
72a0: 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
72b0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61  tor */.  int iVa
72c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
72e0: 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  mn number */.  s
72f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
7300: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 2f  pValue         /
7310: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65  * OUT: New value
7320: 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   (or NULL pointe
7330: 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r) */.);../*.** 
7340: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
7350: 20 43 6f 6e 66 6c 69 63 74 69 6e 67 20 52 6f 77   Conflicting Row
7360: 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43   Values From A C
7370: 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f  hangeset Iterato
7380: 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  r.** METHOD: sql
7390: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
73a0: 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ter.**.** This f
73b0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
73c0: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
73d0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
73e0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a  s passed to a.**
73f0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
7400: 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20 5b 73  r callback by [s
7410: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7420: 61 70 70 6c 79 28 29 5d 20 77 69 74 68 20 65 69  apply()] with ei
7430: 74 68 65 72 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f  ther.** [SQLITE_
7440: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20  CHANGESET_DATA] 
7450: 6f 72 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  or [SQLITE_CHANG
7460: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 5d 2e 20  ESET_CONFLICT]. 
7470: 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
7480: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  .** is called on
7490: 20 61 6e 79 20 6f 74 68 65 72 20 69 74 65 72 61   any other itera
74a0: 74 6f 72 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53  tor, [SQLITE_MIS
74b0: 55 53 45 5d 20 69 73 20 72 65 74 75 72 6e 65 64  USE] is returned
74c0: 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 0a 2a 2a   and *ppValue.**
74d0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
74e0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
74f0: 69 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65  iVal must be gre
7500: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
7510: 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73  al to 0, and les
7520: 73 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  s than the numbe
7530: 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  r.** of columns 
7540: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66  in the table aff
7550: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
7560: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68  rent change. Oth
7570: 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49  erwise,.** [SQLI
7580: 54 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74  TE_RANGE] is ret
7590: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
75a0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
75b0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  L..**.** If succ
75c0: 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
75d0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61  ction sets *ppVa
75e0: 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
75f0: 61 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73  a protected.** s
7600: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
7610: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
7620: 68 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65  he iVal'th value
7630: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 22 63   from the .** "c
7640: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 22 20  onflicting row" 
7650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7660: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
7670: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c  lict-handler cal
7680: 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 72 65 74  lback.** and ret
7690: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
76a0: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
76b0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
76c0: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
76d0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
76e0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
76f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
7700: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
7710: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
7720: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
7730: 65 74 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  et_conflict(.  s
7740: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7750: 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
7760: 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
7770: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56  ator */.  int iV
7780: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
7790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
77a0: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
77b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
77c0: 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
77d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 66 72  /* OUT: Value fr
77e0: 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  om conflicting r
77f0: 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.);../*.** 
7800: 43 41 50 49 33 52 45 46 3a 20 44 65 74 65 72 6d  CAPI3REF: Determ
7810: 69 6e 65 20 54 68 65 20 4e 75 6d 62 65 72 20 4f  ine The Number O
7820: 66 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f  f Foreign Key Co
7830: 6e 73 74 72 61 69 6e 74 20 56 69 6f 6c 61 74 69  nstraint Violati
7840: 6f 6e 73 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  ons.** METHOD: s
7850: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7860: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _iter.**.** This
7870: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
7880: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ly be called wit
7890: 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  h an iterator pa
78a0: 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a 20 53 51  ssed to an.** SQ
78b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46  LITE_CHANGESET_F
78c0: 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f 6e 66 6c  OREIGN_KEY confl
78d0: 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ict handler call
78e0: 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
78f0: 73 65 0a 2a 2a 20 69 74 20 73 65 74 73 20 74 68  se.** it sets th
7900: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
7910: 65 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  e to the total n
7920: 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77 6e 20 66  umber of known f
7930: 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 76 69  oreign key.** vi
7940: 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  olations in the 
7950: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
7960: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
7970: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
7980: 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
7990: 61 73 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  ases this functi
79a0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
79b0: 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69 6e 74  E_MISUSE..*/.int
79c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
79d0: 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 0a  t_fk_conflicts(.
79e0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
79f0: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
7a00: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69    /* Changeset i
7a10: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
7a20: 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20   *pnOut         
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 46  OUT: Number of F
7a50: 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 2a 2f 0a  K violations */.
7a60: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  );.../*.** CAPI3
7a70: 52 45 46 3a 20 46 69 6e 61 6c 69 7a 65 20 41 20  REF: Finalize A 
7a80: 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74  Changeset Iterat
7a90: 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71  or.** METHOD: sq
7aa0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7ab0: 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  iter.**.** This 
7ac0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
7ad0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 6e 20   to finalize an 
7ae0: 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61 74  iterator allocat
7af0: 65 64 20 77 69 74 68 0a 2a 2a 20 5b 73 71 6c 69  ed with.** [sqli
7b00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
7b10: 72 74 28 29 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rt()]..**.** Thi
7b20: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7b30: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7b40: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
7b50: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a  eated using the.
7b60: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
7b70: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 20 66 75  eset_start()] fu
7b80: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 61 70  nction. If an ap
7b90: 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
7ba0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
7bb0: 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f   with an iterato
7bc0: 72 20 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f  r passed to a co
7bd0: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62  nflict-handler b
7be0: 79 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61  y.** [sqlite3cha
7bf0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
7c00: 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d   [SQLITE_MISUSE]
7c10: 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   is immediately 
7c20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7c30: 0a 2a 2a 20 63 61 6c 6c 20 68 61 73 20 6e 6f 20  .** call has no 
7c40: 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  effect..**.** If
7c50: 20 61 6e 20 65 72 72 6f 72 20 77 61 73 20 65 6e   an error was en
7c60: 63 6f 75 6e 74 65 72 65 64 20 77 69 74 68 69 6e  countered within
7c70: 20 61 20 63 61 6c 6c 20 74 6f 20 61 6e 20 73 71   a call to an sq
7c80: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 78  lite3changeset_x
7c90: 78 78 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  xx().** function
7ca0: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 61 6e   (for example an
7cb0: 20 5b 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   [SQLITE_CORRUPT
7cc0: 5d 20 69 6e 20 5b 73 71 6c 69 74 65 33 63 68 61  ] in [sqlite3cha
7cd0: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6f  ngeset_next()] o
7ce0: 72 20 61 6e 20 0a 2a 2a 20 5b 53 51 4c 49 54 45  r an .** [SQLITE
7cf0: 5f 4e 4f 4d 45 4d 5d 20 69 6e 20 5b 73 71 6c 69  _NOMEM] in [sqli
7d00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77  te3changeset_new
7d10: 28 29 5d 29 20 74 68 65 6e 20 61 6e 20 65 72 72  ()]) then an err
7d20: 6f 72 20 63 6f 64 65 20 63 6f 72 72 65 73 70 6f  or code correspo
7d30: 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 61 74  nding.** to that
7d40: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
7d50: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7d60: 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
7d70: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
7d80: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69  returned. This i
7d90: 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66  s to allow the f
7da0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65 72 6e  ollowing pattern
7db0: 20 28 70 73 65 75 64 6f 2d 63 6f 64 65 29 3a 0a   (pseudo-code):.
7dc0: 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20  **.** <pre>.**  
7dd0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
7de0: 74 5f 73 74 61 72 74 28 29 3b 0a 2a 2a 20 20 20  t_start();.**   
7df0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
7e00: 57 3d 3d 73 71 6c 69 74 65 33 63 68 61 6e 67 65  W==sqlite3change
7e10: 73 65 74 5f 6e 65 78 74 28 29 20 29 7b 0a 2a 2a  set_next() ){.**
7e20: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
7e30: 68 69 6e 67 20 77 69 74 68 20 63 68 61 6e 67 65  hing with change
7e40: 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 72 63  ..**   }.**   rc
7e50: 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
7e60: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 3b 0a  set_finalize();.
7e70: 2a 2a 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  **   if( rc!=SQL
7e80: 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20  ITE_OK ){.**    
7e90: 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 68 61 73   // An error has
7ea0: 20 6f 63 63 75 72 72 65 64 20 0a 2a 2a 20 20 20   occurred .**   
7eb0: 7d 0a 2a 2a 20 3c 2f 70 72 65 3e 0a 2a 2f 0a 69  }.** </pre>.*/.i
7ec0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
7ed0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c  set_finalize(sql
7ee0: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
7ef0: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
7f00: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6e  .** CAPI3REF: In
7f10: 76 65 72 74 20 41 20 43 68 61 6e 67 65 73 65 74  vert A Changeset
7f20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7f30: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
7f40: 22 69 6e 76 65 72 74 22 20 61 20 63 68 61 6e 67  "invert" a chang
7f50: 65 73 65 74 20 6f 62 6a 65 63 74 2e 20 41 70 70  eset object. App
7f60: 6c 79 69 6e 67 20 61 6e 20 69 6e 76 65 72 74 65  lying an inverte
7f70: 64 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74  d.** changeset t
7f80: 6f 20 61 20 64 61 74 61 62 61 73 65 20 72 65 76  o a database rev
7f90: 65 72 73 65 73 20 74 68 65 20 65 66 66 65 63 74  erses the effect
7fa0: 73 20 6f 66 20 61 70 70 6c 79 69 6e 67 20 74 68  s of applying th
7fb0: 65 20 75 6e 69 6e 76 65 72 74 65 64 0a 2a 2a 20  e uninverted.** 
7fc0: 63 68 61 6e 67 65 73 65 74 2e 20 53 70 65 63 69  changeset. Speci
7fd0: 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c  fically:.**.** <
7fe0: 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61  ul>.**   <li> Ea
7ff0: 63 68 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ch DELETE change
8000: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61   is changed to a
8010: 6e 20 49 4e 53 45 52 54 2c 20 61 6e 64 0a 2a 2a  n INSERT, and.**
8020: 20 20 20 3c 6c 69 3e 20 45 61 63 68 20 49 4e 53     <li> Each INS
8030: 45 52 54 20 63 68 61 6e 67 65 20 69 73 20 63 68  ERT change is ch
8040: 61 6e 67 65 64 20 74 6f 20 61 20 44 45 4c 45 54  anged to a DELET
8050: 45 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e  E, and.**   <li>
8060: 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54 45   For each UPDATE
8070: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 6f 6c 64   change, the old
8080: 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a 20 76 61 6c  .* and new.* val
8090: 75 65 73 20 61 72 65 20 65 78 63 68 61 6e 67 65  ues are exchange
80a0: 64 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  d..** </ul>.**.*
80b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
80c0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
80d0: 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
80e0: 63 68 20 63 68 61 6e 67 65 73 20 61 70 70 65 61  ch changes appea
80f0: 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  r within.** the 
8100: 63 68 61 6e 67 65 73 65 74 2e 20 49 74 20 6d 65  changeset. It me
8110: 72 65 6c 79 20 72 65 76 65 72 73 65 73 20 74 68  rely reverses th
8120: 65 20 73 65 6e 73 65 20 6f 66 20 65 61 63 68 20  e sense of each 
8130: 69 6e 64 69 76 69 64 75 61 6c 20 63 68 61 6e 67  individual chang
8140: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
8150: 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
8160: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
8170: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 76  ntaining the inv
8180: 65 72 74 65 64 20 63 68 61 6e 67 65 73 65 74 0a  erted changeset.
8190: 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
81a0: 2a 70 70 4f 75 74 2c 20 74 68 65 20 73 69 7a 65  *ppOut, the size
81b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 62 75 66   of the same buf
81c0: 66 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e  fer is stored in
81d0: 20 2a 70 6e 4f 75 74 2c 20 61 6e 64 0a 2a 2a 20   *pnOut, and.** 
81e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
81f0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
8200: 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74 68 20  or occurs, both 
8210: 2a 70 6e 4f 75 74 20 61 6e 64 20 2a 70 70 4f 75  *pnOut and *ppOu
8220: 74 20 61 72 65 0a 2a 2a 20 7a 65 72 6f 65 64 20  t are.** zeroed 
8230: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
8240: 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
8250: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  d..**.** It is t
8260: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
8270: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
8280: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
8290: 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
82a0: 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 2a 70 70 4f  ).** on the *ppO
82b0: 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 72  ut pointer to fr
82c0: 65 65 20 74 68 65 20 62 75 66 66 65 72 20 61 6c  ee the buffer al
82d0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  location followi
82e0: 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
82f0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  .** call to this
8300: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8310: 20 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 54   WARNING/TODO: T
8320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 75 72  his function cur
8330: 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rently assumes t
8340: 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 69 73  hat the input is
8350: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 63 68 61 6e   a valid.** chan
8360: 67 65 73 65 74 2e 20 49 66 20 69 74 20 69 73 20  geset. If it is 
8370: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 73  not, the results
8380: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
8390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
83a0: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 0a  angeset_invert(.
83b0: 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74    int nIn, const
83c0: 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20   void *pIn,     
83d0: 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67    /* Input chang
83e0: 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  eset */.  int *p
83f0: 6e 4f 75 74 2c 20 76 6f 69 64 20 2a 2a 70 70 4f  nOut, void **ppO
8400: 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ut        /* OUT
8410: 3a 20 49 6e 76 65 72 73 65 20 6f 66 20 69 6e 70  : Inverse of inp
8420: 75 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ut */.);../*.** 
8430: 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 63 61 74  CAPI3REF: Concat
8440: 65 6e 61 74 65 20 54 77 6f 20 43 68 61 6e 67 65  enate Two Change
8450: 73 65 74 20 4f 62 6a 65 63 74 73 0a 2a 2a 0a 2a  set Objects.**.*
8460: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8470: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 63 61  is used to conca
8480: 74 65 6e 61 74 65 20 74 77 6f 20 63 68 61 6e 67  tenate two chang
8490: 65 73 65 74 73 2c 20 41 20 61 6e 64 20 42 2c 20  esets, A and B, 
84a0: 69 6e 74 6f 20 61 20 0a 2a 2a 20 73 69 6e 67 6c  into a .** singl
84b0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 68 65  e changeset. The
84c0: 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 68 61   result is a cha
84d0: 6e 67 65 73 65 74 20 65 71 75 69 76 61 6c 65 6e  ngeset equivalen
84e0: 74 20 74 6f 20 61 70 70 6c 79 69 6e 67 0a 2a 2a  t to applying.**
84f0: 20 63 68 61 6e 67 65 73 65 74 20 41 20 66 6f 6c   changeset A fol
8500: 6c 6f 77 65 64 20 62 79 20 63 68 61 6e 67 65 73  lowed by changes
8510: 65 74 20 42 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  et B. .**.** Thi
8520: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 62 69  s function combi
8530: 6e 65 73 20 74 68 65 20 74 77 6f 20 69 6e 70 75  nes the two inpu
8540: 74 20 63 68 61 6e 67 65 73 65 74 73 20 75 73 69  t changesets usi
8550: 6e 67 20 61 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ng an .** sqlite
8560: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  3_changegroup ob
8570: 6a 65 63 74 2e 20 43 61 6c 6c 69 6e 67 20 69 74  ject. Calling it
8580: 20 70 72 6f 64 75 63 65 73 20 73 69 6d 69 6c 61   produces simila
8590: 72 20 72 65 73 75 6c 74 73 20 61 73 20 74 68 65  r results as the
85a0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  .** following co
85b0: 64 65 20 66 72 61 67 6d 65 6e 74 3a 0a 2a 2a 0a  de fragment:.**.
85c0: 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20 20 73 71  ** <pre>.**   sq
85d0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
85e0: 70 20 2a 70 47 72 70 3b 0a 2a 2a 20 20 20 72 63  p *pGrp;.**   rc
85f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67   = sqlite3_chang
8600: 65 67 72 6f 75 70 5f 6e 65 77 28 26 70 47 72 70  egroup_new(&pGrp
8610: 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d  );.**   if( rc==
8620: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
8630: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
8640: 6f 75 70 5f 61 64 64 28 70 47 72 70 2c 20 6e 41  oup_add(pGrp, nA
8650: 2c 20 70 41 29 3b 0a 2a 2a 20 20 20 69 66 28 20  , pA);.**   if( 
8660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8670: 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
8680: 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72 70  gegroup_add(pGrp
8690: 2c 20 6e 42 2c 20 70 42 29 3b 0a 2a 2a 20 20 20  , nB, pB);.**   
86a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
86b0: 4b 20 29 7b 0a 2a 2a 20 20 20 20 20 72 63 20 3d  K ){.**     rc =
86c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
86d0: 6f 75 70 5f 6f 75 74 70 75 74 28 70 47 72 70 2c  oup_output(pGrp,
86e0: 20 70 6e 4f 75 74 2c 20 70 70 4f 75 74 29 3b 0a   pnOut, ppOut);.
86f0: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
8700: 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 2a     *ppOut = 0;.*
8710: 2a 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 30  *     *pnOut = 0
8720: 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70 72  ;.**   }.** </pr
8730: 65 3e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  e>.**.** Refer t
8740: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68  o the sqlite3_ch
8750: 61 6e 67 65 67 72 6f 75 70 20 64 6f 63 75 6d 65  angegroup docume
8760: 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  ntation below fo
8770: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
8780: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
8790: 65 74 5f 63 6f 6e 63 61 74 28 0a 20 20 69 6e 74  et_concat(.  int
87a0: 20 6e 41 2c 20 20 20 20 20 20 20 20 20 20 20 20   nA,            
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
87d0: 69 6e 20 62 75 66 66 65 72 20 70 41 20 2a 2f 0a  in buffer pA */.
87e0: 20 20 76 6f 69 64 20 2a 70 41 2c 20 20 20 20 20    void *pA,     
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8810: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
8820: 67 20 63 68 61 6e 67 65 73 65 74 20 41 20 2a 2f  g changeset A */
8830: 0a 20 20 69 6e 74 20 6e 42 2c 20 20 20 20 20 20  .  int nB,      
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8860: 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20  bytes in buffer 
8870: 70 42 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  pB */.  void *pB
8880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8890: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88a0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
88b0: 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65  taining changese
88c0: 74 20 42 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  t B */.  int *pn
88d0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
88e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
88f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8900: 20 69 6e 20 6f 75 74 70 75 74 20 63 68 61 6e 67   in output chang
8910: 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  eset */.  void *
8920: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8940: 3a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  : Buffer contain
8950: 69 6e 67 20 6f 75 74 70 75 74 20 63 68 61 6e 67  ing output chang
8960: 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a  eset */.);.../*.
8970: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 68 61  ** CAPI3REF: Cha
8980: 6e 67 65 67 72 6f 75 70 20 48 61 6e 64 6c 65 0a  ngegroup Handle.
8990: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 67 72  **.** A changegr
89a0: 6f 75 70 20 69 73 20 61 6e 20 6f 62 6a 65 63 74  oup is an object
89b0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65   used to combine
89c0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 0a 2a 2a   two or more .**
89d0: 20 5b 63 68 61 6e 67 65 73 65 74 73 5d 20 6f 72   [changesets] or
89e0: 20 5b 70 61 74 63 68 73 65 74 73 5d 0a 2a 2f 0a   [patchsets].*/.
89f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
8a00: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
8a10: 75 70 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  up sqlite3_chang
8a20: 65 67 72 6f 75 70 3b 0a 0a 2f 2a 0a 2a 2a 20 43  egroup;../*.** C
8a30: 41 50 49 33 52 45 46 3a 20 43 72 65 61 74 65 20  API3REF: Create 
8a40: 41 20 4e 65 77 20 43 68 61 6e 67 65 67 72 6f 75  A New Changegrou
8a50: 70 20 4f 62 6a 65 63 74 0a 2a 2a 20 43 4f 4e 53  p Object.** CONS
8a60: 54 52 55 43 54 4f 52 3a 20 73 71 6c 69 74 65 33  TRUCTOR: sqlite3
8a70: 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 0a  _changegroup.**.
8a80: 2a 2a 20 41 6e 20 73 71 6c 69 74 65 33 5f 63 68  ** An sqlite3_ch
8a90: 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63 74  angegroup object
8aa0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 62   is used to comb
8ab0: 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ine two or more 
8ac0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 28 6f  changesets.** (o
8ad0: 72 20 70 61 74 63 68 73 65 74 73 29 20 69 6e 74  r patchsets) int
8ae0: 6f 20 61 20 73 69 6e 67 6c 65 20 63 68 61 6e 67  o a single chang
8af0: 65 73 65 74 20 28 6f 72 20 70 61 74 63 68 73 65  eset (or patchse
8b00: 74 29 2e 20 41 20 73 69 6e 67 6c 65 20 63 68 61  t). A single cha
8b10: 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 6f 62 6a 65  ngegroup.** obje
8b20: 63 74 20 6d 61 79 20 63 6f 6d 62 69 6e 65 20 63  ct may combine c
8b30: 68 61 6e 67 65 73 65 74 73 20 6f 72 20 70 61 74  hangesets or pat
8b40: 63 68 73 65 74 73 2c 20 62 75 74 20 6e 6f 74 20  chsets, but not 
8b50: 62 6f 74 68 2e 20 54 68 65 20 6f 75 74 70 75 74  both. The output
8b60: 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 6e   is.** always in
8b70: 20 74 68 65 20 73 61 6d 65 20 66 6f 72 6d 61 74   the same format
8b80: 20 61 73 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a   as the input..*
8b90: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
8ba0: 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
8bb0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
8bc0: 5f 4f 4b 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  _OK and populate
8bd0: 73 20 28 2a 70 70 29 20 77 69 74 68 0a 2a 2a 20  s (*pp) with.** 
8be0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
8bf0: 65 77 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ew sqlite3_chang
8c00: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 62 65  egroup object be
8c10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
8c20: 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 73 68  The caller.** sh
8c30: 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
8c40: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
8c50: 64 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 20 61  d object using a
8c60: 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
8c70: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8c80: 64 65 6c 65 74 65 28 29 2e 20 49 66 20 61 6e 20  delete(). If an 
8c90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8ca0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
8cb0: 64 65 0a 2a 2a 20 28 69 2e 65 2e 20 53 51 4c 49  de.** (i.e. SQLI
8cc0: 54 45 5f 4e 4f 4d 45 4d 29 20 69 73 20 72 65 74  TE_NOMEM) is ret
8cd0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
8ce0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
8cf0: 0a 2a 2a 20 54 68 65 20 75 73 75 61 6c 20 75 73  .** The usual us
8d00: 61 67 65 20 70 61 74 74 65 72 6e 20 66 6f 72 20  age pattern for 
8d10: 61 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  an sqlite3_chang
8d20: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 69 73  egroup object is
8d30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8d40: 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ul>.**   <li
8d50: 3e 20 49 74 20 69 73 20 63 72 65 61 74 65 64 20  > It is created 
8d60: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8d70: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8d80: 75 70 5f 6e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20  up_new()..**.** 
8d90: 20 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d    <li> Zero or m
8da0: 6f 72 65 20 63 68 61 6e 67 65 73 65 74 73 20 28  ore changesets (
8db0: 6f 72 20 70 61 74 63 68 73 65 74 73 29 20 61 72  or patchsets) ar
8dc0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  e added to the o
8dd0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
8de0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
8df0: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
8e00: 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  d()..**.**   <li
8e10: 3e 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  > The result of 
8e20: 63 6f 6d 62 69 6e 69 6e 67 20 61 6c 6c 20 69 6e  combining all in
8e30: 70 75 74 20 63 68 61 6e 67 65 73 65 74 73 20 74  put changesets t
8e40: 6f 67 65 74 68 65 72 20 69 73 20 6f 62 74 61 69  ogether is obtai
8e50: 6e 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 62  ned .**        b
8e60: 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
8e70: 6e 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20  n via a call to 
8e80: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8e90: 75 70 5f 6f 75 74 70 75 74 28 29 2e 0a 2a 2a 0a  up_output()..**.
8ea0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6f 62  **   <li> The ob
8eb0: 6a 65 63 74 20 69 73 20 64 65 6c 65 74 65 64 20  ject is deleted 
8ec0: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8ed0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8ee0: 75 70 5f 64 65 6c 65 74 65 28 29 2e 0a 2a 2a 20  up_delete()..** 
8ef0: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  </ul>.**.** Any 
8f00: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
8f10: 74 6f 20 61 64 64 28 29 20 61 6e 64 20 6f 75 74  to add() and out
8f20: 70 75 74 28 29 20 6d 61 79 20 62 65 20 6d 61 64  put() may be mad
8f30: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 61  e between the ca
8f40: 6c 6c 73 20 74 6f 0a 2a 2a 20 6e 65 77 28 29 20  lls to.** new() 
8f50: 61 6e 64 20 64 65 6c 65 74 65 28 29 2c 20 61 6e  and delete(), an
8f60: 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 0a  d in any order..
8f70: 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  **.** As well as
8f80: 20 74 68 65 20 72 65 67 75 6c 61 72 20 73 71 6c   the regular sql
8f90: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8fa0: 61 64 64 28 29 20 61 6e 64 20 0a 2a 2a 20 73 71  add() and .** sq
8fb0: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
8fc0: 5f 6f 75 74 70 75 74 28 29 20 66 75 6e 63 74 69  _output() functi
8fd0: 6f 6e 73 2c 20 61 6c 73 6f 20 61 76 61 69 6c 61  ons, also availa
8fe0: 62 6c 65 20 61 72 65 20 74 68 65 20 73 74 72 65  ble are the stre
8ff0: 61 6d 69 6e 67 0a 2a 2a 20 76 65 72 73 69 6f 6e  aming.** version
9000: 73 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  s sqlite3changeg
9010: 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 29 20  roup_add_strm() 
9020: 61 6e 64 20 73 71 6c 69 74 65 33 63 68 61 6e 67  and sqlite3chang
9030: 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74  egroup_output_st
9040: 72 6d 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rm()..*/.int sql
9050: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
9060: 6e 65 77 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  new(sqlite3_chan
9070: 67 65 67 72 6f 75 70 20 2a 2a 70 70 29 3b 0a 0a  gegroup **pp);..
9080: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
9090: 41 64 64 20 41 20 43 68 61 6e 67 65 73 65 74 20  Add A Changeset 
90a0: 54 6f 20 41 20 43 68 61 6e 67 65 67 72 6f 75 70  To A Changegroup
90b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
90c0: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a  te3_changegroup.
90d0: 2a 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 63 68  **.** Add all ch
90e0: 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68 65  anges within the
90f0: 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72 20 70   changeset (or p
9100: 61 74 63 68 73 65 74 29 20 69 6e 20 62 75 66 66  atchset) in buff
9110: 65 72 20 70 44 61 74 61 20 28 73 69 7a 65 0a 2a  er pData (size.*
9120: 2a 20 6e 44 61 74 61 20 62 79 74 65 73 29 20 74  * nData bytes) t
9130: 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  o the changegrou
9140: 70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  p. .**.** If the
9150: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 73   buffer contains
9160: 20 61 20 70 61 74 63 68 73 65 74 2c 20 74 68 65   a patchset, the
9170: 6e 20 61 6c 6c 20 70 72 69 6f 72 20 63 61 6c 6c  n all prior call
9180: 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  s to this functi
9190: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  on.** on the sam
91a0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  e changegroup ob
91b0: 6a 65 63 74 20 6d 75 73 74 20 61 6c 73 6f 20 68  ject must also h
91c0: 61 76 65 20 73 70 65 63 69 66 69 65 64 20 70 61  ave specified pa
91d0: 74 63 68 73 65 74 73 2e 20 4f 72 2c 20 69 66 0a  tchsets. Or, if.
91e0: 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  ** the buffer co
91f0: 6e 74 61 69 6e 73 20 61 20 63 68 61 6e 67 65 73  ntains a changes
9200: 65 74 2c 20 73 6f 20 6d 75 73 74 20 68 61 76 65  et, so must have
9210: 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c   the earlier cal
9220: 6c 73 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75  ls to this.** fu
9230: 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
9240: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  e, SQLITE_ERROR 
9250: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
9260: 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 61  no changes are a
9270: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  dded.** to the c
9280: 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  hangegroup..**.*
9290: 2a 20 52 6f 77 73 20 77 69 74 68 69 6e 20 74 68  * Rows within th
92a0: 65 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20  e changeset and 
92b0: 63 68 61 6e 67 65 67 72 6f 75 70 20 61 72 65 20  changegroup are 
92c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
92d0: 65 20 76 61 6c 75 65 73 20 69 6e 0a 2a 2a 20 74  e values in.** t
92e0: 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b 45 59  heir PRIMARY KEY
92f0: 20 63 6f 6c 75 6d 6e 73 2e 20 41 20 63 68 61 6e   columns. A chan
9300: 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ge in the change
9310: 73 65 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65  set is considere
9320: 64 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 74 6f  d to.** apply to
9330: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73   the same row as
9340: 20 61 20 63 68 61 6e 67 65 20 61 6c 72 65 61 64   a change alread
9350: 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  y present in the
9360: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 69 66 0a   changegroup if.
9370: 2a 2a 20 74 68 65 20 74 77 6f 20 72 6f 77 73 20  ** the two rows 
9380: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 70 72  have the same pr
9390: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
93a0: 20 43 68 61 6e 67 65 73 20 74 6f 20 72 6f 77 73   Changes to rows
93b0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 6c 72   that do not alr
93c0: 65 61 64 79 20 61 70 70 65 61 72 20 69 6e 20 74  eady appear in t
93d0: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 61  he changegroup a
93e0: 72 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 63 6f 70  re.** simply cop
93f0: 69 65 64 20 69 6e 74 6f 20 69 74 2e 20 4f 72 2c  ied into it. Or,
9400: 20 69 66 20 62 6f 74 68 20 74 68 65 20 6e 65 77   if both the new
9410: 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20 74   changeset and t
9420: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a  he changegroup.*
9430: 2a 20 63 6f 6e 74 61 69 6e 20 63 68 61 6e 67 65  * contain change
9440: 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
9450: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
9460: 65 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 73  e final contents
9470: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67   of the.** chang
9480: 65 67 72 6f 75 70 20 64 65 70 65 6e 64 73 20 6f  egroup depends o
9490: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 65 61  n the type of ea
94a0: 63 68 20 63 68 61 6e 67 65 2c 20 61 73 20 66 6f  ch change, as fo
94b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 74 61  llows:.**.** <ta
94c0: 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73 74 79  ble border=1 sty
94d0: 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a  le="margin-left:
94e0: 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74  8ex;margin-right
94f0: 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74 72 3e  :8ex">.**   <tr>
9500: 3c 74 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65  <th style="white
9510: 2d 73 70 61 63 65 3a 70 72 65 22 3e 45 78 69 73  -space:pre">Exis
9520: 74 69 6e 67 20 43 68 61 6e 67 65 20 20 3c 2f 74  ting Change  </t
9530: 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68 20  h>.**       <th 
9540: 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61  style="white-spa
9550: 63 65 3a 70 72 65 22 3e 4e 65 77 20 43 68 61 6e  ce:pre">New Chan
9560: 67 65 20 20 20 20 20 20 20 3c 2f 74 68 3e 0a 2a  ge       </th>.*
9570: 2a 20 20 20 20 20 20 20 3c 74 68 3e 4f 75 74 70  *       <th>Outp
9580: 75 74 20 43 68 61 6e 67 65 0a 2a 2a 20 20 20 3c  ut Change.**   <
9590: 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  tr><td>INSERT <t
95a0: 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a  d>INSERT <td>.**
95b0: 20 20 20 20 20 20 20 54 68 65 20 6e 65 77 20 63         The new c
95c0: 68 61 6e 67 65 20 69 73 20 69 67 6e 6f 72 65 64  hange is ignored
95d0: 2e 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73  . This case does
95e0: 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20 74 68   not occur if th
95f0: 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 63  e new.**       c
9600: 68 61 6e 67 65 73 65 74 20 77 61 73 20 72 65 63  hangeset was rec
9610: 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  orded immediatel
9620: 79 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  y after the chan
9630: 67 65 73 65 74 73 20 61 6c 72 65 61 64 79 0a 2a  gesets already.*
9640: 2a 20 20 20 20 20 20 20 61 64 64 65 64 20 74 6f  *       added to
9650: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
9660: 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49  ..**   <tr><td>I
9670: 4e 53 45 52 54 20 3c 74 64 3e 55 50 44 41 54 45  NSERT <td>UPDATE
9680: 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54   <td>.**       T
9690: 68 65 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65  he INSERT change
96a0: 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
96b0: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54 68 65  changegroup. The
96c0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 0a   values in the .
96d0: 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  **       INSERT 
96e0: 63 68 61 6e 67 65 20 61 72 65 20 6d 6f 64 69 66  change are modif
96f0: 69 65 64 20 61 73 20 69 66 20 74 68 65 20 72 6f  ied as if the ro
9700: 77 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 62  w was inserted b
9710: 79 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65  y the.**       e
9720: 78 69 73 74 69 6e 67 20 63 68 61 6e 67 65 20 61  xisting change a
9730: 6e 64 20 74 68 65 6e 20 75 70 64 61 74 65 64 20  nd then updated 
9740: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
9750: 20 6e 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20   new change..** 
9760: 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54    <tr><td>INSERT
9770: 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e   <td>DELETE <td>
9780: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78  .**       The ex
9790: 69 73 74 69 6e 67 20 49 4e 53 45 52 54 20 69 73  isting INSERT is
97a0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
97b0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54  e changegroup. T
97c0: 68 65 20 44 45 4c 45 54 45 20 69 73 0a 2a 2a 20  he DELETE is.** 
97d0: 20 20 20 20 20 20 6e 6f 74 20 61 64 64 65 64 2e        not added.
97e0: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50  .**   <tr><td>UP
97f0: 44 41 54 45 20 3c 74 64 3e 49 4e 53 45 52 54 20  DATE <td>INSERT 
9800: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68  <td>.**       Th
9810: 65 20 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20  e new change is 
9820: 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61  ignored. This ca
9830: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  se does not occu
9840: 72 20 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r if the new.** 
9850: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20        changeset 
9860: 77 61 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d  was recorded imm
9870: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
9880: 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c  he changesets al
9890: 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61  ready.**       a
98a0: 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e  dded to the chan
98b0: 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74  gegroup..**   <t
98c0: 72 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64  r><td>UPDATE <td
98d0: 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20  >UPDATE <td>.** 
98e0: 20 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69        The existi
98f0: 6e 67 20 55 50 44 41 54 45 20 72 65 6d 61 69 6e  ng UPDATE remain
9900: 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 61  s within the cha
9910: 6e 67 65 67 72 6f 75 70 2e 20 49 74 20 69 73 20  ngegroup. It is 
9920: 61 6d 65 6e 64 65 64 20 0a 2a 2a 20 20 20 20 20  amended .**     
9930: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 63    so that the ac
9940: 63 6f 6d 70 61 6e 79 69 6e 67 20 76 61 6c 75 65  companying value
9950: 73 20 61 72 65 20 61 73 20 69 66 20 74 68 65 20  s are as if the 
9960: 72 6f 77 20 77 61 73 20 75 70 64 61 74 65 64 20  row was updated 
9970: 6f 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 62  once .**       b
9980: 79 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  y the existing c
9990: 68 61 6e 67 65 20 61 6e 64 20 74 68 65 6e 20 61  hange and then a
99a0: 67 61 69 6e 20 62 79 20 74 68 65 20 6e 65 77 20  gain by the new 
99b0: 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 3c 74 72  change..**   <tr
99c0: 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e  ><td>UPDATE <td>
99d0: 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20  DELETE <td>.**  
99e0: 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69 6e       The existin
99f0: 67 20 55 50 44 41 54 45 20 69 73 20 72 65 70 6c  g UPDATE is repl
9a00: 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  aced by the new 
9a10: 44 45 4c 45 54 45 20 77 69 74 68 69 6e 20 74 68  DELETE within th
9a20: 65 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67  e.**       chang
9a30: 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72  egroup..**   <tr
9a40: 3e 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e  ><td>DELETE <td>
9a50: 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20  INSERT <td>.**  
9a60: 20 20 20 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d       If one or m
9a70: 6f 72 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ore of the colum
9a80: 6e 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  n values in the 
9a90: 72 6f 77 20 69 6e 73 65 72 74 65 64 20 62 79 20  row inserted by 
9aa0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77  the.**       new
9ab0: 20 63 68 61 6e 67 65 20 64 69 66 66 65 72 20 66   change differ f
9ac0: 72 6f 6d 20 74 68 6f 73 65 20 69 6e 20 74 68 65  rom those in the
9ad0: 20 72 6f 77 20 64 65 6c 65 74 65 64 20 62 79 20   row deleted by 
9ae0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 0a 2a 2a  the existing .**
9af0: 20 20 20 20 20 20 20 63 68 61 6e 67 65 2c 20 74         change, t
9b00: 68 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45  he existing DELE
9b10: 54 45 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  TE is replaced b
9b20: 79 20 61 6e 20 55 50 44 41 54 45 20 77 69 74 68  y an UPDATE with
9b30: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
9b40: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 4f 74 68  changegroup. Oth
9b50: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
9b60: 6e 73 65 72 74 65 64 20 72 6f 77 20 69 73 20 65  nserted row is e
9b70: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
9b80: 0a 2a 2a 20 20 20 20 20 20 20 61 73 20 74 68 65  .**       as the
9b90: 20 64 65 6c 65 74 65 64 20 72 6f 77 2c 20 74 68   deleted row, th
9ba0: 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45 54  e existing DELET
9bb0: 45 20 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63  E is simply disc
9bc0: 61 72 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e  arded..**   <tr>
9bd0: 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 55  <td>DELETE <td>U
9be0: 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  PDATE <td>.**   
9bf0: 20 20 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e      The new chan
9c00: 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54  ge is ignored. T
9c10: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
9c20: 74 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e  t occur if the n
9c30: 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e  ew.**       chan
9c40: 67 65 73 65 74 20 77 61 73 20 72 65 63 6f 72 64  geset was record
9c50: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
9c60: 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 73  fter the changes
9c70: 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ets already.**  
9c80: 20 20 20 20 20 61 64 64 65 64 20 74 6f 20 74 68       added to th
9c90: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a  e changegroup..*
9ca0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45  *   <tr><td>DELE
9cb0: 54 45 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74  TE <td>DELETE <t
9cc0: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
9cd0: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
9ce0: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
9cf0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
9d00: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
9d10: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
9d20: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
9d30: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
9d40: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
9d50: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
9d60: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
9d70: 67 72 6f 75 70 2e 0a 2a 2a 20 3c 2f 74 61 62 6c  group..** </tabl
9d80: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
9d90: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20 63 6f  new changeset co
9da0: 6e 74 61 69 6e 73 20 63 68 61 6e 67 65 73 20 74  ntains changes t
9db0: 6f 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  o a table that i
9dc0: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
9dd0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 68 61 6e  t.** in the chan
9de0: 67 65 67 72 6f 75 70 2c 20 74 68 65 6e 20 74 68  gegroup, then th
9df0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9e00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 70 6f 73 69  mns and the posi
9e10: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 70  tion of the.** p
9e20: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
9e30: 6e 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ns for the table
9e40: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 69 73 74   must be consist
9e50: 65 6e 74 2e 20 49 66 20 74 68 69 73 20 69 73 20  ent. If this is 
9e60: 6e 6f 74 20 74 68 65 0a 2a 2a 20 63 61 73 65 2c  not the.** case,
9e70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9e80: 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
9e90: 5f 53 43 48 45 4d 41 2e 20 49 66 20 74 68 65 20  _SCHEMA. If the 
9ea0: 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 0a  input changeset.
9eb0: 2a 2a 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ** appears to be
9ec0: 20 63 6f 72 72 75 70 74 20 61 6e 64 20 74 68 65   corrupt and the
9ed0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
9ee0: 65 74 65 63 74 65 64 2c 20 53 51 4c 49 54 45 5f  etected, SQLITE_
9ef0: 43 4f 52 52 55 50 54 20 69 73 0a 2a 2a 20 72 65  CORRUPT is.** re
9f00: 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61  turned. Or, if a
9f10: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
9f20: 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
9f30: 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69   during processi
9f40: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  ng, this.** func
9f50: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
9f60: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 61 6c  ITE_NOMEM. In al
9f70: 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20 65  l cases, if an e
9f80: 72 72 6f 72 20 6f 63 63 75 72 73 20 74 68 65 0a  rror occurs the.
9f90: 2a 2a 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  ** final content
9fa0: 73 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67  s of the changeg
9fb0: 72 6f 75 70 20 69 73 20 75 6e 64 65 66 69 6e 65  roup is undefine
9fc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  d..**.** If no e
9fd0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
9fe0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
9ff0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
a000: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
a010: 64 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  d(sqlite3_change
a020: 67 72 6f 75 70 2a 2c 20 69 6e 74 20 6e 44 61 74  group*, int nDat
a030: 61 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 3b  a, void *pData);
a040: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
a050: 3a 20 4f 62 74 61 69 6e 20 41 20 43 6f 6d 70 6f  : Obtain A Compo
a060: 73 69 74 65 20 43 68 61 6e 67 65 73 65 74 20 46  site Changeset F
a070: 72 6f 6d 20 41 20 43 68 61 6e 67 65 67 72 6f 75  rom A Changegrou
a080: 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  p.** METHOD: sql
a090: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
a0a0: 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  .**.** Obtain a 
a0b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
a0c0: 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 6f  g a changeset (o
a0d0: 72 20 70 61 74 63 68 73 65 74 29 20 72 65 70 72  r patchset) repr
a0e0: 65 73 65 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20  esenting the.** 
a0f0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
a100: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67 72   of the changegr
a110: 6f 75 70 2e 20 49 66 20 74 68 65 20 69 6e 70 75  oup. If the inpu
a120: 74 73 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ts to the change
a130: 67 72 6f 75 70 0a 2a 2a 20 77 65 72 65 20 74 68  group.** were th
a140: 65 6d 73 65 6c 76 65 73 20 63 68 61 6e 67 65 73  emselves changes
a150: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a160: 69 73 20 61 20 63 68 61 6e 67 65 73 65 74 2e 20  is a changeset. 
a170: 4f 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 69 6e  Or, if the.** in
a180: 70 75 74 73 20 77 65 72 65 20 70 61 74 63 68 73  puts were patchs
a190: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a1a0: 69 73 20 61 6c 73 6f 20 61 20 70 61 74 63 68 73  is also a patchs
a1b0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 69 74  et..**.** As wit
a1c0: 68 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  h the output of 
a1d0: 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
a1e0: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 61  on_changeset() a
a1f0: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 73 65 73  nd.** sqlite3ses
a200: 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 29 20  sion_patchset() 
a210: 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63  functions, all c
a220: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
a230: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 74 61  o a single.** ta
a240: 62 6c 65 20 61 72 65 20 67 72 6f 75 70 65 64 20  ble are grouped 
a250: 74 6f 67 65 74 68 65 72 20 69 6e 20 74 68 65 20  together in the 
a260: 6f 75 74 70 75 74 20 6f 66 20 74 68 69 73 20 66  output of this f
a270: 75 6e 63 74 69 6f 6e 2e 20 54 61 62 6c 65 73 20  unction. Tables 
a280: 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 74 68 65  appear.** in the
a290: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 66   same order as f
a2a0: 6f 72 20 74 68 65 20 76 65 72 79 20 66 69 72 73  or the very firs
a2b0: 74 20 63 68 61 6e 67 65 73 65 74 20 61 64 64 65  t changeset adde
a2c0: 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  d to the changeg
a2d0: 72 6f 75 70 2e 0a 2a 2a 20 49 66 20 74 68 65 20  roup..** If the 
a2e0: 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
a2f0: 75 65 6e 74 20 63 68 61 6e 67 65 73 65 74 73 20  uent changesets 
a300: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
a310: 6e 67 65 67 72 6f 75 70 20 63 6f 6e 74 61 69 6e  ngegroup contain
a320: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 66 6f 72 20  .** changes for 
a330: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
a340: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
a350: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74   first changeset
a360: 2c 20 74 68 65 79 20 61 72 65 0a 2a 2a 20 61 70  , they are.** ap
a370: 70 65 6e 64 65 64 20 6f 6e 74 6f 20 74 68 65 20  pended onto the 
a380: 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 70 75  end of the outpu
a390: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 67 61  t changeset, aga
a3a0: 69 6e 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  in in the order 
a3b0: 69 6e 0a 2a 2a 20 77 68 69 63 68 20 74 68 65 79  in.** which they
a3c0: 20 61 72 65 20 66 69 72 73 74 20 65 6e 63 6f 75   are first encou
a3d0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
a3e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a3f0: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
a400: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a410: 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
a420: 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 28  t.** variables (
a430: 2a 70 6e 44 61 74 61 29 20 61 6e 64 20 28 2a 70  *pnData) and (*p
a440: 70 44 61 74 61 29 20 61 72 65 20 73 65 74 20 74  pData) are set t
a450: 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
a460: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
a470: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
a480: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
a490: 73 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65  s are set to the
a4a0: 20 73 69 7a 65 20 6f 66 20 61 6e 64 20 61 20 0a   size of and a .
a4b0: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
a4c0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  e output buffer,
a4d0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 49   respectively. I
a4e0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
a4f0: 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
a500: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
a510: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
a520: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 62 75 66  lly free the buf
a530: 66 65 72 20 75 73 69 6e 67 20 61 0a 2a 2a 20 63  fer using a.** c
a540: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  all to sqlite3_f
a550: 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
a560: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a570: 5f 6f 75 74 70 75 74 28 0a 20 20 73 71 6c 69 74  _output(.  sqlit
a580: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c  e3_changegroup*,
a590: 0a 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 2c 20  .  int *pnData, 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
a5c0: 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
a5d0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76   in bytes */.  v
a5e0: 6f 69 64 20 2a 2a 70 70 44 61 74 61 20 20 20 20  oid **ppData    
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
a610: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
a620: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  */.);../*.** CAP
a630: 49 33 52 45 46 3a 20 44 65 6c 65 74 65 20 41 20  I3REF: Delete A 
a640: 43 68 61 6e 67 65 67 72 6f 75 70 20 4f 62 6a 65  Changegroup Obje
a650: 63 74 0a 2a 2a 20 44 45 53 54 52 55 43 54 4f 52  ct.** DESTRUCTOR
a660: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
a670: 67 72 6f 75 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  group.*/.void sq
a680: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a690: 5f 64 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  _delete(sqlite3_
a6a0: 63 68 61 6e 67 65 67 72 6f 75 70 2a 29 3b 0a 0a  changegroup*);..
a6b0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
a6c0: 41 70 70 6c 79 20 41 20 43 68 61 6e 67 65 73 65  Apply A Changese
a6d0: 74 20 54 6f 20 41 20 44 61 74 61 62 61 73 65 0a  t To A Database.
a6e0: 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 63 68  **.** Apply a ch
a6f0: 61 6e 67 65 73 65 74 20 74 6f 20 61 20 64 61 74  angeset to a dat
a700: 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63  abase. This func
a710: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
a720: 20 75 70 64 61 74 65 20 74 68 65 0a 2a 2a 20 22   update the.** "
a730: 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 20 61  main" database a
a740: 74 74 61 63 68 65 64 20 74 6f 20 68 61 6e 64 6c  ttached to handl
a750: 65 20 64 62 20 77 69 74 68 20 74 68 65 20 63 68  e db with the ch
a760: 61 6e 67 65 73 20 66 6f 75 6e 64 20 69 6e 20 74  anges found in t
a770: 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20  he.** changeset 
a780: 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
a790: 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
a7a0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  arguments..**.**
a7b0: 20 54 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   The fourth argu
a7c0: 6d 65 6e 74 20 28 78 46 69 6c 74 65 72 29 20 70  ment (xFilter) p
a7d0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
a7e0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 22 66  nction is the "f
a7f0: 69 6c 74 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ilter.** callbac
a800: 6b 22 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  k". If it is not
a810: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 6f 72 20   NULL, then for 
a820: 65 61 63 68 20 74 61 62 6c 65 20 61 66 66 65 63  each table affec
a830: 74 65 64 20 62 79 20 61 74 20 6c 65 61 73 74 20  ted by at least 
a840: 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67 65 20 69 6e  one.** change in
a850: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
a860: 74 68 65 20 66 69 6c 74 65 72 20 63 61 6c 6c 62  the filter callb
a870: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ack is invoked w
a880: 69 74 68 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ith.** the table
a890: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 73 65 63   name as the sec
a8a0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e  ond argument, an
a8b0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
a8c0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 0a  context pointer.
a8d0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
a8e0: 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74 20   sixth argument 
a8f0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
a900: 20 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 49   as the first. I
a910: 66 20 74 68 65 20 22 66 69 6c 74 65 72 0a 2a 2a  f the "filter.**
a920: 20 63 61 6c 6c 62 61 63 6b 22 20 72 65 74 75 72   callback" retur
a930: 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6e 6f  ns zero, then no
a940: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
a950: 20 74 6f 20 61 70 70 6c 79 20 61 6e 79 20 63 68   to apply any ch
a960: 61 6e 67 65 73 20 74 6f 20 0a 2a 2a 20 74 68 65  anges to .** the
a970: 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
a980: 65 2c 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  e, if the return
a990: 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
a9a0: 72 6f 20 6f 72 20 74 68 65 20 78 46 69 6c 74 65  ro or the xFilte
a9b0: 72 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  r.** argument to
a9c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a9d0: 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 63 68 61 6e  s NULL, all chan
a9e0: 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ges related to t
a9f0: 68 65 20 74 61 62 6c 65 20 61 72 65 0a 2a 2a 20  he table are.** 
aa00: 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
aa10: 20 46 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   For each table 
aa20: 74 68 61 74 20 69 73 20 6e 6f 74 20 65 78 63 6c  that is not excl
aa30: 75 64 65 64 20 62 79 20 74 68 65 20 66 69 6c 74  uded by the filt
aa40: 65 72 20 63 61 6c 6c 62 61 63 6b 2c 20 74 68 69  er callback, thi
aa50: 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 74  s function .** t
aa60: 65 73 74 73 20 74 68 61 74 20 74 68 65 20 74 61  ests that the ta
aa70: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63 6f  rget database co
aa80: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 70 61 74 69  ntains a compati
aa90: 62 6c 65 20 74 61 62 6c 65 2e 20 41 20 74 61 62  ble table. A tab
aaa0: 6c 65 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  le is .** consid
aab0: 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65 20  ered compatible 
aac0: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
aad0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
aae0: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
aaf0: 20 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65    <li> The table
ab00: 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
ab10: 6d 65 20 61 73 20 74 68 65 20 6e 61 6d 65 20 72  me as the name r
ab20: 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a  ecorded in the .
ab30: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
ab40: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c  set, and.**   <l
ab50: 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61 73  i> The table has
ab60: 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
ab70: 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 72 65 63  y columns as rec
ab80: 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a  orded in the .**
ab90: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 65          changese
aba0: 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e  t, and.**   <li>
abb0: 20 54 68 65 20 74 61 62 6c 65 20 68 61 73 20 70   The table has p
abc0: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
abd0: 6e 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ns in the same p
abe0: 6f 73 69 74 69 6f 6e 20 61 73 20 0a 2a 2a 20 20  osition as .**  
abf0: 20 20 20 20 20 20 72 65 63 6f 72 64 65 64 20 69        recorded i
ac00: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
ac10: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
ac20: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
ac30: 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2c  ompatible table,
ac40: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72   it is not an er
ac50: 72 6f 72 2c 20 62 75 74 20 6e 6f 6e 65 20 6f 66  ror, but none of
ac60: 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20   the.** changes 
ac70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ac80: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 61 70  the table are ap
ac90: 70 6c 69 65 64 2e 20 41 20 77 61 72 6e 69 6e 67  plied. A warning
aca0: 20 6d 65 73 73 61 67 65 20 69 73 20 69 73 73 75   message is issu
acb0: 65 64 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  ed.** via the sq
acc0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65 63 68  lite3_log() mech
acd0: 61 6e 69 73 6d 20 77 69 74 68 20 74 68 65 20 65  anism with the e
ace0: 72 72 6f 72 20 63 6f 64 65 20 53 51 4c 49 54 45  rror code SQLITE
acf0: 5f 53 43 48 45 4d 41 2e 20 41 74 20 6d 6f 73 74  _SCHEMA. At most
ad00: 0a 2a 2a 20 6f 6e 65 20 73 75 63 68 20 77 61 72  .** one such war
ad10: 6e 69 6e 67 20 69 73 20 69 73 73 75 65 64 20 66  ning is issued f
ad20: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
ad30: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a   the changeset..
ad40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 63  **.** For each c
ad50: 68 61 6e 67 65 20 66 6f 72 20 77 68 69 63 68 20  hange for which 
ad60: 74 68 65 72 65 20 69 73 20 61 20 63 6f 6d 70 61  there is a compa
ad70: 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 61 6e 20  tible table, an 
ad80: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
ad90: 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  .** to modify th
ada0: 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  e table contents
adb0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
adc0: 65 20 55 50 44 41 54 45 2c 20 49 4e 53 45 52 54  e UPDATE, INSERT
add0: 20 6f 72 20 44 45 4c 45 54 45 20 0a 2a 2a 20 63   or DELETE .** c
ade0: 68 61 6e 67 65 2e 20 49 66 20 61 20 63 68 61 6e  hange. If a chan
adf0: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 70 70  ge cannot be app
ae00: 6c 69 65 64 20 63 6c 65 61 6e 6c 79 2c 20 74 68  lied cleanly, th
ae10: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
ae20: 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
ae30: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ae40: 66 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  fth argument to 
ae50: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
ae60: 5f 61 70 70 6c 79 28 29 20 6d 61 79 20 62 65 20  _apply() may be 
ae70: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 41 20 64  .** invoked. A d
ae80: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 78  escription of ex
ae90: 61 63 74 6c 79 20 77 68 65 6e 20 74 68 65 20 63  actly when the c
aea0: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
aeb0: 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 0a  is invoked for .
aec0: 2a 2a 20 65 61 63 68 20 74 79 70 65 20 6f 66 20  ** each type of 
aed0: 63 68 61 6e 67 65 20 69 73 20 62 65 6c 6f 77 2e  change is below.
aee0: 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 74 68  .**.** Unlike th
aef0: 65 20 78 46 69 6c 74 65 72 20 61 72 67 75 6d 65  e xFilter argume
af00: 6e 74 2c 20 78 43 6f 6e 66 6c 69 63 74 20 6d 61  nt, xConflict ma
af10: 79 20 6e 6f 74 20 62 65 20 70 61 73 73 65 64 20  y not be passed 
af20: 4e 55 4c 4c 2e 20 54 68 65 20 72 65 73 75 6c 74  NULL. The result
af30: 73 0a 2a 2a 20 6f 66 20 70 61 73 73 69 6e 67 20  s.** of passing 
af40: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
af50: 68 61 6e 20 61 20 76 61 6c 69 64 20 66 75 6e 63  han a valid func
af60: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61 73 20  tion pointer as 
af70: 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 0a 2a 2a  the xConflict.**
af80: 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 75 6e   argument are un
af90: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  defined..**.** E
afa0: 61 63 68 20 74 69 6d 65 20 74 68 65 20 63 6f 6e  ach time the con
afb0: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75  flict handler fu
afc0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
afd0: 64 2c 20 69 74 20 6d 75 73 74 20 72 65 74 75 72  d, it must retur
afe0: 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20 5b 53 51 4c  n one.** of [SQL
aff0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d  ITE_CHANGESET_OM
b000: 49 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 43 48 41  IT], [SQLITE_CHA
b010: 4e 47 45 53 45 54 5f 41 42 4f 52 54 5d 20 6f 72  NGESET_ABORT] or
b020: 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41   .** [SQLITE_CHA
b030: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e  NGESET_REPLACE].
b040: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
b050: 54 5f 52 45 50 4c 41 43 45 20 6d 61 79 20 6f 6e  T_REPLACE may on
b060: 6c 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a  ly be returned.*
b070: 2a 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * if the second 
b080: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
b090: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  to the conflict 
b0a0: 68 61 6e 64 6c 65 72 20 69 73 20 65 69 74 68 65  handler is eithe
b0b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e  r.** SQLITE_CHAN
b0c0: 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 53 51  GESET_DATA or SQ
b0d0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43  LITE_CHANGESET_C
b0e0: 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68 65 20  ONFLICT. If the 
b0f0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
b100: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 69  .** returns an i
b110: 6c 6c 65 67 61 6c 20 76 61 6c 75 65 2c 20 61 6e  llegal value, an
b120: 79 20 63 68 61 6e 67 65 73 20 61 6c 72 65 61 64  y changes alread
b130: 79 20 6d 61 64 65 20 61 72 65 20 72 6f 6c 6c 65  y made are rolle
b140: 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 74 68  d back and.** th
b150: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
b160: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
b170: 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  () returns SQLIT
b180: 45 5f 4d 49 53 55 53 45 2e 20 44 69 66 66 65 72  E_MISUSE. Differ
b190: 65 6e 74 20 0a 2a 2a 20 61 63 74 69 6f 6e 73 20  ent .** actions 
b1a0: 61 72 65 20 74 61 6b 65 6e 20 62 79 20 73 71 6c  are taken by sql
b1b0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
b1c0: 70 6c 79 28 29 20 64 65 70 65 6e 64 69 6e 67 20  ply() depending 
b1d0: 6f 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  on the value.** 
b1e0: 72 65 74 75 72 6e 65 64 20 62 79 20 65 61 63 68  returned by each
b1f0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
b200: 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64  he conflict-hand
b210: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65  ler function. Re
b220: 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20 64 6f  fer to.** the do
b230: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
b240: 74 68 65 20 74 68 72 65 65 20 0a 2a 2a 20 5b 53  the three .** [S
b250: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
b260: 4f 4d 49 54 7c 61 76 61 69 6c 61 62 6c 65 20 72  OMIT|available r
b270: 65 74 75 72 6e 20 76 61 6c 75 65 73 5d 20 66 6f  eturn values] fo
b280: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
b290: 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 44 45 4c   <dl>.** <dt>DEL
b2a0: 45 54 45 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a  ETE Changes<dd>.
b2b0: 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20 44 45  **   For each DE
b2c0: 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 74 68 69  LETE change, thi
b2d0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
b2e0: 73 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20  s if the target 
b2f0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 63  database .**   c
b300: 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77 69  ontains a row wi
b310: 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69 6d  th the same prim
b320: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20 28 6f  ary key value (o
b330: 72 20 76 61 6c 75 65 73 29 20 61 73 20 74 68 65  r values) as the
b340: 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20   .**   original 
b350: 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65  row values store
b360: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
b370: 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  et. If it does, 
b380: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 0a  and the values .
b390: 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20 61  **   stored in a
b3a0: 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b  ll non-primary k
b3b0: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f 20  ey columns also 
b3c0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 73  match the values
b3d0: 20 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a 20 20   stored in .**  
b3e0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74   the changeset t
b3f0: 68 65 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65  he row is delete
b400: 64 20 66 72 6f 6d 20 74 68 65 20 74 61 72 67 65  d from the targe
b410: 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  t database..**.*
b420: 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77 69 74  *   If a row wit
b430: 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d 61  h matching prima
b440: 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69 73  ry key values is
b450: 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e 65 20   found, but one 
b460: 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20 20 20  or more of.**   
b470: 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  the non-primary 
b480: 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74 61  key fields conta
b490: 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66 66  ins a value diff
b4a0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
b4b0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 72 6f 77  riginal.**   row
b4c0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
b4d0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
b4e0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  the conflict-han
b4f0: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  dler function is
b500: 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69  .**   invoked wi
b510: 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  th [SQLITE_CHANG
b520: 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68  ESET_DATA] as th
b530: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b540: 74 2e 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 64  t. If the.**   d
b550: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 68 61  atabase table ha
b560: 73 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 74  s more columns t
b570: 68 61 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64  han are recorded
b580: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
b590: 74 2c 0a 2a 2a 20 20 20 6f 6e 6c 79 20 74 68 65  t,.**   only the
b5a0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
b5b0: 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79   non-primary key
b5c0: 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6d 70   fields are comp
b5d0: 61 72 65 64 20 61 67 61 69 6e 73 74 0a 2a 2a 20  ared against.** 
b5e0: 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61    the current da
b5f0: 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 73 20  tabase contents 
b600: 2d 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 64  - any trailing d
b610: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 63 6f  atabase table co
b620: 6c 75 6d 6e 73 0a 2a 2a 20 20 20 61 72 65 20 69  lumns.**   are i
b630: 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  gnored..**.**   
b640: 49 66 20 6e 6f 20 72 6f 77 20 77 69 74 68 20 6d  If no row with m
b650: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
b660: 6b 65 79 20 76 61 6c 75 65 73 20 69 73 20 66 6f  key values is fo
b670: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
b680: 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65 20 63 6f  ase,.**   the co
b690: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
b6a0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
b6b0: 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f  ed with [SQLITE_
b6c0: 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55  CHANGESET_NOTFOU
b6d0: 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20  ND].**   passed 
b6e0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
b6f0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  gument..**.**   
b700: 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 6f 70  If the DELETE op
b710: 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65 6d  eration is attem
b720: 70 74 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65  pted, but SQLite
b730: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b740: 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 20 20  CONSTRAINT.**   
b750: 28 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20  (which can only 
b760: 68 61 70 70 65 6e 20 69 66 20 61 20 66 6f 72 65  happen if a fore
b770: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
b780: 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 29 2c  nt is violated),
b790: 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69   the.**   confli
b7a0: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
b7b0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
b7c0: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
b7d0: 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54  GESET_CONSTRAINT
b7e0: 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73  ].**   passed as
b7f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b800: 6d 65 6e 74 2e 20 54 68 69 73 20 69 6e 63 6c 75  ment. This inclu
b810: 64 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65  des the case whe
b820: 72 65 20 74 68 65 20 44 45 4c 45 54 45 0a 2a 2a  re the DELETE.**
b830: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20     operation is 
b840: 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75 73  attempted becaus
b850: 65 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  e an earlier cal
b860: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  l to the conflic
b870: 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66  t handler.**   f
b880: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
b890: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
b8a0: 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a  ET_REPLACE]..**.
b8b0: 2a 2a 20 3c 64 74 3e 49 4e 53 45 52 54 20 43 68  ** <dt>INSERT Ch
b8c0: 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46  anges<dd>.**   F
b8d0: 6f 72 20 65 61 63 68 20 49 4e 53 45 52 54 20 63  or each INSERT c
b8e0: 68 61 6e 67 65 2c 20 61 6e 20 61 74 74 65 6d 70  hange, an attemp
b8f0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e 73  t is made to ins
b900: 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
b910: 69 6e 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64 61  into.**   the da
b920: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 63  tabase. If the c
b930: 68 61 6e 67 65 73 65 74 20 72 6f 77 20 63 6f 6e  hangeset row con
b940: 74 61 69 6e 73 20 66 65 77 65 72 20 66 69 65 6c  tains fewer fiel
b950: 64 73 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 20  ds than the.**  
b960: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
b970: 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 66 69   the trailing fi
b980: 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
b990: 65 64 20 77 69 74 68 20 74 68 65 69 72 20 64 65  ed with their de
b9a0: 66 61 75 6c 74 0a 2a 2a 20 20 20 76 61 6c 75 65  fault.**   value
b9b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  s..**.**   If th
b9c0: 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6e 73  e attempt to ins
b9d0: 65 72 74 20 74 68 65 20 72 6f 77 20 66 61 69 6c  ert the row fail
b9e0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 64 61  s because the da
b9f0: 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 20 0a  tabase already .
ba00: 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20  **   contains a 
ba10: 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61 6d  row with the sam
ba20: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  e primary key va
ba30: 6c 75 65 73 2c 20 74 68 65 20 63 6f 6e 66 6c 69  lues, the confli
ba40: 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  ct handler.**   
ba50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
ba60: 6b 65 64 20 77 69 74 68 20 74 68 65 20 73 65 63  ked with the sec
ba70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 65 74  ond argument set
ba80: 20 74 6f 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54   to .**   [SQLIT
ba90: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
baa0: 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  LICT]..**.**   I
bab0: 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
bac0: 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f 77 20   insert the row 
bad0: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
bae0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 73   some other cons
baf0: 74 72 61 69 6e 74 0a 2a 2a 20 20 20 76 69 6f 6c  traint.**   viol
bb00: 61 74 69 6f 6e 20 28 65 2e 67 2e 20 4e 4f 54 20  ation (e.g. NOT 
bb10: 4e 55 4c 4c 20 6f 72 20 55 4e 49 51 55 45 29 2c  NULL or UNIQUE),
bb20: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   the conflict ha
bb30: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69  ndler function i
bb40: 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20  s .**   invoked 
bb50: 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64 20  with the second 
bb60: 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74 6f 20  argument set to 
bb70: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
bb80: 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 2e 0a 2a  T_CONSTRAINT]..*
bb90: 2a 20 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65  *   This include
bba0: 73 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  s the case where
bbb0: 20 74 68 65 20 49 4e 53 45 52 54 20 6f 70 65 72   the INSERT oper
bbc0: 61 74 69 6f 6e 20 69 73 20 72 65 2d 61 74 74 65  ation is re-atte
bbd0: 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 0a 2a  mpted because .*
bbe0: 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72 20 63  *   an earlier c
bbf0: 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c  all to the confl
bc00: 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  ict handler func
bc10: 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 0a 2a  tion returned .*
bc20: 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  *   [SQLITE_CHAN
bc30: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a  GESET_REPLACE]..
bc40: 2a 2a 0a 2a 2a 20 3c 64 74 3e 55 50 44 41 54 45  **.** <dt>UPDATE
bc50: 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20   Changes<dd>.** 
bc60: 20 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54    For each UPDAT
bc70: 45 20 63 68 61 6e 67 65 2c 20 74 68 69 73 20 66  E change, this f
bc80: 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
bc90: 66 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  f the target dat
bca0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f 6e 74  abase .**   cont
bcb0: 61 69 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20  ains a row with 
bcc0: 74 68 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79  the same primary
bcd0: 20 6b 65 79 20 76 61 6c 75 65 20 28 6f 72 20 76   key value (or v
bce0: 61 6c 75 65 73 29 20 61 73 20 74 68 65 20 0a 2a  alues) as the .*
bcf0: 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77  *   original row
bd00: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
bd10: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
bd20: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 61 6e 64   If it does, and
bd30: 20 74 68 65 20 76 61 6c 75 65 73 20 0a 2a 2a 20   the values .** 
bd40: 20 20 73 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20    stored in all 
bd50: 6d 6f 64 69 66 69 65 64 20 6e 6f 6e 2d 70 72 69  modified non-pri
bd60: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
bd70: 20 61 6c 73 6f 20 6d 61 74 63 68 20 74 68 65 20   also match the 
bd80: 76 61 6c 75 65 73 0a 2a 2a 20 20 20 73 74 6f 72  values.**   stor
bd90: 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ed in the change
bda0: 73 65 74 20 74 68 65 20 72 6f 77 20 69 73 20 75  set the row is u
bdb0: 70 64 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  pdated within th
bdc0: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
bdd0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20  e..**.**   If a 
bde0: 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e  row with matchin
bdf0: 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  g primary key va
be00: 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 2c 20 62  lues is found, b
be10: 75 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ut one or more o
be20: 66 0a 2a 2a 20 20 20 74 68 65 20 6d 6f 64 69 66  f.**   the modif
be30: 69 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  ied non-primary 
be40: 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74 61  key fields conta
be50: 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66 66  ins a value diff
be60: 65 72 65 6e 74 20 66 72 6f 6d 20 61 6e 0a 2a 2a  erent from an.**
be70: 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20     original row 
be80: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
be90: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 74  the changeset, t
bea0: 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64  he conflict-hand
beb0: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ler function.** 
bec0: 20 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74    is invoked wit
bed0: 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  h [SQLITE_CHANGE
bee0: 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68 65  SET_DATA] as the
bef0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
bf00: 2e 20 53 69 6e 63 65 0a 2a 2a 20 20 20 55 50 44  . Since.**   UPD
bf10: 41 54 45 20 63 68 61 6e 67 65 73 20 6f 6e 6c 79  ATE changes only
bf20: 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73 20   contain values 
bf30: 66 6f 72 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  for non-primary 
bf40: 6b 65 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  key fields that 
bf50: 61 72 65 0a 2a 2a 20 20 20 74 6f 20 62 65 20 6d  are.**   to be m
bf60: 6f 64 69 66 69 65 64 2c 20 6f 6e 6c 79 20 74 68  odified, only th
bf70: 6f 73 65 20 66 69 65 6c 64 73 20 6e 65 65 64 20  ose fields need 
bf80: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6f 72 69  to match the ori
bf90: 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 74 6f 0a  ginal values to.
bfa0: 2a 2a 20 20 20 61 76 6f 69 64 20 74 68 65 20 53  **   avoid the S
bfb0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
bfc0: 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 2d 68 61  DATA conflict-ha
bfd0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a  ndler callback..
bfe0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e 6f 20 72 6f  **.**   If no ro
bff0: 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  w with matching 
c000: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
c010: 65 73 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  es is found in t
c020: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
c030: 20 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68    the conflict-h
c040: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
c050: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
c060: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
c070: 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a 2a 2a 20 20  T_NOTFOUND].**  
c080: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
c090: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
c0a0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 55  **.**   If the U
c0b0: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  PDATE operation 
c0c0: 69 73 20 61 74 74 65 6d 70 74 65 64 2c 20 62 75  is attempted, bu
c0d0: 74 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 73  t SQLite returns
c0e0: 20 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 43 4f   .**   SQLITE_CO
c0f0: 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 20 63 6f  NSTRAINT, the co
c100: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
c110: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
c120: 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 5b 53  ed with .**   [S
c130: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
c140: 43 4f 4e 53 54 52 41 49 4e 54 5d 20 70 61 73 73  CONSTRAINT] pass
c150: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
c160: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20   argument..**   
c170: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68  This includes th
c180: 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  e case where the
c190: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
c1a0: 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  n is attempted a
c1b0: 66 74 65 72 20 0a 2a 2a 20 20 20 61 6e 20 65 61  fter .**   an ea
c1c0: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 74 68  rlier call to th
c1d0: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
c1e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er function retu
c1f0: 72 6e 65 64 0a 2a 2a 20 20 20 5b 53 51 4c 49 54  rned.**   [SQLIT
c200: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
c210: 41 43 45 5d 2e 20 20 0a 2a 2a 20 3c 2f 64 6c 3e  ACE].  .** </dl>
c220: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 73 61 66  .**.** It is saf
c230: 65 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  e to execute SQL
c240: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e 63   statements, inc
c250: 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61  luding those tha
c260: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a  t write to the.*
c270: 2a 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  * table that the
c280: 20 63 61 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65   callback relate
c290: 64 20 74 6f 2c 20 66 72 6f 6d 20 77 69 74 68 69  d to, from withi
c2a0: 6e 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 20  n the xConflict 
c2b0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  callback..** Thi
c2c0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
c2d0: 20 66 75 72 74 68 65 72 20 63 75 73 74 6f 6d 69   further customi
c2e0: 7a 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  ze the applicati
c2f0: 6f 6e 73 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20  ons conflict.** 
c300: 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74  resolution strat
c310: 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  egy..**.** All c
c320: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
c330: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  his function are
c340: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 61 20 73   enclosed in a s
c350: 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
c360: 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  tion..** If any 
c370: 6f 74 68 65 72 20 65 72 72 6f 72 20 28 61 73 69  other error (asi
c380: 64 65 20 66 72 6f 6d 20 61 20 63 6f 6e 73 74 72  de from a constr
c390: 61 69 6e 74 20 66 61 69 6c 75 72 65 20 77 68 65  aint failure whe
c3a0: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a  n attempting to.
c3b0: 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ** write to the 
c3c0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 29  target database)
c3d0: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
c3e0: 65 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  e savepoint tran
c3f0: 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 72 6f  saction is.** ro
c400: 6c 6c 65 64 20 62 61 63 6b 2c 20 72 65 73 74 6f  lled back, resto
c410: 72 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ring the target 
c420: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
c430: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2c 20  original state, 
c440: 61 6e 64 20 61 6e 20 0a 2a 2a 20 53 51 4c 69 74  and an .** SQLit
c450: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
c460: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
c470: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
c480: 70 70 6c 79 28 0a 20 20 73 71 6c 69 74 65 33 20  pply(.  sqlite3 
c490: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
c4a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79          /* Apply
c4b0: 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e   change to "main
c4c0: 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e  " db of this han
c4d0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  dle */.  int nCh
c4e0: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
c4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c500: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 69 6e   of changeset in
c510: 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69 64   bytes */.  void
c520: 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20   *pChangeset,   
c530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c540: 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20 2a 2f  hangeset blob */
c550: 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72 29  .  int(*xFilter)
c560: 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78  (.    void *pCtx
c570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c580: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73      /* Copy of s
c590: 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70  ixth arg to _app
c5a0: 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ly() */.    cons
c5b0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20  t char *zTab    
c5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
c5d0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a  le name */.  ),.
c5e0: 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74    int(*xConflict
c5f0: 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
c600: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c610: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
c620: 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
c630: 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  ply() */.    int
c640: 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20   eConflict,     
c650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41             /* DA
c660: 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e  TA, MISSING, CON
c670: 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e  FLICT, CONSTRAIN
c680: 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  T */.    sqlite3
c690: 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
c6a0: 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  *p     /* Handle
c6b0: 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e   describing chan
c6c0: 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20  ge and conflict 
c6d0: 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a  */.  ),.  void *
c6e0: 70 43 74 78 20 20 20 20 20 20 20 20 20 20 20 20  pCtx            
c6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c700: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
c710: 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20  ed to xConflict 
c720: 2a 2f 0a 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 41  */.);../* .** CA
c730: 50 49 33 52 45 46 3a 20 43 6f 6e 73 74 61 6e 74  PI3REF: Constant
c740: 73 20 50 61 73 73 65 64 20 54 6f 20 54 68 65 20  s Passed To The 
c750: 43 6f 6e 66 6c 69 63 74 20 48 61 6e 64 6c 65 72  Conflict Handler
c760: 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68  .**.** Values th
c770: 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
c780: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
c790: 72 67 75 6d 65 6e 74 20 74 6f 20 61 20 63 6f 6e  rgument to a con
c7a0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 2e 0a 2a  flict-handler..*
c7b0: 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74  *.** <dl>.** <dt
c7c0: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
c7d0: 54 5f 44 41 54 41 3c 64 64 3e 0a 2a 2a 20 20 20  T_DATA<dd>.**   
c7e0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  The conflict han
c7f0: 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20  dler is invoked 
c800: 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f 44  with CHANGESET_D
c810: 41 54 41 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ATA as the secon
c820: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 20 20  d argument.**   
c830: 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
c840: 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  a DELETE or UPDA
c850: 54 45 20 63 68 61 6e 67 65 20 69 66 20 61 20 72  TE change if a r
c860: 6f 77 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ow with the requ
c870: 69 72 65 64 0a 2a 2a 20 20 20 50 52 49 4d 41 52  ired.**   PRIMAR
c880: 59 20 4b 45 59 20 66 69 65 6c 64 73 20 69 73 20  Y KEY fields is 
c890: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
c8a0: 61 74 61 62 61 73 65 2c 20 62 75 74 20 6f 6e 65  atabase, but one
c8b0: 20 6f 72 20 6d 6f 72 65 20 6f 74 68 65 72 20 0a   or more other .
c8c0: 2a 2a 20 20 20 28 6e 6f 6e 20 70 72 69 6d 61 72  **   (non primar
c8d0: 79 2d 6b 65 79 29 20 66 69 65 6c 64 73 20 6d 6f  y-key) fields mo
c8e0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
c8f0: 64 61 74 65 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  date do not cont
c900: 61 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 65 78  ain the .**   ex
c910: 70 65 63 74 65 64 20 22 62 65 66 6f 72 65 22 20  pected "before" 
c920: 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20  values..** .**  
c930: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67   The conflicting
c940: 20 72 6f 77 2c 20 69 6e 20 74 68 69 73 20 63 61   row, in this ca
c950: 73 65 2c 20 69 73 20 74 68 65 20 64 61 74 61 62  se, is the datab
c960: 61 73 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  ase row with the
c970: 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 20 20 70   matching.**   p
c980: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 20 0a  rimary key..** .
c990: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
c9a0: 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44  ANGESET_NOTFOUND
c9b0: 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 65 20 63 6f  <dd>.**   The co
c9c0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69  nflict handler i
c9d0: 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43  s invoked with C
c9e0: 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e  HANGESET_NOTFOUN
c9f0: 44 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  D as the second.
ca00: 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 77 68  **   argument wh
ca10: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
ca20: 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
ca30: 20 63 68 61 6e 67 65 20 69 66 20 61 20 72 6f 77   change if a row
ca40: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20 20 72   with the.**   r
ca50: 65 71 75 69 72 65 64 20 50 52 49 4d 41 52 59 20  equired PRIMARY 
ca60: 4b 45 59 20 66 69 65 6c 64 73 20 69 73 20 6e 6f  KEY fields is no
ca70: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  t present in the
ca80: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
ca90: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
caa0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20  conflicting row 
cab0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 54 68  in this case. Th
cac0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 69 6e 76  e results of inv
cad0: 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 73  oking the.**   s
cae0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
caf0: 63 6f 6e 66 6c 69 63 74 28 29 20 41 50 49 20 61  conflict() API a
cb00: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  re undefined..**
cb10: 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f   .** <dt>SQLITE_
cb20: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
cb30: 43 54 3c 64 64 3e 0a 2a 2a 20 20 20 43 48 41 4e  CT<dd>.**   CHAN
cb40: 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 69  GESET_CONFLICT i
cb50: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
cb60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
cb70: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 0a  to the conflict.
cb80: 2a 2a 20 20 20 68 61 6e 64 6c 65 72 20 77 68 69  **   handler whi
cb90: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  le processing an
cba0: 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 69   INSERT change i
cbb0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
cbc0: 77 6f 75 6c 64 20 72 65 73 75 6c 74 20 0a 2a 2a  would result .**
cbd0: 20 20 20 69 6e 20 64 75 70 6c 69 63 61 74 65 20     in duplicate 
cbe0: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
cbf0: 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65  es..** .**   The
cc00: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
cc10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 73   in this case is
cc20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f   the database ro
cc30: 77 20 77 69 74 68 20 74 68 65 20 6d 61 74 63 68  w with the match
cc40: 69 6e 67 0a 2a 2a 20 20 20 70 72 69 6d 61 72 79  ing.**   primary
cc50: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e   key..**.** <dt>
cc60: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
cc70: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 3c 64 64 3e  _FOREIGN_KEY<dd>
cc80: 0a 2a 2a 20 20 20 49 66 20 66 6f 72 65 69 67 6e  .**   If foreign
cc90: 20 6b 65 79 20 68 61 6e 64 6c 69 6e 67 20 69 73   key handling is
cca0: 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64 20 61 70   enabled, and ap
ccb0: 70 6c 79 69 6e 67 20 61 20 63 68 61 6e 67 65 73  plying a changes
ccc0: 65 74 20 6c 65 61 76 65 73 20 74 68 65 0a 2a 2a  et leaves the.**
ccd0: 20 20 20 64 61 74 61 62 61 73 65 20 69 6e 20 61     database in a
cce0: 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 69 6e   state containin
ccf0: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  g foreign key vi
cd00: 6f 6c 61 74 69 6f 6e 73 2c 20 74 68 65 20 63 6f  olations, the co
cd10: 6e 66 6c 69 63 74 20 0a 2a 2a 20 20 20 68 61 6e  nflict .**   han
cd20: 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20  dler is invoked 
cd30: 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f 46  with CHANGESET_F
cd40: 4f 52 45 49 47 4e 5f 4b 45 59 20 61 73 20 74 68  OREIGN_KEY as th
cd50: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
cd60: 74 0a 2a 2a 20 20 20 65 78 61 63 74 6c 79 20 6f  t.**   exactly o
cd70: 6e 63 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  nce before the c
cd80: 68 61 6e 67 65 73 65 74 20 69 73 20 63 6f 6d 6d  hangeset is comm
cd90: 69 74 74 65 64 2e 20 49 66 20 74 68 65 20 63 6f  itted. If the co
cda0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a 2a  nflict handler.*
cdb0: 2a 20 20 20 72 65 74 75 72 6e 73 20 43 48 41 4e  *   returns CHAN
cdc0: 47 45 53 45 54 5f 4f 4d 49 54 2c 20 74 68 65 20  GESET_OMIT, the 
cdd0: 63 68 61 6e 67 65 73 2c 20 69 6e 63 6c 75 64 69  changes, includi
cde0: 6e 67 20 74 68 6f 73 65 20 74 68 61 74 20 63 61  ng those that ca
cdf0: 75 73 65 64 20 74 68 65 0a 2a 2a 20 20 20 66 6f  used the.**   fo
ce00: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
ce10: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2c 20  aint violation, 
ce20: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 2e 20 4f  are committed. O
ce30: 72 2c 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  r, if it returns
ce40: 0a 2a 2a 20 20 20 43 48 41 4e 47 45 53 45 54 5f  .**   CHANGESET_
ce50: 41 42 4f 52 54 2c 20 74 68 65 20 63 68 61 6e 67  ABORT, the chang
ce60: 65 73 65 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  eset is rolled b
ce70: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 20  ack..**.**   No 
ce80: 63 75 72 72 65 6e 74 20 6f 72 20 63 6f 6e 66 6c  current or confl
ce90: 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 66 6f 72  icting row infor
cea0: 6d 61 74 69 6f 6e 20 69 73 20 70 72 6f 76 69 64  mation is provid
ceb0: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 66 75 6e  ed. The only fun
cec0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 74 20 69 73  ction.**   it is
ced0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 61 6c   possible to cal
cee0: 6c 20 6f 6e 20 74 68 65 20 73 75 70 70 6c 69 65  l on the supplie
cef0: 64 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  d sqlite3_change
cf00: 73 65 74 5f 69 74 65 72 20 68 61 6e 64 6c 65 0a  set_iter handle.
cf10: 2a 2a 20 20 20 69 73 20 73 71 6c 69 74 65 33 63  **   is sqlite3c
cf20: 68 61 6e 67 65 73 65 74 5f 66 6b 5f 63 6f 6e 66  hangeset_fk_conf
cf30: 6c 69 63 74 73 28 29 2e 0a 2a 2a 20 0a 2a 2a 20  licts()..** .** 
cf40: 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47  <dt>SQLITE_CHANG
cf50: 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 3c  ESET_CONSTRAINT<
cf60: 64 64 3e 0a 2a 2a 20 20 20 49 66 20 61 6e 79 20  dd>.**   If any 
cf70: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
cf80: 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 63 63 75 72   violation occur
cf90: 73 20 77 68 69 6c 65 20 61 70 70 6c 79 69 6e 67  s while applying
cfa0: 20 61 20 63 68 61 6e 67 65 20 28 69 2e 65 2e 20   a change (i.e. 
cfb0: 0a 2a 2a 20 20 20 61 20 55 4e 49 51 55 45 2c 20  .**   a UNIQUE, 
cfc0: 43 48 45 43 4b 20 6f 72 20 4e 4f 54 20 4e 55 4c  CHECK or NOT NUL
cfd0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 29 2c 20 74  L constraint), t
cfe0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
cff0: 6c 65 72 20 69 73 20 0a 2a 2a 20 20 20 69 6e 76  ler is .**   inv
d000: 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47 45  oked with CHANGE
d010: 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  SET_CONSTRAINT a
d020: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
d030: 75 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  ument..** .**   
d040: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  There is no conf
d050: 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20 74  licting row in t
d060: 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 72 65  his case. The re
d070: 73 75 6c 74 73 20 6f 66 20 69 6e 76 6f 6b 69 6e  sults of invokin
d080: 67 20 74 68 65 0a 2a 2a 20 20 20 73 71 6c 69 74  g the.**   sqlit
d090: 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66  e3changeset_conf
d0a0: 6c 69 63 74 28 29 20 41 50 49 20 61 72 65 20 75  lict() API are u
d0b0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  ndefined..**.** 
d0c0: 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65  </dl>.*/.#define
d0d0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
d0e0: 54 5f 44 41 54 41 20 20 20 20 20 20 20 20 31 0a  T_DATA        1.
d0f0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43  #define SQLITE_C
d100: 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e  HANGESET_NOTFOUN
d110: 44 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 53  D    2.#define S
d120: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
d130: 43 4f 4e 46 4c 49 43 54 20 20 20 20 33 0a 23 64  CONFLICT    3.#d
d140: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
d150: 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e  NGESET_CONSTRAIN
d160: 54 20 20 34 0a 23 64 65 66 69 6e 65 20 53 51 4c  T  4.#define SQL
d170: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46 4f  ITE_CHANGESET_FO
d180: 52 45 49 47 4e 5f 4b 45 59 20 35 0a 0a 2f 2a 20  REIGN_KEY 5../* 
d190: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f  .** CAPI3REF: Co
d1a0: 6e 73 74 61 6e 74 73 20 52 65 74 75 72 6e 65 64  nstants Returned
d1b0: 20 42 79 20 54 68 65 20 43 6f 6e 66 6c 69 63 74   By The Conflict
d1c0: 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 41   Handler.**.** A
d1d0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
d1e0: 72 20 63 61 6c 6c 62 61 63 6b 20 6d 75 73 74 20  r callback must 
d1f0: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  return one of th
d200: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
d210: 65 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  e values..**.** 
d220: 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  <dl>.** <dt>SQLI
d230: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
d240: 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 61 20  T<dd>.**   If a 
d250: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
d260: 20 72 65 74 75 72 6e 73 20 74 68 69 73 20 76 61   returns this va
d270: 6c 75 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 61  lue no special a
d280: 63 74 69 6f 6e 20 69 73 20 74 61 6b 65 6e 2e 20  ction is taken. 
d290: 54 68 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 20  The.**   change 
d2a0: 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65 20  that caused the 
d2b0: 63 6f 6e 66 6c 69 63 74 20 69 73 20 6e 6f 74 20  conflict is not 
d2c0: 61 70 70 6c 69 65 64 2e 20 54 68 65 20 73 65 73  applied. The ses
d2d0: 73 69 6f 6e 20 6d 6f 64 75 6c 65 20 0a 2a 2a 20  sion module .** 
d2e0: 20 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 74    continues to t
d2f0: 68 65 20 6e 65 78 74 20 63 68 61 6e 67 65 20 69  he next change i
d300: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
d310: 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54  .**.** <dt>SQLIT
d320: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
d330: 41 43 45 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 69  ACE<dd>.**   Thi
d340: 73 20 76 61 6c 75 65 20 6d 61 79 20 6f 6e 6c 79  s value may only
d350: 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 66 20   be returned if 
d360: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d370: 65 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c  ent to the confl
d380: 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72  ict.**   handler
d390: 20 77 61 73 20 53 51 4c 49 54 45 5f 43 48 41 4e   was SQLITE_CHAN
d3a0: 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 53 51  GESET_DATA or SQ
d3b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43  LITE_CHANGESET_C
d3c0: 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68 69 73  ONFLICT. If this
d3d0: 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 74 68 65  .**   is not the
d3e0: 20 63 61 73 65 2c 20 61 6e 79 20 63 68 61 6e 67   case, any chang
d3f0: 65 73 20 61 70 70 6c 69 65 64 20 73 6f 20 66 61  es applied so fa
d400: 72 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  r are rolled bac
d410: 6b 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 20 20  k and the .**   
d420: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63  call to sqlite3c
d430: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
d440: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
d450: 4d 49 53 55 53 45 2e 0a 2a 2a 0a 2a 2a 20 20 20  MISUSE..**.**   
d460: 49 66 20 43 48 41 4e 47 45 53 45 54 5f 52 45 50  If CHANGESET_REP
d470: 4c 41 43 45 20 69 73 20 72 65 74 75 72 6e 65 64  LACE is returned
d480: 20 62 79 20 61 6e 20 53 51 4c 49 54 45 5f 43 48   by an SQLITE_CH
d490: 41 4e 47 45 53 45 54 5f 44 41 54 41 20 63 6f 6e  ANGESET_DATA con
d4a0: 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c  flict.**   handl
d4b0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  er, then the con
d4c0: 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 73 20  flicting row is 
d4d0: 65 69 74 68 65 72 20 75 70 64 61 74 65 64 20 6f  either updated o
d4e0: 72 20 64 65 6c 65 74 65 64 2c 20 64 65 70 65 6e  r deleted, depen
d4f0: 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65  ding.**   on the
d500: 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65 2e   type of change.
d510: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 43 48 41 4e  .**.**   If CHAN
d520: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 69 73  GESET_REPLACE is
d530: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
d540: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
d550: 5f 43 4f 4e 46 4c 49 43 54 20 63 6f 6e 66 6c 69  _CONFLICT confli
d560: 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72 2c  ct.**   handler,
d570: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 66 6c 69   then the confli
d580: 63 74 69 6e 67 20 72 6f 77 20 69 73 20 72 65 6d  cting row is rem
d590: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
d5a0: 74 61 62 61 73 65 20 61 6e 64 20 61 0a 2a 2a 20  tabase and a.** 
d5b0: 20 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70 74    second attempt
d5c0: 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 68   to apply the ch
d5d0: 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 20 49 66  ange is made. If
d5e0: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 61 74 74   this second att
d5f0: 65 6d 70 74 20 66 61 69 6c 73 2c 0a 2a 2a 20 20  empt fails,.**  
d600: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 6f   the original ro
d610: 77 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  w is restored to
d620: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
d630: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
d640: 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54  .**.** <dt>SQLIT
d650: 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52  E_CHANGESET_ABOR
d660: 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 74 68  T<dd>.**   If th
d670: 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  is value is retu
d680: 72 6e 65 64 2c 20 61 6e 79 20 63 68 61 6e 67 65  rned, any change
d690: 73 20 61 70 70 6c 69 65 64 20 73 6f 20 66 61 72  s applied so far
d6a0: 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
d6b0: 20 0a 2a 2a 20 20 20 61 6e 64 20 74 68 65 20 63   .**   and the c
d6c0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68  all to sqlite3ch
d6d0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
d6e0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 41  returns SQLITE_A
d6f0: 42 4f 52 54 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a  BORT..** </dl>.*
d700: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
d710: 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 20  _CHANGESET_OMIT 
d720: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
d730: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
d740: 5f 52 45 50 4c 41 43 45 20 20 20 20 31 0a 23 64  _REPLACE    1.#d
d750: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
d760: 4e 47 45 53 45 54 5f 41 42 4f 52 54 20 20 20 20  NGESET_ABORT    
d770: 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33    2../*.** CAPI3
d780: 52 45 46 3a 20 53 74 72 65 61 6d 69 6e 67 20 56  REF: Streaming V
d790: 65 72 73 69 6f 6e 73 20 6f 66 20 41 50 49 20 66  ersions of API f
d7a0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
d7b0: 54 68 65 20 73 69 78 20 73 74 72 65 61 6d 69 6e  The six streamin
d7c0: 67 20 41 50 49 20 78 78 78 5f 73 74 72 6d 28 29  g API xxx_strm()
d7d0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 65 72 76 65   functions serve
d7e0: 20 73 69 6d 69 6c 61 72 20 70 75 72 70 6f 73 65   similar purpose
d7f0: 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s to the .** cor
d800: 72 65 73 70 6f 6e 64 69 6e 67 20 6e 6f 6e 2d 73  responding non-s
d810: 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e  treaming API fun
d820: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 3c 74  ctions:.**.** <t
d830: 61 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73 74  able border=1 st
d840: 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74  yle="margin-left
d850: 3a 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67 68  :8ex;margin-righ
d860: 74 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74 72  t:8ex">.**   <tr
d870: 3e 3c 74 68 3e 53 74 72 65 61 6d 69 6e 67 20 66  ><th>Streaming f
d880: 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e 6f 6e 2d 73  unction<th>Non-s
d890: 74 72 65 61 6d 69 6e 67 20 65 71 75 69 76 61 6c  treaming equival
d8a0: 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20 20 20 3c 74  ent</th>.**   <t
d8b0: 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61  r><td>sqlite3cha
d8c0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73 74 72  ngeset_apply_str
d8d0: 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61  m<td>[sqlite3cha
d8e0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5d 20 0a 2a  ngeset_apply] .*
d8f0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69  *   <tr><td>sqli
d900: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
d910: 63 61 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c  cat_strm<td>[sql
d920: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
d930: 6e 63 61 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e  ncat] .**   <tr>
d940: 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61 6e 67  <td>sqlite3chang
d950: 65 73 65 74 5f 69 6e 76 65 72 74 5f 73 74 72 6d  eset_invert_strm
d960: 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e  <td>[sqlite3chan
d970: 67 65 73 65 74 5f 69 6e 76 65 72 74 5d 20 0a 2a  geset_invert] .*
d980: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69  *   <tr><td>sqli
d990: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
d9a0: 72 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69  rt_strm<td>[sqli
d9b0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
d9c0: 72 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  rt] .**   <tr><t
d9d0: 64 3e 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  d>sqlite3session
d9e0: 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72 6d 3c  _changeset_strm<
d9f0: 74 64 3e 5b 73 71 6c 69 74 65 33 73 65 73 73 69  td>[sqlite3sessi
da00: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5d 20 0a 2a  on_changeset] .*
da10: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69  *   <tr><td>sqli
da20: 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68  te3session_patch
da30: 73 65 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c  set_strm<td>[sql
da40: 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63  ite3session_patc
da50: 68 73 65 74 5d 20 0a 2a 2a 20 3c 2f 74 61 62 6c  hset] .** </tabl
da60: 65 3e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 73 74 72  e>.**.** Non-str
da70: 65 61 6d 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  eaming functions
da80: 20 74 68 61 74 20 61 63 63 65 70 74 20 63 68 61   that accept cha
da90: 6e 67 65 73 65 74 73 20 28 6f 72 20 70 61 74 63  ngesets (or patc
daa0: 68 73 65 74 73 29 20 61 73 20 69 6e 70 75 74 0a  hsets) as input.
dab0: 2a 2a 20 72 65 71 75 69 72 65 20 74 68 61 74 20  ** require that 
dac0: 74 68 65 20 65 6e 74 69 72 65 20 63 68 61 6e 67  the entire chang
dad0: 65 73 65 74 20 62 65 20 73 74 6f 72 65 64 20 69  eset be stored i
dae0: 6e 20 61 20 73 69 6e 67 6c 65 20 62 75 66 66 65  n a single buffe
daf0: 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2a  r in memory. .**
db00: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 6f 73   Similarly, thos
db10: 65 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20  e that return a 
db20: 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74  changeset or pat
db30: 63 68 73 65 74 20 64 6f 20 73 6f 20 62 79 20 72  chset do so by r
db40: 65 74 75 72 6e 69 6e 67 20 0a 2a 2a 20 61 20 70  eturning .** a p
db50: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
db60: 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 20  le large buffer 
db70: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
db80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
db90: 2e 20 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 20 74  . .** Normally t
dba0: 68 69 73 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e  his is convenien
dbb0: 74 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61  t. However, if a
dbc0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 72 75  n application ru
dbd0: 6e 6e 69 6e 67 20 69 6e 20 61 20 0a 2a 2a 20 6c  nning in a .** l
dbe0: 6f 77 2d 6d 65 6d 6f 72 79 20 65 6e 76 69 72 6f  ow-memory enviro
dbf0: 6e 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65  nment is require
dc00: 64 20 74 6f 20 68 61 6e 64 6c 65 20 76 65 72 79  d to handle very
dc10: 20 6c 61 72 67 65 20 63 68 61 6e 67 65 73 65 74   large changeset
dc20: 73 2c 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 20  s, the.** large 
dc30: 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72  contiguous memor
dc40: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 72 65  y allocations re
dc50: 71 75 69 72 65 64 20 63 61 6e 20 62 65 63 6f 6d  quired can becom
dc60: 65 20 6f 6e 65 72 6f 75 73 2e 0a 2a 2a 0a 2a 2a  e onerous..**.**
dc70: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
dc80: 69 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  id this problem,
dc90: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69   instead of a si
dca0: 6e 67 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65  ngle large buffe
dcb0: 72 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 70  r, input.** is p
dcc0: 61 73 73 65 64 20 74 6f 20 61 20 73 74 72 65 61  assed to a strea
dcd0: 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f  ming API functio
dce0: 6e 73 20 62 79 20 77 61 79 20 6f 66 20 61 20 63  ns by way of a c
dcf0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
dd00: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 73 65 73   that.** the ses
dd10: 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 76  sions module inv
dd20: 6f 6b 65 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  okes to incremen
dd30: 74 61 6c 6c 79 20 72 65 71 75 65 73 74 20 69 6e  tally request in
dd40: 70 75 74 20 64 61 74 61 20 61 73 20 69 74 20 69  put data as it i
dd50: 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 49  s.** required. I
dd60: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 61 20 70  n all cases, a p
dd70: 61 69 72 20 6f 66 20 41 50 49 20 66 75 6e 63 74  air of API funct
dd80: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 73  ion parameters s
dd90: 75 63 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 3c 70  uch as.**.**  <p
dda0: 72 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20  re>.**  &nbsp;  
ddb0: 20 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65     int nChangese
ddc0: 74 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20  t,.**  &nbsp;   
ddd0: 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73    void *pChanges
dde0: 65 74 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a  et,.**  </pre>.*
ddf0: 2a 0a 2a 2a 20 49 73 20 72 65 70 6c 61 63 65 64  *.** Is replaced
de00: 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65   by:.**.**  <pre
de10: 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  >.**  &nbsp;    
de20: 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76   int (*xInput)(v
de30: 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a  oid *pIn, void *
de40: 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61  pData, int *pnDa
de50: 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20  ta),.**  &nbsp; 
de60: 20 20 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 2a      void *pIn,.*
de70: 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20  *  </pre>.**.** 
de80: 45 61 63 68 20 74 69 6d 65 20 74 68 65 20 78 49  Each time the xI
de90: 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 69 73  nput callback is
dea0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
deb0: 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 2c  sessions module,
dec0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
ded0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 69 73  gument passed is
dee0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
def0: 75 70 70 6c 69 65 64 20 70 49 6e 20 63 6f 6e 74  upplied pIn cont
df00: 65 78 74 20 70 6f 69 6e 74 65 72 2e 20 54 68 65  ext pointer. The
df10: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
df20: 6d 65 6e 74 2c 20 70 44 61 74 61 2c 20 70 6f 69  ment, pData, poi
df30: 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
df40: 28 2a 70 6e 44 61 74 61 29 20 62 79 74 65 73 20  (*pnData) bytes 
df50: 69 6e 20 73 69 7a 65 2e 20 41 73 73 75 6d 69 6e  in size. Assumin
df60: 67 20 6e 6f 20 0a 2a 2a 20 65 72 72 6f 72 20 6f  g no .** error o
df70: 63 63 75 72 73 20 74 68 65 20 78 49 6e 70 75 74  ccurs the xInput
df80: 20 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64 20 63   method should c
df90: 6f 70 79 20 75 70 20 74 6f 20 28 2a 70 6e 44 61  opy up to (*pnDa
dfa0: 74 61 29 20 62 79 74 65 73 20 6f 66 20 64 61 74  ta) bytes of dat
dfb0: 61 20 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 62  a .** into the b
dfc0: 75 66 66 65 72 20 61 6e 64 20 73 65 74 20 28 2a  uffer and set (*
dfd0: 70 6e 44 61 74 61 29 20 74 6f 20 74 68 65 20 61  pnData) to the a
dfe0: 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
dff0: 62 79 74 65 73 20 63 6f 70 69 65 64 20 0a 2a 2a  bytes copied .**
e000: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
e010: 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
e020: 74 68 65 20 69 6e 70 75 74 20 69 73 20 63 6f 6d  the input is com
e030: 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65  pletely exhauste
e040: 64 2c 20 28 2a 70 6e 44 61 74 61 29 20 0a 2a 2a  d, (*pnData) .**
e050: 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74   should be set t
e060: 6f 20 7a 65 72 6f 20 74 6f 20 69 6e 64 69 63 61  o zero to indica
e070: 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20  te this. Or, if 
e080: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
e090: 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65   an SQLite .** e
e0a0: 72 72 6f 72 20 63 6f 64 65 20 73 68 6f 75 6c 64  rror code should
e0b0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   be returned. In
e0c0: 20 61 6c 6c 20 63 61 73 65 73 2c 20 69 66 20 61   all cases, if a
e0d0: 6e 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63  n xInput callbac
e0e0: 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 6e 20  k returns.** an 
e0f0: 65 72 72 6f 72 2c 20 61 6c 6c 20 70 72 6f 63 65  error, all proce
e100: 73 73 69 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e  ssing is abandon
e110: 65 64 20 61 6e 64 20 74 68 65 20 73 74 72 65 61  ed and the strea
e120: 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f  ming API functio
e130: 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63  n.** returns a c
e140: 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72  opy of the error
e150: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
e160: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ler..**.** In th
e170: 65 20 63 61 73 65 20 6f 66 20 73 71 6c 69 74 65  e case of sqlite
e180: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
e190: 5f 73 74 72 6d 28 29 2c 20 74 68 65 20 78 49 6e  _strm(), the xIn
e1a0: 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  put callback may
e1b0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 62   be.** invoked b
e1c0: 79 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d  y the sessions m
e1d0: 6f 64 75 6c 65 20 61 74 20 61 6e 79 20 70 6f 69  odule at any poi
e1e0: 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  nt during the li
e1f0: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  fetime of the.**
e200: 20 69 74 65 72 61 74 6f 72 2e 20 49 66 20 73 75   iterator. If su
e210: 63 68 20 61 6e 20 78 49 6e 70 75 74 20 63 61 6c  ch an xInput cal
e220: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61 6e  lback returns an
e230: 20 65 72 72 6f 72 2c 20 74 68 65 20 69 74 65 72   error, the iter
e240: 61 74 6f 72 20 65 6e 74 65 72 73 0a 2a 2a 20 61  ator enters.** a
e250: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 77  n error state, w
e260: 68 65 72 65 62 79 20 61 6c 6c 20 73 75 62 73 65  hereby all subse
e270: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 69  quent calls to i
e280: 74 65 72 61 74 6f 72 20 66 75 6e 63 74 69 6f 6e  terator function
e290: 73 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  s .** immediatel
e2a0: 79 20 66 61 69 6c 20 77 69 74 68 20 74 68 65 20  y fail with the 
e2b0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
e2c0: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  as returned by x
e2d0: 49 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d  Input..**.** Sim
e2e0: 69 6c 61 72 6c 79 2c 20 73 74 72 65 61 6d 69 6e  ilarly, streamin
e2f0: 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  g API functions 
e300: 74 68 61 74 20 72 65 74 75 72 6e 20 63 68 61 6e  that return chan
e310: 67 65 73 65 74 73 20 28 6f 72 20 70 61 74 63 68  gesets (or patch
e320: 73 65 74 73 29 0a 2a 2a 20 72 65 74 75 72 6e 20  sets).** return 
e330: 74 68 65 6d 20 69 6e 20 63 68 75 6e 6b 73 20 62  them in chunks b
e340: 79 20 77 61 79 20 6f 66 20 61 20 63 61 6c 6c 62  y way of a callb
e350: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73  ack function ins
e360: 74 65 61 64 20 6f 66 20 76 69 61 20 61 0a 2a 2a  tead of via a.**
e370: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   pointer to a si
e380: 6e 67 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65  ngle large buffe
e390: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
e3a0: 20 61 20 70 61 69 72 20 6f 66 20 70 61 72 61 6d   a pair of param
e3b0: 65 74 65 72 73 20 73 75 63 68 0a 2a 2a 20 61 73  eters such.** as
e3c0: 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a  :.**.**  <pre>.*
e3d0: 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e  *  &nbsp;     in
e3e0: 74 20 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 0a  t *pnChangeset,.
e3f0: 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76  **  &nbsp;     v
e400: 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67 65 73 65  oid **ppChangese
e410: 74 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a  t,.**  </pre>.**
e420: 0a 2a 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20  .** Is replaced 
e430: 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e  by:.**.**  <pre>
e440: 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20  .**  &nbsp;     
e450: 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76  int (*xOutput)(v
e460: 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74  oid *pOut, const
e470: 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
e480: 74 20 6e 44 61 74 61 29 2c 0a 2a 2a 20 20 26 6e  t nData),.**  &n
e490: 62 73 70 3b 20 20 20 20 20 76 6f 69 64 20 2a 70  bsp;     void *p
e4a0: 4f 75 74 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a  Out.**  </pre>.*
e4b0: 2a 0a 2a 2a 20 54 68 65 20 78 4f 75 74 70 75 74  *.** The xOutput
e4c0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
e4d0: 6f 6b 65 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  oked zero or mor
e4e0: 65 20 74 69 6d 65 73 20 74 6f 20 72 65 74 75 72  e times to retur
e4f0: 6e 20 64 61 74 61 20 74 6f 0a 2a 2a 20 74 68 65  n data to.** the
e500: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68   application. Th
e510: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
e520: 72 20 70 61 73 73 65 64 20 74 6f 20 65 61 63 68  r passed to each
e530: 20 63 61 6c 6c 20 69 73 20 61 20 63 6f 70 79 20   call is a copy 
e540: 6f 66 20 74 68 65 0a 2a 2a 20 70 4f 75 74 20 70  of the.** pOut p
e550: 6f 69 6e 74 65 72 20 73 75 70 70 6c 69 65 64 20  ointer supplied 
e560: 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
e570: 6f 6e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70  on. The second p
e580: 61 72 61 6d 65 74 65 72 2c 20 70 44 61 74 61 2c  arameter, pData,
e590: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
e5a0: 62 75 66 66 65 72 20 6e 44 61 74 61 20 62 79 74  buffer nData byt
e5b0: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
e5c0: 69 6e 69 6e 67 20 74 68 65 20 63 68 75 6e 6b 20  ining the chunk 
e5d0: 6f 66 20 6f 75 74 70 75 74 0a 2a 2a 20 64 61 74  of output.** dat
e5e0: 61 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  a being returned
e5f0: 2e 20 49 66 20 74 68 65 20 78 4f 75 74 70 75 74  . If the xOutput
e600: 20 63 61 6c 6c 62 61 63 6b 20 73 75 63 63 65 73   callback succes
e610: 73 66 75 6c 6c 79 20 70 72 6f 63 65 73 73 65 73  sfully processes
e620: 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64   the.** supplied
e630: 20 64 61 74 61 2c 20 69 74 20 73 68 6f 75 6c 64   data, it should
e640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e650: 4b 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73 75  K to indicate su
e660: 63 63 65 73 73 2e 20 4f 74 68 65 72 77 69 73 65  ccess. Otherwise
e670: 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 72  ,.** it should r
e680: 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
e690: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
e6a0: 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
e6b0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 69   processing.** i
e6c0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62  s immediately ab
e6d0: 61 6e 64 6f 6e 65 64 20 61 6e 64 20 74 68 65 20  andoned and the 
e6e0: 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75  streaming API fu
e6f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
e700: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20   copy.** of the 
e710: 78 4f 75 74 70 75 74 20 65 72 72 6f 72 20 63 6f  xOutput error co
e720: 64 65 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63  de to the applic
e730: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
e740: 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65   sessions module
e750: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 61   never invokes a
e760: 6e 20 78 4f 75 74 70 75 74 20 63 61 6c 6c 62 61  n xOutput callba
e770: 63 6b 20 77 69 74 68 20 74 68 65 20 74 68 69 72  ck with the thir
e780: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
e790: 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20 6c  set to a value l
e7a0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
e7b0: 6c 20 74 6f 20 7a 65 72 6f 2e 20 4f 74 68 65 72  l to zero. Other
e7c0: 20 74 68 61 6e 20 74 68 69 73 2c 0a 2a 2a 20 6e   than this,.** n
e7d0: 6f 20 67 75 61 72 61 6e 74 65 65 73 20 61 72 65  o guarantees are
e7e0: 20 6d 61 64 65 20 61 73 20 74 6f 20 74 68 65 20   made as to the 
e7f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 63 68 75 6e  size of the chun
e800: 6b 73 20 6f 66 20 64 61 74 61 20 72 65 74 75 72  ks of data retur
e810: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
e820: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
e830: 6c 79 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74  ly_strm(.  sqlit
e840: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
e850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
e860: 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d  ply change to "m
e870: 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20  ain" db of this 
e880: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
e890: 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a  (*xInput)(void *
e8a0: 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  pIn, void *pData
e8b0: 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20  , int *pnData), 
e8c0: 2f 2a 20 49 6e 70 75 74 20 66 75 6e 63 74 69 6f  /* Input functio
e8d0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e  n */.  void *pIn
e8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e910: 72 73 74 20 61 72 67 20 66 6f 72 20 78 49 6e 70  rst arg for xInp
e920: 75 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69  ut */.  int(*xFi
e930: 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20  lter)(.    void 
e940: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
e950: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
e960: 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f   of sixth arg to
e970: 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20   _apply() */.   
e980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
e990: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b              /
e9a0: 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
e9b0: 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e    ),.  int(*xCon
e9c0: 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64  flict)(.    void
e9d0: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
e9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
e9f0: 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74  y of sixth arg t
ea00: 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
ea10: 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c    int eConflict,
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47  /* DATA, MISSING
ea40: 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53  , CONFLICT, CONS
ea50: 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71  TRAINT */.    sq
ea60: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
ea70: 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48  iter *p     /* H
ea80: 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67  andle describing
ea90: 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66   change and conf
eaa0: 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76  lict */.  ),.  v
eab0: 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20  oid *pCtx       
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ead0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
eae0: 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66   passed to xConf
eaf0: 6c 69 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73  lict */.);.int s
eb00: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
eb10: 63 6f 6e 63 61 74 5f 73 74 72 6d 28 0a 20 20 69  concat_strm(.  i
eb20: 6e 74 20 28 2a 78 49 6e 70 75 74 41 29 28 76 6f  nt (*xInputA)(vo
eb30: 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
eb40: 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
eb50: 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 41  a),.  void *pInA
eb60: 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  ,.  int (*xInput
eb70: 42 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  B)(void *pIn, vo
eb80: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
eb90: 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20  pnData),.  void 
eba0: 2a 70 49 6e 42 2c 0a 20 20 69 6e 74 20 28 2a 78  *pInB,.  int (*x
ebb0: 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f  Output)(void *pO
ebc0: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
ebd0: 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
ebe0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a  ),.  void *pOut.
ebf0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  );.int sqlite3ch
ec00: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 73  angeset_invert_s
ec10: 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a 78 49 6e  trm(.  int (*xIn
ec20: 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20  put)(void *pIn, 
ec30: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
ec40: 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69   *pnData),.  voi
ec50: 64 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28 2a  d *pIn,.  int (*
ec60: 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70  xOutput)(void *p
ec70: 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Out, const void 
ec80: 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
ec90: 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74  a),.  void *pOut
eca0: 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .);.int sqlite3c
ecb0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73  hangeset_start_s
ecc0: 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  trm(.  sqlite3_c
ecd0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2a  hangeset_iter **
ece0: 70 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70  pp,.  int (*xInp
ecf0: 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  ut)(void *pIn, v
ed00: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
ed10: 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  *pnData),.  void
ed20: 20 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71 6c   *pIn.);.int sql
ed30: 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e  ite3session_chan
ed40: 67 65 73 65 74 5f 73 74 72 6d 28 0a 20 20 73 71  geset_strm(.  sq
ed50: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
ed60: 53 65 73 73 69 6f 6e 2c 0a 20 20 69 6e 74 20 28  Session,.  int (
ed70: 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
ed80: 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
ed90: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
eda0: 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75  ta),.  void *pOu
edb0: 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.);.int sqlite3
edc0: 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74  session_patchset
edd0: 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
ede0: 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
edf0: 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  on,.  int (*xOut
ee00: 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
ee10: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
ee20: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
ee30: 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a    void *pOut.);.
ee40: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
ee50: 65 67 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28  egroup_add_strm(
ee60: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
ee70: 6f 75 70 2a 2c 20 0a 20 20 20 20 69 6e 74 20 28  oup*, .    int (
ee80: 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70  *xInput)(void *p
ee90: 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  In, void *pData,
eea0: 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20   int *pnData),. 
eeb0: 20 20 20 76 6f 69 64 20 2a 70 49 6e 0a 29 3b 0a     void *pIn.);.
eec0: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
eed0: 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74  egroup_output_st
eee0: 72 6d 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  rm(sqlite3_chang
eef0: 65 67 72 6f 75 70 2a 2c 0a 20 20 20 20 69 6e 74  egroup*,.    int
ef00: 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64   (*xOutput)(void
ef10: 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f   *pOut, const vo
ef20: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
ef30: 44 61 74 61 29 2c 20 0a 20 20 20 20 76 6f 69 64  Data), .    void
ef40: 20 2a 70 4f 75 74 0a 29 3b 0a 0a 0a 2f 2a 0a 2a   *pOut.);.../*.*
ef50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63  * Make sure we c
ef60: 61 6e 20 63 61 6c 6c 20 74 68 69 73 20 73 74 75  an call this stu
ef70: 66 66 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f 0a  ff from C++..*/.
ef80: 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c  #ifdef __cpluspl
ef90: 75 73 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  us.}.#endif..#en
efa0: 64 69 66 20 20 2f 2a 20 21 64 65 66 69 6e 65 64  dif  /* !defined
efb0: 28 5f 5f 53 51 4c 49 54 45 53 45 53 53 49 4f 4e  (__SQLITESESSION
efc0: 5f 48 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  _H_) && defined(
efd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
efe0: 53 53 49 4f 4e 29 20 2a 2f 0a                    SSION) */.