/ Hex Artifact Content
Login

Artifact 85fd2dc3df1532b0695beb345e2ff375c2745a4654b405fcbe33afa18baa6cc7:


0000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
0010: 53 51 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f  SQLITESESSION_H_
0020: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
0030: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
0040: 4f 4e 29 0a 23 64 65 66 69 6e 65 20 5f 5f 53 51  ON).#define __SQ
0050: 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f 20 31  LITESESSION_H_ 1
0060: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
0070: 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 68  e we can call th
0080: 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 2b  is stuff from C+
0090: 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 63  +..*/.#ifdef __c
00a0: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
00b0: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 23 69  "C" {.#endif..#i
00c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
00d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  h"../*.** CAPI3R
00e0: 45 46 3a 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65  EF: Session Obje
00f0: 63 74 20 48 61 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20  ct Handle.**.** 
0100: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0110: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 61 20  his object is a 
0120: 5b 73 65 73 73 69 6f 6e 5d 20 74 68 61 74 20 63  [session] that c
0130: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 2a 2a  an be used to.**
0140: 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   record changes 
0150: 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a  to a database..*
0160: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0170: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0180: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0190: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
01a0: 46 3a 20 43 68 61 6e 67 65 73 65 74 20 49 74 65  F: Changeset Ite
01b0: 72 61 74 6f 72 20 48 61 6e 64 6c 65 0a 2a 2a 0a  rator Handle.**.
01c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
01d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 63  f this object ac
01e0: 74 73 20 61 73 20 61 20 63 75 72 73 6f 72 20 66  ts as a cursor f
01f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 0a 2a 2a 20  or iterating.** 
0200: 6f 76 65 72 20 74 68 65 20 65 6c 65 6d 65 6e 74  over the element
0210: 73 20 6f 66 20 61 20 5b 63 68 61 6e 67 65 73 65  s of a [changese
0220: 74 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 5d  t] or [patchset]
0230: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0240: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
0250: 67 65 73 65 74 5f 69 74 65 72 20 73 71 6c 69 74  geset_iter sqlit
0260: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0270: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  r;../*.** CAPI3R
0280: 45 46 3a 20 43 72 65 61 74 65 20 41 20 4e 65 77  EF: Create A New
0290: 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a   Session Object.
02a0: 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20  ** CONSTRUCTOR: 
02b0: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a  sqlite3_session.
02c0: 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  **.** Create a n
02d0: 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63  ew session objec
02e0: 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 64 61  t attached to da
02f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
0300: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
0310: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0320: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
0330: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
0340: 70 53 65 73 73 69 6f 6e 20 61 6e 64 20 53 51 4c  pSession and SQL
0350: 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
0360: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
0370: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 65  or occurs, *ppSe
0380: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
0390: 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69  NULL and an SQLi
03a0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
03b0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f   (e.g. SQLITE_NO
03c0: 4d 45 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64  MEM) is returned
03d0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f  ..**.** It is po
03e0: 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
03f0: 20 6d 75 6c 74 69 70 6c 65 20 73 65 73 73 69 6f   multiple sessio
0400: 6e 20 6f 62 6a 65 63 74 73 20 61 74 74 61 63 68  n objects attach
0410: 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  ed to a single.*
0420: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
0430: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 73 73 69 6f 6e  e..**.** Session
0440: 20 6f 62 6a 65 63 74 73 20 63 72 65 61 74 65 64   objects created
0450: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0460: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64  tion should be d
0470: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 65  eleted using the
0480: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
0490: 69 6f 6e 5f 64 65 6c 65 74 65 28 29 5d 20 66 75  ion_delete()] fu
04a0: 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  nction before th
04b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
04c0: 65 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  e that they.** a
04d0: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  re attached to i
04e0: 73 20 69 74 73 65 6c 66 20 63 6c 6f 73 65 64 2e  s itself closed.
04f0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
0500: 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65   handle is close
0510: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
0520: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
0530: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 6e 20  s deleted, then 
0540: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
0550: 61 6c 6c 69 6e 67 20 61 6e 79 20 73 65 73 73 69  alling any sessi
0560: 6f 6e 0a 2a 2a 20 6d 6f 64 75 6c 65 20 66 75 6e  on.** module fun
0570: 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
0580: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
0590: 5f 64 65 6c 65 74 65 28 29 5d 20 6f 6e 20 74 68  _delete()] on th
05a0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
05b0: 0a 2a 2a 20 61 72 65 20 75 6e 64 65 66 69 6e 65  .** are undefine
05c0: 64 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  d..**.** Because
05d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64   the session mod
05e0: 75 6c 65 20 75 73 65 73 20 74 68 65 20 5b 73 71  ule uses the [sq
05f0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
0600: 68 6f 6f 6b 28 29 5d 20 41 50 49 2c 20 69 74 0a  hook()] API, it.
0610: 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
0620: 6c 65 20 66 6f 72 20 61 6e 20 61 70 70 6c 69 63  le for an applic
0630: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
0640: 72 20 61 20 70 72 65 2d 75 70 64 61 74 65 20 68  r a pre-update h
0650: 6f 6f 6b 20 6f 6e 20 61 0a 2a 2a 20 64 61 74 61  ook on a.** data
0660: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
0670: 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   has one or more
0680: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   session objects
0690: 20 61 74 74 61 63 68 65 64 2e 20 4e 6f 72 20 69   attached. Nor i
06a0: 73 0a 2a 2a 20 69 74 20 70 6f 73 73 69 62 6c 65  s.** it possible
06b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 73   to create a ses
06c0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 74 74 61  sion object atta
06d0: 63 68 65 64 20 74 6f 20 61 20 64 61 74 61 62 61  ched to a databa
06e0: 73 65 20 68 61 6e 64 6c 65 20 66 6f 72 0a 2a 2a  se handle for.**
06f0: 20 77 68 69 63 68 20 61 20 70 72 65 2d 75 70 64   which a pre-upd
0700: 61 74 65 20 68 6f 6f 6b 20 69 73 20 61 6c 72 65  ate hook is alre
0710: 61 64 79 20 64 65 66 69 6e 65 64 2e 20 54 68 65  ady defined. The
0720: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 74 74 65   results of atte
0730: 6d 70 74 69 6e 67 20 0a 2a 2a 20 65 69 74 68 65  mpting .** eithe
0740: 72 20 6f 66 20 74 68 65 73 65 20 74 68 69 6e 67  r of these thing
0750: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
0760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69  .**.** The sessi
0770: 6f 6e 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  on object will b
0780: 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
0790: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
07a0: 74 61 62 6c 65 73 20 69 6e 0a 2a 2a 20 64 61 74  tables in.** dat
07b0: 61 62 61 73 65 20 7a 44 62 2c 20 77 68 65 72 65  abase zDb, where
07c0: 20 7a 44 62 20 69 73 20 65 69 74 68 65 72 20 22   zDb is either "
07d0: 6d 61 69 6e 22 2c 20 6f 72 20 22 74 65 6d 70 22  main", or "temp"
07e0: 2c 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  , or the name of
07f0: 20 61 6e 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   an.** attached 
0800: 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
0810: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
0820: 64 61 74 61 62 61 73 65 20 7a 44 62 20 69 73 20  database zDb is 
0830: 6e 6f 74 20 61 74 74 61 63 68 65 64 0a 2a 2a 20  not attached.** 
0840: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0850: 77 68 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e  when the session
0860: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
0870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0880: 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65  e3session_create
0890: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
08c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
08d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08f0: 61 6d 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20  ame of db (e.g. 
0900: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c  "main") */.  sql
0910: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70  ite3_session **p
0920: 70 53 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20  pSession     /* 
0930: 4f 55 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e  OUT: New session
0940: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f   object */.);../
0950: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
0960: 65 6c 65 74 65 20 41 20 53 65 73 73 69 6f 6e 20  elete A Session 
0970: 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52 55  Object.** DESTRU
0980: 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 73 65  CTOR: sqlite3_se
0990: 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  ssion.**.** Dele
09a0: 74 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  te a session obj
09b0: 65 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ect previously a
09c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 0a  llocated using .
09d0: 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  ** [sqlite3sessi
09e0: 6f 6e 5f 63 72 65 61 74 65 28 29 5d 2e 20 4f 6e  on_create()]. On
09f0: 63 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  ce a session obj
0a00: 65 63 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  ect has been del
0a10: 65 74 65 64 2c 20 74 68 65 0a 2a 2a 20 72 65 73  eted, the.** res
0a20: 75 6c 74 73 20 6f 66 20 61 74 74 65 6d 70 74 69  ults of attempti
0a30: 6e 67 20 74 6f 20 75 73 65 20 70 53 65 73 73 69  ng to use pSessi
0a40: 6f 6e 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  on with any othe
0a50: 72 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65  r session module
0a60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  .** function are
0a70: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
0a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
0a90: 73 20 6d 75 73 74 20 62 65 20 64 65 6c 65 74 65  s must be delete
0aa0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  d before the dat
0ab0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
0ac0: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 72  which they.** ar
0ad0: 65 20 61 74 74 61 63 68 65 64 20 69 73 20 63 6c  e attached is cl
0ae0: 6f 73 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74  osed. Refer to t
0af0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0b00: 20 66 6f 72 20 0a 2a 2a 20 5b 73 71 6c 69 74 65   for .** [sqlite
0b10: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
0b20: 29 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  )] for details..
0b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73  */.void sqlite3s
0b40: 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 73 71  ession_delete(sq
0b50: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
0b60: 53 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f 2a 0a 2a  Session);.../*.*
0b70: 2a 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62  * CAPI3REF: Enab
0b80: 6c 65 20 4f 72 20 44 69 73 61 62 6c 65 20 41 20  le Or Disable A 
0b90: 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a  Session Object.*
0ba0: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
0bb0: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
0bc0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 69 6e 67 20  e the recording 
0be0: 6f 66 20 63 68 61 6e 67 65 73 20 62 79 20 61 20  of changes by a 
0bf0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
0c00: 57 68 65 6e 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  When.** enabled,
0c10: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
0c20: 74 20 72 65 63 6f 72 64 73 20 63 68 61 6e 67 65  t records change
0c30: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
0c40: 74 61 62 61 73 65 2e 20 57 68 65 6e 0a 2a 2a 20  tabase. When.** 
0c50: 64 69 73 61 62 6c 65 64 20 2d 20 69 74 20 64 6f  disabled - it do
0c60: 65 73 20 6e 6f 74 2e 20 41 20 6e 65 77 6c 79 20  es not. A newly 
0c70: 63 72 65 61 74 65 64 20 73 65 73 73 69 6f 6e 20  created session 
0c80: 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c 65  object is enable
0c90: 64 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  d..** Refer to t
0ca0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0cb0: 20 66 6f 72 20 5b 73 71 6c 69 74 65 33 73 65 73   for [sqlite3ses
0cc0: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29  sion_changeset()
0cd0: 5d 20 66 6f 72 20 66 75 72 74 68 65 72 0a 2a 2a  ] for further.**
0ce0: 20 64 65 74 61 69 6c 73 20 72 65 67 61 72 64 69   details regardi
0cf0: 6e 67 20 68 6f 77 20 65 6e 61 62 6c 69 6e 67 20  ng how enabling 
0d00: 61 6e 64 20 64 69 73 61 62 6c 69 6e 67 20 61 20  and disabling a 
0d10: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  session object a
0d20: 66 66 65 63 74 73 0a 2a 2a 20 74 68 65 20 65 76  ffects.** the ev
0d30: 65 6e 74 75 61 6c 20 63 68 61 6e 67 65 73 65 74  entual changeset
0d40: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e 67  s..**.** Passing
0d50: 20 7a 65 72 6f 20 74 6f 20 74 68 69 73 20 66 75   zero to this fu
0d60: 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73 20  nction disables 
0d70: 74 68 65 20 73 65 73 73 69 6f 6e 2e 20 50 61 73  the session. Pas
0d80: 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 2a 2a 20  sing a value.** 
0d90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
0da0: 6f 20 65 6e 61 62 6c 65 73 20 69 74 2e 20 50 61  o enables it. Pa
0db0: 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20 6c 65  ssing a value le
0dc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 69 73 20  ss than zero is 
0dd0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c 20 61 6e 64  a .** no-op, and
0de0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0df0: 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
0e00: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  t state of the s
0e10: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
0e20: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0e30: 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69 6e  ndicates the fin
0e40: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
0e50: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 3a 20  session object: 
0e60: 30 20 69 66 20 0a 2a 2a 20 74 68 65 20 73 65 73  0 if .** the ses
0e70: 73 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64  sion is disabled
0e80: 2c 20 6f 72 20 31 20 69 66 20 69 74 20 69 73 20  , or 1 if it is 
0e90: 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20  enabled..*/.int 
0ea0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
0eb0: 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 65  nable(sqlite3_se
0ec0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
0ed0: 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 3b 0a 0a   int bEnable);..
0ee0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
0ef0: 53 65 74 20 4f 72 20 43 6c 65 61 72 20 74 68 65  Set Or Clear the
0f00: 20 49 6e 64 69 72 65 63 74 20 43 68 61 6e 67 65   Indirect Change
0f10: 20 46 6c 61 67 0a 2a 2a 20 4d 45 54 48 4f 44 3a   Flag.** METHOD:
0f20: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0f30: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 68 61 6e  .**.** Each chan
0f40: 67 65 20 72 65 63 6f 72 64 65 64 20 62 79 20 61  ge recorded by a
0f50: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
0f60: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 65 69 74  is marked as eit
0f70: 68 65 72 20 64 69 72 65 63 74 20 6f 72 0a 2a 2a  her direct or.**
0f80: 20 69 6e 64 69 72 65 63 74 2e 20 41 20 63 68 61   indirect. A cha
0f90: 6e 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nge is marked as
0fa0: 20 69 6e 64 69 72 65 63 74 20 69 66 20 65 69 74   indirect if eit
0fb0: 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  her:.**.** <ul>.
0fc0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 73 65  **   <li> The se
0fd0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 22 69 6e  ssion object "in
0fe0: 64 69 72 65 63 74 22 20 66 6c 61 67 20 69 73 20  direct" flag is 
0ff0: 73 65 74 20 77 68 65 6e 20 74 68 65 20 63 68 61  set when the cha
1000: 6e 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  nge is.**       
1010: 20 6d 61 64 65 2c 20 6f 72 0a 2a 2a 20 20 20 3c   made, or.**   <
1020: 6c 69 3e 20 54 68 65 20 63 68 61 6e 67 65 20 69  li> The change i
1030: 73 20 6d 61 64 65 20 62 79 20 61 6e 20 53 51 4c  s made by an SQL
1040: 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
1050: 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20 0a  ign key action .
1060: 2a 2a 20 20 20 20 20 20 20 20 69 6e 73 74 65 61  **        instea
1070: 64 20 6f 66 20 64 69 72 65 63 74 6c 79 20 61 73  d of directly as
1080: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 75   a result of a u
1090: 73 65 72 73 20 53 51 4c 20 73 74 61 74 65 6d 65  sers SQL stateme
10a0: 6e 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  nt..** </ul>.**.
10b0: 2a 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 72  ** If a single r
10c0: 6f 77 20 69 73 20 61 66 66 65 63 74 65 64 20 62  ow is affected b
10d0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
10e0: 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68 69 6e  operation within
10f0: 20 61 20 73 65 73 73 69 6f 6e 2c 0a 2a 2a 20 74   a session,.** t
1100: 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69  hen the change i
1110: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e 64  s considered ind
1120: 69 72 65 63 74 20 69 66 20 61 6c 6c 20 6f 70 65  irect if all ope
1130: 72 61 74 69 6f 6e 73 20 6d 65 65 74 20 74 68 65  rations meet the
1140: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 66 6f 72   criteria.** for
1150: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68 61   an indirect cha
1160: 6e 67 65 20 61 62 6f 76 65 2c 20 6f 72 20 64 69  nge above, or di
1170: 72 65 63 74 20 6f 74 68 65 72 77 69 73 65 2e 0a  rect otherwise..
1180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1190: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
11a0: 65 74 2c 20 63 6c 65 61 72 20 6f 72 20 71 75 65  et, clear or que
11b0: 72 79 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ry the session o
11c0: 62 6a 65 63 74 20 69 6e 64 69 72 65 63 74 0a 2a  bject indirect.*
11d0: 2a 20 66 6c 61 67 2e 20 20 49 66 20 74 68 65 20  * flag.  If the 
11e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11f0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1200: 75 6e 63 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c  unction is zero,
1210: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 64   then the.** ind
1220: 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 63 6c  irect flag is cl
1230: 65 61 72 65 64 2e 20 49 66 20 69 74 20 69 73 20  eared. If it is 
1240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1250: 6f 2c 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  o, the indirect 
1260: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 20  flag.** is set. 
1270: 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20  Passing a value 
1280: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 64  less than zero d
1290: 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74  oes not modify t
12a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
12b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 69 72  .** of the indir
12c0: 65 63 74 20 66 6c 61 67 2c 20 61 6e 64 20 6d 61  ect flag, and ma
12d0: 79 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65  y be used to que
12e0: 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
12f0: 74 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tate of the .** 
1300: 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 66 6f  indirect flag fo
1310: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1320: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  session object..
1330: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1340: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1350: 20 74 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   the final state
1360: 20 6f 66 20 74 68 65 20 69 6e 64 69 72 65 63 74   of the indirect
1370: 20 66 6c 61 67 3a 20 30 20 69 66 20 0a 2a 2a 20   flag: 0 if .** 
1380: 69 74 20 69 73 20 63 6c 65 61 72 2c 20 6f 72 20  it is clear, or 
1390: 31 20 69 66 20 69 74 20 69 73 20 73 65 74 2e 0a  1 if it is set..
13a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
13b0: 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 73  ssion_indirect(s
13c0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
13d0: 70 53 65 73 73 69 6f 6e 2c 20 69 6e 74 20 62 49  pSession, int bI
13e0: 6e 64 69 72 65 63 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ndirect);../*.**
13f0: 20 43 41 50 49 33 52 45 46 3a 20 41 74 74 61 63   CAPI3REF: Attac
1400: 68 20 41 20 54 61 62 6c 65 20 54 6f 20 41 20 53  h A Table To A S
1410: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
1420: 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33   METHOD: sqlite3
1430: 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 49  _session.**.** I
1440: 66 20 61 72 67 75 6d 65 6e 74 20 7a 54 61 62 20  f argument zTab 
1450: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1460: 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  n it is the name
1470: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 6f 20 61   of a table to a
1480: 74 74 61 63 68 0a 2a 2a 20 74 6f 20 74 68 65 20  ttach.** to the 
1490: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
14a0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14b0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  st argument. All
14c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e   subsequent chan
14d0: 67 65 73 20 0a 2a 2a 20 6d 61 64 65 20 74 6f 20  ges .** made to 
14e0: 74 68 65 20 74 61 62 6c 65 20 77 68 69 6c 65 20  the table while 
14f0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
1500: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69  ct is enabled wi
1510: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 2e 20  ll be recorded. 
1520: 53 65 65 20 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  See .** document
1530: 61 74 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74  ation for [sqlit
1540: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
1550: 73 65 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68  set()] for furth
1560: 65 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  er details..**.*
1570: 2a 20 4f 72 2c 20 69 66 20 61 72 67 75 6d 65 6e  * Or, if argumen
1580: 74 20 7a 54 61 62 20 69 73 20 4e 55 4c 4c 2c 20  t zTab is NULL, 
1590: 74 68 65 6e 20 63 68 61 6e 67 65 73 20 61 72 65  then changes are
15a0: 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 61 6c   recorded for al
15b0: 6c 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74  l tables.** in t
15c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15d0: 61 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65  additional table
15e0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
15f0: 68 65 20 64 61 74 61 62 61 73 65 20 28 62 79 20  he database (by 
1600: 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 22 43  .** executing "C
1610: 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74 61  REATE TABLE" sta
1620: 74 65 6d 65 6e 74 73 29 20 61 66 74 65 72 20 74  tements) after t
1630: 68 69 73 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  his call is made
1640: 2c 20 63 68 61 6e 67 65 73 20 66 6f 72 20 0a 2a  , changes for .*
1650: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  * the new tables
1660: 20 61 72 65 20 61 6c 73 6f 20 72 65 63 6f 72 64   are also record
1670: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  ed..**.** Change
1680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 65  s can only be re
1690: 63 6f 72 64 65 64 20 66 6f 72 20 74 61 62 6c 65  corded for table
16a0: 73 20 74 68 61 74 20 68 61 76 65 20 61 20 50 52  s that have a PR
16b0: 49 4d 41 52 59 20 4b 45 59 20 65 78 70 6c 69 63  IMARY KEY explic
16c0: 69 74 6c 79 0a 2a 2a 20 64 65 66 69 6e 65 64 20  itly.** defined 
16d0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 69 72  as part of their
16e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
16f0: 61 74 65 6d 65 6e 74 2e 20 49 74 20 64 6f 65 73  atement. It does
1700: 20 6e 6f 74 20 6d 61 74 74 65 72 20 69 66 20 74   not matter if t
1710: 68 65 20 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b  he .** PRIMARY K
1720: 45 59 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45  EY is an "INTEGE
1730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28  R PRIMARY KEY" (
1740: 72 6f 77 69 64 20 61 6c 69 61 73 29 20 6f 72 20  rowid alias) or 
1750: 6e 6f 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59  not. The PRIMARY
1760: 0a 2a 2a 20 4b 45 59 20 6d 61 79 20 63 6f 6e 73  .** KEY may cons
1770: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
1780: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 6d 61 79 20 62  column, or may b
1790: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
17a0: 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 74 20 69 73 20  y..** .** It is 
17b0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
17c0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
17d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
17e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
17f0: 4e 6f 72 0a 2a 2a 20 69 73 20 69 74 20 61 6e 20  Nor.** is it an 
1800: 65 72 72 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  error if the nam
1810: 65 64 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  ed table does no
1820: 74 20 68 61 76 65 20 61 20 50 52 49 4d 41 52 59  t have a PRIMARY
1830: 20 4b 45 59 2e 20 48 6f 77 65 76 65 72 2c 0a 2a   KEY. However,.*
1840: 2a 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  * no changes wil
1850: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
1860: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
1870: 20 73 63 65 6e 61 72 69 6f 73 2e 0a 2a 2a 0a 2a   scenarios..**.*
1880: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6e 6f  * Changes are no
1890: 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 69  t recorded for i
18a0: 6e 64 69 76 69 64 75 61 6c 20 72 6f 77 73 20 74  ndividual rows t
18b0: 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76 61  hat have NULL va
18c0: 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  lues stored.** i
18d0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
18e0: 20 74 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b   their PRIMARY K
18f0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
1900: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1910: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
1920: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 77 69  all completes wi
1930: 74 68 6f 75 74 20 65 72 72 6f 72 2e 20 4f 72 2c  thout error. Or,
1940: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1950: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
1960: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65  te error code (e
1970: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
1980: 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ) is returned..*
1990: 2a 0a 2a 2a 20 3c 68 33 3e 53 70 65 63 69 61 6c  *.** <h3>Special
19a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 48 61   sqlite_stat1 Ha
19b0: 6e 64 6c 69 6e 67 3c 2f 68 33 3e 0a 2a 2a 0a 2a  ndling</h3>.**.*
19c0: 2a 20 41 73 20 6f 66 20 53 51 4c 69 74 65 20 76  * As of SQLite v
19d0: 65 72 73 69 6f 6e 20 33 2e 32 32 2e 30 2c 20 74  ersion 3.22.0, t
19e0: 68 65 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  he "sqlite_stat1
19f0: 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 78  " table is an ex
1a00: 63 65 70 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 73  ception to .** s
1a10: 6f 6d 65 20 6f 66 20 74 68 65 20 72 75 6c 65 73  ome of the rules
1a20: 20 61 62 6f 76 65 2e 20 49 6e 20 53 51 4c 69 74   above. In SQLit
1a30: 65 2c 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  e, the schema of
1a40: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 69 73   sqlite_stat1 is
1a50: 3a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  :.**  <pre>.**  
1a60: 26 6e 62 73 70 3b 20 20 20 20 20 43 52 45 41 54  &nbsp;     CREAT
1a70: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
1a80: 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61  tat1(tbl,idx,sta
1a90: 74 29 20 20 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  t)  .**  </pre>.
1aa0: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
1ab0: 68 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  h sqlite_stat1 d
1ac0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 50  oes not have a P
1ad0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 61 6e  RIMARY KEY, chan
1ae0: 67 65 73 20 61 72 65 20 0a 2a 2a 20 72 65 63 6f  ges are .** reco
1af0: 72 64 65 64 20 66 6f 72 20 69 74 20 61 73 20 69  rded for it as i
1b00: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
1b10: 59 20 69 73 20 28 74 62 6c 2c 69 64 78 29 2e 20  Y is (tbl,idx). 
1b20: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 63 68  Additionally, ch
1b30: 61 6e 67 65 73 20 0a 2a 2a 20 61 72 65 20 72 65  anges .** are re
1b40: 63 6f 72 64 65 64 20 66 6f 72 20 72 6f 77 73 20  corded for rows 
1b50: 66 6f 72 20 77 68 69 63 68 20 28 69 64 78 20 49  for which (idx I
1b60: 53 20 4e 55 4c 4c 29 20 69 73 20 74 72 75 65 2e  S NULL) is true.
1b70: 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 73 75   However, for su
1b80: 63 68 0a 2a 2a 20 72 6f 77 73 20 61 20 7a 65 72  ch.** rows a zer
1b90: 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 28 53  o-length blob (S
1ba0: 51 4c 20 76 61 6c 75 65 20 58 27 27 29 20 69 73  QL value X'') is
1bb0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
1bc0: 68 61 6e 67 65 73 65 74 20 6f 72 0a 2a 2a 20 70  hangeset or.** p
1bd0: 61 74 63 68 73 65 74 20 69 6e 73 74 65 61 64 20  atchset instead 
1be0: 6f 66 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e  of a NULL value.
1bf0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 75 63   This allows suc
1c00: 68 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 20  h changesets to 
1c10: 62 65 0a 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  be.** manipulate
1c20: 64 20 62 79 20 6c 65 67 61 63 79 20 69 6d 70 6c  d by legacy impl
1c30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 73  ementations of s
1c40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1c50: 69 6e 76 65 72 74 28 29 2c 0a 2a 2a 20 63 6f 6e  invert(),.** con
1c60: 63 61 74 28 29 20 61 6e 64 20 73 69 6d 69 6c 61  cat() and simila
1c70: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  r..**.** The sql
1c80: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
1c90: 70 6c 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ply() function a
1ca0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
1cb0: 76 65 72 74 73 20 74 68 65 20 0a 2a 2a 20 7a 65  verts the .** ze
1cc0: 72 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 62  ro-length blob b
1cd0: 61 63 6b 20 74 6f 20 61 20 4e 55 4c 4c 20 76 61  ack to a NULL va
1ce0: 6c 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  lue when updatin
1cf0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  g the sqlite_sta
1d00: 74 31 0a 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77  t1.** table. How
1d10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 61 70 70  ever, if the app
1d20: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1d30: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1d40: 6e 65 77 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  new(),.** sqlite
1d50: 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29  3changeset_old()
1d60: 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67   or sqlite3chang
1d70: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 20 6f 6e  eset_conflict on
1d80: 20 61 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a   a changeset .**
1d90: 20 69 74 65 72 61 74 6f 72 20 64 69 72 65 63 74   iterator direct
1da0: 6c 79 20 28 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  ly (including on
1db0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
1dc0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
1dd0: 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61  a.** conflict-ha
1de0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 29 20  ndler callback) 
1df0: 74 68 65 6e 20 74 68 65 20 58 27 27 20 76 61 6c  then the X'' val
1e00: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
1e10: 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  The application.
1e20: 2a 2a 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  ** must translat
1e30: 65 20 58 27 27 20 74 6f 20 4e 55 4c 4c 20 69 74  e X'' to NULL it
1e40: 73 65 6c 66 20 69 66 20 72 65 71 75 69 72 65 64  self if required
1e50: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 67 61 63 79 20 28  ..**.** Legacy (
1e60: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 32 32 2e  older than 3.22.
1e70: 30 29 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  0) versions of t
1e80: 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
1e90: 6c 65 20 63 61 6e 6e 6f 74 20 63 61 70 74 75 72  le cannot captur
1ea0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6d 61 64  e.** changes mad
1eb0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  e to the sqlite_
1ec0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 4c 65 67  stat1 table. Leg
1ed0: 61 63 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  acy versions of 
1ee0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
1ef0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
1f00: 66 75 6e 63 74 69 6f 6e 20 73 69 6c 65 6e 74 6c  function silentl
1f10: 79 20 69 67 6e 6f 72 65 20 61 6e 79 20 6d 6f 64  y ignore any mod
1f20: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1f30: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1f40: 31 20 74 61 62 6c 65 20 74 68 61 74 20 61 72 65  1 table that are
1f50: 20 70 61 72 74 20 6f 66 20 61 20 63 68 61 6e 67   part of a chang
1f60: 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
1f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f80: 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 0a  session_attach(.
1f90: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
1fa0: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
1fb0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
1fc0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1fd0: 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ff0: 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a  e name */.);../*
2000: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 65  .** CAPI3REF: Se
2010: 74 20 61 20 74 61 62 6c 65 20 66 69 6c 74 65 72  t a table filter
2020: 20 6f 6e 20 61 20 53 65 73 73 69 6f 6e 20 4f 62   on a Session Ob
2030: 6a 65 63 74 2e 0a 2a 2a 20 4d 45 54 48 4f 44 3a  ject..** METHOD:
2040: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
2050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
2060: 64 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  d argument (xFil
2070: 74 65 72 29 20 69 73 20 74 68 65 20 22 66 69 6c  ter) is the "fil
2080: 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 2e 20 46  ter callback". F
2090: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 72 6f  or changes to ro
20a0: 77 73 20 0a 2a 2a 20 69 6e 20 74 61 62 6c 65 73  ws .** in tables
20b0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 74   that are not at
20c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 53 65  tached to the Se
20d0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
20e0: 65 20 66 69 6c 74 65 72 20 69 73 20 63 61 6c 6c  e filter is call
20f0: 65 64 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ed.** to determi
2100: 6e 65 20 77 68 65 74 68 65 72 20 63 68 61 6e 67  ne whether chang
2110: 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 27  es to the table'
2120: 73 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62 65  s rows should be
2130: 20 74 72 61 63 6b 65 64 20 6f 72 20 6e 6f 74 2e   tracked or not.
2140: 20 0a 2a 2a 20 49 66 20 78 46 69 6c 74 65 72 20   .** If xFilter 
2150: 72 65 74 75 72 6e 73 20 30 2c 20 63 68 61 6e 67  returns 0, chang
2160: 65 73 20 69 73 20 6e 6f 74 20 74 72 61 63 6b 65  es is not tracke
2170: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e 63  d. Note that onc
2180: 65 20 61 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a  e a table is .**
2190: 20 61 74 74 61 63 68 65 64 2c 20 78 46 69 6c 74   attached, xFilt
21a0: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  er will not be c
21b0: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a  alled again..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65 73 73  void sqlite3sess
21d0: 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72  ion_table_filter
21e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
21f0: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20  ion *pSession,  
2200: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f      /* Session o
2210: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 28 2a  bject */.  int(*
2220: 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f  xFilter)(.    vo
2230: 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
2240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2250: 6f 70 79 20 6f 66 20 74 68 69 72 64 20 61 72 67  opy of third arg
2260: 20 74 6f 20 5f 66 69 6c 74 65 72 5f 74 61 62 6c   to _filter_tabl
2270: 65 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  e() */.    const
2280: 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20   char *zTab     
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
22a0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20  e name */.  ),. 
22b0: 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20   void *pCtx     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
22e0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 46 69  nt passed to xFi
22f0: 6c 74 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  lter */.);../*.*
2300: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
2310: 72 61 74 65 20 41 20 43 68 61 6e 67 65 73 65 74  rate A Changeset
2320: 20 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20   From A Session 
2330: 4f 62 6a 65 63 74 0a 2a 2a 20 4d 45 54 48 4f 44  Object.** METHOD
2340: 3a 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f  : sqlite3_sessio
2350: 6e 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  n.**.** Obtain a
2360: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74 61   changeset conta
2370: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  ining changes to
2380: 20 74 68 65 20 74 61 62 6c 65 73 20 61 74 74 61   the tables atta
2390: 63 68 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ched to the .** 
23a0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
23b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  st argument. If 
23d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 0a 2a 2a 20  successful, .** 
23e0: 73 65 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74  set *ppChangeset
23f0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
2400: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2410: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 0a   the changeset .
2420: 2a 2a 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  ** and *pnChange
2430: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
2440: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
2450: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
2460: 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 53 51   returning.** SQ
2470: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
2480: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
2490: 20 62 6f 74 68 20 2a 70 70 43 68 61 6e 67 65 73   both *ppChanges
24a0: 65 74 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  et and *pnChange
24b0: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 61  set to.** zero a
24c0: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
24d0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24e0: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
24f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
2500: 72 6f 20 6f 72 20 6d 6f 72 65 20 49 4e 53 45 52  ro or more INSER
2510: 54 2c 20 55 50 44 41 54 45 20 61 6e 64 2f 6f 72  T, UPDATE and/or
2520: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 73 2c   DELETE changes,
2530: 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
2540: 6e 74 69 6e 67 20 61 20 63 68 61 6e 67 65 20 74  nting a change t
2550: 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  o a single row o
2560: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 74 61  f an attached ta
2570: 62 6c 65 2e 20 41 6e 20 49 4e 53 45 52 54 0a 2a  ble. An INSERT.*
2580: 2a 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e  * change contain
2590: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
25a0: 65 61 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20  each field of a 
25b0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 72 6f 77  new database row
25c0: 2e 20 41 20 44 45 4c 45 54 45 0a 2a 2a 20 63 6f  . A DELETE.** co
25d0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 72 69 67 69  ntains the origi
25e0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 65 61  nal values of ea
25f0: 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20 64 65  ch field of a de
2600: 6c 65 74 65 64 20 64 61 74 61 62 61 73 65 20 72  leted database r
2610: 6f 77 2e 20 41 6e 0a 2a 2a 20 55 50 44 41 54 45  ow. An.** UPDATE
2620: 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e 73   change contains
2630: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61   the original va
2640: 6c 75 65 73 20 6f 66 20 65 61 63 68 20 66 69 65  lues of each fie
2650: 6c 64 20 6f 66 20 61 6e 20 75 70 64 61 74 65 64  ld of an updated
2660: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 72 6f 77  .** database row
2670: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2680: 75 70 64 61 74 65 64 20 76 61 6c 75 65 73 20 66  updated values f
2690: 6f 72 20 65 61 63 68 20 75 70 64 61 74 65 64 20  or each updated 
26a0: 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d 6b 65 79 0a  non-primary-key.
26b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 69 73  ** column. It is
26c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
26d0: 72 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e  r an UPDATE chan
26e0: 67 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ge to represent 
26f0: 61 20 63 68 61 6e 67 65 20 74 68 61 74 0a 2a 2a  a change that.**
2700: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 76 61   modifies the va
2710: 6c 75 65 73 20 6f 66 20 70 72 69 6d 61 72 79 20  lues of primary 
2720: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  key columns. If 
2730: 73 75 63 68 20 61 20 63 68 61 6e 67 65 20 69 73  such a change is
2740: 20 6d 61 64 65 2c 20 69 74 0a 2a 2a 20 69 73 20   made, it.** is 
2750: 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 61  represented in a
2760: 20 63 68 61 6e 67 65 73 65 74 20 61 73 20 61 20   changeset as a 
2770: 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64 20  DELETE followed 
2780: 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a  by an INSERT..**
2790: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
27a0: 6e 6f 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72  not recorded for
27b0: 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65 20   rows that have 
27c0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 73 74 6f 72  NULL values stor
27d0: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a  ed in one or .**
27e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 69 72 20 50   more of their P
27f0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
2800: 6e 73 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f  ns. If such a ro
2810: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 6f 72  w is inserted or
2820: 20 64 65 6c 65 74 65 64 2c 0a 2a 2a 20 6e 6f 20   deleted,.** no 
2830: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  corresponding ch
2840: 61 6e 67 65 20 69 73 20 70 72 65 73 65 6e 74 20  ange is present 
2850: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
2860: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
2870: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
2880: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72  If an existing r
2890: 6f 77 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  ow with one or m
28a0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ore NULL values 
28b0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 50 52 49  stored in.** PRI
28c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
28d0: 20 69 73 20 75 70 64 61 74 65 64 20 73 6f 20 74   is updated so t
28e0: 68 61 74 20 61 6c 6c 20 50 52 49 4d 41 52 59 20  hat all PRIMARY 
28f0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  KEY columns are 
2900: 6e 6f 6e 2d 4e 55 4c 4c 2c 0a 2a 2a 20 6f 6e 6c  non-NULL,.** onl
2910: 79 20 61 6e 20 49 4e 53 45 52 54 20 69 73 20 61  y an INSERT is a
2920: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 63 68  ppears in the ch
2930: 61 6e 67 65 73 65 74 2e 20 53 69 6d 69 6c 61 72  angeset. Similar
2940: 6c 79 2c 20 69 66 20 61 6e 20 65 78 69 73 74 69  ly, if an existi
2950: 6e 67 20 72 6f 77 0a 2a 2a 20 77 69 74 68 20 6e  ng row.** with n
2960: 6f 6e 2d 4e 55 4c 4c 20 50 52 49 4d 41 52 59 20  on-NULL PRIMARY 
2970: 4b 45 59 20 76 61 6c 75 65 73 20 69 73 20 75 70  KEY values is up
2980: 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  dated so that on
2990: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
29a0: 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20  .** PRIMARY KEY 
29b0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 73 65 74 20  columns are set 
29c0: 74 6f 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  to NULL, the res
29d0: 75 6c 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  ulting changeset
29e0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 44   contains a.** D
29f0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 6f 6e 6c  ELETE change onl
2a00: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  y..**.** The con
2a10: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
2a20: 65 73 65 74 20 6d 61 79 20 62 65 20 74 72 61 76  eset may be trav
2a30: 65 72 73 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ersed using an i
2a40: 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 0a  terator created.
2a50: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71  ** using the [sq
2a60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
2a70: 74 61 72 74 28 29 5d 20 41 50 49 2e 20 41 20 63  tart()] API. A c
2a80: 68 61 6e 67 65 73 65 74 20 6d 61 79 20 62 65 20  hangeset may be 
2a90: 61 70 70 6c 69 65 64 20 74 6f 0a 2a 2a 20 61 20  applied to.** a 
2aa0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
2ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 73 63 68 65 6d  compatible schem
2ac0: 61 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c  a using the [sql
2ad0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
2ae0: 70 6c 79 28 29 5d 0a 2a 2a 20 41 50 49 2e 0a 2a  ply()].** API..*
2af0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 61 20 63 68  *.** Within a ch
2b00: 61 6e 67 65 73 65 74 20 67 65 6e 65 72 61 74 65  angeset generate
2b10: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2b20: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
2b30: 72 65 6c 61 74 65 64 20 74 6f 20 61 0a 2a 2a 20  related to a.** 
2b40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65  single table are
2b50: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2b60: 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  r. In other word
2b70: 73 2c 20 77 68 65 6e 20 69 74 65 72 61 74 69 6e  s, when iteratin
2b80: 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20 63  g through.** a c
2b90: 68 61 6e 67 65 73 65 74 20 6f 72 20 77 68 65 6e  hangeset or when
2ba0: 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e   applying a chan
2bb0: 67 65 73 65 74 20 74 6f 20 61 20 64 61 74 61 62  geset to a datab
2bc0: 61 73 65 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73  ase, all changes
2bd0: 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 61   related.** to a
2be0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
2bf0: 65 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  e processed befo
2c00: 72 65 20 6d 6f 76 69 6e 67 20 6f 6e 20 74 6f 20  re moving on to 
2c10: 74 68 65 20 6e 65 78 74 20 74 61 62 6c 65 2e 20  the next table. 
2c20: 54 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73 6f  Tables.** are so
2c30: 72 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  rted in the same
2c40: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2c50: 74 68 65 79 20 77 65 72 65 20 61 74 74 61 63 68  they were attach
2c60: 65 64 20 28 6f 72 20 61 75 74 6f 2d 61 74 74 61  ed (or auto-atta
2c70: 63 68 65 64 29 0a 2a 2a 20 74 6f 20 74 68 65 20  ched).** to the 
2c80: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
2c90: 6f 62 6a 65 63 74 2e 20 54 68 65 20 6f 72 64 65  object. The orde
2ca0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 63  r in which the c
2cb0: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
2cc0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  o.** a single ta
2cd0: 62 6c 65 20 61 72 65 20 73 74 6f 72 65 64 20 69  ble are stored i
2ce0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
2cf0: 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  ** Following a s
2d00: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
2d10: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2d20: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
2d30: 6e 73 69 62 69 6c 69 74 79 20 6f 66 0a 2a 2a 20  nsibility of.** 
2d40: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
2d50: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
2d60: 65 20 62 75 66 66 65 72 20 74 68 61 74 20 2a 70  e buffer that *p
2d70: 70 43 68 61 6e 67 65 73 65 74 20 70 6f 69 6e 74  pChangeset point
2d80: 73 20 74 6f 20 75 73 69 6e 67 0a 2a 2a 20 5b 73  s to using.** [s
2d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 5d 2e 0a  qlite3_free()]..
2da0: 2a 2a 0a 2a 2a 20 3c 68 33 3e 43 68 61 6e 67 65  **.** <h3>Change
2db0: 73 65 74 20 47 65 6e 65 72 61 74 69 6f 6e 3c 2f  set Generation</
2dc0: 68 33 3e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  h3>.**.** Once a
2dd0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
2de0: 61 74 74 61 63 68 65 64 20 74 6f 20 61 20 73 65  attached to a se
2df0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
2e00: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
2e10: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
2e20: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
2e30: 65 73 20 6f 66 20 61 6c 6c 20 6e 65 77 20 72 6f  es of all new ro
2e40: 77 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ws inserted into
2e50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 49   the table..** I
2e60: 74 20 61 6c 73 6f 20 72 65 63 6f 72 64 73 20 74  t also records t
2e70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 72 69 6d  he original prim
2e80: 61 72 79 20 6b 65 79 20 61 6e 64 20 6f 74 68 65  ary key and othe
2e90: 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  r column values 
2ea0: 6f 66 20 61 6e 79 0a 2a 2a 20 64 65 6c 65 74 65  of any.** delete
2eb0: 64 20 6f 72 20 75 70 64 61 74 65 64 20 72 6f 77  d or updated row
2ec0: 73 2e 20 46 6f 72 20 65 61 63 68 20 75 6e 69 71  s. For each uniq
2ed0: 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ue primary key v
2ee0: 61 6c 75 65 2c 20 64 61 74 61 20 69 73 20 6f 6e  alue, data is on
2ef0: 6c 79 0a 2a 2a 20 72 65 63 6f 72 64 65 64 20 6f  ly.** recorded o
2f00: 6e 63 65 20 2d 20 74 68 65 20 66 69 72 73 74 20  nce - the first 
2f10: 74 69 6d 65 20 61 20 72 6f 77 20 77 69 74 68 20  time a row with 
2f20: 73 61 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  said primary key
2f30: 20 69 73 20 69 6e 73 65 72 74 65 64 2c 0a 2a 2a   is inserted,.**
2f40: 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65   updated or dele
2f50: 74 65 64 20 69 6e 20 74 68 65 20 6c 69 66 65 74  ted in the lifet
2f60: 69 6d 65 20 6f 66 20 74 68 65 20 73 65 73 73 69  ime of the sessi
2f70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  on..**.** There 
2f80: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
2f90: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2fa0: 20 70 61 72 61 67 72 61 70 68 3a 20 77 68 65 6e   paragraph: when
2fb0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
2fc0: 65 64 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f  ed,.** updated o
2fd0: 72 20 64 65 6c 65 74 65 64 2c 20 69 66 20 6f 6e  r deleted, if on
2fe0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
2ff0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
3000: 75 6d 6e 73 20 63 6f 6e 74 61 69 6e 20 61 0a 2a  umns contain a.*
3010: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6e 6f  * NULL value, no
3020: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
3030: 68 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 0a 2a  hange is made..*
3040: 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
3050: 20 6f 62 6a 65 63 74 20 74 68 65 72 65 66 6f 72   object therefor
3060: 65 20 61 63 63 75 6d 75 6c 61 74 65 73 20 74 77  e accumulates tw
3070: 6f 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  o types of recor
3080: 64 73 20 2d 20 74 68 6f 73 65 0a 2a 2a 20 74 68  ds - those.** th
3090: 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 70 72  at consist of pr
30a0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
30b0: 20 6f 6e 6c 79 20 28 63 72 65 61 74 65 64 20 77   only (created w
30c0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 73  hen the user ins
30d0: 65 72 74 73 0a 2a 2a 20 61 20 6e 65 77 20 72 65  erts.** a new re
30e0: 63 6f 72 64 29 20 61 6e 64 20 74 68 6f 73 65 20  cord) and those 
30f0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
3100: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
3110: 76 61 6c 75 65 73 20 61 6e 64 20 74 68 65 0a 2a  values and the.*
3120: 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * original value
3130: 73 20 6f 66 20 6f 74 68 65 72 20 74 61 62 6c 65  s of other table
3140: 20 63 6f 6c 75 6d 6e 73 20 28 63 72 65 61 74 65   columns (create
3150: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 73  d when the users
3160: 20 64 65 6c 65 74 65 73 0a 2a 2a 20 6f 72 20 75   deletes.** or u
3170: 70 64 61 74 65 73 20 61 20 72 65 63 6f 72 64 29  pdates a record)
3180: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
3190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31a0: 6c 6c 65 64 2c 20 74 68 65 20 72 65 71 75 65 73  lled, the reques
31b0: 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69 73  ted changeset is
31c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a   created using.*
31d0: 2a 20 62 6f 74 68 20 74 68 65 20 61 63 63 75 6d  * both the accum
31e0: 75 6c 61 74 65 64 20 72 65 63 6f 72 64 73 20 61  ulated records a
31f0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
3200: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
3210: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
3220: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a   Specifically:.*
3230: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
3240: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63  li> For each rec
3250: 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79  ord generated by
3260: 20 61 6e 20 69 6e 73 65 72 74 2c 20 74 68 65 20   an insert, the 
3270: 64 61 74 61 62 61 73 65 20 69 73 20 71 75 65 72  database is quer
3280: 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ied.**        fo
3290: 72 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 6d  r a row with a m
32a0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
32b0: 6b 65 79 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  key. If one is f
32c0: 6f 75 6e 64 2c 20 61 6e 20 49 4e 53 45 52 54 0a  ound, an INSERT.
32d0: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
32e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
32f0: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 6e   changeset. If n
3300: 6f 20 73 75 63 68 20 72 6f 77 20 69 73 20 66 6f  o such row is fo
3310: 75 6e 64 2c 20 6e 6f 20 63 68 61 6e 67 65 20 0a  und, no change .
3320: 2a 2a 20 20 20 20 20 20 20 20 69 73 20 61 64 64  **        is add
3330: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
3340: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  set..**.**   <li
3350: 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72  > For each recor
3360: 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  d generated by a
3370: 6e 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  n update or dele
3380: 74 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  te, the database
3390: 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 71   is .**        q
33a0: 75 65 72 69 65 64 20 66 6f 72 20 61 20 72 6f 77  ueried for a row
33b0: 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
33c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
33d0: 20 73 75 63 68 20 61 20 72 6f 77 20 69 73 0a 2a   such a row is.*
33e0: 2a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 61  *        found a
33f0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
3400: 66 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72  f the non-primar
3410: 79 20 6b 65 79 20 66 69 65 6c 64 73 20 68 61 76  y key fields hav
3420: 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e been.**       
3430: 20 6d 6f 64 69 66 69 65 64 20 66 72 6f 6d 20 74   modified from t
3440: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61  heir original va
3450: 6c 75 65 73 2c 20 61 6e 20 55 50 44 41 54 45 20  lues, an UPDATE 
3460: 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20  change is added 
3470: 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  to .**        th
3480: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 4f 72 2c  e changeset. Or,
3490: 20 69 66 20 6e 6f 20 73 75 63 68 20 72 6f 77 20   if no such row 
34a0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
34b0: 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45 20  table, a DELETE 
34c0: 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67  .**        chang
34d0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20  e changeset. If 
34f0: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 77  there is a row w
3500: 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
3510: 2a 20 20 20 20 20 20 20 20 70 72 69 6d 61 72 79  *        primary
3520: 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
3530: 62 61 73 65 2c 20 62 75 74 20 61 6c 6c 20 66 69  base, but all fi
3540: 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  elds contain the
3550: 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  ir original.**  
3560: 20 20 20 20 20 20 76 61 6c 75 65 73 2c 20 6e 6f        values, no
3570: 20 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64   change is added
3580: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65   to the changese
3590: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
35a0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 2c 20 61 6d  * This means, am
35b0: 6f 6e 67 73 74 20 6f 74 68 65 72 20 74 68 69 6e  ongst other thin
35c0: 67 73 2c 20 74 68 61 74 20 69 66 20 61 20 72 6f  gs, that if a ro
35d0: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  w is inserted an
35e0: 64 20 74 68 65 6e 20 6c 61 74 65 72 0a 2a 2a 20  d then later.** 
35f0: 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 61 20  deleted while a 
3600: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
3610: 73 20 61 63 74 69 76 65 2c 20 6e 65 69 74 68 65  s active, neithe
3620: 72 20 74 68 65 20 69 6e 73 65 72 74 20 6e 6f 72  r the insert nor
3630: 20 74 68 65 20 64 65 6c 65 74 65 0a 2a 2a 20 77   the delete.** w
3640: 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20 69  ill be present i
3650: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
3660: 20 4f 72 20 69 66 20 61 20 72 6f 77 20 69 73 20   Or if a row is 
3670: 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 6e  deleted and then
3680: 20 6c 61 74 65 72 20 61 20 0a 2a 2a 20 72 6f 77   later a .** row
3690: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
36a0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
36b0: 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c 65  s inserted while
36c0: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
36d0: 74 20 69 73 0a 2a 2a 20 61 63 74 69 76 65 2c 20  t is.** active, 
36e0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63 68  the resulting ch
36f0: 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63 6f 6e  angeset will con
3700: 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45 20 63  tain an UPDATE c
3710: 68 61 6e 67 65 20 69 6e 73 74 65 61 64 20 6f 66  hange instead of
3720: 0a 2a 2a 20 61 20 44 45 4c 45 54 45 20 61 6e 64  .** a DELETE and
3730: 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a 0a 2a   an INSERT..**.*
3740: 2a 20 57 68 65 6e 20 61 20 73 65 73 73 69 6f 6e  * When a session
3750: 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73 61 62   object is disab
3760: 6c 65 64 20 28 73 65 65 20 74 68 65 20 5b 73 71  led (see the [sq
3770: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61  lite3session_ena
3780: 62 6c 65 28 29 5d 20 41 50 49 29 2c 0a 2a 2a 20  ble()] API),.** 
3790: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 63 63 75  it does not accu
37a0: 6d 75 6c 61 74 65 20 72 65 63 6f 72 64 73 20 77  mulate records w
37b0: 68 65 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73  hen rows are ins
37c0: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
37d0: 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 54 68  r deleted..** Th
37e0: 69 73 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f  is may appear to
37f0: 20 68 61 76 65 20 73 6f 6d 65 20 63 6f 75 6e 74   have some count
3800: 65 72 2d 69 6e 74 75 69 74 69 76 65 20 65 66 66  er-intuitive eff
3810: 65 63 74 73 20 69 66 20 61 20 73 69 6e 67 6c 65  ects if a single
3820: 20 72 6f 77 0a 2a 2a 20 69 73 20 77 72 69 74 74   row.** is writt
3830: 65 6e 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20  en to more than 
3840: 6f 6e 63 65 20 64 75 72 69 6e 67 20 61 20 73 65  once during a se
3850: 73 73 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70  ssion. For examp
3860: 6c 65 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a 20  le, if a row.** 
3870: 69 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c  is inserted whil
3880: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
3890: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ct is enabled, t
38a0: 68 65 6e 20 6c 61 74 65 72 20 64 65 6c 65 74 65  hen later delete
38b0: 64 20 77 68 69 6c 65 20 0a 2a 2a 20 74 68 65 20  d while .** the 
38c0: 73 61 6d 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a  same session obj
38d0: 65 63 74 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ect is disabled,
38e0: 20 6e 6f 20 49 4e 53 45 52 54 20 72 65 63 6f 72   no INSERT recor
38f0: 64 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  d will appear in
3900: 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65   the.** changese
3910: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
3920: 68 65 20 64 65 6c 65 74 65 20 74 6f 6f 6b 20 70  he delete took p
3930: 6c 61 63 65 20 77 68 69 6c 65 20 74 68 65 20 73  lace while the s
3940: 65 73 73 69 6f 6e 20 77 61 73 20 64 69 73 61 62  ession was disab
3950: 6c 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  led..** Or, if o
3960: 6e 65 20 66 69 65 6c 64 20 6f 66 20 61 20 72 6f  ne field of a ro
3970: 77 20 69 73 20 75 70 64 61 74 65 64 20 77 68 69  w is updated whi
3980: 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 69 73 20  le a session is 
3990: 64 69 73 61 62 6c 65 64 2c 20 61 6e 64 20 0a 2a  disabled, and .*
39a0: 2a 20 61 6e 6f 74 68 65 72 20 66 69 65 6c 64 20  * another field 
39b0: 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20  of the same row 
39c0: 69 73 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  is updated while
39d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
39e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 0a 2a 2a 20  enabled, the.** 
39f0: 72 65 73 75 6c 74 69 6e 67 20 63 68 61 6e 67 65  resulting change
3a00: 73 65 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  set will contain
3a10: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
3a20: 65 20 74 68 61 74 20 75 70 64 61 74 65 73 20 62  e that updates b
3a30: 6f 74 68 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 69  oth fields..*/.i
3a40: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
3a50: 6e 5f 63 68 61 6e 67 65 73 65 74 28 0a 20 20 73  n_changeset(.  s
3a60: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
3a70: 70 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f  pSession,      /
3a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
3a90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
3aa0: 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20  ngeset,         
3ab0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
3ac0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
3ad0: 2a 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a  *ppChangeset */.
3ae0: 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67    void **ppChang
3af0: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
3b00: 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72    /* OUT: Buffer
3b10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
3b20: 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  geset */.);../*.
3b30: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4c 6f 61  ** CAPI3REF: Loa
3b40: 64 20 54 68 65 20 44 69 66 66 65 72 65 6e 63 65  d The Difference
3b50: 20 42 65 74 77 65 65 6e 20 54 61 62 6c 65 73 20   Between Tables 
3b60: 49 6e 74 6f 20 41 20 53 65 73 73 69 6f 6e 0a 2a  Into A Session.*
3b70: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
3b80: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
3b90: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
3ba0: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
3bb0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a   the session obj
3bc0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
3bd0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
3be0: 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
3bf0: 6f 6e 20 61 74 74 61 63 68 65 73 20 74 61 62 6c  on attaches tabl
3c00: 65 20 7a 54 62 6c 20 69 6e 20 74 68 65 20 73 61  e zTbl in the sa
3c10: 6d 65 20 6d 61 6e 6e 65 72 20 61 73 20 74 68 65  me manner as the
3c20: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
3c30: 69 6f 6e 5f 61 74 74 61 63 68 28 29 5d 20 66 75  ion_attach()] fu
3c40: 6e 63 74 69 6f 6e 2e 20 49 66 20 7a 54 62 6c 20  nction. If zTbl 
3c50: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
3c60: 6f 72 20 69 66 20 69 74 0a 2a 2a 20 64 6f 65 73  or if it.** does
3c70: 20 6e 6f 74 20 68 61 76 65 20 61 20 70 72 69 6d   not have a prim
3c80: 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75  ary key, this fu
3c90: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
3ca0: 70 20 28 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  p (but does not 
3cb0: 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 65 72 72  return.** an err
3cc0: 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  or)..**.** Argum
3cd0: 65 6e 74 20 7a 46 72 6f 6d 44 62 20 6d 75 73 74  ent zFromDb must
3ce0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
3cf0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
3d00: 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
3d10: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
3d20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
3d30: 65 20 68 61 6e 64 6c 65 20 61 73 20 74 68 65 20  e handle as the 
3d40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  hat contains .**
3d60: 20 61 20 74 61 62 6c 65 20 63 6f 6d 70 61 74 69   a table compati
3d70: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ble with the tab
3d80: 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  le attached to t
3d90: 68 65 20 73 65 73 73 69 6f 6e 20 62 79 20 74 68  he session by th
3da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
3db0: 41 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69  A table is consi
3dc0: 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65  dered compatible
3dd0: 20 69 66 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75   if it:.**.** <u
3de0: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73  l>.**   <li> Has
3df0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 0a   the same name,.
3e00: 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68  **   <li> Has th
3e10: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f  e same set of co
3e20: 6c 75 6d 6e 73 20 64 65 63 6c 61 72 65 64 20 69  lumns declared i
3e30: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
3e40: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
3e50: 48 61 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  Has the same PRI
3e60: 4d 41 52 59 20 4b 45 59 20 64 65 66 69 6e 69 74  MARY KEY definit
3e70: 69 6f 6e 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  ion..** </ul>.**
3e80: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
3e90: 73 20 61 72 65 20 6e 6f 74 20 63 6f 6d 70 61 74  s are not compat
3ea0: 69 62 6c 65 2c 20 53 51 4c 49 54 45 5f 53 43 48  ible, SQLITE_SCH
3eb0: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 2e  EMA is returned.
3ec0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 73 0a 2a   If the tables.*
3ed0: 2a 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  * are compatible
3ee0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 68 61 76 65   but do not have
3ef0: 20 61 6e 79 20 50 52 49 4d 41 52 59 20 4b 45 59   any PRIMARY KEY
3f00: 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 69 73 20   columns, it is 
3f10: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  not an error.** 
3f20: 62 75 74 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  but no changes a
3f30: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
3f40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
3f50: 41 73 20 77 69 74 68 20 6f 74 68 65 72 20 73 65  As with other se
3f60: 73 73 69 6f 6e 0a 2a 2a 20 41 50 49 73 2c 20 74  ssion.** APIs, t
3f70: 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 50 52  ables without PR
3f80: 49 4d 41 52 59 20 4b 45 59 73 20 61 72 65 20 73  IMARY KEYs are s
3f90: 69 6d 70 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a  imply ignored..*
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 61 64 64 73 20 61 20 73 65 74 20 6f 66  on adds a set of
3fc0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3fd0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3fe0: 68 61 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  hat could be.** 
3ff0: 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  used to update t
4000: 68 65 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  he table in data
4010: 62 61 73 65 20 7a 46 72 6f 6d 20 28 63 61 6c 6c  base zFrom (call
4020: 20 74 68 69 73 20 74 68 65 20 22 66 72 6f 6d 2d   this the "from-
4030: 74 61 62 6c 65 22 29 20 0a 2a 2a 20 73 6f 20 74  table") .** so t
4040: 68 61 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hat its content 
4050: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
4060: 68 65 20 74 61 62 6c 65 20 61 74 74 61 63 68 65  he table attache
4070: 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e  d to the session
4080: 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 28 63 61 6c   .** object (cal
4090: 6c 20 74 68 69 73 20 74 68 65 20 22 74 6f 2d 74  l this the "to-t
40a0: 61 62 6c 65 22 29 2e 20 53 70 65 63 69 66 69 63  able"). Specific
40b0: 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  ally:.**.** <ul>
40c0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65  .**   <li> For e
40d0: 61 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79  ach row (primary
40e0: 20 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74   key) that exist
40f0: 73 20 69 6e 20 74 68 65 20 74 6f 2d 74 61 62 6c  s in the to-tabl
4100: 65 20 62 75 74 20 6e 6f 74 20 69 6e 20 0a 2a 2a  e but not in .**
4110: 20 20 20 20 20 74 68 65 20 66 72 6f 6d 2d 74 61       the from-ta
4120: 62 6c 65 2c 20 61 6e 20 49 4e 53 45 52 54 20 72  ble, an INSERT r
4130: 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
4140: 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  o the session ob
4150: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c  ject..**.**   <l
4160: 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  i> For each row 
4170: 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68  (primary key) th
4180: 61 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  at exists in the
4190: 20 74 6f 2d 74 61 62 6c 65 20 62 75 74 20 6e 6f   to-table but no
41a0: 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20 74 68 65  t in .**     the
41b0: 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20 61 20 44   from-table, a D
41c0: 45 4c 45 54 45 20 72 65 63 6f 72 64 20 69 73 20  ELETE record is 
41d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 73  added to the ses
41e0: 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  sion object..**.
41f0: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
4200: 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79 20  ch row (primary 
4210: 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74 73  key) that exists
4220: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 2c   in both tables,
4230: 20 62 75 74 20 66 65 61 74 75 72 65 73 20 0a 2a   but features .*
4240: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
4250: 6e 6f 6e 2d 50 4b 20 76 61 6c 75 65 73 20 69 6e  non-PK values in
4260: 20 65 61 63 68 2c 20 61 6e 20 55 50 44 41 54 45   each, an UPDATE
4270: 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
4280: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   to the.**     s
4290: 65 73 73 69 6f 6e 2e 20 20 0a 2a 2a 20 3c 2f 75  ession.  .** </u
42a0: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 61 72  l>.**.** To clar
42b0: 69 66 79 2c 20 69 66 20 74 68 69 73 20 66 75 6e  ify, if this fun
42c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
42d0: 61 6e 64 20 74 68 65 6e 20 61 20 63 68 61 6e 67  and then a chang
42e0: 65 73 65 74 20 63 6f 6e 73 74 72 75 63 74 65 64  eset constructed
42f0: 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 74  .** using [sqlit
4300: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
4310: 73 65 74 28 29 5d 2c 20 74 68 65 6e 20 61 66 74  set()], then aft
4320: 65 72 20 61 70 70 6c 79 69 6e 67 20 74 68 61 74  er applying that
4330: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 0a 2a   changeset to .*
4340: 2a 20 64 61 74 61 62 61 73 65 20 7a 46 72 6f 6d  * database zFrom
4350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4360: 20 74 68 65 20 74 77 6f 20 63 6f 6d 70 61 74 69   the two compati
4370: 62 6c 65 20 74 61 62 6c 65 73 20 77 6f 75 6c 64  ble tables would
4380: 20 62 65 20 0a 2a 2a 20 69 64 65 6e 74 69 63 61   be .** identica
4390: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 61 6e 20 65  l..**.** It an e
43a0: 72 72 6f 72 20 69 66 20 64 61 74 61 62 61 73 65  rror if database
43b0: 20 7a 46 72 6f 6d 20 64 6f 65 73 20 6e 6f 74 20   zFrom does not 
43c0: 65 78 69 73 74 20 6f 72 20 64 6f 65 73 20 6e 6f  exist or does no
43d0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  t contain the.**
43e0: 20 72 65 71 75 69 72 65 64 20 63 6f 6d 70 61 74   required compat
43f0: 69 62 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ible table..**.*
4400: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
4410: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  on successful, S
4420: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
4430: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
4440: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
4450: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
4460: 73 20 63 61 73 65 2c 20 69 66 20 61 72 67 75 6d  s case, if argum
4470: 65 6e 74 20 70 7a 45 72 72 4d 73 67 20 69 73 20  ent pzErrMsg is 
4480: 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 7a 45 72 72  not NULL, *pzErr
4490: 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
44a0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
44b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
44c0: 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
44d0: 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
44e0: 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
44f0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
4500: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
4510: 74 6f 20 66 72 65 65 20 74 68 69 73 20 62 75 66  to free this buf
4520: 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  fer using.** sql
4530: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
4540: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
4550: 6f 6e 5f 64 69 66 66 28 0a 20 20 73 71 6c 69 74  on_diff(.  sqlit
4560: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73  e3_session *pSes
4570: 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68  sion,.  const ch
4580: 61 72 20 2a 7a 46 72 6f 6d 44 62 2c 0a 20 20 63  ar *zFromDb,.  c
4590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
45a0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
45b0: 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41  sg.);.../*.** CA
45c0: 50 49 33 52 45 46 3a 20 47 65 6e 65 72 61 74 65  PI3REF: Generate
45d0: 20 41 20 50 61 74 63 68 73 65 74 20 46 72 6f 6d   A Patchset From
45e0: 20 41 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63   A Session Objec
45f0: 74 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  t.** METHOD: sql
4600: 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a  ite3_session.**.
4610: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
4620: 65 73 20 62 65 74 77 65 65 6e 20 61 20 70 61 74  es between a pat
4630: 63 68 73 65 74 20 61 6e 64 20 61 20 63 68 61 6e  chset and a chan
4640: 67 65 73 65 74 20 61 72 65 20 74 68 61 74 3a 0a  geset are that:.
4650: 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20  **.** <ul>.**   
4660: 3c 6c 69 3e 20 44 45 4c 45 54 45 20 72 65 63 6f  <li> DELETE reco
4670: 72 64 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 74  rds consist of t
4680: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66  he primary key f
4690: 69 65 6c 64 73 20 6f 6e 6c 79 2e 20 54 68 65 20  ields only. The 
46a0: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 69 67 69  .**        origi
46b0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 6f 74  nal values of ot
46c0: 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 6f  her fields are o
46d0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 20 20 3c 6c 69  mitted..**   <li
46e0: 3e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76  > The original v
46f0: 61 6c 75 65 73 20 6f 66 20 61 6e 79 20 6d 6f 64  alues of any mod
4700: 69 66 69 65 64 20 66 69 65 6c 64 73 20 61 72 65  ified fields are
4710: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 0a 2a   omitted from .*
4720: 2a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  *        UPDATE 
4730: 72 65 63 6f 72 64 73 2e 0a 2a 2a 20 3c 2f 75 6c  records..** </ul
4740: 3e 0a 2a 2a 0a 2a 2a 20 41 20 70 61 74 63 68 73  >.**.** A patchs
4750: 65 74 20 62 6c 6f 62 20 6d 61 79 20 62 65 20 75  et blob may be u
4760: 73 65 64 20 77 69 74 68 20 75 70 20 74 6f 20 64  sed with up to d
4770: 61 74 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ate versions of 
4780: 61 6c 6c 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63  all .** sqlite3c
4790: 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41 50 49  hangeset_xxx API
47a0: 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 63 65 70   functions excep
47b0: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68 61  t for sqlite3cha
47c0: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 29 2c  ngeset_invert(),
47d0: 20 0a 2a 2a 20 77 68 69 63 68 20 72 65 74 75 72   .** which retur
47e0: 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
47f0: 54 20 69 66 20 69 74 20 69 73 20 70 61 73 73 65  T if it is passe
4800: 64 20 61 20 70 61 74 63 68 73 65 74 2e 20 53 69  d a patchset. Si
4810: 6d 69 6c 61 72 6c 79 2c 0a 2a 2a 20 61 74 74 65  milarly,.** atte
4820: 6d 70 74 69 6e 67 20 74 6f 20 75 73 65 20 61 20  mpting to use a 
4830: 70 61 74 63 68 73 65 74 20 62 6c 6f 62 20 77 69  patchset blob wi
4840: 74 68 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20  th old versions 
4850: 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
4860: 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41  3changeset_xxx A
4870: 50 49 73 20 61 6c 73 6f 20 70 72 6f 76 6f 6b 65  PIs also provoke
4880: 73 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  s an SQLITE_CORR
4890: 55 50 54 20 65 72 72 6f 72 2e 20 0a 2a 2a 0a 2a  UPT error. .**.*
48a0: 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 6e 6f  * Because the no
48b0: 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 22 6f  n-primary key "o
48c0: 6c 64 2e 2a 22 20 66 69 65 6c 64 73 20 61 72 65  ld.*" fields are
48d0: 20 6f 6d 69 74 74 65 64 2c 20 6e 6f 20 0a 2a 2a   omitted, no .**
48e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
48f0: 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 73  T_DATA conflicts
4900: 20 63 61 6e 20 62 65 20 64 65 74 65 63 74 65 64   can be detected
4910: 20 6f 72 20 72 65 70 6f 72 74 65 64 20 69 66 20   or reported if 
4920: 61 20 70 61 74 63 68 73 65 74 0a 2a 2a 20 69 73  a patchset.** is
4930: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
4940: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4950: 61 70 70 6c 79 28 29 20 41 50 49 2e 20 4f 74 68  apply() API. Oth
4960: 65 72 20 63 6f 6e 66 6c 69 63 74 20 74 79 70 65  er conflict type
4970: 73 20 77 6f 72 6b 0a 2a 2a 20 69 6e 20 74 68 65  s work.** in the
4980: 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
4990: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 2a 2a 0a   changesets..**.
49a0: 2a 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69  ** Changes withi
49b0: 6e 20 61 20 70 61 74 63 68 73 65 74 20 61 72 65  n a patchset are
49c0: 20 6f 72 64 65 72 65 64 20 69 6e 20 74 68 65 20   ordered in the 
49d0: 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20  same way as for 
49e0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 67 65  changesets.** ge
49f0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73  nerated by the s
4a00: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4a10: 61 6e 67 65 73 65 74 28 29 20 66 75 6e 63 74 69  angeset() functi
4a20: 6f 6e 20 28 69 2e 65 2e 20 61 6c 6c 20 63 68 61  on (i.e. all cha
4a30: 6e 67 65 73 20 66 6f 72 0a 2a 2a 20 61 20 73 69  nges for.** a si
4a40: 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67  ngle table are g
4a50: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2c  rouped together,
4a60: 20 74 61 62 6c 65 73 20 61 70 70 65 61 72 20 69   tables appear i
4a70: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
4a80: 68 69 63 68 0a 2a 2a 20 74 68 65 79 20 77 65 72  hich.** they wer
4a90: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
4aa0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
4ab0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
4ac0: 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
4ad0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  t(.  sqlite3_ses
4ae0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
4af0: 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20       /* Session 
4b00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
4b10: 2a 70 6e 50 61 74 63 68 73 65 74 2c 20 20 20 20  *pnPatchset,    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4b30: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
4b40: 65 72 20 61 74 20 2a 70 70 50 61 74 63 68 73 65  er at *ppPatchse
4b50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
4b60: 50 61 74 63 68 73 65 74 20 20 20 20 20 20 20 20  Patchset        
4b70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
4b80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4b90: 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 29 3b 0a   patchset */.);.
4ba0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
4bb0: 20 54 65 73 74 20 69 66 20 61 20 63 68 61 6e 67   Test if a chang
4bc0: 65 73 65 74 20 68 61 73 20 72 65 63 6f 72 64 65  eset has recorde
4bd0: 64 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 0a 2a  d any changes..*
4be0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
4bf0: 7a 65 72 6f 20 69 66 20 6e 6f 20 63 68 61 6e 67  zero if no chang
4c00: 65 73 20 74 6f 20 61 74 74 61 63 68 65 64 20 74  es to attached t
4c10: 61 62 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20  ables have been 
4c20: 72 65 63 6f 72 64 65 64 20 62 79 20 0a 2a 2a 20  recorded by .** 
4c30: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
4c40: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4c50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4c60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6f   Otherwise, if o
4c70: 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 63  ne or .** more c
4c80: 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
4c90: 20 72 65 63 6f 72 64 65 64 2c 20 72 65 74 75 72   recorded, retur
4ca0: 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 76  n zero..**.** Ev
4cb0: 65 6e 20 69 66 20 74 68 69 73 20 66 75 6e 63 74  en if this funct
4cc0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
4cd0: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
4ce0: 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 0a 2a 2a   that calling.**
4cf0: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
4d00: 5f 63 68 61 6e 67 65 73 65 74 28 29 5d 20 6f 6e  _changeset()] on
4d10: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 68 61 6e   the session han
4d20: 64 6c 65 20 6d 61 79 20 73 74 69 6c 6c 20 72 65  dle may still re
4d30: 74 75 72 6e 20 61 0a 2a 2a 20 63 68 61 6e 67 65  turn a.** change
4d40: 73 65 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  set that contain
4d50: 73 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 54 68  s no changes. Th
4d60: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 68  is can happen wh
4d70: 65 6e 20 61 20 72 6f 77 20 69 6e 20 0a 2a 2a 20  en a row in .** 
4d80: 61 6e 20 61 74 74 61 63 68 65 64 20 74 61 62 6c  an attached tabl
4d90: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 6e  e is modified an
4da0: 64 20 74 68 65 6e 20 6c 61 74 65 72 20 6f 6e 20  d then later on 
4db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  the original val
4dc0: 75 65 73 20 0a 2a 2a 20 61 72 65 20 72 65 73 74  ues .** are rest
4dd0: 6f 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  ored. However, i
4de0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
4df0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
4e00: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
4e10: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
4e20: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
4e30: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
4e40: 65 74 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  et() will return
4e50: 20 61 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74   a .** changeset
4e60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
4e70: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 69 6e 74   changes..*/.int
4e80: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
4e90: 69 73 65 6d 70 74 79 28 73 71 6c 69 74 65 33 5f  isempty(sqlite3_
4ea0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
4eb0: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  n);../*.** CAPI3
4ec0: 52 45 46 3a 20 43 72 65 61 74 65 20 41 6e 20 49  REF: Create An I
4ed0: 74 65 72 61 74 6f 72 20 54 6f 20 54 72 61 76 65  terator To Trave
4ee0: 72 73 65 20 41 20 43 68 61 6e 67 65 73 65 74 20  rse A Changeset 
4ef0: 0a 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a  .** CONSTRUCTOR:
4f00: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
4f10: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 43 72  et_iter.**.** Cr
4f20: 65 61 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72  eate an iterator
4f30: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
4f40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
4f50: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
4f60: 65 73 65 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63  eset..** If succ
4f70: 65 73 73 66 75 6c 2c 20 2a 70 70 20 69 73 20 73  essful, *pp is s
4f80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
4f90: 68 65 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64  he iterator hand
4fa0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
4fb0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
4fc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4fe0: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 7a 65  *pp is set to ze
4ff0: 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a 20 53 51 4c  ro and an.** SQL
5000: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
5020: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5030: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
5040: 20 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65   used to advance
5050: 20 61 6e 64 20 71 75 65 72 79 20 61 20 63 68 61   and query a cha
5060: 6e 67 65 73 65 74 20 0a 2a 2a 20 69 74 65 72 61  ngeset .** itera
5070: 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 74  tor created by t
5080: 68 69 73 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a  his function:.**
5090: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
50a0: 69 3e 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  i> [sqlite3chang
50b0: 65 73 65 74 5f 6e 65 78 74 28 29 5d 0a 2a 2a 20  eset_next()].** 
50c0: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
50d0: 68 61 6e 67 65 73 65 74 5f 6f 70 28 29 5d 0a 2a  hangeset_op()].*
50e0: 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65  *   <li> [sqlite
50f0: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29  3changeset_new()
5100: 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c  ].**   <li> [sql
5110: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c  ite3changeset_ol
5120: 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  d()].** </ul>.**
5130: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
5140: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
5150: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
5160: 65 6e 74 75 61 6c 6c 79 20 64 65 73 74 72 6f 79  entually destroy
5170: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
5180: 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
5190: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
51a0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2e  set_finalize()].
51b0: 20 54 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74   The buffer cont
51c0: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 68  aining the.** ch
51d0: 61 6e 67 65 73 65 74 20 28 70 43 68 61 6e 67 65  angeset (pChange
51e0: 73 65 74 29 20 6d 75 73 74 20 72 65 6d 61 69 6e  set) must remain
51f0: 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 61 66 74   valid until aft
5200: 65 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  er the iterator 
5210: 69 73 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  is.** destroyed.
5220: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
5230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 6c  the changeset bl
5240: 6f 62 20 77 61 73 20 63 72 65 61 74 65 64 20 62  ob was created b
5250: 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  y one of the.** 
5260: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
5270: 63 68 61 6e 67 65 73 65 74 28 29 5d 2c 20 5b 73  changeset()], [s
5280: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5290: 63 6f 6e 63 61 74 28 29 5d 20 6f 72 0a 2a 2a 20  concat()] or.** 
52a0: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
52b0: 74 5f 69 6e 76 65 72 74 28 29 5d 20 66 75 6e 63  t_invert()] func
52c0: 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68 61 6e 67  tions, all chang
52d0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  es within the ch
52e0: 61 6e 67 65 73 65 74 20 0a 2a 2a 20 74 68 61 74  angeset .** that
52f0: 20 61 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67   apply to a sing
5300: 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f  le table are gro
5310: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 54  uped together. T
5320: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
5330: 68 65 6e 20 0a 2a 2a 20 61 6e 20 61 70 70 6c 69  hen .** an appli
5340: 63 61 74 69 6f 6e 20 69 74 65 72 61 74 65 73 20  cation iterates 
5350: 74 68 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65  through a change
5360: 73 65 74 20 75 73 69 6e 67 20 61 6e 20 69 74 65  set using an ite
5370: 72 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79  rator created by
5380: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
5390: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
53a0: 74 68 61 74 20 72 65 6c 61 74 65 20 74 6f 20 61  that relate to a
53b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
53c0: 65 20 76 69 73 69 74 65 64 20 0a 2a 2a 20 63 6f  e visited .** co
53d0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 20 54 68 65  nsecutively. The
53e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
53f0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
5400: 72 20 77 69 6c 6c 20 76 69 73 69 74 20 61 20 63  r will visit a c
5410: 68 61 6e 67 65 20 0a 2a 2a 20 74 68 65 20 61 70  hange .** the ap
5420: 70 6c 69 65 73 20 74 6f 20 74 61 62 6c 65 20 58  plies to table X
5430: 2c 20 74 68 65 6e 20 6f 6e 65 20 66 6f 72 20 74  , then one for t
5440: 61 62 6c 65 20 59 2c 20 61 6e 64 20 74 68 65 6e  able Y, and then
5450: 20 6c 61 74 65 72 20 6f 6e 20 76 69 73 69 74 20   later on visit 
5460: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 63 68 61 6e  .** another chan
5470: 67 65 20 66 6f 72 20 74 61 62 6c 65 20 58 2e 0a  ge for table X..
5480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5490: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 0a 20  angeset_start(. 
54a0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
54b0: 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20  et_iter **pp,   
54c0: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68 61   /* OUT: New cha
54d0: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
54e0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
54f0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
5500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5510: 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74  ize of changeset
5520: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a   blob in bytes *
5530: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67  /.  void *pChang
5540: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
5550: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
5560: 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e  o blob containin
5570: 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29  g changeset */.)
5580: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  ;.../*.** CAPI3R
5590: 45 46 3a 20 41 64 76 61 6e 63 65 20 41 20 43 68  EF: Advance A Ch
55a0: 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72  angeset Iterator
55b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
55c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
55d0: 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  er.**.** This fu
55e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
55f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 69 74 65  be used with ite
5600: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
5610: 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 5b 73  y function.** [s
5620: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5630: 73 74 61 72 74 28 29 5d 2e 20 49 66 20 69 74 20  start()]. If it 
5640: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  is called on an 
5650: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
5660: 74 6f 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74  to.** a conflict
5670: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
5680: 6b 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  k by [sqlite3cha
5690: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
56a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 0a 2a   SQLITE_MISUSE.*
56b0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
56c0: 64 20 74 68 65 20 63 61 6c 6c 20 68 61 73 20 6e  d the call has n
56d0: 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o effect..**.** 
56e0: 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
56f0: 72 20 61 6e 20 69 74 65 72 61 74 6f 72 20 69 73  r an iterator is
5700: 20 63 72 65 61 74 65 64 20 62 79 20 73 71 6c 69   created by sqli
5710: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
5720: 72 74 28 29 2c 20 69 74 0a 2a 2a 20 64 6f 65 73  rt(), it.** does
5730: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
5740: 79 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  y change in the 
5750: 63 68 61 6e 67 65 73 65 74 2e 20 41 73 73 75 6d  changeset. Assum
5760: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
5770: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 65 6d 70 74  t.** is not empt
5780: 79 2c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  y, the first cal
5790: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
57a0: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
57b0: 69 74 65 72 61 74 6f 72 20 74 6f 0a 2a 2a 20 70  iterator to.** p
57c0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
57d0: 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  t change in the 
57e0: 63 68 61 6e 67 65 73 65 74 2e 20 45 61 63 68 20  changeset. Each 
57f0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
5800: 61 64 76 61 6e 63 65 73 0a 2a 2a 20 74 68 65 20  advances.** the 
5810: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
5820: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  t to the next ch
5830: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
5840: 67 65 73 65 74 20 28 69 66 20 61 6e 79 29 2e 20  geset (if any). 
5850: 49 66 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 6f  If.** no error o
5860: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
5870: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
5880: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 67 65 20   a valid change 
5890: 61 66 74 65 72 20 61 20 63 61 6c 6c 0a 2a 2a 20  after a call.** 
58a0: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
58b0: 73 65 74 5f 6e 65 78 74 28 29 20 68 61 73 20 61  set_next() has a
58c0: 64 76 61 6e 63 65 64 20 69 74 2c 20 53 51 4c 49  dvanced it, SQLI
58d0: 54 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e  TE_ROW is return
58e0: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
58f0: 65 2c 20 69 66 20 61 6c 6c 20 63 68 61 6e 67 65  e, if all change
5900: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
5910: 65 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  et have already 
5920: 62 65 65 6e 20 76 69 73 69 74 65 64 2c 0a 2a 2a  been visited,.**
5930: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
5940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5950: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5960: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
5970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5980: 72 6e 65 64 2e 20 50 6f 73 73 69 62 6c 65 20 65  rned. Possible e
5990: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 73 20 69  rror .** codes i
59a0: 6e 63 6c 75 64 65 20 53 51 4c 49 54 45 5f 43 4f  nclude SQLITE_CO
59b0: 52 52 55 50 54 20 28 69 66 20 74 68 65 20 63 68  RRUPT (if the ch
59c0: 61 6e 67 65 73 65 74 20 62 75 66 66 65 72 20 69  angeset buffer i
59d0: 73 20 63 6f 72 72 75 70 74 29 20 6f 72 20 0a 2a  s corrupt) or .*
59e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
59f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
5a00: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 73 71 6c  angeset_next(sql
5a10: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
5a20: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
5a30: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
5a40: 74 61 69 6e 20 54 68 65 20 43 75 72 72 65 6e 74  tain The Current
5a50: 20 4f 70 65 72 61 74 69 6f 6e 20 46 72 6f 6d 20   Operation From 
5a60: 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72  A Changeset Iter
5a70: 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20  ator.** METHOD: 
5a80: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
5a90: 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65  t_iter.**.** The
5aa0: 20 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20   pIter argument 
5ab0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5ac0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68  unction may eith
5ad0: 65 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f  er be an iterato
5ae0: 72 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  r.** passed to a
5af0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
5b00: 72 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  r by [sqlite3cha
5b10: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
5b20: 20 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a   or an iterator.
5b30: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73  ** created by [s
5b40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5b50: 73 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65  start()]. In the
5b60: 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68   latter case, th
5b70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
5b80: 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65   call to [sqlite
5b90: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
5ba0: 29 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74  )] must have ret
5bb0: 75 72 6e 65 64 20 5b 53 51 4c 49 54 45 5f 52 4f  urned [SQLITE_RO
5bc0: 57 5d 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 69  W]. If this.** i
5bd0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  s not the case, 
5be0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
5bf0: 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49  turns [SQLITE_MI
5c00: 53 55 53 45 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  SUSE]..**.** If 
5c10: 61 72 67 75 6d 65 6e 74 20 70 7a 54 61 62 20 69  argument pzTab i
5c20: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5c30: 20 2a 70 7a 54 61 62 20 69 73 20 73 65 74 20 74   *pzTab is set t
5c40: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20  o point to a.** 
5c50: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 75  nul-terminated u
5c60: 74 66 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  tf-8 encoded str
5c70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
5c80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5c90: 61 62 6c 65 0a 2a 2a 20 61 66 66 65 63 74 65 64  able.** affected
5ca0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
5cb0: 63 68 61 6e 67 65 2e 20 54 68 65 20 62 75 66 66  change. The buff
5cc0: 65 72 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  er remains valid
5cd0: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 0a 2a 2a   until either.**
5ce0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
5cf0: 74 5f 6e 65 78 74 28 29 20 69 73 20 63 61 6c 6c  t_next() is call
5d00: 65 64 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ed on the iterat
5d10: 6f 72 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  or or until the 
5d20: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  .** conflict-han
5d30: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  dler function re
5d40: 74 75 72 6e 73 2e 20 49 66 20 70 6e 43 6f 6c 20  turns. If pnCol 
5d50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
5d60: 6e 20 2a 70 6e 43 6f 6c 20 69 73 20 0a 2a 2a 20  n *pnCol is .** 
5d70: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
5d80: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
5d90: 74 68 65 20 74 61 62 6c 65 20 61 66 66 65 63 74  the table affect
5da0: 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 67 65  ed by the change
5db0: 2e 20 49 66 0a 2a 2a 20 70 62 49 6e 63 6f 72 72  . If.** pbIncorr
5dc0: 65 63 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ect is not NULL,
5dd0: 20 74 68 65 6e 20 2a 70 62 49 6e 64 69 72 65 63   then *pbIndirec
5de0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
5df0: 20 28 31 29 20 69 66 20 74 68 65 20 63 68 61 6e   (1) if the chan
5e00: 67 65 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 64 69  ge.** is an indi
5e10: 72 65 63 74 20 63 68 61 6e 67 65 2c 20 6f 72 20  rect change, or 
5e20: 66 61 6c 73 65 20 28 30 29 20 6f 74 68 65 72 77  false (0) otherw
5e30: 69 73 65 2e 20 53 65 65 20 74 68 65 20 64 6f 63  ise. See the doc
5e40: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a  umentation for.*
5e50: 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  * [sqlite3sessio
5e60: 6e 5f 69 6e 64 69 72 65 63 74 28 29 5d 20 66 6f  n_indirect()] fo
5e70: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5e80: 6f 66 20 64 69 72 65 63 74 20 61 6e 64 20 69 6e  of direct and in
5e90: 64 69 72 65 63 74 0a 2a 2a 20 63 68 61 6e 67 65  direct.** change
5ea0: 73 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70  s. Finally, if p
5eb0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  Op is not NULL, 
5ec0: 74 68 65 6e 20 2a 70 4f 70 20 69 73 20 73 65 74  then *pOp is set
5ed0: 20 74 6f 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 5b   to one of .** [
5ee0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2c 20  SQLITE_INSERT], 
5ef0: 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d 20  [SQLITE_DELETE] 
5f00: 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54  or [SQLITE_UPDAT
5f10: 45 5d 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  E], depending on
5f20: 20 74 68 65 20 0a 2a 2a 20 74 79 70 65 20 6f 66   the .** type of
5f30: 20 63 68 61 6e 67 65 20 74 68 61 74 20 74 68 65   change that the
5f40: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
5f50: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
5f60: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
5f70: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
5f80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
5f90: 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
5fa0: 20 6f 63 63 75 72 2c 20 61 6e 0a 2a 2a 20 53 51   occur, an.** SQ
5fb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5fc0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
5fd0: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6f   values of the o
5fe0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5ff0: 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 74 72  may not.** be tr
6000: 75 73 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  usted in this ca
6010: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6020: 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 0a  e3changeset_op(.
6030: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
6040: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
6050: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
6060: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
6070: 63 68 61 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20  char **pzTab,   
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6090: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61 62  : Pointer to tab
60a0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  le name */.  int
60b0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60d0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
60e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
60f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 70 2c 20 20  */.  int *pOp,  
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
6120: 49 54 45 5f 49 4e 53 45 52 54 2c 20 44 45 4c 45  ITE_INSERT, DELE
6130: 54 45 20 6f 72 20 55 50 44 41 54 45 20 2a 2f 0a  TE or UPDATE */.
6140: 20 20 69 6e 74 20 2a 70 62 49 6e 64 69 72 65 63    int *pbIndirec
6150: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
6160: 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 66    /* OUT: True f
6170: 6f 72 20 61 6e 20 27 69 6e 64 69 72 65 63 74 27  or an 'indirect'
6180: 20 63 68 61 6e 67 65 20 2a 2f 0a 29 3b 0a 0a 2f   change */.);../
6190: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f  *.** CAPI3REF: O
61a0: 62 74 61 69 6e 20 54 68 65 20 50 72 69 6d 61 72  btain The Primar
61b0: 79 20 4b 65 79 20 44 65 66 69 6e 69 74 69 6f 6e  y Key Definition
61c0: 20 4f 66 20 41 20 54 61 62 6c 65 0a 2a 2a 20 4d   Of A Table.** M
61d0: 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63  ETHOD: sqlite3_c
61e0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a  hangeset_iter.**
61f0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 6d 6f 64  .** For each mod
6200: 69 66 69 65 64 20 74 61 62 6c 65 2c 20 61 20 63  ified table, a c
6210: 68 61 6e 67 65 73 65 74 20 69 6e 63 6c 75 64 65  hangeset include
6220: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
6230: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
6240: 20 3c 6c 69 3e 20 54 68 65 20 6e 75 6d 62 65 72   <li> The number
6250: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6260: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a  he table, and.**
6270: 20 20 20 3c 6c 69 3e 20 57 68 69 63 68 20 6f 66     <li> Which of
6280: 20 74 68 6f 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   those columns m
6290: 61 6b 65 20 75 70 20 74 68 65 20 74 61 62 6c 65  ake up the table
62a0: 73 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  s PRIMARY KEY..*
62b0: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68  * </ul>.**.** Th
62c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
62d0: 73 65 64 20 74 6f 20 66 69 6e 64 20 77 68 69 63  sed to find whic
62e0: 68 20 63 6f 6c 75 6d 6e 73 20 63 6f 6d 70 72 69  h columns compri
62f0: 73 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  se the PRIMARY K
6300: 45 59 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  EY of.** the tab
6310: 6c 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  le modified by t
6320: 68 65 20 63 68 61 6e 67 65 20 74 68 61 74 20 69  he change that i
6330: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
6340: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
6350: 6f 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  o..** If success
6360: 66 75 6c 2c 20 2a 70 61 62 50 4b 20 69 73 20 73  ful, *pabPK is s
6370: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
6380: 6e 20 61 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20  n array of nCol 
6390: 65 6e 74 72 69 65 73 2c 20 77 68 65 72 65 0a 2a  entries, where.*
63a0: 2a 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  * nCol is the nu
63b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
63c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45 6c  in the table. El
63d0: 65 6d 65 6e 74 73 20 6f 66 20 2a 70 61 62 50 4b  ements of *pabPK
63e0: 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 30   are set to.** 0
63f0: 78 30 31 20 69 66 20 74 68 65 20 63 6f 72 72 65  x01 if the corre
6400: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
6410: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  is part of the t
6420: 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
6430: 79 2c 20 6f 72 0a 2a 2a 20 30 78 30 30 20 69 66  y, or.** 0x00 if
6440: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a   it is not..**.*
6450: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 6e  * If argument pn
6460: 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Col is not NULL,
6470: 20 74 68 65 6e 20 2a 70 6e 43 6f 6c 20 69 73 20   then *pnCol is 
6480: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6490: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  r of columns.** 
64a0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
64b0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
64c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
64d0: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
64e0: 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
64f0: 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 65 6e  to a valid.** en
6500: 74 72 79 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55  try, SQLITE_MISU
6510: 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SE is returned a
6520: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  nd the output va
6530: 72 69 61 62 6c 65 73 20 7a 65 72 6f 65 64 2e 20  riables zeroed. 
6540: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
6550: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6560: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
6570: 75 74 20 76 61 72 69 61 62 6c 65 73 20 70 6f 70  ut variables pop
6580: 75 6c 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ulated as descri
6590: 62 65 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2f  bed.** above..*/
65a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
65b0: 67 65 73 65 74 5f 70 6b 28 0a 20 20 73 71 6c 69  geset_pk(.  sqli
65c0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
65d0: 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49  er *pIter,  /* I
65e0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
65f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6600: 72 20 2a 2a 70 61 62 50 4b 2c 20 20 20 20 20 20  r **pabPK,      
6610: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
6620: 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 20 2d 20 74  y of boolean - t
6630: 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c 73 20  rue for PK cols 
6640: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 20  */.  int *pnCol 
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
6670: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
6680: 6e 20 6f 75 74 70 75 74 20 61 72 72 61 79 20 2a  n output array *
6690: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
66a0: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6f 6c 64  3REF: Obtain old
66b0: 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  .* Values From A
66c0: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
66d0: 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  tor.** METHOD: s
66e0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
66f0: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _iter.**.** The 
6700: 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70  pIter argument p
6710: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
6720: 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65  nction may eithe
6730: 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72  r be an iterator
6740: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20  .** passed to a 
6750: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
6760: 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   by [sqlite3chan
6770: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20  geset_apply()], 
6780: 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a  or an iterator.*
6790: 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71  * created by [sq
67a0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
67b0: 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20  tart()]. In the 
67c0: 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68 65  latter case, the
67d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
67e0: 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33  call to [sqlite3
67f0: 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29  changeset_next()
6800: 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74 75  ] must have retu
6810: 72 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e  rned SQLITE_ROW.
6820: 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65   .** Furthermore
6830: 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65  , it may only be
6840: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 74   called if the t
6850: 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68  ype of change th
6860: 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  at the iterator.
6870: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
6880: 6e 74 73 20 74 6f 20 69 73 20 65 69 74 68 65 72  nts to is either
6890: 20 5b 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d   [SQLITE_DELETE]
68a0: 20 6f 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41   or [SQLITE_UPDA
68b0: 54 45 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  TE]. Otherwise,.
68c0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
68d0: 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45   returns [SQLITE
68e0: 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20 73 65 74  _MISUSE] and set
68f0: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e 55  s *ppValue to NU
6900: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  LL..**.** Argume
6910: 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65 20  nt iVal must be 
6920: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
6930: 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20  equal to 0, and 
6940: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75  less than the nu
6950: 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mber.** of colum
6960: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
6970: 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20  affected by the 
6980: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e 20  current change. 
6990: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53  Otherwise,.** [S
69a0: 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73 20  QLITE_RANGE] is 
69b0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
69c0: 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  Value is set to 
69d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  NULL..**.** If s
69e0: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
69f0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
6a00: 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20  pValue to point 
6a10: 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a 2a  to a protected.*
6a20: 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  * sqlite3_value 
6a30: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
6a40: 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76 61  g the iVal'th va
6a50: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 76 65 63  lue from the vec
6a60: 74 6f 72 20 6f 66 20 0a 2a 2a 20 6f 72 69 67 69  tor of .** origi
6a70: 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73  nal row values s
6a80: 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
6a90: 20 74 68 65 20 55 50 44 41 54 45 20 6f 72 20 44   the UPDATE or D
6aa0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 61 6e 64  ELETE change and
6ab0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
6ac0: 54 45 5f 4f 4b 2e 20 54 68 65 20 6e 61 6d 65 20  TE_OK. The name 
6ad0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
6ae0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 66  comes from the f
6af0: 61 63 74 20 74 68 61 74 20 74 68 69 73 20 0a 2a  act that this .*
6b00: 2a 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  * is similar to 
6b10: 74 68 65 20 22 6f 6c 64 2e 2a 22 20 63 6f 6c 75  the "old.*" colu
6b20: 6d 6e 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  mns available to
6b30: 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
6b40: 65 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a  e triggers..**.*
6b50: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
6b60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e  error occurs (e.
6b70: 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  g. an OOM condit
6b80: 69 6f 6e 29 2c 20 61 6e 20 53 51 4c 69 74 65 20  ion), an SQLite 
6b90: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
6ba0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
6bb0: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
6bc0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
6bd0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
6be0: 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  ld(.  sqlite3_ch
6bf0: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
6c00: 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ter,  /* Changes
6c10: 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  et iterator */. 
6c20: 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20   int iVal,      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
6c50: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
6c60: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20  alue **ppValue  
6c70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f         /* OUT: O
6c80: 6c 64 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c  ld value (or NUL
6c90: 4c 20 70 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b  L pointer) */.);
6ca0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
6cb0: 3a 20 4f 62 74 61 69 6e 20 6e 65 77 2e 2a 20 56  : Obtain new.* V
6cc0: 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43 68 61  alues From A Cha
6cd0: 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a  ngeset Iterator.
6ce0: 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74  ** METHOD: sqlit
6cf0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
6d00: 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65  r.**.** The pIte
6d10: 72 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  r argument passe
6d20: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
6d30: 6f 6e 20 6d 61 79 20 65 69 74 68 65 72 20 62 65  on may either be
6d40: 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20   an iterator.** 
6d50: 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66  passed to a conf
6d60: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 20  lict-handler by 
6d70: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
6d80: 74 5f 61 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61  t_apply()], or a
6d90: 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72  n iterator.** cr
6da0: 65 61 74 65 64 20 62 79 20 5b 73 71 6c 69 74 65  eated by [sqlite
6db0: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
6dc0: 28 29 5d 2e 20 49 6e 20 74 68 65 20 6c 61 74 74  ()]. In the latt
6dd0: 65 72 20 63 61 73 65 2c 20 74 68 65 20 6d 6f 73  er case, the mos
6de0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c  t recent.** call
6df0: 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e   to [sqlite3chan
6e00: 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75  geset_next()] mu
6e10: 73 74 20 68 61 76 65 20 72 65 74 75 72 6e 65 64  st have returned
6e20: 20 53 51 4c 49 54 45 5f 52 4f 57 2e 20 0a 2a 2a   SQLITE_ROW. .**
6e30: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 74   Furthermore, it
6e40: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
6e50: 6c 65 64 20 69 66 20 74 68 65 20 74 79 70 65 20  led if the type 
6e60: 6f 66 20 63 68 61 6e 67 65 20 74 68 61 74 20 74  of change that t
6e70: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63  he iterator.** c
6e80: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
6e90: 74 6f 20 69 73 20 65 69 74 68 65 72 20 5b 53 51  to is either [SQ
6ea0: 4c 49 54 45 5f 55 50 44 41 54 45 5d 20 6f 72 20  LITE_UPDATE] or 
6eb0: 5b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2e  [SQLITE_INSERT].
6ec0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
6ed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
6ee0: 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49 53  urns [SQLITE_MIS
6ef0: 55 53 45 5d 20 61 6e 64 20 73 65 74 73 20 2a 70  USE] and sets *p
6f00: 70 56 61 6c 75 65 20 74 6f 20 4e 55 4c 4c 2e 0a  pValue to NULL..
6f10: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69  **.** Argument i
6f20: 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  Val must be grea
6f30: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
6f40: 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73 73  l to 0, and less
6f50: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
6f60: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  .** of columns i
6f70: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66 65  n the table affe
6f80: 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  cted by the curr
6f90: 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68 65  ent change. Othe
6fa0: 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49 54  rwise,.** [SQLIT
6fb0: 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74 75  E_RANGE] is retu
6fc0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75  rned and *ppValu
6fd0: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
6fe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
6ff0: 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
7000: 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61 6c  tion sets *ppVal
7010: 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ue to point to a
7020: 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73 71   protected.** sq
7030: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
7040: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ct containing th
7050: 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65 20  e iVal'th value 
7060: 66 72 6f 6d 20 74 68 65 20 76 65 63 74 6f 72 20  from the vector 
7070: 6f 66 20 0a 2a 2a 20 6e 65 77 20 72 6f 77 20 76  of .** new row v
7080: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73 20  alues stored as 
7090: 70 61 72 74 20 6f 66 20 74 68 65 20 55 50 44 41  part of the UPDA
70a0: 54 45 20 6f 72 20 49 4e 53 45 52 54 20 63 68 61  TE or INSERT cha
70b0: 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  nge and.** retur
70c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ns SQLITE_OK. If
70d0: 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
70e0: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 64 6f 65  n UPDATE and doe
70f0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 0a 2a 2a  s not include.**
7100: 20 61 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72   a new value for
7110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
7120: 6f 6c 75 6d 6e 2c 20 2a 70 70 56 61 6c 75 65 20  olumn, *ppValue 
7130: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
7140: 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
7150: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 6e   returned. The n
7160: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
7170: 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
7180: 68 65 20 66 61 63 74 20 74 68 61 74 20 0a 2a 2a  he fact that .**
7190: 20 74 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   this is similar
71a0: 20 74 6f 20 74 68 65 20 22 6e 65 77 2e 2a 22 20   to the "new.*" 
71b0: 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62 6c  columns availabl
71c0: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
71d0: 65 6c 65 74 65 20 0a 2a 2a 20 74 72 69 67 67 65  elete .** trigge
71e0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d  rs..**.** If som
71f0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  e other error oc
7200: 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
7210: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e  M condition), an
7220: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7230: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7240: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
7250: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
7260: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7270: 6e 67 65 73 65 74 5f 6e 65 77 28 0a 20 20 73 71  ngeset_new(.  sq
7280: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7290: 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
72a0: 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
72b0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61  tor */.  int iVa
72c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
72e0: 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  mn number */.  s
72f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
7300: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 2f  pValue         /
7310: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65  * OUT: New value
7320: 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   (or NULL pointe
7330: 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r) */.);../*.** 
7340: 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e  CAPI3REF: Obtain
7350: 20 43 6f 6e 66 6c 69 63 74 69 6e 67 20 52 6f 77   Conflicting Row
7360: 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41 20 43   Values From A C
7370: 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f  hangeset Iterato
7380: 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  r.** METHOD: sql
7390: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
73a0: 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ter.**.** This f
73b0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
73c0: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
73d0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
73e0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a  s passed to a.**
73f0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
7400: 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20 5b 73  r callback by [s
7410: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7420: 61 70 70 6c 79 28 29 5d 20 77 69 74 68 20 65 69  apply()] with ei
7430: 74 68 65 72 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f  ther.** [SQLITE_
7440: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20  CHANGESET_DATA] 
7450: 6f 72 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  or [SQLITE_CHANG
7460: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 5d 2e 20  ESET_CONFLICT]. 
7470: 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
7480: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  .** is called on
7490: 20 61 6e 79 20 6f 74 68 65 72 20 69 74 65 72 61   any other itera
74a0: 74 6f 72 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53  tor, [SQLITE_MIS
74b0: 55 53 45 5d 20 69 73 20 72 65 74 75 72 6e 65 64  USE] is returned
74c0: 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 0a 2a 2a   and *ppValue.**
74d0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
74e0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
74f0: 69 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65  iVal must be gre
7500: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
7510: 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73  al to 0, and les
7520: 73 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  s than the numbe
7530: 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  r.** of columns 
7540: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66  in the table aff
7550: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
7560: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68  rent change. Oth
7570: 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49  erwise,.** [SQLI
7580: 54 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74  TE_RANGE] is ret
7590: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
75a0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
75b0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  L..**.** If succ
75c0: 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
75d0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61  ction sets *ppVa
75e0: 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
75f0: 61 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73  a protected.** s
7600: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
7610: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
7620: 68 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65  he iVal'th value
7630: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 22 63   from the .** "c
7640: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 22 20  onflicting row" 
7650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7660: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
7670: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c  lict-handler cal
7680: 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 72 65 74  lback.** and ret
7690: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
76a0: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
76b0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
76c0: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
76d0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
76e0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
76f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
7700: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
7710: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
7720: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
7730: 65 74 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  et_conflict(.  s
7740: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7750: 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
7760: 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
7770: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56  ator */.  int iV
7780: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
7790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
77a0: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
77b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
77c0: 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
77d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 66 72  /* OUT: Value fr
77e0: 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  om conflicting r
77f0: 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.);../*.** 
7800: 43 41 50 49 33 52 45 46 3a 20 44 65 74 65 72 6d  CAPI3REF: Determ
7810: 69 6e 65 20 54 68 65 20 4e 75 6d 62 65 72 20 4f  ine The Number O
7820: 66 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f  f Foreign Key Co
7830: 6e 73 74 72 61 69 6e 74 20 56 69 6f 6c 61 74 69  nstraint Violati
7840: 6f 6e 73 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73  ons.** METHOD: s
7850: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
7860: 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _iter.**.** This
7870: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
7880: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ly be called wit
7890: 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  h an iterator pa
78a0: 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a 20 53 51  ssed to an.** SQ
78b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46  LITE_CHANGESET_F
78c0: 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f 6e 66 6c  OREIGN_KEY confl
78d0: 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ict handler call
78e0: 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
78f0: 73 65 0a 2a 2a 20 69 74 20 73 65 74 73 20 74 68  se.** it sets th
7900: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
7910: 65 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  e to the total n
7920: 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77 6e 20 66  umber of known f
7930: 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 76 69  oreign key.** vi
7940: 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  olations in the 
7950: 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61  destination data
7960: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
7970: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
7980: 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
7990: 61 73 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  ases this functi
79a0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
79b0: 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69 6e 74  E_MISUSE..*/.int
79c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
79d0: 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 0a  t_fk_conflicts(.
79e0: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
79f0: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
7a00: 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69    /* Changeset i
7a10: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
7a20: 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20   *pnOut         
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 46  OUT: Number of F
7a50: 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 2a 2f 0a  K violations */.
7a60: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  );.../*.** CAPI3
7a70: 52 45 46 3a 20 46 69 6e 61 6c 69 7a 65 20 41 20  REF: Finalize A 
7a80: 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74  Changeset Iterat
7a90: 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71  or.** METHOD: sq
7aa0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
7ab0: 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  iter.**.** This 
7ac0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
7ad0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 6e 20   to finalize an 
7ae0: 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61 74  iterator allocat
7af0: 65 64 20 77 69 74 68 0a 2a 2a 20 5b 73 71 6c 69  ed with.** [sqli
7b00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
7b10: 72 74 28 29 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rt()]..**.** Thi
7b20: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7b30: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7b40: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
7b50: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a  eated using the.
7b60: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
7b70: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 20 66 75  eset_start()] fu
7b80: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 61 70  nction. If an ap
7b90: 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
7ba0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
7bb0: 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f   with an iterato
7bc0: 72 20 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f  r passed to a co
7bd0: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62  nflict-handler b
7be0: 79 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61  y.** [sqlite3cha
7bf0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
7c00: 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d   [SQLITE_MISUSE]
7c10: 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   is immediately 
7c20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7c30: 0a 2a 2a 20 63 61 6c 6c 20 68 61 73 20 6e 6f 20  .** call has no 
7c40: 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  effect..**.** If
7c50: 20 61 6e 20 65 72 72 6f 72 20 77 61 73 20 65 6e   an error was en
7c60: 63 6f 75 6e 74 65 72 65 64 20 77 69 74 68 69 6e  countered within
7c70: 20 61 20 63 61 6c 6c 20 74 6f 20 61 6e 20 73 71   a call to an sq
7c80: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 78  lite3changeset_x
7c90: 78 78 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  xx().** function
7ca0: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 61 6e   (for example an
7cb0: 20 5b 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   [SQLITE_CORRUPT
7cc0: 5d 20 69 6e 20 5b 73 71 6c 69 74 65 33 63 68 61  ] in [sqlite3cha
7cd0: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20 6f  ngeset_next()] o
7ce0: 72 20 61 6e 20 0a 2a 2a 20 5b 53 51 4c 49 54 45  r an .** [SQLITE
7cf0: 5f 4e 4f 4d 45 4d 5d 20 69 6e 20 5b 73 71 6c 69  _NOMEM] in [sqli
7d00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77  te3changeset_new
7d10: 28 29 5d 29 20 74 68 65 6e 20 61 6e 20 65 72 72  ()]) then an err
7d20: 6f 72 20 63 6f 64 65 20 63 6f 72 72 65 73 70 6f  or code correspo
7d30: 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 61 74  nding.** to that
7d40: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
7d50: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7d60: 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
7d70: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
7d80: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69  returned. This i
7d90: 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 66  s to allow the f
7da0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65 72 6e  ollowing pattern
7db0: 20 28 70 73 65 75 64 6f 2d 63 6f 64 65 29 3a 0a   (pseudo-code):.
7dc0: 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20  **.** <pre>.**  
7dd0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
7de0: 74 5f 73 74 61 72 74 28 29 3b 0a 2a 2a 20 20 20  t_start();.**   
7df0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
7e00: 57 3d 3d 73 71 6c 69 74 65 33 63 68 61 6e 67 65  W==sqlite3change
7e10: 73 65 74 5f 6e 65 78 74 28 29 20 29 7b 0a 2a 2a  set_next() ){.**
7e20: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
7e30: 68 69 6e 67 20 77 69 74 68 20 63 68 61 6e 67 65  hing with change
7e40: 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 72 63  ..**   }.**   rc
7e50: 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
7e60: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 3b 0a  set_finalize();.
7e70: 2a 2a 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  **   if( rc!=SQL
7e80: 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20  ITE_OK ){.**    
7e90: 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 68 61 73   // An error has
7ea0: 20 6f 63 63 75 72 72 65 64 20 0a 2a 2a 20 20 20   occurred .**   
7eb0: 7d 0a 2a 2a 20 3c 2f 70 72 65 3e 0a 2a 2f 0a 69  }.** </pre>.*/.i
7ec0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
7ed0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c  set_finalize(sql
7ee0: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
7ef0: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
7f00: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6e  .** CAPI3REF: In
7f10: 76 65 72 74 20 41 20 43 68 61 6e 67 65 73 65 74  vert A Changeset
7f20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7f30: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
7f40: 22 69 6e 76 65 72 74 22 20 61 20 63 68 61 6e 67  "invert" a chang
7f50: 65 73 65 74 20 6f 62 6a 65 63 74 2e 20 41 70 70  eset object. App
7f60: 6c 79 69 6e 67 20 61 6e 20 69 6e 76 65 72 74 65  lying an inverte
7f70: 64 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74  d.** changeset t
7f80: 6f 20 61 20 64 61 74 61 62 61 73 65 20 72 65 76  o a database rev
7f90: 65 72 73 65 73 20 74 68 65 20 65 66 66 65 63 74  erses the effect
7fa0: 73 20 6f 66 20 61 70 70 6c 79 69 6e 67 20 74 68  s of applying th
7fb0: 65 20 75 6e 69 6e 76 65 72 74 65 64 0a 2a 2a 20  e uninverted.** 
7fc0: 63 68 61 6e 67 65 73 65 74 2e 20 53 70 65 63 69  changeset. Speci
7fd0: 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c  fically:.**.** <
7fe0: 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61  ul>.**   <li> Ea
7ff0: 63 68 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ch DELETE change
8000: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61   is changed to a
8010: 6e 20 49 4e 53 45 52 54 2c 20 61 6e 64 0a 2a 2a  n INSERT, and.**
8020: 20 20 20 3c 6c 69 3e 20 45 61 63 68 20 49 4e 53     <li> Each INS
8030: 45 52 54 20 63 68 61 6e 67 65 20 69 73 20 63 68  ERT change is ch
8040: 61 6e 67 65 64 20 74 6f 20 61 20 44 45 4c 45 54  anged to a DELET
8050: 45 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e  E, and.**   <li>
8060: 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54 45   For each UPDATE
8070: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 6f 6c 64   change, the old
8080: 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a 20 76 61 6c  .* and new.* val
8090: 75 65 73 20 61 72 65 20 65 78 63 68 61 6e 67 65  ues are exchange
80a0: 64 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  d..** </ul>.**.*
80b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
80c0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
80d0: 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
80e0: 63 68 20 63 68 61 6e 67 65 73 20 61 70 70 65 61  ch changes appea
80f0: 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  r within.** the 
8100: 63 68 61 6e 67 65 73 65 74 2e 20 49 74 20 6d 65  changeset. It me
8110: 72 65 6c 79 20 72 65 76 65 72 73 65 73 20 74 68  rely reverses th
8120: 65 20 73 65 6e 73 65 20 6f 66 20 65 61 63 68 20  e sense of each 
8130: 69 6e 64 69 76 69 64 75 61 6c 20 63 68 61 6e 67  individual chang
8140: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
8150: 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
8160: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
8170: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 76  ntaining the inv
8180: 65 72 74 65 64 20 63 68 61 6e 67 65 73 65 74 0a  erted changeset.
8190: 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
81a0: 2a 70 70 4f 75 74 2c 20 74 68 65 20 73 69 7a 65  *ppOut, the size
81b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 62 75 66   of the same buf
81c0: 66 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e  fer is stored in
81d0: 20 2a 70 6e 4f 75 74 2c 20 61 6e 64 0a 2a 2a 20   *pnOut, and.** 
81e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
81f0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
8200: 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74 68 20  or occurs, both 
8210: 2a 70 6e 4f 75 74 20 61 6e 64 20 2a 70 70 4f 75  *pnOut and *ppOu
8220: 74 20 61 72 65 0a 2a 2a 20 7a 65 72 6f 65 64 20  t are.** zeroed 
8230: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
8240: 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
8250: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  d..**.** It is t
8260: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
8270: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
8280: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
8290: 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
82a0: 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 2a 70 70 4f  ).** on the *ppO
82b0: 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 72  ut pointer to fr
82c0: 65 65 20 74 68 65 20 62 75 66 66 65 72 20 61 6c  ee the buffer al
82d0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  location followi
82e0: 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
82f0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  .** call to this
8300: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8310: 20 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 54   WARNING/TODO: T
8320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 75 72  his function cur
8330: 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rently assumes t
8340: 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 69 73  hat the input is
8350: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 63 68 61 6e   a valid.** chan
8360: 67 65 73 65 74 2e 20 49 66 20 69 74 20 69 73 20  geset. If it is 
8370: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 73  not, the results
8380: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
8390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
83a0: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 0a  angeset_invert(.
83b0: 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74    int nIn, const
83c0: 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20   void *pIn,     
83d0: 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67    /* Input chang
83e0: 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  eset */.  int *p
83f0: 6e 4f 75 74 2c 20 76 6f 69 64 20 2a 2a 70 70 4f  nOut, void **ppO
8400: 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ut        /* OUT
8410: 3a 20 49 6e 76 65 72 73 65 20 6f 66 20 69 6e 70  : Inverse of inp
8420: 75 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ut */.);../*.** 
8430: 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 63 61 74  CAPI3REF: Concat
8440: 65 6e 61 74 65 20 54 77 6f 20 43 68 61 6e 67 65  enate Two Change
8450: 73 65 74 20 4f 62 6a 65 63 74 73 0a 2a 2a 0a 2a  set Objects.**.*
8460: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8470: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 63 61  is used to conca
8480: 74 65 6e 61 74 65 20 74 77 6f 20 63 68 61 6e 67  tenate two chang
8490: 65 73 65 74 73 2c 20 41 20 61 6e 64 20 42 2c 20  esets, A and B, 
84a0: 69 6e 74 6f 20 61 20 0a 2a 2a 20 73 69 6e 67 6c  into a .** singl
84b0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 68 65  e changeset. The
84c0: 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 68 61   result is a cha
84d0: 6e 67 65 73 65 74 20 65 71 75 69 76 61 6c 65 6e  ngeset equivalen
84e0: 74 20 74 6f 20 61 70 70 6c 79 69 6e 67 0a 2a 2a  t to applying.**
84f0: 20 63 68 61 6e 67 65 73 65 74 20 41 20 66 6f 6c   changeset A fol
8500: 6c 6f 77 65 64 20 62 79 20 63 68 61 6e 67 65 73  lowed by changes
8510: 65 74 20 42 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  et B. .**.** Thi
8520: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 62 69  s function combi
8530: 6e 65 73 20 74 68 65 20 74 77 6f 20 69 6e 70 75  nes the two inpu
8540: 74 20 63 68 61 6e 67 65 73 65 74 73 20 75 73 69  t changesets usi
8550: 6e 67 20 61 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ng an .** sqlite
8560: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  3_changegroup ob
8570: 6a 65 63 74 2e 20 43 61 6c 6c 69 6e 67 20 69 74  ject. Calling it
8580: 20 70 72 6f 64 75 63 65 73 20 73 69 6d 69 6c 61   produces simila
8590: 72 20 72 65 73 75 6c 74 73 20 61 73 20 74 68 65  r results as the
85a0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  .** following co
85b0: 64 65 20 66 72 61 67 6d 65 6e 74 3a 0a 2a 2a 0a  de fragment:.**.
85c0: 2a 2a 20 3c 70 72 65 3e 0a 2a 2a 20 20 20 73 71  ** <pre>.**   sq
85d0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
85e0: 70 20 2a 70 47 72 70 3b 0a 2a 2a 20 20 20 72 63  p *pGrp;.**   rc
85f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67   = sqlite3_chang
8600: 65 67 72 6f 75 70 5f 6e 65 77 28 26 70 47 72 70  egroup_new(&pGrp
8610: 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d  );.**   if( rc==
8620: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
8630: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
8640: 6f 75 70 5f 61 64 64 28 70 47 72 70 2c 20 6e 41  oup_add(pGrp, nA
8650: 2c 20 70 41 29 3b 0a 2a 2a 20 20 20 69 66 28 20  , pA);.**   if( 
8660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8670: 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
8680: 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72 70  gegroup_add(pGrp
8690: 2c 20 6e 42 2c 20 70 42 29 3b 0a 2a 2a 20 20 20  , nB, pB);.**   
86a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
86b0: 4b 20 29 7b 0a 2a 2a 20 20 20 20 20 72 63 20 3d  K ){.**     rc =
86c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
86d0: 6f 75 70 5f 6f 75 74 70 75 74 28 70 47 72 70 2c  oup_output(pGrp,
86e0: 20 70 6e 4f 75 74 2c 20 70 70 4f 75 74 29 3b 0a   pnOut, ppOut);.
86f0: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
8700: 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 2a     *ppOut = 0;.*
8710: 2a 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 30  *     *pnOut = 0
8720: 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70 72  ;.**   }.** </pr
8730: 65 3e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  e>.**.** Refer t
8740: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68  o the sqlite3_ch
8750: 61 6e 67 65 67 72 6f 75 70 20 64 6f 63 75 6d 65  angegroup docume
8760: 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 20 66 6f  ntation below fo
8770: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
8780: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
8790: 65 74 5f 63 6f 6e 63 61 74 28 0a 20 20 69 6e 74  et_concat(.  int
87a0: 20 6e 41 2c 20 20 20 20 20 20 20 20 20 20 20 20   nA,            
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
87d0: 69 6e 20 62 75 66 66 65 72 20 70 41 20 2a 2f 0a  in buffer pA */.
87e0: 20 20 76 6f 69 64 20 2a 70 41 2c 20 20 20 20 20    void *pA,     
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8810: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
8820: 67 20 63 68 61 6e 67 65 73 65 74 20 41 20 2a 2f  g changeset A */
8830: 0a 20 20 69 6e 74 20 6e 42 2c 20 20 20 20 20 20  .  int nB,      
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8860: 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20  bytes in buffer 
8870: 70 42 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  pB */.  void *pB
8880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8890: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88a0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
88b0: 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65  taining changese
88c0: 74 20 42 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  t B */.  int *pn
88d0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
88e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
88f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8900: 20 69 6e 20 6f 75 74 70 75 74 20 63 68 61 6e 67   in output chang
8910: 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  eset */.  void *
8920: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8940: 3a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  : Buffer contain
8950: 69 6e 67 20 6f 75 74 70 75 74 20 63 68 61 6e 67  ing output chang
8960: 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a  eset */.);.../*.
8970: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 68 61  ** CAPI3REF: Cha
8980: 6e 67 65 67 72 6f 75 70 20 48 61 6e 64 6c 65 0a  ngegroup Handle.
8990: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 67 72  **.** A changegr
89a0: 6f 75 70 20 69 73 20 61 6e 20 6f 62 6a 65 63 74  oup is an object
89b0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65   used to combine
89c0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 0a 2a 2a   two or more .**
89d0: 20 5b 63 68 61 6e 67 65 73 65 74 73 5d 20 6f 72   [changesets] or
89e0: 20 5b 70 61 74 63 68 73 65 74 73 5d 0a 2a 2f 0a   [patchsets].*/.
89f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
8a00: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
8a10: 75 70 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  up sqlite3_chang
8a20: 65 67 72 6f 75 70 3b 0a 0a 2f 2a 0a 2a 2a 20 43  egroup;../*.** C
8a30: 41 50 49 33 52 45 46 3a 20 43 72 65 61 74 65 20  API3REF: Create 
8a40: 41 20 4e 65 77 20 43 68 61 6e 67 65 67 72 6f 75  A New Changegrou
8a50: 70 20 4f 62 6a 65 63 74 0a 2a 2a 20 43 4f 4e 53  p Object.** CONS
8a60: 54 52 55 43 54 4f 52 3a 20 73 71 6c 69 74 65 33  TRUCTOR: sqlite3
8a70: 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 0a  _changegroup.**.
8a80: 2a 2a 20 41 6e 20 73 71 6c 69 74 65 33 5f 63 68  ** An sqlite3_ch
8a90: 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63 74  angegroup object
8aa0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 62   is used to comb
8ab0: 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ine two or more 
8ac0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 28 6f  changesets.** (o
8ad0: 72 20 70 61 74 63 68 73 65 74 73 29 20 69 6e 74  r patchsets) int
8ae0: 6f 20 61 20 73 69 6e 67 6c 65 20 63 68 61 6e 67  o a single chang
8af0: 65 73 65 74 20 28 6f 72 20 70 61 74 63 68 73 65  eset (or patchse
8b00: 74 29 2e 20 41 20 73 69 6e 67 6c 65 20 63 68 61  t). A single cha
8b10: 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 6f 62 6a 65  ngegroup.** obje
8b20: 63 74 20 6d 61 79 20 63 6f 6d 62 69 6e 65 20 63  ct may combine c
8b30: 68 61 6e 67 65 73 65 74 73 20 6f 72 20 70 61 74  hangesets or pat
8b40: 63 68 73 65 74 73 2c 20 62 75 74 20 6e 6f 74 20  chsets, but not 
8b50: 62 6f 74 68 2e 20 54 68 65 20 6f 75 74 70 75 74  both. The output
8b60: 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 6e   is.** always in
8b70: 20 74 68 65 20 73 61 6d 65 20 66 6f 72 6d 61 74   the same format
8b80: 20 61 73 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a   as the input..*
8b90: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
8ba0: 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
8bb0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
8bc0: 5f 4f 4b 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  _OK and populate
8bd0: 73 20 28 2a 70 70 29 20 77 69 74 68 0a 2a 2a 20  s (*pp) with.** 
8be0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
8bf0: 65 77 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ew sqlite3_chang
8c00: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 62 65  egroup object be
8c10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
8c20: 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 73 68  The caller.** sh
8c30: 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
8c40: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
8c50: 64 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 20 61  d object using a
8c60: 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
8c70: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8c80: 64 65 6c 65 74 65 28 29 2e 20 49 66 20 61 6e 20  delete(). If an 
8c90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8ca0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
8cb0: 64 65 0a 2a 2a 20 28 69 2e 65 2e 20 53 51 4c 49  de.** (i.e. SQLI
8cc0: 54 45 5f 4e 4f 4d 45 4d 29 20 69 73 20 72 65 74  TE_NOMEM) is ret
8cd0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
8ce0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
8cf0: 0a 2a 2a 20 54 68 65 20 75 73 75 61 6c 20 75 73  .** The usual us
8d00: 61 67 65 20 70 61 74 74 65 72 6e 20 66 6f 72 20  age pattern for 
8d10: 61 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  an sqlite3_chang
8d20: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 69 73  egroup object is
8d30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8d40: 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ul>.**   <li
8d50: 3e 20 49 74 20 69 73 20 63 72 65 61 74 65 64 20  > It is created 
8d60: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8d70: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8d80: 75 70 5f 6e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20  up_new()..**.** 
8d90: 20 20 3c 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d    <li> Zero or m
8da0: 6f 72 65 20 63 68 61 6e 67 65 73 65 74 73 20 28  ore changesets (
8db0: 6f 72 20 70 61 74 63 68 73 65 74 73 29 20 61 72  or patchsets) ar
8dc0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  e added to the o
8dd0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
8de0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
8df0: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
8e00: 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  d()..**.**   <li
8e10: 3e 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  > The result of 
8e20: 63 6f 6d 62 69 6e 69 6e 67 20 61 6c 6c 20 69 6e  combining all in
8e30: 70 75 74 20 63 68 61 6e 67 65 73 65 74 73 20 74  put changesets t
8e40: 6f 67 65 74 68 65 72 20 69 73 20 6f 62 74 61 69  ogether is obtai
8e50: 6e 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 62  ned .**        b
8e60: 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
8e70: 6e 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20  n via a call to 
8e80: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8e90: 75 70 5f 6f 75 74 70 75 74 28 29 2e 0a 2a 2a 0a  up_output()..**.
8ea0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6f 62  **   <li> The ob
8eb0: 6a 65 63 74 20 69 73 20 64 65 6c 65 74 65 64 20  ject is deleted 
8ec0: 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
8ed0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
8ee0: 75 70 5f 64 65 6c 65 74 65 28 29 2e 0a 2a 2a 20  up_delete()..** 
8ef0: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  </ul>.**.** Any 
8f00: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
8f10: 74 6f 20 61 64 64 28 29 20 61 6e 64 20 6f 75 74  to add() and out
8f20: 70 75 74 28 29 20 6d 61 79 20 62 65 20 6d 61 64  put() may be mad
8f30: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 61  e between the ca
8f40: 6c 6c 73 20 74 6f 0a 2a 2a 20 6e 65 77 28 29 20  lls to.** new() 
8f50: 61 6e 64 20 64 65 6c 65 74 65 28 29 2c 20 61 6e  and delete(), an
8f60: 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 0a  d in any order..
8f70: 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  **.** As well as
8f80: 20 74 68 65 20 72 65 67 75 6c 61 72 20 73 71 6c   the regular sql
8f90: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8fa0: 61 64 64 28 29 20 61 6e 64 20 0a 2a 2a 20 73 71  add() and .** sq
8fb0: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
8fc0: 5f 6f 75 74 70 75 74 28 29 20 66 75 6e 63 74 69  _output() functi
8fd0: 6f 6e 73 2c 20 61 6c 73 6f 20 61 76 61 69 6c 61  ons, also availa
8fe0: 62 6c 65 20 61 72 65 20 74 68 65 20 73 74 72 65  ble are the stre
8ff0: 61 6d 69 6e 67 0a 2a 2a 20 76 65 72 73 69 6f 6e  aming.** version
9000: 73 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  s sqlite3changeg
9010: 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 29 20  roup_add_strm() 
9020: 61 6e 64 20 73 71 6c 69 74 65 33 63 68 61 6e 67  and sqlite3chang
9030: 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74  egroup_output_st
9040: 72 6d 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rm()..*/.int sql
9050: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
9060: 6e 65 77 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  new(sqlite3_chan
9070: 67 65 67 72 6f 75 70 20 2a 2a 70 70 29 3b 0a 0a  gegroup **pp);..
9080: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
9090: 41 64 64 20 41 20 43 68 61 6e 67 65 73 65 74 20  Add A Changeset 
90a0: 54 6f 20 41 20 43 68 61 6e 67 65 67 72 6f 75 70  To A Changegroup
90b0: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
90c0: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 0a  te3_changegroup.
90d0: 2a 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 63 68  **.** Add all ch
90e0: 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68 65  anges within the
90f0: 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72 20 70   changeset (or p
9100: 61 74 63 68 73 65 74 29 20 69 6e 20 62 75 66 66  atchset) in buff
9110: 65 72 20 70 44 61 74 61 20 28 73 69 7a 65 0a 2a  er pData (size.*
9120: 2a 20 6e 44 61 74 61 20 62 79 74 65 73 29 20 74  * nData bytes) t
9130: 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  o the changegrou
9140: 70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  p. .**.** If the
9150: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 73   buffer contains
9160: 20 61 20 70 61 74 63 68 73 65 74 2c 20 74 68 65   a patchset, the
9170: 6e 20 61 6c 6c 20 70 72 69 6f 72 20 63 61 6c 6c  n all prior call
9180: 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  s to this functi
9190: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  on.** on the sam
91a0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62  e changegroup ob
91b0: 6a 65 63 74 20 6d 75 73 74 20 61 6c 73 6f 20 68  ject must also h
91c0: 61 76 65 20 73 70 65 63 69 66 69 65 64 20 70 61  ave specified pa
91d0: 74 63 68 73 65 74 73 2e 20 4f 72 2c 20 69 66 0a  tchsets. Or, if.
91e0: 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  ** the buffer co
91f0: 6e 74 61 69 6e 73 20 61 20 63 68 61 6e 67 65 73  ntains a changes
9200: 65 74 2c 20 73 6f 20 6d 75 73 74 20 68 61 76 65  et, so must have
9210: 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c   the earlier cal
9220: 6c 73 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75  ls to this.** fu
9230: 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
9240: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  e, SQLITE_ERROR 
9250: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
9260: 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 61  no changes are a
9270: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  dded.** to the c
9280: 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  hangegroup..**.*
9290: 2a 20 52 6f 77 73 20 77 69 74 68 69 6e 20 74 68  * Rows within th
92a0: 65 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20  e changeset and 
92b0: 63 68 61 6e 67 65 67 72 6f 75 70 20 61 72 65 20  changegroup are 
92c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
92d0: 65 20 76 61 6c 75 65 73 20 69 6e 0a 2a 2a 20 74  e values in.** t
92e0: 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b 45 59  heir PRIMARY KEY
92f0: 20 63 6f 6c 75 6d 6e 73 2e 20 41 20 63 68 61 6e   columns. A chan
9300: 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ge in the change
9310: 73 65 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65  set is considere
9320: 64 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 74 6f  d to.** apply to
9330: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73   the same row as
9340: 20 61 20 63 68 61 6e 67 65 20 61 6c 72 65 61 64   a change alread
9350: 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  y present in the
9360: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 69 66 0a   changegroup if.
9370: 2a 2a 20 74 68 65 20 74 77 6f 20 72 6f 77 73 20  ** the two rows 
9380: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 70 72  have the same pr
9390: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
93a0: 20 43 68 61 6e 67 65 73 20 74 6f 20 72 6f 77 73   Changes to rows
93b0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 6c 72   that do not alr
93c0: 65 61 64 79 20 61 70 70 65 61 72 20 69 6e 20 74  eady appear in t
93d0: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 61  he changegroup a
93e0: 72 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 63 6f 70  re.** simply cop
93f0: 69 65 64 20 69 6e 74 6f 20 69 74 2e 20 4f 72 2c  ied into it. Or,
9400: 20 69 66 20 62 6f 74 68 20 74 68 65 20 6e 65 77   if both the new
9410: 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 20 74   changeset and t
9420: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a  he changegroup.*
9430: 2a 20 63 6f 6e 74 61 69 6e 20 63 68 61 6e 67 65  * contain change
9440: 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
9450: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
9460: 65 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 73  e final contents
9470: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67   of the.** chang
9480: 65 67 72 6f 75 70 20 64 65 70 65 6e 64 73 20 6f  egroup depends o
9490: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 65 61  n the type of ea
94a0: 63 68 20 63 68 61 6e 67 65 2c 20 61 73 20 66 6f  ch change, as fo
94b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 74 61  llows:.**.** <ta
94c0: 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73 74 79  ble border=1 sty
94d0: 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a  le="margin-left:
94e0: 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74  8ex;margin-right
94f0: 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74 72 3e  :8ex">.**   <tr>
9500: 3c 74 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65  <th style="white
9510: 2d 73 70 61 63 65 3a 70 72 65 22 3e 45 78 69 73  -space:pre">Exis
9520: 74 69 6e 67 20 43 68 61 6e 67 65 20 20 3c 2f 74  ting Change  </t
9530: 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68 20  h>.**       <th 
9540: 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61  style="white-spa
9550: 63 65 3a 70 72 65 22 3e 4e 65 77 20 43 68 61 6e  ce:pre">New Chan
9560: 67 65 20 20 20 20 20 20 20 3c 2f 74 68 3e 0a 2a  ge       </th>.*
9570: 2a 20 20 20 20 20 20 20 3c 74 68 3e 4f 75 74 70  *       <th>Outp
9580: 75 74 20 43 68 61 6e 67 65 0a 2a 2a 20 20 20 3c  ut Change.**   <
9590: 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  tr><td>INSERT <t
95a0: 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a  d>INSERT <td>.**
95b0: 20 20 20 20 20 20 20 54 68 65 20 6e 65 77 20 63         The new c
95c0: 68 61 6e 67 65 20 69 73 20 69 67 6e 6f 72 65 64  hange is ignored
95d0: 2e 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73  . This case does
95e0: 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20 74 68   not occur if th
95f0: 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 63  e new.**       c
9600: 68 61 6e 67 65 73 65 74 20 77 61 73 20 72 65 63  hangeset was rec
9610: 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  orded immediatel
9620: 79 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  y after the chan
9630: 67 65 73 65 74 73 20 61 6c 72 65 61 64 79 0a 2a  gesets already.*
9640: 2a 20 20 20 20 20 20 20 61 64 64 65 64 20 74 6f  *       added to
9650: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
9660: 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49  ..**   <tr><td>I
9670: 4e 53 45 52 54 20 3c 74 64 3e 55 50 44 41 54 45  NSERT <td>UPDATE
9680: 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54   <td>.**       T
9690: 68 65 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65  he INSERT change
96a0: 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
96b0: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54 68 65  changegroup. The
96c0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 0a   values in the .
96d0: 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  **       INSERT 
96e0: 63 68 61 6e 67 65 20 61 72 65 20 6d 6f 64 69 66  change are modif
96f0: 69 65 64 20 61 73 20 69 66 20 74 68 65 20 72 6f  ied as if the ro
9700: 77 20 77 61 73 20 69 6e 73 65 72 74 65 64 20 62  w was inserted b
9710: 79 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65  y the.**       e
9720: 78 69 73 74 69 6e 67 20 63 68 61 6e 67 65 20 61  xisting change a
9730: 6e 64 20 74 68 65 6e 20 75 70 64 61 74 65 64 20  nd then updated 
9740: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
9750: 20 6e 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20   new change..** 
9760: 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54    <tr><td>INSERT
9770: 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e   <td>DELETE <td>
9780: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78  .**       The ex
9790: 69 73 74 69 6e 67 20 49 4e 53 45 52 54 20 69 73  isting INSERT is
97a0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
97b0: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54  e changegroup. T
97c0: 68 65 20 44 45 4c 45 54 45 20 69 73 0a 2a 2a 20  he DELETE is.** 
97d0: 20 20 20 20 20 20 6e 6f 74 20 61 64 64 65 64 2e        not added.
97e0: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50  .**   <tr><td>UP
97f0: 44 41 54 45 20 3c 74 64 3e 49 4e 53 45 52 54 20  DATE <td>INSERT 
9800: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68  <td>.**       Th
9810: 65 20 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20  e new change is 
9820: 69 67 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61  ignored. This ca
9830: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  se does not occu
9840: 72 20 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r if the new.** 
9850: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20        changeset 
9860: 77 61 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d  was recorded imm
9870: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
9880: 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c  he changesets al
9890: 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61  ready.**       a
98a0: 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e  dded to the chan
98b0: 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74  gegroup..**   <t
98c0: 72 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64  r><td>UPDATE <td
98d0: 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20  >UPDATE <td>.** 
98e0: 20 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69        The existi
98f0: 6e 67 20 55 50 44 41 54 45 20 72 65 6d 61 69 6e  ng UPDATE remain
9900: 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 61  s within the cha
9910: 6e 67 65 67 72 6f 75 70 2e 20 49 74 20 69 73 20  ngegroup. It is 
9920: 61 6d 65 6e 64 65 64 20 0a 2a 2a 20 20 20 20 20  amended .**     
9930: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 63    so that the ac
9940: 63 6f 6d 70 61 6e 79 69 6e 67 20 76 61 6c 75 65  companying value
9950: 73 20 61 72 65 20 61 73 20 69 66 20 74 68 65 20  s are as if the 
9960: 72 6f 77 20 77 61 73 20 75 70 64 61 74 65 64 20  row was updated 
9970: 6f 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 62  once .**       b
9980: 79 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  y the existing c
9990: 68 61 6e 67 65 20 61 6e 64 20 74 68 65 6e 20 61  hange and then a
99a0: 67 61 69 6e 20 62 79 20 74 68 65 20 6e 65 77 20  gain by the new 
99b0: 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 3c 74 72  change..**   <tr
99c0: 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e  ><td>UPDATE <td>
99d0: 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20  DELETE <td>.**  
99e0: 20 20 20 20 20 54 68 65 20 65 78 69 73 74 69 6e       The existin
99f0: 67 20 55 50 44 41 54 45 20 69 73 20 72 65 70 6c  g UPDATE is repl
9a00: 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  aced by the new 
9a10: 44 45 4c 45 54 45 20 77 69 74 68 69 6e 20 74 68  DELETE within th
9a20: 65 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67  e.**       chang
9a30: 65 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72  egroup..**   <tr
9a40: 3e 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e  ><td>DELETE <td>
9a50: 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20  INSERT <td>.**  
9a60: 20 20 20 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d       If one or m
9a70: 6f 72 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ore of the colum
9a80: 6e 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  n values in the 
9a90: 72 6f 77 20 69 6e 73 65 72 74 65 64 20 62 79 20  row inserted by 
9aa0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77  the.**       new
9ab0: 20 63 68 61 6e 67 65 20 64 69 66 66 65 72 20 66   change differ f
9ac0: 72 6f 6d 20 74 68 6f 73 65 20 69 6e 20 74 68 65  rom those in the
9ad0: 20 72 6f 77 20 64 65 6c 65 74 65 64 20 62 79 20   row deleted by 
9ae0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 0a 2a 2a  the existing .**
9af0: 20 20 20 20 20 20 20 63 68 61 6e 67 65 2c 20 74         change, t
9b00: 68 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45  he existing DELE
9b10: 54 45 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  TE is replaced b
9b20: 79 20 61 6e 20 55 50 44 41 54 45 20 77 69 74 68  y an UPDATE with
9b30: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
9b40: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 4f 74 68  changegroup. Oth
9b50: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
9b60: 6e 73 65 72 74 65 64 20 72 6f 77 20 69 73 20 65  nserted row is e
9b70: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
9b80: 0a 2a 2a 20 20 20 20 20 20 20 61 73 20 74 68 65  .**       as the
9b90: 20 64 65 6c 65 74 65 64 20 72 6f 77 2c 20 74 68   deleted row, th
9ba0: 65 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45 54  e existing DELET
9bb0: 45 20 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63  E is simply disc
9bc0: 61 72 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e  arded..**   <tr>
9bd0: 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 55  <td>DELETE <td>U
9be0: 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  PDATE <td>.**   
9bf0: 20 20 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e      The new chan
9c00: 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54  ge is ignored. T
9c10: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
9c20: 74 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e  t occur if the n
9c30: 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e  ew.**       chan
9c40: 67 65 73 65 74 20 77 61 73 20 72 65 63 6f 72 64  geset was record
9c50: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
9c60: 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 73  fter the changes
9c70: 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ets already.**  
9c80: 20 20 20 20 20 61 64 64 65 64 20 74 6f 20 74 68       added to th
9c90: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a  e changegroup..*
9ca0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45  *   <tr><td>DELE
9cb0: 54 45 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74  TE <td>DELETE <t
9cc0: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
9cd0: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
9ce0: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
9cf0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
9d00: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
9d10: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
9d20: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
9d30: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
9d40: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
9d50: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
9d60: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
9d70: 67 72 6f 75 70 2e 0a 2a 2a 20 3c 2f 74 61 62 6c  group..** </tabl
9d80: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
9d90: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20 63 6f  new changeset co
9da0: 6e 74 61 69 6e 73 20 63 68 61 6e 67 65 73 20 74  ntains changes t
9db0: 6f 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  o a table that i
9dc0: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
9dd0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 68 61 6e  t.** in the chan
9de0: 67 65 67 72 6f 75 70 2c 20 74 68 65 6e 20 74 68  gegroup, then th
9df0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9e00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 70 6f 73 69  mns and the posi
9e10: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 70  tion of the.** p
9e20: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
9e30: 6e 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ns for the table
9e40: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 69 73 74   must be consist
9e50: 65 6e 74 2e 20 49 66 20 74 68 69 73 20 69 73 20  ent. If this is 
9e60: 6e 6f 74 20 74 68 65 0a 2a 2a 20 63 61 73 65 2c  not the.** case,
9e70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9e80: 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
9e90: 5f 53 43 48 45 4d 41 2e 20 49 66 20 74 68 65 20  _SCHEMA. If the 
9ea0: 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 0a  input changeset.
9eb0: 2a 2a 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ** appears to be
9ec0: 20 63 6f 72 72 75 70 74 20 61 6e 64 20 74 68 65   corrupt and the
9ed0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
9ee0: 65 74 65 63 74 65 64 2c 20 53 51 4c 49 54 45 5f  etected, SQLITE_
9ef0: 43 4f 52 52 55 50 54 20 69 73 0a 2a 2a 20 72 65  CORRUPT is.** re
9f00: 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61  turned. Or, if a
9f10: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
9f20: 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
9f30: 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69   during processi
9f40: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  ng, this.** func
9f50: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
9f60: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 61 6c  ITE_NOMEM. In al
9f70: 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20 65  l cases, if an e
9f80: 72 72 6f 72 20 6f 63 63 75 72 73 20 74 68 65 0a  rror occurs the.
9f90: 2a 2a 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  ** final content
9fa0: 73 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67  s of the changeg
9fb0: 72 6f 75 70 20 69 73 20 75 6e 64 65 66 69 6e 65  roup is undefine
9fc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  d..**.** If no e
9fd0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
9fe0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
9ff0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
a000: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
a010: 64 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  d(sqlite3_change
a020: 67 72 6f 75 70 2a 2c 20 69 6e 74 20 6e 44 61 74  group*, int nDat
a030: 61 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 3b  a, void *pData);
a040: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
a050: 3a 20 4f 62 74 61 69 6e 20 41 20 43 6f 6d 70 6f  : Obtain A Compo
a060: 73 69 74 65 20 43 68 61 6e 67 65 73 65 74 20 46  site Changeset F
a070: 72 6f 6d 20 41 20 43 68 61 6e 67 65 67 72 6f 75  rom A Changegrou
a080: 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  p.** METHOD: sql
a090: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
a0a0: 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  .**.** Obtain a 
a0b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
a0c0: 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 6f  g a changeset (o
a0d0: 72 20 70 61 74 63 68 73 65 74 29 20 72 65 70 72  r patchset) repr
a0e0: 65 73 65 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20  esenting the.** 
a0f0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
a100: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67 72   of the changegr
a110: 6f 75 70 2e 20 49 66 20 74 68 65 20 69 6e 70 75  oup. If the inpu
a120: 74 73 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ts to the change
a130: 67 72 6f 75 70 0a 2a 2a 20 77 65 72 65 20 74 68  group.** were th
a140: 65 6d 73 65 6c 76 65 73 20 63 68 61 6e 67 65 73  emselves changes
a150: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a160: 69 73 20 61 20 63 68 61 6e 67 65 73 65 74 2e 20  is a changeset. 
a170: 4f 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 69 6e  Or, if the.** in
a180: 70 75 74 73 20 77 65 72 65 20 70 61 74 63 68 73  puts were patchs
a190: 65 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ets, the output 
a1a0: 69 73 20 61 6c 73 6f 20 61 20 70 61 74 63 68 73  is also a patchs
a1b0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 69 74  et..**.** As wit
a1c0: 68 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  h the output of 
a1d0: 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
a1e0: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 61  on_changeset() a
a1f0: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 73 65 73  nd.** sqlite3ses
a200: 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 29 20  sion_patchset() 
a210: 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63  functions, all c
a220: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
a230: 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 74 61  o a single.** ta
a240: 62 6c 65 20 61 72 65 20 67 72 6f 75 70 65 64 20  ble are grouped 
a250: 74 6f 67 65 74 68 65 72 20 69 6e 20 74 68 65 20  together in the 
a260: 6f 75 74 70 75 74 20 6f 66 20 74 68 69 73 20 66  output of this f
a270: 75 6e 63 74 69 6f 6e 2e 20 54 61 62 6c 65 73 20  unction. Tables 
a280: 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 74 68 65  appear.** in the
a290: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 66   same order as f
a2a0: 6f 72 20 74 68 65 20 76 65 72 79 20 66 69 72 73  or the very firs
a2b0: 74 20 63 68 61 6e 67 65 73 65 74 20 61 64 64 65  t changeset adde
a2c0: 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  d to the changeg
a2d0: 72 6f 75 70 2e 0a 2a 2a 20 49 66 20 74 68 65 20  roup..** If the 
a2e0: 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
a2f0: 75 65 6e 74 20 63 68 61 6e 67 65 73 65 74 73 20  uent changesets 
a300: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
a310: 6e 67 65 67 72 6f 75 70 20 63 6f 6e 74 61 69 6e  ngegroup contain
a320: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 66 6f 72 20  .** changes for 
a330: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
a340: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
a350: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74   first changeset
a360: 2c 20 74 68 65 79 20 61 72 65 0a 2a 2a 20 61 70  , they are.** ap
a370: 70 65 6e 64 65 64 20 6f 6e 74 6f 20 74 68 65 20  pended onto the 
a380: 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 70 75  end of the outpu
a390: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 67 61  t changeset, aga
a3a0: 69 6e 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  in in the order 
a3b0: 69 6e 0a 2a 2a 20 77 68 69 63 68 20 74 68 65 79  in.** which they
a3c0: 20 61 72 65 20 66 69 72 73 74 20 65 6e 63 6f 75   are first encou
a3d0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
a3e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a3f0: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
a400: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a410: 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
a420: 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 28  t.** variables (
a430: 2a 70 6e 44 61 74 61 29 20 61 6e 64 20 28 2a 70  *pnData) and (*p
a440: 70 44 61 74 61 29 20 61 72 65 20 73 65 74 20 74  pData) are set t
a450: 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
a460: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
a470: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
a480: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
a490: 73 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65  s are set to the
a4a0: 20 73 69 7a 65 20 6f 66 20 61 6e 64 20 61 20 0a   size of and a .
a4b0: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
a4c0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  e output buffer,
a4d0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 49   respectively. I
a4e0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
a4f0: 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
a500: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
a510: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
a520: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 62 75 66  lly free the buf
a530: 66 65 72 20 75 73 69 6e 67 20 61 0a 2a 2a 20 63  fer using a.** c
a540: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  all to sqlite3_f
a550: 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
a560: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a570: 5f 6f 75 74 70 75 74 28 0a 20 20 73 71 6c 69 74  _output(.  sqlit
a580: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c  e3_changegroup*,
a590: 0a 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 2c 20  .  int *pnData, 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
a5c0: 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
a5d0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76   in bytes */.  v
a5e0: 6f 69 64 20 2a 2a 70 70 44 61 74 61 20 20 20 20  oid **ppData    
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
a610: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
a620: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  */.);../*.** CAP
a630: 49 33 52 45 46 3a 20 44 65 6c 65 74 65 20 41 20  I3REF: Delete A 
a640: 43 68 61 6e 67 65 67 72 6f 75 70 20 4f 62 6a 65  Changegroup Obje
a650: 63 74 0a 2a 2a 20 44 45 53 54 52 55 43 54 4f 52  ct.** DESTRUCTOR
a660: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
a670: 67 72 6f 75 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  group.*/.void sq
a680: 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
a690: 5f 64 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  _delete(sqlite3_
a6a0: 63 68 61 6e 67 65 67 72 6f 75 70 2a 29 3b 0a 0a  changegroup*);..
a6b0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
a6c0: 41 70 70 6c 79 20 41 20 43 68 61 6e 67 65 73 65  Apply A Changese
a6d0: 74 20 54 6f 20 41 20 44 61 74 61 62 61 73 65 0a  t To A Database.
a6e0: 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 63 68  **.** Apply a ch
a6f0: 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
a700: 73 65 74 20 74 6f 20 61 20 64 61 74 61 62 61 73  set to a databas
a710: 65 2e 20 54 68 65 73 65 20 66 75 6e 63 74 69 6f  e. These functio
a720: 6e 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ns attempt to.**
a730: 20 75 70 64 61 74 65 20 74 68 65 20 22 6d 61 69   update the "mai
a740: 6e 22 20 64 61 74 61 62 61 73 65 20 61 74 74 61  n" database atta
a750: 63 68 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 64  ched to handle d
a760: 62 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 67  b with the chang
a770: 65 73 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 74  es found in.** t
a780: 68 65 20 63 68 61 6e 67 65 73 65 74 20 70 61 73  he changeset pas
a790: 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
a7a0: 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
a7b0: 75 6d 65 6e 74 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  uments. .**.** T
a7c0: 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
a7d0: 6e 74 20 28 78 46 69 6c 74 65 72 29 20 70 61 73  nt (xFilter) pas
a7e0: 73 65 64 20 74 6f 20 74 68 65 73 65 20 66 75 6e  sed to these fun
a7f0: 63 74 69 6f 6e 73 20 69 73 20 74 68 65 20 22 66  ctions is the "f
a800: 69 6c 74 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ilter.** callbac
a810: 6b 22 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  k". If it is not
a820: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 6f 72 20   NULL, then for 
a830: 65 61 63 68 20 74 61 62 6c 65 20 61 66 66 65 63  each table affec
a840: 74 65 64 20 62 79 20 61 74 20 6c 65 61 73 74 20  ted by at least 
a850: 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67 65 20 69 6e  one.** change in
a860: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
a870: 74 68 65 20 66 69 6c 74 65 72 20 63 61 6c 6c 62  the filter callb
a880: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ack is invoked w
a890: 69 74 68 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ith.** the table
a8a0: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 73 65 63   name as the sec
a8b0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e  ond argument, an
a8c0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
a8d0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 0a  context pointer.
a8e0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
a8f0: 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74 20   sixth argument 
a900: 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 49 66  as the first. If
a910: 20 74 68 65 20 22 66 69 6c 74 65 72 20 63 61 6c   the "filter cal
a920: 6c 62 61 63 6b 22 0a 2a 2a 20 72 65 74 75 72 6e  lback".** return
a930: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6e 6f 20  s zero, then no 
a940: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
a950: 74 6f 20 61 70 70 6c 79 20 61 6e 79 20 63 68 61  to apply any cha
a960: 6e 67 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nges to the tabl
a970: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
a980: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   if the return v
a990: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
a9a0: 20 6f 72 20 74 68 65 20 78 46 69 6c 74 65 72 20   or the xFilter 
a9b0: 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 69  argument to.** i
a9c0: 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 63 68 61 6e  s NULL, all chan
a9d0: 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ges related to t
a9e0: 68 65 20 74 61 62 6c 65 20 61 72 65 20 61 74 74  he table are att
a9f0: 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  empted..**.** Fo
aa00: 72 20 65 61 63 68 20 74 61 62 6c 65 20 74 68 61  r each table tha
aa10: 74 20 69 73 20 6e 6f 74 20 65 78 63 6c 75 64 65  t is not exclude
aa20: 64 20 62 79 20 74 68 65 20 66 69 6c 74 65 72 20  d by the filter 
aa30: 63 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 20 66  callback, this f
aa40: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 74 65 73 74  unction .** test
aa50: 73 20 74 68 61 74 20 74 68 65 20 74 61 72 67 65  s that the targe
aa60: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  t database conta
aa70: 69 6e 73 20 61 20 63 6f 6d 70 61 74 69 62 6c 65  ins a compatible
aa80: 20 74 61 62 6c 65 2e 20 41 20 74 61 62 6c 65 20   table. A table 
aa90: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
aaa0: 64 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 66 20  d compatible if 
aab0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
aac0: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
aad0: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
aae0: 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61  li> The table ha
aaf0: 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
ab00: 61 73 20 74 68 65 20 6e 61 6d 65 20 72 65 63 6f  as the name reco
ab10: 72 64 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20  rded in the .** 
ab20: 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74         changeset
ab30: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
ab40: 54 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 74  The table has at
ab50: 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20 63   least as many c
ab60: 6f 6c 75 6d 6e 73 20 61 73 20 72 65 63 6f 72 64  olumns as record
ab70: 65 64 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20  ed in the .**   
ab80: 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 2c 20       changeset, 
ab90: 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68  and.**   <li> Th
aba0: 65 20 74 61 62 6c 65 20 68 61 73 20 70 72 69 6d  e table has prim
abb0: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
abc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 6f 73 69  in the same posi
abd0: 74 69 6f 6e 20 61 73 20 0a 2a 2a 20 20 20 20 20  tion as .**     
abe0: 20 20 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74     recorded in t
abf0: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a  he changeset..**
ac00: 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 49 66 20   </ul>.**.** If 
ac10: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  there is no comp
ac20: 61 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 69 74  atible table, it
ac30: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
ac40: 2c 20 62 75 74 20 6e 6f 6e 65 20 6f 66 20 74 68  , but none of th
ac50: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 61 73 73  e.** changes ass
ac60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ac70: 20 74 61 62 6c 65 20 61 72 65 20 61 70 70 6c 69   table are appli
ac80: 65 64 2e 20 41 20 77 61 72 6e 69 6e 67 20 6d 65  ed. A warning me
ac90: 73 73 61 67 65 20 69 73 20 69 73 73 75 65 64 0a  ssage is issued.
aca0: 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
acb0: 65 33 5f 6c 6f 67 28 29 20 6d 65 63 68 61 6e 69  e3_log() mechani
acc0: 73 6d 20 77 69 74 68 20 74 68 65 20 65 72 72 6f  sm with the erro
acd0: 72 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 53 43  r code SQLITE_SC
ace0: 48 45 4d 41 2e 20 41 74 20 6d 6f 73 74 0a 2a 2a  HEMA. At most.**
acf0: 20 6f 6e 65 20 73 75 63 68 20 77 61 72 6e 69 6e   one such warnin
ad00: 67 20 69 73 20 69 73 73 75 65 64 20 66 6f 72 20  g is issued for 
ad10: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
ad20: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  e changeset..**.
ad30: 2a 2a 20 46 6f 72 20 65 61 63 68 20 63 68 61 6e  ** For each chan
ad40: 67 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ge for which the
ad50: 72 65 20 69 73 20 61 20 63 6f 6d 70 61 74 69 62  re is a compatib
ad60: 6c 65 20 74 61 62 6c 65 2c 20 61 6e 20 61 74 74  le table, an att
ad70: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a  empt is made .**
ad80: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
ad90: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 20 61 63  able contents ac
ada0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 55  cording to the U
adb0: 50 44 41 54 45 2c 20 49 4e 53 45 52 54 20 6f 72  PDATE, INSERT or
adc0: 20 44 45 4c 45 54 45 20 0a 2a 2a 20 63 68 61 6e   DELETE .** chan
add0: 67 65 2e 20 49 66 20 61 20 63 68 61 6e 67 65 20  ge. If a change 
ade0: 63 61 6e 6e 6f 74 20 62 65 20 61 70 70 6c 69 65  cannot be applie
adf0: 64 20 63 6c 65 61 6e 6c 79 2c 20 74 68 65 20 63  d cleanly, the c
ae00: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
ae10: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 73  .** function pas
ae20: 73 65 64 20 61 73 20 74 68 65 20 66 69 66 74 68  sed as the fifth
ae30: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
ae40: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
ae50: 70 6c 79 28 29 20 6d 61 79 20 62 65 20 0a 2a 2a  ply() may be .**
ae60: 20 69 6e 76 6f 6b 65 64 2e 20 41 20 64 65 73 63   invoked. A desc
ae70: 72 69 70 74 69 6f 6e 20 6f 66 20 65 78 61 63 74  ription of exact
ae80: 6c 79 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 66  ly when the conf
ae90: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20  lict handler is 
aea0: 69 6e 76 6f 6b 65 64 20 66 6f 72 20 0a 2a 2a 20  invoked for .** 
aeb0: 65 61 63 68 20 74 79 70 65 20 6f 66 20 63 68 61  each type of cha
aec0: 6e 67 65 20 69 73 20 62 65 6c 6f 77 2e 0a 2a 2a  nge is below..**
aed0: 0a 2a 2a 20 55 6e 6c 69 6b 65 20 74 68 65 20 78  .** Unlike the x
aee0: 46 69 6c 74 65 72 20 61 72 67 75 6d 65 6e 74 2c  Filter argument,
aef0: 20 78 43 6f 6e 66 6c 69 63 74 20 6d 61 79 20 6e   xConflict may n
af00: 6f 74 20 62 65 20 70 61 73 73 65 64 20 4e 55 4c  ot be passed NUL
af10: 4c 2e 20 54 68 65 20 72 65 73 75 6c 74 73 0a 2a  L. The results.*
af20: 2a 20 6f 66 20 70 61 73 73 69 6e 67 20 61 6e 79  * of passing any
af30: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
af40: 20 61 20 76 61 6c 69 64 20 66 75 6e 63 74 69 6f   a valid functio
af50: 6e 20 70 6f 69 6e 74 65 72 20 61 73 20 74 68 65  n pointer as the
af60: 20 78 43 6f 6e 66 6c 69 63 74 0a 2a 2a 20 61 72   xConflict.** ar
af70: 67 75 6d 65 6e 74 20 61 72 65 20 75 6e 64 65 66  gument are undef
af80: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  ined..**.** Each
af90: 20 74 69 6d 65 20 74 68 65 20 63 6f 6e 66 6c 69   time the confli
afa0: 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct handler funct
afb0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ion is invoked, 
afc0: 69 74 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6f  it must return o
afd0: 6e 65 0a 2a 2a 20 6f 66 20 5b 53 51 4c 49 54 45  ne.** of [SQLITE
afe0: 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 5d  _CHANGESET_OMIT]
aff0: 2c 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  , [SQLITE_CHANGE
b000: 53 45 54 5f 41 42 4f 52 54 5d 20 6f 72 20 0a 2a  SET_ABORT] or .*
b010: 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  * [SQLITE_CHANGE
b020: 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e 20 53 51  SET_REPLACE]. SQ
b030: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
b040: 45 50 4c 41 43 45 20 6d 61 79 20 6f 6e 6c 79 20  EPLACE may only 
b050: 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  be returned.** i
b060: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b070: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
b080: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
b090: 64 6c 65 72 20 69 73 20 65 69 74 68 65 72 0a 2a  dler is either.*
b0a0: 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  * SQLITE_CHANGES
b0b0: 45 54 5f 44 41 54 41 20 6f 72 20 53 51 4c 49 54  ET_DATA or SQLIT
b0c0: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
b0d0: 4c 49 43 54 2e 20 49 66 20 74 68 65 20 63 6f 6e  LICT. If the con
b0e0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 0a 2a 2a  flict-handler.**
b0f0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6c 6c 65   returns an ille
b100: 67 61 6c 20 76 61 6c 75 65 2c 20 61 6e 79 20 63  gal value, any c
b110: 68 61 6e 67 65 73 20 61 6c 72 65 61 64 79 20 6d  hanges already m
b120: 61 64 65 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ade are rolled b
b130: 61 63 6b 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ack and.** the c
b140: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68  all to sqlite3ch
b150: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
b160: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d  returns SQLITE_M
b170: 49 53 55 53 45 2e 20 44 69 66 66 65 72 65 6e 74  ISUSE. Different
b180: 20 0a 2a 2a 20 61 63 74 69 6f 6e 73 20 61 72 65   .** actions are
b190: 20 74 61 6b 65 6e 20 62 79 20 73 71 6c 69 74 65   taken by sqlite
b1a0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
b1b0: 28 29 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  () depending on 
b1c0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
b1d0: 75 72 6e 65 64 20 62 79 20 65 61 63 68 20 69 6e  urned by each in
b1e0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  vocation of the 
b1f0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
b200: 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 66 65 72   function. Refer
b210: 20 74 6f 0a 2a 2a 20 74 68 65 20 64 6f 63 75 6d   to.** the docum
b220: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
b230: 20 74 68 72 65 65 20 0a 2a 2a 20 5b 53 51 4c 49   three .** [SQLI
b240: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
b250: 54 7c 61 76 61 69 6c 61 62 6c 65 20 72 65 74 75  T|available retu
b260: 72 6e 20 76 61 6c 75 65 73 5d 20 66 6f 72 20 64  rn values] for d
b270: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 3c 64  etails..**.** <d
b280: 6c 3e 0a 2a 2a 20 3c 64 74 3e 44 45 4c 45 54 45  l>.** <dt>DELETE
b290: 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20   Changes<dd>.** 
b2a0: 20 20 46 6f 72 20 65 61 63 68 20 44 45 4c 45 54    For each DELET
b2b0: 45 20 63 68 61 6e 67 65 2c 20 74 68 65 20 66 75  E change, the fu
b2c0: 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
b2d0: 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
b2e0: 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f 6e 74 61  base .**   conta
b2f0: 69 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20 74  ins a row with t
b300: 68 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20  he same primary 
b310: 6b 65 79 20 76 61 6c 75 65 20 28 6f 72 20 76 61  key value (or va
b320: 6c 75 65 73 29 20 61 73 20 74 68 65 20 0a 2a 2a  lues) as the .**
b330: 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20     original row 
b340: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
b350: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
b360: 49 66 20 69 74 20 64 6f 65 73 2c 20 61 6e 64 20  If it does, and 
b370: 74 68 65 20 76 61 6c 75 65 73 20 0a 2a 2a 20 20  the values .**  
b380: 20 73 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20 6e   stored in all n
b390: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 63  on-primary key c
b3a0: 6f 6c 75 6d 6e 73 20 61 6c 73 6f 20 6d 61 74 63  olumns also matc
b3b0: 68 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  h the values sto
b3c0: 72 65 64 20 69 6e 20 0a 2a 2a 20 20 20 74 68 65  red in .**   the
b3d0: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20 72   changeset the r
b3e0: 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ow is deleted fr
b3f0: 6f 6d 20 74 68 65 20 74 61 72 67 65 74 20 64 61  om the target da
b400: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
b410: 49 66 20 61 20 72 6f 77 20 77 69 74 68 20 6d 61  If a row with ma
b420: 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  tching primary k
b430: 65 79 20 76 61 6c 75 65 73 20 69 73 20 66 6f 75  ey values is fou
b440: 6e 64 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20 6d  nd, but one or m
b450: 6f 72 65 20 6f 66 0a 2a 2a 20 20 20 74 68 65 20  ore of.**   the 
b460: 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20  non-primary key 
b470: 66 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 73 20  fields contains 
b480: 61 20 76 61 6c 75 65 20 64 69 66 66 65 72 65 6e  a value differen
b490: 74 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  t from the origi
b4a0: 6e 61 6c 0a 2a 2a 20 20 20 72 6f 77 20 76 61 6c  nal.**   row val
b4b0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
b4c0: 20 63 68 61 6e 67 65 73 65 74 2c 20 74 68 65 20   changeset, the 
b4d0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
b4e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
b4f0: 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b    invoked with [
b500: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
b510: 5f 44 41 54 41 5d 20 61 73 20 74 68 65 20 73 65  _DATA] as the se
b520: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
b530: 66 20 74 68 65 0a 2a 2a 20 20 20 64 61 74 61 62  f the.**   datab
b540: 61 73 65 20 74 61 62 6c 65 20 68 61 73 20 6d 6f  ase table has mo
b550: 72 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20  re columns than 
b560: 61 72 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20  are recorded in 
b570: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 0a 2a  the changeset,.*
b580: 2a 20 20 20 6f 6e 6c 79 20 74 68 65 20 76 61 6c  *   only the val
b590: 75 65 73 20 6f 66 20 74 68 6f 73 65 20 6e 6f 6e  ues of those non
b5a0: 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66 69 65  -primary key fie
b5b0: 6c 64 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  lds are compared
b5c0: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 20 20 74 68   against.**   th
b5d0: 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
b5e0: 73 65 20 63 6f 6e 74 65 6e 74 73 20 2d 20 61 6e  se contents - an
b5f0: 79 20 74 72 61 69 6c 69 6e 67 20 64 61 74 61 62  y trailing datab
b600: 61 73 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ase table column
b610: 73 0a 2a 2a 20 20 20 61 72 65 20 69 67 6e 6f 72  s.**   are ignor
b620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e  ed..**.**   If n
b630: 6f 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68  o row with match
b640: 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ing primary key 
b650: 76 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 20  values is found 
b660: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
b670: 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69  .**   the confli
b680: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
b690: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
b6a0: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
b6b0: 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a  GESET_NOTFOUND].
b6c0: 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73 20 74  **   passed as t
b6d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b6e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74  nt..**.**   If t
b6f0: 68 65 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  he DELETE operat
b700: 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64  ion is attempted
b710: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 72 65 74  , but SQLite ret
b720: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53  urns SQLITE_CONS
b730: 54 52 41 49 4e 54 0a 2a 2a 20 20 20 28 77 68 69  TRAINT.**   (whi
b740: 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
b750: 65 6e 20 69 66 20 61 20 66 6f 72 65 69 67 6e 20  en if a foreign 
b760: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
b770: 73 20 76 69 6f 6c 61 74 65 64 29 2c 20 74 68 65  s violated), the
b780: 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69 63 74 2d 68  .**   conflict-h
b790: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
b7a0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
b7b0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
b7c0: 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 0a 2a 2a  T_CONSTRAINT].**
b7d0: 20 20 20 70 61 73 73 65 64 20 61 73 20 74 68 65     passed as the
b7e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b7f0: 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20  . This includes 
b800: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74  the case where t
b810: 68 65 20 44 45 4c 45 54 45 0a 2a 2a 20 20 20 6f  he DELETE.**   o
b820: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65  peration is atte
b830: 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 61 6e  mpted because an
b840: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
b850: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   the conflict ha
b860: 6e 64 6c 65 72 0a 2a 2a 20 20 20 66 75 6e 63 74  ndler.**   funct
b870: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 5b 53 51  ion returned [SQ
b880: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
b890: 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a 2a 2a 20 3c  EPLACE]..**.** <
b8a0: 64 74 3e 49 4e 53 45 52 54 20 43 68 61 6e 67 65  dt>INSERT Change
b8b0: 73 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f 72 20 65  s<dd>.**   For e
b8c0: 61 63 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67  ach INSERT chang
b8d0: 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
b8e0: 20 6d 61 64 65 20 74 6f 20 69 6e 73 65 72 74 20   made to insert 
b8f0: 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  the new row into
b900: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
b910: 73 65 2e 20 49 66 20 74 68 65 20 63 68 61 6e 67  se. If the chang
b920: 65 73 65 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e  eset row contain
b930: 73 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 74  s fewer fields t
b940: 68 61 6e 20 74 68 65 0a 2a 2a 20 20 20 64 61 74  han the.**   dat
b950: 61 62 61 73 65 20 74 61 62 6c 65 2c 20 74 68 65  abase table, the
b960: 20 74 72 61 69 6c 69 6e 67 20 66 69 65 6c 64 73   trailing fields
b970: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 77   are populated w
b980: 69 74 68 20 74 68 65 69 72 20 64 65 66 61 75 6c  ith their defaul
b990: 74 0a 2a 2a 20 20 20 76 61 6c 75 65 73 2e 0a 2a  t.**   values..*
b9a0: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 61 74  *.**   If the at
b9b0: 74 65 6d 70 74 20 74 6f 20 69 6e 73 65 72 74 20  tempt to insert 
b9c0: 74 68 65 20 72 6f 77 20 66 61 69 6c 73 20 62 65  the row fails be
b9d0: 63 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61  cause the databa
b9e0: 73 65 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 20  se already .**  
b9f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20   contains a row 
ba00: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72  with the same pr
ba10: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
ba20: 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  , the conflict h
ba30: 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66 75 6e 63  andler.**   func
ba40: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
ba50: 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64 20  with the second 
ba60: 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74 6f 20  argument set to 
ba70: 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48  .**   [SQLITE_CH
ba80: 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54  ANGESET_CONFLICT
ba90: 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  ]..**.**   If th
baa0: 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6e 73  e attempt to ins
bab0: 65 72 74 20 74 68 65 20 72 6f 77 20 66 61 69 6c  ert the row fail
bac0: 73 20 62 65 63 61 75 73 65 20 6f 66 20 73 6f 6d  s because of som
bad0: 65 20 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  e other constrai
bae0: 6e 74 0a 2a 2a 20 20 20 76 69 6f 6c 61 74 69 6f  nt.**   violatio
baf0: 6e 20 28 65 2e 67 2e 20 4e 4f 54 20 4e 55 4c 4c  n (e.g. NOT NULL
bb00: 20 6f 72 20 55 4e 49 51 55 45 29 2c 20 74 68 65   or UNIQUE), the
bb10: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
bb20: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  r function is .*
bb30: 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68  *   invoked with
bb40: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
bb50: 6d 65 6e 74 20 73 65 74 20 74 6f 20 5b 53 51 4c  ment set to [SQL
bb60: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
bb70: 4e 53 54 52 41 49 4e 54 5d 2e 0a 2a 2a 20 20 20  NSTRAINT]..**   
bb80: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68  This includes th
bb90: 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  e case where the
bba0: 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
bbb0: 6e 20 69 73 20 72 65 2d 61 74 74 65 6d 70 74 65  n is re-attempte
bbc0: 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 20 20  d because .**   
bbd0: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
bbe0: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  to the conflict 
bbf0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
bc00: 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 20 20   returned .**   
bc10: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
bc20: 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a 2a  T_REPLACE]..**.*
bc30: 2a 20 3c 64 74 3e 55 50 44 41 54 45 20 43 68 61  * <dt>UPDATE Cha
bc40: 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f  nges<dd>.**   Fo
bc50: 72 20 65 61 63 68 20 55 50 44 41 54 45 20 63 68  r each UPDATE ch
bc60: 61 6e 67 65 2c 20 74 68 65 20 66 75 6e 63 74 69  ange, the functi
bc70: 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  on checks if the
bc80: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
bc90: 20 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20   .**   contains 
bca0: 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73  a row with the s
bcb0: 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ame primary key 
bcc0: 76 61 6c 75 65 20 28 6f 72 20 76 61 6c 75 65 73  value (or values
bcd0: 29 20 61 73 20 74 68 65 20 0a 2a 2a 20 20 20 6f  ) as the .**   o
bce0: 72 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75  riginal row valu
bcf0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
bd00: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 69   changeset. If i
bd10: 74 20 64 6f 65 73 2c 20 61 6e 64 20 74 68 65 20  t does, and the 
bd20: 76 61 6c 75 65 73 20 0a 2a 2a 20 20 20 73 74 6f  values .**   sto
bd30: 72 65 64 20 69 6e 20 61 6c 6c 20 6d 6f 64 69 66  red in all modif
bd40: 69 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  ied non-primary 
bd50: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f  key columns also
bd60: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
bd70: 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e  s.**   stored in
bd80: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74   the changeset t
bd90: 68 65 20 72 6f 77 20 69 73 20 75 70 64 61 74 65  he row is update
bda0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 72  d within the tar
bdb0: 67 65 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  get database..**
bdc0: 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77  .**   If a row w
bdd0: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69  ith matching pri
bde0: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20  mary key values 
bdf0: 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e  is found, but on
be00: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20  e or more of.** 
be10: 20 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6e    the modified n
be20: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66  on-primary key f
be30: 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 73 20 61  ields contains a
be40: 20 76 61 6c 75 65 20 64 69 66 66 65 72 65 6e 74   value different
be50: 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 20 20 6f 72   from an.**   or
be60: 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65  iginal row value
be70: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
be80: 68 61 6e 67 65 73 65 74 2c 20 74 68 65 20 63 6f  hangeset, the co
be90: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
bea0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20  unction.**   is 
beb0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 5b 53 51  invoked with [SQ
bec0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
bed0: 41 54 41 5d 20 61 73 20 74 68 65 20 73 65 63 6f  ATA] as the seco
bee0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  nd argument. Sin
bef0: 63 65 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 63  ce.**   UPDATE c
bf00: 68 61 6e 67 65 73 20 6f 6e 6c 79 20 63 6f 6e 74  hanges only cont
bf10: 61 69 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 6e  ain values for n
bf20: 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 66  on-primary key f
bf30: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 0a 2a  ields that are.*
bf40: 2a 20 20 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  *   to be modifi
bf50: 65 64 2c 20 6f 6e 6c 79 20 74 68 6f 73 65 20 66  ed, only those f
bf60: 69 65 6c 64 73 20 6e 65 65 64 20 74 6f 20 6d 61  ields need to ma
bf70: 74 63 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  tch the original
bf80: 20 76 61 6c 75 65 73 20 74 6f 0a 2a 2a 20 20 20   values to.**   
bf90: 61 76 6f 69 64 20 74 68 65 20 53 51 4c 49 54 45  avoid the SQLITE
bfa0: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
bfb0: 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
bfc0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
bfd0: 20 20 20 49 66 20 6e 6f 20 72 6f 77 20 77 69 74     If no row wit
bfe0: 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d 61  h matching prima
bff0: 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69 73  ry key values is
c000: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
c010: 74 61 62 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65  tabase,.**   the
c020: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
c030: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  r function is in
c040: 76 6f 6b 65 64 20 77 69 74 68 20 5b 53 51 4c 49  voked with [SQLI
c050: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  TE_CHANGESET_NOT
c060: 46 4f 55 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73  FOUND].**   pass
c070: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
c080: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
c090: 20 20 20 49 66 20 74 68 65 20 55 50 44 41 54 45     If the UPDATE
c0a0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74   operation is at
c0b0: 74 65 6d 70 74 65 64 2c 20 62 75 74 20 53 51 4c  tempted, but SQL
c0c0: 69 74 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ite returns .** 
c0d0: 20 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41    SQLITE_CONSTRA
c0e0: 49 4e 54 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63  INT, the conflic
c0f0: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
c100: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
c110: 74 68 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45  th .**   [SQLITE
c120: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54  _CHANGESET_CONST
c130: 52 41 49 4e 54 5d 20 70 61 73 73 65 64 20 61 73  RAINT] passed as
c140: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
c150: 6d 65 6e 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20  ment..**   This 
c160: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 61 73  includes the cas
c170: 65 20 77 68 65 72 65 20 74 68 65 20 55 50 44 41  e where the UPDA
c180: 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  TE operation is 
c190: 61 74 74 65 6d 70 74 65 64 20 61 66 74 65 72 20  attempted after 
c1a0: 0a 2a 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72  .**   an earlier
c1b0: 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e   call to the con
c1c0: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75  flict handler fu
c1d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 0a  nction returned.
c1e0: 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48 41  **   [SQLITE_CHA
c1f0: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e  NGESET_REPLACE].
c200: 20 20 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2a 0a 2a    .** </dl>.**.*
c210: 2a 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20  * It is safe to 
c220: 65 78 65 63 75 74 65 20 53 51 4c 20 73 74 61 74  execute SQL stat
c230: 65 6d 65 6e 74 73 2c 20 69 6e 63 6c 75 64 69 6e  ements, includin
c240: 67 20 74 68 6f 73 65 20 74 68 61 74 20 77 72 69  g those that wri
c250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62  te to the.** tab
c260: 6c 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  le that the call
c270: 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74 6f 2c  back related to,
c280: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
c290: 20 78 43 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62   xConflict callb
c2a0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  ack..** This can
c2b0: 20 62 65 20 75 73 65 64 20 74 6f 20 66 75 72 74   be used to furt
c2c0: 68 65 72 20 63 75 73 74 6f 6d 69 7a 65 20 74 68  her customize th
c2d0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 63  e applications c
c2e0: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c  onflict.** resol
c2f0: 75 74 69 6f 6e 20 73 74 72 61 74 65 67 79 2e 0a  ution strategy..
c300: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 68 61 6e 67 65  **.** All change
c310: 73 20 6d 61 64 65 20 62 79 20 74 68 65 73 65 20  s made by these 
c320: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 65 6e  functions are en
c330: 63 6c 6f 73 65 64 20 69 6e 20 61 20 73 61 76 65  closed in a save
c340: 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
c350: 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68  n..** If any oth
c360: 65 72 20 65 72 72 6f 72 20 28 61 73 69 64 65 20  er error (aside 
c370: 66 72 6f 6d 20 61 20 63 6f 6e 73 74 72 61 69 6e  from a constrain
c380: 74 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 61  t failure when a
c390: 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a 2a 2a 20  ttempting to.** 
c3a0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72  write to the tar
c3b0: 67 65 74 20 64 61 74 61 62 61 73 65 29 20 6f 63  get database) oc
c3c0: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 73  curs, then the s
c3d0: 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
c3e0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 72 6f 6c 6c 65  tion is.** rolle
c3f0: 64 20 62 61 63 6b 2c 20 72 65 73 74 6f 72 69 6e  d back, restorin
c400: 67 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  g the target dat
c410: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
c420: 67 69 6e 61 6c 20 73 74 61 74 65 2c 20 61 6e 64  ginal state, and
c430: 20 61 6e 20 0a 2a 2a 20 53 51 4c 69 74 65 20 65   an .** SQLite e
c440: 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
c450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c460: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
c470: 72 73 20 28 70 70 52 65 62 61 73 65 29 20 61 6e  rs (ppRebase) an
c480: 64 20 28 70 6e 52 65 62 61 73 65 29 20 61 72 65  d (pnRebase) are
c490: 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 0a 2a 2a   non-NULL and.**
c4a0: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 61 20   the input is a 
c4b0: 63 68 61 6e 67 65 73 65 74 20 28 6e 6f 74 20 61  changeset (not a
c4c0: 20 70 61 74 63 68 73 65 74 29 2c 20 74 68 65 6e   patchset), then
c4d0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
c4e0: 74 5f 61 70 70 6c 79 5f 76 32 28 29 0a 2a 2a 20  t_apply_v2().** 
c4f0: 6d 61 79 20 73 65 74 20 28 2a 70 70 52 65 62 61  may set (*ppReba
c500: 73 65 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  se) to point to 
c510: 61 20 22 72 65 62 61 73 65 22 20 74 68 61 74 20  a "rebase" that 
c520: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
c530: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
c540: 5f 72 65 62 61 73 65 72 20 41 50 49 73 20 62 75  _rebaser APIs bu
c550: 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ffer before retu
c560: 72 6e 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63  rning. In this c
c570: 61 73 65 20 28 2a 70 6e 52 65 62 61 73 65 29 0a  ase (*pnRebase).
c580: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
c590: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
c5a0: 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20 49 74  fer in bytes. It
c5b0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
c5c0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
c5d0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
c5e0: 75 61 6c 6c 79 20 66 72 65 65 20 61 6e 79 20 73  ually free any s
c5f0: 75 63 68 20 62 75 66 66 65 72 20 75 73 69 6e 67  uch buffer using
c600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
c610: 20 54 68 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   The buffer.** i
c620: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 64  s only allocated
c630: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 69   and populated i
c640: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  f one or more co
c650: 6e 66 6c 69 63 74 73 20 77 65 72 65 20 65 6e 63  nflicts were enc
c660: 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 77 68 69 6c  ountered.** whil
c670: 65 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 70  e applying the p
c680: 61 74 63 68 73 65 74 2e 20 53 65 65 20 63 6f 6d  atchset. See com
c690: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
c6a0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65  g the sqlite3_re
c6b0: 62 61 73 65 72 0a 2a 2a 20 41 50 49 73 20 66 6f  baser.** APIs fo
c6c0: 72 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  r further detail
c6d0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
c6e0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
c6f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61      /* Apply cha
c720: 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62  nge to "main" db
c730: 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20   of this handle 
c740: 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65  */.  int nChange
c750: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
c760: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c770: 63 68 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74  changeset in byt
c780: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  es */.  void *pC
c790: 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20  hangeset,       
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
c7b0: 65 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  eset blob */.  i
c7c0: 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20  nt(*xFilter)(.  
c7d0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68  /* Copy of sixth
c800: 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29   arg to _apply()
c810: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
c820: 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20  ar *zTab        
c830: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e        /* Table n
c840: 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e  ame */.  ),.  in
c850: 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20  t(*xConflict)(. 
c860: 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20     void *pCtx,  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74   /* Copy of sixt
c890: 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28  h arg to _apply(
c8a0: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f  ) */.    int eCo
c8b0: 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20  nflict,         
c8c0: 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20         /* DATA, 
c8d0: 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43  MISSING, CONFLIC
c8e0: 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f  T, CONSTRAINT */
c8f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61  .    sqlite3_cha
c900: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20  ngeset_iter *p  
c910: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73     /* Handle des
c920: 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61  cribing change a
c930: 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  nd conflict */. 
c940: 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   ),.  void *pCtx
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
c970: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
c980: 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29  o xConflict */.)
c990: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  ;.int sqlite3cha
c9a0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28  ngeset_apply_v2(
c9b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e     /* Apply chan
c9e0: 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20  ge to "main" db 
c9f0: 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a  of this handle *
ca00: 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73  /.  int nChanges
ca10: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
ca20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 63      /* Size of c
ca30: 68 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74 65  hangeset in byte
ca40: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68  s */.  void *pCh
ca50: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
ca60: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
ca70: 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e  set blob */.  in
ca80: 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20  t(*xFilter)(.   
ca90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cab0: 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20  * Copy of sixth 
cac0: 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20  arg to _apply() 
cad0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
cae0: 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20  r *zTab         
caf0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
cb00: 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74  me */.  ),.  int
cb10: 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20  (*xConflict)(.  
cb20: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68  /* Copy of sixth
cb50: 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29   arg to _apply()
cb60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e   */.    int eCon
cb70: 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20 20  flict,          
cb80: 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d        /* DATA, M
cb90: 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54  ISSING, CONFLICT
cba0: 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a  , CONSTRAINT */.
cbb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e      sqlite3_chan
cbc0: 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20  geset_iter *p   
cbd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63    /* Handle desc
cbe0: 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e  ribing change an
cbf0: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
cc00: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  ),.  void *pCtx,
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
cc30: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
cc40: 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20   xConflict */.  
cc50: 76 6f 69 64 20 2a 2a 70 70 52 65 62 61 73 65 2c  void **ppRebase,
cc60: 20 69 6e 74 20 2a 70 6e 52 65 62 61 73 65 0a 29   int *pnRebase.)
cc70: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52  ;../* .** CAPI3R
cc80: 45 46 3a 20 43 6f 6e 73 74 61 6e 74 73 20 50 61  EF: Constants Pa
cc90: 73 73 65 64 20 54 6f 20 54 68 65 20 43 6f 6e 66  ssed To The Conf
cca0: 6c 69 63 74 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a  lict Handler.**.
ccb0: 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d  ** Values that m
ccc0: 61 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20  ay be passed as 
ccd0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
cce0: 65 6e 74 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63  ent to a conflic
ccf0: 74 2d 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  t-handler..**.**
cd00: 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c   <dl>.** <dt>SQL
cd10: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
cd20: 54 41 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 65 20  TA<dd>.**   The 
cd30: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
cd40: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
cd50: 20 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20   CHANGESET_DATA 
cd60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
cd70: 67 75 6d 65 6e 74 0a 2a 2a 20 20 20 77 68 65 6e  gument.**   when
cd80: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 44 45   processing a DE
cd90: 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 63  LETE or UPDATE c
cda0: 68 61 6e 67 65 20 69 66 20 61 20 72 6f 77 20 77  hange if a row w
cdb0: 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65 64  ith the required
cdc0: 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b 45  .**   PRIMARY KE
cdd0: 59 20 66 69 65 6c 64 73 20 69 73 20 70 72 65 73  Y fields is pres
cde0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
cdf0: 61 73 65 2c 20 62 75 74 20 6f 6e 65 20 6f 72 20  ase, but one or 
ce00: 6d 6f 72 65 20 6f 74 68 65 72 20 0a 2a 2a 20 20  more other .**  
ce10: 20 28 6e 6f 6e 20 70 72 69 6d 61 72 79 2d 6b 65   (non primary-ke
ce20: 79 29 20 66 69 65 6c 64 73 20 6d 6f 64 69 66 69  y) fields modifi
ce30: 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65  ed by the update
ce40: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
ce50: 74 68 65 20 0a 2a 2a 20 20 20 65 78 70 65 63 74  the .**   expect
ce60: 65 64 20 22 62 65 66 6f 72 65 22 20 76 61 6c 75  ed "before" valu
ce70: 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65  es..** .**   The
ce80: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
ce90: 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  , in this case, 
cea0: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
ceb0: 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 61 74  row with the mat
cec0: 63 68 69 6e 67 0a 2a 2a 20 20 20 70 72 69 6d 61  ching.**   prima
ced0: 72 79 20 6b 65 79 2e 0a 2a 2a 20 0a 2a 2a 20 3c  ry key..** .** <
cee0: 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  dt>SQLITE_CHANGE
cef0: 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 3c 64 64 3e  SET_NOTFOUND<dd>
cf00: 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69  .**   The confli
cf10: 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e  ct handler is in
cf20: 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47  voked with CHANG
cf30: 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 20 61 73  ESET_NOTFOUND as
cf40: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 20   the second.**  
cf50: 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 70   argument when p
cf60: 72 6f 63 65 73 73 69 6e 67 20 61 20 44 45 4c 45  rocessing a DELE
cf70: 54 45 20 6f 72 20 55 50 44 41 54 45 20 63 68 61  TE or UPDATE cha
cf80: 6e 67 65 20 69 66 20 61 20 72 6f 77 20 77 69 74  nge if a row wit
cf90: 68 20 74 68 65 0a 2a 2a 20 20 20 72 65 71 75 69  h the.**   requi
cfa0: 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  red PRIMARY KEY 
cfb0: 66 69 65 6c 64 73 20 69 73 20 6e 6f 74 20 70 72  fields is not pr
cfc0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
cfd0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  abase..** .**   
cfe0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  There is no conf
cff0: 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20 74  licting row in t
d000: 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 72 65  his case. The re
d010: 73 75 6c 74 73 20 6f 66 20 69 6e 76 6f 6b 69 6e  sults of invokin
d020: 67 20 74 68 65 0a 2a 2a 20 20 20 73 71 6c 69 74  g the.**   sqlit
d030: 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66  e3changeset_conf
d040: 6c 69 63 74 28 29 20 41 50 49 20 61 72 65 20 75  lict() API are u
d050: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 0a 2a 2a  ndefined..** .**
d060: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
d070: 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 3c 64  GESET_CONFLICT<d
d080: 64 3e 0a 2a 2a 20 20 20 43 48 41 4e 47 45 53 45  d>.**   CHANGESE
d090: 54 5f 43 4f 4e 46 4c 49 43 54 20 69 73 20 70 61  T_CONFLICT is pa
d0a0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d0b0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
d0c0: 68 65 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20  he conflict.**  
d0d0: 20 68 61 6e 64 6c 65 72 20 77 68 69 6c 65 20 70   handler while p
d0e0: 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 49 4e 53  rocessing an INS
d0f0: 45 52 54 20 63 68 61 6e 67 65 20 69 66 20 74 68  ERT change if th
d100: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 6f 75 6c  e operation woul
d110: 64 20 72 65 73 75 6c 74 20 0a 2a 2a 20 20 20 69  d result .**   i
d120: 6e 20 64 75 70 6c 69 63 61 74 65 20 70 72 69 6d  n duplicate prim
d130: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 2e 0a  ary key values..
d140: 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e  ** .**   The con
d150: 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20  flicting row in 
d160: 74 68 69 73 20 63 61 73 65 20 69 73 20 74 68 65  this case is the
d170: 20 64 61 74 61 62 61 73 65 20 72 6f 77 20 77 69   database row wi
d180: 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a  th the matching.
d190: 2a 2a 20 20 20 70 72 69 6d 61 72 79 20 6b 65 79  **   primary key
d1a0: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  ..**.** <dt>SQLI
d1b0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46 4f 52  TE_CHANGESET_FOR
d1c0: 45 49 47 4e 5f 4b 45 59 3c 64 64 3e 0a 2a 2a 20  EIGN_KEY<dd>.** 
d1d0: 20 20 49 66 20 66 6f 72 65 69 67 6e 20 6b 65 79    If foreign key
d1e0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 65 6e 61   handling is ena
d1f0: 62 6c 65 64 2c 20 61 6e 64 20 61 70 70 6c 79 69  bled, and applyi
d200: 6e 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 6c  ng a changeset l
d210: 65 61 76 65 73 20 74 68 65 0a 2a 2a 20 20 20 64  eaves the.**   d
d220: 61 74 61 62 61 73 65 20 69 6e 20 61 20 73 74 61  atabase in a sta
d230: 74 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 6f  te containing fo
d240: 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
d250: 69 6f 6e 73 2c 20 74 68 65 20 63 6f 6e 66 6c 69  ions, the confli
d260: 63 74 20 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72  ct .**   handler
d270: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
d280: 20 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49   CHANGESET_FOREI
d290: 47 4e 5f 4b 45 59 20 61 73 20 74 68 65 20 73 65  GN_KEY as the se
d2a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
d2b0: 20 20 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20     exactly once 
d2c0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 61 6e 67  before the chang
d2d0: 65 73 65 74 20 69 73 20 63 6f 6d 6d 69 74 74 65  eset is committe
d2e0: 64 2e 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69  d. If the confli
d2f0: 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  ct handler.**   
d300: 72 65 74 75 72 6e 73 20 43 48 41 4e 47 45 53 45  returns CHANGESE
d310: 54 5f 4f 4d 49 54 2c 20 74 68 65 20 63 68 61 6e  T_OMIT, the chan
d320: 67 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ges, including t
d330: 68 6f 73 65 20 74 68 61 74 20 63 61 75 73 65 64  hose that caused
d340: 20 74 68 65 0a 2a 2a 20 20 20 66 6f 72 65 69 67   the.**   foreig
d350: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
d360: 20 76 69 6f 6c 61 74 69 6f 6e 2c 20 61 72 65 20   violation, are 
d370: 63 6f 6d 6d 69 74 74 65 64 2e 20 4f 72 2c 20 69  committed. Or, i
d380: 66 20 69 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  f it returns.** 
d390: 20 20 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52    CHANGESET_ABOR
d3a0: 54 2c 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  T, the changeset
d3b0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
d3c0: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 20 63 75 72 72  .**.**   No curr
d3d0: 65 6e 74 20 6f 72 20 63 6f 6e 66 6c 69 63 74 69  ent or conflicti
d3e0: 6e 67 20 72 6f 77 20 69 6e 66 6f 72 6d 61 74 69  ng row informati
d3f0: 6f 6e 20 69 73 20 70 72 6f 76 69 64 65 64 2e 20  on is provided. 
d400: 54 68 65 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  The only functio
d410: 6e 0a 2a 2a 20 20 20 69 74 20 69 73 20 70 6f 73  n.**   it is pos
d420: 73 69 62 6c 65 20 74 6f 20 63 61 6c 6c 20 6f 6e  sible to call on
d430: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 71   the supplied sq
d440: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
d450: 69 74 65 72 20 68 61 6e 64 6c 65 0a 2a 2a 20 20  iter handle.**  
d460: 20 69 73 20 73 71 6c 69 74 65 33 63 68 61 6e 67   is sqlite3chang
d470: 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74  eset_fk_conflict
d480: 73 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e  s()..** .** <dt>
d490: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
d4a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3c 64 64 3e 0a  _CONSTRAINT<dd>.
d4b0: 2a 2a 20 20 20 49 66 20 61 6e 79 20 6f 74 68 65  **   If any othe
d4c0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  r constraint vio
d4d0: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 20 77 68  lation occurs wh
d4e0: 69 6c 65 20 61 70 70 6c 79 69 6e 67 20 61 20 63  ile applying a c
d4f0: 68 61 6e 67 65 20 28 69 2e 65 2e 20 0a 2a 2a 20  hange (i.e. .** 
d500: 20 20 61 20 55 4e 49 51 55 45 2c 20 43 48 45 43    a UNIQUE, CHEC
d510: 4b 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  K or NOT NULL co
d520: 6e 73 74 72 61 69 6e 74 29 2c 20 74 68 65 20 63  nstraint), the c
d530: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
d540: 69 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64  is .**   invoked
d550: 20 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f   with CHANGESET_
d560: 43 4f 4e 53 54 52 41 49 4e 54 20 61 73 20 74 68  CONSTRAINT as th
d570: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d580: 74 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 72  t..** .**   Ther
d590: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 6c 69 63 74  e is no conflict
d5a0: 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 69 73 20  ing row in this 
d5b0: 63 61 73 65 2e 20 54 68 65 20 72 65 73 75 6c 74  case. The result
d5c0: 73 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68  s of invoking th
d5d0: 65 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 63 68  e.**   sqlite3ch
d5e0: 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74  angeset_conflict
d5f0: 28 29 20 41 50 49 20 61 72 65 20 75 6e 64 65 66  () API are undef
d600: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 3c 2f 64 6c  ined..**.** </dl
d610: 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  >.*/.#define SQL
d620: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
d630: 54 41 20 20 20 20 20 20 20 20 31 0a 23 64 65 66  TA        1.#def
d640: 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  ine SQLITE_CHANG
d650: 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  ESET_NOTFOUND   
d660: 20 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   2.#define SQLIT
d670: 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
d680: 4c 49 43 54 20 20 20 20 33 0a 23 64 65 66 69 6e  LICT    3.#defin
d690: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
d6a0: 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 34  ET_CONSTRAINT  4
d6b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
d6c0: 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47  CHANGESET_FOREIG
d6d0: 4e 5f 4b 45 59 20 35 0a 0a 2f 2a 20 0a 2a 2a 20  N_KEY 5../* .** 
d6e0: 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 73 74 61  CAPI3REF: Consta
d6f0: 6e 74 73 20 52 65 74 75 72 6e 65 64 20 42 79 20  nts Returned By 
d700: 54 68 65 20 43 6f 6e 66 6c 69 63 74 20 48 61 6e  The Conflict Han
d710: 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e  dler.**.** A con
d720: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61  flict handler ca
d730: 6c 6c 62 61 63 6b 20 6d 75 73 74 20 72 65 74 75  llback must retu
d740: 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  rn one of the fo
d750: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 76 61  llowing three va
d760: 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e  lues..**.** <dl>
d770: 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43  .** <dt>SQLITE_C
d780: 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 3c 64 64  HANGESET_OMIT<dd
d790: 3e 0a 2a 2a 20 20 20 49 66 20 61 20 63 6f 6e 66  >.**   If a conf
d7a0: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 72 65 74  lict handler ret
d7b0: 75 72 6e 73 20 74 68 69 73 20 76 61 6c 75 65 20  urns this value 
d7c0: 6e 6f 20 73 70 65 63 69 61 6c 20 61 63 74 69 6f  no special actio
d7d0: 6e 20 69 73 20 74 61 6b 65 6e 2e 20 54 68 65 0a  n is taken. The.
d7e0: 2a 2a 20 20 20 63 68 61 6e 67 65 20 74 68 61 74  **   change that
d7f0: 20 63 61 75 73 65 64 20 74 68 65 20 63 6f 6e 66   caused the conf
d800: 6c 69 63 74 20 69 73 20 6e 6f 74 20 61 70 70 6c  lict is not appl
d810: 69 65 64 2e 20 54 68 65 20 73 65 73 73 69 6f 6e  ied. The session
d820: 20 6d 6f 64 75 6c 65 20 0a 2a 2a 20 20 20 63 6f   module .**   co
d830: 6e 74 69 6e 75 65 73 20 74 6f 20 74 68 65 20 6e  ntinues to the n
d840: 65 78 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68  ext change in th
d850: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  e changeset..**.
d860: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
d870: 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 3c  ANGESET_REPLACE<
d880: 64 64 3e 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  dd>.**   This va
d890: 6c 75 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lue may only be 
d8a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d8b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d8c0: 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 0a  to the conflict.
d8d0: 2a 2a 20 20 20 68 61 6e 64 6c 65 72 20 77 61 73  **   handler was
d8e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
d8f0: 54 5f 44 41 54 41 20 6f 72 20 53 51 4c 49 54 45  T_DATA or SQLITE
d900: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c  _CHANGESET_CONFL
d910: 49 43 54 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ICT. If this.** 
d920: 20 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73    is not the cas
d930: 65 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  e, any changes a
d940: 70 70 6c 69 65 64 20 73 6f 20 66 61 72 20 61 72  pplied so far ar
d950: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
d960: 64 20 74 68 65 20 0a 2a 2a 20 20 20 63 61 6c 6c  d the .**   call
d970: 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67   to sqlite3chang
d980: 65 73 65 74 5f 61 70 70 6c 79 28 29 20 72 65 74  eset_apply() ret
d990: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55  urns SQLITE_MISU
d9a0: 53 45 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 43  SE..**.**   If C
d9b0: 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
d9c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
d9d0: 61 6e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  an SQLITE_CHANGE
d9e0: 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63  SET_DATA conflic
d9f0: 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72 2c 20  t.**   handler, 
da00: 74 68 65 6e 20 74 68 65 20 63 6f 6e 66 6c 69 63  then the conflic
da10: 74 69 6e 67 20 72 6f 77 20 69 73 20 65 69 74 68  ting row is eith
da20: 65 72 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  er updated or de
da30: 6c 65 74 65 64 2c 20 64 65 70 65 6e 64 69 6e 67  leted, depending
da40: 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20 74 79 70  .**   on the typ
da50: 65 20 6f 66 20 63 68 61 6e 67 65 2e 0a 2a 2a 0a  e of change..**.
da60: 2a 2a 20 20 20 49 66 20 43 48 41 4e 47 45 53 45  **   If CHANGESE
da70: 54 5f 52 45 50 4c 41 43 45 20 69 73 20 72 65 74  T_REPLACE is ret
da80: 75 72 6e 65 64 20 62 79 20 61 6e 20 53 51 4c 49  urned by an SQLI
da90: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
daa0: 46 4c 49 43 54 20 63 6f 6e 66 6c 69 63 74 0a 2a  FLICT conflict.*
dab0: 2a 20 20 20 68 61 6e 64 6c 65 72 2c 20 74 68 65  *   handler, the
dac0: 6e 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  n the conflictin
dad0: 67 20 72 6f 77 20 69 73 20 72 65 6d 6f 76 65 64  g row is removed
dae0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
daf0: 73 65 20 61 6e 64 20 61 0a 2a 2a 20 20 20 73 65  se and a.**   se
db00: 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20  cond attempt to 
db10: 61 70 70 6c 79 20 74 68 65 20 63 68 61 6e 67 65  apply the change
db20: 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 69   is made. If thi
db30: 73 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70 74  s second attempt
db40: 20 66 61 69 6c 73 2c 0a 2a 2a 20 20 20 74 68 65   fails,.**   the
db50: 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20 69 73   original row is
db60: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68 65   restored to the
db70: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
db80: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2a 0a   continuing..**.
db90: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
dba0: 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 3c 64 64  ANGESET_ABORT<dd
dbb0: 3e 0a 2a 2a 20 20 20 49 66 20 74 68 69 73 20 76  >.**   If this v
dbc0: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
dbd0: 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 70  , any changes ap
dbe0: 70 6c 69 65 64 20 73 6f 20 66 61 72 20 61 72 65  plied so far are
dbf0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 0a 2a 2a   rolled back .**
dc00: 20 20 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20     and the call 
dc10: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
dc20: 73 65 74 5f 61 70 70 6c 79 28 29 20 72 65 74 75  set_apply() retu
dc30: 72 6e 73 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  rns SQLITE_ABORT
dc40: 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64  ..** </dl>.*/.#d
dc50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
dc60: 4e 47 45 53 45 54 5f 4f 4d 49 54 20 20 20 20 20  NGESET_OMIT     
dc70: 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    0.#define SQLI
dc80: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50  TE_CHANGESET_REP
dc90: 4c 41 43 45 20 20 20 20 31 0a 23 64 65 66 69 6e  LACE    1.#defin
dca0: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
dcb0: 45 54 5f 41 42 4f 52 54 20 20 20 20 20 20 32 0a  ET_ABORT      2.
dcc0: 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52 45 46  ./* .** CAPI3REF
dcd0: 3a 20 52 65 62 61 73 69 6e 67 20 63 68 61 6e 67  : Rebasing chang
dce0: 65 73 65 74 73 0a 2a 2a 20 45 58 50 45 52 49 4d  esets.** EXPERIM
dcf0: 45 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 53 75 70 70  ENTAL.**.** Supp
dd00: 6f 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ose there is a s
dd10: 69 74 65 20 68 6f 73 74 69 6e 67 20 61 20 64 61  ite hosting a da
dd20: 74 61 62 61 73 65 20 69 6e 20 73 74 61 74 65 20  tabase in state 
dd30: 53 30 2e 20 41 6e 64 20 74 68 61 74 0a 2a 2a 20  S0. And that.** 
dd40: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72  modifications ar
dd50: 65 20 6d 61 64 65 20 74 68 61 74 20 6d 6f 76 65  e made that move
dd60: 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 74   that database t
dd70: 6f 20 73 74 61 74 65 20 53 31 20 61 6e 64 20 61  o state S1 and a
dd80: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 72 65  .** changeset re
dd90: 63 6f 72 64 65 64 20 28 74 68 65 20 22 6c 6f 63  corded (the "loc
dda0: 61 6c 22 20 63 68 61 6e 67 65 73 65 74 29 2e 20  al" changeset). 
ddb0: 54 68 65 6e 2c 20 61 20 63 68 61 6e 67 65 73 65  Then, a changese
ddc0: 74 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 53 30  t based.** on S0
ddd0: 20 69 73 20 72 65 63 65 69 76 65 64 20 66 72 6f   is received fro
dde0: 6d 20 61 6e 6f 74 68 65 72 20 73 69 74 65 20 28  m another site (
ddf0: 74 68 65 20 22 72 65 6d 6f 74 65 22 20 63 68 61  the "remote" cha
de00: 6e 67 65 73 65 74 29 20 61 6e 64 20 0a 2a 2a 20  ngeset) and .** 
de10: 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 64  applied to the d
de20: 61 74 61 62 61 73 65 2e 20 54 68 65 20 64 61 74  atabase. The dat
de30: 61 62 61 73 65 20 69 73 20 74 68 65 6e 20 69 6e  abase is then in
de40: 20 73 74 61 74 65 20 0a 2a 2a 20 28 53 31 2b 22   state .** (S1+"
de50: 72 65 6d 6f 74 65 22 29 2c 20 77 68 65 72 65 20  remote"), where 
de60: 74 68 65 20 65 78 61 63 74 20 73 74 61 74 65 20  the exact state 
de70: 64 65 70 65 6e 64 73 20 6f 6e 20 61 6e 79 20 63  depends on any c
de80: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c  onflict.** resol
de90: 75 74 69 6f 6e 20 64 65 63 69 73 69 6f 6e 73 20  ution decisions 
dea0: 28 4f 4d 49 54 20 6f 72 20 52 45 50 4c 41 43 45  (OMIT or REPLACE
deb0: 29 20 6d 61 64 65 20 77 68 69 6c 65 20 61 70 70  ) made while app
dec0: 6c 79 69 6e 67 20 22 72 65 6d 6f 74 65 22 2e 0a  lying "remote"..
ded0: 2a 2a 20 52 65 62 61 73 69 6e 67 20 61 20 63 68  ** Rebasing a ch
dee0: 61 6e 67 65 73 65 74 20 69 73 20 74 6f 20 75 70  angeset is to up
def0: 64 61 74 65 20 69 74 20 74 6f 20 74 61 6b 65 20  date it to take 
df00: 74 68 6f 73 65 20 63 6f 6e 66 6c 69 63 74 20 0a  those conflict .
df10: 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 64 65  ** resolution de
df20: 63 69 73 69 6f 6e 73 20 69 6e 74 6f 20 61 63 63  cisions into acc
df30: 6f 75 6e 74 2c 20 73 6f 20 74 68 61 74 20 74 68  ount, so that th
df40: 65 20 73 61 6d 65 20 63 6f 6e 66 6c 69 63 74 73  e same conflicts
df50: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  .** do not have 
df60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 20 65  to be resolved e
df70: 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
df80: 6e 65 74 77 6f 72 6b 2e 20 0a 2a 2a 0a 2a 2a 20  network. .**.** 
df90: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
dfa0: 62 6f 74 68 20 74 68 65 20 6c 6f 63 61 6c 20 61  both the local a
dfb0: 6e 64 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65  nd remote change
dfc0: 73 65 74 73 20 63 6f 6e 74 61 69 6e 20 61 6e 0a  sets contain an.
dfd0: 2a 2a 20 49 4e 53 45 52 54 20 6f 66 20 74 68 65  ** INSERT of the
dfe0: 20 73 61 6d 65 20 6b 65 79 20 6f 6e 20 22 43 52   same key on "CR
dff0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
e000: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 22  PRIMARY KEY, b)"
e010: 3a 0a 2a 2a 0a 2a 2a 20 20 20 6c 6f 63 61 6c 3a  :.**.**   local:
e020: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e030: 20 56 41 4c 55 45 53 28 31 2c 20 27 76 31 27 29   VALUES(1, 'v1')
e040: 3b 0a 2a 2a 20 20 20 72 65 6d 6f 74 65 3a 20 49  ;.**   remote: I
e050: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e060: 4c 55 45 53 28 31 2c 20 27 76 32 27 29 3b 0a 2a  LUES(1, 'v2');.*
e070: 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6e  *.** and the con
e080: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
e090: 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 65   is REPLACE, the
e0a0: 6e 20 74 68 65 20 49 4e 53 45 52 54 20 63 68 61  n the INSERT cha
e0b0: 6e 67 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  nge is.** remove
e0c0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c  d from the local
e0d0: 20 63 68 61 6e 67 65 73 65 74 20 28 69 74 20 77   changeset (it w
e0e0: 61 73 20 6f 76 65 72 72 69 64 64 65 6e 29 2e 20  as overridden). 
e0f0: 4f 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  Or, if the.** co
e100: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
e110: 6e 20 77 61 73 20 22 4f 4d 49 54 22 2c 20 74 68  n was "OMIT", th
e120: 65 6e 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61  en the local cha
e130: 6e 67 65 73 65 74 20 69 73 20 6d 6f 64 69 66 69  ngeset is modifi
e140: 65 64 0a 2a 2a 20 74 6f 20 69 6e 73 74 65 61 64  ed.** to instead
e150: 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20   contain:.**.** 
e160: 20 20 20 20 20 20 20 20 20 20 55 50 44 41 54 45            UPDATE
e170: 20 74 31 20 53 45 54 20 62 20 3d 20 27 76 32 27   t1 SET b = 'v2'
e180: 20 57 48 45 52 45 20 61 3d 31 3b 0a 2a 2a 0a 2a   WHERE a=1;.**.*
e190: 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69 6e  * Changes within
e1a0: 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67   the local chang
e1b0: 65 73 65 74 20 61 72 65 20 72 65 62 61 73 65 64  eset are rebased
e1c0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e1d0: 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 4c  ** <dl>.** <dt>L
e1e0: 6f 63 61 6c 20 49 4e 53 45 52 54 3c 64 64 3e 0a  ocal INSERT<dd>.
e1f0: 2a 2a 20 20 20 54 68 69 73 20 6d 61 79 20 6f 6e  **   This may on
e200: 6c 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ly conflict with
e210: 20 61 20 72 65 6d 6f 74 65 20 49 4e 53 45 52 54   a remote INSERT
e220: 2e 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  . If the conflic
e230: 74 20 0a 2a 2a 20 20 20 72 65 73 6f 6c 75 74 69  t .**   resoluti
e240: 6f 6e 20 77 61 73 20 4f 4d 49 54 2c 20 74 68 65  on was OMIT, the
e250: 6e 20 61 64 64 20 61 6e 20 55 50 44 41 54 45 20  n add an UPDATE 
e260: 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 72 65  change to the re
e270: 62 61 73 65 64 0a 2a 2a 20 20 20 63 68 61 6e 67  based.**   chang
e280: 65 73 65 74 2e 20 4f 72 2c 20 69 66 20 74 68 65  eset. Or, if the
e290: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
e2a0: 74 69 6f 6e 20 77 61 73 20 52 45 50 4c 41 43 45  tion was REPLACE
e2b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 6e 6f 74 68 69  , add.**   nothi
e2c0: 6e 67 20 74 6f 20 74 68 65 20 72 65 62 61 73 65  ng to the rebase
e2d0: 64 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a  d changeset..**.
e2e0: 2a 2a 20 3c 64 74 3e 4c 6f 63 61 6c 20 44 45 4c  ** <dt>Local DEL
e2f0: 45 54 45 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 69  ETE<dd>.**   Thi
e300: 73 20 6d 61 79 20 63 6f 6e 66 6c 69 63 74 20 77  s may conflict w
e310: 69 74 68 20 61 20 72 65 6d 6f 74 65 20 55 50 44  ith a remote UPD
e320: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 2e 20 49  ATE or DELETE. I
e330: 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
e340: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 70 6f 73 73 69  .**   only possi
e350: 62 6c 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ble resolution i
e360: 73 20 4f 4d 49 54 2e 20 49 66 20 74 68 65 20 72  s OMIT. If the r
e370: 65 6d 6f 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  emote operation 
e380: 77 61 73 20 61 0a 2a 2a 20 20 20 44 45 4c 45 54  was a.**   DELET
e390: 45 2c 20 74 68 65 6e 20 61 64 64 20 6e 6f 20 63  E, then add no c
e3a0: 68 61 6e 67 65 20 74 6f 20 74 68 65 20 72 65 62  hange to the reb
e3b0: 61 73 65 64 20 63 68 61 6e 67 65 73 65 74 2e 20  ased changeset. 
e3c0: 49 66 20 74 68 65 20 72 65 6d 6f 74 65 0a 2a 2a  If the remote.**
e3d0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73     operation was
e3e0: 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68 65 6e   an UPDATE, then
e3f0: 20 74 68 65 20 6f 6c 64 2e 2a 20 66 69 65 6c 64   the old.* field
e400: 73 20 6f 66 20 63 68 61 6e 67 65 20 61 72 65 20  s of change are 
e410: 75 70 64 61 74 65 64 0a 2a 2a 20 20 20 74 6f 20  updated.**   to 
e420: 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 2e  reflect the new.
e430: 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
e440: 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 3c 64  UPDATE..**.** <d
e450: 74 3e 4c 6f 63 61 6c 20 55 50 44 41 54 45 3c 64  t>Local UPDATE<d
e460: 64 3e 0a 2a 2a 20 20 20 54 68 69 73 20 6d 61 79  d>.**   This may
e470: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61   conflict with a
e480: 20 72 65 6d 6f 74 65 20 55 50 44 41 54 45 20 6f   remote UPDATE o
e490: 72 20 44 45 4c 45 54 45 2e 20 49 66 20 69 74 20  r DELETE. If it 
e4a0: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 77  conflicts.**   w
e4b0: 69 74 68 20 61 20 44 45 4c 45 54 45 2c 20 61 6e  ith a DELETE, an
e4c0: 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  d the conflict r
e4d0: 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20 4f 4d  esolution was OM
e4e0: 49 54 2c 20 74 68 65 6e 20 74 68 65 20 75 70 64  IT, then the upd
e4f0: 61 74 65 0a 2a 2a 20 20 20 69 73 20 63 68 61 6e  ate.**   is chan
e500: 67 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 53 45  ged into an INSE
e510: 52 54 2e 20 41 6e 79 20 75 6e 64 65 66 69 6e 65  RT. Any undefine
e520: 64 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  d values in the 
e530: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 0a 2a 2a 20  new.* record.** 
e540: 20 20 66 72 6f 6d 20 74 68 65 20 75 70 64 61 74    from the updat
e550: 65 20 63 68 61 6e 67 65 20 61 72 65 20 66 69 6c  e change are fil
e560: 6c 65 64 20 69 6e 20 75 73 69 6e 67 20 74 68 65  led in using the
e570: 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
e580: 6f 6d 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66  om.**   the conf
e590: 6c 69 63 74 69 6e 67 20 44 45 4c 45 54 45 2e 20  licting DELETE. 
e5a0: 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
e5b0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77  ict resolution w
e5c0: 61 73 20 52 45 50 4c 41 43 45 2c 0a 2a 2a 20 20  as REPLACE,.**  
e5d0: 20 74 68 65 20 55 50 44 41 54 45 20 63 68 61 6e   the UPDATE chan
e5e0: 67 65 20 69 73 20 73 69 6d 70 6c 79 20 6f 6d 69  ge is simply omi
e5f0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  tted from the re
e600: 62 61 73 65 64 20 63 68 61 6e 67 65 73 65 74 2e  based changeset.
e610: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 63 6f 6e 66  .**.**   If conf
e620: 6c 69 63 74 20 69 73 20 77 69 74 68 20 61 20 72  lict is with a r
e630: 65 6d 6f 74 65 20 55 50 44 41 54 45 20 61 6e 64  emote UPDATE and
e640: 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20   the resolution 
e650: 69 73 20 4f 4d 49 54 2c 20 74 68 65 6e 0a 2a 2a  is OMIT, then.**
e660: 20 20 20 74 68 65 20 6f 6c 64 2e 2a 20 76 61 6c     the old.* val
e670: 75 65 73 20 61 72 65 20 72 65 62 61 73 65 64 20  ues are rebased 
e680: 75 73 69 6e 67 20 74 68 65 20 6e 65 77 2e 2a 20  using the new.* 
e690: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72 65  values in the re
e6a0: 6d 6f 74 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65  mote.**   change
e6b0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 72 65 73  . Or, if the res
e6c0: 6f 6c 75 74 69 6f 6e 20 69 73 20 52 45 50 4c 41  olution is REPLA
e6d0: 43 45 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  CE, then the cha
e6e0: 6e 67 65 20 69 73 20 63 6f 70 69 65 64 0a 2a 2a  nge is copied.**
e6f0: 20 20 20 69 6e 74 6f 20 74 68 65 20 72 65 62 61     into the reba
e700: 73 65 64 20 63 68 61 6e 67 65 73 65 74 20 77 69  sed changeset wi
e710: 74 68 20 75 70 64 61 74 65 73 20 74 6f 20 63 6f  th updates to co
e720: 6c 75 6d 6e 73 20 61 6c 73 6f 20 75 70 64 61 74  lumns also updat
e730: 65 64 20 62 79 0a 2a 2a 20 20 20 74 68 65 20 63  ed by.**   the c
e740: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 6d 6f 74  onflicting remot
e750: 65 20 55 50 44 41 54 45 20 72 65 6d 6f 76 65 64  e UPDATE removed
e760: 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
e770: 6e 6f 20 63 6f 6c 75 6d 6e 73 20 77 6f 75 6c 64  no columns would
e780: 20 0a 2a 2a 20 20 20 62 65 20 75 70 64 61 74 65   .**   be update
e790: 64 2c 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  d, the change is
e7a0: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 3c 2f 64   omitted..** </d
e7b0: 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 6c 6f 63 61 6c  l>.**.** A local
e7c0: 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 72   change may be r
e7d0: 65 62 61 73 65 64 20 61 67 61 69 6e 73 74 20 6d  ebased against m
e7e0: 75 6c 74 69 70 6c 65 20 72 65 6d 6f 74 65 20 63  ultiple remote c
e7f0: 68 61 6e 67 65 73 20 0a 2a 2a 20 73 69 6d 75 6c  hanges .** simul
e800: 74 61 6e 65 6f 75 73 6c 79 2e 20 49 66 20 61 20  taneously. If a 
e810: 73 69 6e 67 6c 65 20 6b 65 79 20 69 73 20 6d 6f  single key is mo
e820: 64 69 66 69 65 64 20 62 79 20 6d 75 6c 74 69 70  dified by multip
e830: 6c 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 63 68  le remote .** ch
e840: 61 6e 67 65 73 65 74 73 2c 20 74 68 65 79 20 61  angesets, they a
e850: 72 65 20 63 6f 6d 62 69 6e 65 64 20 61 73 20 66  re combined as f
e860: 6f 6c 6c 6f 77 73 20 62 65 66 6f 72 65 20 74 68  ollows before th
e870: 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65  e local changese
e880: 74 0a 2a 2a 20 69 73 20 72 65 62 61 73 65 64 3a  t.** is rebased:
e890: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
e8a0: 20 20 3c 6c 69 3e 20 49 66 20 74 68 65 72 65 20    <li> If there 
e8b0: 68 61 73 20 62 65 65 6e 20 6f 6e 65 20 6f 72 20  has been one or 
e8c0: 6d 6f 72 65 20 52 45 50 4c 41 43 45 20 72 65 73  more REPLACE res
e8d0: 6f 6c 75 74 69 6f 6e 73 20 6f 6e 20 61 0a 2a 2a  olutions on a.**
e8e0: 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 69 74           key, it
e8f0: 20 69 73 20 72 65 62 61 73 65 64 20 61 63 63 6f   is rebased acco
e900: 72 64 69 6e 67 20 74 6f 20 61 20 52 45 50 4c 41  rding to a REPLA
e910: 43 45 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 6c 69  CE..**.**    <li
e920: 3e 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  > If there have 
e930: 62 65 65 6e 20 6e 6f 20 52 45 50 4c 41 43 45 20  been no REPLACE 
e940: 72 65 73 6f 6c 75 74 69 6f 6e 73 20 6f 6e 20 61  resolutions on a
e950: 20 6b 65 79 2c 20 74 68 65 6e 0a 2a 2a 20 20 20   key, then.**   
e960: 20 20 20 20 20 20 74 68 65 20 6c 6f 63 61 6c 20        the local 
e970: 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 65 62  changeset is reb
e980: 61 73 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ased according t
e990: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
e9a0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  t.**         of 
e9b0: 74 68 65 20 4f 4d 49 54 20 72 65 73 6f 6c 75 74  the OMIT resolut
e9c0: 69 6f 6e 73 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  ions..** </ul>.*
e9d0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63  *.** Note that c
e9e0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
e9f0: 6f 6e 73 20 66 72 6f 6d 20 6d 75 6c 74 69 70 6c  ons from multipl
ea00: 65 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73  e remote changes
ea10: 65 74 73 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 62  ets are .** comb
ea20: 69 6e 65 64 20 6f 6e 20 61 20 70 65 72 2d 66 69  ined on a per-fi
ea30: 65 6c 64 20 62 61 73 69 73 2c 20 6e 6f 74 20 70  eld basis, not p
ea40: 65 72 2d 72 6f 77 2e 20 54 68 69 73 20 6d 65 61  er-row. This mea
ea50: 6e 73 20 74 68 61 74 20 69 6e 20 74 68 65 20 0a  ns that in the .
ea60: 2a 2a 20 63 61 73 65 20 6f 66 20 6d 75 6c 74 69  ** case of multi
ea70: 70 6c 65 20 72 65 6d 6f 74 65 20 55 50 44 41 54  ple remote UPDAT
ea80: 45 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 73 6f  E operations, so
ea90: 6d 65 20 66 69 65 6c 64 73 20 6f 66 20 61 20 73  me fields of a s
eaa0: 69 6e 67 6c 65 20 0a 2a 2a 20 6c 6f 63 61 6c 20  ingle .** local 
eab0: 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 72 65  change may be re
eac0: 62 61 73 65 64 20 66 6f 72 20 52 45 50 4c 41 43  based for REPLAC
ead0: 45 20 77 68 69 6c 65 20 6f 74 68 65 72 73 20 61  E while others a
eae0: 72 65 20 72 65 62 61 73 65 64 20 66 6f 72 20 0a  re rebased for .
eaf0: 2a 2a 20 4f 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 49  ** OMIT..**.** I
eb00: 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 62 61 73  n order to rebas
eb10: 65 20 61 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  e a local change
eb20: 73 65 74 2c 20 74 68 65 20 72 65 6d 6f 74 65 20  set, the remote 
eb30: 63 68 61 6e 67 65 73 65 74 20 6d 75 73 74 20 66  changeset must f
eb40: 69 72 73 74 0a 2a 2a 20 62 65 20 61 70 70 6c 69  irst.** be appli
eb50: 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20  ed to the local 
eb60: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 73  database using s
eb70: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
eb80: 61 70 70 6c 79 5f 76 32 28 29 20 61 6e 64 0a 2a  apply_v2() and.*
eb90: 2a 20 74 68 65 20 62 75 66 66 65 72 20 6f 66 20  * the buffer of 
eba0: 72 65 62 61 73 65 20 69 6e 66 6f 72 6d 61 74 69  rebase informati
ebb0: 6f 6e 20 63 61 70 74 75 72 65 64 2e 20 54 68 65  on captured. The
ebc0: 6e 3a 0a 2a 2a 0a 2a 2a 20 3c 6f 6c 3e 0a 2a 2a  n:.**.** <ol>.**
ebd0: 20 20 20 3c 6c 69 3e 20 41 6e 20 73 71 6c 69 74     <li> An sqlit
ebe0: 65 33 5f 72 65 62 61 73 65 72 20 6f 62 6a 65 63  e3_rebaser objec
ebf0: 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20  t is created by 
ec00: 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 20 20 20 20  calling .**     
ec10: 20 20 20 73 71 6c 69 74 65 33 72 65 62 61 73 65     sqlite3rebase
ec20: 72 5f 63 72 65 61 74 65 28 29 2e 0a 2a 2a 20 20  r_create()..**  
ec30: 20 3c 6c 69 3e 20 54 68 65 20 6e 65 77 20 6f 62   <li> The new ob
ec40: 6a 65 63 74 20 69 73 20 63 6f 6e 66 69 67 75 72  ject is configur
ec50: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 62 61  ed with the reba
ec60: 73 65 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e  se buffer obtain
ec70: 65 64 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20  ed from.**      
ec80: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
ec90: 65 74 5f 61 70 70 6c 79 5f 76 32 28 29 20 62 79  et_apply_v2() by
eca0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
ecb0: 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67 75 72  rebaser_configur
ecc0: 65 28 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 49  e()..**        I
ecd0: 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e  f the local chan
ece0: 67 65 73 65 74 20 69 73 20 74 6f 20 62 65 20 72  geset is to be r
ecf0: 65 62 61 73 65 64 20 61 67 61 69 6e 73 74 20 6d  ebased against m
ed00: 75 6c 74 69 70 6c 65 20 72 65 6d 6f 74 65 0a 2a  ultiple remote.*
ed10: 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  *        changes
ed20: 65 74 73 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ets, then sqlite
ed30: 33 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67 75  3rebaser_configu
ed40: 72 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 63  re() should be c
ed50: 61 6c 6c 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  alled.**        
ed60: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
ed70: 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
ed80: 72 20 74 68 61 74 20 74 68 65 20 6d 75 6c 74 69  r that the multi
ed90: 70 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 71  ple.**        sq
eda0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
edb0: 70 70 6c 79 5f 76 32 28 29 20 63 61 6c 6c 73 20  pply_v2() calls 
edc0: 77 65 72 65 20 6d 61 64 65 2e 0a 2a 2a 20 20 20  were made..**   
edd0: 3c 6c 69 3e 20 45 61 63 68 20 6c 6f 63 61 6c 20  <li> Each local 
ede0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 65 62  changeset is reb
edf0: 61 73 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ased by calling 
ee00: 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 72  sqlite3rebaser_r
ee10: 65 62 61 73 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c  ebase()..**   <l
ee20: 69 3e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 72  i> The sqlite3_r
ee30: 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20 69 73  ebaser object is
ee40: 20 64 65 6c 65 74 65 64 20 62 79 20 63 61 6c 6c   deleted by call
ee50: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 73 71  ing.**        sq
ee60: 6c 69 74 65 33 72 65 62 61 73 65 72 5f 64 65 6c  lite3rebaser_del
ee70: 65 74 65 28 29 2e 0a 2a 2a 20 3c 2f 6f 6c 3e 0a  ete()..** </ol>.
ee80: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
ee90: 74 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  t sqlite3_rebase
eea0: 72 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  r sqlite3_rebase
eeb0: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  r;../*.** CAPI3R
eec0: 45 46 3a 20 43 72 65 61 74 65 20 61 20 63 68 61  EF: Create a cha
eed0: 6e 67 65 73 65 74 20 72 65 62 61 73 65 72 20 6f  ngeset rebaser o
eee0: 62 6a 65 63 74 2e 0a 2a 2a 20 45 58 50 45 52 49  bject..** EXPERI
eef0: 4d 45 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 41 6c 6c  MENTAL.**.** All
ef00: 6f 63 61 74 65 20 61 20 6e 65 77 20 63 68 61 6e  ocate a new chan
ef10: 67 65 73 65 74 20 72 65 62 61 73 65 72 20 6f 62  geset rebaser ob
ef20: 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65 73 73  ject. If success
ef30: 66 75 6c 2c 20 73 65 74 20 28 2a 70 70 4e 65 77  ful, set (*ppNew
ef40: 29 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ) to.** point to
ef50: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
ef60: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
ef70: 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
ef80: 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
ef90: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
efa0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
efb0: 6f 64 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45  ode (e.g. SQLITE
efc0: 5f 4e 4f 4d 45 4d 29 20 61 6e 64 20 73 65 74 20  _NOMEM) and set 
efd0: 28 2a 70 70 4e 65 77 29 20 0a 2a 2a 20 74 6f 20  (*ppNew) .** to 
efe0: 4e 55 4c 4c 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  NULL. .*/.int sq
eff0: 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63 72 65  lite3rebaser_cre
f000: 61 74 65 28 73 71 6c 69 74 65 33 5f 72 65 62 61  ate(sqlite3_reba
f010: 73 65 72 20 2a 2a 70 70 4e 65 77 29 3b 0a 0a 2f  ser **ppNew);../
f020: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43  *.** CAPI3REF: C
f030: 6f 6e 66 69 67 75 72 65 20 61 20 63 68 61 6e 67  onfigure a chang
f040: 65 73 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a  eset rebaser obj
f050: 65 63 74 2e 0a 2a 2a 20 45 58 50 45 52 49 4d 45  ect..** EXPERIME
f060: 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  NTAL.**.** Confi
f070: 67 75 72 65 20 74 68 65 20 63 68 61 6e 67 65 73  gure the changes
f080: 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63  et rebaser objec
f090: 74 20 74 6f 20 72 65 62 61 73 65 20 63 68 61 6e  t to rebase chan
f0a0: 67 65 73 65 74 73 20 61 63 63 6f 72 64 69 6e 67  gesets according
f0b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c  .** to the confl
f0c0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 73 20  ict resolutions 
f0d0: 64 65 73 63 72 69 62 65 64 20 62 79 20 62 75 66  described by buf
f0e0: 66 65 72 20 70 52 65 62 61 73 65 20 28 73 69 7a  fer pRebase (siz
f0f0: 65 20 6e 52 65 62 61 73 65 0a 2a 2a 20 62 79 74  e nRebase.** byt
f100: 65 73 29 2c 20 77 68 69 63 68 20 6d 75 73 74 20  es), which must 
f110: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
f120: 65 64 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  ed from a previo
f130: 75 73 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  us call to.** sq
f140: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
f150: 70 70 6c 79 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  pply_v2()..*/.in
f160: 74 20 73 71 6c 69 74 65 33 72 65 62 61 73 65 72  t sqlite3rebaser
f170: 5f 63 6f 6e 66 69 67 75 72 65 28 0a 20 20 73 71  _configure(.  sq
f180: 6c 69 74 65 33 5f 72 65 62 61 73 65 72 2a 2c 20  lite3_rebaser*, 
f190: 0a 20 20 69 6e 74 20 6e 52 65 62 61 73 65 2c 20  .  int nRebase, 
f1a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 52 65 62  const void *pReb
f1b0: 61 73 65 0a 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43  ase.); ../*.** C
f1c0: 41 50 49 33 52 45 46 3a 20 52 65 62 61 73 65 20  API3REF: Rebase 
f1d0: 61 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 45  a changeset.** E
f1e0: 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a 2a 0a 2a  XPERIMENTAL.**.*
f1f0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 6e 20 6d  * Argument pIn m
f200: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
f210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
f220: 20 61 20 63 68 61 6e 67 65 73 65 74 20 6e 49 6e   a changeset nIn
f230: 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a   bytes.** in siz
f240: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
f250: 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 70   allocates and p
f260: 6f 70 75 6c 61 74 65 73 20 61 20 62 75 66 66 65  opulates a buffe
f270: 72 20 77 69 74 68 20 61 20 63 6f 70 79 0a 2a 2a  r with a copy.**
f280: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65   of the changese
f290: 74 20 72 65 62 61 73 65 64 20 72 65 62 61 73 65  t rebased rebase
f2a0: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
f2b0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
f2c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 62 61 73   of the.** rebas
f2d0: 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
f2e0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
f2f0: 67 75 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65  gument. If succe
f300: 73 73 66 75 6c 2c 20 28 2a 70 70 4f 75 74 29 0a  ssful, (*ppOut).
f310: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ** is set to poi
f320: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 62 75  nt to the new bu
f330: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
f340: 74 68 65 20 72 65 62 61 73 65 64 20 63 68 61 6e  the rebased chan
f350: 67 73 65 74 20 61 6e 64 20 0a 2a 2a 20 28 2a 70  gset and .** (*p
f360: 6e 4f 75 74 29 20 74 6f 20 69 74 73 20 73 69 7a  nOut) to its siz
f370: 65 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 53  e in bytes and S
f380: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
f390: 64 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  d. It is the.** 
f3a0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
f3b0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
f3c0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
f3d0: 74 68 65 20 6e 65 77 20 62 75 66 66 65 72 20 75  the new buffer u
f3e0: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
f3f0: 66 72 65 65 28 29 2e 20 4f 74 68 65 72 77 69 73  free(). Otherwis
f400: 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  e, if an error o
f410: 63 63 75 72 73 2c 20 28 2a 70 70 4f 75 74 29 20  ccurs, (*ppOut) 
f420: 61 6e 64 20 28 2a 70 6e 4f 75 74 29 0a 2a 2a 20  and (*pnOut).** 
f430: 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 20  are set to zero 
f440: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
f450: 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
f460: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f470: 33 72 65 62 61 73 65 72 5f 72 65 62 61 73 65 28  3rebaser_rebase(
f480: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73  .  sqlite3_rebas
f490: 65 72 2a 2c 0a 20 20 69 6e 74 20 6e 49 6e 2c 20  er*,.  int nIn, 
f4a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c  const void *pIn,
f4b0: 20 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20   .  int *pnOut, 
f4c0: 76 6f 69 64 20 2a 2a 70 70 4f 75 74 20 0a 29 3b  void **ppOut .);
f4d0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
f4e0: 3a 20 44 65 6c 65 74 65 20 61 20 63 68 61 6e 67  : Delete a chang
f4f0: 65 73 65 74 20 72 65 62 61 73 65 72 20 6f 62 6a  eset rebaser obj
f500: 65 63 74 2e 0a 2a 2a 20 45 58 50 45 52 49 4d 45  ect..** EXPERIME
f510: 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  NTAL.**.** Delet
f520: 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  e the changeset 
f530: 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 20 61  rebaser object a
f540: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
f550: 64 20 72 65 73 6f 75 72 63 65 73 2e 20 54 68 65  d resources. The
f560: 72 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  re.** should be 
f570: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
f580: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
f590: 63 68 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e  ch successful in
f5a0: 76 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 73  vocation.** of s
f5b0: 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63 72  qlite3rebaser_cr
f5c0: 65 61 74 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  eate()..*/.void 
f5d0: 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 64  sqlite3rebaser_d
f5e0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 72 65  elete(sqlite3_re
f5f0: 62 61 73 65 72 20 2a 70 29 3b 20 0a 0a 2f 2a 0a  baser *p); ../*.
f600: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 74 72  ** CAPI3REF: Str
f610: 65 61 6d 69 6e 67 20 56 65 72 73 69 6f 6e 73 20  eaming Versions 
f620: 6f 66 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  of API functions
f630: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 78 20  ..**.** The six 
f640: 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 78 78  streaming API xx
f650: 78 5f 73 74 72 6d 28 29 20 66 75 6e 63 74 69 6f  x_strm() functio
f660: 6e 73 20 73 65 72 76 65 20 73 69 6d 69 6c 61 72  ns serve similar
f670: 20 70 75 72 70 6f 73 65 73 20 74 6f 20 74 68 65   purposes to the
f680: 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
f690: 6e 67 20 6e 6f 6e 2d 73 74 72 65 61 6d 69 6e 67  ng non-streaming
f6a0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 3a 0a   API functions:.
f6b0: 2a 2a 0a 2a 2a 20 3c 74 61 62 6c 65 20 62 6f 72  **.** <table bor
f6c0: 64 65 72 3d 31 20 73 74 79 6c 65 3d 22 6d 61 72  der=1 style="mar
f6d0: 67 69 6e 2d 6c 65 66 74 3a 38 65 78 3b 6d 61 72  gin-left:8ex;mar
f6e0: 67 69 6e 2d 72 69 67 68 74 3a 38 65 78 22 3e 0a  gin-right:8ex">.
f6f0: 2a 2a 20 20 20 3c 74 72 3e 3c 74 68 3e 53 74 72  **   <tr><th>Str
f700: 65 61 6d 69 6e 67 20 66 75 6e 63 74 69 6f 6e 3c  eaming function<
f710: 74 68 3e 4e 6f 6e 2d 73 74 72 65 61 6d 69 6e 67  th>Non-streaming
f720: 20 65 71 75 69 76 61 6c 65 6e 74 3c 2f 74 68 3e   equivalent</th>
f730: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71  .**   <tr><td>sq
f740: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
f750: 70 70 6c 79 5f 73 74 72 6d 3c 74 64 3e 5b 73 71  pply_strm<td>[sq
f760: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
f770: 70 70 6c 79 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e  pply] .**   <tr>
f780: 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61 6e 67  <td>sqlite3chang
f790: 65 73 65 74 5f 63 6f 6e 63 61 74 5f 73 74 72 6d  eset_concat_strm
f7a0: 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e  <td>[sqlite3chan
f7b0: 67 65 73 65 74 5f 63 6f 6e 63 61 74 5d 20 0a 2a  geset_concat] .*
f7c0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69  *   <tr><td>sqli
f7d0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76  te3changeset_inv
f7e0: 65 72 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c  ert_strm<td>[sql
f7f0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e  ite3changeset_in
f800: 76 65 72 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e  vert] .**   <tr>
f810: 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61 6e 67  <td>sqlite3chang
f820: 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 3c  eset_start_strm<
f830: 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  td>[sqlite3chang
f840: 65 73 65 74 5f 73 74 61 72 74 5d 20 0a 2a 2a 20  eset_start] .** 
f850: 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
f860: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
f870: 65 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69  et_strm<td>[sqli
f880: 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67  te3session_chang
f890: 65 73 65 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e  eset] .**   <tr>
f8a0: 3c 74 64 3e 73 71 6c 69 74 65 33 73 65 73 73 69  <td>sqlite3sessi
f8b0: 6f 6e 5f 70 61 74 63 68 73 65 74 5f 73 74 72 6d  on_patchset_strm
f8c0: 3c 74 64 3e 5b 73 71 6c 69 74 65 33 73 65 73 73  <td>[sqlite3sess
f8d0: 69 6f 6e 5f 70 61 74 63 68 73 65 74 5d 20 0a 2a  ion_patchset] .*
f8e0: 2a 20 3c 2f 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  * </table>.**.**
f8f0: 20 4e 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 66   Non-streaming f
f900: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 63  unctions that ac
f910: 63 65 70 74 20 63 68 61 6e 67 65 73 65 74 73 20  cept changesets 
f920: 28 6f 72 20 70 61 74 63 68 73 65 74 73 29 20 61  (or patchsets) a
f930: 73 20 69 6e 70 75 74 0a 2a 2a 20 72 65 71 75 69  s input.** requi
f940: 72 65 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  re that the enti
f950: 72 65 20 63 68 61 6e 67 65 73 65 74 20 62 65 20  re changeset be 
f960: 73 74 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67  stored in a sing
f970: 6c 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d  le buffer in mem
f980: 6f 72 79 2e 20 0a 2a 2a 20 53 69 6d 69 6c 61 72  ory. .** Similar
f990: 6c 79 2c 20 74 68 6f 73 65 20 74 68 61 74 20 72  ly, those that r
f9a0: 65 74 75 72 6e 20 61 20 63 68 61 6e 67 65 73 65  eturn a changese
f9b0: 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 64 6f  t or patchset do
f9c0: 20 73 6f 20 62 79 20 72 65 74 75 72 6e 69 6e 67   so by returning
f9d0: 20 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74   .** a pointer t
f9e0: 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65  o a single large
f9f0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
fa00: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
fa10: 6d 61 6c 6c 6f 63 28 29 2e 20 0a 2a 2a 20 4e 6f  malloc(). .** No
fa20: 72 6d 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63  rmally this is c
fa30: 6f 6e 76 65 6e 69 65 6e 74 2e 20 48 6f 77 65 76  onvenient. Howev
fa40: 65 72 2c 20 69 66 20 61 6e 20 61 70 70 6c 69 63  er, if an applic
fa50: 61 74 69 6f 6e 20 72 75 6e 6e 69 6e 67 20 69 6e  ation running in
fa60: 20 61 20 0a 2a 2a 20 6c 6f 77 2d 6d 65 6d 6f 72   a .** low-memor
fa70: 79 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 69 73  y environment is
fa80: 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
fa90: 64 6c 65 20 76 65 72 79 20 6c 61 72 67 65 20 63  dle very large c
faa0: 68 61 6e 67 65 73 65 74 73 2c 20 74 68 65 0a 2a  hangesets, the.*
fab0: 2a 20 6c 61 72 67 65 20 63 6f 6e 74 69 67 75 6f  * large contiguo
fac0: 75 73 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  us memory alloca
fad0: 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 63  tions required c
fae0: 61 6e 20 62 65 63 6f 6d 65 20 6f 6e 65 72 6f 75  an become onerou
faf0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  s..**.** In orde
fb00: 72 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  r to avoid this 
fb10: 70 72 6f 62 6c 65 6d 2c 20 69 6e 73 74 65 61 64  problem, instead
fb20: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 6c 61 72   of a single lar
fb30: 67 65 20 62 75 66 66 65 72 2c 20 69 6e 70 75 74  ge buffer, input
fb40: 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
fb50: 20 61 20 73 74 72 65 61 6d 69 6e 67 20 41 50 49   a streaming API
fb60: 20 66 75 6e 63 74 69 6f 6e 73 20 62 79 20 77 61   functions by wa
fb70: 79 20 6f 66 20 61 20 63 61 6c 6c 62 61 63 6b 20  y of a callback 
fb80: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
fb90: 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f   the sessions mo
fba0: 64 75 6c 65 20 69 6e 76 6f 6b 65 73 20 74 6f 20  dule invokes to 
fbb0: 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 72 65  incrementally re
fbc0: 71 75 65 73 74 20 69 6e 70 75 74 20 64 61 74 61  quest input data
fbd0: 20 61 73 20 69 74 20 69 73 0a 2a 2a 20 72 65 71   as it is.** req
fbe0: 75 69 72 65 64 2e 20 49 6e 20 61 6c 6c 20 63 61  uired. In all ca
fbf0: 73 65 73 2c 20 61 20 70 61 69 72 20 6f 66 20 41  ses, a pair of A
fc00: 50 49 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  PI function para
fc10: 6d 65 74 65 72 73 20 73 75 63 68 20 61 73 0a 2a  meters such as.*
fc20: 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  *.**  <pre>.**  
fc30: 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20 6e  &nbsp;     int n
fc40: 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20 20 26  Changeset,.**  &
fc50: 6e 62 73 70 3b 20 20 20 20 20 76 6f 69 64 20 2a  nbsp;     void *
fc60: 70 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20 20  pChangeset,.**  
fc70: 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 49 73 20  </pre>.**.** Is 
fc80: 72 65 70 6c 61 63 65 64 20 62 79 3a 0a 2a 2a 0a  replaced by:.**.
fc90: 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e  **  <pre>.**  &n
fca0: 62 73 70 3b 20 20 20 20 20 69 6e 74 20 28 2a 78  bsp;     int (*x
fcb0: 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e  Input)(void *pIn
fcc0: 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  , void *pData, i
fcd0: 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 2a 2a 20  nt *pnData),.** 
fce0: 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69 64   &nbsp;     void
fcf0: 20 2a 70 49 6e 2c 0a 2a 2a 20 20 3c 2f 70 72 65   *pIn,.**  </pre
fd00: 3e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 74 69 6d  >.**.** Each tim
fd10: 65 20 74 68 65 20 78 49 6e 70 75 74 20 63 61 6c  e the xInput cal
fd20: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
fd30: 20 62 79 20 74 68 65 20 73 65 73 73 69 6f 6e 73   by the sessions
fd40: 20 6d 6f 64 75 6c 65 2c 20 74 68 65 20 66 69 72   module, the fir
fd50: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  st.** argument p
fd60: 61 73 73 65 64 20 69 73 20 61 20 63 6f 70 79 20  assed is a copy 
fd70: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
fd80: 70 49 6e 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e  pIn context poin
fd90: 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
fda0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 70 44  .** argument, pD
fdb0: 61 74 61 2c 20 70 6f 69 6e 74 73 20 74 6f 20 61  ata, points to a
fdc0: 20 62 75 66 66 65 72 20 28 2a 70 6e 44 61 74 61   buffer (*pnData
fdd0: 29 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  ) bytes in size.
fde0: 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 0a 2a 2a   Assuming no .**
fdf0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 74 68   error occurs th
fe00: 65 20 78 49 6e 70 75 74 20 6d 65 74 68 6f 64 20  e xInput method 
fe10: 73 68 6f 75 6c 64 20 63 6f 70 79 20 75 70 20 74  should copy up t
fe20: 6f 20 28 2a 70 6e 44 61 74 61 29 20 62 79 74 65  o (*pnData) byte
fe30: 73 20 6f 66 20 64 61 74 61 20 0a 2a 2a 20 69 6e  s of data .** in
fe40: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 61 6e  to the buffer an
fe50: 64 20 73 65 74 20 28 2a 70 6e 44 61 74 61 29 20  d set (*pnData) 
fe60: 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  to the actual nu
fe70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
fe80: 70 69 65 64 20 0a 2a 2a 20 62 65 66 6f 72 65 20  pied .** before 
fe90: 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
fea0: 5f 4f 4b 2e 20 49 66 20 74 68 65 20 69 6e 70 75  _OK. If the inpu
feb0: 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t is completely 
fec0: 65 78 68 61 75 73 74 65 64 2c 20 28 2a 70 6e 44  exhausted, (*pnD
fed0: 61 74 61 29 20 0a 2a 2a 20 73 68 6f 75 6c 64 20  ata) .** should 
fee0: 62 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 74  be set to zero t
fef0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e  o indicate this.
ff00: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
ff10: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
ff20: 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  te .** error cod
ff30: 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 75  e should be retu
ff40: 72 6e 65 64 2e 20 49 6e 20 61 6c 6c 20 63 61 73  rned. In all cas
ff50: 65 73 2c 20 69 66 20 61 6e 20 78 49 6e 70 75 74  es, if an xInput
ff60: 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
ff70: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2c 20 61  s.** an error, a
ff80: 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ll processing is
ff90: 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e 64 20 74   abandoned and t
ffa0: 68 65 20 73 74 72 65 61 6d 69 6e 67 20 41 50 49  he streaming API
ffb0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
ffc0: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
ffd0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
ffe0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
fff0: 2a 2a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  ** In the case o
10000 66 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  f sqlite3changes
10010 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28 29 2c  et_start_strm(),
10020 20 74 68 65 20 78 49 6e 70 75 74 20 63 61 6c 6c   the xInput call
10030 62 61 63 6b 20 6d 61 79 20 62 65 0a 2a 2a 20 69  back may be.** i
10040 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 73 65  nvoked by the se
10050 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 61 74  ssions module at
10060 20 61 6e 79 20 70 6f 69 6e 74 20 64 75 72 69 6e   any point durin
10070 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  g the lifetime o
10080 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f  f the.** iterato
10090 72 2e 20 49 66 20 73 75 63 68 20 61 6e 20 78 49  r. If such an xI
100a0 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 72 65  nput callback re
100b0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
100c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6e 74  the iterator ent
100d0 65 72 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ers.** an error 
100e0 73 74 61 74 65 2c 20 77 68 65 72 65 62 79 20 61  state, whereby a
100f0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
10100 6c 6c 73 20 74 6f 20 69 74 65 72 61 74 6f 72 20  lls to iterator 
10110 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 69 6d  functions .** im
10120 6d 65 64 69 61 74 65 6c 79 20 66 61 69 6c 20 77  mediately fail w
10130 69 74 68 20 74 68 65 20 73 61 6d 65 20 65 72 72  ith the same err
10140 6f 72 20 63 6f 64 65 20 61 73 20 72 65 74 75 72  or code as retur
10150 6e 65 64 20 62 79 20 78 49 6e 70 75 74 2e 0a 2a  ned by xInput..*
10160 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20  *.** Similarly, 
10170 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75  streaming API fu
10180 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
10190 75 72 6e 20 63 68 61 6e 67 65 73 65 74 73 20 28  urn changesets (
101a0 6f 72 20 70 61 74 63 68 73 65 74 73 29 0a 2a 2a  or patchsets).**
101b0 20 72 65 74 75 72 6e 20 74 68 65 6d 20 69 6e 20   return them in 
101c0 63 68 75 6e 6b 73 20 62 79 20 77 61 79 20 6f 66  chunks by way of
101d0 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   a callback func
101e0 74 69 6f 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  tion instead of 
101f0 76 69 61 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  via a.** pointer
10200 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72   to a single lar
10210 67 65 20 62 75 66 66 65 72 2e 20 49 6e 20 74 68  ge buffer. In th
10220 69 73 20 63 61 73 65 2c 20 61 20 70 61 69 72 20  is case, a pair 
10230 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 73 75  of parameters su
10240 63 68 0a 2a 2a 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  ch.** as:.**.** 
10250 20 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e 62 73 70   <pre>.**  &nbsp
10260 3b 20 20 20 20 20 69 6e 74 20 2a 70 6e 43 68 61  ;     int *pnCha
10270 6e 67 65 73 65 74 2c 0a 2a 2a 20 20 26 6e 62 73  ngeset,.**  &nbs
10280 70 3b 20 20 20 20 20 76 6f 69 64 20 2a 2a 70 70  p;     void **pp
10290 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20 20 3c  Changeset,.**  <
102a0 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 49 73 20 72  /pre>.**.** Is r
102b0 65 70 6c 61 63 65 64 20 62 79 3a 0a 2a 2a 0a 2a  eplaced by:.**.*
102c0 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e 62  *  <pre>.**  &nb
102d0 73 70 3b 20 20 20 20 20 69 6e 74 20 28 2a 78 4f  sp;     int (*xO
102e0 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
102f0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
10300 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
10310 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  ,.**  &nbsp;    
10320 20 76 6f 69 64 20 2a 70 4f 75 74 0a 2a 2a 20 20   void *pOut.**  
10330 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 65  </pre>.**.** The
10340 20 78 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63   xOutput callbac
10350 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 7a 65 72  k is invoked zer
10360 6f 20 6f 72 20 6d 6f 72 65 20 74 69 6d 65 73 20  o or more times 
10370 74 6f 20 72 65 74 75 72 6e 20 64 61 74 61 20 74  to return data t
10380 6f 0a 2a 2a 20 74 68 65 20 61 70 70 6c 69 63 61  o.** the applica
10390 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20  tion. The first 
103a0 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
103b0 20 74 6f 20 65 61 63 68 20 63 61 6c 6c 20 69 73   to each call is
103c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a   a copy of the.*
103d0 2a 20 70 4f 75 74 20 70 6f 69 6e 74 65 72 20 73  * pOut pointer s
103e0 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 61  upplied by the a
103f0 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68 65 20  pplication. The 
10400 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
10410 2c 20 70 44 61 74 61 2c 0a 2a 2a 20 70 6f 69 6e  , pData,.** poin
10420 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6e  ts to a buffer n
10430 44 61 74 61 20 62 79 74 65 73 20 69 6e 20 73 69  Data bytes in si
10440 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ze containing th
10450 65 20 63 68 75 6e 6b 20 6f 66 20 6f 75 74 70 75  e chunk of outpu
10460 74 0a 2a 2a 20 64 61 74 61 20 62 65 69 6e 67 20  t.** data being 
10470 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
10480 20 78 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63   xOutput callbac
10490 6b 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 70  k successfully p
104a0 72 6f 63 65 73 73 65 73 20 74 68 65 0a 2a 2a 20  rocesses the.** 
104b0 73 75 70 70 6c 69 65 64 20 64 61 74 61 2c 20 69  supplied data, i
104c0 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  t should return 
104d0 53 51 4c 49 54 45 5f 4f 4b 20 74 6f 20 69 6e 64  SQLITE_OK to ind
104e0 69 63 61 74 65 20 73 75 63 63 65 73 73 2e 20 4f  icate success. O
104f0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
10500 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 73 6f  should return so
10510 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
10520 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74  error code. In t
10530 68 69 73 20 63 61 73 65 20 70 72 6f 63 65 73 73  his case process
10540 69 6e 67 0a 2a 2a 20 69 73 20 69 6d 6d 65 64 69  ing.** is immedi
10550 61 74 65 6c 79 20 61 62 61 6e 64 6f 6e 65 64 20  ately abandoned 
10560 61 6e 64 20 74 68 65 20 73 74 72 65 61 6d 69 6e  and the streamin
10570 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 72  g API function r
10580 65 74 75 72 6e 73 20 61 20 63 6f 70 79 0a 2a 2a  eturns a copy.**
10590 20 6f 66 20 74 68 65 20 78 4f 75 74 70 75 74 20   of the xOutput 
105a0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
105b0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a  e application..*
105c0 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
105d0 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 69  s module never i
105e0 6e 76 6f 6b 65 73 20 61 6e 20 78 4f 75 74 70 75  nvokes an xOutpu
105f0 74 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  t callback with 
10600 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 70 61  the third .** pa
10610 72 61 6d 65 74 65 72 20 73 65 74 20 74 6f 20 61  rameter set to a
10620 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
10630 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
10640 6f 2e 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68  o. Other than th
10650 69 73 2c 0a 2a 2a 20 6e 6f 20 67 75 61 72 61 6e  is,.** no guaran
10660 74 65 65 73 20 61 72 65 20 6d 61 64 65 20 61 73  tees are made as
10670 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
10680 74 68 65 20 63 68 75 6e 6b 73 20 6f 66 20 64 61  the chunks of da
10690 74 61 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ta returned..*/.
106a0 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
106b0 65 73 65 74 5f 61 70 70 6c 79 5f 73 74 72 6d 28  eset_apply_strm(
106c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e     /* Apply chan
106f0 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20  ge to "main" db 
10700 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a  of this handle *
10710 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  /.  int (*xInput
10720 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
10730 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
10740 6e 44 61 74 61 29 2c 20 2f 2a 20 49 6e 70 75 74  nData), /* Input
10750 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
10760 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  oid *pIn,       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
107a0 66 6f 72 20 78 49 6e 70 75 74 20 2a 2f 0a 20 20  for xInput */.  
107b0 69 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20  int(*xFilter)(. 
107c0 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20     void *pCtx,  
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74   /* Copy of sixt
107f0 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28  h arg to _apply(
10800 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) */.    const c
10810 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
10820 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
10830 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69  name */.  ),.  i
10840 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a  nt(*xConflict)(.
10850 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20      void *pCtx, 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78    /* Copy of six
10880 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79  th arg to _apply
10890 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43  () */.    int eC
108a0 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20  onflict,        
108b0 20 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c          /* DATA,
108c0 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49   MISSING, CONFLI
108d0 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a  CT, CONSTRAINT *
108e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68  /.    sqlite3_ch
108f0 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20  angeset_iter *p 
10900 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65      /* Handle de
10910 73 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20  scribing change 
10920 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  and conflict */.
10930 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74    ),.  void *pCt
10940 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
10950 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
10960 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
10970 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a  to xConflict */.
10980 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  );.int sqlite3ch
10990 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32  angeset_apply_v2
109a0 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
109b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
109c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
109d0 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
109e0 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
109f0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ndle */.  int (*
10a00 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49  xInput)(void *pI
10a10 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  n, void *pData, 
10a20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a  int *pnData), /*
10a30 20 49 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 20   Input function 
10a40 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20  */.  void *pIn, 
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10a80 74 20 61 72 67 20 66 6f 72 20 78 49 6e 70 75 74  t arg for xInput
10a90 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74   */.  int(*xFilt
10aa0 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  er)(.    void *p
10ab0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
10ac0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
10ad0 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
10ae0 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63  apply() */.    c
10af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b10 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
10b20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c  ),.  int(*xConfl
10b30 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a  ict)(.    void *
10b40 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
10b50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
10b60 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20  of sixth arg to 
10b70 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20  _apply() */.    
10b80 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20  int eConflict,  
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ba0 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20   DATA, MISSING, 
10bb0 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52  CONFLICT, CONSTR
10bc0 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69  AINT */.    sqli
10bd0 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
10be0 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e  er *p     /* Han
10bf0 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63  dle describing c
10c00 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69  hange and confli
10c10 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69  ct */.  ),.  voi
10c20 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c40 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
10c50 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69  assed to xConfli
10c60 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  ct */.  void **p
10c70 70 52 65 62 61 73 65 2c 20 69 6e 74 20 2a 70 6e  pRebase, int *pn
10c80 52 65 62 61 73 65 0a 29 3b 0a 69 6e 74 20 73 71  Rebase.);.int sq
10c90 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63  lite3changeset_c
10ca0 6f 6e 63 61 74 5f 73 74 72 6d 28 0a 20 20 69 6e  oncat_strm(.  in
10cb0 74 20 28 2a 78 49 6e 70 75 74 41 29 28 76 6f 69  t (*xInputA)(voi
10cc0 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
10cd0 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
10ce0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 41 2c  ),.  void *pInA,
10cf0 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 42  .  int (*xInputB
10d00 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
10d10 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
10d20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
10d30 70 49 6e 42 2c 0a 20 20 69 6e 74 20 28 2a 78 4f  pInB,.  int (*xO
10d40 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
10d50 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
10d60 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
10d70 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29  ,.  void *pOut.)
10d80 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  ;.int sqlite3cha
10d90 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 73 74  ngeset_invert_st
10da0 72 6d 28 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70  rm(.  int (*xInp
10db0 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  ut)(void *pIn, v
10dc0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
10dd0 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  *pnData),.  void
10de0 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28 2a 78   *pIn,.  int (*x
10df0 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f  Output)(void *pO
10e00 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
10e10 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
10e20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a  ),.  void *pOut.
10e30 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  );.int sqlite3ch
10e40 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74  angeset_start_st
10e50 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  rm(.  sqlite3_ch
10e60 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70  angeset_iter **p
10e70 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75  p,.  int (*xInpu
10e80 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  t)(void *pIn, vo
10e90 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
10ea0 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20  pnData),.  void 
10eb0 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  *pIn.);.int sqli
10ec0 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67  te3session_chang
10ed0 65 73 65 74 5f 73 74 72 6d 28 0a 20 20 73 71 6c  eset_strm(.  sql
10ee0 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
10ef0 65 73 73 69 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a  ession,.  int (*
10f00 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70  xOutput)(void *p
10f10 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Out, const void 
10f20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
10f30 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74  a),.  void *pOut
10f40 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .);.int sqlite3s
10f50 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 5f  ession_patchset_
10f60 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f  strm(.  sqlite3_
10f70 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
10f80 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70  n,.  int (*xOutp
10f90 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ut)(void *pOut, 
10fa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
10fb0 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20  a, int nData),. 
10fc0 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69   void *pOut.);.i
10fd0 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
10fe0 67 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 73  group_add_strm(s
10ff0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
11000 75 70 2a 2c 20 0a 20 20 20 20 69 6e 74 20 28 2a  up*, .    int (*
11010 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49  xInput)(void *pI
11020 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  n, void *pData, 
11030 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20  int *pnData),.  
11040 20 20 76 6f 69 64 20 2a 70 49 6e 0a 29 3b 0a 69    void *pIn.);.i
11050 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
11060 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74 72  group_output_str
11070 6d 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  m(sqlite3_change
11080 67 72 6f 75 70 2a 2c 0a 20 20 20 20 69 6e 74 20  group*,.    int 
11090 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20  (*xOutput)(void 
110a0 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69  *pOut, const voi
110b0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
110c0 61 74 61 29 2c 20 0a 20 20 20 20 76 6f 69 64 20  ata), .    void 
110d0 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c  *pOut.);.int sql
110e0 69 74 65 33 72 65 62 61 73 65 72 5f 72 65 62 61  ite3rebaser_reba
110f0 73 65 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74  se_strm(.  sqlit
11100 65 33 5f 72 65 62 61 73 65 72 20 2a 70 52 65 62  e3_rebaser *pReb
11110 61 73 65 72 2c 0a 20 20 69 6e 74 20 28 2a 78 49  aser,.  int (*xI
11120 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
11130 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
11140 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
11150 69 64 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28  id *pIn,.  int (
11160 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
11170 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
11180 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
11190 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75  ta),.  void *pOu
111a0 74 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  t.);.../*.** Mak
111b0 65 20 73 75 72 65 20 77 65 20 63 61 6e 20 63 61  e sure we can ca
111c0 6c 6c 20 74 68 69 73 20 73 74 75 66 66 20 66 72  ll this stuff fr
111d0 6f 6d 20 43 2b 2b 2e 0a 2a 2f 0a 23 69 66 64 65  om C++..*/.#ifde
111e0 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a  f __cplusplus.}.
111f0 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 20  #endif..#endif  
11200 2f 2a 20 21 64 65 66 69 6e 65 64 28 5f 5f 53 51  /* !defined(__SQ
11210 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f 29 20  LITESESSION_H_) 
11220 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
11230 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
11240 29 20 2a 2f 0a                                   ) */.