/ Hex Artifact Content
Login

Artifact fd5d353901575b587c877b957918ff9f2d8e0ff40a96b210cf79459c0e17d3b7:


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 47 65 6e  ** CAPI3REF: Gen
3b40: 65 72 61 74 65 20 41 20 46 75 6c 6c 20 43 68 61  erate A Full Cha
3b50: 6e 67 65 73 65 74 20 46 72 6f 6d 20 41 20 53 65  ngeset From A Se
3b60: 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a 0a  ssion Object.**.
3b70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3b80: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
3b90: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
3ba0: 61 6e 67 65 73 65 74 28 29 2c 20 65 78 63 65 70  angeset(), excep
3bb0: 74 20 74 68 61 74 20 66 6f 72 0a 2a 2a 20 65 61  t that for.** ea
3bc0: 63 68 20 72 6f 77 20 61 66 66 65 63 74 65 64 20  ch row affected 
3bd0: 62 79 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  by an UPDATE sta
3be0: 74 65 6d 65 6e 74 2c 20 61 6c 6c 20 6f 6c 64 2e  tement, all old.
3bf0: 2a 20 76 61 6c 75 65 73 20 61 72 65 20 72 65 63  * values are rec
3c00: 6f 72 64 65 64 0a 2a 2a 20 61 73 20 70 61 72 74  orded.** as part
3c10: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65   of the changese
3c20: 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73  t, not just thos
3c30: 65 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 69  e modified..*/.i
3c40: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
3c50: 6e 5f 66 75 6c 6c 63 68 61 6e 67 65 73 65 74 28  n_fullchangeset(
3c60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
3c70: 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20  on *pSession,   
3c80: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62     /* Session ob
3c90: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
3ca0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
3cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3cc0: 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  : Size of buffer
3cd0: 20 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74   at *ppChangeset
3ce0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 43   */.  void **ppC
3cf0: 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20 20  hangeset        
3d00: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75        /* OUT: Bu
3d10: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3d20: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a  changeset */.);.
3d30: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
3d40: 20 4c 6f 61 64 20 54 68 65 20 44 69 66 66 65 72   Load The Differ
3d50: 65 6e 63 65 20 42 65 74 77 65 65 6e 20 54 61 62  ence Between Tab
3d60: 6c 65 73 20 49 6e 74 6f 20 41 20 53 65 73 73 69  les Into A Sessi
3d70: 6f 6e 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71  on.** METHOD: sq
3d80: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a  lite3_session.**
3d90: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
3da0: 20 61 6c 72 65 61 64 79 20 61 74 74 61 63 68 65   already attache
3db0: 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e  d to the session
3dc0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
3dd0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
3de0: 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
3df0: 6e 63 74 69 6f 6e 20 61 74 74 61 63 68 65 73 20  nction attaches 
3e00: 74 61 62 6c 65 20 7a 54 62 6c 20 69 6e 20 74 68  table zTbl in th
3e10: 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 20 61 73  e same manner as
3e20: 20 74 68 65 0a 2a 2a 20 5b 73 71 6c 69 74 65 33   the.** [sqlite3
3e30: 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
3e40: 5d 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 7a  ] function. If z
3e50: 54 62 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  Tbl does not exi
3e60: 73 74 2c 20 6f 72 20 69 66 20 69 74 0a 2a 2a 20  st, or if it.** 
3e70: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
3e80: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69  primary key, thi
3e90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
3ea0: 6e 6f 2d 6f 70 20 28 62 75 74 20 64 6f 65 73 20  no-op (but does 
3eb0: 6e 6f 74 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e  not return.** an
3ec0: 20 65 72 72 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 41   error)..**.** A
3ed0: 72 67 75 6d 65 6e 74 20 7a 46 72 6f 6d 44 62 20  rgument zFromDb 
3ee0: 6d 75 73 74 20 62 65 20 74 68 65 20 6e 61 6d 65  must be the name
3ef0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
3f00: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
3f10: 74 63 2e 29 0a 2a 2a 20 61 74 74 61 63 68 65 64  tc.).** attached
3f20: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 64 61 74   to the same dat
3f30: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 73 20  abase handle as 
3f40: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
3f50: 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ct that contains
3f60: 20 0a 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6d   .** a table com
3f70: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
3f80: 20 74 61 62 6c 65 20 61 74 74 61 63 68 65 64 20   table attached 
3f90: 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 62  to the session b
3fa0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
3fb0: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 69 73 20 63  .** A table is c
3fc0: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6d 70 61 74  onsidered compat
3fd0: 69 62 6c 65 20 69 66 20 69 74 3a 0a 2a 2a 0a 2a  ible if it:.**.*
3fe0: 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e  * <ul>.**   <li>
3ff0: 20 48 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   Has the same na
4000: 6d 65 2c 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61  me,.**   <li> Ha
4010: 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  s the same set o
4020: 66 20 63 6f 6c 75 6d 6e 73 20 64 65 63 6c 61 72  f columns declar
4030: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  ed in the same o
4040: 72 64 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c  rder, and.**   <
4050: 6c 69 3e 20 48 61 73 20 74 68 65 20 73 61 6d 65  li> Has the same
4060: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65 66   PRIMARY KEY def
4070: 69 6e 69 74 69 6f 6e 2e 0a 2a 2a 20 3c 2f 75 6c  inition..** </ul
4080: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  >.**.** If the t
4090: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 63 6f  ables are not co
40a0: 6d 70 61 74 69 62 6c 65 2c 20 53 51 4c 49 54 45  mpatible, SQLITE
40b0: 5f 53 43 48 45 4d 41 20 69 73 20 72 65 74 75 72  _SCHEMA is retur
40c0: 6e 65 64 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ned. If the tabl
40d0: 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6d 70 61 74  es.** are compat
40e0: 69 62 6c 65 20 62 75 74 20 64 6f 20 6e 6f 74 20  ible but do not 
40f0: 68 61 76 65 20 61 6e 79 20 50 52 49 4d 41 52 59  have any PRIMARY
4100: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 69 74   KEY columns, it
4110: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4120: 0a 2a 2a 20 62 75 74 20 6e 6f 20 63 68 61 6e 67  .** but no chang
4130: 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
4140: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
4150: 63 74 2e 20 41 73 20 77 69 74 68 20 6f 74 68 65  ct. As with othe
4160: 72 20 73 65 73 73 69 6f 6e 0a 2a 2a 20 41 50 49  r session.** API
4170: 73 2c 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75  s, tables withou
4180: 74 20 50 52 49 4d 41 52 59 20 4b 45 59 73 20 61  t PRIMARY KEYs a
4190: 72 65 20 73 69 6d 70 6c 79 20 69 67 6e 6f 72 65  re simply ignore
41a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
41b0: 6e 63 74 69 6f 6e 20 61 64 64 73 20 61 20 73 65  nction adds a se
41c0: 74 20 6f 66 20 63 68 61 6e 67 65 73 20 74 6f 20  t of changes to 
41d0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
41e0: 63 74 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65  ct that could be
41f0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 75 70 64 61  .** used to upda
4200: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
4210: 64 61 74 61 62 61 73 65 20 7a 46 72 6f 6d 20 28  database zFrom (
4220: 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 66  call this the "f
4230: 72 6f 6d 2d 74 61 62 6c 65 22 29 20 0a 2a 2a 20  rom-table") .** 
4240: 73 6f 20 74 68 61 74 20 69 74 73 20 63 6f 6e 74  so that its cont
4250: 65 6e 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ent is the same 
4260: 61 73 20 74 68 65 20 74 61 62 6c 65 20 61 74 74  as the table att
4270: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 65 73  ached to the ses
4280: 73 69 6f 6e 20 0a 2a 2a 20 6f 62 6a 65 63 74 20  sion .** object 
4290: 28 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22  (call this the "
42a0: 74 6f 2d 74 61 62 6c 65 22 29 2e 20 53 70 65 63  to-table"). Spec
42b0: 69 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  ifically:.**.** 
42c0: 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46  <ul>.**   <li> F
42d0: 6f 72 20 65 61 63 68 20 72 6f 77 20 28 70 72 69  or each row (pri
42e0: 6d 61 72 79 20 6b 65 79 29 20 74 68 61 74 20 65  mary key) that e
42f0: 78 69 73 74 73 20 69 6e 20 74 68 65 20 74 6f 2d  xists in the to-
4300: 74 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 69 6e  table but not in
4310: 20 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72 6f   .**     the fro
4320: 6d 2d 74 61 62 6c 65 2c 20 61 6e 20 49 4e 53 45  m-table, an INSE
4330: 52 54 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  RT record is add
4340: 65 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f  ed to the sessio
4350: 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  n object..**.** 
4360: 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20    <li> For each 
4370: 72 6f 77 20 28 70 72 69 6d 61 72 79 20 6b 65 79  row (primary key
4380: 29 20 74 68 61 74 20 65 78 69 73 74 73 20 69 6e  ) that exists in
4390: 20 74 68 65 20 74 6f 2d 74 61 62 6c 65 20 62 75   the to-table bu
43a0: 74 20 6e 6f 74 20 69 6e 20 0a 2a 2a 20 20 20 20  t not in .**    
43b0: 20 74 68 65 20 66 72 6f 6d 2d 74 61 62 6c 65 2c   the from-table,
43c0: 20 61 20 44 45 4c 45 54 45 20 72 65 63 6f 72 64   a DELETE record
43d0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
43e0: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e   session object.
43f0: 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f  .**.**   <li> Fo
4400: 72 20 65 61 63 68 20 72 6f 77 20 28 70 72 69 6d  r each row (prim
4410: 61 72 79 20 6b 65 79 29 20 74 68 61 74 20 65 78  ary key) that ex
4420: 69 73 74 73 20 69 6e 20 62 6f 74 68 20 74 61 62  ists in both tab
4430: 6c 65 73 2c 20 62 75 74 20 66 65 61 74 75 72 65  les, but feature
4440: 73 20 0a 2a 2a 20 20 20 20 20 64 69 66 66 65 72  s .**     differ
4450: 65 6e 74 20 6e 6f 6e 2d 50 4b 20 76 61 6c 75 65  ent non-PK value
4460: 73 20 69 6e 20 65 61 63 68 2c 20 61 6e 20 55 50  s in each, an UP
4470: 44 41 54 45 20 72 65 63 6f 72 64 20 69 73 20 61  DATE record is a
4480: 64 64 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  dded to the.**  
4490: 20 20 20 73 65 73 73 69 6f 6e 2e 20 20 0a 2a 2a     session.  .**
44a0: 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20   </ul>.**.** To 
44b0: 63 6c 61 72 69 66 79 2c 20 69 66 20 74 68 69 73  clarify, if this
44c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
44d0: 6c 65 64 20 61 6e 64 20 74 68 65 6e 20 61 20 63  led and then a c
44e0: 68 61 6e 67 65 73 65 74 20 63 6f 6e 73 74 72 75  hangeset constru
44f0: 63 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 5b 73  cted.** using [s
4500: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4510: 61 6e 67 65 73 65 74 28 29 5d 2c 20 74 68 65 6e  angeset()], then
4520: 20 61 66 74 65 72 20 61 70 70 6c 79 69 6e 67 20   after applying 
4530: 74 68 61 74 20 63 68 61 6e 67 65 73 65 74 20 74  that changeset t
4540: 6f 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 7a  o .** database z
4550: 46 72 6f 6d 20 74 68 65 20 63 6f 6e 74 65 6e 74  From the content
4560: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 63 6f 6d  s of the two com
4570: 70 61 74 69 62 6c 65 20 74 61 62 6c 65 73 20 77  patible tables w
4580: 6f 75 6c 64 20 62 65 20 0a 2a 2a 20 69 64 65 6e  ould be .** iden
4590: 74 69 63 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  tical..**.** It 
45a0: 61 6e 20 65 72 72 6f 72 20 69 66 20 64 61 74 61  an error if data
45b0: 62 61 73 65 20 7a 46 72 6f 6d 20 64 6f 65 73 20  base zFrom does 
45c0: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 64 6f 65  not exist or doe
45d0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68  s not contain th
45e0: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 63 6f  e.** required co
45f0: 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2e 0a  mpatible table..
4600: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  **.** If the ope
4610: 72 61 74 69 6f 6e 20 73 75 63 63 65 73 73 66 75  ration successfu
4620: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
4630: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
4640: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ise, an SQLite.*
4650: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e  * error code. In
4660: 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 61   this case, if a
4670: 72 67 75 6d 65 6e 74 20 70 7a 45 72 72 4d 73 67  rgument pzErrMsg
4680: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70   is not NULL, *p
4690: 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
46a0: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
46b0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
46c0: 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
46d0: 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
46e0: 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
46f0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
4700: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
4710: 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 69 73  ler to free this
4720: 20 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a 2a   buffer using.**
4730: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
4740: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .*/.int sqlite3s
4750: 65 73 73 69 6f 6e 5f 64 69 66 66 28 0a 20 20 73  ession_diff(.  s
4760: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
4770: 70 53 65 73 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73  pSession,.  cons
4780: 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 44 62 2c  t char *zFromDb,
4790: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
47a0: 54 62 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Tbl,.  char **pz
47b0: 45 72 72 4d 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a  ErrMsg.);.../*.*
47c0: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
47d0: 72 61 74 65 20 41 20 50 61 74 63 68 73 65 74 20  rate A Patchset 
47e0: 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20 4f  From A Session O
47f0: 62 6a 65 63 74 0a 2a 2a 20 4d 45 54 48 4f 44 3a  bject.** METHOD:
4800: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
4810: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
4820: 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e 20 61  rences between a
4830: 20 70 61 74 63 68 73 65 74 20 61 6e 64 20 61 20   patchset and a 
4840: 63 68 61 6e 67 65 73 65 74 20 61 72 65 20 74 68  changeset are th
4850: 61 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a  at:.**.** <ul>.*
4860: 2a 20 20 20 3c 6c 69 3e 20 44 45 4c 45 54 45 20  *   <li> DELETE 
4870: 72 65 63 6f 72 64 73 20 63 6f 6e 73 69 73 74 20  records consist 
4880: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
4890: 65 79 20 66 69 65 6c 64 73 20 6f 6e 6c 79 2e 20  ey fields only. 
48a0: 54 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f  The .**        o
48b0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 6f  riginal values o
48c0: 66 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  f other fields a
48d0: 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 20  re omitted..**  
48e0: 20 3c 6c 69 3e 20 54 68 65 20 6f 72 69 67 69 6e   <li> The origin
48f0: 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 61 6e 79  al values of any
4900: 20 6d 6f 64 69 66 69 65 64 20 66 69 65 6c 64 73   modified fields
4910: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f   are omitted fro
4920: 6d 20 0a 2a 2a 20 20 20 20 20 20 20 20 55 50 44  m .**        UPD
4930: 41 54 45 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 20  ATE records..** 
4940: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 70 61  </ul>.**.** A pa
4950: 74 63 68 73 65 74 20 62 6c 6f 62 20 6d 61 79 20  tchset blob may 
4960: 62 65 20 75 73 65 64 20 77 69 74 68 20 75 70 20  be used with up 
4970: 74 6f 20 64 61 74 65 20 76 65 72 73 69 6f 6e 73  to date versions
4980: 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 73 71 6c 69   of all .** sqli
4990: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78  te3changeset_xxx
49a0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 65   API functions e
49b0: 78 63 65 70 74 20 66 6f 72 20 73 71 6c 69 74 65  xcept for sqlite
49c0: 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72  3changeset_inver
49d0: 74 28 29 2c 20 0a 2a 2a 20 77 68 69 63 68 20 72  t(), .** which r
49e0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
49f0: 52 52 55 50 54 20 69 66 20 69 74 20 69 73 20 70  RRUPT if it is p
4a00: 61 73 73 65 64 20 61 20 70 61 74 63 68 73 65 74  assed a patchset
4a10: 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 0a 2a 2a 20  . Similarly,.** 
4a20: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 75 73  attempting to us
4a30: 65 20 61 20 70 61 74 63 68 73 65 74 20 62 6c 6f  e a patchset blo
4a40: 62 20 77 69 74 68 20 6f 6c 64 20 76 65 72 73 69  b with old versi
4a50: 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71  ons of the.** sq
4a60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 78  lite3changeset_x
4a70: 78 78 20 41 50 49 73 20 61 6c 73 6f 20 70 72 6f  xx APIs also pro
4a80: 76 6f 6b 65 73 20 61 6e 20 53 51 4c 49 54 45 5f  vokes an SQLITE_
4a90: 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
4aa0: 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
4ab0: 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65  e non-primary ke
4ac0: 79 20 22 6f 6c 64 2e 2a 22 20 66 69 65 6c 64 73  y "old.*" fields
4ad0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 6e 6f   are omitted, no
4ae0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e   .** SQLITE_CHAN
4af0: 47 45 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c  GESET_DATA confl
4b00: 69 63 74 73 20 63 61 6e 20 62 65 20 64 65 74 65  icts can be dete
4b10: 63 74 65 64 20 6f 72 20 72 65 70 6f 72 74 65 64  cted or reported
4b20: 20 69 66 20 61 20 70 61 74 63 68 73 65 74 0a 2a   if a patchset.*
4b30: 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  * is passed to t
4b40: 68 65 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  he sqlite3change
4b50: 73 65 74 5f 61 70 70 6c 79 28 29 20 41 50 49 2e  set_apply() API.
4b60: 20 4f 74 68 65 72 20 63 6f 6e 66 6c 69 63 74 20   Other conflict 
4b70: 74 79 70 65 73 20 77 6f 72 6b 0a 2a 2a 20 69 6e  types work.** in
4b80: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
4b90: 20 66 6f 72 20 63 68 61 6e 67 65 73 65 74 73 2e   for changesets.
4ba0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 77  .**.** Changes w
4bb0: 69 74 68 69 6e 20 61 20 70 61 74 63 68 73 65 74  ithin a patchset
4bc0: 20 61 72 65 20 6f 72 64 65 72 65 64 20 69 6e 20   are ordered in 
4bd0: 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20  the same way as 
4be0: 66 6f 72 20 63 68 61 6e 67 65 73 65 74 73 0a 2a  for changesets.*
4bf0: 2a 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  * generated by t
4c00: 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  he sqlite3sessio
4c10: 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 66 75  n_changeset() fu
4c20: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 61 6c 6c  nction (i.e. all
4c30: 20 63 68 61 6e 67 65 73 20 66 6f 72 0a 2a 2a 20   changes for.** 
4c40: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61  a single table a
4c50: 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
4c60: 68 65 72 2c 20 74 61 62 6c 65 73 20 61 70 70 65  her, tables appe
4c70: 61 72 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ar in the order 
4c80: 69 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 79  in which.** they
4c90: 20 77 65 72 65 20 61 74 74 61 63 68 65 64 20 74   were attached t
4ca0: 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  o the session ob
4cb0: 6a 65 63 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ject)..*/.int sq
4cc0: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
4cd0: 63 68 73 65 74 28 0a 20 20 73 71 6c 69 74 65 33  chset(.  sqlite3
4ce0: 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
4cf0: 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 53 65 73 73  on,      /* Sess
4d00: 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
4d10: 69 6e 74 20 2a 70 6e 50 61 74 63 68 73 65 74 2c  int *pnPatchset,
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
4d40: 62 75 66 66 65 72 20 61 74 20 2a 70 70 50 61 74  buffer at *ppPat
4d50: 63 68 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20  chset */.  void 
4d60: 2a 2a 70 70 50 61 74 63 68 73 65 74 20 20 20 20  **ppPatchset    
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4d80: 54 3a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  T: Buffer contai
4d90: 6e 69 6e 67 20 70 61 74 63 68 73 65 74 20 2a 2f  ning patchset */
4da0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  .);../*.** CAPI3
4db0: 52 45 46 3a 20 54 65 73 74 20 69 66 20 61 20 63  REF: Test if a c
4dc0: 68 61 6e 67 65 73 65 74 20 68 61 73 20 72 65 63  hangeset has rec
4dd0: 6f 72 64 65 64 20 61 6e 79 20 63 68 61 6e 67 65  orded any change
4de0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
4df0: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6e 6f 20 63  non-zero if no c
4e00: 68 61 6e 67 65 73 20 74 6f 20 61 74 74 61 63 68  hanges to attach
4e10: 65 64 20 74 61 62 6c 65 73 20 68 61 76 65 20 62  ed tables have b
4e20: 65 65 6e 20 72 65 63 6f 72 64 65 64 20 62 79 20  een recorded by 
4e30: 0a 2a 2a 20 74 68 65 20 73 65 73 73 69 6f 6e 20  .** the session 
4e40: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
4e50: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4e60: 65 6e 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ent. Otherwise, 
4e70: 69 66 20 6f 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f  if one or .** mo
4e80: 72 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  re changes have 
4e90: 62 65 65 6e 20 72 65 63 6f 72 64 65 64 2c 20 72  been recorded, r
4ea0: 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eturn zero..**.*
4eb0: 2a 20 45 76 65 6e 20 69 66 20 74 68 69 73 20 66  * Even if this f
4ec0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
4ed0: 7a 65 72 6f 2c 20 69 74 20 69 73 20 70 6f 73 73  zero, it is poss
4ee0: 69 62 6c 65 20 74 68 61 74 20 63 61 6c 6c 69 6e  ible that callin
4ef0: 67 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73  g.** [sqlite3ses
4f00: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29  sion_changeset()
4f10: 5d 20 6f 6e 20 74 68 65 20 73 65 73 73 69 6f 6e  ] on the session
4f20: 20 68 61 6e 64 6c 65 20 6d 61 79 20 73 74 69 6c   handle may stil
4f30: 6c 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 63 68  l return a.** ch
4f40: 61 6e 67 65 73 65 74 20 74 68 61 74 20 63 6f 6e  angeset that con
4f50: 74 61 69 6e 73 20 6e 6f 20 63 68 61 6e 67 65 73  tains no changes
4f60: 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
4f70: 6e 20 77 68 65 6e 20 61 20 72 6f 77 20 69 6e 20  n when a row in 
4f80: 0a 2a 2a 20 61 6e 20 61 74 74 61 63 68 65 64 20  .** an attached 
4f90: 74 61 62 6c 65 20 69 73 20 6d 6f 64 69 66 69 65  table is modifie
4fa0: 64 20 61 6e 64 20 74 68 65 6e 20 6c 61 74 65 72  d and then later
4fb0: 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
4fc0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 61 72 65 20   values .** are 
4fd0: 72 65 73 74 6f 72 65 64 2e 20 48 6f 77 65 76 65  restored. Howeve
4fe0: 72 2c 20 69 66 20 74 68 69 73 20 66 75 6e 63 74  r, if this funct
4ff0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
5000: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
5010: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74  .** guaranteed t
5020: 68 61 74 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  hat a call to sq
5030: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61  lite3session_cha
5040: 6e 67 65 73 65 74 28 29 20 77 69 6c 6c 20 72 65  ngeset() will re
5050: 74 75 72 6e 20 61 20 0a 2a 2a 20 63 68 61 6e 67  turn a .** chang
5060: 65 73 65 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  eset containing 
5070: 7a 65 72 6f 20 63 68 61 6e 67 65 73 2e 0a 2a 2f  zero changes..*/
5080: 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73  .int sqlite3sess
5090: 69 6f 6e 5f 69 73 65 6d 70 74 79 28 73 71 6c 69  ion_isempty(sqli
50a0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
50b0: 73 73 69 6f 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ssion);../*.** C
50c0: 41 50 49 33 52 45 46 3a 20 43 72 65 61 74 65 20  API3REF: Create 
50d0: 41 6e 20 49 74 65 72 61 74 6f 72 20 54 6f 20 54  An Iterator To T
50e0: 72 61 76 65 72 73 65 20 41 20 43 68 61 6e 67 65  raverse A Change
50f0: 73 65 74 20 0a 2a 2a 20 43 4f 4e 53 54 52 55 43  set .** CONSTRUC
5100: 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  TOR: sqlite3_cha
5110: 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a  ngeset_iter.**.*
5120: 2a 20 43 72 65 61 74 65 20 61 6e 20 69 74 65 72  * Create an iter
5130: 61 74 6f 72 20 75 73 65 64 20 74 6f 20 69 74 65  ator used to ite
5140: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
5150: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 63   contents of a c
5160: 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 20 49 66 20  hangeset..** If 
5170: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 20  successful, *pp 
5180: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
5190: 74 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  to the iterator 
51a0: 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54  handle and SQLIT
51b0: 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
51c0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
51d0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
51e0: 72 73 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  rs, *pp is set t
51f0: 6f 20 7a 65 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a  o zero and an.**
5200: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5210: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
5220: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
5230: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  ing functions ca
5240: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 64 76  n be used to adv
5250: 61 6e 63 65 20 61 6e 64 20 71 75 65 72 79 20 61  ance and query a
5260: 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a 20 69   changeset .** i
5270: 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 20  terator created 
5280: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
5290: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
52a0: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
52b0: 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d  hangeset_next()]
52c0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69  .**   <li> [sqli
52d0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28  te3changeset_op(
52e0: 29 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71  )].**   <li> [sq
52f0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
5300: 65 77 28 29 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20  ew()].**   <li> 
5310: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
5320: 74 5f 6f 6c 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c  t_old()].** </ul
5330: 3e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  >.**.** It is th
5340: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
5350: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
5360: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 64 65 73  o eventually des
5370: 74 72 6f 79 20 74 68 65 20 69 74 65 72 61 74 6f  troy the iterato
5380: 72 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  r.** by passing 
5390: 69 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68  it to [sqlite3ch
53a0: 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65  angeset_finalize
53b0: 28 29 5d 2e 20 54 68 65 20 62 75 66 66 65 72 20  ()]. The buffer 
53c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
53d0: 2a 20 63 68 61 6e 67 65 73 65 74 20 28 70 43 68  * changeset (pCh
53e0: 61 6e 67 65 73 65 74 29 20 6d 75 73 74 20 72 65  angeset) must re
53f0: 6d 61 69 6e 20 76 61 6c 69 64 20 75 6e 74 69 6c  main valid until
5400: 20 61 66 74 65 72 20 74 68 65 20 69 74 65 72 61   after the itera
5410: 74 6f 72 20 69 73 0a 2a 2a 20 64 65 73 74 72 6f  tor is.** destro
5420: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  yed..**.** Assum
5430: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
5440: 74 20 62 6c 6f 62 20 77 61 73 20 63 72 65 61 74  t blob was creat
5450: 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
5460: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
5470: 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 5d  ion_changeset()]
5480: 2c 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  , [sqlite3change
5490: 73 65 74 5f 63 6f 6e 63 61 74 28 29 5d 20 6f 72  set_concat()] or
54a0: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e  .** [sqlite3chan
54b0: 67 65 73 65 74 5f 69 6e 76 65 72 74 28 29 5d 20  geset_invert()] 
54c0: 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63  functions, all c
54d0: 68 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68  hanges within th
54e0: 65 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a 20  e changeset .** 
54f0: 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 61 20  that apply to a 
5500: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65  single table are
5510: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
5520: 72 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  r. This means th
5530: 61 74 20 77 68 65 6e 20 0a 2a 2a 20 61 6e 20 61  at when .** an a
5540: 70 70 6c 69 63 61 74 69 6f 6e 20 69 74 65 72 61  pplication itera
5550: 74 65 73 20 74 68 72 6f 75 67 68 20 61 20 63 68  tes through a ch
5560: 61 6e 67 65 73 65 74 20 75 73 69 6e 67 20 61 6e  angeset using an
5570: 20 69 74 65 72 61 74 6f 72 20 63 72 65 61 74 65   iterator create
5580: 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 75  d by .** this fu
5590: 6e 63 74 69 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e  nction, all chan
55a0: 67 65 73 20 74 68 61 74 20 72 65 6c 61 74 65 20  ges that relate 
55b0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  to a single tabl
55c0: 65 20 61 72 65 20 76 69 73 69 74 65 64 20 0a 2a  e are visited .*
55d0: 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  * consecutively.
55e0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   There is no cha
55f0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 69 74 65  nce that the ite
5600: 72 61 74 6f 72 20 77 69 6c 6c 20 76 69 73 69 74  rator will visit
5610: 20 61 20 63 68 61 6e 67 65 20 0a 2a 2a 20 74 68   a change .** th
5620: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 61 62  e applies to tab
5630: 6c 65 20 58 2c 20 74 68 65 6e 20 6f 6e 65 20 66  le X, then one f
5640: 6f 72 20 74 61 62 6c 65 20 59 2c 20 61 6e 64 20  or table Y, and 
5650: 74 68 65 6e 20 6c 61 74 65 72 20 6f 6e 20 76 69  then later on vi
5660: 73 69 74 20 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  sit .** another 
5670: 63 68 61 6e 67 65 20 66 6f 72 20 74 61 62 6c 65  change for table
5680: 20 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65   X..**.** The be
5690: 68 61 76 69 6f 72 20 6f 66 20 73 71 6c 69 74 65  havior of sqlite
56a0: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
56b0: 5f 76 32 28 29 20 61 6e 64 20 69 74 73 20 73 74  _v2() and its st
56c0: 72 65 61 6d 69 6e 67 20 65 71 75 69 76 61 6c 65  reaming equivale
56d0: 6e 74 0a 2a 2a 20 6d 61 79 20 62 65 20 6d 6f 64  nt.** may be mod
56e0: 69 66 69 65 64 20 62 79 20 70 61 73 73 69 6e 67  ified by passing
56f0: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
5700: 66 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41  f.** [SQLITE_CHA
5710: 4e 47 45 53 45 54 53 54 41 52 54 5f 49 4e 56 45  NGESETSTART_INVE
5720: 52 54 20 7c 20 73 75 70 70 6f 72 74 65 64 20 66  RT | supported f
5730: 6c 61 67 73 5d 20 61 73 20 74 68 65 20 34 74 68  lags] as the 4th
5740: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
5750: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
5760: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
5770: 5f 73 74 61 72 74 5f 76 32 28 29 20 41 50 49 20  _start_v2() API 
5780: 69 73 20 73 74 69 6c 6c 20 3c 62 3e 65 78 70 65  is still <b>expe
5790: 72 69 6d 65 6e 74 61 6c 3c 2f 62 3e 0a 2a 2a 20  rimental</b>.** 
57a0: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73 75  and therefore su
57b0: 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 2e  bject to change.
57c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
57d0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 0a  hangeset_start(.
57e0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
57f0: 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20  set_iter **pp,  
5800: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68    /* OUT: New ch
5810: 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72  angeset iterator
5820: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
5830: 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20   nChangeset,    
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5850: 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65  Size of changese
5860: 74 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20  t blob in bytes 
5870: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e  */.  void *pChan
5880: 67 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  geset           
5890: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
58a0: 74 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69  to blob containi
58b0: 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ng changeset */.
58c0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  );.int sqlite3ch
58d0: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 76 32  angeset_start_v2
58e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
58f0: 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c  geset_iter **pp,
5900: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
5910: 63 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74  changeset iterat
5920: 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  or handle */.  i
5930: 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20  nt nChangeset,  
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5950: 2a 20 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65  * Size of change
5960: 73 65 74 20 62 6c 6f 62 20 69 6e 20 62 79 74 65  set blob in byte
5970: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68  s */.  void *pCh
5980: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
5990: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
59a0: 72 20 74 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69  r to blob contai
59b0: 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
59c0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 2f 2a 20 53 45 53 53 49 4f 4e 5f 43      /* SESSION_C
59f0: 48 41 4e 47 45 53 45 54 53 54 41 52 54 5f 2a 20  HANGESETSTART_* 
5a00: 66 6c 61 67 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  flags */.);../*.
5a10: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 46 6c 61  ** CAPI3REF: Fla
5a20: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68  gs for sqlite3ch
5a30: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 76 32  angeset_start_v2
5a40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
5a50: 77 69 6e 67 20 66 6c 61 67 73 20 6d 61 79 20 70  wing flags may p
5a60: 61 73 73 65 64 20 76 69 61 20 74 68 65 20 34 74  assed via the 4t
5a70: 68 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a  h parameter to.*
5a80: 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  * [sqlite3change
5a90: 73 65 74 5f 73 74 61 72 74 5f 76 32 5d 20 61 6e  set_start_v2] an
5aa0: 64 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  d [sqlite3change
5ab0: 73 65 74 5f 73 74 61 72 74 5f 76 32 5f 73 74 72  set_start_v2_str
5ac0: 6d 5d 3a 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51  m]:.**.** <dt>SQ
5ad0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41 50  LITE_CHANGESETAP
5ae0: 50 4c 59 5f 49 4e 56 45 52 54 20 3c 64 64 3e 0a  PLY_INVERT <dd>.
5af0: 2a 2a 20 20 20 49 6e 76 65 72 74 20 74 68 65 20  **   Invert the 
5b00: 63 68 61 6e 67 65 73 65 74 20 77 68 69 6c 65 20  changeset while 
5b10: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
5b20: 68 20 69 74 2e 20 54 68 69 73 20 69 73 20 65 71  h it. This is eq
5b30: 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20 20  uivalent to.**  
5b40: 20 69 6e 76 65 72 74 69 6e 67 20 61 20 63 68 61   inverting a cha
5b50: 6e 67 65 73 65 74 20 75 73 69 6e 67 20 73 71 6c  ngeset using sql
5b60: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e  ite3changeset_in
5b70: 76 65 72 74 28 29 20 62 65 66 6f 72 65 20 61 70  vert() before ap
5b80: 70 6c 79 69 6e 67 20 69 74 2e 0a 2a 2a 20 20 20  plying it..**   
5b90: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
5ba0: 6f 20 73 70 65 63 69 66 79 20 74 68 69 73 20 66  o specify this f
5bb0: 6c 61 67 20 77 69 74 68 20 61 20 70 61 74 63 68  lag with a patch
5bc0: 73 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  set..*/.#define 
5bd0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
5be0: 53 54 41 52 54 5f 49 4e 56 45 52 54 20 20 20 20  START_INVERT    
5bf0: 20 20 20 20 30 78 30 30 30 32 0a 0a 0a 2f 2a 0a      0x0002.../*.
5c00: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 41 64 76  ** CAPI3REF: Adv
5c10: 61 6e 63 65 20 41 20 43 68 61 6e 67 65 73 65 74  ance A Changeset
5c20: 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54   Iterator.** MET
5c30: 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  HOD: sqlite3_cha
5c40: 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a  ngeset_iter.**.*
5c50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c60: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
5c70: 20 77 69 74 68 20 69 74 65 72 61 74 6f 72 73 20   with iterators 
5c80: 63 72 65 61 74 65 64 20 62 79 20 66 75 6e 63 74  created by funct
5c90: 69 6f 6e 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63  ion.** [sqlite3c
5ca0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29  hangeset_start()
5cb0: 5d 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  ]. If it is call
5cc0: 65 64 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 6f  ed on an iterato
5cd0: 72 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 61  r passed to.** a
5ce0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
5cf0: 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20 5b 73  r callback by [s
5d00: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5d10: 61 70 70 6c 79 28 29 5d 2c 20 53 51 4c 49 54 45  apply()], SQLITE
5d20: 5f 4d 49 53 55 53 45 0a 2a 2a 20 69 73 20 72 65  _MISUSE.** is re
5d30: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 63  turned and the c
5d40: 61 6c 6c 20 68 61 73 20 6e 6f 20 65 66 66 65 63  all has no effec
5d50: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  t..**.** Immedia
5d60: 74 65 6c 79 20 61 66 74 65 72 20 61 6e 20 69 74  tely after an it
5d70: 65 72 61 74 6f 72 20 69 73 20 63 72 65 61 74 65  erator is create
5d80: 64 20 62 79 20 73 71 6c 69 74 65 33 63 68 61 6e  d by sqlite3chan
5d90: 67 65 73 65 74 5f 73 74 61 72 74 28 29 2c 20 69  geset_start(), i
5da0: 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 70 6f  t.** does not po
5db0: 69 6e 74 20 74 6f 20 61 6e 79 20 63 68 61 6e 67  int to any chang
5dc0: 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  e in the changes
5dd0: 65 74 2e 20 41 73 73 75 6d 69 6e 67 20 74 68 65  et. Assuming the
5de0: 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 69 73   changeset.** is
5df0: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 20   not empty, the 
5e00: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 74 68  first call to th
5e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
5e20: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
5e30: 72 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  r to.** point to
5e40: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e 67   the first chang
5e50: 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  e in the changes
5e60: 65 74 2e 20 45 61 63 68 20 73 75 62 73 65 71 75  et. Each subsequ
5e70: 65 6e 74 20 63 61 6c 6c 20 61 64 76 61 6e 63 65  ent call advance
5e80: 73 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f  s.** the iterato
5e90: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
5ea0: 65 20 6e 65 78 74 20 63 68 61 6e 67 65 20 69 6e  e next change in
5eb0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 28   the changeset (
5ec0: 69 66 20 61 6e 79 29 2e 20 49 66 0a 2a 2a 20 6e  if any). If.** n
5ed0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  o error occurs a
5ee0: 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  nd the iterator 
5ef0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
5f00: 64 20 63 68 61 6e 67 65 20 61 66 74 65 72 20 61  d change after a
5f10: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
5f20: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  te3changeset_nex
5f30: 74 28 29 20 68 61 73 20 61 64 76 61 6e 63 65 64  t() has advanced
5f40: 20 69 74 2c 20 53 51 4c 49 54 45 5f 52 4f 57 20   it, SQLITE_ROW 
5f50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
5f60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
5f70: 6c 6c 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  ll changes in th
5f80: 65 20 63 68 61 6e 67 65 73 65 74 20 68 61 76 65  e changeset have
5f90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 69   already been vi
5fa0: 73 69 74 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  sited,.** SQLITE
5fb0: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
5fc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
5fd0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
5fe0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
5ff0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 50  e is returned. P
6000: 6f 73 73 69 62 6c 65 20 65 72 72 6f 72 20 0a 2a  ossible error .*
6010: 2a 20 63 6f 64 65 73 20 69 6e 63 6c 75 64 65 20  * codes include 
6020: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 28  SQLITE_CORRUPT (
6030: 69 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  if the changeset
6040: 20 62 75 66 66 65 72 20 69 73 20 63 6f 72 72 75   buffer is corru
6050: 70 74 29 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  pt) or .** SQLIT
6060: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
6070: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
6080: 5f 6e 65 78 74 28 73 71 6c 69 74 65 33 5f 63 68  _next(sqlite3_ch
6090: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
60a0: 74 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  ter);../*.** CAP
60b0: 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 54 68  I3REF: Obtain Th
60c0: 65 20 43 75 72 72 65 6e 74 20 4f 70 65 72 61 74  e Current Operat
60d0: 69 6f 6e 20 46 72 6f 6d 20 41 20 43 68 61 6e 67  ion From A Chang
60e0: 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a 2a 2a  eset Iterator.**
60f0: 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33   METHOD: sqlite3
6100: 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a  _changeset_iter.
6110: 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65 72 20  **.** The pIter 
6120: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
6130: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
6140: 20 6d 61 79 20 65 69 74 68 65 72 20 62 65 20 61   may either be a
6150: 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  n iterator.** pa
6160: 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69  ssed to a confli
6170: 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 20 5b 73  ct-handler by [s
6180: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
6190: 61 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61 6e 20  apply()], or an 
61a0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72 65 61  iterator.** crea
61b0: 74 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 63  ted by [sqlite3c
61c0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29  hangeset_start()
61d0: 5d 2e 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72  ]. In the latter
61e0: 20 63 61 73 65 2c 20 74 68 65 20 6d 6f 73 74 20   case, the most 
61f0: 72 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74  recent.** call t
6200: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
6210: 73 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75 73 74  set_next()] must
6220: 20 68 61 76 65 20 72 65 74 75 72 6e 65 64 20 5b   have returned [
6230: 53 51 4c 49 54 45 5f 52 4f 57 5d 2e 20 49 66 20  SQLITE_ROW]. If 
6240: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
6250: 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  he case, this fu
6260: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b  nction returns [
6270: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d 2e 0a  SQLITE_MISUSE]..
6280: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
6290: 74 20 70 7a 54 61 62 20 69 73 20 6e 6f 74 20 4e  t pzTab is not N
62a0: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 7a 54 61 62  ULL, then *pzTab
62b0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
62c0: 20 74 6f 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72   to a.** nul-ter
62d0: 6d 69 6e 61 74 65 64 20 75 74 66 2d 38 20 65 6e  minated utf-8 en
62e0: 63 6f 64 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  coded string con
62f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
6300: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
6310: 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65   affected by the
6320: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e   current change.
6330: 20 54 68 65 20 62 75 66 66 65 72 20 72 65 6d 61   The buffer rema
6340: 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
6350: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
6360: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
6370: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
6380: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 72 20 75  he iterator or u
6390: 6e 74 69 6c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  ntil the .** con
63a0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66 75  flict-handler fu
63b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
63c0: 49 66 20 70 6e 43 6f 6c 20 69 73 20 6e 6f 74 20  If pnCol is not 
63d0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 43 6f  NULL, then *pnCo
63e0: 6c 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20  l is .** set to 
63f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6400: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6410: 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74  le affected by t
6420: 68 65 20 63 68 61 6e 67 65 2e 20 49 66 0a 2a 2a  he change. If.**
6430: 20 70 62 49 6e 64 69 72 65 63 74 20 69 73 20 6e   pbIndirect is n
6440: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70  ot NULL, then *p
6450: 62 49 6e 64 69 72 65 63 74 20 69 73 20 73 65 74  bIndirect is set
6460: 20 74 6f 20 74 72 75 65 20 28 31 29 20 69 66 20   to true (1) if 
6470: 74 68 65 20 63 68 61 6e 67 65 0a 2a 2a 20 69 73  the change.** is
6480: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68 61   an indirect cha
6490: 6e 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 28 30  nge, or false (0
64a0: 29 20 6f 74 68 65 72 77 69 73 65 2e 20 53 65 65  ) otherwise. See
64b0: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
64c0: 6f 6e 20 66 6f 72 0a 2a 2a 20 5b 73 71 6c 69 74  on for.** [sqlit
64d0: 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65  e3session_indire
64e0: 63 74 28 29 5d 20 66 6f 72 20 61 20 64 65 73 63  ct()] for a desc
64f0: 72 69 70 74 69 6f 6e 20 6f 66 20 64 69 72 65 63  ription of direc
6500: 74 20 61 6e 64 20 69 6e 64 69 72 65 63 74 0a 2a  t and indirect.*
6510: 2a 20 63 68 61 6e 67 65 73 2e 20 46 69 6e 61 6c  * changes. Final
6520: 6c 79 2c 20 69 66 20 70 4f 70 20 69 73 20 6e 6f  ly, if pOp is no
6530: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 4f  t NULL, then *pO
6540: 70 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  p is set to one 
6550: 6f 66 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 49  of .** [SQLITE_I
6560: 4e 53 45 52 54 5d 2c 20 5b 53 51 4c 49 54 45 5f  NSERT], [SQLITE_
6570: 44 45 4c 45 54 45 5d 20 6f 72 20 5b 53 51 4c 49  DELETE] or [SQLI
6580: 54 45 5f 55 50 44 41 54 45 5d 2c 20 64 65 70 65  TE_UPDATE], depe
6590: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 0a 2a 2a  nding on the .**
65a0: 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20   type of change 
65b0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
65c0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
65d0: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ts to..**.** If 
65e0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
65f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6600: 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
6610: 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
6620: 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
6630: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6640: 6e 65 64 2e 20 54 68 65 20 76 61 6c 75 65 73 20  ned. The values 
6650: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  of the output va
6660: 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 0a  riables may not.
6670: 2a 2a 20 62 65 20 74 72 75 73 74 65 64 20 69 6e  ** be trusted in
6680: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
6690: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
66a0: 73 65 74 5f 6f 70 28 0a 20 20 73 71 6c 69 74 65  set_op(.  sqlite
66b0: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
66c0: 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49 74 65   *pIter,  /* Ite
66d0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
66e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
66f0: 7a 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  zTab,           
6700: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
6710: 72 20 74 6f 20 74 61 62 6c 65 20 6e 61 6d 65 20  r to table name 
6720: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
6750: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
6760: 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  n table */.  int
6770: 20 2a 70 4f 70 2c 20 20 20 20 20 20 20 20 20 20   *pOp,          
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6790: 4f 55 54 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  OUT: SQLITE_INSE
67a0: 52 54 2c 20 44 45 4c 45 54 45 20 6f 72 20 55 50  RT, DELETE or UP
67b0: 44 41 54 45 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  DATE */.  int *p
67c0: 62 49 6e 64 69 72 65 63 74 20 20 20 20 20 20 20  bIndirect       
67d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
67e0: 3a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 27 69  : True for an 'i
67f0: 6e 64 69 72 65 63 74 27 20 63 68 61 6e 67 65 20  ndirect' change 
6800: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  */.);../*.** CAP
6810: 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 54 68  I3REF: Obtain Th
6820: 65 20 50 72 69 6d 61 72 79 20 4b 65 79 20 44 65  e Primary Key De
6830: 66 69 6e 69 74 69 6f 6e 20 4f 66 20 41 20 54 61  finition Of A Ta
6840: 62 6c 65 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  ble.** METHOD: s
6850: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
6860: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  _iter.**.** For 
6870: 65 61 63 68 20 6d 6f 64 69 66 69 65 64 20 74 61  each modified ta
6880: 62 6c 65 2c 20 61 20 63 68 61 6e 67 65 73 65 74  ble, a changeset
6890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 66 6f   includes the fo
68a0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 3c  llowing:.**.** <
68b0: 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68  ul>.**   <li> Th
68c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
68d0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
68e0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
68f0: 57 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 63  Which of those c
6900: 6f 6c 75 6d 6e 73 20 6d 61 6b 65 20 75 70 20 74  olumns make up t
6910: 68 65 20 74 61 62 6c 65 73 20 50 52 49 4d 41 52  he tables PRIMAR
6920: 59 20 4b 45 59 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a  Y KEY..** </ul>.
6930: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
6940: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66  ion is used to f
6950: 69 6e 64 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  ind which column
6960: 73 20 63 6f 6d 70 72 69 73 65 20 74 68 65 20 50  s comprise the P
6970: 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 0a 2a 2a  RIMARY KEY of.**
6980: 20 74 68 65 20 74 61 62 6c 65 20 6d 6f 64 69 66   the table modif
6990: 69 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 67  ied by the chang
69a0: 65 20 74 68 61 74 20 69 74 65 72 61 74 6f 72 20  e that iterator 
69b0: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
69c0: 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66  points to..** If
69d0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 61   successful, *pa
69e0: 62 50 4b 20 69 73 20 73 65 74 20 74 6f 20 70 6f  bPK is set to po
69f0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
6a00: 6f 66 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c  of nCol entries,
6a10: 20 77 68 65 72 65 0a 2a 2a 20 6e 43 6f 6c 20 69   where.** nCol i
6a20: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6a30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
6a40: 61 62 6c 65 2e 20 45 6c 65 6d 65 6e 74 73 20 6f  able. Elements o
6a50: 66 20 2a 70 61 62 50 4b 20 61 72 65 20 73 65 74  f *pabPK are set
6a60: 20 74 6f 0a 2a 2a 20 30 78 30 31 20 69 66 20 74   to.** 0x01 if t
6a70: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
6a80: 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72 74 20   column is part 
6a90: 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  of the tables pr
6aa0: 69 6d 61 72 79 20 6b 65 79 2c 20 6f 72 0a 2a 2a  imary key, or.**
6ab0: 20 30 78 30 30 20 69 66 20 69 74 20 69 73 20 6e   0x00 if it is n
6ac0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ot..**.** If arg
6ad0: 75 6d 65 6e 74 20 70 6e 43 6f 6c 20 69 73 20 6e  ument pnCol is n
6ae0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70  ot NULL, then *p
6af0: 6e 43 6f 6c 20 69 73 20 73 65 74 20 74 6f 20 74  nCol is set to t
6b00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
6b10: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74  umns.** in the t
6b20: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
6b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6b40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
6b50: 69 74 65 72 61 74 6f 72 20 64 6f 65 73 20 6e 6f  iterator does no
6b60: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c  t point to a val
6b70: 69 64 0a 2a 2a 20 65 6e 74 72 79 2c 20 53 51 4c  id.** entry, SQL
6b80: 49 54 45 5f 4d 49 53 55 53 45 20 69 73 20 72 65  ITE_MISUSE is re
6b90: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
6ba0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
6bb0: 7a 65 72 6f 65 64 2e 20 4f 74 68 65 72 77 69 73  zeroed. Otherwis
6bc0: 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
6bd0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
6be0: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
6bf0: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 61  bles populated a
6c00: 73 20 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 61  s described.** a
6c10: 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  bove..*/.int sql
6c20: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 70 6b  ite3changeset_pk
6c30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
6c40: 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
6c50: 72 2c 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20  r,  /* Iterator 
6c60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 73 69  object */.  unsi
6c70: 67 6e 65 64 20 63 68 61 72 20 2a 2a 70 61 62 50  gned char **pabP
6c80: 4b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  K,          /* O
6c90: 55 54 3a 20 41 72 72 61 79 20 6f 66 20 62 6f 6f  UT: Array of boo
6ca0: 6c 65 61 6e 20 2d 20 74 72 75 65 20 66 6f 72 20  lean - true for 
6cb0: 50 4b 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  PK cols */.  int
6cc0: 20 2a 70 6e 43 6f 6c 20 20 20 20 20 20 20 20 20   *pnCol         
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ce0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 65  OUT: Number of e
6cf0: 6e 74 72 69 65 73 20 69 6e 20 6f 75 74 70 75 74  ntries in output
6d00: 20 61 72 72 61 79 20 2a 2f 0a 29 3b 0a 0a 2f 2a   array */.);../*
6d10: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
6d20: 74 61 69 6e 20 6f 6c 64 2e 2a 20 56 61 6c 75 65  tain old.* Value
6d30: 73 20 46 72 6f 6d 20 41 20 43 68 61 6e 67 65 73  s From A Changes
6d40: 65 74 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d  et Iterator.** M
6d50: 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63  ETHOD: sqlite3_c
6d60: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a  hangeset_iter.**
6d70: 0a 2a 2a 20 54 68 65 20 70 49 74 65 72 20 61 72  .** The pIter ar
6d80: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
6d90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
6da0: 61 79 20 65 69 74 68 65 72 20 62 65 20 61 6e 20  ay either be an 
6db0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73  iterator.** pass
6dc0: 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74  ed to a conflict
6dd0: 2d 68 61 6e 64 6c 65 72 20 62 79 20 5b 73 71 6c  -handler by [sql
6de0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
6df0: 70 6c 79 28 29 5d 2c 20 6f 72 20 61 6e 20 69 74  ply()], or an it
6e00: 65 72 61 74 6f 72 0a 2a 2a 20 63 72 65 61 74 65  erator.** create
6e10: 64 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  d by [sqlite3cha
6e20: 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e  ngeset_start()].
6e30: 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20 63   In the latter c
6e40: 61 73 65 2c 20 74 68 65 20 6d 6f 73 74 20 72 65  ase, the most re
6e50: 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  cent.** call to 
6e60: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
6e70: 74 5f 6e 65 78 74 28 29 5d 20 6d 75 73 74 20 68  t_next()] must h
6e80: 61 76 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c  ave returned SQL
6e90: 49 54 45 5f 52 4f 57 2e 20 0a 2a 2a 20 46 75 72  ITE_ROW. .** Fur
6ea0: 74 68 65 72 6d 6f 72 65 2c 20 69 74 20 6d 61 79  thermore, it may
6eb0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
6ec0: 69 66 20 74 68 65 20 74 79 70 65 20 6f 66 20 63  if the type of c
6ed0: 68 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 69  hange that the i
6ee0: 74 65 72 61 74 6f 72 0a 2a 2a 20 63 75 72 72 65  terator.** curre
6ef0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 69  ntly points to i
6f00: 73 20 65 69 74 68 65 72 20 5b 53 51 4c 49 54 45  s either [SQLITE
6f10: 5f 44 45 4c 45 54 45 5d 20 6f 72 20 5b 53 51 4c  _DELETE] or [SQL
6f20: 49 54 45 5f 55 50 44 41 54 45 5d 2e 20 4f 74 68  ITE_UPDATE]. Oth
6f30: 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20  erwise,.** this 
6f40: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6f50: 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d   [SQLITE_MISUSE]
6f60: 20 61 6e 64 20 73 65 74 73 20 2a 70 70 56 61 6c   and sets *ppVal
6f70: 75 65 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ue to NULL..**.*
6f80: 2a 20 41 72 67 75 6d 65 6e 74 20 69 56 61 6c 20  * Argument iVal 
6f90: 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
6fa0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
6fb0: 20 30 2c 20 61 6e 64 20 6c 65 73 73 20 74 68 61   0, and less tha
6fc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
6fd0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
6fe0: 65 20 74 61 62 6c 65 20 61 66 66 65 63 74 65 64  e table affected
6ff0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
7000: 63 68 61 6e 67 65 2e 20 4f 74 68 65 72 77 69 73  change. Otherwis
7010: 65 2c 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 52 41  e,.** [SQLITE_RA
7020: 4e 47 45 5d 20 69 73 20 72 65 74 75 72 6e 65 64  NGE] is returned
7030: 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69 73   and *ppValue is
7040: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
7050: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
7060: 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
7070: 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20 74   sets *ppValue t
7080: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 70 72 6f  o point to a pro
7090: 74 65 63 74 65 64 0a 2a 2a 20 73 71 6c 69 74 65  tected.** sqlite
70a0: 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 63  3_value object c
70b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 56  ontaining the iV
70c0: 61 6c 27 74 68 20 76 61 6c 75 65 20 66 72 6f 6d  al'th value from
70d0: 20 74 68 65 20 76 65 63 74 6f 72 20 6f 66 20 0a   the vector of .
70e0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20  ** original row 
70f0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73  values stored as
7100: 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 50 44   part of the UPD
7110: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 63 68  ATE or DELETE ch
7120: 61 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75  ange and.** retu
7130: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  rns SQLITE_OK. T
7140: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
7150: 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  unction comes fr
7160: 6f 6d 20 74 68 65 20 66 61 63 74 20 74 68 61 74  om the fact that
7170: 20 74 68 69 73 20 0a 2a 2a 20 69 73 20 73 69 6d   this .** is sim
7180: 69 6c 61 72 20 74 6f 20 74 68 65 20 22 6f 6c 64  ilar to the "old
7190: 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69  .*" columns avai
71a0: 6c 61 62 6c 65 20 74 6f 20 75 70 64 61 74 65 20  lable to update 
71b0: 6f 72 20 64 65 6c 65 74 65 20 74 72 69 67 67 65  or delete trigge
71c0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d  rs..**.** If som
71d0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  e other error oc
71e0: 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
71f0: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e  M condition), an
7200: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7210: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7220: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
7230: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
7240: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7250: 6e 67 65 73 65 74 5f 6f 6c 64 28 0a 20 20 73 71  ngeset_old(.  sq
7260: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7270: 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
7280: 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
7290: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61  tor */.  int iVa
72a0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
72c0: 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  mn number */.  s
72d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
72e0: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 2f  pValue         /
72f0: 2a 20 4f 55 54 3a 20 4f 6c 64 20 76 61 6c 75 65  * OUT: Old value
7300: 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   (or NULL pointe
7310: 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r) */.);../*.** 
7320: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
7330: 20 6e 65 77 2e 2a 20 56 61 6c 75 65 73 20 46 72   new.* Values Fr
7340: 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20 49  om A Changeset I
7350: 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f  terator.** METHO
7360: 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  D: sqlite3_chang
7370: 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20  eset_iter.**.** 
7380: 54 68 65 20 70 49 74 65 72 20 61 72 67 75 6d 65  The pIter argume
7390: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
73a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65  s function may e
73b0: 69 74 68 65 72 20 62 65 20 61 6e 20 69 74 65 72  ither be an iter
73c0: 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 74  ator.** passed t
73d0: 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  o a conflict-han
73e0: 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74 65 33  dler by [sqlite3
73f0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
7400: 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72 61 74  )], or an iterat
7410: 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  or.** created by
7420: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
7430: 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49 6e 20  et_start()]. In 
7440: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 2c  the latter case,
7450: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7460: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c  .** call to [sql
7470: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
7480: 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76 65 20  xt()] must have 
7490: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
74a0: 52 4f 57 2e 20 0a 2a 2a 20 46 75 72 74 68 65 72  ROW. .** Further
74b0: 6d 6f 72 65 2c 20 69 74 20 6d 61 79 20 6f 6e 6c  more, it may onl
74c0: 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  y be called if t
74d0: 68 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67  he type of chang
74e0: 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  e that the itera
74f0: 74 6f 72 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  tor.** currently
7500: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 65 69   points to is ei
7510: 74 68 65 72 20 5b 53 51 4c 49 54 45 5f 55 50 44  ther [SQLITE_UPD
7520: 41 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ATE] or [SQLITE_
7530: 49 4e 53 45 52 54 5d 2e 20 4f 74 68 65 72 77 69  INSERT]. Otherwi
7540: 73 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  se,.** this func
7550: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51  tion returns [SQ
7560: 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 61 6e 64  LITE_MISUSE] and
7570: 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20 74   sets *ppValue t
7580: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72  o NULL..**.** Ar
7590: 67 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74  gument iVal must
75a0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
75b0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20   or equal to 0, 
75c0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68  and less than th
75d0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
75e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
75f0: 62 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20  ble affected by 
7600: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
7610: 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ge. Otherwise,.*
7620: 2a 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d  * [SQLITE_RANGE]
7630: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7640: 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65 74   *ppValue is set
7650: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
7660: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
7670: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
7680: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f  s *ppValue to po
7690: 69 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74  int to a protect
76a0: 65 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61  ed.** sqlite3_va
76b0: 6c 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  lue object conta
76c0: 69 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74  ining the iVal't
76d0: 68 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  h value from the
76e0: 20 76 65 63 74 6f 72 20 6f 66 20 0a 2a 2a 20 6e   vector of .** n
76f0: 65 77 20 72 6f 77 20 76 61 6c 75 65 73 20 73 74  ew row values st
7700: 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
7710: 74 68 65 20 55 50 44 41 54 45 20 6f 72 20 49 4e  the UPDATE or IN
7720: 53 45 52 54 20 63 68 61 6e 67 65 20 61 6e 64 0a  SERT change and.
7730: 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ** returns SQLIT
7740: 45 5f 4f 4b 2e 20 49 66 20 74 68 65 20 63 68 61  E_OK. If the cha
7750: 6e 67 65 20 69 73 20 61 6e 20 55 50 44 41 54 45  nge is an UPDATE
7760: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 69 6e   and does not in
7770: 63 6c 75 64 65 0a 2a 2a 20 61 20 6e 65 77 20 76  clude.** a new v
7780: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 71  alue for the req
7790: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 2a  uested column, *
77a0: 70 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74  ppValue is set t
77b0: 6f 20 4e 55 4c 4c 20 61 6e 64 20 0a 2a 2a 20 53  o NULL and .** S
77c0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
77d0: 64 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  d. The name of t
77e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 65  he function come
77f0: 73 20 66 72 6f 6d 20 74 68 65 20 66 61 63 74 20  s from the fact 
7800: 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 69 73  that .** this is
7810: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
7820: 22 6e 65 77 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20  "new.*" columns 
7830: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 75 70 64  available to upd
7840: 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20 0a 2a  ate or delete .*
7850: 2a 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a  * triggers..**.*
7860: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
7870: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e  error occurs (e.
7880: 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  g. an OOM condit
7890: 69 6f 6e 29 2c 20 61 6e 20 53 51 4c 69 74 65 20  ion), an SQLite 
78a0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
78b0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
78c0: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
78d0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
78e0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
78f0: 65 77 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  ew(.  sqlite3_ch
7900: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
7910: 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ter,  /* Changes
7920: 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  et iterator */. 
7930: 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20   int iVal,      
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
7960: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
7970: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20  alue **ppValue  
7980: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
7990: 65 77 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c  ew value (or NUL
79a0: 4c 20 70 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b  L pointer) */.);
79b0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
79c0: 3a 20 4f 62 74 61 69 6e 20 43 6f 6e 66 6c 69 63  : Obtain Conflic
79d0: 74 69 6e 67 20 52 6f 77 20 56 61 6c 75 65 73 20  ting Row Values 
79e0: 46 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74  From A Changeset
79f0: 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54   Iterator.** MET
7a00: 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  HOD: sqlite3_cha
7a10: 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a  ngeset_iter.**.*
7a20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7a30: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 75  should only be u
7a40: 73 65 64 20 77 69 74 68 20 69 74 65 72 61 74 6f  sed with iterato
7a50: 72 20 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64  r objects passed
7a60: 20 74 6f 20 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63   to a.** conflic
7a70: 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  t-handler callba
7a80: 63 6b 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68  ck by [sqlite3ch
7a90: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d  angeset_apply()]
7aa0: 20 77 69 74 68 20 65 69 74 68 65 72 0a 2a 2a 20   with either.** 
7ab0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
7ac0: 54 5f 44 41 54 41 5d 20 6f 72 20 5b 53 51 4c 49  T_DATA] or [SQLI
7ad0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
7ae0: 46 4c 49 43 54 5d 2e 20 49 66 20 74 68 69 73 20  FLICT]. If this 
7af0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
7b00: 61 6c 6c 65 64 20 6f 6e 20 61 6e 79 20 6f 74 68  alled on any oth
7b10: 65 72 20 69 74 65 72 61 74 6f 72 2c 20 5b 53 51  er iterator, [SQ
7b20: 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 69 73 20  LITE_MISUSE] is 
7b30: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
7b40: 56 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  Value.** is set 
7b50: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  to NULL..**.** A
7b60: 72 67 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73  rgument iVal mus
7b70: 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
7b80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c  n or equal to 0,
7b90: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74   and less than t
7ba0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
7bb0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
7bc0: 61 62 6c 65 20 61 66 66 65 63 74 65 64 20 62 79  able affected by
7bd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
7be0: 6e 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  nge. Otherwise,.
7bf0: 2a 2a 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45  ** [SQLITE_RANGE
7c00: 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ] is returned an
7c10: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
7c20: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
7c30: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
7c40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
7c50: 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70  ts *ppValue to p
7c60: 6f 69 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63  oint to a protec
7c70: 74 65 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ted.** sqlite3_v
7c80: 61 6c 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74  alue object cont
7c90: 61 69 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27  aining the iVal'
7ca0: 74 68 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  th value from th
7cb0: 65 20 0a 2a 2a 20 22 63 6f 6e 66 6c 69 63 74 69  e .** "conflicti
7cc0: 6e 67 20 72 6f 77 22 20 61 73 73 6f 63 69 61 74  ng row" associat
7cd0: 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ed with the curr
7ce0: 65 6e 74 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  ent conflict-han
7cf0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  dler callback.**
7d00: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
7d10: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
7d20: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
7d30: 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61  r occurs (e.g. a
7d40: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29  n OOM condition)
7d50: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
7d60: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
7d70: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
7d80: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
7d90: 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  L..*/.int sqlite
7da0: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c  3changeset_confl
7db0: 69 63 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ict(.  sqlite3_c
7dc0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
7dd0: 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65  Iter,  /* Change
7de0: 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  set iterator */.
7df0: 20 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20    int iVal,     
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
7e20: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7e30: 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20  value **ppValue 
7e40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
7e50: 56 61 6c 75 65 20 66 72 6f 6d 20 63 6f 6e 66 6c  Value from confl
7e60: 69 63 74 69 6e 67 20 72 6f 77 20 2a 2f 0a 29 3b  icting row */.);
7e70: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
7e80: 3a 20 44 65 74 65 72 6d 69 6e 65 20 54 68 65 20  : Determine The 
7e90: 4e 75 6d 62 65 72 20 4f 66 20 46 6f 72 65 69 67  Number Of Foreig
7ea0: 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74  n Key Constraint
7eb0: 20 56 69 6f 6c 61 74 69 6f 6e 73 0a 2a 2a 20 4d   Violations.** M
7ec0: 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63  ETHOD: sqlite3_c
7ed0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a  hangeset_iter.**
7ee0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7ef0: 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
7f00: 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 69 74 65  lled with an ite
7f10: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
7f20: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48 41  an.** SQLITE_CHA
7f30: 4e 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b  NGESET_FOREIGN_K
7f40: 45 59 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  EY conflict hand
7f50: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 20 49 6e  ler callback. In
7f60: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 69 74   this case.** it
7f70: 20 73 65 74 73 20 74 68 65 20 6f 75 74 70 75 74   sets the output
7f80: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
7f90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
7fa0: 20 6b 6e 6f 77 6e 20 66 6f 72 65 69 67 6e 20 6b   known foreign k
7fb0: 65 79 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  ey.** violations
7fc0: 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74   in the destinat
7fd0: 69 6f 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  ion database and
7fe0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
7ff0: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  OK..**.** In all
8000: 20 6f 74 68 65 72 20 63 61 73 65 73 20 74 68 69   other cases thi
8010: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
8020: 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
8030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8040: 63 68 61 6e 67 65 73 65 74 5f 66 6b 5f 63 6f 6e  changeset_fk_con
8050: 66 6c 69 63 74 73 28 0a 20 20 73 71 6c 69 74 65  flicts(.  sqlite
8060: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
8070: 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61   *pIter,  /* Cha
8080: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
8090: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 20  */.  int *pnOut 
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
80c0: 62 65 72 20 6f 66 20 46 4b 20 76 69 6f 6c 61 74  ber of FK violat
80d0: 69 6f 6e 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a  ions */.);.../*.
80e0: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 46 69 6e  ** CAPI3REF: Fin
80f0: 61 6c 69 7a 65 20 41 20 43 68 61 6e 67 65 73 65  alize A Changese
8100: 74 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45  t Iterator.** ME
8110: 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68  THOD: sqlite3_ch
8120: 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a  angeset_iter.**.
8130: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8140: 20 69 73 20 75 73 65 64 20 74 6f 20 66 69 6e 61   is used to fina
8150: 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lize an iterator
8160: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 0a   allocated with.
8170: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
8180: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 0a 2a  eset_start()]..*
8190: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
81a0: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
81b0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  e called on iter
81c0: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 75 73  ators created us
81d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 5b 73 71 6c 69  ing the.** [sqli
81e0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
81f0: 72 74 28 29 5d 20 66 75 6e 63 74 69 6f 6e 2e 20  rt()] function. 
8200: 49 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f  If an applicatio
8210: 6e 20 63 61 6c 6c 73 20 74 68 69 73 0a 2a 2a 20  n calls this.** 
8220: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 6e  function with an
8230: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
8240: 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   to a conflict-h
8250: 61 6e 64 6c 65 72 20 62 79 0a 2a 2a 20 5b 73 71  andler by.** [sq
8260: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
8270: 70 70 6c 79 28 29 5d 2c 20 5b 53 51 4c 49 54 45  pply()], [SQLITE
8280: 5f 4d 49 53 55 53 45 5d 20 69 73 20 69 6d 6d 65  _MISUSE] is imme
8290: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 65 64  diately returned
82a0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 61 6c 6c   and the.** call
82b0: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a   has no effect..
82c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
82d0: 72 20 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65  r was encountere
82e0: 64 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 20  d within a call 
82f0: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 63 68 61  to an sqlite3cha
8300: 6e 67 65 73 65 74 5f 78 78 78 28 29 0a 2a 2a 20  ngeset_xxx().** 
8310: 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 65 78  function (for ex
8320: 61 6d 70 6c 65 20 61 6e 20 5b 53 51 4c 49 54 45  ample an [SQLITE
8330: 5f 43 4f 52 52 55 50 54 5d 20 69 6e 20 5b 73 71  _CORRUPT] in [sq
8340: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
8350: 65 78 74 28 29 5d 20 6f 72 20 61 6e 20 0a 2a 2a  ext()] or an .**
8360: 20 5b 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5d 20   [SQLITE_NOMEM] 
8370: 69 6e 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  in [sqlite3chang
8380: 65 73 65 74 5f 6e 65 77 28 29 5d 29 20 74 68 65  eset_new()]) the
8390: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
83a0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
83b0: 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 69   to that error i
83c0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
83d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
83e0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
83f0: 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  K is.** returned
8400: 2e 20 54 68 69 73 20 69 73 20 74 6f 20 61 6c 6c  . This is to all
8410: 6f 77 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ow the following
8420: 20 70 61 74 74 65 72 6e 20 28 70 73 65 75 64 6f   pattern (pseudo
8430: 2d 63 6f 64 65 29 3a 0a 2a 2a 0a 2a 2a 20 3c 70  -code):.**.** <p
8440: 72 65 3e 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  re>.**   sqlite3
8450: 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
8460: 29 3b 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 53  );.**   while( S
8470: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
8480: 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74  e3changeset_next
8490: 28 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  () ){.**     // 
84a0: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
84b0: 68 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 7d  h change..**   }
84c0: 0a 2a 2a 20 20 20 72 63 20 3d 20 73 71 6c 69 74  .**   rc = sqlit
84d0: 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e 61  e3changeset_fina
84e0: 6c 69 7a 65 28 29 3b 0a 2a 2a 20 20 20 69 66 28  lize();.**   if(
84f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8500: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 41 6e 20 65  {.**     // An e
8510: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
8520: 64 20 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70  d .**   }.** </p
8530: 72 65 3e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re>.*/.int sqlit
8540: 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e 61  e3changeset_fina
8550: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 68 61  lize(sqlite3_cha
8560: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74  ngeset_iter *pIt
8570: 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  er);../*.** CAPI
8580: 33 52 45 46 3a 20 49 6e 76 65 72 74 20 41 20 43  3REF: Invert A C
8590: 68 61 6e 67 65 73 65 74 0a 2a 2a 0a 2a 2a 20 54  hangeset.**.** T
85a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
85b0: 75 73 65 64 20 74 6f 20 22 69 6e 76 65 72 74 22  used to "invert"
85c0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 62 6a   a changeset obj
85d0: 65 63 74 2e 20 41 70 70 6c 79 69 6e 67 20 61 6e  ect. Applying an
85e0: 20 69 6e 76 65 72 74 65 64 0a 2a 2a 20 63 68 61   inverted.** cha
85f0: 6e 67 65 73 65 74 20 74 6f 20 61 20 64 61 74 61  ngeset to a data
8600: 62 61 73 65 20 72 65 76 65 72 73 65 73 20 74 68  base reverses th
8610: 65 20 65 66 66 65 63 74 73 20 6f 66 20 61 70 70  e effects of app
8620: 6c 79 69 6e 67 20 74 68 65 20 75 6e 69 6e 76 65  lying the uninve
8630: 72 74 65 64 0a 2a 2a 20 63 68 61 6e 67 65 73 65  rted.** changese
8640: 74 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a  t. Specifically:
8650: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
8660: 20 3c 6c 69 3e 20 45 61 63 68 20 44 45 4c 45 54   <li> Each DELET
8670: 45 20 63 68 61 6e 67 65 20 69 73 20 63 68 61 6e  E change is chan
8680: 67 65 64 20 74 6f 20 61 6e 20 49 4e 53 45 52 54  ged to an INSERT
8690: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
86a0: 45 61 63 68 20 49 4e 53 45 52 54 20 63 68 61 6e  Each INSERT chan
86b0: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ge is changed to
86c0: 20 61 20 44 45 4c 45 54 45 2c 20 61 6e 64 0a 2a   a DELETE, and.*
86d0: 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63  *   <li> For eac
86e0: 68 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 2c  h UPDATE change,
86f0: 20 74 68 65 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e   the old.* and n
8700: 65 77 2e 2a 20 76 61 6c 75 65 73 20 61 72 65 20  ew.* values are 
8710: 65 78 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 3c 2f  exchanged..** </
8720: 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ul>.**.** This f
8730: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
8740: 20 63 68 61 6e 67 65 20 74 68 65 20 6f 72 64 65   change the orde
8750: 72 20 69 6e 20 77 68 69 63 68 20 63 68 61 6e 67  r in which chang
8760: 65 73 20 61 70 70 65 61 72 20 77 69 74 68 69 6e  es appear within
8770: 0a 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 73 65  .** the changese
8780: 74 2e 20 49 74 20 6d 65 72 65 6c 79 20 72 65 76  t. It merely rev
8790: 65 72 73 65 73 20 74 68 65 20 73 65 6e 73 65 20  erses the sense 
87a0: 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
87b0: 61 6c 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  al change..**.**
87c0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
87d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
87e0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
87f0: 20 74 68 65 20 69 6e 76 65 72 74 65 64 20 63 68   the inverted ch
8800: 61 6e 67 65 73 65 74 0a 2a 2a 20 69 73 20 73 74  angeset.** is st
8810: 6f 72 65 64 20 69 6e 20 2a 70 70 4f 75 74 2c 20  ored in *ppOut, 
8820: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8830: 73 61 6d 65 20 62 75 66 66 65 72 20 69 73 20 73  same buffer is s
8840: 74 6f 72 65 64 20 69 6e 20 2a 70 6e 4f 75 74 2c  tored in *pnOut,
8850: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
8860: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
8870: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8880: 73 2c 20 62 6f 74 68 20 2a 70 6e 4f 75 74 20 61  s, both *pnOut a
8890: 6e 64 20 2a 70 70 4f 75 74 20 61 72 65 0a 2a 2a  nd *ppOut are.**
88a0: 20 7a 65 72 6f 65 64 20 61 6e 64 20 61 6e 20 53   zeroed and an S
88b0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
88c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
88d0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
88e0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
88f0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
8900: 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74  ually call sqlit
8910: 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20  e3_free().** on 
8920: 74 68 65 20 2a 70 70 4f 75 74 20 70 6f 69 6e 74  the *ppOut point
8930: 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62  er to free the b
8940: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  uffer allocation
8950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63   following a suc
8960: 63 65 73 73 66 75 6c 20 0a 2a 2a 20 63 61 6c 6c  cessful .** call
8970: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8980: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  n..**.** WARNING
8990: 2f 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63  /TODO: This func
89a0: 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 61  tion currently a
89b0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
89c0: 69 6e 70 75 74 20 69 73 20 61 20 76 61 6c 69 64  input is a valid
89d0: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 2e 20 49  .** changeset. I
89e0: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
89f0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
8a00: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
8a10: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
8a20: 69 6e 76 65 72 74 28 0a 20 20 69 6e 74 20 6e 49  invert(.  int nI
8a30: 6e 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  n, const void *p
8a40: 49 6e 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 70  In,       /* Inp
8a50: 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ut changeset */.
8a60: 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 76 6f    int *pnOut, vo
8a70: 69 64 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  id **ppOut      
8a80: 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 76 65 72 73    /* OUT: Invers
8a90: 65 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 29 3b  e of input */.);
8aa0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
8ab0: 3a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 54 77  : Concatenate Tw
8ac0: 6f 20 43 68 61 6e 67 65 73 65 74 20 4f 62 6a 65  o Changeset Obje
8ad0: 63 74 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  cts.**.** This f
8ae0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
8af0: 74 6f 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 74  to concatenate t
8b00: 77 6f 20 63 68 61 6e 67 65 73 65 74 73 2c 20 41  wo changesets, A
8b10: 20 61 6e 64 20 42 2c 20 69 6e 74 6f 20 61 20 0a   and B, into a .
8b20: 2a 2a 20 73 69 6e 67 6c 65 20 63 68 61 6e 67 65  ** single change
8b30: 73 65 74 2e 20 54 68 65 20 72 65 73 75 6c 74 20  set. The result 
8b40: 69 73 20 61 20 63 68 61 6e 67 65 73 65 74 20 65  is a changeset e
8b50: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 70 70  quivalent to app
8b60: 6c 79 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  lying.** changes
8b70: 65 74 20 41 20 66 6f 6c 6c 6f 77 65 64 20 62 79  et A followed by
8b80: 20 63 68 61 6e 67 65 73 65 74 20 42 2e 20 0a 2a   changeset B. .*
8b90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8ba0: 6f 6e 20 63 6f 6d 62 69 6e 65 73 20 74 68 65 20  on combines the 
8bb0: 74 77 6f 20 69 6e 70 75 74 20 63 68 61 6e 67 65  two input change
8bc0: 73 65 74 73 20 75 73 69 6e 67 20 61 6e 20 0a 2a  sets using an .*
8bd0: 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
8be0: 67 72 6f 75 70 20 6f 62 6a 65 63 74 2e 20 43 61  group object. Ca
8bf0: 6c 6c 69 6e 67 20 69 74 20 70 72 6f 64 75 63 65  lling it produce
8c00: 73 20 73 69 6d 69 6c 61 72 20 72 65 73 75 6c 74  s similar result
8c10: 73 20 61 73 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  s as the.** foll
8c20: 6f 77 69 6e 67 20 63 6f 64 65 20 66 72 61 67 6d  owing code fragm
8c30: 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 3c 70 72 65 3e  ent:.**.** <pre>
8c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 68  .**   sqlite3_ch
8c50: 61 6e 67 65 67 72 6f 75 70 20 2a 70 47 72 70 3b  angegroup *pGrp;
8c60: 0a 2a 2a 20 20 20 72 63 20 3d 20 73 71 6c 69 74  .**   rc = sqlit
8c70: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e  e3_changegroup_n
8c80: 65 77 28 26 70 47 72 70 29 3b 0a 2a 2a 20 20 20  ew(&pGrp);.**   
8c90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8ca0: 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
8cb0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 28  changegroup_add(
8cc0: 70 47 72 70 2c 20 6e 41 2c 20 70 41 29 3b 0a 2a  pGrp, nA, pA);.*
8cd0: 2a 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  *   if( rc==SQLI
8ce0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
8cf0: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8d00: 61 64 64 28 70 47 72 70 2c 20 6e 42 2c 20 70 42  add(pGrp, nB, pB
8d10: 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d  );.**   if( rc==
8d20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20  SQLITE_OK ){.** 
8d30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8d40: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70  changegroup_outp
8d50: 75 74 28 70 47 72 70 2c 20 70 6e 4f 75 74 2c 20  ut(pGrp, pnOut, 
8d60: 70 70 4f 75 74 29 3b 0a 2a 2a 20 20 20 7d 65 6c  ppOut);.**   }el
8d70: 73 65 7b 0a 2a 2a 20 20 20 20 20 2a 70 70 4f 75  se{.**     *ppOu
8d80: 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 20 20 2a 70  t = 0;.**     *p
8d90: 6e 4f 75 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 7d  nOut = 0;.**   }
8da0: 0a 2a 2a 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a  .** </pre>.**.**
8db0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 71   Refer to the sq
8dc0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
8dd0: 70 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  p documentation 
8de0: 62 65 6c 6f 77 20 66 6f 72 20 64 65 74 61 69 6c  below for detail
8df0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8e00: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
8e10: 74 28 0a 20 20 69 6e 74 20 6e 41 2c 20 20 20 20  t(.  int nA,    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8e40: 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66 65  f bytes in buffe
8e50: 72 20 70 41 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  r pA */.  void *
8e60: 70 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pA,             
8e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8e80: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
8e90: 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65  ontaining change
8ea0: 73 65 74 20 41 20 2a 2f 0a 20 20 69 6e 74 20 6e  set A */.  int n
8eb0: 42 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B,              
8ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8ed0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
8ee0: 20 62 75 66 66 65 72 20 70 42 20 2a 2f 0a 20 20   buffer pB */.  
8ef0: 76 6f 69 64 20 2a 70 42 2c 20 20 20 20 20 20 20  void *pB,       
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
8f20: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
8f30: 63 68 61 6e 67 65 73 65 74 20 42 20 2a 2f 0a 20  changeset B */. 
8f40: 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20   int *pnOut,    
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
8f70: 6f 66 20 62 79 74 65 73 20 69 6e 20 6f 75 74 70  of bytes in outp
8f80: 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ut changeset */.
8f90: 20 20 76 6f 69 64 20 2a 2a 70 70 4f 75 74 20 20    void **ppOut  
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72    /* OUT: Buffer
8fc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70   containing outp
8fd0: 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ut changeset */.
8fe0: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  );.../*.** CAPI3
8ff0: 52 45 46 3a 20 43 68 61 6e 67 65 67 72 6f 75 70  REF: Changegroup
9000: 20 48 61 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20 41 20   Handle.**.** A 
9010: 63 68 61 6e 67 65 67 72 6f 75 70 20 69 73 20 61  changegroup is a
9020: 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  n object used to
9030: 20 63 6f 6d 62 69 6e 65 20 74 77 6f 20 6f 72 20   combine two or 
9040: 6d 6f 72 65 20 0a 2a 2a 20 5b 63 68 61 6e 67 65  more .** [change
9050: 73 65 74 73 5d 20 6f 72 20 5b 70 61 74 63 68 73  sets] or [patchs
9060: 65 74 73 5d 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ets].*/.typedef 
9070: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 63  struct sqlite3_c
9080: 68 61 6e 67 65 67 72 6f 75 70 20 73 71 6c 69 74  hangegroup sqlit
9090: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 3b 0a  e3_changegroup;.
90a0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
90b0: 20 43 72 65 61 74 65 20 41 20 4e 65 77 20 43 68   Create A New Ch
90c0: 61 6e 67 65 67 72 6f 75 70 20 4f 62 6a 65 63 74  angegroup Object
90d0: 0a 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a  .** CONSTRUCTOR:
90e0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
90f0: 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 41 6e 20 73 71  roup.**.** An sq
9100: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
9110: 70 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64  p object is used
9120: 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 77 6f 20   to combine two 
9130: 6f 72 20 6d 6f 72 65 20 63 68 61 6e 67 65 73 65  or more changese
9140: 74 73 0a 2a 2a 20 28 6f 72 20 70 61 74 63 68 73  ts.** (or patchs
9150: 65 74 73 29 20 69 6e 74 6f 20 61 20 73 69 6e 67  ets) into a sing
9160: 6c 65 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72  le changeset (or
9170: 20 70 61 74 63 68 73 65 74 29 2e 20 41 20 73 69   patchset). A si
9180: 6e 67 6c 65 20 63 68 61 6e 67 65 67 72 6f 75 70  ngle changegroup
9190: 0a 2a 2a 20 6f 62 6a 65 63 74 20 6d 61 79 20 63  .** object may c
91a0: 6f 6d 62 69 6e 65 20 63 68 61 6e 67 65 73 65 74  ombine changeset
91b0: 73 20 6f 72 20 70 61 74 63 68 73 65 74 73 2c 20  s or patchsets, 
91c0: 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 54 68  but not both. Th
91d0: 65 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20 61  e output is.** a
91e0: 6c 77 61 79 73 20 69 6e 20 74 68 65 20 73 61 6d  lways in the sam
91f0: 65 20 66 6f 72 6d 61 74 20 61 73 20 74 68 65 20  e format as the 
9200: 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  input..**.** If 
9210: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
9220: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9230: 73 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  s SQLITE_OK and 
9240: 70 6f 70 75 6c 61 74 65 73 20 28 2a 70 70 29 20  populates (*pp) 
9250: 77 69 74 68 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  with.** a pointe
9260: 72 20 74 6f 20 61 20 6e 65 77 20 73 71 6c 69 74  r to a new sqlit
9270: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f  e3_changegroup o
9280: 62 6a 65 63 74 20 62 65 66 6f 72 65 20 72 65 74  bject before ret
9290: 75 72 6e 69 6e 67 2e 20 54 68 65 20 63 61 6c 6c  urning. The call
92a0: 65 72 0a 2a 2a 20 73 68 6f 75 6c 64 20 65 76 65  er.** should eve
92b0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
92c0: 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
92d0: 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
92e0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68 61 6e   .** sqlite3chan
92f0: 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28 29  gegroup_delete()
9300: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
9310: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
9320: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 28 69  error code.** (i
9330: 2e 65 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .e. SQLITE_NOMEM
9340: 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
9350: 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
9360: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
9370: 75 73 75 61 6c 20 75 73 61 67 65 20 70 61 74 74  usual usage patt
9380: 65 72 6e 20 66 6f 72 20 61 6e 20 73 71 6c 69 74  ern for an sqlit
9390: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f  e3_changegroup o
93a0: 62 6a 65 63 74 20 69 73 20 61 73 20 66 6f 6c 6c  bject is as foll
93b0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  ows:.**.** <ul>.
93c0: 2a 2a 20 20 20 3c 6c 69 3e 20 49 74 20 69 73 20  **   <li> It is 
93d0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 61 20  created using a 
93e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63  call to sqlite3c
93f0: 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28 29  hangegroup_new()
9400: 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5a  ..**.**   <li> Z
9410: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 6e  ero or more chan
9420: 67 65 73 65 74 73 20 28 6f 72 20 70 61 74 63 68  gesets (or patch
9430: 73 65 74 73 29 20 61 72 65 20 61 64 64 65 64 20  sets) are added 
9440: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a  to the object.**
9450: 20 20 20 20 20 20 20 20 62 79 20 63 61 6c 6c 69          by calli
9460: 6e 67 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  ng sqlite3change
9470: 67 72 6f 75 70 5f 61 64 64 28 29 2e 0a 2a 2a 0a  group_add()..**.
9480: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 72 65  **   <li> The re
9490: 73 75 6c 74 20 6f 66 20 63 6f 6d 62 69 6e 69 6e  sult of combinin
94a0: 67 20 61 6c 6c 20 69 6e 70 75 74 20 63 68 61 6e  g all input chan
94b0: 67 65 73 65 74 73 20 74 6f 67 65 74 68 65 72 20  gesets together 
94c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 0a 2a 2a 20  is obtained .** 
94d0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 61 70         by the ap
94e0: 70 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20  plication via a 
94f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63  call to sqlite3c
9500: 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75  hangegroup_outpu
9510: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  t()..**.**   <li
9520: 3e 20 54 68 65 20 6f 62 6a 65 63 74 20 69 73 20  > The object is 
9530: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 61 20  deleted using a 
9540: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63  call to sqlite3c
9550: 68 61 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65 74  hangegroup_delet
9560: 65 28 29 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  e()..** </ul>.**
9570: 0a 2a 2a 20 41 6e 79 20 6e 75 6d 62 65 72 20 6f  .** Any number o
9580: 66 20 63 61 6c 6c 73 20 74 6f 20 61 64 64 28 29  f calls to add()
9590: 20 61 6e 64 20 6f 75 74 70 75 74 28 29 20 6d 61   and output() ma
95a0: 79 20 62 65 20 6d 61 64 65 20 62 65 74 77 65 65  y be made betwee
95b0: 6e 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  n the calls to.*
95c0: 2a 20 6e 65 77 28 29 20 61 6e 64 20 64 65 6c 65  * new() and dele
95d0: 74 65 28 29 2c 20 61 6e 64 20 69 6e 20 61 6e 79  te(), and in any
95e0: 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 73   order..**.** As
95f0: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65 67   well as the reg
9600: 75 6c 61 72 20 73 71 6c 69 74 65 33 63 68 61 6e  ular sqlite3chan
9610: 67 65 67 72 6f 75 70 5f 61 64 64 28 29 20 61 6e  gegroup_add() an
9620: 64 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68 61  d .** sqlite3cha
9630: 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28  ngegroup_output(
9640: 29 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 73  ) functions, als
9650: 6f 20 61 76 61 69 6c 61 62 6c 65 20 61 72 65 20  o available are 
9660: 74 68 65 20 73 74 72 65 61 6d 69 6e 67 0a 2a 2a  the streaming.**
9670: 20 76 65 72 73 69 6f 6e 73 20 73 71 6c 69 74 65   versions sqlite
9680: 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64  3changegroup_add
9690: 5f 73 74 72 6d 28 29 20 61 6e 64 20 73 71 6c 69  _strm() and sqli
96a0: 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f  te3changegroup_o
96b0: 75 74 70 75 74 5f 73 74 72 6d 28 29 2e 0a 2a 2f  utput_strm()..*/
96c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
96d0: 67 65 67 72 6f 75 70 5f 6e 65 77 28 73 71 6c 69  gegroup_new(sqli
96e0: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20  te3_changegroup 
96f0: 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41  **pp);../*.** CA
9700: 50 49 33 52 45 46 3a 20 41 64 64 20 41 20 43 68  PI3REF: Add A Ch
9710: 61 6e 67 65 73 65 74 20 54 6f 20 41 20 43 68 61  angeset To A Cha
9720: 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 4d 45 54 48  ngegroup.** METH
9730: 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  OD: sqlite3_chan
9740: 67 65 67 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 41 64  gegroup.**.** Ad
9750: 64 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 77 69  d all changes wi
9760: 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  thin the changes
9770: 65 74 20 28 6f 72 20 70 61 74 63 68 73 65 74 29  et (or patchset)
9780: 20 69 6e 20 62 75 66 66 65 72 20 70 44 61 74 61   in buffer pData
9790: 20 28 73 69 7a 65 0a 2a 2a 20 6e 44 61 74 61 20   (size.** nData 
97a0: 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 63 68  bytes) to the ch
97b0: 61 6e 67 65 67 72 6f 75 70 2e 20 0a 2a 2a 0a 2a  angegroup. .**.*
97c0: 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72 20  * If the buffer 
97d0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 74 63 68  contains a patch
97e0: 73 65 74 2c 20 74 68 65 6e 20 61 6c 6c 20 70 72  set, then all pr
97f0: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ior calls to thi
9800: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 6e  s function.** on
9810: 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e 67 65   the same change
9820: 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 6d 75 73  group object mus
9830: 74 20 61 6c 73 6f 20 68 61 76 65 20 73 70 65 63  t also have spec
9840: 69 66 69 65 64 20 70 61 74 63 68 73 65 74 73 2e  ified patchsets.
9850: 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 20 62   Or, if.** the b
9860: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 73 20 61  uffer contains a
9870: 20 63 68 61 6e 67 65 73 65 74 2c 20 73 6f 20 6d   changeset, so m
9880: 75 73 74 20 68 61 76 65 20 74 68 65 20 65 61 72  ust have the ear
9890: 6c 69 65 72 20 63 61 6c 6c 73 20 74 6f 20 74 68  lier calls to th
98a0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
98b0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
98c0: 45 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72  E_ERROR is retur
98d0: 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67  ned and no chang
98e0: 65 73 20 61 72 65 20 61 64 64 65 64 0a 2a 2a 20  es are added.** 
98f0: 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  to the changegro
9900: 75 70 2e 0a 2a 2a 0a 2a 2a 20 52 6f 77 73 20 77  up..**.** Rows w
9910: 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ithin the change
9920: 73 65 74 20 61 6e 64 20 63 68 61 6e 67 65 67 72  set and changegr
9930: 6f 75 70 20 61 72 65 20 69 64 65 6e 74 69 66 69  oup are identifi
9940: 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 73  ed by the values
9950: 20 69 6e 0a 2a 2a 20 74 68 65 69 72 20 50 52 49   in.** their PRI
9960: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
9970: 2e 20 41 20 63 68 61 6e 67 65 20 69 6e 20 74 68  . A change in th
9980: 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 20 63  e changeset is c
9990: 6f 6e 73 69 64 65 72 65 64 20 74 6f 0a 2a 2a 20  onsidered to.** 
99a0: 61 70 70 6c 79 20 74 6f 20 74 68 65 20 73 61 6d  apply to the sam
99b0: 65 20 72 6f 77 20 61 73 20 61 20 63 68 61 6e 67  e row as a chang
99c0: 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
99d0: 74 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 67  t in the changeg
99e0: 72 6f 75 70 20 69 66 0a 2a 2a 20 74 68 65 20 74  roup if.** the t
99f0: 77 6f 20 72 6f 77 73 20 68 61 76 65 20 74 68 65  wo rows have the
9a00: 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65   same primary ke
9a10: 79 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73  y..**.** Changes
9a20: 20 74 6f 20 72 6f 77 73 20 74 68 61 74 20 64 6f   to rows that do
9a30: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 70 70   not already app
9a40: 65 61 72 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ear in the chang
9a50: 65 67 72 6f 75 70 20 61 72 65 0a 2a 2a 20 73 69  egroup are.** si
9a60: 6d 70 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f  mply copied into
9a70: 20 69 74 2e 20 4f 72 2c 20 69 66 20 62 6f 74 68   it. Or, if both
9a80: 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73   the new changes
9a90: 65 74 20 61 6e 64 20 74 68 65 20 63 68 61 6e 67  et and the chang
9aa0: 65 67 72 6f 75 70 0a 2a 2a 20 63 6f 6e 74 61 69  egroup.** contai
9ab0: 6e 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 61  n changes that a
9ac0: 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67 6c 65  pply to a single
9ad0: 20 72 6f 77 2c 20 74 68 65 20 66 69 6e 61 6c 20   row, the final 
9ae0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
9af0: 2a 2a 20 63 68 61 6e 67 65 67 72 6f 75 70 20 64  ** changegroup d
9b00: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 74 79  epends on the ty
9b10: 70 65 20 6f 66 20 65 61 63 68 20 63 68 61 6e 67  pe of each chang
9b20: 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
9b30: 2a 0a 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64  *.** <table bord
9b40: 65 72 3d 31 20 73 74 79 6c 65 3d 22 6d 61 72 67  er=1 style="marg
9b50: 69 6e 2d 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67  in-left:8ex;marg
9b60: 69 6e 2d 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a  in-right:8ex">.*
9b70: 2a 20 20 20 3c 74 72 3e 3c 74 68 20 73 74 79 6c  *   <tr><th styl
9b80: 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a 70  e="white-space:p
9b90: 72 65 22 3e 45 78 69 73 74 69 6e 67 20 43 68 61  re">Existing Cha
9ba0: 6e 67 65 20 20 3c 2f 74 68 3e 0a 2a 2a 20 20 20  nge  </th>.**   
9bb0: 20 20 20 20 3c 74 68 20 73 74 79 6c 65 3d 22 77      <th style="w
9bc0: 68 69 74 65 2d 73 70 61 63 65 3a 70 72 65 22 3e  hite-space:pre">
9bd0: 4e 65 77 20 43 68 61 6e 67 65 20 20 20 20 20 20  New Change      
9be0: 20 3c 2f 74 68 3e 0a 2a 2a 20 20 20 20 20 20 20   </th>.**       
9bf0: 3c 74 68 3e 4f 75 74 70 75 74 20 43 68 61 6e 67  <th>Output Chang
9c00: 65 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49  e.**   <tr><td>I
9c10: 4e 53 45 52 54 20 3c 74 64 3e 49 4e 53 45 52 54  NSERT <td>INSERT
9c20: 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54   <td>.**       T
9c30: 68 65 20 6e 65 77 20 63 68 61 6e 67 65 20 69 73  he new change is
9c40: 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 63   ignored. This c
9c50: 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ase does not occ
9c60: 75 72 20 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a  ur if the new.**
9c70: 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74         changeset
9c80: 20 77 61 73 20 72 65 63 6f 72 64 65 64 20 69 6d   was recorded im
9c90: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
9ca0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61  the changesets a
9cb0: 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 20 20  lready.**       
9cc0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
9cd0: 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c  ngegroup..**   <
9ce0: 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  tr><td>INSERT <t
9cf0: 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a  d>UPDATE <td>.**
9d00: 20 20 20 20 20 20 20 54 68 65 20 49 4e 53 45 52         The INSER
9d10: 54 20 63 68 61 6e 67 65 20 72 65 6d 61 69 6e 73  T change remains
9d20: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 67 72   in the changegr
9d30: 6f 75 70 2e 20 54 68 65 20 76 61 6c 75 65 73 20  oup. The values 
9d40: 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  in the .**      
9d50: 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 61   INSERT change a
9d60: 72 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 69  re modified as i
9d70: 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 69 6e  f the row was in
9d80: 73 65 72 74 65 64 20 62 79 20 74 68 65 0a 2a 2a  serted by the.**
9d90: 20 20 20 20 20 20 20 65 78 69 73 74 69 6e 67 20         existing 
9da0: 63 68 61 6e 67 65 20 61 6e 64 20 74 68 65 6e 20  change and then 
9db0: 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
9dc0: 67 20 74 6f 20 74 68 65 20 6e 65 77 20 63 68 61  g to the new cha
9dd0: 6e 67 65 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  nge..**   <tr><t
9de0: 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 44 45 4c  d>INSERT <td>DEL
9df0: 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20  ETE <td>.**     
9e00: 20 20 54 68 65 20 65 78 69 73 74 69 6e 67 20 49    The existing I
9e10: 4e 53 45 52 54 20 69 73 20 72 65 6d 6f 76 65 64  NSERT is removed
9e20: 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
9e30: 67 72 6f 75 70 2e 20 54 68 65 20 44 45 4c 45 54  group. The DELET
9e40: 45 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  E is.**       no
9e50: 74 20 61 64 64 65 64 2e 0a 2a 2a 20 20 20 3c 74  t added..**   <t
9e60: 72 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64  r><td>UPDATE <td
9e70: 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20  >INSERT <td>.** 
9e80: 20 20 20 20 20 20 54 68 65 20 6e 65 77 20 63 68        The new ch
9e90: 61 6e 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e  ange is ignored.
9ea0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
9eb0: 6e 6f 74 20 6f 63 63 75 72 20 69 66 20 74 68 65  not occur if the
9ec0: 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68   new.**       ch
9ed0: 61 6e 67 65 73 65 74 20 77 61 73 20 72 65 63 6f  angeset was reco
9ee0: 72 64 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rded immediately
9ef0: 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
9f00: 65 73 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a  esets already.**
9f10: 20 20 20 20 20 20 20 61 64 64 65 64 20 74 6f 20         added to 
9f20: 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e  the changegroup.
9f30: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50  .**   <tr><td>UP
9f40: 44 41 54 45 20 3c 74 64 3e 55 50 44 41 54 45 20  DATE <td>UPDATE 
9f50: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68  <td>.**       Th
9f60: 65 20 65 78 69 73 74 69 6e 67 20 55 50 44 41 54  e existing UPDAT
9f70: 45 20 72 65 6d 61 69 6e 73 20 77 69 74 68 69 6e  E remains within
9f80: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
9f90: 2e 20 49 74 20 69 73 20 61 6d 65 6e 64 65 64 20  . It is amended 
9fa0: 0a 2a 2a 20 20 20 20 20 20 20 73 6f 20 74 68 61  .**       so tha
9fb0: 74 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  t the accompanyi
9fc0: 6e 67 20 76 61 6c 75 65 73 20 61 72 65 20 61 73  ng values are as
9fd0: 20 69 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   if the row was 
9fe0: 75 70 64 61 74 65 64 20 6f 6e 63 65 20 0a 2a 2a  updated once .**
9ff0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 65 78         by the ex
a000: 69 73 74 69 6e 67 20 63 68 61 6e 67 65 20 61 6e  isting change an
a010: 64 20 74 68 65 6e 20 61 67 61 69 6e 20 62 79 20  d then again by 
a020: 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 2e 0a  the new change..
a030: 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50 44  **   <tr><td>UPD
a040: 41 54 45 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c  ATE <td>DELETE <
a050: 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  td>.**       The
a060: 20 65 78 69 73 74 69 6e 67 20 55 50 44 41 54 45   existing UPDATE
a070: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
a080: 74 68 65 20 6e 65 77 20 44 45 4c 45 54 45 20 77  the new DELETE w
a090: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ithin the.**    
a0a0: 20 20 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a     changegroup..
a0b0: 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c  **   <tr><td>DEL
a0c0: 45 54 45 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c  ETE <td>INSERT <
a0d0: 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 49 66 20  td>.**       If 
a0e0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
a0f0: 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
a100: 20 69 6e 20 74 68 65 20 72 6f 77 20 69 6e 73 65   in the row inse
a110: 72 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 20  rted by the.**  
a120: 20 20 20 20 20 6e 65 77 20 63 68 61 6e 67 65 20       new change 
a130: 64 69 66 66 65 72 20 66 72 6f 6d 20 74 68 6f 73  differ from thos
a140: 65 20 69 6e 20 74 68 65 20 72 6f 77 20 64 65 6c  e in the row del
a150: 65 74 65 64 20 62 79 20 74 68 65 20 65 78 69 73  eted by the exis
a160: 74 69 6e 67 20 0a 2a 2a 20 20 20 20 20 20 20 63  ting .**       c
a170: 68 61 6e 67 65 2c 20 74 68 65 20 65 78 69 73 74  hange, the exist
a180: 69 6e 67 20 44 45 4c 45 54 45 20 69 73 20 72 65  ing DELETE is re
a190: 70 6c 61 63 65 64 20 62 79 20 61 6e 20 55 50 44  placed by an UPD
a1a0: 41 54 45 20 77 69 74 68 69 6e 20 74 68 65 0a 2a  ATE within the.*
a1b0: 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 67 72  *       changegr
a1c0: 6f 75 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  oup. Otherwise, 
a1d0: 69 66 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  if the inserted 
a1e0: 72 6f 77 20 69 73 20 65 78 61 63 74 6c 79 20 74  row is exactly t
a1f0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 20 20 20 20  he same .**     
a200: 20 20 61 73 20 74 68 65 20 64 65 6c 65 74 65 64    as the deleted
a210: 20 72 6f 77 2c 20 74 68 65 20 65 78 69 73 74 69   row, the existi
a220: 6e 67 20 44 45 4c 45 54 45 20 69 73 20 73 69 6d  ng DELETE is sim
a230: 70 6c 79 20 64 69 73 63 61 72 64 65 64 2e 0a 2a  ply discarded..*
a240: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45  *   <tr><td>DELE
a250: 54 45 20 3c 74 64 3e 55 50 44 41 54 45 20 3c 74  TE <td>UPDATE <t
a260: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
a270: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
a280: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
a290: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
a2a0: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
a2b0: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
a2c0: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
a2d0: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
a2e0: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
a2f0: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
a300: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
a310: 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e  group..**   <tr>
a320: 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 44  <td>DELETE <td>D
a330: 45 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  ELETE <td>.**   
a340: 20 20 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e      The new chan
a350: 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54  ge is ignored. T
a360: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
a370: 74 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e  t occur if the n
a380: 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e  ew.**       chan
a390: 67 65 73 65 74 20 77 61 73 20 72 65 63 6f 72 64  geset was record
a3a0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
a3b0: 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 73  fter the changes
a3c0: 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ets already.**  
a3d0: 20 20 20 20 20 61 64 64 65 64 20 74 6f 20 74 68       added to th
a3e0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a  e changegroup..*
a3f0: 2a 20 3c 2f 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  * </table>.**.**
a400: 20 49 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e   If the new chan
a410: 67 65 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 63  geset contains c
a420: 68 61 6e 67 65 73 20 74 6f 20 61 20 74 61 62 6c  hanges to a tabl
a430: 65 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  e that is alread
a440: 79 20 70 72 65 73 65 6e 74 0a 2a 2a 20 69 6e 20  y present.** in 
a450: 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2c  the changegroup,
a460: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
a470: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20   of columns and 
a480: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  the position of 
a490: 74 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b  the.** primary k
a4a0: 65 79 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74  ey columns for t
a4b0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
a4c0: 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20   consistent. If 
a4d0: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 0a  this is not the.
a4e0: 2a 2a 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  ** case, this fu
a4f0: 6e 63 74 69 6f 6e 20 66 61 69 6c 73 20 77 69 74  nction fails wit
a500: 68 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e  h SQLITE_SCHEMA.
a510: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 63 68   If the input ch
a520: 61 6e 67 65 73 65 74 0a 2a 2a 20 61 70 70 65 61  angeset.** appea
a530: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
a540: 20 61 6e 64 20 74 68 65 20 63 6f 72 72 75 70 74   and the corrupt
a550: 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 2c  ion is detected,
a560: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a570: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
a580: 4f 72 2c 20 69 66 20 61 6e 20 6f 75 74 2d 6f 66  Or, if an out-of
a590: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f  -memory conditio
a5a0: 6e 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  n occurs during 
a5b0: 70 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 69 73  processing, this
a5c0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
a5d0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urns SQLITE_NOME
a5e0: 4d 2e 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  M. In all cases,
a5f0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
a600: 75 72 73 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c  urs the.** final
a610: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
a620: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 69 73 20   changegroup is 
a630: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
a640: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
a650: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
a660: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
a670: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
a680: 67 72 6f 75 70 5f 61 64 64 28 73 71 6c 69 74 65  group_add(sqlite
a690: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c 20  3_changegroup*, 
a6a0: 69 6e 74 20 6e 44 61 74 61 2c 20 76 6f 69 64 20  int nData, void 
a6b0: 2a 70 44 61 74 61 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *pData);../*.** 
a6c0: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
a6d0: 20 41 20 43 6f 6d 70 6f 73 69 74 65 20 43 68 61   A Composite Cha
a6e0: 6e 67 65 73 65 74 20 46 72 6f 6d 20 41 20 43 68  ngeset From A Ch
a6f0: 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 4d 45 54  angegroup.** MET
a700: 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  HOD: sqlite3_cha
a710: 6e 67 65 67 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 4f  ngegroup.**.** O
a720: 62 74 61 69 6e 20 61 20 62 75 66 66 65 72 20 63  btain a buffer c
a730: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 68 61 6e  ontaining a chan
a740: 67 65 73 65 74 20 28 6f 72 20 70 61 74 63 68 73  geset (or patchs
a750: 65 74 29 20 72 65 70 72 65 73 65 6e 74 69 6e 67  et) representing
a760: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
a770: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
a780: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 49 66 20  changegroup. If 
a790: 74 68 65 20 69 6e 70 75 74 73 20 74 6f 20 74 68  the inputs to th
a7a0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a  e changegroup.**
a7b0: 20 77 65 72 65 20 74 68 65 6d 73 65 6c 76 65 73   were themselves
a7c0: 20 63 68 61 6e 67 65 73 65 74 73 2c 20 74 68 65   changesets, the
a7d0: 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 68 61   output is a cha
a7e0: 6e 67 65 73 65 74 2e 20 4f 72 2c 20 69 66 20 74  ngeset. Or, if t
a7f0: 68 65 0a 2a 2a 20 69 6e 70 75 74 73 20 77 65 72  he.** inputs wer
a800: 65 20 70 61 74 63 68 73 65 74 73 2c 20 74 68 65  e patchsets, the
a810: 20 6f 75 74 70 75 74 20 69 73 20 61 6c 73 6f 20   output is also 
a820: 61 20 70 61 74 63 68 73 65 74 2e 0a 2a 2a 0a 2a  a patchset..**.*
a830: 2a 20 41 73 20 77 69 74 68 20 74 68 65 20 6f 75  * As with the ou
a840: 74 70 75 74 20 6f 66 20 74 68 65 20 73 71 6c 69  tput of the sqli
a850: 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67  te3session_chang
a860: 65 73 65 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71  eset() and.** sq
a870: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
a880: 63 68 73 65 74 28 29 20 66 75 6e 63 74 69 6f 6e  chset() function
a890: 73 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 72  s, all changes r
a8a0: 65 6c 61 74 65 64 20 74 6f 20 61 20 73 69 6e 67  elated to a sing
a8b0: 6c 65 0a 2a 2a 20 74 61 62 6c 65 20 61 72 65 20  le.** table are 
a8c0: 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
a8d0: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 6f   in the output o
a8e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
a8f0: 20 54 61 62 6c 65 73 20 61 70 70 65 61 72 0a 2a   Tables appear.*
a900: 2a 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  * in the same or
a910: 64 65 72 20 61 73 20 66 6f 72 20 74 68 65 20 76  der as for the v
a920: 65 72 79 20 66 69 72 73 74 20 63 68 61 6e 67 65  ery first change
a930: 73 65 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  set added to the
a940: 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a   changegroup..**
a950: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 6f   If the second o
a960: 72 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61  r subsequent cha
a970: 6e 67 65 73 65 74 73 20 61 64 64 65 64 20 74 6f  ngesets added to
a980: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
a990: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 63 68 61 6e   contain.** chan
a9a0: 67 65 73 20 66 6f 72 20 74 61 62 6c 65 73 20 74  ges for tables t
a9b0: 68 61 74 20 64 6f 20 6e 6f 74 20 61 70 70 65 61  hat do not appea
a9c0: 72 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 63  r in the first c
a9d0: 68 61 6e 67 65 73 65 74 2c 20 74 68 65 79 20 61  hangeset, they a
a9e0: 72 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 6f  re.** appended o
a9f0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
aa00: 68 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67 65  he output change
aa10: 73 65 74 2c 20 61 67 61 69 6e 20 69 6e 20 74 68  set, again in th
aa20: 65 20 6f 72 64 65 72 20 69 6e 0a 2a 2a 20 77 68  e order in.** wh
aa30: 69 63 68 20 74 68 65 79 20 61 72 65 20 66 69 72  ich they are fir
aa40: 73 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  st encountered..
aa50: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
aa60: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
aa70: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
aa80: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
aa90: 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 76 61 72  he output.** var
aaa0: 69 61 62 6c 65 73 20 28 2a 70 6e 44 61 74 61 29  iables (*pnData)
aab0: 20 61 6e 64 20 28 2a 70 70 44 61 74 61 29 20 61   and (*ppData) a
aac0: 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68  re set to 0. Oth
aad0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
aae0: 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
aaf0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20   and the output 
ab00: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 73 65  variables are se
ab10: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
ab20: 20 61 6e 64 20 61 20 0a 2a 2a 20 70 6f 69 6e 74   and a .** point
ab30: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  er to the output
ab40: 20 62 75 66 66 65 72 2c 20 72 65 73 70 65 63 74   buffer, respect
ab50: 69 76 65 6c 79 2e 20 49 6e 20 74 68 69 73 20 63  ively. In this c
ab60: 61 73 65 20 69 74 20 69 73 20 74 68 65 0a 2a 2a  ase it is the.**
ab70: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
ab80: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
ab90: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
aba0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 69 6e   the buffer usin
abb0: 67 20 61 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  g a.** call to s
abc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
abd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
abe0: 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28  ngegroup_output(
abf0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
ac00: 65 67 72 6f 75 70 2a 2c 0a 20 20 69 6e 74 20 2a  egroup*,.  int *
ac10: 70 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  pnData,         
ac20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ac30: 54 3a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  T: Size of outpu
ac40: 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
ac50: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  s */.  void **pp
ac60: 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20  Data            
ac70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
ac80: 6f 69 6e 74 65 72 20 74 6f 20 6f 75 74 70 75 74  ointer to output
ac90: 20 62 75 66 66 65 72 20 2a 2f 0a 29 3b 0a 0a 2f   buffer */.);../
aca0: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
acb0: 65 6c 65 74 65 20 41 20 43 68 61 6e 67 65 67 72  elete A Changegr
acc0: 6f 75 70 20 4f 62 6a 65 63 74 0a 2a 2a 20 44 45  oup Object.** DE
acd0: 53 54 52 55 43 54 4f 52 3a 20 73 71 6c 69 74 65  STRUCTOR: sqlite
ace0: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2f  3_changegroup.*/
acf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 63 68 61  .void sqlite3cha
ad00: 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28  ngegroup_delete(
ad10: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
ad20: 6f 75 70 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41  oup*);../*.** CA
ad30: 50 49 33 52 45 46 3a 20 41 70 70 6c 79 20 41 20  PI3REF: Apply A 
ad40: 43 68 61 6e 67 65 73 65 74 20 54 6f 20 41 20 44  Changeset To A D
ad50: 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 41 70  atabase.**.** Ap
ad60: 70 6c 79 20 61 20 63 68 61 6e 67 65 73 65 74 20  ply a changeset 
ad70: 6f 72 20 70 61 74 63 68 73 65 74 20 74 6f 20 61  or patchset to a
ad80: 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 73 65   database. These
ad90: 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 74 65 6d   functions attem
ada0: 70 74 20 74 6f 0a 2a 2a 20 75 70 64 61 74 65 20  pt to.** update 
adb0: 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62  the "main" datab
adc0: 61 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  ase attached to 
add0: 68 61 6e 64 6c 65 20 64 62 20 77 69 74 68 20 74  handle db with t
ade0: 68 65 20 63 68 61 6e 67 65 73 20 66 6f 75 6e 64  he changes found
adf0: 20 69 6e 0a 2a 2a 20 74 68 65 20 63 68 61 6e 67   in.** the chang
ae00: 65 73 65 74 20 70 61 73 73 65 64 20 76 69 61 20  eset passed via 
ae10: 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
ae20: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  hird arguments. 
ae30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 75 72 74  .**.** The fourt
ae40: 68 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  h argument (xFil
ae50: 74 65 72 29 20 70 61 73 73 65 64 20 74 6f 20 74  ter) passed to t
ae60: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hese functions i
ae70: 73 20 74 68 65 20 22 66 69 6c 74 65 72 0a 2a 2a  s the "filter.**
ae80: 20 63 61 6c 6c 62 61 63 6b 22 2e 20 49 66 20 69   callback". If i
ae90: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
aea0: 68 65 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62  hen for each tab
aeb0: 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20 61  le affected by a
aec0: 74 20 6c 65 61 73 74 20 6f 6e 65 0a 2a 2a 20 63  t least one.** c
aed0: 68 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61  hange in the cha
aee0: 6e 67 65 73 65 74 2c 20 74 68 65 20 66 69 6c 74  ngeset, the filt
aef0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
af00: 6e 76 6f 6b 65 64 20 77 69 74 68 0a 2a 2a 20 74  nvoked with.** t
af10: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 73  he table name as
af20: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
af30: 6d 65 6e 74 2c 20 61 6e 64 20 61 20 63 6f 70 79  ment, and a copy
af40: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 78 74 20   of the context 
af50: 70 6f 69 6e 74 65 72 0a 2a 2a 20 70 61 73 73 65  pointer.** passe
af60: 64 20 61 73 20 74 68 65 20 73 69 78 74 68 20 61  d as the sixth a
af70: 72 67 75 6d 65 6e 74 20 61 73 20 74 68 65 20 66  rgument as the f
af80: 69 72 73 74 2e 20 49 66 20 74 68 65 20 22 66 69  irst. If the "fi
af90: 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 0a 2a  lter callback".*
afa0: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  * returns zero, 
afb0: 74 68 65 6e 20 6e 6f 20 61 74 74 65 6d 70 74 20  then no attempt 
afc0: 69 73 20 6d 61 64 65 20 74 6f 20 61 70 70 6c 79  is made to apply
afd0: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
afe0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 4f 74  the table..** Ot
aff0: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
b000: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
b010: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
b020: 78 46 69 6c 74 65 72 20 61 72 67 75 6d 65 6e 74  xFilter argument
b030: 20 74 6f 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20   to.** is NULL, 
b040: 61 6c 6c 20 63 68 61 6e 67 65 73 20 72 65 6c 61  all changes rela
b050: 74 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ted to the table
b060: 20 61 72 65 20 61 74 74 65 6d 70 74 65 64 2e 0a   are attempted..
b070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
b080: 61 62 6c 65 20 74 68 61 74 20 69 73 20 6e 6f 74  able that is not
b090: 20 65 78 63 6c 75 64 65 64 20 62 79 20 74 68 65   excluded by the
b0a0: 20 66 69 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b   filter callback
b0b0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
b0c0: 0a 2a 2a 20 74 65 73 74 73 20 74 68 61 74 20 74  .** tests that t
b0d0: 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
b0e0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  se contains a co
b0f0: 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2e 20  mpatible table. 
b100: 41 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a 20 63  A table is .** c
b110: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6d 70 61 74  onsidered compat
b120: 69 62 6c 65 20 69 66 20 61 6c 6c 20 6f 66 20 74  ible if all of t
b130: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
b140: 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c   true:.**.** <ul
b150: 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20  >.**   <li> The 
b160: 74 61 62 6c 65 20 68 61 73 20 74 68 65 20 73 61  table has the sa
b170: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6e  me name as the n
b180: 61 6d 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20  ame recorded in 
b190: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  the .**        c
b1a0: 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 2a 2a  hangeset, and.**
b1b0: 20 20 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c     <li> The tabl
b1c0: 65 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  e has at least a
b1d0: 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
b1e0: 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  s recorded in th
b1f0: 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61  e .**        cha
b200: 6e 67 65 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20  ngeset, and.**  
b210: 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20   <li> The table 
b220: 68 61 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20  has primary key 
b230: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
b240: 61 6d 65 20 70 6f 73 69 74 69 6f 6e 20 61 73 20  ame position as 
b250: 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 6f 72  .**        recor
b260: 64 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ded in the chang
b270: 65 73 65 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  eset..** </ul>.*
b280: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
b290: 20 6e 6f 20 63 6f 6d 70 61 74 69 62 6c 65 20 74   no compatible t
b2a0: 61 62 6c 65 2c 20 69 74 20 69 73 20 6e 6f 74 20  able, it is not 
b2b0: 61 6e 20 65 72 72 6f 72 2c 20 62 75 74 20 6e 6f  an error, but no
b2c0: 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61  ne of the.** cha
b2d0: 6e 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  nges associated 
b2e0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
b2f0: 72 65 20 61 70 70 6c 69 65 64 2e 20 41 20 77 61  re applied. A wa
b300: 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 20 69 73  rning message is
b310: 20 69 73 73 75 65 64 0a 2a 2a 20 76 69 61 20 74   issued.** via t
b320: 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  he sqlite3_log()
b330: 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 74 68 20   mechanism with 
b340: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 53  the error code S
b350: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 41 74  QLITE_SCHEMA. At
b360: 20 6d 6f 73 74 0a 2a 2a 20 6f 6e 65 20 73 75 63   most.** one suc
b370: 68 20 77 61 72 6e 69 6e 67 20 69 73 20 69 73 73  h warning is iss
b380: 75 65 64 20 66 6f 72 20 65 61 63 68 20 74 61 62  ued for each tab
b390: 6c 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  le in the change
b3a0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  set..**.** For e
b3b0: 61 63 68 20 63 68 61 6e 67 65 20 66 6f 72 20 77  ach change for w
b3c0: 68 69 63 68 20 74 68 65 72 65 20 69 73 20 61 20  hich there is a 
b3d0: 63 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65  compatible table
b3e0: 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
b3f0: 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 6d 6f 64 69  made .** to modi
b400: 66 79 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  fy the table con
b410: 74 65 6e 74 73 20 61 63 63 6f 72 64 69 6e 67 20  tents according 
b420: 74 6f 20 74 68 65 20 55 50 44 41 54 45 2c 20 49  to the UPDATE, I
b430: 4e 53 45 52 54 20 6f 72 20 44 45 4c 45 54 45 20  NSERT or DELETE 
b440: 0a 2a 2a 20 63 68 61 6e 67 65 2e 20 49 66 20 61  .** change. If a
b450: 20 63 68 61 6e 67 65 20 63 61 6e 6e 6f 74 20 62   change cannot b
b460: 65 20 61 70 70 6c 69 65 64 20 63 6c 65 61 6e 6c  e applied cleanl
b470: 79 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  y, the conflict 
b480: 68 61 6e 64 6c 65 72 20 0a 2a 2a 20 66 75 6e 63  handler .** func
b490: 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
b4a0: 68 65 20 66 69 66 74 68 20 61 72 67 75 6d 65 6e  he fifth argumen
b4b0: 74 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e  t to sqlite3chan
b4c0: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20 6d 61  geset_apply() ma
b4d0: 79 20 62 65 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64  y be .** invoked
b4e0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
b4f0: 6f 66 20 65 78 61 63 74 6c 79 20 77 68 65 6e 20  of exactly when 
b500: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
b510: 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20  dler is invoked 
b520: 66 6f 72 20 0a 2a 2a 20 65 61 63 68 20 74 79 70  for .** each typ
b530: 65 20 6f 66 20 63 68 61 6e 67 65 20 69 73 20 62  e of change is b
b540: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69  elow..**.** Unli
b550: 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 61  ke the xFilter a
b560: 72 67 75 6d 65 6e 74 2c 20 78 43 6f 6e 66 6c 69  rgument, xConfli
b570: 63 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 61  ct may not be pa
b580: 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68 65 20 72  ssed NULL. The r
b590: 65 73 75 6c 74 73 0a 2a 2a 20 6f 66 20 70 61 73  esults.** of pas
b5a0: 73 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 6f 74  sing anything ot
b5b0: 68 65 72 20 74 68 61 6e 20 61 20 76 61 6c 69 64  her than a valid
b5c0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
b5d0: 72 20 61 73 20 74 68 65 20 78 43 6f 6e 66 6c 69  r as the xConfli
b5e0: 63 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61  ct.** argument a
b5f0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  re undefined..**
b600: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 74 68  .** Each time th
b610: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
b620: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
b630: 6e 76 6f 6b 65 64 2c 20 69 74 20 6d 75 73 74 20  nvoked, it must 
b640: 72 65 74 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66  return one.** of
b650: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
b660: 45 54 5f 4f 4d 49 54 5d 2c 20 5b 53 51 4c 49 54  ET_OMIT], [SQLIT
b670: 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52  E_CHANGESET_ABOR
b680: 54 5d 20 6f 72 20 0a 2a 2a 20 5b 53 51 4c 49 54  T] or .** [SQLIT
b690: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
b6a0: 41 43 45 5d 2e 20 53 51 4c 49 54 45 5f 43 48 41  ACE]. SQLITE_CHA
b6b0: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 6d  NGESET_REPLACE m
b6c0: 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 74 75 72  ay only be retur
b6d0: 6e 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 73 65  ned.** if the se
b6e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61  cond argument pa
b6f0: 73 73 65 64 20 74 6f 20 74 68 65 20 63 6f 6e 66  ssed to the conf
b700: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20  lict handler is 
b710: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
b720: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
b730: 6f 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  or SQLITE_CHANGE
b740: 53 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66  SET_CONFLICT. If
b750: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
b760: 6e 64 6c 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  ndler.** returns
b770: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75   an illegal valu
b780: 65 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  e, any changes a
b790: 6c 72 65 61 64 79 20 6d 61 64 65 20 61 72 65 20  lready made are 
b7a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a  rolled back and.
b7b0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** the call to s
b7c0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
b7d0: 61 70 70 6c 79 28 29 20 72 65 74 75 72 6e 73 20  apply() returns 
b7e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 44  SQLITE_MISUSE. D
b7f0: 69 66 66 65 72 65 6e 74 20 0a 2a 2a 20 61 63 74  ifferent .** act
b800: 69 6f 6e 73 20 61 72 65 20 74 61 6b 65 6e 20 62  ions are taken b
b810: 79 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  y sqlite3changes
b820: 65 74 5f 61 70 70 6c 79 28 29 20 64 65 70 65 6e  et_apply() depen
b830: 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
b840: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79  e.** returned by
b850: 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
b860: 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   of the conflict
b870: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
b880: 6e 2e 20 52 65 66 65 72 20 74 6f 0a 2a 2a 20 74  n. Refer to.** t
b890: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
b8a0: 20 66 6f 72 20 74 68 65 20 74 68 72 65 65 20 0a   for the three .
b8b0: 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  ** [SQLITE_CHANG
b8c0: 45 53 45 54 5f 4f 4d 49 54 7c 61 76 61 69 6c 61  ESET_OMIT|availa
b8d0: 62 6c 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ble return value
b8e0: 73 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  s] for details..
b8f0: 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64  **.** <dl>.** <d
b900: 74 3e 44 45 4c 45 54 45 20 43 68 61 6e 67 65 73  t>DELETE Changes
b910: 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f 72 20 65 61  <dd>.**   For ea
b920: 63 68 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ch DELETE change
b930: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  , the function c
b940: 68 65 63 6b 73 20 69 66 20 74 68 65 20 74 61 72  hecks if the tar
b950: 67 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  get database .**
b960: 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f     contains a ro
b970: 77 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  w with the same 
b980: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
b990: 65 20 28 6f 72 20 76 61 6c 75 65 73 29 20 61 73  e (or values) as
b9a0: 20 74 68 65 20 0a 2a 2a 20 20 20 6f 72 69 67 69   the .**   origi
b9b0: 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73  nal row values s
b9c0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 68 61  tored in the cha
b9d0: 6e 67 65 73 65 74 2e 20 49 66 20 69 74 20 64 6f  ngeset. If it do
b9e0: 65 73 2c 20 61 6e 64 20 74 68 65 20 76 61 6c 75  es, and the valu
b9f0: 65 73 20 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20  es .**   stored 
ba00: 69 6e 20 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61  in all non-prima
ba10: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61  ry key columns a
ba20: 6c 73 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61  lso match the va
ba30: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 0a  lues stored in .
ba40: 2a 2a 20 20 20 74 68 65 20 63 68 61 6e 67 65 73  **   the changes
ba50: 65 74 20 74 68 65 20 72 6f 77 20 69 73 20 64 65  et the row is de
ba60: 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74  leted from the t
ba70: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 0a  arget database..
ba80: 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f 77  **.**   If a row
ba90: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70   with matching p
baa0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
bab0: 73 20 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20  s is found, but 
bac0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a  one or more of.*
bad0: 2a 20 20 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d  *   the non-prim
bae0: 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 63  ary key fields c
baf0: 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20  ontains a value 
bb00: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
bb10: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
bb20: 20 72 6f 77 20 76 61 6c 75 65 20 73 74 6f 72 65   row value store
bb30: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
bb40: 65 74 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  et, the conflict
bb50: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
bb60: 6e 20 69 73 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65  n is.**   invoke
bb70: 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43  d with [SQLITE_C
bb80: 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20 61  HANGESET_DATA] a
bb90: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
bba0: 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 0a 2a 2a  ument. If the.**
bbb0: 20 20 20 64 61 74 61 62 61 73 65 20 74 61 62 6c     database tabl
bbc0: 65 20 68 61 73 20 6d 6f 72 65 20 63 6f 6c 75 6d  e has more colum
bbd0: 6e 73 20 74 68 61 6e 20 61 72 65 20 72 65 63 6f  ns than are reco
bbe0: 72 64 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e  rded in the chan
bbf0: 67 65 73 65 74 2c 0a 2a 2a 20 20 20 6f 6e 6c 79  geset,.**   only
bc00: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
bc10: 68 6f 73 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79  hose non-primary
bc20: 20 6b 65 79 20 66 69 65 6c 64 73 20 61 72 65 20   key fields are 
bc30: 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74  compared against
bc40: 0a 2a 2a 20 20 20 74 68 65 20 63 75 72 72 65 6e  .**   the curren
bc50: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  t database conte
bc60: 6e 74 73 20 2d 20 61 6e 79 20 74 72 61 69 6c 69  nts - any traili
bc70: 6e 67 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ng database tabl
bc80: 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 61  e columns.**   a
bc90: 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
bca0: 2a 20 20 20 49 66 20 6e 6f 20 72 6f 77 20 77 69  *   If no row wi
bcb0: 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d  th matching prim
bcc0: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ary key values i
bcd0: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
bce0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 20 20 74 68  atabase,.**   th
bcf0: 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  e conflict-handl
bd00: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
bd10: 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b 53 51 4c  nvoked with [SQL
bd20: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f  ITE_CHANGESET_NO
bd30: 54 46 4f 55 4e 44 5d 0a 2a 2a 20 20 20 70 61 73  TFOUND].**   pas
bd40: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
bd50: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
bd60: 2a 20 20 20 49 66 20 74 68 65 20 44 45 4c 45 54  *   If the DELET
bd70: 45 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  E operation is a
bd80: 74 74 65 6d 70 74 65 64 2c 20 62 75 74 20 53 51  ttempted, but SQ
bd90: 4c 69 74 65 20 72 65 74 75 72 6e 73 20 53 51 4c  Lite returns SQL
bda0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
bdb0: 2a 20 20 20 28 77 68 69 63 68 20 63 61 6e 20 6f  *   (which can o
bdc0: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20  nly happen if a 
bdd0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
bde0: 74 72 61 69 6e 74 20 69 73 20 76 69 6f 6c 61 74  traint is violat
bdf0: 65 64 29 2c 20 74 68 65 0a 2a 2a 20 20 20 63 6f  ed), the.**   co
be00: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
be10: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
be20: 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f  ed with [SQLITE_
be30: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
be40: 41 49 4e 54 5d 0a 2a 2a 20 20 20 70 61 73 73 65  AINT].**   passe
be50: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
be60: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69  argument. This i
be70: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 61 73 65  ncludes the case
be80: 20 77 68 65 72 65 20 74 68 65 20 44 45 4c 45 54   where the DELET
be90: 45 0a 2a 2a 20 20 20 6f 70 65 72 61 74 69 6f 6e  E.**   operation
bea0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 62 65   is attempted be
beb0: 63 61 75 73 65 20 61 6e 20 65 61 72 6c 69 65 72  cause an earlier
bec0: 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e   call to the con
bed0: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a  flict handler.**
bee0: 20 20 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75     function retu
bef0: 72 6e 65 64 20 5b 53 51 4c 49 54 45 5f 43 48 41  rned [SQLITE_CHA
bf00: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e  NGESET_REPLACE].
bf10: 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 49 4e 53 45 52  .**.** <dt>INSER
bf20: 54 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a  T Changes<dd>.**
bf30: 20 20 20 46 6f 72 20 65 61 63 68 20 49 4e 53 45     For each INSE
bf40: 52 54 20 63 68 61 6e 67 65 2c 20 61 6e 20 61 74  RT change, an at
bf50: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
bf60: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   insert the new 
bf70: 72 6f 77 20 69 6e 74 6f 0a 2a 2a 20 20 20 74 68  row into.**   th
bf80: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
bf90: 68 65 20 63 68 61 6e 67 65 73 65 74 20 72 6f 77  he changeset row
bfa0: 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
bfb0: 66 69 65 6c 64 73 20 74 68 61 6e 20 74 68 65 0a  fields than the.
bfc0: 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20 74 61  **   database ta
bfd0: 62 6c 65 2c 20 74 68 65 20 74 72 61 69 6c 69 6e  ble, the trailin
bfe0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  g fields are pop
bff0: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 69  ulated with thei
c000: 72 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 76  r default.**   v
c010: 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  alues..**.**   I
c020: 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
c030: 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f 77 20   insert the row 
c040: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 74 68  fails because th
c050: 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
c060: 64 79 20 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  dy .**   contain
c070: 73 20 61 20 72 6f 77 20 77 69 74 68 20 74 68 65  s a row with the
c080: 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65   same primary ke
c090: 79 20 76 61 6c 75 65 73 2c 20 74 68 65 20 63 6f  y values, the co
c0a0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a 2a  nflict handler.*
c0b0: 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  *   function is 
c0c0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 74 68 65  invoked with the
c0d0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
c0e0: 20 73 65 74 20 74 6f 20 0a 2a 2a 20 20 20 5b 53   set to .**   [S
c0f0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
c100: 43 4f 4e 46 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a 2a  CONFLICT]..**.**
c110: 20 20 20 49 66 20 74 68 65 20 61 74 74 65 6d 70     If the attemp
c120: 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  t to insert the 
c130: 72 6f 77 20 66 61 69 6c 73 20 62 65 63 61 75 73  row fails becaus
c140: 65 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e of some other 
c150: 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
c160: 76 69 6f 6c 61 74 69 6f 6e 20 28 65 2e 67 2e 20  violation (e.g. 
c170: 4e 4f 54 20 4e 55 4c 4c 20 6f 72 20 55 4e 49 51  NOT NULL or UNIQ
c180: 55 45 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63  UE), the conflic
c190: 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t handler functi
c1a0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 69 6e 76 6f  on is .**   invo
c1b0: 6b 65 64 20 77 69 74 68 20 74 68 65 20 73 65 63  ked with the sec
c1c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 65 74  ond argument set
c1d0: 20 74 6f 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e   to [SQLITE_CHAN
c1e0: 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54  GESET_CONSTRAINT
c1f0: 5d 2e 0a 2a 2a 20 20 20 54 68 69 73 20 69 6e 63  ]..**   This inc
c200: 6c 75 64 65 73 20 74 68 65 20 63 61 73 65 20 77  ludes the case w
c210: 68 65 72 65 20 74 68 65 20 49 4e 53 45 52 54 20  here the INSERT 
c220: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65 2d  operation is re-
c230: 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75 73  attempted becaus
c240: 65 20 0a 2a 2a 20 20 20 61 6e 20 65 61 72 6c 69  e .**   an earli
c250: 65 72 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63  er call to the c
c260: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
c270: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
c280: 64 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f  d .**   [SQLITE_
c290: 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43  CHANGESET_REPLAC
c2a0: 45 5d 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 55 50  E]..**.** <dt>UP
c2b0: 44 41 54 45 20 43 68 61 6e 67 65 73 3c 64 64 3e  DATE Changes<dd>
c2c0: 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20 55  .**   For each U
c2d0: 50 44 41 54 45 20 63 68 61 6e 67 65 2c 20 74 68  PDATE change, th
c2e0: 65 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  e function check
c2f0: 73 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20  s if the target 
c300: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 63  database .**   c
c310: 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77 69  ontains a row wi
c320: 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69 6d  th the same prim
c330: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20 28 6f  ary key value (o
c340: 72 20 76 61 6c 75 65 73 29 20 61 73 20 74 68 65  r values) as the
c350: 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20   .**   original 
c360: 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65  row values store
c370: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
c380: 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  et. If it does, 
c390: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 0a  and the values .
c3a0: 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20 61  **   stored in a
c3b0: 6c 6c 20 6d 6f 64 69 66 69 65 64 20 6e 6f 6e 2d  ll modified non-
c3c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
c3d0: 6d 6e 73 20 61 6c 73 6f 20 6d 61 74 63 68 20 74  mns also match t
c3e0: 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20 20 20 73  he values.**   s
c3f0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 68 61  tored in the cha
c400: 6e 67 65 73 65 74 20 74 68 65 20 72 6f 77 20 69  ngeset the row i
c410: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 69 6e  s updated within
c420: 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
c430: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66  base..**.**   If
c440: 20 61 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63   a row with matc
c450: 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  hing primary key
c460: 20 76 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64   values is found
c470: 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20 6d 6f 72  , but one or mor
c480: 65 20 6f 66 0a 2a 2a 20 20 20 74 68 65 20 6d 6f  e of.**   the mo
c490: 64 69 66 69 65 64 20 6e 6f 6e 2d 70 72 69 6d 61  dified non-prima
c4a0: 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 63 6f  ry key fields co
c4b0: 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 64  ntains a value d
c4c0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 61 6e  ifferent from an
c4d0: 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20 72  .**   original r
c4e0: 6f 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ow value stored 
c4f0: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
c500: 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68  , the conflict-h
c510: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 0a  andler function.
c520: 2a 2a 20 20 20 69 73 20 69 6e 76 6f 6b 65 64 20  **   is invoked 
c530: 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41  with [SQLITE_CHA
c540: 4e 47 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20  NGESET_DATA] as 
c550: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
c560: 65 6e 74 2e 20 53 69 6e 63 65 0a 2a 2a 20 20 20  ent. Since.**   
c570: 55 50 44 41 54 45 20 63 68 61 6e 67 65 73 20 6f  UPDATE changes o
c580: 6e 6c 79 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75  nly contain valu
c590: 65 73 20 66 6f 72 20 6e 6f 6e 2d 70 72 69 6d 61  es for non-prima
c5a0: 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 74 68  ry key fields th
c5b0: 61 74 20 61 72 65 0a 2a 2a 20 20 20 74 6f 20 62  at are.**   to b
c5c0: 65 20 6d 6f 64 69 66 69 65 64 2c 20 6f 6e 6c 79  e modified, only
c5d0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 6e 65   those fields ne
c5e0: 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
c5f0: 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20  original values 
c600: 74 6f 0a 2a 2a 20 20 20 61 76 6f 69 64 20 74 68  to.**   avoid th
c610: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
c620: 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74  ET_DATA conflict
c630: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
c640: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e 6f  k..**.**   If no
c650: 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68 69   row with matchi
c660: 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ng primary key v
c670: 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 20 69  alues is found i
c680: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  n the database,.
c690: 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69 63  **   the conflic
c6a0: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
c6b0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
c6c0: 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  th [SQLITE_CHANG
c6d0: 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a 2a  ESET_NOTFOUND].*
c6e0: 2a 20 20 20 70 61 73 73 65 64 20 61 73 20 74 68  *   passed as th
c6f0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
c700: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  t..**.**   If th
c710: 65 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  e UPDATE operati
c720: 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64 2c  on is attempted,
c730: 20 62 75 74 20 53 51 4c 69 74 65 20 72 65 74 75   but SQLite retu
c740: 72 6e 73 20 0a 2a 2a 20 20 20 53 51 4c 49 54 45  rns .**   SQLITE
c750: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
c760: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
c770: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  r function is in
c780: 76 6f 6b 65 64 20 77 69 74 68 20 0a 2a 2a 20 20  voked with .**  
c790: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
c7a0: 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 20 70  ET_CONSTRAINT] p
c7b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
c7c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
c7d0: 20 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73     This includes
c7e0: 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
c7f0: 74 68 65 20 55 50 44 41 54 45 20 6f 70 65 72 61  the UPDATE opera
c800: 74 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65  tion is attempte
c810: 64 20 61 66 74 65 72 20 0a 2a 2a 20 20 20 61 6e  d after .**   an
c820: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
c830: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   the conflict ha
c840: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72  ndler function r
c850: 65 74 75 72 6e 65 64 0a 2a 2a 20 20 20 5b 53 51  eturned.**   [SQ
c860: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
c870: 45 50 4c 41 43 45 5d 2e 20 20 0a 2a 2a 20 3c 2f  EPLACE].  .** </
c880: 64 6c 3e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  dl>.**.** It is 
c890: 73 61 66 65 20 74 6f 20 65 78 65 63 75 74 65 20  safe to execute 
c8a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  SQL statements, 
c8b0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
c8c0: 74 68 61 74 20 77 72 69 74 65 20 74 6f 20 74 68  that write to th
c8d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  e.** table that 
c8e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 6c  the callback rel
c8f0: 61 74 65 64 20 74 6f 2c 20 66 72 6f 6d 20 77 69  ated to, from wi
c900: 74 68 69 6e 20 74 68 65 20 78 43 6f 6e 66 6c 69  thin the xConfli
c910: 63 74 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  ct callback..** 
c920: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
c930: 20 74 6f 20 66 75 72 74 68 65 72 20 63 75 73 74   to further cust
c940: 6f 6d 69 7a 65 20 74 68 65 20 61 70 70 6c 69 63  omize the applic
c950: 61 74 69 6f 6e 73 20 63 6f 6e 66 6c 69 63 74 0a  ations conflict.
c960: 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74  ** resolution st
c970: 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c  rategy..**.** Al
c980: 6c 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  l changes made b
c990: 79 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  y these function
c9a0: 73 20 61 72 65 20 65 6e 63 6c 6f 73 65 64 20 69  s are enclosed i
c9b0: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  n a savepoint tr
c9c0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66  ansaction..** If
c9d0: 20 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72   any other error
c9e0: 20 28 61 73 69 64 65 20 66 72 6f 6d 20 61 20 63   (aside from a c
c9f0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72  onstraint failur
ca00: 65 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e  e when attemptin
ca10: 67 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 6f  g to.** write to
ca20: 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
ca30: 62 61 73 65 29 20 6f 63 63 75 72 73 2c 20 74 68  base) occurs, th
ca40: 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  en the savepoint
ca50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
ca60: 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ** rolled back, 
ca70: 72 65 73 74 6f 72 69 6e 67 20 74 68 65 20 74 61  restoring the ta
ca80: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74 6f  rget database to
ca90: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
caa0: 61 74 65 2c 20 61 6e 64 20 61 6e 20 0a 2a 2a 20  ate, and an .** 
cab0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
cac0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  e returned..**.*
cad0: 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
cae0: 70 61 72 61 6d 65 74 65 72 73 20 28 70 70 52 65  parameters (ppRe
caf0: 62 61 73 65 29 20 61 6e 64 20 28 70 6e 52 65 62  base) and (pnReb
cb00: 61 73 65 29 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c  ase) are non-NUL
cb10: 4c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 69 6e 70  L and.** the inp
cb20: 75 74 20 69 73 20 61 20 63 68 61 6e 67 65 73 65  ut is a changese
cb30: 74 20 28 6e 6f 74 20 61 20 70 61 74 63 68 73 65  t (not a patchse
cb40: 74 29 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  t), then sqlite3
cb50: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
cb60: 76 32 28 29 0a 2a 2a 20 6d 61 79 20 73 65 74 20  v2().** may set 
cb70: 28 2a 70 70 52 65 62 61 73 65 29 20 74 6f 20 70  (*ppRebase) to p
cb80: 6f 69 6e 74 20 74 6f 20 61 20 22 72 65 62 61 73  oint to a "rebas
cb90: 65 22 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  e" that may be u
cba0: 73 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  sed with the .**
cbb0: 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72   sqlite3_rebaser
cbc0: 20 41 50 49 73 20 62 75 66 66 65 72 20 62 65 66   APIs buffer bef
cbd0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
cbe0: 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a 70 6e  n this case (*pn
cbf0: 52 65 62 61 73 65 29 0a 2a 2a 20 69 73 20 73 65  Rebase).** is se
cc00: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
cc10: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 62   the buffer in b
cc20: 79 74 65 73 2e 20 49 74 20 69 73 20 74 68 65 20  ytes. It is the 
cc30: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
cc40: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
cc50: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
cc60: 65 65 20 61 6e 79 20 73 75 63 68 20 62 75 66 66  ee any such buff
cc70: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
cc80: 5f 66 72 65 65 28 29 2e 20 54 68 65 20 62 75 66  _free(). The buf
cc90: 66 65 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  fer.** is only a
cca0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
ccb0: 75 6c 61 74 65 64 20 69 66 20 6f 6e 65 20 6f 72  ulated if one or
ccc0: 20 6d 6f 72 65 20 63 6f 6e 66 6c 69 63 74 73 20   more conflicts 
ccd0: 77 65 72 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  were encountered
cce0: 0a 2a 2a 20 77 68 69 6c 65 20 61 70 70 6c 79 69  .** while applyi
ccf0: 6e 67 20 74 68 65 20 70 61 74 63 68 73 65 74 2e  ng the patchset.
cd00: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75   See comments su
cd10: 72 72 6f 75 6e 64 69 6e 67 20 74 68 65 20 73 71  rrounding the sq
cd20: 6c 69 74 65 33 5f 72 65 62 61 73 65 72 0a 2a 2a  lite3_rebaser.**
cd30: 20 41 50 49 73 20 66 6f 72 20 66 75 72 74 68 65   APIs for furthe
cd40: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
cd50: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
cd60: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
cd70: 74 5f 61 70 70 6c 79 5f 76 32 28 29 20 61 6e 64  t_apply_v2() and
cd80: 20 69 74 73 20 73 74 72 65 61 6d 69 6e 67 20 65   its streaming e
cd90: 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 6d 61 79  quivalent.** may
cda0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20   be modified by 
cdb0: 70 61 73 73 69 6e 67 20 61 20 63 6f 6d 62 69 6e  passing a combin
cdc0: 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 5b 53 51 4c  ation of.** [SQL
cdd0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41 50 50  ITE_CHANGESETAPP
cde0: 4c 59 5f 4e 4f 53 41 56 45 50 4f 49 4e 54 20 7c  LY_NOSAVEPOINT |
cdf0: 20 73 75 70 70 6f 72 74 65 64 20 66 6c 61 67 73   supported flags
ce00: 5d 20 61 73 20 74 68 65 20 39 74 68 20 70 61 72  ] as the 9th par
ce10: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ameter..**.** No
ce20: 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
ce30: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
ce40: 6c 79 5f 76 32 28 29 20 41 50 49 20 69 73 20 73  ly_v2() API is s
ce50: 74 69 6c 6c 20 3c 62 3e 65 78 70 65 72 69 6d 65  till <b>experime
ce60: 6e 74 61 6c 3c 2f 62 3e 0a 2a 2a 20 61 6e 64 20  ntal</b>.** and 
ce70: 74 68 65 72 65 66 6f 72 65 20 73 75 62 6a 65 63  therefore subjec
ce80: 74 20 74 6f 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  t to change..*/.
ce90: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
cea0: 65 73 65 74 5f 61 70 70 6c 79 28 0a 20 20 73 71  eset_apply(.  sq
ceb0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ced0: 20 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f   Apply change to
cee0: 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68   "main" db of th
cef0: 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  is handle */.  i
cf00: 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20  nt nChangeset,  
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf20: 2a 20 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65  * Size of change
cf30: 73 65 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  set in bytes */.
cf40: 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73    void *pChanges
cf50: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
cf60: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 62    /* Changeset b
cf70: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46  lob */.  int(*xF
cf80: 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64  ilter)(.    void
cf90: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
cfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
cfb0: 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74  y of sixth arg t
cfc0: 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
cfd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
cfe0: 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
cff0: 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
d000: 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  .  ),.  int(*xCo
d010: 6e 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69  nflict)(.    voi
d020: 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
d030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d040: 70 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20  py of sixth arg 
d050: 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20  to _apply() */. 
d060: 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74     int eConflict
d070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d080: 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e   /* DATA, MISSIN
d090: 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e  G, CONFLICT, CON
d0a0: 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73  STRAINT */.    s
d0b0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
d0c0: 5f 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20  _iter *p     /* 
d0d0: 48 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e  Handle describin
d0e0: 67 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e  g change and con
d0f0: 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20  flict */.  ),.  
d100: 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20  void *pCtx      
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
d130: 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e  t passed to xCon
d140: 66 6c 69 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20  flict */.);.int 
d150: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
d160: 5f 61 70 70 6c 79 5f 76 32 28 0a 20 20 73 71 6c  _apply_v2(.  sql
d170: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d190: 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20  Apply change to 
d1a0: 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69  "main" db of thi
d1b0: 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  s handle */.  in
d1c0: 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20  t nChangeset,   
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1e0: 20 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73   Size of changes
d1f0: 65 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  et in bytes */. 
d200: 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65   void *pChangese
d210: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d220: 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 62 6c   /* Changeset bl
d230: 6f 62 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69  ob */.  int(*xFi
d240: 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20  lter)(.    void 
d250: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
d260: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
d270: 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f   of sixth arg to
d280: 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20   _apply() */.   
d290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
d2a0: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b              /
d2b0: 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
d2c0: 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e    ),.  int(*xCon
d2d0: 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64  flict)(.    void
d2e0: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
d2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
d300: 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74  y of sixth arg t
d310: 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
d320: 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c    int eConflict,
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47  /* DATA, MISSING
d350: 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53  , CONFLICT, CONS
d360: 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71  TRAINT */.    sq
d370: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
d380: 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48  iter *p     /* H
d390: 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67  andle describing
d3a0: 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66   change and conf
d3b0: 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76  lict */.  ),.  v
d3c0: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3e0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
d3f0: 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66   passed to xConf
d400: 6c 69 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  lict */.  void *
d410: 2a 70 70 52 65 62 61 73 65 2c 20 69 6e 74 20 2a  *ppRebase, int *
d420: 70 6e 52 65 62 61 73 65 2c 20 2f 2a 20 4f 55 54  pnRebase, /* OUT
d430: 3a 20 52 65 62 61 73 65 20 64 61 74 61 20 2a 2f  : Rebase data */
d440: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 2f 2a 20 53 45 53 53 49 4f 4e 5f 43 48     /* SESSION_CH
d470: 41 4e 47 45 53 45 54 41 50 50 4c 59 5f 2a 20 66  ANGESETAPPLY_* f
d480: 6c 61 67 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  lags */.);../*.*
d490: 2a 20 43 41 50 49 33 52 45 46 3a 20 46 6c 61 67  * CAPI3REF: Flag
d4a0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68 61  s for sqlite3cha
d4b0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 0a  ngeset_apply_v2.
d4c0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
d4d0: 69 6e 67 20 66 6c 61 67 73 20 6d 61 79 20 70 61  ing flags may pa
d4e0: 73 73 65 64 20 76 69 61 20 74 68 65 20 39 74 68  ssed via the 9th
d4f0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a   parameter to.**
d500: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
d510: 65 74 5f 61 70 70 6c 79 5f 76 32 5d 20 61 6e 64  et_apply_v2] and
d520: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
d530: 65 74 5f 61 70 70 6c 79 5f 76 32 5f 73 74 72 6d  et_apply_v2_strm
d540: 5d 3a 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a  ]:.**.** <dl>.**
d550: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
d560: 47 45 53 45 54 41 50 50 4c 59 5f 4e 4f 53 41 56  GESETAPPLY_NOSAV
d570: 45 50 4f 49 4e 54 20 3c 64 64 3e 0a 2a 2a 20 20  EPOINT <dd>.**  
d580: 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65   Usually, the se
d590: 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 65 6e  ssions module en
d5a0: 63 6c 6f 73 65 73 20 61 6c 6c 20 6f 70 65 72 61  closes all opera
d5b0: 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
d5c0: 62 79 0a 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65  by.**   a single
d5d0: 20 63 61 6c 6c 20 74 6f 20 61 70 70 6c 79 5f 76   call to apply_v
d5e0: 32 28 29 20 6f 72 20 61 70 70 6c 79 5f 76 32 5f  2() or apply_v2_
d5f0: 73 74 72 6d 28 29 20 69 6e 20 61 20 5b 53 41 56  strm() in a [SAV
d600: 45 50 4f 49 4e 54 5d 2e 20 54 68 65 0a 2a 2a 20  EPOINT]. The.** 
d610: 20 20 53 41 56 45 50 4f 49 4e 54 20 69 73 20 63    SAVEPOINT is c
d620: 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68 65 20  ommitted if the 
d630: 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74  changeset or pat
d640: 63 68 73 65 74 20 69 73 20 73 75 63 63 65 73 73  chset is success
d650: 66 75 6c 6c 79 0a 2a 2a 20 20 20 61 70 70 6c 69  fully.**   appli
d660: 65 64 2c 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ed, or rolled ba
d670: 63 6b 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ck if an error o
d680: 63 63 75 72 73 2e 20 53 70 65 63 69 66 79 69 6e  ccurs. Specifyin
d690: 67 20 74 68 69 73 20 66 6c 61 67 0a 2a 2a 20 20  g this flag.**  
d6a0: 20 63 61 75 73 65 73 20 74 68 65 20 73 65 73 73   causes the sess
d6b0: 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 74 6f 20 6f  ions module to o
d6c0: 6d 69 74 20 74 68 69 73 20 73 61 76 65 70 6f 69  mit this savepoi
d6d0: 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
d6e0: 2c 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 63 61  , if the.**   ca
d6f0: 6c 6c 65 72 20 68 61 73 20 61 6e 20 6f 70 65 6e  ller has an open
d700: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
d710: 73 61 76 65 70 6f 69 6e 74 20 77 68 65 6e 20 61  savepoint when a
d720: 70 70 6c 79 5f 76 32 28 29 20 69 73 20 63 61 6c  pply_v2() is cal
d730: 6c 65 64 2c 20 0a 2a 2a 20 20 20 69 74 20 6d 61  led, .**   it ma
d740: 79 20 72 65 76 65 72 74 20 74 68 65 20 70 61 72  y revert the par
d750: 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64 20 63  tially applied c
d760: 68 61 6e 67 65 73 65 74 20 62 79 20 72 6f 6c 6c  hangeset by roll
d770: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
d780: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
d790: 41 4e 47 45 53 45 54 41 50 50 4c 59 5f 49 4e 56  ANGESETAPPLY_INV
d7a0: 45 52 54 20 3c 64 64 3e 0a 2a 2a 20 20 20 49 6e  ERT <dd>.**   In
d7b0: 76 65 72 74 20 74 68 65 20 63 68 61 6e 67 65 73  vert the changes
d7c0: 65 74 20 62 65 66 6f 72 65 20 61 70 70 6c 79 69  et before applyi
d7d0: 6e 67 20 69 74 2e 20 54 68 69 73 20 69 73 20 65  ng it. This is e
d7e0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 69 6e 76  quivalent to inv
d7f0: 65 72 74 69 6e 67 0a 2a 2a 20 20 20 61 20 63 68  erting.**   a ch
d800: 61 6e 67 65 73 65 74 20 75 73 69 6e 67 20 73 71  angeset using sq
d810: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69  lite3changeset_i
d820: 6e 76 65 72 74 28 29 20 62 65 66 6f 72 65 20 61  nvert() before a
d830: 70 70 6c 79 69 6e 67 20 69 74 2e 20 49 74 20 69  pplying it. It i
d840: 73 0a 2a 2a 20 20 20 61 6e 20 65 72 72 6f 72 20  s.**   an error 
d850: 74 6f 20 73 70 65 63 69 66 79 20 74 68 69 73 20  to specify this 
d860: 66 6c 61 67 20 77 69 74 68 20 61 20 70 61 74 63  flag with a patc
d870: 68 73 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hset..*/.#define
d880: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
d890: 54 41 50 50 4c 59 5f 4e 4f 53 41 56 45 50 4f 49  TAPPLY_NOSAVEPOI
d8a0: 4e 54 20 20 20 30 78 30 30 30 31 0a 23 64 65 66  NT   0x0001.#def
d8b0: 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  ine SQLITE_CHANG
d8c0: 45 53 45 54 41 50 50 4c 59 5f 49 4e 56 45 52 54  ESETAPPLY_INVERT
d8d0: 20 20 20 20 20 20 20 20 30 78 30 30 30 32 0a 0a          0x0002..
d8e0: 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  /* .** CAPI3REF:
d8f0: 20 43 6f 6e 73 74 61 6e 74 73 20 50 61 73 73 65   Constants Passe
d900: 64 20 54 6f 20 54 68 65 20 43 6f 6e 66 6c 69 63  d To The Conflic
d910: 74 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a 2a 2a 20  t Handler.**.** 
d920: 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79 20  Values that may 
d930: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
d940: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d950: 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   to a conflict-h
d960: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64  andler..**.** <d
d970: 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  l>.** <dt>SQLITE
d980: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 3c  _CHANGESET_DATA<
d990: 64 64 3e 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e  dd>.**   The con
d9a0: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73  flict handler is
d9b0: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43 48   invoked with CH
d9c0: 41 4e 47 45 53 45 54 5f 44 41 54 41 20 61 73 20  ANGESET_DATA as 
d9d0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d9e0: 65 6e 74 0a 2a 2a 20 20 20 77 68 65 6e 20 70 72  ent.**   when pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 20 44 45 4c 45 54  ocessing a DELET
da00: 45 20 6f 72 20 55 50 44 41 54 45 20 63 68 61 6e  E or UPDATE chan
da10: 67 65 20 69 66 20 61 20 72 6f 77 20 77 69 74 68  ge if a row with
da20: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a   the required.**
da30: 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66     PRIMARY KEY f
da40: 69 65 6c 64 73 20 69 73 20 70 72 65 73 65 6e 74  ields is present
da50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
da60: 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20 6d 6f 72  , but one or mor
da70: 65 20 6f 74 68 65 72 20 0a 2a 2a 20 20 20 28 6e  e other .**   (n
da80: 6f 6e 20 70 72 69 6d 61 72 79 2d 6b 65 79 29 20  on primary-key) 
da90: 66 69 65 6c 64 73 20 6d 6f 64 69 66 69 65 64 20  fields modified 
daa0: 62 79 20 74 68 65 20 75 70 64 61 74 65 20 64 6f  by the update do
dab0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65   not contain the
dac0: 20 0a 2a 2a 20 20 20 65 78 70 65 63 74 65 64 20   .**   expected 
dad0: 22 62 65 66 6f 72 65 22 20 76 61 6c 75 65 73 2e  "before" values.
dae0: 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 20 63 6f  .** .**   The co
daf0: 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 2c 20 69  nflicting row, i
db00: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 73 20  n this case, is 
db10: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 77  the database row
db20: 20 77 69 74 68 20 74 68 65 20 6d 61 74 63 68 69   with the matchi
db30: 6e 67 0a 2a 2a 20 20 20 70 72 69 6d 61 72 79 20  ng.**   primary 
db40: 6b 65 79 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e  key..** .** <dt>
db50: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
db60: 5f 4e 4f 54 46 4f 55 4e 44 3c 64 64 3e 0a 2a 2a  _NOTFOUND<dd>.**
db70: 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20     The conflict 
db80: 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b  handler is invok
db90: 65 64 20 77 69 74 68 20 43 48 41 4e 47 45 53 45  ed with CHANGESE
dba0: 54 5f 4e 4f 54 46 4f 55 4e 44 20 61 73 20 74 68  T_NOTFOUND as th
dbb0: 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 20 20 61 72  e second.**   ar
dbc0: 67 75 6d 65 6e 74 20 77 68 65 6e 20 70 72 6f 63  gument when proc
dbd0: 65 73 73 69 6e 67 20 61 20 44 45 4c 45 54 45 20  essing a DELETE 
dbe0: 6f 72 20 55 50 44 41 54 45 20 63 68 61 6e 67 65  or UPDATE change
dbf0: 20 69 66 20 61 20 72 6f 77 20 77 69 74 68 20 74   if a row with t
dc00: 68 65 0a 2a 2a 20 20 20 72 65 71 75 69 72 65 64  he.**   required
dc10: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65   PRIMARY KEY fie
dc20: 6c 64 73 20 69 73 20 6e 6f 74 20 70 72 65 73 65  lds is not prese
dc30: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
dc40: 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65  se..** .**   The
dc50: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 6c 69 63  re is no conflic
dc60: 74 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 69 73  ting row in this
dc70: 20 63 61 73 65 2e 20 54 68 65 20 72 65 73 75 6c   case. The resul
dc80: 74 73 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74  ts of invoking t
dc90: 68 65 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 63  he.**   sqlite3c
dca0: 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63  hangeset_conflic
dcb0: 74 28 29 20 41 50 49 20 61 72 65 20 75 6e 64 65  t() API are unde
dcc0: 66 69 6e 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64  fined..** .** <d
dcd0: 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  t>SQLITE_CHANGES
dce0: 45 54 5f 43 4f 4e 46 4c 49 43 54 3c 64 64 3e 0a  ET_CONFLICT<dd>.
dcf0: 2a 2a 20 20 20 43 48 41 4e 47 45 53 45 54 5f 43  **   CHANGESET_C
dd00: 4f 4e 46 4c 49 43 54 20 69 73 20 70 61 73 73 65  ONFLICT is passe
dd10: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
dd20: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
dd30: 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61  conflict.**   ha
dd40: 6e 64 6c 65 72 20 77 68 69 6c 65 20 70 72 6f 63  ndler while proc
dd50: 65 73 73 69 6e 67 20 61 6e 20 49 4e 53 45 52 54  essing an INSERT
dd60: 20 63 68 61 6e 67 65 20 69 66 20 74 68 65 20 6f   change if the o
dd70: 70 65 72 61 74 69 6f 6e 20 77 6f 75 6c 64 20 72  peration would r
dd80: 65 73 75 6c 74 20 0a 2a 2a 20 20 20 69 6e 20 64  esult .**   in d
dd90: 75 70 6c 69 63 61 74 65 20 70 72 69 6d 61 72 79  uplicate primary
dda0: 20 6b 65 79 20 76 61 6c 75 65 73 2e 0a 2a 2a 20   key values..** 
ddb0: 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69  .**   The confli
ddc0: 63 74 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 69  cting row in thi
ddd0: 73 20 63 61 73 65 20 69 73 20 74 68 65 20 64 61  s case is the da
dde0: 74 61 62 61 73 65 20 72 6f 77 20 77 69 74 68 20  tabase row with 
ddf0: 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  the matching.** 
de00: 20 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a    primary key..*
de10: 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f  *.** <dt>SQLITE_
de20: 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47  CHANGESET_FOREIG
de30: 4e 5f 4b 45 59 3c 64 64 3e 0a 2a 2a 20 20 20 49  N_KEY<dd>.**   I
de40: 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 68 61  f foreign key ha
de50: 6e 64 6c 69 6e 67 20 69 73 20 65 6e 61 62 6c 65  ndling is enable
de60: 64 2c 20 61 6e 64 20 61 70 70 6c 79 69 6e 67 20  d, and applying 
de70: 61 20 63 68 61 6e 67 65 73 65 74 20 6c 65 61 76  a changeset leav
de80: 65 73 20 74 68 65 0a 2a 2a 20 20 20 64 61 74 61  es the.**   data
de90: 62 61 73 65 20 69 6e 20 61 20 73 74 61 74 65 20  base in a state 
dea0: 63 6f 6e 74 61 69 6e 69 6e 67 20 66 6f 72 65 69  containing forei
deb0: 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
dec0: 73 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  s, the conflict 
ded0: 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72 20 69 73  .**   handler is
dee0: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43 48   invoked with CH
def0: 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f  ANGESET_FOREIGN_
df00: 4b 45 59 20 61 73 20 74 68 65 20 73 65 63 6f 6e  KEY as the secon
df10: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 20 20  d argument.**   
df20: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 62 65 66  exactly once bef
df30: 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 73 65  ore the changese
df40: 74 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t is committed. 
df50: 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  If the conflict 
df60: 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 72 65 74  handler.**   ret
df70: 75 72 6e 73 20 43 48 41 4e 47 45 53 45 54 5f 4f  urns CHANGESET_O
df80: 4d 49 54 2c 20 74 68 65 20 63 68 61 6e 67 65 73  MIT, the changes
df90: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73  , including thos
dfa0: 65 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68  e that caused th
dfb0: 65 0a 2a 2a 20 20 20 66 6f 72 65 69 67 6e 20 6b  e.**   foreign k
dfc0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ey constraint vi
dfd0: 6f 6c 61 74 69 6f 6e 2c 20 61 72 65 20 63 6f 6d  olation, are com
dfe0: 6d 69 74 74 65 64 2e 20 4f 72 2c 20 69 66 20 69  mitted. Or, if i
dff0: 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 20 20 43  t returns.**   C
e000: 48 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 2c 20  HANGESET_ABORT, 
e010: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73  the changeset is
e020: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
e030: 0a 2a 2a 20 20 20 4e 6f 20 63 75 72 72 65 6e 74  .**   No current
e040: 20 6f 72 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20   or conflicting 
e050: 72 6f 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  row information 
e060: 69 73 20 70 72 6f 76 69 64 65 64 2e 20 54 68 65  is provided. The
e070: 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 0a 2a   only function.*
e080: 2a 20 20 20 69 74 20 69 73 20 70 6f 73 73 69 62  *   it is possib
e090: 6c 65 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 74 68  le to call on th
e0a0: 65 20 73 75 70 70 6c 69 65 64 20 73 71 6c 69 74  e supplied sqlit
e0b0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
e0c0: 72 20 68 61 6e 64 6c 65 0a 2a 2a 20 20 20 69 73  r handle.**   is
e0d0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
e0e0: 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 29  t_fk_conflicts()
e0f0: 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c  ..** .** <dt>SQL
e100: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
e110: 4e 53 54 52 41 49 4e 54 3c 64 64 3e 0a 2a 2a 20  NSTRAINT<dd>.** 
e120: 20 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20 63    If any other c
e130: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
e140: 69 6f 6e 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ion occurs while
e150: 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e   applying a chan
e160: 67 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 20 20 61  ge (i.e. .**   a
e170: 20 55 4e 49 51 55 45 2c 20 43 48 45 43 4b 20 6f   UNIQUE, CHECK o
e180: 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  r NOT NULL const
e190: 72 61 69 6e 74 29 2c 20 74 68 65 20 63 6f 6e 66  raint), the conf
e1a0: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20  lict handler is 
e1b0: 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69  .**   invoked wi
e1c0: 74 68 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  th CHANGESET_CON
e1d0: 53 54 52 41 49 4e 54 20 61 73 20 74 68 65 20 73  STRAINT as the s
e1e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
e1f0: 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 72 65 20 69  ** .**   There i
e200: 73 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67  s no conflicting
e210: 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61 73   row in this cas
e220: 65 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  e. The results o
e230: 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 0a 2a  f invoking the.*
e240: 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  *   sqlite3chang
e250: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 28 29 20  eset_conflict() 
e260: 41 50 49 20 61 72 65 20 75 6e 64 65 66 69 6e 65  API are undefine
e270: 64 2e 0a 2a 2a 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a  d..**.** </dl>.*
e280: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
e290: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
e2a0: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
e2b0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
e2c0: 54 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 32 0a  T_NOTFOUND    2.
e2d0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43  #define SQLITE_C
e2e0: 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43  HANGESET_CONFLIC
e2f0: 54 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53  T    3.#define S
e300: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
e310: 43 4f 4e 53 54 52 41 49 4e 54 20 20 34 0a 23 64  CONSTRAINT  4.#d
e320: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
e330: 4e 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b  NGESET_FOREIGN_K
e340: 45 59 20 35 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50  EY 5../* .** CAP
e350: 49 33 52 45 46 3a 20 43 6f 6e 73 74 61 6e 74 73  I3REF: Constants
e360: 20 52 65 74 75 72 6e 65 64 20 42 79 20 54 68 65   Returned By The
e370: 20 43 6f 6e 66 6c 69 63 74 20 48 61 6e 64 6c 65   Conflict Handle
e380: 72 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 66 6c 69  r.**.** A confli
e390: 63 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  ct handler callb
e3a0: 61 63 6b 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ack must return 
e3b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
e3c0: 77 69 6e 67 20 74 68 72 65 65 20 76 61 6c 75 65  wing three value
e3d0: 73 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a  s..**.** <dl>.**
e3e0: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
e3f0: 47 45 53 45 54 5f 4f 4d 49 54 3c 64 64 3e 0a 2a  GESET_OMIT<dd>.*
e400: 2a 20 20 20 49 66 20 61 20 63 6f 6e 66 6c 69 63  *   If a conflic
e410: 74 20 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e  t handler return
e420: 73 20 74 68 69 73 20 76 61 6c 75 65 20 6e 6f 20  s this value no 
e430: 73 70 65 63 69 61 6c 20 61 63 74 69 6f 6e 20 69  special action i
e440: 73 20 74 61 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20  s taken. The.** 
e450: 20 20 63 68 61 6e 67 65 20 74 68 61 74 20 63 61    change that ca
e460: 75 73 65 64 20 74 68 65 20 63 6f 6e 66 6c 69 63  used the conflic
e470: 74 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 65 64  t is not applied
e480: 2e 20 54 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f  . The session mo
e490: 64 75 6c 65 20 0a 2a 2a 20 20 20 63 6f 6e 74 69  dule .**   conti
e4a0: 6e 75 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74  nues to the next
e4b0: 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 63   change in the c
e4c0: 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  hangeset..**.** 
e4d0: 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47  <dt>SQLITE_CHANG
e4e0: 45 53 45 54 5f 52 45 50 4c 41 43 45 3c 64 64 3e  ESET_REPLACE<dd>
e4f0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 6c 75 65  .**   This value
e500: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 74   may only be ret
e510: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 65 63  urned if the sec
e520: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
e530: 74 68 65 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20  the conflict.** 
e540: 20 20 68 61 6e 64 6c 65 72 20 77 61 73 20 53 51    handler was SQ
e550: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
e560: 41 54 41 20 6f 72 20 53 51 4c 49 54 45 5f 43 48  ATA or SQLITE_CH
e570: 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54  ANGESET_CONFLICT
e580: 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 20 20 69  . If this.**   i
e590: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  s not the case, 
e5a0: 61 6e 79 20 63 68 61 6e 67 65 73 20 61 70 70 6c  any changes appl
e5b0: 69 65 64 20 73 6f 20 66 61 72 20 61 72 65 20 72  ied so far are r
e5c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
e5d0: 68 65 20 0a 2a 2a 20 20 20 63 61 6c 6c 20 74 6f  he .**   call to
e5e0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
e5f0: 74 5f 61 70 70 6c 79 28 29 20 72 65 74 75 72 6e  t_apply() return
e600: 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  s SQLITE_MISUSE.
e610: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 43 48 41 4e  .**.**   If CHAN
e620: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 69 73  GESET_REPLACE is
e630: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
e640: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
e650: 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 0a 2a  _DATA conflict.*
e660: 2a 20 20 20 68 61 6e 64 6c 65 72 2c 20 74 68 65  *   handler, the
e670: 6e 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  n the conflictin
e680: 67 20 72 6f 77 20 69 73 20 65 69 74 68 65 72 20  g row is either 
e690: 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74  updated or delet
e6a0: 65 64 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  ed, depending.**
e6b0: 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f     on the type o
e6c0: 66 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  f change..**.** 
e6d0: 20 20 49 66 20 43 48 41 4e 47 45 53 45 54 5f 52    If CHANGESET_R
e6e0: 45 50 4c 41 43 45 20 69 73 20 72 65 74 75 72 6e  EPLACE is return
e6f0: 65 64 20 62 79 20 61 6e 20 53 51 4c 49 54 45 5f  ed by an SQLITE_
e700: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
e710: 43 54 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20  CT conflict.**  
e720: 20 68 61 6e 64 6c 65 72 2c 20 74 68 65 6e 20 74   handler, then t
e730: 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  he conflicting r
e740: 6f 77 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ow is removed fr
e750: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
e760: 61 6e 64 20 61 0a 2a 2a 20 20 20 73 65 63 6f 6e  and a.**   secon
e770: 64 20 61 74 74 65 6d 70 74 20 74 6f 20 61 70 70  d attempt to app
e780: 6c 79 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  ly the change is
e790: 20 6d 61 64 65 2e 20 49 66 20 74 68 69 73 20 73   made. If this s
e7a0: 65 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 66 61  econd attempt fa
e7b0: 69 6c 73 2c 0a 2a 2a 20 20 20 74 68 65 20 6f 72  ils,.**   the or
e7c0: 69 67 69 6e 61 6c 20 72 6f 77 20 69 73 20 72 65  iginal row is re
e7d0: 73 74 6f 72 65 64 20 74 6f 20 74 68 65 20 64 61  stored to the da
e7e0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 63 6f  tabase before co
e7f0: 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ntinuing..**.** 
e800: 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47  <dt>SQLITE_CHANG
e810: 45 53 45 54 5f 41 42 4f 52 54 3c 64 64 3e 0a 2a  ESET_ABORT<dd>.*
e820: 2a 20 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  *   If this valu
e830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 61  e is returned, a
e840: 6e 79 20 63 68 61 6e 67 65 73 20 61 70 70 6c 69  ny changes appli
e850: 65 64 20 73 6f 20 66 61 72 20 61 72 65 20 72 6f  ed so far are ro
e860: 6c 6c 65 64 20 62 61 63 6b 20 0a 2a 2a 20 20 20  lled back .**   
e870: 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
e880: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
e890: 5f 61 70 70 6c 79 28 29 20 72 65 74 75 72 6e 73  _apply() returns
e8a0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 2a   SQLITE_ABORT..*
e8b0: 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64 65 66 69  * </dl>.*/.#defi
e8c0: 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ne SQLITE_CHANGE
e8d0: 53 45 54 5f 4f 4d 49 54 20 20 20 20 20 20 20 30  SET_OMIT       0
e8e0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
e8f0: 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43  CHANGESET_REPLAC
e900: 45 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53  E    1.#define S
e910: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
e920: 41 42 4f 52 54 20 20 20 20 20 20 32 0a 0a 2f 2a  ABORT      2../*
e930: 20 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 52   .** CAPI3REF: R
e940: 65 62 61 73 69 6e 67 20 63 68 61 6e 67 65 73 65  ebasing changese
e950: 74 73 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  ts.** EXPERIMENT
e960: 41 4c 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  AL.**.** Suppose
e970: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 74 65   there is a site
e980: 20 68 6f 73 74 69 6e 67 20 61 20 64 61 74 61 62   hosting a datab
e990: 61 73 65 20 69 6e 20 73 74 61 74 65 20 53 30 2e  ase in state S0.
e9a0: 20 41 6e 64 20 74 68 61 74 0a 2a 2a 20 6d 6f 64   And that.** mod
e9b0: 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65 20 6d  ifications are m
e9c0: 61 64 65 20 74 68 61 74 20 6d 6f 76 65 20 74 68  ade that move th
e9d0: 61 74 20 64 61 74 61 62 61 73 65 20 74 6f 20 73  at database to s
e9e0: 74 61 74 65 20 53 31 20 61 6e 64 20 61 0a 2a 2a  tate S1 and a.**
e9f0: 20 63 68 61 6e 67 65 73 65 74 20 72 65 63 6f 72   changeset recor
ea00: 64 65 64 20 28 74 68 65 20 22 6c 6f 63 61 6c 22  ded (the "local"
ea10: 20 63 68 61 6e 67 65 73 65 74 29 2e 20 54 68 65   changeset). The
ea20: 6e 2c 20 61 20 63 68 61 6e 67 65 73 65 74 20 62  n, a changeset b
ea30: 61 73 65 64 0a 2a 2a 20 6f 6e 20 53 30 20 69 73  ased.** on S0 is
ea40: 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20 61   received from a
ea50: 6e 6f 74 68 65 72 20 73 69 74 65 20 28 74 68 65  nother site (the
ea60: 20 22 72 65 6d 6f 74 65 22 20 63 68 61 6e 67 65   "remote" change
ea70: 73 65 74 29 20 61 6e 64 20 0a 2a 2a 20 61 70 70  set) and .** app
ea80: 6c 69 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  lied to the data
ea90: 62 61 73 65 2e 20 54 68 65 20 64 61 74 61 62 61  base. The databa
eaa0: 73 65 20 69 73 20 74 68 65 6e 20 69 6e 20 73 74  se is then in st
eab0: 61 74 65 20 0a 2a 2a 20 28 53 31 2b 22 72 65 6d  ate .** (S1+"rem
eac0: 6f 74 65 22 29 2c 20 77 68 65 72 65 20 74 68 65  ote"), where the
ead0: 20 65 78 61 63 74 20 73 74 61 74 65 20 64 65 70   exact state dep
eae0: 65 6e 64 73 20 6f 6e 20 61 6e 79 20 63 6f 6e 66  ends on any conf
eaf0: 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c 75 74 69  lict.** resoluti
eb00: 6f 6e 20 64 65 63 69 73 69 6f 6e 73 20 28 4f 4d  on decisions (OM
eb10: 49 54 20 6f 72 20 52 45 50 4c 41 43 45 29 20 6d  IT or REPLACE) m
eb20: 61 64 65 20 77 68 69 6c 65 20 61 70 70 6c 79 69  ade while applyi
eb30: 6e 67 20 22 72 65 6d 6f 74 65 22 2e 0a 2a 2a 20  ng "remote"..** 
eb40: 52 65 62 61 73 69 6e 67 20 61 20 63 68 61 6e 67  Rebasing a chang
eb50: 65 73 65 74 20 69 73 20 74 6f 20 75 70 64 61 74  eset is to updat
eb60: 65 20 69 74 20 74 6f 20 74 61 6b 65 20 74 68 6f  e it to take tho
eb70: 73 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20  se conflict .** 
eb80: 72 65 73 6f 6c 75 74 69 6f 6e 20 64 65 63 69 73  resolution decis
eb90: 69 6f 6e 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e  ions into accoun
eba0: 74 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  t, so that the s
ebb0: 61 6d 65 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a  ame conflicts.**
ebc0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
ebd0: 62 65 20 72 65 73 6f 6c 76 65 64 20 65 6c 73 65  be resolved else
ebe0: 77 68 65 72 65 20 69 6e 20 74 68 65 20 6e 65 74  where in the net
ebf0: 77 6f 72 6b 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  work. .**.** For
ec00: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 62 6f 74   example, if bot
ec10: 68 20 74 68 65 20 6c 6f 63 61 6c 20 61 6e 64 20  h the local and 
ec20: 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73 65 74  remote changeset
ec30: 73 20 63 6f 6e 74 61 69 6e 20 61 6e 0a 2a 2a 20  s contain an.** 
ec40: 49 4e 53 45 52 54 20 6f 66 20 74 68 65 20 73 61  INSERT of the sa
ec50: 6d 65 20 6b 65 79 20 6f 6e 20 22 43 52 45 41 54  me key on "CREAT
ec60: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
ec70: 4d 41 52 59 20 4b 45 59 2c 20 62 29 22 3a 0a 2a  MARY KEY, b)":.*
ec80: 2a 0a 2a 2a 20 20 20 6c 6f 63 61 6c 3a 20 20 49  *.**   local:  I
ec90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
eca0: 4c 55 45 53 28 31 2c 20 27 76 31 27 29 3b 0a 2a  LUES(1, 'v1');.*
ecb0: 2a 20 20 20 72 65 6d 6f 74 65 3a 20 49 4e 53 45  *   remote: INSE
ecc0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
ecd0: 53 28 31 2c 20 27 76 32 27 29 3b 0a 2a 2a 0a 2a  S(1, 'v2');.**.*
ece0: 2a 20 61 6e 64 20 74 68 65 20 63 6f 6e 66 6c 69  * and the confli
ecf0: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  ct resolution is
ed00: 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e 20 74   REPLACE, then t
ed10: 68 65 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65  he INSERT change
ed20: 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 20 66   is.** removed f
ed30: 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c 20 63 68  rom the local ch
ed40: 61 6e 67 65 73 65 74 20 28 69 74 20 77 61 73 20  angeset (it was 
ed50: 6f 76 65 72 72 69 64 64 65 6e 29 2e 20 4f 72 2c  overridden). Or,
ed60: 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c   if the.** confl
ed70: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77  ict resolution w
ed80: 61 73 20 22 4f 4d 49 54 22 2c 20 74 68 65 6e 20  as "OMIT", then 
ed90: 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  the local change
eda0: 73 65 74 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  set is modified.
edb0: 2a 2a 20 74 6f 20 69 6e 73 74 65 61 64 20 63 6f  ** to instead co
edc0: 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ntain:.**.**    
edd0: 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31         UPDATE t1
ede0: 20 53 45 54 20 62 20 3d 20 27 76 32 27 20 57 48   SET b = 'v2' WH
edf0: 45 52 45 20 61 3d 31 3b 0a 2a 2a 0a 2a 2a 20 43  ERE a=1;.**.** C
ee00: 68 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68  hanges within th
ee10: 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65  e local changese
ee20: 74 20 61 72 65 20 72 65 62 61 73 65 64 20 61 73  t are rebased as
ee30: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ee40: 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 4c 6f 63 61  <dl>.** <dt>Loca
ee50: 6c 20 49 4e 53 45 52 54 3c 64 64 3e 0a 2a 2a 20  l INSERT<dd>.** 
ee60: 20 20 54 68 69 73 20 6d 61 79 20 6f 6e 6c 79 20    This may only 
ee70: 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61 20  conflict with a 
ee80: 72 65 6d 6f 74 65 20 49 4e 53 45 52 54 2e 20 49  remote INSERT. I
ee90: 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 0a  f the conflict .
eea0: 2a 2a 20 20 20 72 65 73 6f 6c 75 74 69 6f 6e 20  **   resolution 
eeb0: 77 61 73 20 4f 4d 49 54 2c 20 74 68 65 6e 20 61  was OMIT, then a
eec0: 64 64 20 61 6e 20 55 50 44 41 54 45 20 63 68 61  dd an UPDATE cha
eed0: 6e 67 65 20 74 6f 20 74 68 65 20 72 65 62 61 73  nge to the rebas
eee0: 65 64 0a 2a 2a 20 20 20 63 68 61 6e 67 65 73 65  ed.**   changese
eef0: 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  t. Or, if the co
ef00: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
ef10: 6e 20 77 61 73 20 52 45 50 4c 41 43 45 2c 20 61  n was REPLACE, a
ef20: 64 64 0a 2a 2a 20 20 20 6e 6f 74 68 69 6e 67 20  dd.**   nothing 
ef30: 74 6f 20 74 68 65 20 72 65 62 61 73 65 64 20 63  to the rebased c
ef40: 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  hangeset..**.** 
ef50: 3c 64 74 3e 4c 6f 63 61 6c 20 44 45 4c 45 54 45  <dt>Local DELETE
ef60: 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 69 73 20 6d  <dd>.**   This m
ef70: 61 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ay conflict with
ef80: 20 61 20 72 65 6d 6f 74 65 20 55 50 44 41 54 45   a remote UPDATE
ef90: 20 6f 72 20 44 45 4c 45 54 45 2e 20 49 6e 20 62   or DELETE. In b
efa0: 6f 74 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  oth cases the.**
efb0: 20 20 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65     only possible
efc0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 4f   resolution is O
efd0: 4d 49 54 2e 20 49 66 20 74 68 65 20 72 65 6d 6f  MIT. If the remo
efe0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  te operation was
eff0: 20 61 0a 2a 2a 20 20 20 44 45 4c 45 54 45 2c 20   a.**   DELETE, 
f000: 74 68 65 6e 20 61 64 64 20 6e 6f 20 63 68 61 6e  then add no chan
f010: 67 65 20 74 6f 20 74 68 65 20 72 65 62 61 73 65  ge to the rebase
f020: 64 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20  d changeset. If 
f030: 74 68 65 20 72 65 6d 6f 74 65 0a 2a 2a 20 20 20  the remote.**   
f040: 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 61 6e  operation was an
f050: 20 55 50 44 41 54 45 2c 20 74 68 65 6e 20 74 68   UPDATE, then th
f060: 65 20 6f 6c 64 2e 2a 20 66 69 65 6c 64 73 20 6f  e old.* fields o
f070: 66 20 63 68 61 6e 67 65 20 61 72 65 20 75 70 64  f change are upd
f080: 61 74 65 64 0a 2a 2a 20 20 20 74 6f 20 72 65 66  ated.**   to ref
f090: 6c 65 63 74 20 74 68 65 20 6e 65 77 2e 2a 20 76  lect the new.* v
f0a0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 55 50 44  alues in the UPD
f0b0: 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 4c  ATE..**.** <dt>L
f0c0: 6f 63 61 6c 20 55 50 44 41 54 45 3c 64 64 3e 0a  ocal UPDATE<dd>.
f0d0: 2a 2a 20 20 20 54 68 69 73 20 6d 61 79 20 63 6f  **   This may co
f0e0: 6e 66 6c 69 63 74 20 77 69 74 68 20 61 20 72 65  nflict with a re
f0f0: 6d 6f 74 65 20 55 50 44 41 54 45 20 6f 72 20 44  mote UPDATE or D
f100: 45 4c 45 54 45 2e 20 49 66 20 69 74 20 63 6f 6e  ELETE. If it con
f110: 66 6c 69 63 74 73 0a 2a 2a 20 20 20 77 69 74 68  flicts.**   with
f120: 20 61 20 44 45 4c 45 54 45 2c 20 61 6e 64 20 74   a DELETE, and t
f130: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
f140: 6c 75 74 69 6f 6e 20 77 61 73 20 4f 4d 49 54 2c  lution was OMIT,
f150: 20 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65   then the update
f160: 0a 2a 2a 20 20 20 69 73 20 63 68 61 6e 67 65 64  .**   is changed
f170: 20 69 6e 74 6f 20 61 6e 20 49 4e 53 45 52 54 2e   into an INSERT.
f180: 20 41 6e 79 20 75 6e 64 65 66 69 6e 65 64 20 76   Any undefined v
f190: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e 65 77  alues in the new
f1a0: 2e 2a 20 72 65 63 6f 72 64 0a 2a 2a 20 20 20 66  .* record.**   f
f1b0: 72 6f 6d 20 74 68 65 20 75 70 64 61 74 65 20 63  rom the update c
f1c0: 68 61 6e 67 65 20 61 72 65 20 66 69 6c 6c 65 64  hange are filled
f1d0: 20 69 6e 20 75 73 69 6e 67 20 74 68 65 20 6f 6c   in using the ol
f1e0: 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a  d.* values from.
f1f0: 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69 63  **   the conflic
f200: 74 69 6e 67 20 44 45 4c 45 54 45 2e 20 4f 72 2c  ting DELETE. Or,
f210: 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   if the conflict
f220: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20   resolution was 
f230: 52 45 50 4c 41 43 45 2c 0a 2a 2a 20 20 20 74 68  REPLACE,.**   th
f240: 65 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 20  e UPDATE change 
f250: 69 73 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65  is simply omitte
f260: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 62 61 73  d from the rebas
f270: 65 64 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a  ed changeset..**
f280: 0a 2a 2a 20 20 20 49 66 20 63 6f 6e 66 6c 69 63  .**   If conflic
f290: 74 20 69 73 20 77 69 74 68 20 61 20 72 65 6d 6f  t is with a remo
f2a0: 74 65 20 55 50 44 41 54 45 20 61 6e 64 20 74 68  te UPDATE and th
f2b0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
f2c0: 4f 4d 49 54 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  OMIT, then.**   
f2d0: 74 68 65 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73  the old.* values
f2e0: 20 61 72 65 20 72 65 62 61 73 65 64 20 75 73 69   are rebased usi
f2f0: 6e 67 20 74 68 65 20 6e 65 77 2e 2a 20 76 61 6c  ng the new.* val
f300: 75 65 73 20 69 6e 20 74 68 65 20 72 65 6d 6f 74  ues in the remot
f310: 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 2e 20 4f  e.**   change. O
f320: 72 2c 20 69 66 20 74 68 65 20 72 65 73 6f 6c 75  r, if the resolu
f330: 74 69 6f 6e 20 69 73 20 52 45 50 4c 41 43 45 2c  tion is REPLACE,
f340: 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
f350: 20 69 73 20 63 6f 70 69 65 64 0a 2a 2a 20 20 20   is copied.**   
f360: 69 6e 74 6f 20 74 68 65 20 72 65 62 61 73 65 64  into the rebased
f370: 20 63 68 61 6e 67 65 73 65 74 20 77 69 74 68 20   changeset with 
f380: 75 70 64 61 74 65 73 20 74 6f 20 63 6f 6c 75 6d  updates to colum
f390: 6e 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  ns also updated 
f3a0: 62 79 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66  by.**   the conf
f3b0: 6c 69 63 74 69 6e 67 20 72 65 6d 6f 74 65 20 55  licting remote U
f3c0: 50 44 41 54 45 20 72 65 6d 6f 76 65 64 2e 20 49  PDATE removed. I
f3d0: 66 20 74 68 69 73 20 6d 65 61 6e 73 20 6e 6f 20  f this means no 
f3e0: 63 6f 6c 75 6d 6e 73 20 77 6f 75 6c 64 20 0a 2a  columns would .*
f3f0: 2a 20 20 20 62 65 20 75 70 64 61 74 65 64 2c 20  *   be updated, 
f400: 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 6f 6d  the change is om
f410: 69 74 74 65 64 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a  itted..** </dl>.
f420: 2a 2a 0a 2a 2a 20 41 20 6c 6f 63 61 6c 20 63 68  **.** A local ch
f430: 61 6e 67 65 20 6d 61 79 20 62 65 20 72 65 62 61  ange may be reba
f440: 73 65 64 20 61 67 61 69 6e 73 74 20 6d 75 6c 74  sed against mult
f450: 69 70 6c 65 20 72 65 6d 6f 74 65 20 63 68 61 6e  iple remote chan
f460: 67 65 73 20 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e  ges .** simultan
f470: 65 6f 75 73 6c 79 2e 20 49 66 20 61 20 73 69 6e  eously. If a sin
f480: 67 6c 65 20 6b 65 79 20 69 73 20 6d 6f 64 69 66  gle key is modif
f490: 69 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ied by multiple 
f4a0: 72 65 6d 6f 74 65 20 0a 2a 2a 20 63 68 61 6e 67  remote .** chang
f4b0: 65 73 65 74 73 2c 20 74 68 65 79 20 61 72 65 20  esets, they are 
f4c0: 63 6f 6d 62 69 6e 65 64 20 61 73 20 66 6f 6c 6c  combined as foll
f4d0: 6f 77 73 20 62 65 66 6f 72 65 20 74 68 65 20 6c  ows before the l
f4e0: 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74 0a 2a  ocal changeset.*
f4f0: 2a 20 69 73 20 72 65 62 61 73 65 64 3a 0a 2a 2a  * is rebased:.**
f500: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 20 3c  .** <ul>.**    <
f510: 6c 69 3e 20 49 66 20 74 68 65 72 65 20 68 61 73  li> If there has
f520: 20 62 65 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   been one or mor
f530: 65 20 52 45 50 4c 41 43 45 20 72 65 73 6f 6c 75  e REPLACE resolu
f540: 74 69 6f 6e 73 20 6f 6e 20 61 0a 2a 2a 20 20 20  tions on a.**   
f550: 20 20 20 20 20 20 6b 65 79 2c 20 69 74 20 69 73        key, it is
f560: 20 72 65 62 61 73 65 64 20 61 63 63 6f 72 64 69   rebased accordi
f570: 6e 67 20 74 6f 20 61 20 52 45 50 4c 41 43 45 2e  ng to a REPLACE.
f580: 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 6c 69 3e 20 49  .**.**    <li> I
f590: 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
f5a0: 6e 20 6e 6f 20 52 45 50 4c 41 43 45 20 72 65 73  n no REPLACE res
f5b0: 6f 6c 75 74 69 6f 6e 73 20 6f 6e 20 61 20 6b 65  olutions on a ke
f5c0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  y, then.**      
f5d0: 20 20 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61     the local cha
f5e0: 6e 67 65 73 65 74 20 69 73 20 72 65 62 61 73 65  ngeset is rebase
f5f0: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
f600: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
f610: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
f620: 20 4f 4d 49 54 20 72 65 73 6f 6c 75 74 69 6f 6e   OMIT resolution
f630: 73 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  s..** </ul>.**.*
f640: 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 6f 6e 66  * Note that conf
f650: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 73  lict resolutions
f660: 20 66 72 6f 6d 20 6d 75 6c 74 69 70 6c 65 20 72   from multiple r
f670: 65 6d 6f 74 65 20 63 68 61 6e 67 65 73 65 74 73  emote changesets
f680: 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 62 69 6e 65   are .** combine
f690: 64 20 6f 6e 20 61 20 70 65 72 2d 66 69 65 6c 64  d on a per-field
f6a0: 20 62 61 73 69 73 2c 20 6e 6f 74 20 70 65 72 2d   basis, not per-
f6b0: 72 6f 77 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  row. This means 
f6c0: 74 68 61 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20  that in the .** 
f6d0: 63 61 73 65 20 6f 66 20 6d 75 6c 74 69 70 6c 65  case of multiple
f6e0: 20 72 65 6d 6f 74 65 20 55 50 44 41 54 45 20 6f   remote UPDATE o
f6f0: 70 65 72 61 74 69 6f 6e 73 2c 20 73 6f 6d 65 20  perations, some 
f700: 66 69 65 6c 64 73 20 6f 66 20 61 20 73 69 6e 67  fields of a sing
f710: 6c 65 20 0a 2a 2a 20 6c 6f 63 61 6c 20 63 68 61  le .** local cha
f720: 6e 67 65 20 6d 61 79 20 62 65 20 72 65 62 61 73  nge may be rebas
f730: 65 64 20 66 6f 72 20 52 45 50 4c 41 43 45 20 77  ed for REPLACE w
f740: 68 69 6c 65 20 6f 74 68 65 72 73 20 61 72 65 20  hile others are 
f750: 72 65 62 61 73 65 64 20 66 6f 72 20 0a 2a 2a 20  rebased for .** 
f760: 4f 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  OMIT..**.** In o
f770: 72 64 65 72 20 74 6f 20 72 65 62 61 73 65 20 61  rder to rebase a
f780: 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74   local changeset
f790: 2c 20 74 68 65 20 72 65 6d 6f 74 65 20 63 68 61  , the remote cha
f7a0: 6e 67 65 73 65 74 20 6d 75 73 74 20 66 69 72 73  ngeset must firs
f7b0: 74 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20  t.** be applied 
f7c0: 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  to the local dat
f7d0: 61 62 61 73 65 20 75 73 69 6e 67 20 73 71 6c 69  abase using sqli
f7e0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
f7f0: 6c 79 5f 76 32 28 29 20 61 6e 64 0a 2a 2a 20 74  ly_v2() and.** t
f800: 68 65 20 62 75 66 66 65 72 20 6f 66 20 72 65 62  he buffer of reb
f810: 61 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ase information 
f820: 63 61 70 74 75 72 65 64 2e 20 54 68 65 6e 3a 0a  captured. Then:.
f830: 2a 2a 0a 2a 2a 20 3c 6f 6c 3e 0a 2a 2a 20 20 20  **.** <ol>.**   
f840: 3c 6c 69 3e 20 41 6e 20 73 71 6c 69 74 65 33 5f  <li> An sqlite3_
f850: 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20 69  rebaser object i
f860: 73 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  s created by cal
f870: 6c 69 6e 67 20 0a 2a 2a 20 20 20 20 20 20 20 20  ling .**        
f880: 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63  sqlite3rebaser_c
f890: 72 65 61 74 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c  reate()..**   <l
f8a0: 69 3e 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  i> The new objec
f8b0: 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  t is configured 
f8c0: 77 69 74 68 20 74 68 65 20 72 65 62 61 73 65 20  with the rebase 
f8d0: 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 20  buffer obtained 
f8e0: 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 73  from.**        s
f8f0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
f900: 61 70 70 6c 79 5f 76 32 28 29 20 62 79 20 63 61  apply_v2() by ca
f910: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 72 65 62  lling sqlite3reb
f920: 61 73 65 72 5f 63 6f 6e 66 69 67 75 72 65 28 29  aser_configure()
f930: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74  ..**        If t
f940: 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73  he local changes
f950: 65 74 20 69 73 20 74 6f 20 62 65 20 72 65 62 61  et is to be reba
f960: 73 65 64 20 61 67 61 69 6e 73 74 20 6d 75 6c 74  sed against mult
f970: 69 70 6c 65 20 72 65 6d 6f 74 65 0a 2a 2a 20 20  iple remote.**  
f980: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73        changesets
f990: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 72 65  , then sqlite3re
f9a0: 62 61 73 65 72 5f 63 6f 6e 66 69 67 75 72 65 28  baser_configure(
f9b0: 29 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  ) should be call
f9c0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 6d 75 6c  ed.**        mul
f9d0: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 69 6e 20  tiple times, in 
f9e0: 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 74  the same order t
f9f0: 68 61 74 20 74 68 65 20 6d 75 6c 74 69 70 6c 65  hat the multiple
fa00: 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74  .**        sqlit
fa10: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
fa20: 79 5f 76 32 28 29 20 63 61 6c 6c 73 20 77 65 72  y_v2() calls wer
fa30: 65 20 6d 61 64 65 2e 0a 2a 2a 20 20 20 3c 6c 69  e made..**   <li
fa40: 3e 20 45 61 63 68 20 6c 6f 63 61 6c 20 63 68 61  > Each local cha
fa50: 6e 67 65 73 65 74 20 69 73 20 72 65 62 61 73 65  ngeset is rebase
fa60: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  d by calling sql
fa70: 69 74 65 33 72 65 62 61 73 65 72 5f 72 65 62 61  ite3rebaser_reba
fa80: 73 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20  se()..**   <li> 
fa90: 54 68 65 20 73 71 6c 69 74 65 33 5f 72 65 62 61  The sqlite3_reba
faa0: 73 65 72 20 6f 62 6a 65 63 74 20 69 73 20 64 65  ser object is de
fab0: 6c 65 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  leted by calling
fac0: 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74  .**        sqlit
fad0: 65 33 72 65 62 61 73 65 72 5f 64 65 6c 65 74 65  e3rebaser_delete
fae0: 28 29 2e 0a 2a 2a 20 3c 2f 6f 6c 3e 0a 2a 2f 0a  ()..** </ol>.*/.
faf0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
fb00: 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20 73  qlite3_rebaser s
fb10: 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 3b 0a  qlite3_rebaser;.
fb20: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
fb30: 20 43 72 65 61 74 65 20 61 20 63 68 61 6e 67 65   Create a change
fb40: 73 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65  set rebaser obje
fb50: 63 74 2e 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e  ct..** EXPERIMEN
fb60: 54 41 4c 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  TAL.**.** Alloca
fb70: 74 65 20 61 20 6e 65 77 20 63 68 61 6e 67 65 73  te a new changes
fb80: 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63  et rebaser objec
fb90: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
fba0: 2c 20 73 65 74 20 28 2a 70 70 4e 65 77 29 20 74  , set (*ppNew) t
fbb0: 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  o.** point to th
fbc0: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
fbd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fbe0: 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  K. Otherwise, if
fbf0: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
fc00: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
fc10: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
fc20: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f   (e.g. SQLITE_NO
fc30: 4d 45 4d 29 20 61 6e 64 20 73 65 74 20 28 2a 70  MEM) and set (*p
fc40: 70 4e 65 77 29 20 0a 2a 2a 20 74 6f 20 4e 55 4c  pNew) .** to NUL
fc50: 4c 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  L. .*/.int sqlit
fc60: 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74 65  e3rebaser_create
fc70: 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72  (sqlite3_rebaser
fc80: 20 2a 2a 70 70 4e 65 77 29 3b 0a 0a 2f 2a 0a 2a   **ppNew);../*.*
fc90: 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 66  * CAPI3REF: Conf
fca0: 69 67 75 72 65 20 61 20 63 68 61 6e 67 65 73 65  igure a changese
fcb0: 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74  t rebaser object
fcc0: 2e 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41  ..** EXPERIMENTA
fcd0: 4c 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  L.**.** Configur
fce0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  e the changeset 
fcf0: 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20 74  rebaser object t
fd00: 6f 20 72 65 62 61 73 65 20 63 68 61 6e 67 65 73  o rebase changes
fd10: 65 74 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a  ets according.**
fd20: 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   to the conflict
fd30: 20 72 65 73 6f 6c 75 74 69 6f 6e 73 20 64 65 73   resolutions des
fd40: 63 72 69 62 65 64 20 62 79 20 62 75 66 66 65 72  cribed by buffer
fd50: 20 70 52 65 62 61 73 65 20 28 73 69 7a 65 20 6e   pRebase (size n
fd60: 52 65 62 61 73 65 0a 2a 2a 20 62 79 74 65 73 29  Rebase.** bytes)
fd70: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 68 61 76  , which must hav
fd80: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
fd90: 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20  from a previous 
fda0: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
fdb0: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
fdc0: 79 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  y_v2()..*/.int s
fdd0: 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63 6f  qlite3rebaser_co
fde0: 6e 66 69 67 75 72 65 28 0a 20 20 73 71 6c 69 74  nfigure(.  sqlit
fdf0: 65 33 5f 72 65 62 61 73 65 72 2a 2c 20 0a 20 20  e3_rebaser*, .  
fe00: 69 6e 74 20 6e 52 65 62 61 73 65 2c 20 63 6f 6e  int nRebase, con
fe10: 73 74 20 76 6f 69 64 20 2a 70 52 65 62 61 73 65  st void *pRebase
fe20: 0a 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  .); ../*.** CAPI
fe30: 33 52 45 46 3a 20 52 65 62 61 73 65 20 61 20 63  3REF: Rebase a c
fe40: 68 61 6e 67 65 73 65 74 0a 2a 2a 20 45 58 50 45  hangeset.** EXPE
fe50: 52 49 4d 45 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 41  RIMENTAL.**.** A
fe60: 72 67 75 6d 65 6e 74 20 70 49 6e 20 6d 75 73 74  rgument pIn must
fe70: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
fe80: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
fe90: 63 68 61 6e 67 65 73 65 74 20 6e 49 6e 20 62 79  changeset nIn by
fea0: 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20  tes.** in size. 
feb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
fec0: 6c 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75  locates and popu
fed0: 6c 61 74 65 73 20 61 20 62 75 66 66 65 72 20 77  lates a buffer w
fee0: 69 74 68 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  ith a copy.** of
fef0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 72   the changeset r
ff00: 65 62 61 73 65 64 20 72 65 62 61 73 65 64 20 61  ebased rebased a
ff10: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
ff20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66  configuration of
ff30: 20 74 68 65 0a 2a 2a 20 72 65 62 61 73 65 72 20   the.** rebaser 
ff40: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
ff50: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
ff60: 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73 73 66  ent. If successf
ff70: 75 6c 2c 20 28 2a 70 70 4f 75 74 29 0a 2a 2a 20  ul, (*ppOut).** 
ff80: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
ff90: 74 6f 20 74 68 65 20 6e 65 77 20 62 75 66 66 65  to the new buffe
ffa0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
ffb0: 20 72 65 62 61 73 65 64 20 63 68 61 6e 67 73 65   rebased changse
ffc0: 74 20 61 6e 64 20 0a 2a 2a 20 28 2a 70 6e 4f 75  t and .** (*pnOu
ffd0: 74 29 20 74 6f 20 69 74 73 20 73 69 7a 65 20 69  t) to its size i
ffe0: 6e 20 62 79 74 65 73 20 61 6e 64 20 53 51 4c 49  n bytes and SQLI
fff0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
10000 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  It is the.** res
10010 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
10020 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
10030 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
10040 20 6e 65 77 20 62 75 66 66 65 72 20 75 73 69 6e   new buffer usin
10050 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
10060 65 28 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  e(). Otherwise, 
10070 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
10080 72 73 2c 20 28 2a 70 70 4f 75 74 29 20 61 6e 64  rs, (*ppOut) and
10090 20 28 2a 70 6e 4f 75 74 29 0a 2a 2a 20 61 72 65   (*pnOut).** are
100a0 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
100b0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
100c0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 0a   code returned..
100d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 65  */.int sqlite3re
100e0 62 61 73 65 72 5f 72 65 62 61 73 65 28 0a 20 20  baser_rebase(.  
100f0 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 2a  sqlite3_rebaser*
10100 2c 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e  ,.  int nIn, con
10110 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c 20 0a 20  st void *pIn, . 
10120 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69   int *pnOut, voi
10130 64 20 2a 2a 70 70 4f 75 74 20 0a 29 3b 0a 0a 2f  d **ppOut .);../
10140 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
10150 65 6c 65 74 65 20 61 20 63 68 61 6e 67 65 73 65  elete a changese
10160 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74  t rebaser object
10170 2e 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41  ..** EXPERIMENTA
10180 4c 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  L.**.** Delete t
10190 68 65 20 63 68 61 6e 67 65 73 65 74 20 72 65 62  he changeset reb
101a0 61 73 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  aser object and 
101b0 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72  all associated r
101c0 65 73 6f 75 72 63 65 73 2e 20 54 68 65 72 65 0a  esources. There.
101d0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  ** should be one
101e0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
101f0 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
10200 73 75 63 63 65 73 73 66 75 6c 20 69 6e 76 6f 63  successful invoc
10210 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 73 71 6c 69  ation.** of sqli
10220 74 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74  te3rebaser_creat
10230 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  e()..*/.void sql
10240 69 74 65 33 72 65 62 61 73 65 72 5f 64 65 6c 65  ite3rebaser_dele
10250 74 65 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73  te(sqlite3_rebas
10260 65 72 20 2a 70 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20  er *p); ../*.** 
10270 43 41 50 49 33 52 45 46 3a 20 53 74 72 65 61 6d  CAPI3REF: Stream
10280 69 6e 67 20 56 65 72 73 69 6f 6e 73 20 6f 66 20  ing Versions of 
10290 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  API functions..*
102a0 2a 0a 2a 2a 20 54 68 65 20 73 69 78 20 73 74 72  *.** The six str
102b0 65 61 6d 69 6e 67 20 41 50 49 20 78 78 78 5f 73  eaming API xxx_s
102c0 74 72 6d 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  trm() functions 
102d0 73 65 72 76 65 20 73 69 6d 69 6c 61 72 20 70 75  serve similar pu
102e0 72 70 6f 73 65 73 20 74 6f 20 74 68 65 20 0a 2a  rposes to the .*
102f0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
10300 6e 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 41 50  non-streaming AP
10310 49 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  I functions:.**.
10320 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72  ** <table border
10330 3d 31 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e  =1 style="margin
10340 2d 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e  -left:8ex;margin
10350 2d 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20  -right:8ex">.** 
10360 20 20 3c 74 72 3e 3c 74 68 3e 53 74 72 65 61 6d    <tr><th>Stream
10370 69 6e 67 20 66 75 6e 63 74 69 6f 6e 3c 74 68 3e  ing function<th>
10380 4e 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 65 71  Non-streaming eq
10390 75 69 76 61 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a  uivalent</th>.**
103a0 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74     <tr><td>sqlit
103b0 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
103c0 79 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74  y_strm<td>[sqlit
103d0 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
103e0 79 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64  y] .**   <tr><td
103f0 3e 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  >sqlite3changese
10400 74 5f 61 70 70 6c 79 5f 73 74 72 6d 5f 76 32 3c  t_apply_strm_v2<
10410 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  td>[sqlite3chang
10420 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 5d 20 0a  eset_apply_v2] .
10430 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c  **   <tr><td>sql
10440 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
10450 6e 63 61 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71  ncat_strm<td>[sq
10460 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63  lite3changeset_c
10470 6f 6e 63 61 74 5d 20 0a 2a 2a 20 20 20 3c 74 72  oncat] .**   <tr
10480 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61 6e  ><td>sqlite3chan
10490 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 73 74 72  geset_invert_str
104a0 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61  m<td>[sqlite3cha
104b0 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5d 20 0a  ngeset_invert] .
104c0 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c  **   <tr><td>sql
104d0 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
104e0 61 72 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c  art_strm<td>[sql
104f0 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
10500 61 72 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c  art] .**   <tr><
10510 74 64 3e 73 71 6c 69 74 65 33 73 65 73 73 69 6f  td>sqlite3sessio
10520 6e 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72 6d  n_changeset_strm
10530 3c 74 64 3e 5b 73 71 6c 69 74 65 33 73 65 73 73  <td>[sqlite3sess
10540 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5d 20 0a  ion_changeset] .
10550 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c  **   <tr><td>sql
10560 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63  ite3session_patc
10570 68 73 65 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71  hset_strm<td>[sq
10580 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
10590 63 68 73 65 74 5d 20 0a 2a 2a 20 3c 2f 74 61 62  chset] .** </tab
105a0 6c 65 3e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 73 74  le>.**.** Non-st
105b0 72 65 61 6d 69 6e 67 20 66 75 6e 63 74 69 6f 6e  reaming function
105c0 73 20 74 68 61 74 20 61 63 63 65 70 74 20 63 68  s that accept ch
105d0 61 6e 67 65 73 65 74 73 20 28 6f 72 20 70 61 74  angesets (or pat
105e0 63 68 73 65 74 73 29 20 61 73 20 69 6e 70 75 74  chsets) as input
105f0 0a 2a 2a 20 72 65 71 75 69 72 65 20 74 68 61 74  .** require that
10600 20 74 68 65 20 65 6e 74 69 72 65 20 63 68 61 6e   the entire chan
10610 67 65 73 65 74 20 62 65 20 73 74 6f 72 65 64 20  geset be stored 
10620 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 75 66 66  in a single buff
10630 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 0a 2a  er in memory. .*
10640 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 6f  * Similarly, tho
10650 73 65 20 74 68 61 74 20 72 65 74 75 72 6e 20 61  se that return a
10660 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61   changeset or pa
10670 74 63 68 73 65 74 20 64 6f 20 73 6f 20 62 79 20  tchset do so by 
10680 72 65 74 75 72 6e 69 6e 67 20 0a 2a 2a 20 61 20  returning .** a 
10690 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  pointer to a sin
106a0 67 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72  gle large buffer
106b0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
106c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
106d0 29 2e 20 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 20  ). .** Normally 
106e0 74 68 69 73 20 69 73 20 63 6f 6e 76 65 6e 69 65  this is convenie
106f0 6e 74 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  nt. However, if 
10700 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 72  an application r
10710 75 6e 6e 69 6e 67 20 69 6e 20 61 20 0a 2a 2a 20  unning in a .** 
10720 6c 6f 77 2d 6d 65 6d 6f 72 79 20 65 6e 76 69 72  low-memory envir
10730 6f 6e 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72  onment is requir
10740 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 76 65 72  ed to handle ver
10750 79 20 6c 61 72 67 65 20 63 68 61 6e 67 65 73 65  y large changese
10760 74 73 2c 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65  ts, the.** large
10770 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f   contiguous memo
10780 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 72  ry allocations r
10790 65 71 75 69 72 65 64 20 63 61 6e 20 62 65 63 6f  equired can beco
107a0 6d 65 20 6f 6e 65 72 6f 75 73 2e 0a 2a 2a 0a 2a  me onerous..**.*
107b0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  * In order to av
107c0 6f 69 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  oid this problem
107d0 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73  , instead of a s
107e0 69 6e 67 6c 65 20 6c 61 72 67 65 20 62 75 66 66  ingle large buff
107f0 65 72 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  er, input.** is 
10800 70 61 73 73 65 64 20 74 6f 20 61 20 73 74 72 65  passed to a stre
10810 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69  aming API functi
10820 6f 6e 73 20 62 79 20 77 61 79 20 6f 66 20 61 20  ons by way of a 
10830 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
10840 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 73 65  n that.** the se
10850 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e  ssions module in
10860 76 6f 6b 65 73 20 74 6f 20 69 6e 63 72 65 6d 65  vokes to increme
10870 6e 74 61 6c 6c 79 20 72 65 71 75 65 73 74 20 69  ntally request i
10880 6e 70 75 74 20 64 61 74 61 20 61 73 20 69 74 20  nput data as it 
10890 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2e 20  is.** required. 
108a0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 61 20  In all cases, a 
108b0 70 61 69 72 20 6f 66 20 41 50 49 20 66 75 6e 63  pair of API func
108c0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
108d0 73 75 63 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 3c  such as.**.**  <
108e0 70 72 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20  pre>.**  &nbsp; 
108f0 20 20 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73      int nChanges
10900 65 74 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20  et,.**  &nbsp;  
10910 20 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65     void *pChange
10920 73 65 74 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  set,.**  </pre>.
10930 2a 2a 0a 2a 2a 20 49 73 20 72 65 70 6c 61 63 65  **.** Is replace
10940 64 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72  d by:.**.**  <pr
10950 65 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20  e>.**  &nbsp;   
10960 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
10970 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20  void *pIn, void 
10980 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44  *pData, int *pnD
10990 61 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b  ata),.**  &nbsp;
109a0 20 20 20 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a       void *pIn,.
109b0 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a  **  </pre>.**.**
109c0 20 45 61 63 68 20 74 69 6d 65 20 74 68 65 20 78   Each time the x
109d0 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 69  Input callback i
109e0 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  s invoked by the
109f0 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65   sessions module
10a00 2c 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  , the first.** a
10a10 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 69  rgument passed i
10a20 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
10a30 73 75 70 70 6c 69 65 64 20 70 49 6e 20 63 6f 6e  supplied pIn con
10a40 74 65 78 74 20 70 6f 69 6e 74 65 72 2e 20 54 68  text pointer. Th
10a50 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
10a60 75 6d 65 6e 74 2c 20 70 44 61 74 61 2c 20 70 6f  ument, pData, po
10a70 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
10a80 20 28 2a 70 6e 44 61 74 61 29 20 62 79 74 65 73   (*pnData) bytes
10a90 20 69 6e 20 73 69 7a 65 2e 20 41 73 73 75 6d 69   in size. Assumi
10aa0 6e 67 20 6e 6f 20 0a 2a 2a 20 65 72 72 6f 72 20  ng no .** error 
10ab0 6f 63 63 75 72 73 20 74 68 65 20 78 49 6e 70 75  occurs the xInpu
10ac0 74 20 6d 65 74 68 6f 64 20 73 68 6f 75 6c 64 20  t method should 
10ad0 63 6f 70 79 20 75 70 20 74 6f 20 28 2a 70 6e 44  copy up to (*pnD
10ae0 61 74 61 29 20 62 79 74 65 73 20 6f 66 20 64 61  ata) bytes of da
10af0 74 61 20 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ta .** into the 
10b00 62 75 66 66 65 72 20 61 6e 64 20 73 65 74 20 28  buffer and set (
10b10 2a 70 6e 44 61 74 61 29 20 74 6f 20 74 68 65 20  *pnData) to the 
10b20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66  actual number of
10b30 20 62 79 74 65 73 20 63 6f 70 69 65 64 20 0a 2a   bytes copied .*
10b40 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
10b50 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
10b60 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 63 6f   the input is co
10b70 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
10b80 65 64 2c 20 28 2a 70 6e 44 61 74 61 29 20 0a 2a  ed, (*pnData) .*
10b90 2a 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  * should be set 
10ba0 74 6f 20 7a 65 72 6f 20 74 6f 20 69 6e 64 69 63  to zero to indic
10bb0 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
10bc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10bd0 2c 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20  , an SQLite .** 
10be0 65 72 72 6f 72 20 63 6f 64 65 20 73 68 6f 75 6c  error code shoul
10bf0 64 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 49  d be returned. I
10c00 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 69 66 20  n all cases, if 
10c10 61 6e 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61  an xInput callba
10c20 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 6e  ck returns.** an
10c30 20 65 72 72 6f 72 2c 20 61 6c 6c 20 70 72 6f 63   error, all proc
10c40 65 73 73 69 6e 67 20 69 73 20 61 62 61 6e 64 6f  essing is abando
10c50 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 72 65  ned and the stre
10c60 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69  aming API functi
10c70 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
10c80 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
10c90 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10ca0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ller..**.** In t
10cb0 68 65 20 63 61 73 65 20 6f 66 20 73 71 6c 69 74  he case of sqlit
10cc0 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72  e3changeset_star
10cd0 74 5f 73 74 72 6d 28 29 2c 20 74 68 65 20 78 49  t_strm(), the xI
10ce0 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nput callback ma
10cf0 79 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  y be.** invoked 
10d00 62 79 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20  by the sessions 
10d10 6d 6f 64 75 6c 65 20 61 74 20 61 6e 79 20 70 6f  module at any po
10d20 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c  int during the l
10d30 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 0a 2a  ifetime of the.*
10d40 2a 20 69 74 65 72 61 74 6f 72 2e 20 49 66 20 73  * iterator. If s
10d50 75 63 68 20 61 6e 20 78 49 6e 70 75 74 20 63 61  uch an xInput ca
10d60 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 61  llback returns a
10d70 6e 20 65 72 72 6f 72 2c 20 74 68 65 20 69 74 65  n error, the ite
10d80 72 61 74 6f 72 20 65 6e 74 65 72 73 0a 2a 2a 20  rator enters.** 
10d90 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
10da0 77 68 65 72 65 62 79 20 61 6c 6c 20 73 75 62 73  whereby all subs
10db0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
10dc0 69 74 65 72 61 74 6f 72 20 66 75 6e 63 74 69 6f  iterator functio
10dd0 6e 73 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ns .** immediate
10de0 6c 79 20 66 61 69 6c 20 77 69 74 68 20 74 68 65  ly fail with the
10df0 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
10e00 20 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   as returned by 
10e10 78 49 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 53 69  xInput..**.** Si
10e20 6d 69 6c 61 72 6c 79 2c 20 73 74 72 65 61 6d 69  milarly, streami
10e30 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  ng API functions
10e40 20 74 68 61 74 20 72 65 74 75 72 6e 20 63 68 61   that return cha
10e50 6e 67 65 73 65 74 73 20 28 6f 72 20 70 61 74 63  ngesets (or patc
10e60 68 73 65 74 73 29 0a 2a 2a 20 72 65 74 75 72 6e  hsets).** return
10e70 20 74 68 65 6d 20 69 6e 20 63 68 75 6e 6b 73 20   them in chunks 
10e80 62 79 20 77 61 79 20 6f 66 20 61 20 63 61 6c 6c  by way of a call
10e90 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 69 6e  back function in
10ea0 73 74 65 61 64 20 6f 66 20 76 69 61 20 61 0a 2a  stead of via a.*
10eb0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
10ec0 69 6e 67 6c 65 20 6c 61 72 67 65 20 62 75 66 66  ingle large buff
10ed0 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
10ee0 2c 20 61 20 70 61 69 72 20 6f 66 20 70 61 72 61  , a pair of para
10ef0 6d 65 74 65 72 73 20 73 75 63 68 0a 2a 2a 20 61  meters such.** a
10f00 73 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a  s:.**.**  <pre>.
10f10 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69  **  &nbsp;     i
10f20 6e 74 20 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c  nt *pnChangeset,
10f30 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20  .**  &nbsp;     
10f40 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67 65 73  void **ppChanges
10f50 65 74 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a  et,.**  </pre>.*
10f60 2a 0a 2a 2a 20 49 73 20 72 65 70 6c 61 63 65 64  *.** Is replaced
10f70 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65   by:.**.**  <pre
10f80 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  >.**  &nbsp;    
10f90 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28   int (*xOutput)(
10fa0 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73  void *pOut, cons
10fb0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
10fc0 6e 74 20 6e 44 61 74 61 29 2c 0a 2a 2a 20 20 26  nt nData),.**  &
10fd0 6e 62 73 70 3b 20 20 20 20 20 76 6f 69 64 20 2a  nbsp;     void *
10fe0 70 4f 75 74 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  pOut.**  </pre>.
10ff0 2a 2a 0a 2a 2a 20 54 68 65 20 78 4f 75 74 70 75  **.** The xOutpu
11000 74 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  t callback is in
11010 76 6f 6b 65 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  voked zero or mo
11020 72 65 20 74 69 6d 65 73 20 74 6f 20 72 65 74 75  re times to retu
11030 72 6e 20 64 61 74 61 20 74 6f 0a 2a 2a 20 74 68  rn data to.** th
11040 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54  e application. T
11050 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
11060 65 72 20 70 61 73 73 65 64 20 74 6f 20 65 61 63  er passed to eac
11070 68 20 63 61 6c 6c 20 69 73 20 61 20 63 6f 70 79  h call is a copy
11080 20 6f 66 20 74 68 65 0a 2a 2a 20 70 4f 75 74 20   of the.** pOut 
11090 70 6f 69 6e 74 65 72 20 73 75 70 70 6c 69 65 64  pointer supplied
110a0 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
110b0 69 6f 6e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ion. The second 
110c0 70 61 72 61 6d 65 74 65 72 2c 20 70 44 61 74 61  parameter, pData
110d0 2c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  ,.** points to a
110e0 20 62 75 66 66 65 72 20 6e 44 61 74 61 20 62 79   buffer nData by
110f0 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  tes in size cont
11100 61 69 6e 69 6e 67 20 74 68 65 20 63 68 75 6e 6b  aining the chunk
11110 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2a 20 64 61   of output.** da
11120 74 61 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  ta being returne
11130 64 2e 20 49 66 20 74 68 65 20 78 4f 75 74 70 75  d. If the xOutpu
11140 74 20 63 61 6c 6c 62 61 63 6b 20 73 75 63 63 65  t callback succe
11150 73 73 66 75 6c 6c 79 20 70 72 6f 63 65 73 73 65  ssfully processe
11160 73 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65  s the.** supplie
11170 64 20 64 61 74 61 2c 20 69 74 20 73 68 6f 75 6c  d data, it shoul
11180 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
11190 4f 4b 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73  OK to indicate s
111a0 75 63 63 65 73 73 2e 20 4f 74 68 65 72 77 69 73  uccess. Otherwis
111b0 65 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  e,.** it should 
111c0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
111d0 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
111e0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
111f0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  e processing.** 
11200 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  is immediately a
11210 62 61 6e 64 6f 6e 65 64 20 61 6e 64 20 74 68 65  bandoned and the
11220 20 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66   streaming API f
11230 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11240 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
11250 20 78 4f 75 74 70 75 74 20 65 72 72 6f 72 20 63   xOutput error c
11260 6f 64 65 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ode to the appli
11270 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
11280 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c  e sessions modul
11290 65 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  e never invokes 
112a0 61 6e 20 78 4f 75 74 70 75 74 20 63 61 6c 6c 62  an xOutput callb
112b0 61 63 6b 20 77 69 74 68 20 74 68 65 20 74 68 69  ack with the thi
112c0 72 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  rd .** parameter
112d0 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
112e0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
112f0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 4f 74 68 65  al to zero. Othe
11300 72 20 74 68 61 6e 20 74 68 69 73 2c 0a 2a 2a 20  r than this,.** 
11310 6e 6f 20 67 75 61 72 61 6e 74 65 65 73 20 61 72  no guarantees ar
11320 65 20 6d 61 64 65 20 61 73 20 74 6f 20 74 68 65  e made as to the
11330 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 68 75   size of the chu
11340 6e 6b 73 20 6f 66 20 64 61 74 61 20 72 65 74 75  nks of data retu
11350 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
11360 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
11370 70 6c 79 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69  ply_strm(.  sqli
11380 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
113a0 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22  pply change to "
113b0 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73  main" db of this
113c0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
113d0 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20   (*xInput)(void 
113e0 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74  *pIn, void *pDat
113f0 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c  a, int *pnData),
11400 20 2f 2a 20 49 6e 70 75 74 20 66 75 6e 63 74 69   /* Input functi
11410 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49  on */.  void *pI
11420 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11450 69 72 73 74 20 61 72 67 20 66 6f 72 20 78 49 6e  irst arg for xIn
11460 70 75 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46  put */.  int(*xF
11470 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64  ilter)(.    void
11480 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
11490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
114a0 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74  y of sixth arg t
114b0 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
114c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
114d0 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
114e0 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
114f0 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  .  ),.  int(*xCo
11500 6e 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69  nflict)(.    voi
11510 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
11520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11530 70 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20  py of sixth arg 
11540 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20  to _apply() */. 
11550 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74     int eConflict
11560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11570 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e   /* DATA, MISSIN
11580 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e  G, CONFLICT, CON
11590 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73  STRAINT */.    s
115a0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
115b0 5f 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20  _iter *p     /* 
115c0 48 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e  Handle describin
115d0 67 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e  g change and con
115e0 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20  flict */.  ),.  
115f0 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20  void *pCtx      
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
11620 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e  t passed to xCon
11630 66 6c 69 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20  flict */.);.int 
11640 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
11650 5f 61 70 70 6c 79 5f 76 32 5f 73 74 72 6d 28 0a  _apply_v2_strm(.
11660 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e 67    /* Apply chang
11690 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20 6f  e to "main" db o
116a0 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f  f this handle */
116b0 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29  .  int (*xInput)
116c0 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
116d0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
116e0 44 61 74 61 29 2c 20 2f 2a 20 49 6e 70 75 74 20  Data), /* Input 
116f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
11700 69 64 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  id *pIn,        
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 66    /* First arg f
11740 6f 72 20 78 49 6e 70 75 74 20 2a 2f 0a 20 20 69  or xInput */.  i
11750 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20  nt(*xFilter)(.  
11760 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68  /* Copy of sixth
11790 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29   arg to _apply()
117a0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
117b0 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20  ar *zTab        
117c0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e        /* Table n
117d0 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e  ame */.  ),.  in
117e0 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20  t(*xConflict)(. 
117f0 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20     void *pCtx,  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74   /* Copy of sixt
11820 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28  h arg to _apply(
11830 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f  ) */.    int eCo
11840 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20  nflict,         
11850 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20         /* DATA, 
11860 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43  MISSING, CONFLIC
11870 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f  T, CONSTRAINT */
11880 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61  .    sqlite3_cha
11890 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20  ngeset_iter *p  
118a0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73     /* Handle des
118b0 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61  cribing change a
118c0 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  nd conflict */. 
118d0 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   ),.  void *pCtx
118e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
118f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
11900 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
11910 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  o xConflict */. 
11920 20 76 6f 69 64 20 2a 2a 70 70 52 65 62 61 73 65   void **ppRebase
11930 2c 20 69 6e 74 20 2a 70 6e 52 65 62 61 73 65 2c  , int *pnRebase,
11940 0a 20 20 69 6e 74 20 66 6c 61 67 73 0a 29 3b 0a  .  int flags.);.
11950 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
11960 65 73 65 74 5f 63 6f 6e 63 61 74 5f 73 74 72 6d  eset_concat_strm
11970 28 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  (.  int (*xInput
11980 41 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  A)(void *pIn, vo
11990 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
119a0 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20  pnData),.  void 
119b0 2a 70 49 6e 41 2c 0a 20 20 69 6e 74 20 28 2a 78  *pInA,.  int (*x
119c0 49 6e 70 75 74 42 29 28 76 6f 69 64 20 2a 70 49  InputB)(void *pI
119d0 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  n, void *pData, 
119e0 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20  int *pnData),.  
119f0 76 6f 69 64 20 2a 70 49 6e 42 2c 0a 20 20 69 6e  void *pInB,.  in
11a00 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69  t (*xOutput)(voi
11a10 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76  d *pOut, const v
11a20 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
11a30 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
11a40 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  pOut.);.int sqli
11a50 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76  te3changeset_inv
11a60 65 72 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74 20  ert_strm(.  int 
11a70 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a  (*xInput)(void *
11a80 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  pIn, void *pData
11a90 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a  , int *pnData),.
11aa0 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 20 20 69    void *pIn,.  i
11ab0 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f  nt (*xOutput)(vo
11ac0 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20  id *pOut, const 
11ad0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
11ae0 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20   nData),.  void 
11af0 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c  *pOut.);.int sql
11b00 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
11b10 61 72 74 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69  art_strm(.  sqli
11b20 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
11b30 65 72 20 2a 2a 70 70 2c 0a 20 20 69 6e 74 20 28  er **pp,.  int (
11b40 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70  *xInput)(void *p
11b50 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  In, void *pData,
11b60 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20   int *pnData),. 
11b70 20 76 6f 69 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e   void *pIn.);.in
11b80 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
11b90 65 74 5f 73 74 61 72 74 5f 76 32 5f 73 74 72 6d  et_start_v2_strm
11ba0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
11bb0 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c  geset_iter **pp,
11bc0 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29  .  int (*xInput)
11bd0 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
11be0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
11bf0 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
11c00 49 6e 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 0a  In,.  int flags.
11c10 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  );.int sqlite3se
11c20 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5f  ssion_changeset_
11c30 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f  strm(.  sqlite3_
11c40 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
11c50 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70  n,.  int (*xOutp
11c60 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ut)(void *pOut, 
11c70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
11c80 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20  a, int nData),. 
11c90 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69   void *pOut.);.i
11ca0 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
11cb0 6e 5f 70 61 74 63 68 73 65 74 5f 73 74 72 6d 28  n_patchset_strm(
11cc0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
11cd0 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20 20  on *pSession,.  
11ce0 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76  int (*xOutput)(v
11cf0 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74  oid *pOut, const
11d00 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
11d10 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  t nData),.  void
11d20 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73 71   *pOut.);.int sq
11d30 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
11d40 5f 61 64 64 5f 73 74 72 6d 28 73 71 6c 69 74 65  _add_strm(sqlite
11d50 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c 20  3_changegroup*, 
11d60 0a 20 20 20 20 69 6e 74 20 28 2a 78 49 6e 70 75  .    int (*xInpu
11d70 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  t)(void *pIn, vo
11d80 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
11d90 70 6e 44 61 74 61 29 2c 0a 20 20 20 20 76 6f 69  pnData),.    voi
11da0 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71  d *pIn.);.int sq
11db0 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
11dc0 5f 6f 75 74 70 75 74 5f 73 74 72 6d 28 73 71 6c  _output_strm(sql
11dd0 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
11de0 2a 2c 0a 20 20 20 20 69 6e 74 20 28 2a 78 4f 75  *,.    int (*xOu
11df0 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74  tput)(void *pOut
11e00 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44  , const void *pD
11e10 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c  ata, int nData),
11e20 20 0a 20 20 20 20 76 6f 69 64 20 2a 70 4f 75 74   .    void *pOut
11e30 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .);.int sqlite3r
11e40 65 62 61 73 65 72 5f 72 65 62 61 73 65 5f 73 74  ebaser_rebase_st
11e50 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  rm(.  sqlite3_re
11e60 62 61 73 65 72 20 2a 70 52 65 62 61 73 65 72 2c  baser *pRebaser,
11e70 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29  .  int (*xInput)
11e80 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
11e90 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
11ea0 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
11eb0 49 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  In,.  int (*xOut
11ec0 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
11ed0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
11ee0 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
11ef0 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a    void *pOut.);.
11f00 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
11f10 20 43 6f 6e 66 69 67 75 72 65 20 67 6c 6f 62 61   Configure globa
11f20 6c 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 0a  l parameters.**.
11f30 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 73 65  ** The sqlite3se
11f40 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 20 69  ssion_config() i
11f50 6e 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64  nterface is used
11f60 20 74 6f 20 6d 61 6b 65 20 67 6c 6f 62 61 6c 20   to make global 
11f70 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a  configuration.**
11f80 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
11f90 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20  sessions module 
11fa0 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 75 6e 65  in order to tune
11fb0 20 69 74 20 74 6f 20 74 68 65 20 73 70 65 63 69   it to the speci
11fc0 66 69 63 20 6e 65 65 64 73 20 0a 2a 2a 20 6f 66  fic needs .** of
11fd0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
11fe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
11ff0 74 65 33 73 65 73 73 69 6f 6e 5f 63 6f 6e 66 69  te3session_confi
12000 67 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73  g() interface is
12010 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
12020 20 49 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   If it is invoke
12030 64 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 6f  d.** while any o
12040 74 68 65 72 20 74 68 72 65 61 64 20 69 73 20 69  ther thread is i
12050 6e 73 69 64 65 20 61 6e 79 20 6f 74 68 65 72 20  nside any other 
12060 73 65 73 73 69 6f 6e 73 20 6d 65 74 68 6f 64 20  sessions method 
12070 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  then the.** resu
12080 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
12090 64 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  d. Furthermore, 
120a0 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  if it is invoked
120b0 20 61 66 74 65 72 20 61 6e 79 20 73 65 73 73 69   after any sessi
120c0 6f 6e 73 0a 2a 2a 20 72 65 6c 61 74 65 64 20 6f  ons.** related o
120d0 62 6a 65 63 74 73 20 68 61 76 65 20 62 65 65 6e  bjects have been
120e0 20 63 72 65 61 74 65 64 2c 20 74 68 65 20 72 65   created, the re
120f0 73 75 6c 74 73 20 61 72 65 20 61 6c 73 6f 20 75  sults are also u
12100 6e 64 65 66 69 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  ndefined. .**.**
12110 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
12120 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
12130 65 33 73 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67  e3session_config
12140 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
12150 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68   be one.** of th
12160 65 20 53 51 4c 49 54 45 5f 53 45 53 53 49 4f 4e  e SQLITE_SESSION
12170 5f 43 4f 4e 46 49 47 5f 58 58 58 20 63 6f 6e 73  _CONFIG_XXX cons
12180 74 61 6e 74 73 20 64 65 66 69 6e 65 64 20 62 65  tants defined be
12190 6c 6f 77 2e 20 54 68 65 20 0a 2a 2a 20 69 6e 74  low. The .** int
121a0 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
121b0 68 65 20 28 76 6f 69 64 2a 29 20 76 61 6c 75 65  he (void*) value
121c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
121d0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
121e0 61 6e 64 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  and.** the effec
121f0 74 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68 69  t of calling thi
12200 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e  s function depen
12210 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
12220 6f 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  of the first.** 
12230 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
12240 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c   <dl>.** <dt>SQL
12250 49 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f 4e 46  ITE_SESSION_CONF
12260 49 47 5f 53 54 52 4d 53 49 5a 45 3c 64 64 3e 0a  IG_STRMSIZE<dd>.
12270 2a 2a 20 20 20 20 42 79 20 64 65 66 61 75 6c 74  **    By default
12280 2c 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d  , the sessions m
12290 6f 64 75 6c 65 20 73 74 72 65 61 6d 69 6e 67 20  odule streaming 
122a0 69 6e 74 65 72 66 61 63 65 73 20 61 74 74 65 6d  interfaces attem
122b0 70 74 20 74 6f 20 69 6e 70 75 74 0a 2a 2a 20 20  pt to input.**  
122c0 20 20 61 6e 64 20 6f 75 74 70 75 74 20 64 61 74    and output dat
122d0 61 20 69 6e 20 61 70 70 72 6f 78 69 6d 61 74 65  a in approximate
122e0 6c 79 20 31 20 4b 69 42 20 63 68 75 6e 6b 73 2e  ly 1 KiB chunks.
122f0 20 54 68 69 73 20 6f 70 65 72 61 6e 64 20 6d 61   This operand ma
12300 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 20 20 20  y be used.**    
12310 74 6f 20 73 65 74 20 61 6e 64 20 71 75 65 72 79  to set and query
12320 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
12330 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
12340 20 73 65 74 74 69 6e 67 2e 20 54 68 65 20 70 6f   setting. The po
12350 69 6e 74 65 72 0a 2a 2a 20 20 20 20 70 61 73 73  inter.**    pass
12360 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
12370 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70   argument must p
12380 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 75 65 20  oint to a value 
12390 6f 66 20 74 79 70 65 20 28 69 6e 74 29 2e 0a 2a  of type (int)..*
123a0 2a 20 20 20 20 49 66 20 74 68 69 73 20 76 61 6c  *    If this val
123b0 75 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ue is greater th
123c0 61 6e 20 30 2c 20 69 74 20 69 73 20 75 73 65 64  an 0, it is used
123d0 20 61 73 20 74 68 65 20 6e 65 77 20 73 74 72 65   as the new stre
123e0 61 6d 69 6e 67 20 64 61 74 61 0a 2a 2a 20 20 20  aming data.**   
123f0 20 63 68 75 6e 6b 20 73 69 7a 65 20 66 6f 72 20   chunk size for 
12400 62 6f 74 68 20 69 6e 70 75 74 20 61 6e 64 20 6f  both input and o
12410 75 74 70 75 74 2e 20 42 65 66 6f 72 65 20 72 65  utput. Before re
12420 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 28 69 6e  turning, the (in
12430 74 29 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 70  t) value.**    p
12440 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 41 72  ointed to by pAr
12450 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
12460 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  final value of t
12470 68 65 20 73 74 72 65 61 6d 69 6e 67 20 69 6e 74  he streaming int
12480 65 72 66 61 63 65 0a 2a 2a 20 20 20 20 63 68 75  erface.**    chu
12490 6e 6b 20 73 69 7a 65 2e 0a 2a 2a 20 3c 2f 64 6c  nk size..** </dl
124a0 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
124b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
124c0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
124d0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
124e0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
124f0 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
12500 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
12510 6f 6e 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  on_config(int op
12520 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a 0a  , void *pArg);..
12530 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
12540 56 61 6c 75 65 73 20 66 6f 72 20 73 71 6c 69 74  Values for sqlit
12550 65 33 73 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67  e3session_config
12560 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ()..*/.#define S
12570 51 4c 49 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f  QLITE_SESSION_CO
12580 4e 46 49 47 5f 53 54 52 4d 53 49 5a 45 20 31 0a  NFIG_STRMSIZE 1.
12590 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
125a0 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 68 69   we can call thi
125b0 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 2b 2b  s stuff from C++
125c0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 63 70  ..*/.#ifdef __cp
125d0 6c 75 73 70 6c 75 73 0a 7d 0a 23 65 6e 64 69 66  lusplus.}.#endif
125e0 0a 0a 23 65 6e 64 69 66 20 20 2f 2a 20 21 64 65  ..#endif  /* !de
125f0 66 69 6e 65 64 28 5f 5f 53 51 4c 49 54 45 53 45  fined(__SQLITESE
12600 53 53 49 4f 4e 5f 48 5f 29 20 26 26 20 64 65 66  SSION_H_) && def
12610 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
12620 4c 45 5f 53 45 53 53 49 4f 4e 29 20 2a 2f 0a     LE_SESSION) */.