/ Hex Artifact Content
Login

Artifact 05351d2f50a1203fdffbeb590fdbbc796c9a6bfcd0c9b26cf6db3854e3eb4294:


0000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
0010: 53 51 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f  SQLITESESSION_H_
0020: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
0030: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
0040: 4f 4e 29 0a 23 64 65 66 69 6e 65 20 5f 5f 53 51  ON).#define __SQ
0050: 4c 49 54 45 53 45 53 53 49 4f 4e 5f 48 5f 20 31  LITESESSION_H_ 1
0060: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
0070: 65 20 77 65 20 63 61 6e 20 63 61 6c 6c 20 74 68  e we can call th
0080: 69 73 20 73 74 75 66 66 20 66 72 6f 6d 20 43 2b  is stuff from C+
0090: 2b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 63  +..*/.#ifdef __c
00a0: 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20  plusplus.extern 
00b0: 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 0a 23 69  "C" {.#endif..#i
00c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
00d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  h"../*.** CAPI3R
00e0: 45 46 3a 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65  EF: Session Obje
00f0: 63 74 20 48 61 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20  ct Handle.**.** 
0100: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0110: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 61 20  his object is a 
0120: 5b 73 65 73 73 69 6f 6e 5d 20 74 68 61 74 20 63  [session] that c
0130: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 2a 2a  an be used to.**
0140: 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   record changes 
0150: 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a  to a database..*
0160: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0170: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0180: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0190: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
01a0: 46 3a 20 43 68 61 6e 67 65 73 65 74 20 49 74 65  F: Changeset Ite
01b0: 72 61 74 6f 72 20 48 61 6e 64 6c 65 0a 2a 2a 0a  rator Handle.**.
01c0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
01d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 63  f this object ac
01e0: 74 73 20 61 73 20 61 20 63 75 72 73 6f 72 20 66  ts as a cursor f
01f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 0a 2a 2a 20  or iterating.** 
0200: 6f 76 65 72 20 74 68 65 20 65 6c 65 6d 65 6e 74  over the element
0210: 73 20 6f 66 20 61 20 5b 63 68 61 6e 67 65 73 65  s of a [changese
0220: 74 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 5d  t] or [patchset]
0230: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0240: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
0250: 67 65 73 65 74 5f 69 74 65 72 20 73 71 6c 69 74  geset_iter sqlit
0260: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0270: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  r;../*.** CAPI3R
0280: 45 46 3a 20 43 72 65 61 74 65 20 41 20 4e 65 77  EF: Create A New
0290: 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a   Session Object.
02a0: 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20  ** CONSTRUCTOR: 
02b0: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a  sqlite3_session.
02c0: 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  **.** Create a n
02d0: 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63  ew session objec
02e0: 74 20 61 74 74 61 63 68 65 64 20 74 6f 20 64 61  t attached to da
02f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
0300: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
0310: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0320: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
0330: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
0340: 70 53 65 73 73 69 6f 6e 20 61 6e 64 20 53 51 4c  pSession and SQL
0350: 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
0360: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
0370: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 65  or occurs, *ppSe
0380: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
0390: 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69  NULL and an SQLi
03a0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
03b0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f   (e.g. SQLITE_NO
03c0: 4d 45 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64  MEM) is returned
03d0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f  ..**.** It is po
03e0: 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
03f0: 20 6d 75 6c 74 69 70 6c 65 20 73 65 73 73 69 6f   multiple sessio
0400: 6e 20 6f 62 6a 65 63 74 73 20 61 74 74 61 63 68  n objects attach
0410: 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a  ed to a single.*
0420: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
0430: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 73 73 69 6f 6e  e..**.** Session
0440: 20 6f 62 6a 65 63 74 73 20 63 72 65 61 74 65 64   objects created
0450: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0460: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64  tion should be d
0470: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 65  eleted using the
0480: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
0490: 69 6f 6e 5f 64 65 6c 65 74 65 28 29 5d 20 66 75  ion_delete()] fu
04a0: 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  nction before th
04b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
04c0: 65 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  e that they.** a
04d0: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  re attached to i
04e0: 73 20 69 74 73 65 6c 66 20 63 6c 6f 73 65 64 2e  s itself closed.
04f0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
0500: 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65   handle is close
0510: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
0520: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
0530: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 6e 20  s deleted, then 
0540: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
0550: 61 6c 6c 69 6e 67 20 61 6e 79 20 73 65 73 73 69  alling any sessi
0560: 6f 6e 0a 2a 2a 20 6d 6f 64 75 6c 65 20 66 75 6e  on.** module fun
0570: 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
0580: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
0590: 5f 64 65 6c 65 74 65 28 29 5d 20 6f 6e 20 74 68  _delete()] on th
05a0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
05b0: 0a 2a 2a 20 61 72 65 20 75 6e 64 65 66 69 6e 65  .** are undefine
05c0: 64 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  d..**.** Because
05d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64   the session mod
05e0: 75 6c 65 20 75 73 65 73 20 74 68 65 20 5b 73 71  ule uses the [sq
05f0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
0600: 68 6f 6f 6b 28 29 5d 20 41 50 49 2c 20 69 74 0a  hook()] API, it.
0610: 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
0620: 6c 65 20 66 6f 72 20 61 6e 20 61 70 70 6c 69 63  le for an applic
0630: 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ation to registe
0640: 72 20 61 20 70 72 65 2d 75 70 64 61 74 65 20 68  r a pre-update h
0650: 6f 6f 6b 20 6f 6e 20 61 0a 2a 2a 20 64 61 74 61  ook on a.** data
0660: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
0670: 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   has one or more
0680: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   session objects
0690: 20 61 74 74 61 63 68 65 64 2e 20 4e 6f 72 20 69   attached. Nor i
06a0: 73 0a 2a 2a 20 69 74 20 70 6f 73 73 69 62 6c 65  s.** it possible
06b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 73   to create a ses
06c0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 74 74 61  sion object atta
06d0: 63 68 65 64 20 74 6f 20 61 20 64 61 74 61 62 61  ched to a databa
06e0: 73 65 20 68 61 6e 64 6c 65 20 66 6f 72 0a 2a 2a  se handle for.**
06f0: 20 77 68 69 63 68 20 61 20 70 72 65 2d 75 70 64   which a pre-upd
0700: 61 74 65 20 68 6f 6f 6b 20 69 73 20 61 6c 72 65  ate hook is alre
0710: 61 64 79 20 64 65 66 69 6e 65 64 2e 20 54 68 65  ady defined. The
0720: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 74 74 65   results of atte
0730: 6d 70 74 69 6e 67 20 0a 2a 2a 20 65 69 74 68 65  mpting .** eithe
0740: 72 20 6f 66 20 74 68 65 73 65 20 74 68 69 6e 67  r of these thing
0750: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
0760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69  .**.** The sessi
0770: 6f 6e 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  on object will b
0780: 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
0790: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
07a0: 74 61 62 6c 65 73 20 69 6e 0a 2a 2a 20 64 61 74  tables in.** dat
07b0: 61 62 61 73 65 20 7a 44 62 2c 20 77 68 65 72 65  abase zDb, where
07c0: 20 7a 44 62 20 69 73 20 65 69 74 68 65 72 20 22   zDb is either "
07d0: 6d 61 69 6e 22 2c 20 6f 72 20 22 74 65 6d 70 22  main", or "temp"
07e0: 2c 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  , or the name of
07f0: 20 61 6e 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   an.** attached 
0800: 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
0810: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
0820: 64 61 74 61 62 61 73 65 20 7a 44 62 20 69 73 20  database zDb is 
0830: 6e 6f 74 20 61 74 74 61 63 68 65 64 0a 2a 2a 20  not attached.** 
0840: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0850: 77 68 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e  when the session
0860: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
0870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0880: 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65  e3session_create
0890: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
08c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
08d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08f0: 61 6d 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20  ame of db (e.g. 
0900: 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c  "main") */.  sql
0910: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70  ite3_session **p
0920: 70 53 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20  pSession     /* 
0930: 4f 55 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e  OUT: New session
0940: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f   object */.);../
0950: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
0960: 65 6c 65 74 65 20 41 20 53 65 73 73 69 6f 6e 20  elete A Session 
0970: 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52 55  Object.** DESTRU
0980: 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 73 65  CTOR: sqlite3_se
0990: 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  ssion.**.** Dele
09a0: 74 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  te a session obj
09b0: 65 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ect previously a
09c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 0a  llocated using .
09d0: 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  ** [sqlite3sessi
09e0: 6f 6e 5f 63 72 65 61 74 65 28 29 5d 2e 20 4f 6e  on_create()]. On
09f0: 63 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a  ce a session obj
0a00: 65 63 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  ect has been del
0a10: 65 74 65 64 2c 20 74 68 65 0a 2a 2a 20 72 65 73  eted, the.** res
0a20: 75 6c 74 73 20 6f 66 20 61 74 74 65 6d 70 74 69  ults of attempti
0a30: 6e 67 20 74 6f 20 75 73 65 20 70 53 65 73 73 69  ng to use pSessi
0a40: 6f 6e 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  on with any othe
0a50: 72 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65  r session module
0a60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  .** function are
0a70: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
0a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
0a90: 73 20 6d 75 73 74 20 62 65 20 64 65 6c 65 74 65  s must be delete
0aa0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  d before the dat
0ab0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
0ac0: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 72  which they.** ar
0ad0: 65 20 61 74 74 61 63 68 65 64 20 69 73 20 63 6c  e attached is cl
0ae0: 6f 73 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74  osed. Refer to t
0af0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0b00: 20 66 6f 72 20 0a 2a 2a 20 5b 73 71 6c 69 74 65   for .** [sqlite
0b10: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
0b20: 29 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  )] for details..
0b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73  */.void sqlite3s
0b40: 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 73 71  ession_delete(sq
0b50: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
0b60: 53 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f 2a 0a 2a  Session);.../*.*
0b70: 2a 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62  * CAPI3REF: Enab
0b80: 6c 65 20 4f 72 20 44 69 73 61 62 6c 65 20 41 20  le Or Disable A 
0b90: 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a  Session Object.*
0ba0: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
0bb0: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
0bc0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
0bd0: 65 20 74 68 65 20 72 65 63 6f 72 64 69 6e 67 20  e the recording 
0be0: 6f 66 20 63 68 61 6e 67 65 73 20 62 79 20 61 20  of changes by a 
0bf0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
0c00: 57 68 65 6e 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  When.** enabled,
0c10: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
0c20: 74 20 72 65 63 6f 72 64 73 20 63 68 61 6e 67 65  t records change
0c30: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
0c40: 74 61 62 61 73 65 2e 20 57 68 65 6e 0a 2a 2a 20  tabase. When.** 
0c50: 64 69 73 61 62 6c 65 64 20 2d 20 69 74 20 64 6f  disabled - it do
0c60: 65 73 20 6e 6f 74 2e 20 41 20 6e 65 77 6c 79 20  es not. A newly 
0c70: 63 72 65 61 74 65 64 20 73 65 73 73 69 6f 6e 20  created session 
0c80: 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c 65  object is enable
0c90: 64 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  d..** Refer to t
0ca0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
0cb0: 20 66 6f 72 20 5b 73 71 6c 69 74 65 33 73 65 73   for [sqlite3ses
0cc0: 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29  sion_changeset()
0cd0: 5d 20 66 6f 72 20 66 75 72 74 68 65 72 0a 2a 2a  ] for further.**
0ce0: 20 64 65 74 61 69 6c 73 20 72 65 67 61 72 64 69   details regardi
0cf0: 6e 67 20 68 6f 77 20 65 6e 61 62 6c 69 6e 67 20  ng how enabling 
0d00: 61 6e 64 20 64 69 73 61 62 6c 69 6e 67 20 61 20  and disabling a 
0d10: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  session object a
0d20: 66 66 65 63 74 73 0a 2a 2a 20 74 68 65 20 65 76  ffects.** the ev
0d30: 65 6e 74 75 61 6c 20 63 68 61 6e 67 65 73 65 74  entual changeset
0d40: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e 67  s..**.** Passing
0d50: 20 7a 65 72 6f 20 74 6f 20 74 68 69 73 20 66 75   zero to this fu
0d60: 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73 20  nction disables 
0d70: 74 68 65 20 73 65 73 73 69 6f 6e 2e 20 50 61 73  the session. Pas
0d80: 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 2a 2a 20  sing a value.** 
0d90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
0da0: 6f 20 65 6e 61 62 6c 65 73 20 69 74 2e 20 50 61  o enables it. Pa
0db0: 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20 6c 65  ssing a value le
0dc0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 69 73 20  ss than zero is 
0dd0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c 20 61 6e 64  a .** no-op, and
0de0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0df0: 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
0e00: 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  t state of the s
0e10: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
0e20: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0e30: 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69 6e  ndicates the fin
0e40: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
0e50: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 3a 20  session object: 
0e60: 30 20 69 66 20 0a 2a 2a 20 74 68 65 20 73 65 73  0 if .** the ses
0e70: 73 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64  sion is disabled
0e80: 2c 20 6f 72 20 31 20 69 66 20 69 74 20 69 73 20  , or 1 if it is 
0e90: 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20  enabled..*/.int 
0ea0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
0eb0: 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 65  nable(sqlite3_se
0ec0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
0ed0: 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 3b 0a 0a   int bEnable);..
0ee0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
0ef0: 53 65 74 20 4f 72 20 43 6c 65 61 72 20 74 68 65  Set Or Clear the
0f00: 20 49 6e 64 69 72 65 63 74 20 43 68 61 6e 67 65   Indirect Change
0f10: 20 46 6c 61 67 0a 2a 2a 20 4d 45 54 48 4f 44 3a   Flag.** METHOD:
0f20: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
0f30: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 68 61 6e  .**.** Each chan
0f40: 67 65 20 72 65 63 6f 72 64 65 64 20 62 79 20 61  ge recorded by a
0f50: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
0f60: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 65 69 74  is marked as eit
0f70: 68 65 72 20 64 69 72 65 63 74 20 6f 72 0a 2a 2a  her direct or.**
0f80: 20 69 6e 64 69 72 65 63 74 2e 20 41 20 63 68 61   indirect. A cha
0f90: 6e 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nge is marked as
0fa0: 20 69 6e 64 69 72 65 63 74 20 69 66 20 65 69 74   indirect if eit
0fb0: 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  her:.**.** <ul>.
0fc0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 73 65  **   <li> The se
0fd0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 22 69 6e  ssion object "in
0fe0: 64 69 72 65 63 74 22 20 66 6c 61 67 20 69 73 20  direct" flag is 
0ff0: 73 65 74 20 77 68 65 6e 20 74 68 65 20 63 68 61  set when the cha
1000: 6e 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  nge is.**       
1010: 20 6d 61 64 65 2c 20 6f 72 0a 2a 2a 20 20 20 3c   made, or.**   <
1020: 6c 69 3e 20 54 68 65 20 63 68 61 6e 67 65 20 69  li> The change i
1030: 73 20 6d 61 64 65 20 62 79 20 61 6e 20 53 51 4c  s made by an SQL
1040: 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
1050: 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20 0a  ign key action .
1060: 2a 2a 20 20 20 20 20 20 20 20 69 6e 73 74 65 61  **        instea
1070: 64 20 6f 66 20 64 69 72 65 63 74 6c 79 20 61 73  d of directly as
1080: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 75   a result of a u
1090: 73 65 72 73 20 53 51 4c 20 73 74 61 74 65 6d 65  sers SQL stateme
10a0: 6e 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  nt..** </ul>.**.
10b0: 2a 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 72  ** If a single r
10c0: 6f 77 20 69 73 20 61 66 66 65 63 74 65 64 20 62  ow is affected b
10d0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
10e0: 6f 70 65 72 61 74 69 6f 6e 20 77 69 74 68 69 6e  operation within
10f0: 20 61 20 73 65 73 73 69 6f 6e 2c 0a 2a 2a 20 74   a session,.** t
1100: 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69  hen the change i
1110: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 69 6e 64  s considered ind
1120: 69 72 65 63 74 20 69 66 20 61 6c 6c 20 6f 70 65  irect if all ope
1130: 72 61 74 69 6f 6e 73 20 6d 65 65 74 20 74 68 65  rations meet the
1140: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 66 6f 72   criteria.** for
1150: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68 61   an indirect cha
1160: 6e 67 65 20 61 62 6f 76 65 2c 20 6f 72 20 64 69  nge above, or di
1170: 72 65 63 74 20 6f 74 68 65 72 77 69 73 65 2e 0a  rect otherwise..
1180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1190: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
11a0: 65 74 2c 20 63 6c 65 61 72 20 6f 72 20 71 75 65  et, clear or que
11b0: 72 79 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ry the session o
11c0: 62 6a 65 63 74 20 69 6e 64 69 72 65 63 74 0a 2a  bject indirect.*
11d0: 2a 20 66 6c 61 67 2e 20 20 49 66 20 74 68 65 20  * flag.  If the 
11e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11f0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1200: 75 6e 63 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c  unction is zero,
1210: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 64   then the.** ind
1220: 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 63 6c  irect flag is cl
1230: 65 61 72 65 64 2e 20 49 66 20 69 74 20 69 73 20  eared. If it is 
1240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1250: 6f 2c 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  o, the indirect 
1260: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 20  flag.** is set. 
1270: 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20  Passing a value 
1280: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 64  less than zero d
1290: 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74  oes not modify t
12a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
12b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 69 72  .** of the indir
12c0: 65 63 74 20 66 6c 61 67 2c 20 61 6e 64 20 6d 61  ect flag, and ma
12d0: 79 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65  y be used to que
12e0: 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
12f0: 74 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tate of the .** 
1300: 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 66 6f  indirect flag fo
1310: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1320: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  session object..
1330: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1340: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1350: 20 74 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   the final state
1360: 20 6f 66 20 74 68 65 20 69 6e 64 69 72 65 63 74   of the indirect
1370: 20 66 6c 61 67 3a 20 30 20 69 66 20 0a 2a 2a 20   flag: 0 if .** 
1380: 69 74 20 69 73 20 63 6c 65 61 72 2c 20 6f 72 20  it is clear, or 
1390: 31 20 69 66 20 69 74 20 69 73 20 73 65 74 2e 0a  1 if it is set..
13a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
13b0: 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 73  ssion_indirect(s
13c0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
13d0: 70 53 65 73 73 69 6f 6e 2c 20 69 6e 74 20 62 49  pSession, int bI
13e0: 6e 64 69 72 65 63 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ndirect);../*.**
13f0: 20 43 41 50 49 33 52 45 46 3a 20 41 74 74 61 63   CAPI3REF: Attac
1400: 68 20 41 20 54 61 62 6c 65 20 54 6f 20 41 20 53  h A Table To A S
1410: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
1420: 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65 33   METHOD: sqlite3
1430: 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 49  _session.**.** I
1440: 66 20 61 72 67 75 6d 65 6e 74 20 7a 54 61 62 20  f argument zTab 
1450: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1460: 6e 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  n it is the name
1470: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 6f 20 61   of a table to a
1480: 74 74 61 63 68 0a 2a 2a 20 74 6f 20 74 68 65 20  ttach.** to the 
1490: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
14a0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14b0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  st argument. All
14c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e   subsequent chan
14d0: 67 65 73 20 0a 2a 2a 20 6d 61 64 65 20 74 6f 20  ges .** made to 
14e0: 74 68 65 20 74 61 62 6c 65 20 77 68 69 6c 65 20  the table while 
14f0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
1500: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69  ct is enabled wi
1510: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 2e 20  ll be recorded. 
1520: 53 65 65 20 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  See .** document
1530: 61 74 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74  ation for [sqlit
1540: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
1550: 73 65 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68  set()] for furth
1560: 65 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  er details..**.*
1570: 2a 20 4f 72 2c 20 69 66 20 61 72 67 75 6d 65 6e  * Or, if argumen
1580: 74 20 7a 54 61 62 20 69 73 20 4e 55 4c 4c 2c 20  t zTab is NULL, 
1590: 74 68 65 6e 20 63 68 61 6e 67 65 73 20 61 72 65  then changes are
15a0: 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 61 6c   recorded for al
15b0: 6c 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74  l tables.** in t
15c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15d0: 61 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65  additional table
15e0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
15f0: 68 65 20 64 61 74 61 62 61 73 65 20 28 62 79 20  he database (by 
1600: 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 22 43  .** executing "C
1610: 52 45 41 54 45 20 54 41 42 4c 45 22 20 73 74 61  REATE TABLE" sta
1620: 74 65 6d 65 6e 74 73 29 20 61 66 74 65 72 20 74  tements) after t
1630: 68 69 73 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  his call is made
1640: 2c 20 63 68 61 6e 67 65 73 20 66 6f 72 20 0a 2a  , changes for .*
1650: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  * the new tables
1660: 20 61 72 65 20 61 6c 73 6f 20 72 65 63 6f 72 64   are also record
1670: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  ed..**.** Change
1680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 65  s can only be re
1690: 63 6f 72 64 65 64 20 66 6f 72 20 74 61 62 6c 65  corded for table
16a0: 73 20 74 68 61 74 20 68 61 76 65 20 61 20 50 52  s that have a PR
16b0: 49 4d 41 52 59 20 4b 45 59 20 65 78 70 6c 69 63  IMARY KEY explic
16c0: 69 74 6c 79 0a 2a 2a 20 64 65 66 69 6e 65 64 20  itly.** defined 
16d0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 69 72  as part of their
16e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
16f0: 61 74 65 6d 65 6e 74 2e 20 49 74 20 64 6f 65 73  atement. It does
1700: 20 6e 6f 74 20 6d 61 74 74 65 72 20 69 66 20 74   not matter if t
1710: 68 65 20 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b  he .** PRIMARY K
1720: 45 59 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45  EY is an "INTEGE
1730: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28  R PRIMARY KEY" (
1740: 72 6f 77 69 64 20 61 6c 69 61 73 29 20 6f 72 20  rowid alias) or 
1750: 6e 6f 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59  not. The PRIMARY
1760: 0a 2a 2a 20 4b 45 59 20 6d 61 79 20 63 6f 6e 73  .** KEY may cons
1770: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
1780: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 6d 61 79 20 62  column, or may b
1790: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
17a0: 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 74 20 69 73 20  y..** .** It is 
17b0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  not an error if 
17c0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
17d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
17e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
17f0: 4e 6f 72 0a 2a 2a 20 69 73 20 69 74 20 61 6e 20  Nor.** is it an 
1800: 65 72 72 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  error if the nam
1810: 65 64 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  ed table does no
1820: 74 20 68 61 76 65 20 61 20 50 52 49 4d 41 52 59  t have a PRIMARY
1830: 20 4b 45 59 2e 20 48 6f 77 65 76 65 72 2c 0a 2a   KEY. However,.*
1840: 2a 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  * no changes wil
1850: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
1860: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
1870: 20 73 63 65 6e 61 72 69 6f 73 2e 0a 2a 2a 0a 2a   scenarios..**.*
1880: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6e 6f  * Changes are no
1890: 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72 20 69  t recorded for i
18a0: 6e 64 69 76 69 64 75 61 6c 20 72 6f 77 73 20 74  ndividual rows t
18b0: 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76 61  hat have NULL va
18c0: 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  lues stored.** i
18d0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
18e0: 20 74 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b   their PRIMARY K
18f0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
1900: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1910: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
1920: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 77 69  all completes wi
1930: 74 68 6f 75 74 20 65 72 72 6f 72 2e 20 4f 72 2c  thout error. Or,
1940: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1950: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
1960: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65  te error code (e
1970: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
1980: 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ) is returned..*
1990: 2a 0a 2a 2a 20 3c 68 33 3e 53 70 65 63 69 61 6c  *.** <h3>Special
19a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 48 61   sqlite_stat1 Ha
19b0: 6e 64 6c 69 6e 67 3c 2f 68 33 3e 0a 2a 2a 0a 2a  ndling</h3>.**.*
19c0: 2a 20 41 73 20 6f 66 20 53 51 4c 69 74 65 20 76  * As of SQLite v
19d0: 65 72 73 69 6f 6e 20 33 2e 32 32 2e 30 2c 20 74  ersion 3.22.0, t
19e0: 68 65 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  he "sqlite_stat1
19f0: 22 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 78  " table is an ex
1a00: 63 65 70 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 73  ception to .** s
1a10: 6f 6d 65 20 6f 66 20 74 68 65 20 72 75 6c 65 73  ome of the rules
1a20: 20 61 62 6f 76 65 2e 20 49 6e 20 53 51 4c 69 74   above. In SQLit
1a30: 65 2c 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  e, the schema of
1a40: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 69 73   sqlite_stat1 is
1a50: 3a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  :.**  <pre>.**  
1a60: 26 6e 62 73 70 3b 20 20 20 20 20 43 52 45 41 54  &nbsp;     CREAT
1a70: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
1a80: 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61  tat1(tbl,idx,sta
1a90: 74 29 20 20 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a  t)  .**  </pre>.
1aa0: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
1ab0: 68 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  h sqlite_stat1 d
1ac0: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 50  oes not have a P
1ad0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 61 6e  RIMARY KEY, chan
1ae0: 67 65 73 20 61 72 65 20 0a 2a 2a 20 72 65 63 6f  ges are .** reco
1af0: 72 64 65 64 20 66 6f 72 20 69 74 20 61 73 20 69  rded for it as i
1b00: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
1b10: 59 20 69 73 20 28 74 62 6c 2c 69 64 78 29 2e 20  Y is (tbl,idx). 
1b20: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 63 68  Additionally, ch
1b30: 61 6e 67 65 73 20 0a 2a 2a 20 61 72 65 20 72 65  anges .** are re
1b40: 63 6f 72 64 65 64 20 66 6f 72 20 72 6f 77 73 20  corded for rows 
1b50: 66 6f 72 20 77 68 69 63 68 20 28 69 64 78 20 49  for which (idx I
1b60: 53 20 4e 55 4c 4c 29 20 69 73 20 74 72 75 65 2e  S NULL) is true.
1b70: 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 73 75   However, for su
1b80: 63 68 0a 2a 2a 20 72 6f 77 73 20 61 20 7a 65 72  ch.** rows a zer
1b90: 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 28 53  o-length blob (S
1ba0: 51 4c 20 76 61 6c 75 65 20 58 27 27 29 20 69 73  QL value X'') is
1bb0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
1bc0: 68 61 6e 67 65 73 65 74 20 6f 72 0a 2a 2a 20 70  hangeset or.** p
1bd0: 61 74 63 68 73 65 74 20 69 6e 73 74 65 61 64 20  atchset instead 
1be0: 6f 66 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e  of a NULL value.
1bf0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 75 63   This allows suc
1c00: 68 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 20  h changesets to 
1c10: 62 65 0a 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  be.** manipulate
1c20: 64 20 62 79 20 6c 65 67 61 63 79 20 69 6d 70 6c  d by legacy impl
1c30: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 73  ementations of s
1c40: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1c50: 69 6e 76 65 72 74 28 29 2c 0a 2a 2a 20 63 6f 6e  invert(),.** con
1c60: 63 61 74 28 29 20 61 6e 64 20 73 69 6d 69 6c 61  cat() and simila
1c70: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  r..**.** The sql
1c80: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
1c90: 70 6c 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ply() function a
1ca0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
1cb0: 76 65 72 74 73 20 74 68 65 20 0a 2a 2a 20 7a 65  verts the .** ze
1cc0: 72 6f 2d 6c 65 6e 67 74 68 20 62 6c 6f 62 20 62  ro-length blob b
1cd0: 61 63 6b 20 74 6f 20 61 20 4e 55 4c 4c 20 76 61  ack to a NULL va
1ce0: 6c 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  lue when updatin
1cf0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  g the sqlite_sta
1d00: 74 31 0a 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77  t1.** table. How
1d10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 61 70 70  ever, if the app
1d20: 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1d30: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1d40: 6e 65 77 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  new(),.** sqlite
1d50: 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29  3changeset_old()
1d60: 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67   or sqlite3chang
1d70: 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 20 6f 6e  eset_conflict on
1d80: 20 61 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a   a changeset .**
1d90: 20 69 74 65 72 61 74 6f 72 20 64 69 72 65 63 74   iterator direct
1da0: 6c 79 20 28 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  ly (including on
1db0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
1dc0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f 20  rator passed to 
1dd0: 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61  a.** conflict-ha
1de0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 29 20  ndler callback) 
1df0: 74 68 65 6e 20 74 68 65 20 58 27 27 20 76 61 6c  then the X'' val
1e00: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
1e10: 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  The application.
1e20: 2a 2a 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  ** must translat
1e30: 65 20 58 27 27 20 74 6f 20 4e 55 4c 4c 20 69 74  e X'' to NULL it
1e40: 73 65 6c 66 20 69 66 20 72 65 71 75 69 72 65 64  self if required
1e50: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 67 61 63 79 20 28  ..**.** Legacy (
1e60: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 32 32 2e  older than 3.22.
1e70: 30 29 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  0) versions of t
1e80: 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
1e90: 6c 65 20 63 61 6e 6e 6f 74 20 63 61 70 74 75 72  le cannot captur
1ea0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6d 61 64  e.** changes mad
1eb0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  e to the sqlite_
1ec0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 4c 65 67  stat1 table. Leg
1ed0: 61 63 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  acy versions of 
1ee0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
1ef0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
1f00: 66 75 6e 63 74 69 6f 6e 20 73 69 6c 65 6e 74 6c  function silentl
1f10: 79 20 69 67 6e 6f 72 65 20 61 6e 79 20 6d 6f 64  y ignore any mod
1f20: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1f30: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1f40: 31 20 74 61 62 6c 65 20 74 68 61 74 20 61 72 65  1 table that are
1f50: 20 70 61 72 74 20 6f 66 20 61 20 63 68 61 6e 67   part of a chang
1f60: 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
1f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f80: 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 0a  session_attach(.
1f90: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
1fa0: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
1fb0: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
1fc0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1fd0: 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ff0: 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a  e name */.);../*
2000: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 53 65  .** CAPI3REF: Se
2010: 74 20 61 20 74 61 62 6c 65 20 66 69 6c 74 65 72  t a table filter
2020: 20 6f 6e 20 61 20 53 65 73 73 69 6f 6e 20 4f 62   on a Session Ob
2030: 6a 65 63 74 2e 0a 2a 2a 20 4d 45 54 48 4f 44 3a  ject..** METHOD:
2040: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
2050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
2060: 64 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  d argument (xFil
2070: 74 65 72 29 20 69 73 20 74 68 65 20 22 66 69 6c  ter) is the "fil
2080: 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 2e 20 46  ter callback". F
2090: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 72 6f  or changes to ro
20a0: 77 73 20 0a 2a 2a 20 69 6e 20 74 61 62 6c 65 73  ws .** in tables
20b0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 74   that are not at
20c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 53 65  tached to the Se
20d0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
20e0: 65 20 66 69 6c 74 65 72 20 69 73 20 63 61 6c 6c  e filter is call
20f0: 65 64 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ed.** to determi
2100: 6e 65 20 77 68 65 74 68 65 72 20 63 68 61 6e 67  ne whether chang
2110: 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 27  es to the table'
2120: 73 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62 65  s rows should be
2130: 20 74 72 61 63 6b 65 64 20 6f 72 20 6e 6f 74 2e   tracked or not.
2140: 20 0a 2a 2a 20 49 66 20 78 46 69 6c 74 65 72 20   .** If xFilter 
2150: 72 65 74 75 72 6e 73 20 30 2c 20 63 68 61 6e 67  returns 0, chang
2160: 65 73 20 69 73 20 6e 6f 74 20 74 72 61 63 6b 65  es is not tracke
2170: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e 63  d. Note that onc
2180: 65 20 61 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a  e a table is .**
2190: 20 61 74 74 61 63 68 65 64 2c 20 78 46 69 6c 74   attached, xFilt
21a0: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  er will not be c
21b0: 61 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a  alled again..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65 73 73  void sqlite3sess
21d0: 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72  ion_table_filter
21e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
21f0: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20  ion *pSession,  
2200: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f      /* Session o
2210: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 28 2a  bject */.  int(*
2220: 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f  xFilter)(.    vo
2230: 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
2240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2250: 6f 70 79 20 6f 66 20 74 68 69 72 64 20 61 72 67  opy of third arg
2260: 20 74 6f 20 5f 66 69 6c 74 65 72 5f 74 61 62 6c   to _filter_tabl
2270: 65 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  e() */.    const
2280: 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20   char *zTab     
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
22a0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20  e name */.  ),. 
22b0: 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20   void *pCtx     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
22e0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 46 69  nt passed to xFi
22f0: 6c 74 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  lter */.);../*.*
2300: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
2310: 72 61 74 65 20 41 20 43 68 61 6e 67 65 73 65 74  rate A Changeset
2320: 20 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20   From A Session 
2330: 4f 62 6a 65 63 74 0a 2a 2a 20 4d 45 54 48 4f 44  Object.** METHOD
2340: 3a 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f  : sqlite3_sessio
2350: 6e 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  n.**.** Obtain a
2360: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74 61   changeset conta
2370: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  ining changes to
2380: 20 74 68 65 20 74 61 62 6c 65 73 20 61 74 74 61   the tables atta
2390: 63 68 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ched to the .** 
23a0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
23b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  st argument. If 
23d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 0a 2a 2a 20  successful, .** 
23e0: 73 65 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74  set *ppChangeset
23f0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
2400: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2410: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 0a   the changeset .
2420: 2a 2a 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  ** and *pnChange
2430: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
2440: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
2450: 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
2460: 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 53 51   returning.** SQ
2470: 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65  LITE_OK. If an e
2480: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
2490: 20 62 6f 74 68 20 2a 70 70 43 68 61 6e 67 65 73   both *ppChanges
24a0: 65 74 20 61 6e 64 20 2a 70 6e 43 68 61 6e 67 65  et and *pnChange
24b0: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 61  set to.** zero a
24c0: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
24d0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
24e0: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
24f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  t consists of ze
2500: 72 6f 20 6f 72 20 6d 6f 72 65 20 49 4e 53 45 52  ro or more INSER
2510: 54 2c 20 55 50 44 41 54 45 20 61 6e 64 2f 6f 72  T, UPDATE and/or
2520: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 73 2c   DELETE changes,
2530: 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
2540: 6e 74 69 6e 67 20 61 20 63 68 61 6e 67 65 20 74  nting a change t
2550: 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  o a single row o
2560: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 74 61  f an attached ta
2570: 62 6c 65 2e 20 41 6e 20 49 4e 53 45 52 54 0a 2a  ble. An INSERT.*
2580: 2a 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e  * change contain
2590: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
25a0: 65 61 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20  each field of a 
25b0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 72 6f 77  new database row
25c0: 2e 20 41 20 44 45 4c 45 54 45 0a 2a 2a 20 63 6f  . A DELETE.** co
25d0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 72 69 67 69  ntains the origi
25e0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 65 61  nal values of ea
25f0: 63 68 20 66 69 65 6c 64 20 6f 66 20 61 20 64 65  ch field of a de
2600: 6c 65 74 65 64 20 64 61 74 61 62 61 73 65 20 72  leted database r
2610: 6f 77 2e 20 41 6e 0a 2a 2a 20 55 50 44 41 54 45  ow. An.** UPDATE
2620: 20 63 68 61 6e 67 65 20 63 6f 6e 74 61 69 6e 73   change contains
2630: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61   the original va
2640: 6c 75 65 73 20 6f 66 20 65 61 63 68 20 66 69 65  lues of each fie
2650: 6c 64 20 6f 66 20 61 6e 20 75 70 64 61 74 65 64  ld of an updated
2660: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 72 6f 77  .** database row
2670: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2680: 75 70 64 61 74 65 64 20 76 61 6c 75 65 73 20 66  updated values f
2690: 6f 72 20 65 61 63 68 20 75 70 64 61 74 65 64 20  or each updated 
26a0: 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d 6b 65 79 0a  non-primary-key.
26b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 49 74 20 69 73  ** column. It is
26c0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
26d0: 72 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e  r an UPDATE chan
26e0: 67 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ge to represent 
26f0: 61 20 63 68 61 6e 67 65 20 74 68 61 74 0a 2a 2a  a change that.**
2700: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 76 61   modifies the va
2710: 6c 75 65 73 20 6f 66 20 70 72 69 6d 61 72 79 20  lues of primary 
2720: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  key columns. If 
2730: 73 75 63 68 20 61 20 63 68 61 6e 67 65 20 69 73  such a change is
2740: 20 6d 61 64 65 2c 20 69 74 0a 2a 2a 20 69 73 20   made, it.** is 
2750: 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 61  represented in a
2760: 20 63 68 61 6e 67 65 73 65 74 20 61 73 20 61 20   changeset as a 
2770: 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64 20  DELETE followed 
2780: 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a  by an INSERT..**
2790: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
27a0: 6e 6f 74 20 72 65 63 6f 72 64 65 64 20 66 6f 72  not recorded for
27b0: 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65 20   rows that have 
27c0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 73 74 6f 72  NULL values stor
27d0: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 0a 2a 2a  ed in one or .**
27e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 69 72 20 50   more of their P
27f0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
2800: 6e 73 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f  ns. If such a ro
2810: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 6f 72  w is inserted or
2820: 20 64 65 6c 65 74 65 64 2c 0a 2a 2a 20 6e 6f 20   deleted,.** no 
2830: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  corresponding ch
2840: 61 6e 67 65 20 69 73 20 70 72 65 73 65 6e 74 20  ange is present 
2850: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
2860: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
2870: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
2880: 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72  If an existing r
2890: 6f 77 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  ow with one or m
28a0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ore NULL values 
28b0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 50 52 49  stored in.** PRI
28c0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
28d0: 20 69 73 20 75 70 64 61 74 65 64 20 73 6f 20 74   is updated so t
28e0: 68 61 74 20 61 6c 6c 20 50 52 49 4d 41 52 59 20  hat all PRIMARY 
28f0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  KEY columns are 
2900: 6e 6f 6e 2d 4e 55 4c 4c 2c 0a 2a 2a 20 6f 6e 6c  non-NULL,.** onl
2910: 79 20 61 6e 20 49 4e 53 45 52 54 20 69 73 20 61  y an INSERT is a
2920: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 63 68  ppears in the ch
2930: 61 6e 67 65 73 65 74 2e 20 53 69 6d 69 6c 61 72  angeset. Similar
2940: 6c 79 2c 20 69 66 20 61 6e 20 65 78 69 73 74 69  ly, if an existi
2950: 6e 67 20 72 6f 77 0a 2a 2a 20 77 69 74 68 20 6e  ng row.** with n
2960: 6f 6e 2d 4e 55 4c 4c 20 50 52 49 4d 41 52 59 20  on-NULL PRIMARY 
2970: 4b 45 59 20 76 61 6c 75 65 73 20 69 73 20 75 70  KEY values is up
2980: 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  dated so that on
2990: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
29a0: 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20  .** PRIMARY KEY 
29b0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 73 65 74 20  columns are set 
29c0: 74 6f 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  to NULL, the res
29d0: 75 6c 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  ulting changeset
29e0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 44   contains a.** D
29f0: 45 4c 45 54 45 20 63 68 61 6e 67 65 20 6f 6e 6c  ELETE change onl
2a00: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  y..**.** The con
2a10: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
2a20: 65 73 65 74 20 6d 61 79 20 62 65 20 74 72 61 76  eset may be trav
2a30: 65 72 73 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ersed using an i
2a40: 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 0a  terator created.
2a50: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71  ** using the [sq
2a60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
2a70: 74 61 72 74 28 29 5d 20 41 50 49 2e 20 41 20 63  tart()] API. A c
2a80: 68 61 6e 67 65 73 65 74 20 6d 61 79 20 62 65 20  hangeset may be 
2a90: 61 70 70 6c 69 65 64 20 74 6f 0a 2a 2a 20 61 20  applied to.** a 
2aa0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
2ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 73 63 68 65 6d  compatible schem
2ac0: 61 20 75 73 69 6e 67 20 74 68 65 20 5b 73 71 6c  a using the [sql
2ad0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
2ae0: 70 6c 79 28 29 5d 0a 2a 2a 20 41 50 49 2e 0a 2a  ply()].** API..*
2af0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 61 20 63 68  *.** Within a ch
2b00: 61 6e 67 65 73 65 74 20 67 65 6e 65 72 61 74 65  angeset generate
2b10: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2b20: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
2b30: 72 65 6c 61 74 65 64 20 74 6f 20 61 0a 2a 2a 20  related to a.** 
2b40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65  single table are
2b50: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2b60: 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  r. In other word
2b70: 73 2c 20 77 68 65 6e 20 69 74 65 72 61 74 69 6e  s, when iteratin
2b80: 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20 63  g through.** a c
2b90: 68 61 6e 67 65 73 65 74 20 6f 72 20 77 68 65 6e  hangeset or when
2ba0: 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e   applying a chan
2bb0: 67 65 73 65 74 20 74 6f 20 61 20 64 61 74 61 62  geset to a datab
2bc0: 61 73 65 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73  ase, all changes
2bd0: 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 61   related.** to a
2be0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
2bf0: 65 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  e processed befo
2c00: 72 65 20 6d 6f 76 69 6e 67 20 6f 6e 20 74 6f 20  re moving on to 
2c10: 74 68 65 20 6e 65 78 74 20 74 61 62 6c 65 2e 20  the next table. 
2c20: 54 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73 6f  Tables.** are so
2c30: 72 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  rted in the same
2c40: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2c50: 74 68 65 79 20 77 65 72 65 20 61 74 74 61 63 68  they were attach
2c60: 65 64 20 28 6f 72 20 61 75 74 6f 2d 61 74 74 61  ed (or auto-atta
2c70: 63 68 65 64 29 0a 2a 2a 20 74 6f 20 74 68 65 20  ched).** to the 
2c80: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
2c90: 6f 62 6a 65 63 74 2e 20 54 68 65 20 6f 72 64 65  object. The orde
2ca0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 63  r in which the c
2cb0: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
2cc0: 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  o.** a single ta
2cd0: 62 6c 65 20 61 72 65 20 73 74 6f 72 65 64 20 69  ble are stored i
2ce0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
2cf0: 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  ** Following a s
2d00: 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
2d10: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2d20: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
2d30: 6e 73 69 62 69 6c 69 74 79 20 6f 66 0a 2a 2a 20  nsibility of.** 
2d40: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
2d50: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
2d60: 65 20 62 75 66 66 65 72 20 74 68 61 74 20 2a 70  e buffer that *p
2d70: 70 43 68 61 6e 67 65 73 65 74 20 70 6f 69 6e 74  pChangeset point
2d80: 73 20 74 6f 20 75 73 69 6e 67 0a 2a 2a 20 5b 73  s to using.** [s
2d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 5d 2e 0a  qlite3_free()]..
2da0: 2a 2a 0a 2a 2a 20 3c 68 33 3e 43 68 61 6e 67 65  **.** <h3>Change
2db0: 73 65 74 20 47 65 6e 65 72 61 74 69 6f 6e 3c 2f  set Generation</
2dc0: 68 33 3e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  h3>.**.** Once a
2dd0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
2de0: 61 74 74 61 63 68 65 64 20 74 6f 20 61 20 73 65  attached to a se
2df0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2c 20 74 68  ssion object, th
2e00: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
2e10: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
2e20: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
2e30: 65 73 20 6f 66 20 61 6c 6c 20 6e 65 77 20 72 6f  es of all new ro
2e40: 77 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ws inserted into
2e50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 49   the table..** I
2e60: 74 20 61 6c 73 6f 20 72 65 63 6f 72 64 73 20 74  t also records t
2e70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 72 69 6d  he original prim
2e80: 61 72 79 20 6b 65 79 20 61 6e 64 20 6f 74 68 65  ary key and othe
2e90: 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  r column values 
2ea0: 6f 66 20 61 6e 79 0a 2a 2a 20 64 65 6c 65 74 65  of any.** delete
2eb0: 64 20 6f 72 20 75 70 64 61 74 65 64 20 72 6f 77  d or updated row
2ec0: 73 2e 20 46 6f 72 20 65 61 63 68 20 75 6e 69 71  s. For each uniq
2ed0: 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ue primary key v
2ee0: 61 6c 75 65 2c 20 64 61 74 61 20 69 73 20 6f 6e  alue, data is on
2ef0: 6c 79 0a 2a 2a 20 72 65 63 6f 72 64 65 64 20 6f  ly.** recorded o
2f00: 6e 63 65 20 2d 20 74 68 65 20 66 69 72 73 74 20  nce - the first 
2f10: 74 69 6d 65 20 61 20 72 6f 77 20 77 69 74 68 20  time a row with 
2f20: 73 61 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  said primary key
2f30: 20 69 73 20 69 6e 73 65 72 74 65 64 2c 0a 2a 2a   is inserted,.**
2f40: 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65   updated or dele
2f50: 74 65 64 20 69 6e 20 74 68 65 20 6c 69 66 65 74  ted in the lifet
2f60: 69 6d 65 20 6f 66 20 74 68 65 20 73 65 73 73 69  ime of the sessi
2f70: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  on..**.** There 
2f80: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
2f90: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2fa0: 20 70 61 72 61 67 72 61 70 68 3a 20 77 68 65 6e   paragraph: when
2fb0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
2fc0: 65 64 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f  ed,.** updated o
2fd0: 72 20 64 65 6c 65 74 65 64 2c 20 69 66 20 6f 6e  r deleted, if on
2fe0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 69 74 73  e or more of its
2ff0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
3000: 75 6d 6e 73 20 63 6f 6e 74 61 69 6e 20 61 0a 2a  umns contain a.*
3010: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6e 6f  * NULL value, no
3020: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
3030: 68 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 0a 2a  hange is made..*
3040: 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
3050: 20 6f 62 6a 65 63 74 20 74 68 65 72 65 66 6f 72   object therefor
3060: 65 20 61 63 63 75 6d 75 6c 61 74 65 73 20 74 77  e accumulates tw
3070: 6f 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  o types of recor
3080: 64 73 20 2d 20 74 68 6f 73 65 0a 2a 2a 20 74 68  ds - those.** th
3090: 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 70 72  at consist of pr
30a0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
30b0: 20 6f 6e 6c 79 20 28 63 72 65 61 74 65 64 20 77   only (created w
30c0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 73  hen the user ins
30d0: 65 72 74 73 0a 2a 2a 20 61 20 6e 65 77 20 72 65  erts.** a new re
30e0: 63 6f 72 64 29 20 61 6e 64 20 74 68 6f 73 65 20  cord) and those 
30f0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
3100: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
3110: 76 61 6c 75 65 73 20 61 6e 64 20 74 68 65 0a 2a  values and the.*
3120: 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * original value
3130: 73 20 6f 66 20 6f 74 68 65 72 20 74 61 62 6c 65  s of other table
3140: 20 63 6f 6c 75 6d 6e 73 20 28 63 72 65 61 74 65   columns (create
3150: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 73  d when the users
3160: 20 64 65 6c 65 74 65 73 0a 2a 2a 20 6f 72 20 75   deletes.** or u
3170: 70 64 61 74 65 73 20 61 20 72 65 63 6f 72 64 29  pdates a record)
3180: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
3190: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31a0: 6c 6c 65 64 2c 20 74 68 65 20 72 65 71 75 65 73  lled, the reques
31b0: 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69 73  ted changeset is
31c0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a   created using.*
31d0: 2a 20 62 6f 74 68 20 74 68 65 20 61 63 63 75 6d  * both the accum
31e0: 75 6c 61 74 65 64 20 72 65 63 6f 72 64 73 20 61  ulated records a
31f0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
3200: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
3210: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
3220: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a   Specifically:.*
3230: 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c  *.** <ul>.**   <
3240: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63  li> For each rec
3250: 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79  ord generated by
3260: 20 61 6e 20 69 6e 73 65 72 74 2c 20 74 68 65 20   an insert, the 
3270: 64 61 74 61 62 61 73 65 20 69 73 20 71 75 65 72  database is quer
3280: 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ied.**        fo
3290: 72 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 6d  r a row with a m
32a0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
32b0: 6b 65 79 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  key. If one is f
32c0: 6f 75 6e 64 2c 20 61 6e 20 49 4e 53 45 52 54 0a  ound, an INSERT.
32d0: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
32e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
32f0: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 6e   changeset. If n
3300: 6f 20 73 75 63 68 20 72 6f 77 20 69 73 20 66 6f  o such row is fo
3310: 75 6e 64 2c 20 6e 6f 20 63 68 61 6e 67 65 20 0a  und, no change .
3320: 2a 2a 20 20 20 20 20 20 20 20 69 73 20 61 64 64  **        is add
3330: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
3340: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69  set..**.**   <li
3350: 3e 20 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72  > For each recor
3360: 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  d generated by a
3370: 6e 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  n update or dele
3380: 74 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  te, the database
3390: 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 71   is .**        q
33a0: 75 65 72 69 65 64 20 66 6f 72 20 61 20 72 6f 77  ueried for a row
33b0: 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
33c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
33d0: 20 73 75 63 68 20 61 20 72 6f 77 20 69 73 0a 2a   such a row is.*
33e0: 2a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 61  *        found a
33f0: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
3400: 66 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72  f the non-primar
3410: 79 20 6b 65 79 20 66 69 65 6c 64 73 20 68 61 76  y key fields hav
3420: 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e been.**       
3430: 20 6d 6f 64 69 66 69 65 64 20 66 72 6f 6d 20 74   modified from t
3440: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61  heir original va
3450: 6c 75 65 73 2c 20 61 6e 20 55 50 44 41 54 45 20  lues, an UPDATE 
3460: 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20  change is added 
3470: 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  to .**        th
3480: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 4f 72 2c  e changeset. Or,
3490: 20 69 66 20 6e 6f 20 73 75 63 68 20 72 6f 77 20   if no such row 
34a0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
34b0: 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45 20  table, a DELETE 
34c0: 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67  .**        chang
34d0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20  e changeset. If 
34f0: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 77  there is a row w
3500: 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
3510: 2a 20 20 20 20 20 20 20 20 70 72 69 6d 61 72 79  *        primary
3520: 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
3530: 62 61 73 65 2c 20 62 75 74 20 61 6c 6c 20 66 69  base, but all fi
3540: 65 6c 64 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  elds contain the
3550: 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  ir original.**  
3560: 20 20 20 20 20 20 76 61 6c 75 65 73 2c 20 6e 6f        values, no
3570: 20 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64   change is added
3580: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65   to the changese
3590: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
35a0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 2c 20 61 6d  * This means, am
35b0: 6f 6e 67 73 74 20 6f 74 68 65 72 20 74 68 69 6e  ongst other thin
35c0: 67 73 2c 20 74 68 61 74 20 69 66 20 61 20 72 6f  gs, that if a ro
35d0: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  w is inserted an
35e0: 64 20 74 68 65 6e 20 6c 61 74 65 72 0a 2a 2a 20  d then later.** 
35f0: 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 61 20  deleted while a 
3600: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
3610: 73 20 61 63 74 69 76 65 2c 20 6e 65 69 74 68 65  s active, neithe
3620: 72 20 74 68 65 20 69 6e 73 65 72 74 20 6e 6f 72  r the insert nor
3630: 20 74 68 65 20 64 65 6c 65 74 65 0a 2a 2a 20 77   the delete.** w
3640: 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20 69  ill be present i
3650: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
3660: 20 4f 72 20 69 66 20 61 20 72 6f 77 20 69 73 20   Or if a row is 
3670: 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 6e  deleted and then
3680: 20 6c 61 74 65 72 20 61 20 0a 2a 2a 20 72 6f 77   later a .** row
3690: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
36a0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
36b0: 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c 65  s inserted while
36c0: 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63   a session objec
36d0: 74 20 69 73 0a 2a 2a 20 61 63 74 69 76 65 2c 20  t is.** active, 
36e0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63 68  the resulting ch
36f0: 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63 6f 6e  angeset will con
3700: 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45 20 63  tain an UPDATE c
3710: 68 61 6e 67 65 20 69 6e 73 74 65 61 64 20 6f 66  hange instead of
3720: 0a 2a 2a 20 61 20 44 45 4c 45 54 45 20 61 6e 64  .** a DELETE and
3730: 20 61 6e 20 49 4e 53 45 52 54 2e 0a 2a 2a 0a 2a   an INSERT..**.*
3740: 2a 20 57 68 65 6e 20 61 20 73 65 73 73 69 6f 6e  * When a session
3750: 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73 61 62   object is disab
3760: 6c 65 64 20 28 73 65 65 20 74 68 65 20 5b 73 71  led (see the [sq
3770: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61  lite3session_ena
3780: 62 6c 65 28 29 5d 20 41 50 49 29 2c 0a 2a 2a 20  ble()] API),.** 
3790: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 63 63 75  it does not accu
37a0: 6d 75 6c 61 74 65 20 72 65 63 6f 72 64 73 20 77  mulate records w
37b0: 68 65 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73  hen rows are ins
37c0: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
37d0: 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 54 68  r deleted..** Th
37e0: 69 73 20 6d 61 79 20 61 70 70 65 61 72 20 74 6f  is may appear to
37f0: 20 68 61 76 65 20 73 6f 6d 65 20 63 6f 75 6e 74   have some count
3800: 65 72 2d 69 6e 74 75 69 74 69 76 65 20 65 66 66  er-intuitive eff
3810: 65 63 74 73 20 69 66 20 61 20 73 69 6e 67 6c 65  ects if a single
3820: 20 72 6f 77 0a 2a 2a 20 69 73 20 77 72 69 74 74   row.** is writt
3830: 65 6e 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20  en to more than 
3840: 6f 6e 63 65 20 64 75 72 69 6e 67 20 61 20 73 65  once during a se
3850: 73 73 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70  ssion. For examp
3860: 6c 65 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a 20  le, if a row.** 
3870: 69 73 20 69 6e 73 65 72 74 65 64 20 77 68 69 6c  is inserted whil
3880: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
3890: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ct is enabled, t
38a0: 68 65 6e 20 6c 61 74 65 72 20 64 65 6c 65 74 65  hen later delete
38b0: 64 20 77 68 69 6c 65 20 0a 2a 2a 20 74 68 65 20  d while .** the 
38c0: 73 61 6d 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a  same session obj
38d0: 65 63 74 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ect is disabled,
38e0: 20 6e 6f 20 49 4e 53 45 52 54 20 72 65 63 6f 72   no INSERT recor
38f0: 64 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  d will appear in
3900: 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65   the.** changese
3910: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
3920: 68 65 20 64 65 6c 65 74 65 20 74 6f 6f 6b 20 70  he delete took p
3930: 6c 61 63 65 20 77 68 69 6c 65 20 74 68 65 20 73  lace while the s
3940: 65 73 73 69 6f 6e 20 77 61 73 20 64 69 73 61 62  ession was disab
3950: 6c 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  led..** Or, if o
3960: 6e 65 20 66 69 65 6c 64 20 6f 66 20 61 20 72 6f  ne field of a ro
3970: 77 20 69 73 20 75 70 64 61 74 65 64 20 77 68 69  w is updated whi
3980: 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 69 73 20  le a session is 
3990: 64 69 73 61 62 6c 65 64 2c 20 61 6e 64 20 0a 2a  disabled, and .*
39a0: 2a 20 61 6e 6f 74 68 65 72 20 66 69 65 6c 64 20  * another field 
39b0: 6f 66 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20  of the same row 
39c0: 69 73 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  is updated while
39d0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
39e0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 0a 2a 2a 20  enabled, the.** 
39f0: 72 65 73 75 6c 74 69 6e 67 20 63 68 61 6e 67 65  resulting change
3a00: 73 65 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  set will contain
3a10: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
3a20: 65 20 74 68 61 74 20 75 70 64 61 74 65 73 20 62  e that updates b
3a30: 6f 74 68 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 69  oth fields..*/.i
3a40: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
3a50: 6e 5f 63 68 61 6e 67 65 73 65 74 28 0a 20 20 73  n_changeset(.  s
3a60: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
3a70: 70 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f  pSession,      /
3a80: 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  * Session object
3a90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
3aa0: 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20  ngeset,         
3ab0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
3ac0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20  ze of buffer at 
3ad0: 2a 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a  *ppChangeset */.
3ae0: 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67    void **ppChang
3af0: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
3b00: 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72    /* OUT: Buffer
3b10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
3b20: 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  geset */.);../*.
3b30: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4c 6f 61  ** CAPI3REF: Loa
3b40: 64 20 54 68 65 20 44 69 66 66 65 72 65 6e 63 65  d The Difference
3b50: 20 42 65 74 77 65 65 6e 20 54 61 62 6c 65 73 20   Between Tables 
3b60: 49 6e 74 6f 20 41 20 53 65 73 73 69 6f 6e 0a 2a  Into A Session.*
3b70: 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69 74 65  * METHOD: sqlite
3b80: 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20  3_session.**.** 
3b90: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
3ba0: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
3bb0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a   the session obj
3bc0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
3bd0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
3be0: 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
3bf0: 6f 6e 20 61 74 74 61 63 68 65 73 20 74 61 62 6c  on attaches tabl
3c00: 65 20 7a 54 62 6c 20 69 6e 20 74 68 65 20 73 61  e zTbl in the sa
3c10: 6d 65 20 6d 61 6e 6e 65 72 20 61 73 20 74 68 65  me manner as the
3c20: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73  .** [sqlite3sess
3c30: 69 6f 6e 5f 61 74 74 61 63 68 28 29 5d 20 66 75  ion_attach()] fu
3c40: 6e 63 74 69 6f 6e 2e 20 49 66 20 7a 54 62 6c 20  nction. If zTbl 
3c50: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
3c60: 6f 72 20 69 66 20 69 74 0a 2a 2a 20 64 6f 65 73  or if it.** does
3c70: 20 6e 6f 74 20 68 61 76 65 20 61 20 70 72 69 6d   not have a prim
3c80: 61 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75  ary key, this fu
3c90: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
3ca0: 70 20 28 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  p (but does not 
3cb0: 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 65 72 72  return.** an err
3cc0: 6f 72 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  or)..**.** Argum
3cd0: 65 6e 74 20 7a 46 72 6f 6d 44 62 20 6d 75 73 74  ent zFromDb must
3ce0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
3cf0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
3d00: 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
3d10: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
3d20: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
3d30: 65 20 68 61 6e 64 6c 65 20 61 73 20 74 68 65 20  e handle as the 
3d40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  hat contains .**
3d60: 20 61 20 74 61 62 6c 65 20 63 6f 6d 70 61 74 69   a table compati
3d70: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ble with the tab
3d80: 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  le attached to t
3d90: 68 65 20 73 65 73 73 69 6f 6e 20 62 79 20 74 68  he session by th
3da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
3db0: 41 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 69  A table is consi
3dc0: 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65  dered compatible
3dd0: 20 69 66 20 69 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75   if it:.**.** <u
3de0: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73  l>.**   <li> Has
3df0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 0a   the same name,.
3e00: 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68  **   <li> Has th
3e10: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f  e same set of co
3e20: 6c 75 6d 6e 73 20 64 65 63 6c 61 72 65 64 20 69  lumns declared i
3e30: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
3e40: 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20  , and.**   <li> 
3e50: 48 61 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  Has the same PRI
3e60: 4d 41 52 59 20 4b 45 59 20 64 65 66 69 6e 69 74  MARY KEY definit
3e70: 69 6f 6e 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  ion..** </ul>.**
3e80: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
3e90: 73 20 61 72 65 20 6e 6f 74 20 63 6f 6d 70 61 74  s are not compat
3ea0: 69 62 6c 65 2c 20 53 51 4c 49 54 45 5f 53 43 48  ible, SQLITE_SCH
3eb0: 45 4d 41 20 69 73 20 72 65 74 75 72 6e 65 64 2e  EMA is returned.
3ec0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 73 0a 2a   If the tables.*
3ed0: 2a 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  * are compatible
3ee0: 20 62 75 74 20 64 6f 20 6e 6f 74 20 68 61 76 65   but do not have
3ef0: 20 61 6e 79 20 50 52 49 4d 41 52 59 20 4b 45 59   any PRIMARY KEY
3f00: 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 69 73 20   columns, it is 
3f10: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  not an error.** 
3f20: 62 75 74 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  but no changes a
3f30: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
3f40: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20  session object. 
3f50: 41 73 20 77 69 74 68 20 6f 74 68 65 72 20 73 65  As with other se
3f60: 73 73 69 6f 6e 0a 2a 2a 20 41 50 49 73 2c 20 74  ssion.** APIs, t
3f70: 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 50 52  ables without PR
3f80: 49 4d 41 52 59 20 4b 45 59 73 20 61 72 65 20 73  IMARY KEYs are s
3f90: 69 6d 70 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a  imply ignored..*
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 61 64 64 73 20 61 20 73 65 74 20 6f 66  on adds a set of
3fc0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3fd0: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
3fe0: 68 61 74 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  hat could be.** 
3ff0: 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  used to update t
4000: 68 65 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  he table in data
4010: 62 61 73 65 20 7a 46 72 6f 6d 20 28 63 61 6c 6c  base zFrom (call
4020: 20 74 68 69 73 20 74 68 65 20 22 66 72 6f 6d 2d   this the "from-
4030: 74 61 62 6c 65 22 29 20 0a 2a 2a 20 73 6f 20 74  table") .** so t
4040: 68 61 74 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hat its content 
4050: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
4060: 68 65 20 74 61 62 6c 65 20 61 74 74 61 63 68 65  he table attache
4070: 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e  d to the session
4080: 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 28 63 61 6c   .** object (cal
4090: 6c 20 74 68 69 73 20 74 68 65 20 22 74 6f 2d 74  l this the "to-t
40a0: 61 62 6c 65 22 29 2e 20 53 70 65 63 69 66 69 63  able"). Specific
40b0: 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  ally:.**.** <ul>
40c0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65  .**   <li> For e
40d0: 61 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79  ach row (primary
40e0: 20 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74   key) that exist
40f0: 73 20 69 6e 20 74 68 65 20 74 6f 2d 74 61 62 6c  s in the to-tabl
4100: 65 20 62 75 74 20 6e 6f 74 20 69 6e 20 0a 2a 2a  e but not in .**
4110: 20 20 20 20 20 74 68 65 20 66 72 6f 6d 2d 74 61       the from-ta
4120: 62 6c 65 2c 20 61 6e 20 49 4e 53 45 52 54 20 72  ble, an INSERT r
4130: 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74  ecord is added t
4140: 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  o the session ob
4150: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c  ject..**.**   <l
4160: 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  i> For each row 
4170: 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68  (primary key) th
4180: 61 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  at exists in the
4190: 20 74 6f 2d 74 61 62 6c 65 20 62 75 74 20 6e 6f   to-table but no
41a0: 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20 74 68 65  t in .**     the
41b0: 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20 61 20 44   from-table, a D
41c0: 45 4c 45 54 45 20 72 65 63 6f 72 64 20 69 73 20  ELETE record is 
41d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 73  added to the ses
41e0: 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  sion object..**.
41f0: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
4200: 63 68 20 72 6f 77 20 28 70 72 69 6d 61 72 79 20  ch row (primary 
4210: 6b 65 79 29 20 74 68 61 74 20 65 78 69 73 74 73  key) that exists
4220: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 2c   in both tables,
4230: 20 62 75 74 20 66 65 61 74 75 72 65 73 20 0a 2a   but features .*
4240: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
4250: 6e 6f 6e 2d 50 4b 20 76 61 6c 75 65 73 20 69 6e  non-PK values in
4260: 20 65 61 63 68 2c 20 61 6e 20 55 50 44 41 54 45   each, an UPDATE
4270: 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
4280: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   to the.**     s
4290: 65 73 73 69 6f 6e 2e 20 20 0a 2a 2a 20 3c 2f 75  ession.  .** </u
42a0: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6c 61 72  l>.**.** To clar
42b0: 69 66 79 2c 20 69 66 20 74 68 69 73 20 66 75 6e  ify, if this fun
42c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
42d0: 61 6e 64 20 74 68 65 6e 20 61 20 63 68 61 6e 67  and then a chang
42e0: 65 73 65 74 20 63 6f 6e 73 74 72 75 63 74 65 64  eset constructed
42f0: 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71 6c 69 74  .** using [sqlit
4300: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
4310: 73 65 74 28 29 5d 2c 20 74 68 65 6e 20 61 66 74  set()], then aft
4320: 65 72 20 61 70 70 6c 79 69 6e 67 20 74 68 61 74  er applying that
4330: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 0a 2a   changeset to .*
4340: 2a 20 64 61 74 61 62 61 73 65 20 7a 46 72 6f 6d  * database zFrom
4350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4360: 20 74 68 65 20 74 77 6f 20 63 6f 6d 70 61 74 69   the two compati
4370: 62 6c 65 20 74 61 62 6c 65 73 20 77 6f 75 6c 64  ble tables would
4380: 20 62 65 20 0a 2a 2a 20 69 64 65 6e 74 69 63 61   be .** identica
4390: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 61 6e 20 65  l..**.** It an e
43a0: 72 72 6f 72 20 69 66 20 64 61 74 61 62 61 73 65  rror if database
43b0: 20 7a 46 72 6f 6d 20 64 6f 65 73 20 6e 6f 74 20   zFrom does not 
43c0: 65 78 69 73 74 20 6f 72 20 64 6f 65 73 20 6e 6f  exist or does no
43d0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  t contain the.**
43e0: 20 72 65 71 75 69 72 65 64 20 63 6f 6d 70 61 74   required compat
43f0: 69 62 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ible table..**.*
4400: 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
4410: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  on successful, S
4420: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
4430: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
4440: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
4450: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
4460: 73 20 63 61 73 65 2c 20 69 66 20 61 72 67 75 6d  s case, if argum
4470: 65 6e 74 20 70 7a 45 72 72 4d 73 67 20 69 73 20  ent pzErrMsg is 
4480: 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 7a 45 72 72  not NULL, *pzErr
4490: 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65  Msg.** may be se
44a0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
44b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
44c0: 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  g an English lan
44d0: 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20  guage error .** 
44e0: 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
44f0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
4500: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
4510: 74 6f 20 66 72 65 65 20 74 68 69 73 20 62 75 66  to free this buf
4520: 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  fer using.** sql
4530: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
4540: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
4550: 6f 6e 5f 64 69 66 66 28 0a 20 20 73 71 6c 69 74  on_diff(.  sqlit
4560: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73  e3_session *pSes
4570: 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68  sion,.  const ch
4580: 61 72 20 2a 7a 46 72 6f 6d 44 62 2c 0a 20 20 63  ar *zFromDb,.  c
4590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
45a0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
45b0: 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41  sg.);.../*.** CA
45c0: 50 49 33 52 45 46 3a 20 47 65 6e 65 72 61 74 65  PI3REF: Generate
45d0: 20 41 20 50 61 74 63 68 73 65 74 20 46 72 6f 6d   A Patchset From
45e0: 20 41 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63   A Session Objec
45f0: 74 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c  t.** METHOD: sql
4600: 69 74 65 33 5f 73 65 73 73 69 6f 6e 0a 2a 2a 0a  ite3_session.**.
4610: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
4620: 65 73 20 62 65 74 77 65 65 6e 20 61 20 70 61 74  es between a pat
4630: 63 68 73 65 74 20 61 6e 64 20 61 20 63 68 61 6e  chset and a chan
4640: 67 65 73 65 74 20 61 72 65 20 74 68 61 74 3a 0a  geset are that:.
4650: 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20  **.** <ul>.**   
4660: 3c 6c 69 3e 20 44 45 4c 45 54 45 20 72 65 63 6f  <li> DELETE reco
4670: 72 64 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 74  rds consist of t
4680: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66  he primary key f
4690: 69 65 6c 64 73 20 6f 6e 6c 79 2e 20 54 68 65 20  ields only. The 
46a0: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 69 67 69  .**        origi
46b0: 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 6f 74  nal values of ot
46c0: 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 6f  her fields are o
46d0: 6d 69 74 74 65 64 2e 0a 2a 2a 20 20 20 3c 6c 69  mitted..**   <li
46e0: 3e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76  > The original v
46f0: 61 6c 75 65 73 20 6f 66 20 61 6e 79 20 6d 6f 64  alues of any mod
4700: 69 66 69 65 64 20 66 69 65 6c 64 73 20 61 72 65  ified fields are
4710: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 0a 2a   omitted from .*
4720: 2a 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20  *        UPDATE 
4730: 72 65 63 6f 72 64 73 2e 0a 2a 2a 20 3c 2f 75 6c  records..** </ul
4740: 3e 0a 2a 2a 0a 2a 2a 20 41 20 70 61 74 63 68 73  >.**.** A patchs
4750: 65 74 20 62 6c 6f 62 20 6d 61 79 20 62 65 20 75  et blob may be u
4760: 73 65 64 20 77 69 74 68 20 75 70 20 74 6f 20 64  sed with up to d
4770: 61 74 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ate versions of 
4780: 61 6c 6c 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63  all .** sqlite3c
4790: 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41 50 49  hangeset_xxx API
47a0: 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 63 65 70   functions excep
47b0: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 63 68 61  t for sqlite3cha
47c0: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 29 2c  ngeset_invert(),
47d0: 20 0a 2a 2a 20 77 68 69 63 68 20 72 65 74 75 72   .** which retur
47e0: 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
47f0: 54 20 69 66 20 69 74 20 69 73 20 70 61 73 73 65  T if it is passe
4800: 64 20 61 20 70 61 74 63 68 73 65 74 2e 20 53 69  d a patchset. Si
4810: 6d 69 6c 61 72 6c 79 2c 0a 2a 2a 20 61 74 74 65  milarly,.** atte
4820: 6d 70 74 69 6e 67 20 74 6f 20 75 73 65 20 61 20  mpting to use a 
4830: 70 61 74 63 68 73 65 74 20 62 6c 6f 62 20 77 69  patchset blob wi
4840: 74 68 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20  th old versions 
4850: 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
4860: 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78 20 41  3changeset_xxx A
4870: 50 49 73 20 61 6c 73 6f 20 70 72 6f 76 6f 6b 65  PIs also provoke
4880: 73 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  s an SQLITE_CORR
4890: 55 50 54 20 65 72 72 6f 72 2e 20 0a 2a 2a 0a 2a  UPT error. .**.*
48a0: 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 6e 6f  * Because the no
48b0: 6e 2d 70 72 69 6d 61 72 79 20 6b 65 79 20 22 6f  n-primary key "o
48c0: 6c 64 2e 2a 22 20 66 69 65 6c 64 73 20 61 72 65  ld.*" fields are
48d0: 20 6f 6d 69 74 74 65 64 2c 20 6e 6f 20 0a 2a 2a   omitted, no .**
48e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
48f0: 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 73  T_DATA conflicts
4900: 20 63 61 6e 20 62 65 20 64 65 74 65 63 74 65 64   can be detected
4910: 20 6f 72 20 72 65 70 6f 72 74 65 64 20 69 66 20   or reported if 
4920: 61 20 70 61 74 63 68 73 65 74 0a 2a 2a 20 69 73  a patchset.** is
4930: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
4940: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4950: 61 70 70 6c 79 28 29 20 41 50 49 2e 20 4f 74 68  apply() API. Oth
4960: 65 72 20 63 6f 6e 66 6c 69 63 74 20 74 79 70 65  er conflict type
4970: 73 20 77 6f 72 6b 0a 2a 2a 20 69 6e 20 74 68 65  s work.** in the
4980: 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
4990: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 2a 2a 0a   changesets..**.
49a0: 2a 2a 20 43 68 61 6e 67 65 73 20 77 69 74 68 69  ** Changes withi
49b0: 6e 20 61 20 70 61 74 63 68 73 65 74 20 61 72 65  n a patchset are
49c0: 20 6f 72 64 65 72 65 64 20 69 6e 20 74 68 65 20   ordered in the 
49d0: 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72 20  same way as for 
49e0: 63 68 61 6e 67 65 73 65 74 73 0a 2a 2a 20 67 65  changesets.** ge
49f0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73  nerated by the s
4a00: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4a10: 61 6e 67 65 73 65 74 28 29 20 66 75 6e 63 74 69  angeset() functi
4a20: 6f 6e 20 28 69 2e 65 2e 20 61 6c 6c 20 63 68 61  on (i.e. all cha
4a30: 6e 67 65 73 20 66 6f 72 0a 2a 2a 20 61 20 73 69  nges for.** a si
4a40: 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67  ngle table are g
4a50: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2c  rouped together,
4a60: 20 74 61 62 6c 65 73 20 61 70 70 65 61 72 20 69   tables appear i
4a70: 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
4a80: 68 69 63 68 0a 2a 2a 20 74 68 65 79 20 77 65 72  hich.** they wer
4a90: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
4aa0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
4ab0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
4ac0: 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
4ad0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  t(.  sqlite3_ses
4ae0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
4af0: 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20       /* Session 
4b00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
4b10: 2a 70 6e 50 61 74 63 68 73 65 74 2c 20 20 20 20  *pnPatchset,    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4b30: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
4b40: 65 72 20 61 74 20 2a 70 70 50 61 74 63 68 73 65  er at *ppPatchse
4b50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
4b60: 50 61 74 63 68 73 65 74 20 20 20 20 20 20 20 20  Patchset        
4b70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
4b80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4b90: 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 29 3b 0a   patchset */.);.
4ba0: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
4bb0: 20 54 65 73 74 20 69 66 20 61 20 63 68 61 6e 67   Test if a chang
4bc0: 65 73 65 74 20 68 61 73 20 72 65 63 6f 72 64 65  eset has recorde
4bd0: 64 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 0a 2a  d any changes..*
4be0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
4bf0: 7a 65 72 6f 20 69 66 20 6e 6f 20 63 68 61 6e 67  zero if no chang
4c00: 65 73 20 74 6f 20 61 74 74 61 63 68 65 64 20 74  es to attached t
4c10: 61 62 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20  ables have been 
4c20: 72 65 63 6f 72 64 65 64 20 62 79 20 0a 2a 2a 20  recorded by .** 
4c30: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
4c40: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4c50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4c60: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6f   Otherwise, if o
4c70: 6e 65 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 63  ne or .** more c
4c80: 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
4c90: 20 72 65 63 6f 72 64 65 64 2c 20 72 65 74 75 72   recorded, retur
4ca0: 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 76  n zero..**.** Ev
4cb0: 65 6e 20 69 66 20 74 68 69 73 20 66 75 6e 63 74  en if this funct
4cc0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
4cd0: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
4ce0: 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 0a 2a 2a   that calling.**
4cf0: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
4d00: 5f 63 68 61 6e 67 65 73 65 74 28 29 5d 20 6f 6e  _changeset()] on
4d10: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 68 61 6e   the session han
4d20: 64 6c 65 20 6d 61 79 20 73 74 69 6c 6c 20 72 65  dle may still re
4d30: 74 75 72 6e 20 61 0a 2a 2a 20 63 68 61 6e 67 65  turn a.** change
4d40: 73 65 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  set that contain
4d50: 73 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 54 68  s no changes. Th
4d60: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 68  is can happen wh
4d70: 65 6e 20 61 20 72 6f 77 20 69 6e 20 0a 2a 2a 20  en a row in .** 
4d80: 61 6e 20 61 74 74 61 63 68 65 64 20 74 61 62 6c  an attached tabl
4d90: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 6e  e is modified an
4da0: 64 20 74 68 65 6e 20 6c 61 74 65 72 20 6f 6e 20  d then later on 
4db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  the original val
4dc0: 75 65 73 20 0a 2a 2a 20 61 72 65 20 72 65 73 74  ues .** are rest
4dd0: 6f 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  ored. However, i
4de0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
4df0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
4e00: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
4e10: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
4e20: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
4e30: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
4e40: 65 74 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  et() will return
4e50: 20 61 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74   a .** changeset
4e60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
4e70: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 69 6e 74   changes..*/.int
4e80: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
4e90: 69 73 65 6d 70 74 79 28 73 71 6c 69 74 65 33 5f  isempty(sqlite3_
4ea0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
4eb0: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  n);../*.** CAPI3
4ec0: 52 45 46 3a 20 43 72 65 61 74 65 20 41 6e 20 49  REF: Create An I
4ed0: 74 65 72 61 74 6f 72 20 54 6f 20 54 72 61 76 65  terator To Trave
4ee0: 72 73 65 20 41 20 43 68 61 6e 67 65 73 65 74 20  rse A Changeset 
4ef0: 0a 2a 2a 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a  .** CONSTRUCTOR:
4f00: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
4f10: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 43 72  et_iter.**.** Cr
4f20: 65 61 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72  eate an iterator
4f30: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
4f40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
4f50: 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67  tents of a chang
4f60: 65 73 65 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63  eset..** If succ
4f70: 65 73 73 66 75 6c 2c 20 2a 70 70 20 69 73 20 73  essful, *pp is s
4f80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
4f90: 68 65 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64  he iterator hand
4fa0: 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  le and SQLITE_OK
4fb0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
4fc0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4fd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4fe0: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 7a 65  *pp is set to ze
4ff0: 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a 20 53 51 4c  ro and an.** SQL
5000: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
5020: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5030: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
5040: 20 75 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65   used to advance
5050: 20 61 6e 64 20 71 75 65 72 79 20 61 20 63 68 61   and query a cha
5060: 6e 67 65 73 65 74 20 0a 2a 2a 20 69 74 65 72 61  ngeset .** itera
5070: 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 74  tor created by t
5080: 68 69 73 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a  his function:.**
5090: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
50a0: 69 3e 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  i> [sqlite3chang
50b0: 65 73 65 74 5f 6e 65 78 74 28 29 5d 0a 2a 2a 20  eset_next()].** 
50c0: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
50d0: 68 61 6e 67 65 73 65 74 5f 6f 70 28 29 5d 0a 2a  hangeset_op()].*
50e0: 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65  *   <li> [sqlite
50f0: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29  3changeset_new()
5100: 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c  ].**   <li> [sql
5110: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c  ite3changeset_ol
5120: 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  d()].** </ul>.**
5130: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
5140: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
5150: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
5160: 65 6e 74 75 61 6c 6c 79 20 64 65 73 74 72 6f 79  entually destroy
5170: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
5180: 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
5190: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
51a0: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2e  set_finalize()].
51b0: 20 54 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74   The buffer cont
51c0: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 68  aining the.** ch
51d0: 61 6e 67 65 73 65 74 20 28 70 43 68 61 6e 67 65  angeset (pChange
51e0: 73 65 74 29 20 6d 75 73 74 20 72 65 6d 61 69 6e  set) must remain
51f0: 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 61 66 74   valid until aft
5200: 65 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  er the iterator 
5210: 69 73 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  is.** destroyed.
5220: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
5230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 6c  the changeset bl
5240: 6f 62 20 77 61 73 20 63 72 65 61 74 65 64 20 62  ob was created b
5250: 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  y one of the.** 
5260: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
5270: 63 68 61 6e 67 65 73 65 74 28 29 5d 2c 20 5b 73  changeset()], [s
5280: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5290: 63 6f 6e 63 61 74 28 29 5d 20 6f 72 0a 2a 2a 20  concat()] or.** 
52a0: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
52b0: 74 5f 69 6e 76 65 72 74 28 29 5d 20 66 75 6e 63  t_invert()] func
52c0: 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68 61 6e 67  tions, all chang
52d0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  es within the ch
52e0: 61 6e 67 65 73 65 74 20 0a 2a 2a 20 74 68 61 74  angeset .** that
52f0: 20 61 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67   apply to a sing
5300: 6c 65 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f  le table are gro
5310: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 54  uped together. T
5320: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
5330: 68 65 6e 20 0a 2a 2a 20 61 6e 20 61 70 70 6c 69  hen .** an appli
5340: 63 61 74 69 6f 6e 20 69 74 65 72 61 74 65 73 20  cation iterates 
5350: 74 68 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65  through a change
5360: 73 65 74 20 75 73 69 6e 67 20 61 6e 20 69 74 65  set using an ite
5370: 72 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79  rator created by
5380: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
5390: 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  on, all changes 
53a0: 74 68 61 74 20 72 65 6c 61 74 65 20 74 6f 20 61  that relate to a
53b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72   single table ar
53c0: 65 20 76 69 73 69 74 65 64 20 0a 2a 2a 20 63 6f  e visited .** co
53d0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 20 54 68 65  nsecutively. The
53e0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
53f0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
5400: 72 20 77 69 6c 6c 20 76 69 73 69 74 20 61 20 63  r will visit a c
5410: 68 61 6e 67 65 20 0a 2a 2a 20 74 68 65 20 61 70  hange .** the ap
5420: 70 6c 69 65 73 20 74 6f 20 74 61 62 6c 65 20 58  plies to table X
5430: 2c 20 74 68 65 6e 20 6f 6e 65 20 66 6f 72 20 74  , then one for t
5440: 61 62 6c 65 20 59 2c 20 61 6e 64 20 74 68 65 6e  able Y, and then
5450: 20 6c 61 74 65 72 20 6f 6e 20 76 69 73 69 74 20   later on visit 
5460: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 63 68 61 6e  .** another chan
5470: 67 65 20 66 6f 72 20 74 61 62 6c 65 20 58 2e 0a  ge for table X..
5480: 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  **.** The behavi
5490: 6f 72 20 6f 66 20 73 71 6c 69 74 65 33 63 68 61  or of sqlite3cha
54a0: 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 76 32 28  ngeset_start_v2(
54b0: 29 20 61 6e 64 20 69 74 73 20 73 74 72 65 61 6d  ) and its stream
54c0: 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a  ing equivalent.*
54d0: 2a 20 6d 61 79 20 62 65 20 6d 6f 64 69 66 69 65  * may be modifie
54e0: 64 20 62 79 20 70 61 73 73 69 6e 67 20 61 20 63  d by passing a c
54f0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
5500: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
5510: 45 54 53 54 41 52 54 5f 49 4e 56 45 52 54 20 7c  ETSTART_INVERT |
5520: 20 73 75 70 70 6f 72 74 65 64 20 66 6c 61 67 73   supported flags
5530: 5d 20 61 73 20 74 68 65 20 34 74 68 20 70 61 72  ] as the 4th par
5540: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ameter..**.** No
5550: 74 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  te that the sqli
5560: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
5570: 72 74 5f 76 32 28 29 20 41 50 49 20 69 73 20 73  rt_v2() API is s
5580: 74 69 6c 6c 20 3c 62 3e 65 78 70 65 72 69 6d 65  till <b>experime
5590: 6e 74 61 6c 3c 2f 62 3e 0a 2a 2a 20 61 6e 64 20  ntal</b>.** and 
55a0: 74 68 65 72 65 66 6f 72 65 20 73 75 62 6a 65 63  therefore subjec
55b0: 74 20 74 6f 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a  t to change..*/.
55c0: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
55d0: 65 73 65 74 5f 73 74 61 72 74 28 0a 20 20 73 71  eset_start(.  sq
55e0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
55f0: 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f 2a  iter **pp,    /*
5600: 20 4f 55 54 3a 20 4e 65 77 20 63 68 61 6e 67 65   OUT: New change
5610: 73 65 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e  set iterator han
5620: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  dle */.  int nCh
5630: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
5640: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5650: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 62 6c   of changeset bl
5660: 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ob in bytes */. 
5670: 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65   void *pChangese
5680: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
5690: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
56a0: 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  lob containing c
56b0: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 69  hangeset */.);.i
56c0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
56d0: 73 65 74 5f 73 74 61 72 74 5f 76 32 28 0a 20 20  set_start_v2(.  
56e0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
56f0: 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20  t_iter **pp,    
5700: 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63 68 61 6e  /* OUT: New chan
5710: 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 68  geset iterator h
5720: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
5730: 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20  Changeset,      
5740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5750: 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20  ze of changeset 
5760: 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f  blob in bytes */
5770: 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65  .  void *pChange
5780: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
5790: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
57a0: 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67   blob containing
57b0: 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20   changeset */.  
57c0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 2f 2a 20 53 45 53 53 49 4f 4e 5f 43 48 41 4e 47  /* SESSION_CHANG
57f0: 45 53 45 54 53 54 41 52 54 5f 2a 20 66 6c 61 67  ESETSTART_* flag
5800: 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.);../*.** C
5810: 41 50 49 33 52 45 46 3a 20 46 6c 61 67 73 20 66  API3REF: Flags f
5820: 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  or sqlite3change
5830: 73 65 74 5f 73 74 61 72 74 5f 76 32 0a 2a 2a 0a  set_start_v2.**.
5840: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
5850: 20 66 6c 61 67 73 20 6d 61 79 20 70 61 73 73 65   flags may passe
5860: 64 20 76 69 61 20 74 68 65 20 34 74 68 20 70 61  d via the 4th pa
5870: 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 5b 73  rameter to.** [s
5880: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5890: 73 74 61 72 74 5f 76 32 5d 20 61 6e 64 20 5b 73  start_v2] and [s
58a0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
58b0: 73 74 61 72 74 5f 76 32 5f 73 74 72 6d 5d 3a 0a  start_v2_strm]:.
58c0: 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  **.** <dt>SQLITE
58d0: 5f 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f  _CHANGESETAPPLY_
58e0: 49 4e 56 45 52 54 20 3c 64 64 3e 0a 2a 2a 20 20  INVERT <dd>.**  
58f0: 20 49 6e 76 65 72 74 20 74 68 65 20 63 68 61 6e   Invert the chan
5900: 67 65 73 65 74 20 77 68 69 6c 65 20 69 74 65 72  geset while iter
5910: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 74  ating through it
5920: 2e 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  . This is equiva
5930: 6c 65 6e 74 20 74 6f 0a 2a 2a 20 20 20 69 6e 76  lent to.**   inv
5940: 65 72 74 69 6e 67 20 61 20 63 68 61 6e 67 65 73  erting a changes
5950: 65 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  et using sqlite3
5960: 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74  changeset_invert
5970: 28 29 20 62 65 66 6f 72 65 20 61 70 70 6c 79 69  () before applyi
5980: 6e 67 20 69 74 2e 0a 2a 2a 20 20 20 49 74 20 69  ng it..**   It i
5990: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73 70  s an error to sp
59a0: 65 63 69 66 79 20 74 68 69 73 20 66 6c 61 67 20  ecify this flag 
59b0: 77 69 74 68 20 61 20 70 61 74 63 68 73 65 74 2e  with a patchset.
59c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
59d0: 54 45 5f 43 48 41 4e 47 45 53 45 54 53 54 41 52  TE_CHANGESETSTAR
59e0: 54 5f 49 4e 56 45 52 54 20 20 20 20 20 20 20 20  T_INVERT        
59f0: 30 78 30 30 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 43  0x0002.../*.** C
5a00: 41 50 49 33 52 45 46 3a 20 41 64 76 61 6e 63 65  API3REF: Advance
5a10: 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65   A Changeset Ite
5a20: 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a  rator.** METHOD:
5a30: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5a40: 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68  et_iter.**.** Th
5a50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
5a60: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
5a70: 68 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61  h iterators crea
5a80: 74 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a  ted by function.
5a90: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
5aa0: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49  eset_start()]. I
5ab0: 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 6f  f it is called o
5ac0: 6e 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  n an iterator pa
5ad0: 73 73 65 64 20 74 6f 0a 2a 2a 20 61 20 63 6f 6e  ssed to.** a con
5ae0: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61  flict-handler ca
5af0: 6c 6c 62 61 63 6b 20 62 79 20 5b 73 71 6c 69 74  llback by [sqlit
5b00: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
5b10: 79 28 29 5d 2c 20 53 51 4c 49 54 45 5f 4d 49 53  y()], SQLITE_MIS
5b20: 55 53 45 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  USE.** is return
5b30: 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  ed and the call 
5b40: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 2a  has no effect..*
5b50: 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
5b60: 20 61 66 74 65 72 20 61 6e 20 69 74 65 72 61 74   after an iterat
5b70: 6f 72 20 69 73 20 63 72 65 61 74 65 64 20 62 79  or is created by
5b80: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
5b90: 74 5f 73 74 61 72 74 28 29 2c 20 69 74 0a 2a 2a  t_start(), it.**
5ba0: 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
5bb0: 74 6f 20 61 6e 79 20 63 68 61 6e 67 65 20 69 6e  to any change in
5bc0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
5bd0: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 68 61  Assuming the cha
5be0: 6e 67 65 73 65 74 0a 2a 2a 20 69 73 20 6e 6f 74  ngeset.** is not
5bf0: 20 65 6d 70 74 79 2c 20 74 68 65 20 66 69 72 73   empty, the firs
5c00: 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  t call to this f
5c10: 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73  unction advances
5c20: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
5c30: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
5c40: 20 66 69 72 73 74 20 63 68 61 6e 67 65 20 69 6e   first change in
5c50: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
5c60: 45 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  Each subsequent 
5c70: 63 61 6c 6c 20 61 64 76 61 6e 63 65 73 0a 2a 2a  call advances.**
5c80: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
5c90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
5ca0: 78 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65  xt change in the
5cb0: 20 63 68 61 6e 67 65 73 65 74 20 28 69 66 20 61   changeset (if a
5cc0: 6e 79 29 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 72  ny). If.** no er
5cd0: 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
5ce0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
5cf0: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 63 68  ts to a valid ch
5d00: 61 6e 67 65 20 61 66 74 65 72 20 61 20 63 61 6c  ange after a cal
5d10: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 63  l.** to sqlite3c
5d20: 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20  hangeset_next() 
5d30: 68 61 73 20 61 64 76 61 6e 63 65 64 20 69 74 2c  has advanced it,
5d40: 20 53 51 4c 49 54 45 5f 52 4f 57 20 69 73 20 72   SQLITE_ROW is r
5d50: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
5d60: 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 63  erwise, if all c
5d70: 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68  hanges in the ch
5d80: 61 6e 67 65 73 65 74 20 68 61 76 65 20 61 6c 72  angeset have alr
5d90: 65 61 64 79 20 62 65 65 6e 20 76 69 73 69 74 65  eady been visite
5da0: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  d,.** SQLITE_DON
5db0: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E is returned..*
5dc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5dd0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
5de0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
5df0: 20 72 65 74 75 72 6e 65 64 2e 20 50 6f 73 73 69   returned. Possi
5e00: 62 6c 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ble error .** co
5e10: 64 65 73 20 69 6e 63 6c 75 64 65 20 53 51 4c 49  des include SQLI
5e20: 54 45 5f 43 4f 52 52 55 50 54 20 28 69 66 20 74  TE_CORRUPT (if t
5e30: 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 75 66  he changeset buf
5e40: 66 65 72 20 69 73 20 63 6f 72 72 75 70 74 29 20  fer is corrupt) 
5e50: 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
5e60: 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
5e70: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  te3changeset_nex
5e80: 74 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t(sqlite3_change
5e90: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 29  set_iter *pIter)
5ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
5eb0: 46 3a 20 4f 62 74 61 69 6e 20 54 68 65 20 43 75  F: Obtain The Cu
5ec0: 72 72 65 6e 74 20 4f 70 65 72 61 74 69 6f 6e 20  rrent Operation 
5ed0: 46 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74  From A Changeset
5ee0: 20 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54   Iterator.** MET
5ef0: 48 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61  HOD: sqlite3_cha
5f00: 6e 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a  ngeset_iter.**.*
5f10: 2a 20 54 68 65 20 70 49 74 65 72 20 61 72 67 75  * The pIter argu
5f20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
5f30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
5f40: 20 65 69 74 68 65 72 20 62 65 20 61 6e 20 69 74   either be an it
5f50: 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64  erator.** passed
5f60: 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   to a conflict-h
5f70: 61 6e 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74  andler by [sqlit
5f80: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
5f90: 79 28 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72  y()], or an iter
5fa0: 61 74 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20  ator.** created 
5fb0: 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  by [sqlite3chang
5fc0: 65 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49  eset_start()]. I
5fd0: 6e 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  n the latter cas
5fe0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  e, the most rece
5ff0: 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73  nt.** call to [s
6000: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
6010: 6e 65 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76  next()] must hav
6020: 65 20 72 65 74 75 72 6e 65 64 20 5b 53 51 4c 49  e returned [SQLI
6030: 54 45 5f 52 4f 57 5d 2e 20 49 66 20 74 68 69 73  TE_ROW]. If this
6040: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
6050: 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
6060: 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49  on returns [SQLI
6070: 54 45 5f 4d 49 53 55 53 45 5d 2e 0a 2a 2a 0a 2a  TE_MISUSE]..**.*
6080: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 7a  * If argument pz
6090: 54 61 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Tab is not NULL,
60a0: 20 74 68 65 6e 20 2a 70 7a 54 61 62 20 69 73 20   then *pzTab is 
60b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
60c0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
60d0: 74 65 64 20 75 74 66 2d 38 20 65 6e 63 6f 64 65  ted utf-8 encode
60e0: 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
60f0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
6100: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 61 66 66  the table.** aff
6110: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
6120: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 54 68 65  rent change. The
6130: 20 62 75 66 66 65 72 20 72 65 6d 61 69 6e 73 20   buffer remains 
6140: 76 61 6c 69 64 20 75 6e 74 69 6c 20 65 69 74 68  valid until eith
6150: 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68 61  er.** sqlite3cha
6160: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20 69 73  ngeset_next() is
6170: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 69   called on the i
6180: 74 65 72 61 74 6f 72 20 6f 72 20 75 6e 74 69 6c  terator or until
6190: 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 66 6c 69 63   the .** conflic
61a0: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
61b0: 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 20 70  on returns. If p
61c0: 6e 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nCol is not NULL
61d0: 2c 20 74 68 65 6e 20 2a 70 6e 43 6f 6c 20 69 73  , then *pnCol is
61e0: 20 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20   .** set to the 
61f0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6200: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  s in the table a
6210: 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20 63  ffected by the c
6220: 68 61 6e 67 65 2e 20 49 66 0a 2a 2a 20 70 62 49  hange. If.** pbI
6230: 6e 63 6f 72 72 65 63 74 20 69 73 20 6e 6f 74 20  ncorrect is not 
6240: 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 62 49 6e  NULL, then *pbIn
6250: 64 69 72 65 63 74 20 69 73 20 73 65 74 20 74 6f  direct is set to
6260: 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65   true (1) if the
6270: 20 63 68 61 6e 67 65 0a 2a 2a 20 69 73 20 61 6e   change.** is an
6280: 20 69 6e 64 69 72 65 63 74 20 63 68 61 6e 67 65   indirect change
6290: 2c 20 6f 72 20 66 61 6c 73 65 20 28 30 29 20 6f  , or false (0) o
62a0: 74 68 65 72 77 69 73 65 2e 20 53 65 65 20 74 68  therwise. See th
62b0: 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
62c0: 66 6f 72 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73  for.** [sqlite3s
62d0: 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28  ession_indirect(
62e0: 29 5d 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  )] for a descrip
62f0: 74 69 6f 6e 20 6f 66 20 64 69 72 65 63 74 20 61  tion of direct a
6300: 6e 64 20 69 6e 64 69 72 65 63 74 0a 2a 2a 20 63  nd indirect.** c
6310: 68 61 6e 67 65 73 2e 20 46 69 6e 61 6c 6c 79 2c  hanges. Finally,
6320: 20 69 66 20 70 4f 70 20 69 73 20 6e 6f 74 20 4e   if pOp is not N
6330: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 4f 70 20 69  ULL, then *pOp i
6340: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f 66 20  s set to one of 
6350: 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 49 4e 53 45  .** [SQLITE_INSE
6360: 52 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 44 45 4c  RT], [SQLITE_DEL
6370: 45 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ETE] or [SQLITE_
6380: 55 50 44 41 54 45 5d 2c 20 64 65 70 65 6e 64 69  UPDATE], dependi
6390: 6e 67 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 74 79  ng on the .** ty
63a0: 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68 61  pe of change tha
63b0: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
63c0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
63d0: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  to..**.** If no 
63e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
63f0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6400: 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
6410: 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 0a   does occur, an.
6420: 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
6430: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6440: 2e 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20  . The values of 
6450: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
6460: 62 6c 65 73 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  bles may not.** 
6470: 62 65 20 74 72 75 73 74 65 64 20 69 6e 20 74 68  be trusted in th
6480: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
6490: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
64a0: 5f 6f 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  _op(.  sqlite3_c
64b0: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
64c0: 49 74 65 72 2c 20 20 2f 2a 20 49 74 65 72 61 74  Iter,  /* Iterat
64d0: 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  or object */.  c
64e0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
64f0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
6500: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
6510: 6f 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  o table name */.
6520: 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20    int *pnCol,   
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
6550: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6560: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  able */.  int *p
6570: 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
6580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6590: 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  : SQLITE_INSERT,
65a0: 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
65b0: 45 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e  E */.  int *pbIn
65c0: 64 69 72 65 63 74 20 20 20 20 20 20 20 20 20 20  direct          
65d0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
65e0: 72 75 65 20 66 6f 72 20 61 6e 20 27 69 6e 64 69  rue for an 'indi
65f0: 72 65 63 74 27 20 63 68 61 6e 67 65 20 2a 2f 0a  rect' change */.
6600: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  );../*.** CAPI3R
6610: 45 46 3a 20 4f 62 74 61 69 6e 20 54 68 65 20 50  EF: Obtain The P
6620: 72 69 6d 61 72 79 20 4b 65 79 20 44 65 66 69 6e  rimary Key Defin
6630: 69 74 69 6f 6e 20 4f 66 20 41 20 54 61 62 6c 65  ition Of A Table
6640: 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20 73 71 6c 69  .** METHOD: sqli
6650: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
6660: 65 72 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  er.**.** For eac
6670: 68 20 6d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  h modified table
6680: 2c 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e  , a changeset in
6690: 63 6c 75 64 65 73 20 74 68 65 20 66 6f 6c 6c 6f  cludes the follo
66a0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  wing:.**.** <ul>
66b0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6e  .**   <li> The n
66c0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
66d0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61   in the table, a
66e0: 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 57 68 69  nd.**   <li> Whi
66f0: 63 68 20 6f 66 20 74 68 6f 73 65 20 63 6f 6c 75  ch of those colu
6700: 6d 6e 73 20 6d 61 6b 65 20 75 70 20 74 68 65 20  mns make up the 
6710: 74 61 62 6c 65 73 20 50 52 49 4d 41 52 59 20 4b  tables PRIMARY K
6720: 45 59 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  EY..** </ul>.**.
6730: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6740: 20 69 73 20 75 73 65 64 20 74 6f 20 66 69 6e 64   is used to find
6750: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 63   which columns c
6760: 6f 6d 70 72 69 73 65 20 74 68 65 20 50 52 49 4d  omprise the PRIM
6770: 41 52 59 20 4b 45 59 20 6f 66 0a 2a 2a 20 74 68  ARY KEY of.** th
6780: 65 20 74 61 62 6c 65 20 6d 6f 64 69 66 69 65 64  e table modified
6790: 20 62 79 20 74 68 65 20 63 68 61 6e 67 65 20 74   by the change t
67a0: 68 61 74 20 69 74 65 72 61 74 6f 72 20 70 49 74  hat iterator pIt
67b0: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
67c0: 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 20 73 75  nts to..** If su
67d0: 63 63 65 73 73 66 75 6c 2c 20 2a 70 61 62 50 4b  ccessful, *pabPK
67e0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
67f0: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
6800: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c 20 77 68  nCol entries, wh
6810: 65 72 65 0a 2a 2a 20 6e 43 6f 6c 20 69 73 20 74  ere.** nCol is t
6820: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
6830: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6840: 65 2e 20 45 6c 65 6d 65 6e 74 73 20 6f 66 20 2a  e. Elements of *
6850: 70 61 62 50 4b 20 61 72 65 20 73 65 74 20 74 6f  pabPK are set to
6860: 0a 2a 2a 20 30 78 30 31 20 69 66 20 74 68 65 20  .** 0x01 if the 
6870: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
6880: 6c 75 6d 6e 20 69 73 20 70 61 72 74 20 6f 66 20  lumn is part of 
6890: 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61  the tables prima
68a0: 72 79 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 30 78  ry key, or.** 0x
68b0: 30 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e  00 if it is not.
68c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
68d0: 6e 74 20 70 6e 43 6f 6c 20 69 73 20 6e 6f 74 20  nt pnCol is not 
68e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 43 6f  NULL, then *pnCo
68f0: 6c 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  l is set to the 
6900: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6910: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  s.** in the tabl
6920: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
6930: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6940: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 69 74 65  led when the ite
6950: 72 61 74 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70  rator does not p
6960: 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 0a  oint to a valid.
6970: 2a 2a 20 65 6e 74 72 79 2c 20 53 51 4c 49 54 45  ** entry, SQLITE
6980: 5f 4d 49 53 55 53 45 20 69 73 20 72 65 74 75 72  _MISUSE is retur
6990: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
69a0: 75 74 20 76 61 72 69 61 62 6c 65 73 20 7a 65 72  ut variables zer
69b0: 6f 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oed. Otherwise,.
69c0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
69d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
69e0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
69f0: 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20 64  s populated as d
6a00: 65 73 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76  escribed.** abov
6a10: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6a20: 33 63 68 61 6e 67 65 73 65 74 5f 70 6b 28 0a 20  3changeset_pk(. 
6a30: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
6a40: 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20  et_iter *pIter, 
6a50: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a   /* Iterator obj
6a60: 65 63 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ect */.  unsigne
6a70: 64 20 63 68 61 72 20 2a 2a 70 61 62 50 4b 2c 20  d char **pabPK, 
6a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
6a90: 20 41 72 72 61 79 20 6f 66 20 62 6f 6f 6c 65 61   Array of boolea
6aa0: 6e 20 2d 20 74 72 75 65 20 66 6f 72 20 50 4b 20  n - true for PK 
6ab0: 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cols */.  int *p
6ac0: 6e 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  nCol            
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
6ae0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  : Number of entr
6af0: 69 65 73 20 69 6e 20 6f 75 74 70 75 74 20 61 72  ies in output ar
6b00: 72 61 79 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ray */.);../*.**
6b10: 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69   CAPI3REF: Obtai
6b20: 6e 20 6f 6c 64 2e 2a 20 56 61 6c 75 65 73 20 46  n old.* Values F
6b30: 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20  rom A Changeset 
6b40: 49 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48  Iterator.** METH
6b50: 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  OD: sqlite3_chan
6b60: 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a  geset_iter.**.**
6b70: 20 54 68 65 20 70 49 74 65 72 20 61 72 67 75 6d   The pIter argum
6b80: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
6b90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
6ba0: 65 69 74 68 65 72 20 62 65 20 61 6e 20 69 74 65  either be an ite
6bb0: 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20  rator.** passed 
6bc0: 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61  to a conflict-ha
6bd0: 6e 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74 65  ndler by [sqlite
6be0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
6bf0: 28 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72 61  ()], or an itera
6c00: 74 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  tor.** created b
6c10: 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  y [sqlite3change
6c20: 73 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49 6e  set_start()]. In
6c30: 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
6c40: 2c 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  , the most recen
6c50: 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73 71  t.** call to [sq
6c60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
6c70: 65 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76 65  ext()] must have
6c80: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
6c90: 5f 52 4f 57 2e 20 0a 2a 2a 20 46 75 72 74 68 65  _ROW. .** Furthe
6ca0: 72 6d 6f 72 65 2c 20 69 74 20 6d 61 79 20 6f 6e  rmore, it may on
6cb0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
6cc0: 74 68 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e  the type of chan
6cd0: 67 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ge that the iter
6ce0: 61 74 6f 72 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  ator.** currentl
6cf0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 65  y points to is e
6d00: 69 74 68 65 72 20 5b 53 51 4c 49 54 45 5f 44 45  ither [SQLITE_DE
6d10: 4c 45 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45  LETE] or [SQLITE
6d20: 5f 55 50 44 41 54 45 5d 2e 20 4f 74 68 65 72 77  _UPDATE]. Otherw
6d30: 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ise,.** this fun
6d40: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53  ction returns [S
6d50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 61 6e  QLITE_MISUSE] an
6d60: 64 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20  d sets *ppValue 
6d70: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  to NULL..**.** A
6d80: 72 67 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73  rgument iVal mus
6d90: 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
6da0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c  n or equal to 0,
6db0: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74   and less than t
6dc0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
6dd0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
6de0: 61 62 6c 65 20 61 66 66 65 63 74 65 64 20 62 79  able affected by
6df0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
6e00: 6e 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  nge. Otherwise,.
6e10: 2a 2a 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45  ** [SQLITE_RANGE
6e20: 5d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ] is returned an
6e30: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
6e40: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
6e50: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
6e60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
6e70: 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70  ts *ppValue to p
6e80: 6f 69 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63  oint to a protec
6e90: 74 65 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ted.** sqlite3_v
6ea0: 61 6c 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74  alue object cont
6eb0: 61 69 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27  aining the iVal'
6ec0: 74 68 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  th value from th
6ed0: 65 20 76 65 63 74 6f 72 20 6f 66 20 0a 2a 2a 20  e vector of .** 
6ee0: 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c  original row val
6ef0: 75 65 73 20 73 74 6f 72 65 64 20 61 73 20 70 61  ues stored as pa
6f00: 72 74 20 6f 66 20 74 68 65 20 55 50 44 41 54 45  rt of the UPDATE
6f10: 20 6f 72 20 44 45 4c 45 54 45 20 63 68 61 6e 67   or DELETE chang
6f20: 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 73  e and.** returns
6f30: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
6f40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  name of the func
6f50: 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
6f60: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
6f70: 69 73 20 0a 2a 2a 20 69 73 20 73 69 6d 69 6c 61  is .** is simila
6f80: 72 20 74 6f 20 74 68 65 20 22 6f 6c 64 2e 2a 22  r to the "old.*"
6f90: 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62   columns availab
6fa0: 6c 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20  le to update or 
6fb0: 64 65 6c 65 74 65 20 74 72 69 67 67 65 72 73 2e  delete triggers.
6fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f  .**.** If some o
6fd0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
6fe0: 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63  s (e.g. an OOM c
6ff0: 6f 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51  ondition), an SQ
7000: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
7010: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
7020: 6e 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73  nd *ppValue is s
7030: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69  et to NULL..*/.i
7040: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
7050: 73 65 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69 74  set_old(.  sqlit
7060: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
7070: 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68  r *pIter,  /* Ch
7080: 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72  angeset iterator
7090: 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c 20   */.  int iVal, 
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
70c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
70d0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61  te3_value **ppVa
70e0: 6c 75 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  lue         /* O
70f0: 55 54 3a 20 4f 6c 64 20 76 61 6c 75 65 20 28 6f  UT: Old value (o
7100: 72 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 29 20  r NULL pointer) 
7110: 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  */.);../*.** CAP
7120: 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6e 65  I3REF: Obtain ne
7130: 77 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20  w.* Values From 
7140: 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72  A Changeset Iter
7150: 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44 3a 20  ator.** METHOD: 
7160: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
7170: 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54 68 65  t_iter.**.** The
7180: 20 70 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20   pIter argument 
7190: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
71a0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68  unction may eith
71b0: 65 72 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f  er be an iterato
71c0: 72 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  r.** passed to a
71d0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
71e0: 72 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  r by [sqlite3cha
71f0: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
7200: 20 6f 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a   or an iterator.
7210: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 5b 73  ** created by [s
7220: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7230: 73 74 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65  start()]. In the
7240: 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20 74 68   latter case, th
7250: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
7260: 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65   call to [sqlite
7270: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
7280: 29 5d 20 6d 75 73 74 20 68 61 76 65 20 72 65 74  )] must have ret
7290: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57  urned SQLITE_ROW
72a0: 2e 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  . .** Furthermor
72b0: 65 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62  e, it may only b
72c0: 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  e called if the 
72d0: 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65 20 74  type of change t
72e0: 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
72f0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
7300: 69 6e 74 73 20 74 6f 20 69 73 20 65 69 74 68 65  ints to is eithe
7310: 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54 45  r [SQLITE_UPDATE
7320: 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49 4e 53  ] or [SQLITE_INS
7330: 45 52 54 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERT]. Otherwise,
7340: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
7350: 6e 20 72 65 74 75 72 6e 73 20 5b 53 51 4c 49 54  n returns [SQLIT
7360: 45 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20 73 65  E_MISUSE] and se
7370: 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e  ts *ppValue to N
7380: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ULL..**.** Argum
7390: 65 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62 65  ent iVal must be
73a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
73b0: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64   equal to 0, and
73c0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e   less than the n
73d0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75  umber.** of colu
73e0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
73f0: 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65   affected by the
7400: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e   current change.
7410: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b   Otherwise,.** [
7420: 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69 73  SQLITE_RANGE] is
7430: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
7440: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
7450: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
7460: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
7470: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
7480: 70 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74  ppValue to point
7490: 20 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64 0a   to a protected.
74a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ** sqlite3_value
74b0: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   object containi
74c0: 6e 67 20 74 68 65 20 69 56 61 6c 27 74 68 20 76  ng the iVal'th v
74d0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 76 65  alue from the ve
74e0: 63 74 6f 72 20 6f 66 20 0a 2a 2a 20 6e 65 77 20  ctor of .** new 
74f0: 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65  row values store
7500: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
7510: 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 45 52   UPDATE or INSER
7520: 54 20 63 68 61 6e 67 65 20 61 6e 64 0a 2a 2a 20  T change and.** 
7530: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
7540: 4b 2e 20 49 66 20 74 68 65 20 63 68 61 6e 67 65  K. If the change
7550: 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 61 6e   is an UPDATE an
7560: 64 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  d does not inclu
7570: 64 65 0a 2a 2a 20 61 20 6e 65 77 20 76 61 6c 75  de.** a new valu
7580: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
7590: 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 2a 70 70 56  ted column, *ppV
75a0: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e  alue is set to N
75b0: 55 4c 4c 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  ULL and .** SQLI
75c0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
75d0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
75e0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 73 20 66  function comes f
75f0: 72 6f 6d 20 74 68 65 20 66 61 63 74 20 74 68 61  rom the fact tha
7600: 74 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 73 69  t .** this is si
7610: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22 6e 65  milar to the "ne
7620: 77 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20 61 76 61  w.*" columns ava
7630: 69 6c 61 62 6c 65 20 74 6f 20 75 70 64 61 74 65  ilable to update
7640: 20 6f 72 20 64 65 6c 65 74 65 20 0a 2a 2a 20 74   or delete .** t
7650: 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  riggers..**.** I
7660: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  f some other err
7670: 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20  or occurs (e.g. 
7680: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
7690: 29 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ), an SQLite err
76a0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
76b0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61  turned and *ppVa
76c0: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
76d0: 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  LL..*/.int sqlit
76e0: 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28  e3changeset_new(
76f0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
7700: 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
7710: 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74 20  ,  /* Changeset 
7720: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
7730: 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20 20  t iVal,         
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7750: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a   Column number *
7760: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
7770: 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20 20 20  e **ppValue     
7780: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
7790: 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70  value (or NULL p
77a0: 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b 0a 0a 2f  ointer) */.);../
77b0: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f  *.** CAPI3REF: O
77c0: 62 74 61 69 6e 20 43 6f 6e 66 6c 69 63 74 69 6e  btain Conflictin
77d0: 67 20 52 6f 77 20 56 61 6c 75 65 73 20 46 72 6f  g Row Values Fro
77e0: 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74  m A Changeset It
77f0: 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f 44  erator.** METHOD
7800: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
7810: 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20 54  set_iter.**.** T
7820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7830: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  uld only be used
7840: 20 77 69 74 68 20 69 74 65 72 61 74 6f 72 20 6f   with iterator o
7850: 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 74 6f  bjects passed to
7860: 20 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68   a.** conflict-h
7870: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
7880: 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  by [sqlite3chang
7890: 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 20 77 69  eset_apply()] wi
78a0: 74 68 20 65 69 74 68 65 72 0a 2a 2a 20 5b 53 51  th either.** [SQ
78b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
78c0: 41 54 41 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ATA] or [SQLITE_
78d0: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
78e0: 43 54 5d 2e 20 49 66 20 74 68 69 73 20 66 75 6e  CT]. If this fun
78f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
7900: 65 64 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20  ed on any other 
7910: 69 74 65 72 61 74 6f 72 2c 20 5b 53 51 4c 49 54  iterator, [SQLIT
7920: 45 5f 4d 49 53 55 53 45 5d 20 69 73 20 72 65 74  E_MISUSE] is ret
7930: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
7940: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
7950: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  NULL..**.** Argu
7960: 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62  ment iVal must b
7970: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
7980: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e  r equal to 0, an
7990: 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  d less than the 
79a0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c  number.** of col
79b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
79c0: 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68  e affected by th
79d0: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65  e current change
79e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
79f0: 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69  [SQLITE_RANGE] i
7a00: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
7a10: 70 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74  ppValue is set t
7a20: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  o NULL..**.** If
7a30: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
7a40: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
7a50: 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e  *ppValue to poin
7a60: 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64  t to a protected
7a70: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
7a80: 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  e object contain
7a90: 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74 68 20  ing the iVal'th 
7aa0: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 0a  value from the .
7ab0: 2a 2a 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20  ** "conflicting 
7ac0: 72 6f 77 22 20 61 73 73 6f 63 69 61 74 65 64 20  row" associated 
7ad0: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
7ae0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
7af0: 72 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e  r callback.** an
7b00: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
7b10: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f  _OK..**.** If so
7b20: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  me other error o
7b30: 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f  ccurs (e.g. an O
7b40: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61  OM condition), a
7b50: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
7b60: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
7b70: 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20  ed and *ppValue 
7b80: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
7b90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
7ba0: 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74  angeset_conflict
7bb0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
7bc0: 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
7bd0: 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74  r,  /* Changeset
7be0: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
7bf0: 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20  nt iVal,        
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c10: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
7c20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
7c30: 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20 20  ue **ppValue    
7c40: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
7c50: 75 65 20 66 72 6f 6d 20 63 6f 6e 66 6c 69 63 74  ue from conflict
7c60: 69 6e 67 20 72 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f  ing row */.);../
7c70: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
7c80: 65 74 65 72 6d 69 6e 65 20 54 68 65 20 4e 75 6d  etermine The Num
7c90: 62 65 72 20 4f 66 20 46 6f 72 65 69 67 6e 20 4b  ber Of Foreign K
7ca0: 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 20 56 69  ey Constraint Vi
7cb0: 6f 6c 61 74 69 6f 6e 73 0a 2a 2a 20 4d 45 54 48  olations.** METH
7cc0: 4f 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  OD: sqlite3_chan
7cd0: 67 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a  geset_iter.**.**
7ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
7cf0: 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
7d00: 64 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74  d with an iterat
7d10: 6f 72 20 70 61 73 73 65 64 20 74 6f 20 61 6e 0a  or passed to an.
7d20: 2a 2a 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ** SQLITE_CHANGE
7d30: 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20  SET_FOREIGN_KEY 
7d40: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
7d50: 20 63 61 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   callback. In th
7d60: 69 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 73 65  is case.** it se
7d70: 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ts the output va
7d80: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 74 6f  riable to the to
7d90: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 6e  tal number of kn
7da0: 6f 77 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a  own foreign key.
7db0: 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e  ** violations in
7dc0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
7dd0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
7de0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
7df0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  .**.** In all ot
7e00: 68 65 72 20 63 61 73 65 73 20 74 68 69 73 20 66  her cases this f
7e10: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
7e20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a  SQLITE_MISUSE..*
7e30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
7e40: 6e 67 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69  ngeset_fk_confli
7e50: 63 74 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  cts(.  sqlite3_c
7e60: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
7e70: 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65  Iter,  /* Change
7e80: 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  set iterator */.
7e90: 20 20 69 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20    int *pnOut    
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
7ec0: 20 6f 66 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e   of FK violation
7ed0: 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.);.../*.** 
7ee0: 43 41 50 49 33 52 45 46 3a 20 46 69 6e 61 6c 69  CAPI3REF: Finali
7ef0: 7a 65 20 41 20 43 68 61 6e 67 65 73 65 74 20 49  ze A Changeset I
7f00: 74 65 72 61 74 6f 72 0a 2a 2a 20 4d 45 54 48 4f  terator.** METHO
7f10: 44 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  D: sqlite3_chang
7f20: 65 73 65 74 5f 69 74 65 72 0a 2a 2a 0a 2a 2a 20  eset_iter.**.** 
7f30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7f40: 20 75 73 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a   used to finaliz
7f50: 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 6c  e an iterator al
7f60: 6c 6f 63 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  located with.** 
7f70: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
7f80: 74 5f 73 74 61 72 74 28 29 5d 2e 0a 2a 2a 0a 2a  t_start()]..**.*
7f90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7fa0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
7fb0: 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f  alled on iterato
7fc0: 72 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  rs created using
7fd0: 20 74 68 65 0a 2a 2a 20 5b 73 71 6c 69 74 65 33   the.** [sqlite3
7fe0: 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
7ff0: 29 5d 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  )] function. If 
8000: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  an application c
8010: 61 6c 6c 73 20 74 68 69 73 0a 2a 2a 20 66 75 6e  alls this.** fun
8020: 63 74 69 6f 6e 20 77 69 74 68 20 61 6e 20 69 74  ction with an it
8030: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 74 6f  erator passed to
8040: 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64   a conflict-hand
8050: 6c 65 72 20 62 79 0a 2a 2a 20 5b 73 71 6c 69 74  ler by.** [sqlit
8060: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
8070: 79 28 29 5d 2c 20 5b 53 51 4c 49 54 45 5f 4d 49  y()], [SQLITE_MI
8080: 53 55 53 45 5d 20 69 73 20 69 6d 6d 65 64 69 61  SUSE] is immedia
8090: 74 65 6c 79 20 72 65 74 75 72 6e 65 64 20 61 6e  tely returned an
80a0: 64 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 68 61  d the.** call ha
80b0: 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a  s no effect..**.
80c0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 77  ** If an error w
80d0: 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  as encountered w
80e0: 69 74 68 69 6e 20 61 20 63 61 6c 6c 20 74 6f 20  ithin a call to 
80f0: 61 6e 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  an sqlite3change
8100: 73 65 74 5f 78 78 78 28 29 0a 2a 2a 20 66 75 6e  set_xxx().** fun
8110: 63 74 69 6f 6e 20 28 66 6f 72 20 65 78 61 6d 70  ction (for examp
8120: 6c 65 20 61 6e 20 5b 53 51 4c 49 54 45 5f 43 4f  le an [SQLITE_CO
8130: 52 52 55 50 54 5d 20 69 6e 20 5b 73 71 6c 69 74  RRUPT] in [sqlit
8140: 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74  e3changeset_next
8150: 28 29 5d 20 6f 72 20 61 6e 20 0a 2a 2a 20 5b 53  ()] or an .** [S
8160: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5d 20 69 6e 20  QLITE_NOMEM] in 
8170: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
8180: 74 5f 6e 65 77 28 29 5d 29 20 74 68 65 6e 20 61  t_new()]) then a
8190: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 63 6f 72  n error code cor
81a0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
81b0: 20 74 68 61 74 20 65 72 72 6f 72 20 69 73 20 72   that error is r
81c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
81d0: 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
81e0: 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
81f0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 54  s.** returned. T
8200: 68 69 73 20 69 73 20 74 6f 20 61 6c 6c 6f 77 20  his is to allow 
8210: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
8220: 74 74 65 72 6e 20 28 70 73 65 75 64 6f 2d 63 6f  ttern (pseudo-co
8230: 64 65 29 3a 0a 2a 2a 0a 2a 2a 20 3c 70 72 65 3e  de):.**.** <pre>
8240: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61  .**   sqlite3cha
8250: 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29 3b 0a  ngeset_start();.
8260: 2a 2a 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  **   while( SQLI
8270: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 63  TE_ROW==sqlite3c
8280: 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20  hangeset_next() 
8290: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
82a0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 63  something with c
82b0: 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a  hange..**   }.**
82c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63     rc = sqlite3c
82d0: 68 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a  hangeset_finaliz
82e0: 65 28 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63  e();.**   if( rc
82f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 2a  !=SQLITE_OK ){.*
8300: 2a 20 20 20 20 20 2f 2f 20 41 6e 20 65 72 72 6f  *     // An erro
8310: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 0a  r has occurred .
8320: 2a 2a 20 20 20 7d 0a 2a 2a 20 3c 2f 70 72 65 3e  **   }.** </pre>
8330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
8340: 68 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a  hangeset_finaliz
8350: 65 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  e(sqlite3_change
8360: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 29  set_iter *pIter)
8370: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
8380: 46 3a 20 49 6e 76 65 72 74 20 41 20 43 68 61 6e  F: Invert A Chan
8390: 67 65 73 65 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  geset.**.** This
83a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
83b0: 64 20 74 6f 20 22 69 6e 76 65 72 74 22 20 61 20  d to "invert" a 
83c0: 63 68 61 6e 67 65 73 65 74 20 6f 62 6a 65 63 74  changeset object
83d0: 2e 20 41 70 70 6c 79 69 6e 67 20 61 6e 20 69 6e  . Applying an in
83e0: 76 65 72 74 65 64 0a 2a 2a 20 63 68 61 6e 67 65  verted.** change
83f0: 73 65 74 20 74 6f 20 61 20 64 61 74 61 62 61 73  set to a databas
8400: 65 20 72 65 76 65 72 73 65 73 20 74 68 65 20 65  e reverses the e
8410: 66 66 65 63 74 73 20 6f 66 20 61 70 70 6c 79 69  ffects of applyi
8420: 6e 67 20 74 68 65 20 75 6e 69 6e 76 65 72 74 65  ng the uninverte
8430: 64 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 2e 20  d.** changeset. 
8440: 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 2a 2a  Specifically:.**
8450: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
8460: 69 3e 20 45 61 63 68 20 44 45 4c 45 54 45 20 63  i> Each DELETE c
8470: 68 61 6e 67 65 20 69 73 20 63 68 61 6e 67 65 64  hange is changed
8480: 20 74 6f 20 61 6e 20 49 4e 53 45 52 54 2c 20 61   to an INSERT, a
8490: 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61 63  nd.**   <li> Eac
84a0: 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20  h INSERT change 
84b0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20  is changed to a 
84c0: 44 45 4c 45 54 45 2c 20 61 6e 64 0a 2a 2a 20 20  DELETE, and.**  
84d0: 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 55   <li> For each U
84e0: 50 44 41 54 45 20 63 68 61 6e 67 65 2c 20 74 68  PDATE change, th
84f0: 65 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77 2e  e old.* and new.
8500: 2a 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 63  * values are exc
8510: 68 61 6e 67 65 64 2e 0a 2a 2a 20 3c 2f 75 6c 3e  hanged..** </ul>
8520: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
8530: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 68  tion does not ch
8540: 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
8550: 6e 20 77 68 69 63 68 20 63 68 61 6e 67 65 73 20  n which changes 
8560: 61 70 70 65 61 72 20 77 69 74 68 69 6e 0a 2a 2a  appear within.**
8570: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
8580: 49 74 20 6d 65 72 65 6c 79 20 72 65 76 65 72 73  It merely revers
8590: 65 73 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20  es the sense of 
85a0: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
85b0: 63 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  change..**.** If
85c0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
85d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
85e0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
85f0: 65 20 69 6e 76 65 72 74 65 64 20 63 68 61 6e 67  e inverted chang
8600: 65 73 65 74 0a 2a 2a 20 69 73 20 73 74 6f 72 65  eset.** is store
8610: 64 20 69 6e 20 2a 70 70 4f 75 74 2c 20 74 68 65  d in *ppOut, the
8620: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 61 6d   size of the sam
8630: 65 20 62 75 66 66 65 72 20 69 73 20 73 74 6f 72  e buffer is stor
8640: 65 64 20 69 6e 20 2a 70 6e 4f 75 74 2c 20 61 6e  ed in *pnOut, an
8650: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  d.** SQLITE_OK i
8660: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
8670: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8680: 62 6f 74 68 20 2a 70 6e 4f 75 74 20 61 6e 64 20  both *pnOut and 
8690: 2a 70 70 4f 75 74 20 61 72 65 0a 2a 2a 20 7a 65  *ppOut are.** ze
86a0: 72 6f 65 64 20 61 6e 64 20 61 6e 20 53 51 4c 69  roed and an SQLi
86b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  te error code re
86c0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  turned..**.** It
86d0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
86e0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
86f0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
8700: 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
8710: 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65  free().** on the
8720: 20 2a 70 70 4f 75 74 20 70 6f 69 6e 74 65 72 20   *ppOut pointer 
8730: 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
8740: 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  er allocation fo
8750: 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73  llowing a succes
8760: 73 66 75 6c 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f  sful .** call to
8770: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8780: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 2f 54 4f  **.** WARNING/TO
8790: 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
87a0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 61 73 73 75  n currently assu
87b0: 6d 65 73 20 74 68 61 74 20 74 68 65 20 69 6e 70  mes that the inp
87c0: 75 74 20 69 73 20 61 20 76 61 6c 69 64 0a 2a 2a  ut is a valid.**
87d0: 20 63 68 61 6e 67 65 73 65 74 2e 20 49 66 20 69   changeset. If i
87e0: 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65  t is not, the re
87f0: 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69  sults are undefi
8800: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8810: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76  te3changeset_inv
8820: 65 72 74 28 0a 20 20 69 6e 74 20 6e 49 6e 2c 20  ert(.  int nIn, 
8830: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c  const void *pIn,
8840: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
8850: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69  changeset */.  i
8860: 6e 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20  nt *pnOut, void 
8870: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f  **ppOut        /
8880: 2a 20 4f 55 54 3a 20 49 6e 76 65 72 73 65 20 6f  * OUT: Inverse o
8890: 66 20 69 6e 70 75 74 20 2a 2f 0a 29 3b 0a 0a 2f  f input */.);../
88a0: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43  *.** CAPI3REF: C
88b0: 6f 6e 63 61 74 65 6e 61 74 65 20 54 77 6f 20 43  oncatenate Two C
88c0: 68 61 6e 67 65 73 65 74 20 4f 62 6a 65 63 74 73  hangeset Objects
88d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
88e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
88f0: 63 6f 6e 63 61 74 65 6e 61 74 65 20 74 77 6f 20  concatenate two 
8900: 63 68 61 6e 67 65 73 65 74 73 2c 20 41 20 61 6e  changesets, A an
8910: 64 20 42 2c 20 69 6e 74 6f 20 61 20 0a 2a 2a 20  d B, into a .** 
8920: 73 69 6e 67 6c 65 20 63 68 61 6e 67 65 73 65 74  single changeset
8930: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  . The result is 
8940: 61 20 63 68 61 6e 67 65 73 65 74 20 65 71 75 69  a changeset equi
8950: 76 61 6c 65 6e 74 20 74 6f 20 61 70 70 6c 79 69  valent to applyi
8960: 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20  ng.** changeset 
8970: 41 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 63 68  A followed by ch
8980: 61 6e 67 65 73 65 74 20 42 2e 20 0a 2a 2a 0a 2a  angeset B. .**.*
8990: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
89a0: 63 6f 6d 62 69 6e 65 73 20 74 68 65 20 74 77 6f  combines the two
89b0: 20 69 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74   input changeset
89c0: 73 20 75 73 69 6e 67 20 61 6e 20 0a 2a 2a 20 73  s using an .** s
89d0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
89e0: 75 70 20 6f 62 6a 65 63 74 2e 20 43 61 6c 6c 69  up object. Calli
89f0: 6e 67 20 69 74 20 70 72 6f 64 75 63 65 73 20 73  ng it produces s
8a00: 69 6d 69 6c 61 72 20 72 65 73 75 6c 74 73 20 61  imilar results a
8a10: 73 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  s the.** followi
8a20: 6e 67 20 63 6f 64 65 20 66 72 61 67 6d 65 6e 74  ng code fragment
8a30: 3a 0a 2a 2a 0a 2a 2a 20 3c 70 72 65 3e 0a 2a 2a  :.**.** <pre>.**
8a40: 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67     sqlite3_chang
8a50: 65 67 72 6f 75 70 20 2a 70 47 72 70 3b 0a 2a 2a  egroup *pGrp;.**
8a60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8a70: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28  changegroup_new(
8a80: 26 70 47 72 70 29 3b 0a 2a 2a 20 20 20 69 66 28  &pGrp);.**   if(
8a90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8aa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
8ab0: 6e 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72  ngegroup_add(pGr
8ac0: 70 2c 20 6e 41 2c 20 70 41 29 3b 0a 2a 2a 20 20  p, nA, pA);.**  
8ad0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8ae0: 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65  OK ) rc = sqlite
8af0: 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64  3changegroup_add
8b00: 28 70 47 72 70 2c 20 6e 42 2c 20 70 42 29 3b 0a  (pGrp, nB, pB);.
8b10: 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  **   if( rc==SQL
8b20: 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20  ITE_OK ){.**    
8b30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
8b40: 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28  ngegroup_output(
8b50: 70 47 72 70 2c 20 70 6e 4f 75 74 2c 20 70 70 4f  pGrp, pnOut, ppO
8b60: 75 74 29 3b 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b  ut);.**   }else{
8b70: 0a 2a 2a 20 20 20 20 20 2a 70 70 4f 75 74 20 3d  .**     *ppOut =
8b80: 20 30 3b 0a 2a 2a 20 20 20 20 20 2a 70 6e 4f 75   0;.**     *pnOu
8b90: 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  t = 0;.**   }.**
8ba0: 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 52 65   </pre>.**.** Re
8bb0: 66 65 72 20 74 6f 20 74 68 65 20 73 71 6c 69 74  fer to the sqlit
8bc0: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 64  e3_changegroup d
8bd0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  ocumentation bel
8be0: 6f 77 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  ow for details..
8bf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
8c00: 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 28 0a  angeset_concat(.
8c10: 20 20 69 6e 74 20 6e 41 2c 20 20 20 20 20 20 20    int nA,       
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8c40: 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 70  ytes in buffer p
8c50: 41 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 2c  A */.  void *pA,
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8c80: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
8c90: 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74  aining changeset
8ca0: 20 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 2c 20   A */.  int nB, 
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8cd0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
8ce0: 66 66 65 72 20 70 42 20 2a 2f 0a 20 20 76 6f 69  ffer pB */.  voi
8cf0: 64 20 2a 70 42 2c 20 20 20 20 20 20 20 20 20 20  d *pB,          
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d10: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
8d20: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61  r containing cha
8d30: 6e 67 65 73 65 74 20 42 20 2a 2f 0a 20 20 69 6e  ngeset B */.  in
8d40: 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20 20  t *pnOut,       
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d60: 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20   OUT: Number of 
8d70: 62 79 74 65 73 20 69 6e 20 6f 75 74 70 75 74 20  bytes in output 
8d80: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76  changeset */.  v
8d90: 6f 69 64 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  oid **ppOut     
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8db0: 2a 20 4f 55 54 3a 20 42 75 66 66 65 72 20 63 6f  * OUT: Buffer co
8dc0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
8dd0: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a  changeset */.);.
8de0: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
8df0: 3a 20 43 68 61 6e 67 65 67 72 6f 75 70 20 48 61  : Changegroup Ha
8e00: 6e 64 6c 65 0a 2a 2a 0a 2a 2a 20 41 20 63 68 61  ndle.**.** A cha
8e10: 6e 67 65 67 72 6f 75 70 20 69 73 20 61 6e 20 6f  ngegroup is an o
8e20: 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 6f  bject used to co
8e30: 6d 62 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72  mbine two or mor
8e40: 65 20 0a 2a 2a 20 5b 63 68 61 6e 67 65 73 65 74  e .** [changeset
8e50: 73 5d 20 6f 72 20 5b 70 61 74 63 68 73 65 74 73  s] or [patchsets
8e60: 5d 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ].*/.typedef str
8e70: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
8e80: 67 65 67 72 6f 75 70 20 73 71 6c 69 74 65 33 5f  gegroup sqlite3_
8e90: 63 68 61 6e 67 65 67 72 6f 75 70 3b 0a 0a 2f 2a  changegroup;../*
8ea0: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 72  .** CAPI3REF: Cr
8eb0: 65 61 74 65 20 41 20 4e 65 77 20 43 68 61 6e 67  eate A New Chang
8ec0: 65 67 72 6f 75 70 20 4f 62 6a 65 63 74 0a 2a 2a  egroup Object.**
8ed0: 20 43 4f 4e 53 54 52 55 43 54 4f 52 3a 20 73 71   CONSTRUCTOR: sq
8ee0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
8ef0: 70 0a 2a 2a 0a 2a 2a 20 41 6e 20 73 71 6c 69 74  p.**.** An sqlit
8f00: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 6f  e3_changegroup o
8f10: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
8f20: 20 63 6f 6d 62 69 6e 65 20 74 77 6f 20 6f 72 20   combine two or 
8f30: 6d 6f 72 65 20 63 68 61 6e 67 65 73 65 74 73 0a  more changesets.
8f40: 2a 2a 20 28 6f 72 20 70 61 74 63 68 73 65 74 73  ** (or patchsets
8f50: 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  ) into a single 
8f60: 63 68 61 6e 67 65 73 65 74 20 28 6f 72 20 70 61  changeset (or pa
8f70: 74 63 68 73 65 74 29 2e 20 41 20 73 69 6e 67 6c  tchset). A singl
8f80: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a  e changegroup.**
8f90: 20 6f 62 6a 65 63 74 20 6d 61 79 20 63 6f 6d 62   object may comb
8fa0: 69 6e 65 20 63 68 61 6e 67 65 73 65 74 73 20 6f  ine changesets o
8fb0: 72 20 70 61 74 63 68 73 65 74 73 2c 20 62 75 74  r patchsets, but
8fc0: 20 6e 6f 74 20 62 6f 74 68 2e 20 54 68 65 20 6f   not both. The o
8fd0: 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 6c 77 61  utput is.** alwa
8fe0: 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ys in the same f
8ff0: 6f 72 6d 61 74 20 61 73 20 74 68 65 20 69 6e 70  ormat as the inp
9000: 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ut..**.** If suc
9010: 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
9020: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
9030: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 70 6f 70  QLITE_OK and pop
9040: 75 6c 61 74 65 73 20 28 2a 70 70 29 20 77 69 74  ulates (*pp) wit
9050: 68 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  h.** a pointer t
9060: 6f 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33 5f  o a new sqlite3_
9070: 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65  changegroup obje
9080: 63 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ct before return
9090: 69 6e 67 2e 20 54 68 65 20 63 61 6c 6c 65 72 0a  ing. The caller.
90a0: 2a 2a 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  ** should eventu
90b0: 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65  ally free the re
90c0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 75 73  turned object us
90d0: 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a  ing a call to .*
90e0: 2a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  * sqlite3changeg
90f0: 72 6f 75 70 5f 64 65 6c 65 74 65 28 29 2e 20 49  roup_delete(). I
9100: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9110: 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
9120: 6f 72 20 63 6f 64 65 0a 2a 2a 20 28 69 2e 65 2e  or code.** (i.e.
9130: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69   SQLITE_NOMEM) i
9140: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
9150: 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
9160: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 75  L..**.** The usu
9170: 61 6c 20 75 73 61 67 65 20 70 61 74 74 65 72 6e  al usage pattern
9180: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f   for an sqlite3_
9190: 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65  changegroup obje
91a0: 63 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ct is as follows
91b0: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
91c0: 20 20 3c 6c 69 3e 20 49 74 20 69 73 20 63 72 65    <li> It is cre
91d0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 63 61 6c  ated using a cal
91e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e  l to sqlite3chan
91f0: 67 65 67 72 6f 75 70 5f 6e 65 77 28 29 2e 0a 2a  gegroup_new()..*
9200: 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5a 65 72 6f  *.**   <li> Zero
9210: 20 6f 72 20 6d 6f 72 65 20 63 68 61 6e 67 65 73   or more changes
9220: 65 74 73 20 28 6f 72 20 70 61 74 63 68 73 65 74  ets (or patchset
9230: 73 29 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  s) are added to 
9240: 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  the object.**   
9250: 20 20 20 20 20 62 79 20 63 61 6c 6c 69 6e 67 20       by calling 
9260: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
9270: 75 70 5f 61 64 64 28 29 2e 0a 2a 2a 0a 2a 2a 20  up_add()..**.** 
9280: 20 20 3c 6c 69 3e 20 54 68 65 20 72 65 73 75 6c    <li> The resul
9290: 74 20 6f 66 20 63 6f 6d 62 69 6e 69 6e 67 20 61  t of combining a
92a0: 6c 6c 20 69 6e 70 75 74 20 63 68 61 6e 67 65 73  ll input changes
92b0: 65 74 73 20 74 6f 67 65 74 68 65 72 20 69 73 20  ets together is 
92c0: 6f 62 74 61 69 6e 65 64 20 0a 2a 2a 20 20 20 20  obtained .**    
92d0: 20 20 20 20 62 79 20 74 68 65 20 61 70 70 6c 69      by the appli
92e0: 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63 61 6c  cation via a cal
92f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e  l to sqlite3chan
9300: 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 29  gegroup_output()
9310: 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54  ..**.**   <li> T
9320: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 64 65 6c  he object is del
9330: 65 74 65 64 20 75 73 69 6e 67 20 61 20 63 61 6c  eted using a cal
9340: 6c 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e  l to sqlite3chan
9350: 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28 29  gegroup_delete()
9360: 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a  ..** </ul>.**.**
9370: 20 41 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 63   Any number of c
9380: 61 6c 6c 73 20 74 6f 20 61 64 64 28 29 20 61 6e  alls to add() an
9390: 64 20 6f 75 74 70 75 74 28 29 20 6d 61 79 20 62  d output() may b
93a0: 65 20 6d 61 64 65 20 62 65 74 77 65 65 6e 20 74  e made between t
93b0: 68 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 6e  he calls to.** n
93c0: 65 77 28 29 20 61 6e 64 20 64 65 6c 65 74 65 28  ew() and delete(
93d0: 29 2c 20 61 6e 64 20 69 6e 20 61 6e 79 20 6f 72  ), and in any or
93e0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  der..**.** As we
93f0: 6c 6c 20 61 73 20 74 68 65 20 72 65 67 75 6c 61  ll as the regula
9400: 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  r sqlite3changeg
9410: 72 6f 75 70 5f 61 64 64 28 29 20 61 6e 64 20 0a  roup_add() and .
9420: 2a 2a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  ** sqlite3change
9430: 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 29 20 66  group_output() f
9440: 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 73 6f 20 61  unctions, also a
9450: 76 61 69 6c 61 62 6c 65 20 61 72 65 20 74 68 65  vailable are the
9460: 20 73 74 72 65 61 6d 69 6e 67 0a 2a 2a 20 76 65   streaming.** ve
9470: 72 73 69 6f 6e 73 20 73 71 6c 69 74 65 33 63 68  rsions sqlite3ch
9480: 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 5f 73 74  angegroup_add_st
9490: 72 6d 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  rm() and sqlite3
94a0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70  changegroup_outp
94b0: 75 74 5f 73 74 72 6d 28 29 2e 0a 2a 2f 0a 69 6e  ut_strm()..*/.in
94c0: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  t sqlite3changeg
94d0: 72 6f 75 70 5f 6e 65 77 28 73 71 6c 69 74 65 33  roup_new(sqlite3
94e0: 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 2a 70  _changegroup **p
94f0: 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  p);../*.** CAPI3
9500: 52 45 46 3a 20 41 64 64 20 41 20 43 68 61 6e 67  REF: Add A Chang
9510: 65 73 65 74 20 54 6f 20 41 20 43 68 61 6e 67 65  eset To A Change
9520: 67 72 6f 75 70 0a 2a 2a 20 4d 45 54 48 4f 44 3a  group.** METHOD:
9530: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
9540: 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61  roup.**.** Add a
9550: 6c 6c 20 63 68 61 6e 67 65 73 20 77 69 74 68 69  ll changes withi
9560: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  n the changeset 
9570: 28 6f 72 20 70 61 74 63 68 73 65 74 29 20 69 6e  (or patchset) in
9580: 20 62 75 66 66 65 72 20 70 44 61 74 61 20 28 73   buffer pData (s
9590: 69 7a 65 0a 2a 2a 20 6e 44 61 74 61 20 62 79 74  ize.** nData byt
95a0: 65 73 29 20 74 6f 20 74 68 65 20 63 68 61 6e 67  es) to the chang
95b0: 65 67 72 6f 75 70 2e 20 0a 2a 2a 0a 2a 2a 20 49  egroup. .**.** I
95c0: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 6e  f the buffer con
95d0: 74 61 69 6e 73 20 61 20 70 61 74 63 68 73 65 74  tains a patchset
95e0: 2c 20 74 68 65 6e 20 61 6c 6c 20 70 72 69 6f 72  , then all prior
95f0: 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 66   calls to this f
9600: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 68  unction.** on th
9610: 65 20 73 61 6d 65 20 63 68 61 6e 67 65 67 72 6f  e same changegro
9620: 75 70 20 6f 62 6a 65 63 74 20 6d 75 73 74 20 61  up object must a
9630: 6c 73 6f 20 68 61 76 65 20 73 70 65 63 69 66 69  lso have specifi
9640: 65 64 20 70 61 74 63 68 73 65 74 73 2e 20 4f 72  ed patchsets. Or
9650: 2c 20 69 66 0a 2a 2a 20 74 68 65 20 62 75 66 66  , if.** the buff
9660: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 68  er contains a ch
9670: 61 6e 67 65 73 65 74 2c 20 73 6f 20 6d 75 73 74  angeset, so must
9680: 20 68 61 76 65 20 74 68 65 20 65 61 72 6c 69 65   have the earlie
9690: 72 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 0a  r calls to this.
96a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  ** function. Oth
96b0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 45  erwise, SQLITE_E
96c0: 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64  RROR is returned
96d0: 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73 20   and no changes 
96e0: 61 72 65 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  are added.** to 
96f0: 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e  the changegroup.
9700: 0a 2a 2a 0a 2a 2a 20 52 6f 77 73 20 77 69 74 68  .**.** Rows with
9710: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
9720: 20 61 6e 64 20 63 68 61 6e 67 65 67 72 6f 75 70   and changegroup
9730: 20 61 72 65 20 69 64 65 6e 74 69 66 69 65 64 20   are identified 
9740: 62 79 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  by the values in
9750: 0a 2a 2a 20 74 68 65 69 72 20 50 52 49 4d 41 52  .** their PRIMAR
9760: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 20 41  Y KEY columns. A
9770: 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 63   change in the c
9780: 68 61 6e 67 65 73 65 74 20 69 73 20 63 6f 6e 73  hangeset is cons
9790: 69 64 65 72 65 64 20 74 6f 0a 2a 2a 20 61 70 70  idered to.** app
97a0: 6c 79 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  ly to the same r
97b0: 6f 77 20 61 73 20 61 20 63 68 61 6e 67 65 20 61  ow as a change a
97c0: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69  lready present i
97d0: 6e 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75  n the changegrou
97e0: 70 20 69 66 0a 2a 2a 20 74 68 65 20 74 77 6f 20  p if.** the two 
97f0: 72 6f 77 73 20 68 61 76 65 20 74 68 65 20 73 61  rows have the sa
9800: 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  me primary key..
9810: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 74 6f  **.** Changes to
9820: 20 72 6f 77 73 20 74 68 61 74 20 64 6f 20 6e 6f   rows that do no
9830: 74 20 61 6c 72 65 61 64 79 20 61 70 70 65 61 72  t already appear
9840: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 67 72   in the changegr
9850: 6f 75 70 20 61 72 65 0a 2a 2a 20 73 69 6d 70 6c  oup are.** simpl
9860: 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 69 74  y copied into it
9870: 2e 20 4f 72 2c 20 69 66 20 62 6f 74 68 20 74 68  . Or, if both th
9880: 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20  e new changeset 
9890: 61 6e 64 20 74 68 65 20 63 68 61 6e 67 65 67 72  and the changegr
98a0: 6f 75 70 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 63  oup.** contain c
98b0: 68 61 6e 67 65 73 20 74 68 61 74 20 61 70 70 6c  hanges that appl
98c0: 79 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 72 6f  y to a single ro
98d0: 77 2c 20 74 68 65 20 66 69 6e 61 6c 20 63 6f 6e  w, the final con
98e0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
98f0: 63 68 61 6e 67 65 67 72 6f 75 70 20 64 65 70 65  changegroup depe
9900: 6e 64 73 20 6f 6e 20 74 68 65 20 74 79 70 65 20  nds on the type 
9910: 6f 66 20 65 61 63 68 20 63 68 61 6e 67 65 2c 20  of each change, 
9920: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
9930: 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  * <table border=
9940: 31 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d  1 style="margin-
9950: 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d  left:8ex;margin-
9960: 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20  right:8ex">.**  
9970: 20 3c 74 72 3e 3c 74 68 20 73 74 79 6c 65 3d 22   <tr><th style="
9980: 77 68 69 74 65 2d 73 70 61 63 65 3a 70 72 65 22  white-space:pre"
9990: 3e 45 78 69 73 74 69 6e 67 20 43 68 61 6e 67 65  >Existing Change
99a0: 20 20 3c 2f 74 68 3e 0a 2a 2a 20 20 20 20 20 20    </th>.**      
99b0: 20 3c 74 68 20 73 74 79 6c 65 3d 22 77 68 69 74   <th style="whit
99c0: 65 2d 73 70 61 63 65 3a 70 72 65 22 3e 4e 65 77  e-space:pre">New
99d0: 20 43 68 61 6e 67 65 20 20 20 20 20 20 20 3c 2f   Change       </
99e0: 74 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68  th>.**       <th
99f0: 3e 4f 75 74 70 75 74 20 43 68 61 6e 67 65 0a 2a  >Output Change.*
9a00: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53 45  *   <tr><td>INSE
9a10: 52 54 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  RT <td>INSERT <t
9a20: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
9a30: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
9a40: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
9a50: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
9a60: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
9a70: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
9a80: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
9a90: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
9aa0: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
9ab0: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
9ac0: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
9ad0: 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e  group..**   <tr>
9ae0: 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 55  <td>INSERT <td>U
9af0: 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  PDATE <td>.**   
9b00: 20 20 20 20 54 68 65 20 49 4e 53 45 52 54 20 63      The INSERT c
9b10: 68 61 6e 67 65 20 72 65 6d 61 69 6e 73 20 69 6e  hange remains in
9b20: 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
9b30: 2e 20 54 68 65 20 76 61 6c 75 65 73 20 69 6e 20  . The values in 
9b40: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 49 4e  the .**       IN
9b50: 53 45 52 54 20 63 68 61 6e 67 65 20 61 72 65 20  SERT change are 
9b60: 6d 6f 64 69 66 69 65 64 20 61 73 20 69 66 20 74  modified as if t
9b70: 68 65 20 72 6f 77 20 77 61 73 20 69 6e 73 65 72  he row was inser
9b80: 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20  ted by the.**   
9b90: 20 20 20 20 65 78 69 73 74 69 6e 67 20 63 68 61      existing cha
9ba0: 6e 67 65 20 61 6e 64 20 74 68 65 6e 20 75 70 64  nge and then upd
9bb0: 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ated according t
9bc0: 6f 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65  o the new change
9bd0: 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49  ..**   <tr><td>I
9be0: 4e 53 45 52 54 20 3c 74 64 3e 44 45 4c 45 54 45  NSERT <td>DELETE
9bf0: 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54   <td>.**       T
9c00: 68 65 20 65 78 69 73 74 69 6e 67 20 49 4e 53 45  he existing INSE
9c10: 52 54 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  RT is removed fr
9c20: 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  om the changegro
9c30: 75 70 2e 20 54 68 65 20 44 45 4c 45 54 45 20 69  up. The DELETE i
9c40: 73 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74 20 61  s.**       not a
9c50: 64 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c  dded..**   <tr><
9c60: 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 49 4e  td>UPDATE <td>IN
9c70: 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20 20 20  SERT <td>.**    
9c80: 20 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e 67     The new chang
9c90: 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54 68  e is ignored. Th
9ca0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
9cb0: 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e 65   occur if the ne
9cc0: 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67  w.**       chang
9cd0: 65 73 65 74 20 77 61 73 20 72 65 63 6f 72 64 65  eset was recorde
9ce0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
9cf0: 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 73 65  ter the changese
9d00: 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20  ts already.**   
9d10: 20 20 20 20 61 64 64 65 64 20 74 6f 20 74 68 65      added to the
9d20: 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a   changegroup..**
9d30: 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54     <tr><td>UPDAT
9d40: 45 20 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64  E <td>UPDATE <td
9d50: 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65  >.**       The e
9d60: 78 69 73 74 69 6e 67 20 55 50 44 41 54 45 20 72  xisting UPDATE r
9d70: 65 6d 61 69 6e 73 20 77 69 74 68 69 6e 20 74 68  emains within th
9d80: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 49  e changegroup. I
9d90: 74 20 69 73 20 61 6d 65 6e 64 65 64 20 0a 2a 2a  t is amended .**
9da0: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
9db0: 68 65 20 61 63 63 6f 6d 70 61 6e 79 69 6e 67 20  he accompanying 
9dc0: 76 61 6c 75 65 73 20 61 72 65 20 61 73 20 69 66  values are as if
9dd0: 20 74 68 65 20 72 6f 77 20 77 61 73 20 75 70 64   the row was upd
9de0: 61 74 65 64 20 6f 6e 63 65 20 0a 2a 2a 20 20 20  ated once .**   
9df0: 20 20 20 20 62 79 20 74 68 65 20 65 78 69 73 74      by the exist
9e00: 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20 74  ing change and t
9e10: 68 65 6e 20 61 67 61 69 6e 20 62 79 20 74 68 65  hen again by the
9e20: 20 6e 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20   new change..** 
9e30: 20 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54 45    <tr><td>UPDATE
9e40: 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e   <td>DELETE <td>
9e50: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 65 78  .**       The ex
9e60: 69 73 74 69 6e 67 20 55 50 44 41 54 45 20 69 73  isting UPDATE is
9e70: 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
9e80: 20 6e 65 77 20 44 45 4c 45 54 45 20 77 69 74 68   new DELETE with
9e90: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
9ea0: 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20  changegroup..** 
9eb0: 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45    <tr><td>DELETE
9ec0: 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e   <td>INSERT <td>
9ed0: 0a 2a 2a 20 20 20 20 20 20 20 49 66 20 6f 6e 65  .**       If one
9ee0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
9ef0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 69 6e  column values in
9f00: 20 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74 65   the row inserte
9f10: 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 20 20  d by the.**     
9f20: 20 20 6e 65 77 20 63 68 61 6e 67 65 20 64 69 66    new change dif
9f30: 66 65 72 20 66 72 6f 6d 20 74 68 6f 73 65 20 69  fer from those i
9f40: 6e 20 74 68 65 20 72 6f 77 20 64 65 6c 65 74 65  n the row delete
9f50: 64 20 62 79 20 74 68 65 20 65 78 69 73 74 69 6e  d by the existin
9f60: 67 20 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e  g .**       chan
9f70: 67 65 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ge, the existing
9f80: 20 44 45 4c 45 54 45 20 69 73 20 72 65 70 6c 61   DELETE is repla
9f90: 63 65 64 20 62 79 20 61 6e 20 55 50 44 41 54 45  ced by an UPDATE
9fa0: 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 20   within the.**  
9fb0: 20 20 20 20 20 63 68 61 6e 67 65 67 72 6f 75 70       changegroup
9fc0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
9fd0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77  the inserted row
9fe0: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
9ff0: 73 61 6d 65 20 0a 2a 2a 20 20 20 20 20 20 20 61  same .**       a
a000: 73 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  s the deleted ro
a010: 77 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  w, the existing 
a020: 44 45 4c 45 54 45 20 69 73 20 73 69 6d 70 6c 79  DELETE is simply
a030: 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 20 20   discarded..**  
a040: 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45 20   <tr><td>DELETE 
a050: 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a  <td>UPDATE <td>.
a060: 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6e 65 77  **       The new
a070: 20 63 68 61 6e 67 65 20 69 73 20 69 67 6e 6f 72   change is ignor
a080: 65 64 2e 20 54 68 69 73 20 63 61 73 65 20 64 6f  ed. This case do
a090: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20  es not occur if 
a0a0: 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20 20  the new.**      
a0b0: 20 63 68 61 6e 67 65 73 65 74 20 77 61 73 20 72   changeset was r
a0c0: 65 63 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74  ecorded immediat
a0d0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 63 68  ely after the ch
a0e0: 61 6e 67 65 73 65 74 73 20 61 6c 72 65 61 64 79  angesets already
a0f0: 0a 2a 2a 20 20 20 20 20 20 20 61 64 64 65 64 20  .**       added 
a100: 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  to the changegro
a110: 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64  up..**   <tr><td
a120: 3e 44 45 4c 45 54 45 20 3c 74 64 3e 44 45 4c 45  >DELETE <td>DELE
a130: 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20  TE <td>.**      
a140: 20 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 20   The new change 
a150: 69 73 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73  is ignored. This
a160: 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6f   case does not o
a170: 63 63 75 72 20 69 66 20 74 68 65 20 6e 65 77 0a  ccur if the new.
a180: 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  **       changes
a190: 65 74 20 77 61 73 20 72 65 63 6f 72 64 65 64 20  et was recorded 
a1a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
a1b0: 72 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73  r the changesets
a1c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 20   already.**     
a1d0: 20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63    added to the c
a1e0: 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 3c  hangegroup..** <
a1f0: 2f 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  /table>.**.** If
a200: 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73   the new changes
a210: 65 74 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 6e  et contains chan
a220: 67 65 73 20 74 6f 20 61 20 74 61 62 6c 65 20 74  ges to a table t
a230: 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 70  hat is already p
a240: 72 65 73 65 6e 74 0a 2a 2a 20 69 6e 20 74 68 65  resent.** in the
a250: 20 63 68 61 6e 67 65 67 72 6f 75 70 2c 20 74 68   changegroup, th
a260: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
a270: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
a280: 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
a290: 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20  .** primary key 
a2a0: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20  columns for the 
a2b0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63 6f  table must be co
a2c0: 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
a2d0: 73 20 69 73 20 6e 6f 74 20 74 68 65 0a 2a 2a 20  s is not the.** 
a2e0: 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
a2f0: 69 6f 6e 20 66 61 69 6c 73 20 77 69 74 68 20 53  ion fails with S
a300: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 49 66  QLITE_SCHEMA. If
a310: 20 74 68 65 20 69 6e 70 75 74 20 63 68 61 6e 67   the input chang
a320: 65 73 65 74 0a 2a 2a 20 61 70 70 65 61 72 73 20  eset.** appears 
a330: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20 61 6e  to be corrupt an
a340: 64 20 74 68 65 20 63 6f 72 72 75 70 74 69 6f 6e  d the corruption
a350: 20 69 73 20 64 65 74 65 63 74 65 64 2c 20 53 51   is detected, SQ
a360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 0a  LITE_CORRUPT is.
a370: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  ** returned. Or,
a380: 20 69 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   if an out-of-me
a390: 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 6f  mory condition o
a3a0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 70 72 6f  ccurs during pro
a3b0: 63 65 73 73 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  cessing, this.**
a3c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
a3d0: 73 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  s SQLITE_NOMEM. 
a3e0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 69 66  In all cases, if
a3f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a400: 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 63 6f   the.** final co
a410: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68  ntents of the ch
a420: 61 6e 67 65 67 72 6f 75 70 20 69 73 20 75 6e 64  angegroup is und
a430: 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  efined..**.** If
a440: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
a450: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
a460: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
a470: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
a480: 75 70 5f 61 64 64 28 73 71 6c 69 74 65 33 5f 63  up_add(sqlite3_c
a490: 68 61 6e 67 65 67 72 6f 75 70 2a 2c 20 69 6e 74  hangegroup*, int
a4a0: 20 6e 44 61 74 61 2c 20 76 6f 69 64 20 2a 70 44   nData, void *pD
a4b0: 61 74 61 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  ata);../*.** CAP
a4c0: 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 41 20  I3REF: Obtain A 
a4d0: 43 6f 6d 70 6f 73 69 74 65 20 43 68 61 6e 67 65  Composite Change
a4e0: 73 65 74 20 46 72 6f 6d 20 41 20 43 68 61 6e 67  set From A Chang
a4f0: 65 67 72 6f 75 70 0a 2a 2a 20 4d 45 54 48 4f 44  egroup.** METHOD
a500: 3a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  : sqlite3_change
a510: 67 72 6f 75 70 0a 2a 2a 0a 2a 2a 20 4f 62 74 61  group.**.** Obta
a520: 69 6e 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  in a buffer cont
a530: 61 69 6e 69 6e 67 20 61 20 63 68 61 6e 67 65 73  aining a changes
a540: 65 74 20 28 6f 72 20 70 61 74 63 68 73 65 74 29  et (or patchset)
a550: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
a560: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 6e  e.** current con
a570: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 61  tents of the cha
a580: 6e 67 65 67 72 6f 75 70 2e 20 49 66 20 74 68 65  ngegroup. If the
a590: 20 69 6e 70 75 74 73 20 74 6f 20 74 68 65 20 63   inputs to the c
a5a0: 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 20 77 65  hangegroup.** we
a5b0: 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 63 68  re themselves ch
a5c0: 61 6e 67 65 73 65 74 73 2c 20 74 68 65 20 6f 75  angesets, the ou
a5d0: 74 70 75 74 20 69 73 20 61 20 63 68 61 6e 67 65  tput is a change
a5e0: 73 65 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a  set. Or, if the.
a5f0: 2a 2a 20 69 6e 70 75 74 73 20 77 65 72 65 20 70  ** inputs were p
a600: 61 74 63 68 73 65 74 73 2c 20 74 68 65 20 6f 75  atchsets, the ou
a610: 74 70 75 74 20 69 73 20 61 6c 73 6f 20 61 20 70  tput is also a p
a620: 61 74 63 68 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41  atchset..**.** A
a630: 73 20 77 69 74 68 20 74 68 65 20 6f 75 74 70 75  s with the outpu
a640: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
a650: 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
a660: 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74  t() and.** sqlit
a670: 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
a680: 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 73 2c 20  et() functions, 
a690: 61 6c 6c 20 63 68 61 6e 67 65 73 20 72 65 6c 61  all changes rela
a6a0: 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  ted to a single.
a6b0: 2a 2a 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f  ** table are gro
a6c0: 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 69 6e  uped together in
a6d0: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
a6e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 61  his function. Ta
a6f0: 62 6c 65 73 20 61 70 70 65 61 72 0a 2a 2a 20 69  bles appear.** i
a700: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
a710: 20 61 73 20 66 6f 72 20 74 68 65 20 76 65 72 79   as for the very
a720: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74   first changeset
a730: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68   added to the ch
a740: 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20 49 66  angegroup..** If
a750: 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
a760: 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e 67 65  ubsequent change
a770: 73 65 74 73 20 61 64 64 65 64 20 74 6f 20 74 68  sets added to th
a780: 65 20 63 68 61 6e 67 65 67 72 6f 75 70 20 63 6f  e changegroup co
a790: 6e 74 61 69 6e 0a 2a 2a 20 63 68 61 6e 67 65 73  ntain.** changes
a7a0: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74   for tables that
a7b0: 20 64 6f 20 6e 6f 74 20 61 70 70 65 61 72 20 69   do not appear i
a7c0: 6e 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e  n the first chan
a7d0: 67 65 73 65 74 2c 20 74 68 65 79 20 61 72 65 0a  geset, they are.
a7e0: 2a 2a 20 61 70 70 65 6e 64 65 64 20 6f 6e 74 6f  ** appended onto
a7f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a800: 6f 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74  output changeset
a810: 2c 20 61 67 61 69 6e 20 69 6e 20 74 68 65 20 6f  , again in the o
a820: 72 64 65 72 20 69 6e 0a 2a 2a 20 77 68 69 63 68  rder in.** which
a830: 20 74 68 65 79 20 61 72 65 20 66 69 72 73 74 20   they are first 
a840: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
a850: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a860: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
a870: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a880: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
a890: 6f 75 74 70 75 74 0a 2a 2a 20 76 61 72 69 61 62  output.** variab
a8a0: 6c 65 73 20 28 2a 70 6e 44 61 74 61 29 20 61 6e  les (*pnData) an
a8b0: 64 20 28 2a 70 70 44 61 74 61 29 20 61 72 65 20  d (*ppData) are 
a8c0: 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77  set to 0. Otherw
a8d0: 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ise, SQLITE_OK.*
a8e0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
a8f0: 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  d the output var
a900: 69 61 62 6c 65 73 20 61 72 65 20 73 65 74 20 74  iables are set t
a910: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  o the size of an
a920: 64 20 61 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  d a .** pointer 
a930: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
a940: 66 66 65 72 2c 20 72 65 73 70 65 63 74 69 76 65  ffer, respective
a950: 6c 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ly. In this case
a960: 20 69 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65   it is the.** re
a970: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
a980: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
a990: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
a9a0: 65 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 61  e buffer using a
a9b0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
a9c0: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
a9d0: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
a9e0: 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 0a 20 20  group_output(.  
a9f0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
aa00: 6f 75 70 2a 2c 0a 20 20 69 6e 74 20 2a 70 6e 44  oup*,.  int *pnD
aa10: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
aa20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
aa30: 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
aa40: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
aa50: 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 44 61 74  /.  void **ppDat
aa60: 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
aa70: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
aa80: 74 65 72 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ter to output bu
aa90: 66 66 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ffer */.);../*.*
aaa0: 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 6c 65  * CAPI3REF: Dele
aab0: 74 65 20 41 20 43 68 61 6e 67 65 67 72 6f 75 70  te A Changegroup
aac0: 20 4f 62 6a 65 63 74 0a 2a 2a 20 44 45 53 54 52   Object.** DESTR
aad0: 55 43 54 4f 52 3a 20 73 71 6c 69 74 65 33 5f 63  UCTOR: sqlite3_c
aae0: 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2f 0a 76 6f  hangegroup.*/.vo
aaf0: 69 64 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  id sqlite3change
ab00: 67 72 6f 75 70 5f 64 65 6c 65 74 65 28 73 71 6c  group_delete(sql
ab10: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
ab20: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33  *);../*.** CAPI3
ab30: 52 45 46 3a 20 41 70 70 6c 79 20 41 20 43 68 61  REF: Apply A Cha
ab40: 6e 67 65 73 65 74 20 54 6f 20 41 20 44 61 74 61  ngeset To A Data
ab50: 62 61 73 65 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79  base.**.** Apply
ab60: 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20   a changeset or 
ab70: 70 61 74 63 68 73 65 74 20 74 6f 20 61 20 64 61  patchset to a da
ab80: 74 61 62 61 73 65 2e 20 54 68 65 73 65 20 66 75  tabase. These fu
ab90: 6e 63 74 69 6f 6e 73 20 61 74 74 65 6d 70 74 20  nctions attempt 
aba0: 74 6f 0a 2a 2a 20 75 70 64 61 74 65 20 74 68 65  to.** update the
abb0: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
abc0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 68 61 6e   attached to han
abd0: 64 6c 65 20 64 62 20 77 69 74 68 20 74 68 65 20  dle db with the 
abe0: 63 68 61 6e 67 65 73 20 66 6f 75 6e 64 20 69 6e  changes found in
abf0: 0a 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 73 65  .** the changese
ac00: 74 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  t passed via the
ac10: 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
ac20: 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 0a 2a 2a  d arguments. .**
ac30: 0a 2a 2a 20 54 68 65 20 66 6f 75 72 74 68 20 61  .** The fourth a
ac40: 72 67 75 6d 65 6e 74 20 28 78 46 69 6c 74 65 72  rgument (xFilter
ac50: 29 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 73  ) passed to thes
ac60: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74  e functions is t
ac70: 68 65 20 22 66 69 6c 74 65 72 0a 2a 2a 20 63 61  he "filter.** ca
ac80: 6c 6c 62 61 63 6b 22 2e 20 49 66 20 69 74 20 69  llback". If it i
ac90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
aca0: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
acb0: 61 66 66 65 63 74 65 64 20 62 79 20 61 74 20 6c  affected by at l
acc0: 65 61 73 74 20 6f 6e 65 0a 2a 2a 20 63 68 61 6e  east one.** chan
acd0: 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ge in the change
ace0: 73 65 74 2c 20 74 68 65 20 66 69 6c 74 65 72 20  set, the filter 
acf0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
ad00: 6b 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ked with.** the 
ad10: 74 61 62 6c 65 20 6e 61 6d 65 20 61 73 20 74 68  table name as th
ad20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
ad30: 74 2c 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  t, and a copy of
ad40: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 70 6f 69   the context poi
ad50: 6e 74 65 72 0a 2a 2a 20 70 61 73 73 65 64 20 61  nter.** passed a
ad60: 73 20 74 68 65 20 73 69 78 74 68 20 61 72 67 75  s the sixth argu
ad70: 6d 65 6e 74 20 61 73 20 74 68 65 20 66 69 72 73  ment as the firs
ad80: 74 2e 20 49 66 20 74 68 65 20 22 66 69 6c 74 65  t. If the "filte
ad90: 72 20 63 61 6c 6c 62 61 63 6b 22 0a 2a 2a 20 72  r callback".** r
ada0: 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
adb0: 6e 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  n no attempt is 
adc0: 6d 61 64 65 20 74 6f 20 61 70 70 6c 79 20 61 6e  made to apply an
add0: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
ade0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 4f 74 68 65 72   table..** Other
adf0: 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 74  wise, if the ret
ae00: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e  urn value is non
ae10: 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 78 46 69  -zero or the xFi
ae20: 6c 74 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f  lter argument to
ae30: 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 61 6c 6c  .** is NULL, all
ae40: 20 63 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64   changes related
ae50: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 72   to the table ar
ae60: 65 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a  e attempted..**.
ae70: 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 61 62 6c  ** For each tabl
ae80: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 65 78  e that is not ex
ae90: 63 6c 75 64 65 64 20 62 79 20 74 68 65 20 66 69  cluded by the fi
aea0: 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 2c 20 74  lter callback, t
aeb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
aec0: 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
aed0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
aee0: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 70 61  contains a compa
aef0: 74 69 62 6c 65 20 74 61 62 6c 65 2e 20 41 20 74  tible table. A t
af00: 61 62 6c 65 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  able is .** cons
af10: 69 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c  idered compatibl
af20: 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  e if all of the 
af30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
af40: 75 65 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a  ue:.**.** <ul>.*
af50: 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 74 61 62  *   <li> The tab
af60: 6c 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  le has the same 
af70: 6e 61 6d 65 20 61 73 20 74 68 65 20 6e 61 6d 65  name as the name
af80: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65   recorded in the
af90: 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e   .**        chan
afa0: 67 65 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20  geset, and.**   
afb0: 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68  <li> The table h
afc0: 61 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  as at least as m
afd0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 72  any columns as r
afe0: 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a  ecorded in the .
aff0: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
b000: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c  set, and.**   <l
b010: 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61 73  i> The table has
b020: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
b030: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 61 6d 65  umns in the same
b040: 20 70 6f 73 69 74 69 6f 6e 20 61 73 20 0a 2a 2a   position as .**
b050: 20 20 20 20 20 20 20 20 72 65 63 6f 72 64 65 64          recorded
b060: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
b070: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
b080: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
b090: 20 63 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c   compatible tabl
b0a0: 65 2c 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20  e, it is not an 
b0b0: 65 72 72 6f 72 2c 20 62 75 74 20 6e 6f 6e 65 20  error, but none 
b0c0: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65  of the.** change
b0d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
b0e0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
b0f0: 61 70 70 6c 69 65 64 2e 20 41 20 77 61 72 6e 69  applied. A warni
b100: 6e 67 20 6d 65 73 73 61 67 65 20 69 73 20 69 73  ng message is is
b110: 73 75 65 64 0a 2a 2a 20 76 69 61 20 74 68 65 20  sued.** via the 
b120: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65  sqlite3_log() me
b130: 63 68 61 6e 69 73 6d 20 77 69 74 68 20 74 68 65  chanism with the
b140: 20 65 72 72 6f 72 20 63 6f 64 65 20 53 51 4c 49   error code SQLI
b150: 54 45 5f 53 43 48 45 4d 41 2e 20 41 74 20 6d 6f  TE_SCHEMA. At mo
b160: 73 74 0a 2a 2a 20 6f 6e 65 20 73 75 63 68 20 77  st.** one such w
b170: 61 72 6e 69 6e 67 20 69 73 20 69 73 73 75 65 64  arning is issued
b180: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
b190: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
b1a0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
b1b0: 20 63 68 61 6e 67 65 20 66 6f 72 20 77 68 69 63   change for whic
b1c0: 68 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6d  h there is a com
b1d0: 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 61  patible table, a
b1e0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
b1f0: 65 20 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  e .** to modify 
b200: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  the table conten
b210: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
b220: 74 68 65 20 55 50 44 41 54 45 2c 20 49 4e 53 45  the UPDATE, INSE
b230: 52 54 20 6f 72 20 44 45 4c 45 54 45 20 0a 2a 2a  RT or DELETE .**
b240: 20 63 68 61 6e 67 65 2e 20 49 66 20 61 20 63 68   change. If a ch
b250: 61 6e 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  ange cannot be a
b260: 70 70 6c 69 65 64 20 63 6c 65 61 6e 6c 79 2c 20  pplied cleanly, 
b270: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
b280: 64 6c 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  dler .** functio
b290: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
b2a0: 66 69 66 74 68 20 61 72 67 75 6d 65 6e 74 20 74  fifth argument t
b2b0: 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  o sqlite3changes
b2c0: 65 74 5f 61 70 70 6c 79 28 29 20 6d 61 79 20 62  et_apply() may b
b2d0: 65 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 41  e .** invoked. A
b2e0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
b2f0: 65 78 61 63 74 6c 79 20 77 68 65 6e 20 74 68 65  exactly when the
b300: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
b310: 72 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 72  r is invoked for
b320: 20 0a 2a 2a 20 65 61 63 68 20 74 79 70 65 20 6f   .** each type o
b330: 66 20 63 68 61 6e 67 65 20 69 73 20 62 65 6c 6f  f change is belo
b340: 77 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20  w..**.** Unlike 
b350: 74 68 65 20 78 46 69 6c 74 65 72 20 61 72 67 75  the xFilter argu
b360: 6d 65 6e 74 2c 20 78 43 6f 6e 66 6c 69 63 74 20  ment, xConflict 
b370: 6d 61 79 20 6e 6f 74 20 62 65 20 70 61 73 73 65  may not be passe
b380: 64 20 4e 55 4c 4c 2e 20 54 68 65 20 72 65 73 75  d NULL. The resu
b390: 6c 74 73 0a 2a 2a 20 6f 66 20 70 61 73 73 69 6e  lts.** of passin
b3a0: 67 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  g anything other
b3b0: 20 74 68 61 6e 20 61 20 76 61 6c 69 64 20 66 75   than a valid fu
b3c0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61  nction pointer a
b3d0: 73 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 0a  s the xConflict.
b3e0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20  ** argument are 
b3f0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
b400: 20 45 61 63 68 20 74 69 6d 65 20 74 68 65 20 63   Each time the c
b410: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
b420: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
b430: 6b 65 64 2c 20 69 74 20 6d 75 73 74 20 72 65 74  ked, it must ret
b440: 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20 5b 53  urn one.** of [S
b450: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
b460: 4f 4d 49 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 43  OMIT], [SQLITE_C
b470: 48 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 5d 20  HANGESET_ABORT] 
b480: 6f 72 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43  or .** [SQLITE_C
b490: 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
b4a0: 5d 2e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ]. SQLITE_CHANGE
b4b0: 53 45 54 5f 52 45 50 4c 41 43 45 20 6d 61 79 20  SET_REPLACE may 
b4c0: 6f 6e 6c 79 20 62 65 20 72 65 74 75 72 6e 65 64  only be returned
b4d0: 0a 2a 2a 20 69 66 20 74 68 65 20 73 65 63 6f 6e  .** if the secon
b4e0: 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  d argument passe
b4f0: 64 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  d to the conflic
b500: 74 20 68 61 6e 64 6c 65 72 20 69 73 20 65 69 74  t handler is eit
b510: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48  her.** SQLITE_CH
b520: 41 4e 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20  ANGESET_DATA or 
b530: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
b540: 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68  _CONFLICT. If th
b550: 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  e conflict-handl
b560: 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
b570: 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75 65 2c 20   illegal value, 
b580: 61 6e 79 20 63 68 61 6e 67 65 73 20 61 6c 72 65  any changes alre
b590: 61 64 79 20 6d 61 64 65 20 61 72 65 20 72 6f 6c  ady made are rol
b5a0: 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20  led back and.** 
b5b0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
b5c0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
b5d0: 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ly() returns SQL
b5e0: 49 54 45 5f 4d 49 53 55 53 45 2e 20 44 69 66 66  ITE_MISUSE. Diff
b5f0: 65 72 65 6e 74 20 0a 2a 2a 20 61 63 74 69 6f 6e  erent .** action
b600: 73 20 61 72 65 20 74 61 6b 65 6e 20 62 79 20 73  s are taken by s
b610: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
b620: 61 70 70 6c 79 28 29 20 64 65 70 65 6e 64 69 6e  apply() dependin
b630: 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  g on the value.*
b640: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 65 61  * returned by ea
b650: 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ch invocation of
b660: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
b670: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20  ndler function. 
b680: 52 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20  Refer to.** the 
b690: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
b6a0: 72 20 74 68 65 20 74 68 72 65 65 20 0a 2a 2a 20  r the three .** 
b6b0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
b6c0: 54 5f 4f 4d 49 54 7c 61 76 61 69 6c 61 62 6c 65  T_OMIT|available
b6d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 5d 20   return values] 
b6e0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
b6f0: 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 44  ** <dl>.** <dt>D
b700: 45 4c 45 54 45 20 43 68 61 6e 67 65 73 3c 64 64  ELETE Changes<dd
b710: 3e 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20  >.**   For each 
b720: 44 45 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 74  DELETE change, t
b730: 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  he function chec
b740: 6b 73 20 69 66 20 74 68 65 20 74 61 72 67 65 74  ks if the target
b750: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
b760: 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77  contains a row w
b770: 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69  ith the same pri
b780: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20 28  mary key value (
b790: 6f 72 20 76 61 6c 75 65 73 29 20 61 73 20 74 68  or values) as th
b7a0: 65 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c  e .**   original
b7b0: 20 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72   row values stor
b7c0: 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ed in the change
b7d0: 73 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  set. If it does,
b7e0: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20   and the values 
b7f0: 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20  .**   stored in 
b800: 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  all non-primary 
b810: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f  key columns also
b820: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
b830: 73 20 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a 20  s stored in .** 
b840: 20 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20    the changeset 
b850: 74 68 65 20 72 6f 77 20 69 73 20 64 65 6c 65 74  the row is delet
b860: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 61 72 67  ed from the targ
b870: 65 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  et database..**.
b880: 2a 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77 69  **   If a row wi
b890: 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d  th matching prim
b8a0: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ary key values i
b8b0: 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e 65  s found, but one
b8c0: 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20 20   or more of.**  
b8d0: 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79   the non-primary
b8e0: 20 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74   key fields cont
b8f0: 61 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66  ains a value dif
b900: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b910: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 72 6f  original.**   ro
b920: 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
b930: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c  n the changeset,
b940: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
b950: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69  ndler function i
b960: 73 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77  s.**   invoked w
b970: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
b980: 47 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74  GESET_DATA] as t
b990: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b9a0: 6e 74 2e 20 49 66 20 74 68 65 0a 2a 2a 20 20 20  nt. If the.**   
b9b0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 68  database table h
b9c0: 61 73 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  as more columns 
b9d0: 74 68 61 6e 20 61 72 65 20 72 65 63 6f 72 64 65  than are recorde
b9e0: 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  d in the changes
b9f0: 65 74 2c 0a 2a 2a 20 20 20 6f 6e 6c 79 20 74 68  et,.**   only th
ba00: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
ba10: 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65  e non-primary ke
ba20: 79 20 66 69 65 6c 64 73 20 61 72 65 20 63 6f 6d  y fields are com
ba30: 70 61 72 65 64 20 61 67 61 69 6e 73 74 0a 2a 2a  pared against.**
ba40: 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 64     the current d
ba50: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 73  atabase contents
ba60: 20 2d 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20   - any trailing 
ba70: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 63  database table c
ba80: 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 61 72 65 20  olumns.**   are 
ba90: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  ignored..**.**  
baa0: 20 49 66 20 6e 6f 20 72 6f 77 20 77 69 74 68 20   If no row with 
bab0: 6d 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79  matching primary
bac0: 20 6b 65 79 20 76 61 6c 75 65 73 20 69 73 20 66   key values is f
bad0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
bae0: 62 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65 20 63  base,.**   the c
baf0: 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20  onflict-handler 
bb00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
bb10: 6b 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45  ked with [SQLITE
bb20: 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f  _CHANGESET_NOTFO
bb30: 55 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64  UND].**   passed
bb40: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
bb50: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  rgument..**.**  
bb60: 20 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 6f   If the DELETE o
bb70: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65  peration is atte
bb80: 6d 70 74 65 64 2c 20 62 75 74 20 53 51 4c 69 74  mpted, but SQLit
bb90: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
bba0: 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 20  _CONSTRAINT.**  
bbb0: 20 28 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79   (which can only
bbc0: 20 68 61 70 70 65 6e 20 69 66 20 61 20 66 6f 72   happen if a for
bbd0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
bbe0: 69 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 29  int is violated)
bbf0: 2c 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e 66 6c  , the.**   confl
bc00: 69 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  ict-handler func
bc10: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
bc20: 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41  with [SQLITE_CHA
bc30: 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e  NGESET_CONSTRAIN
bc40: 54 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61  T].**   passed a
bc50: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
bc60: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 6e 63 6c  ument. This incl
bc70: 75 64 65 73 20 74 68 65 20 63 61 73 65 20 77 68  udes the case wh
bc80: 65 72 65 20 74 68 65 20 44 45 4c 45 54 45 0a 2a  ere the DELETE.*
bc90: 2a 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  *   operation is
bca0: 20 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75   attempted becau
bcb0: 73 65 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  se an earlier ca
bcc0: 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69  ll to the confli
bcd0: 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  ct handler.**   
bce0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
bcf0: 64 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  d [SQLITE_CHANGE
bd00: 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a  SET_REPLACE]..**
bd10: 0a 2a 2a 20 3c 64 74 3e 49 4e 53 45 52 54 20 43  .** <dt>INSERT C
bd20: 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20  hanges<dd>.**   
bd30: 46 6f 72 20 65 61 63 68 20 49 4e 53 45 52 54 20  For each INSERT 
bd40: 63 68 61 6e 67 65 2c 20 61 6e 20 61 74 74 65 6d  change, an attem
bd50: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e  pt is made to in
bd60: 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77  sert the new row
bd70: 20 69 6e 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64   into.**   the d
bd80: 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
bd90: 63 68 61 6e 67 65 73 65 74 20 72 6f 77 20 63 6f  changeset row co
bda0: 6e 74 61 69 6e 73 20 66 65 77 65 72 20 66 69 65  ntains fewer fie
bdb0: 6c 64 73 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  lds than the.** 
bdc0: 20 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65    database table
bdd0: 2c 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 66  , the trailing f
bde0: 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
bdf0: 74 65 64 20 77 69 74 68 20 74 68 65 69 72 20 64  ted with their d
be00: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 76 61 6c 75  efault.**   valu
be10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74  es..**.**   If t
be20: 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6e  he attempt to in
be30: 73 65 72 74 20 74 68 65 20 72 6f 77 20 66 61 69  sert the row fai
be40: 6c 73 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ls because the d
be50: 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 20  atabase already 
be60: 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 61  .**   contains a
be70: 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61   row with the sa
be80: 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  me primary key v
be90: 61 6c 75 65 73 2c 20 74 68 65 20 63 6f 6e 66 6c  alues, the confl
bea0: 69 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20  ict handler.**  
beb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
bec0: 6f 6b 65 64 20 77 69 74 68 20 74 68 65 20 73 65  oked with the se
bed0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 65  cond argument se
bee0: 74 20 74 6f 20 0a 2a 2a 20 20 20 5b 53 51 4c 49  t to .**   [SQLI
bef0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
bf00: 46 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20  FLICT]..**.**   
bf10: 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
bf20: 6f 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f 77  o insert the row
bf30: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
bf40: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  f some other con
bf50: 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 76 69 6f  straint.**   vio
bf60: 6c 61 74 69 6f 6e 20 28 65 2e 67 2e 20 4e 4f 54  lation (e.g. NOT
bf70: 20 4e 55 4c 4c 20 6f 72 20 55 4e 49 51 55 45 29   NULL or UNIQUE)
bf80: 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  , the conflict h
bf90: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
bfa0: 69 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64  is .**   invoked
bfb0: 20 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64   with the second
bfc0: 20 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74 6f   argument set to
bfd0: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
bfe0: 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 2e 0a  ET_CONSTRAINT]..
bff0: 2a 2a 20 20 20 54 68 69 73 20 69 6e 63 6c 75 64  **   This includ
c000: 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65 72  es the case wher
c010: 65 20 74 68 65 20 49 4e 53 45 52 54 20 6f 70 65  e the INSERT ope
c020: 72 61 74 69 6f 6e 20 69 73 20 72 65 2d 61 74 74  ration is re-att
c030: 65 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 0a  empted because .
c040: 2a 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72 20  **   an earlier 
c050: 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66  call to the conf
c060: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e  lict handler fun
c070: 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 0a  ction returned .
c080: 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48 41  **   [SQLITE_CHA
c090: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d 2e  NGESET_REPLACE].
c0a0: 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 55 50 44 41 54  .**.** <dt>UPDAT
c0b0: 45 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a  E Changes<dd>.**
c0c0: 20 20 20 46 6f 72 20 65 61 63 68 20 55 50 44 41     For each UPDA
c0d0: 54 45 20 63 68 61 6e 67 65 2c 20 74 68 65 20 66  TE change, the f
c0e0: 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
c0f0: 66 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  f the target dat
c100: 61 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f 6e 74  abase .**   cont
c110: 61 69 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20  ains a row with 
c120: 74 68 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79  the same primary
c130: 20 6b 65 79 20 76 61 6c 75 65 20 28 6f 72 20 76   key value (or v
c140: 61 6c 75 65 73 29 20 61 73 20 74 68 65 20 0a 2a  alues) as the .*
c150: 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77  *   original row
c160: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
c170: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
c180: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 61 6e 64   If it does, and
c190: 20 74 68 65 20 76 61 6c 75 65 73 20 0a 2a 2a 20   the values .** 
c1a0: 20 20 73 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20    stored in all 
c1b0: 6d 6f 64 69 66 69 65 64 20 6e 6f 6e 2d 70 72 69  modified non-pri
c1c0: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
c1d0: 20 61 6c 73 6f 20 6d 61 74 63 68 20 74 68 65 20   also match the 
c1e0: 76 61 6c 75 65 73 0a 2a 2a 20 20 20 73 74 6f 72  values.**   stor
c1f0: 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ed in the change
c200: 73 65 74 20 74 68 65 20 72 6f 77 20 69 73 20 75  set the row is u
c210: 70 64 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  pdated within th
c220: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
c230: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20  e..**.**   If a 
c240: 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e  row with matchin
c250: 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  g primary key va
c260: 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 2c 20 62  lues is found, b
c270: 75 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ut one or more o
c280: 66 0a 2a 2a 20 20 20 74 68 65 20 6d 6f 64 69 66  f.**   the modif
c290: 69 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  ied non-primary 
c2a0: 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74 61  key fields conta
c2b0: 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66 66  ins a value diff
c2c0: 65 72 65 6e 74 20 66 72 6f 6d 20 61 6e 0a 2a 2a  erent from an.**
c2d0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20     original row 
c2e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
c2f0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 74  the changeset, t
c300: 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64  he conflict-hand
c310: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ler function.** 
c320: 20 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74    is invoked wit
c330: 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  h [SQLITE_CHANGE
c340: 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68 65  SET_DATA] as the
c350: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
c360: 2e 20 53 69 6e 63 65 0a 2a 2a 20 20 20 55 50 44  . Since.**   UPD
c370: 41 54 45 20 63 68 61 6e 67 65 73 20 6f 6e 6c 79  ATE changes only
c380: 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73 20   contain values 
c390: 66 6f 72 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20  for non-primary 
c3a0: 6b 65 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  key fields that 
c3b0: 61 72 65 0a 2a 2a 20 20 20 74 6f 20 62 65 20 6d  are.**   to be m
c3c0: 6f 64 69 66 69 65 64 2c 20 6f 6e 6c 79 20 74 68  odified, only th
c3d0: 6f 73 65 20 66 69 65 6c 64 73 20 6e 65 65 64 20  ose fields need 
c3e0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6f 72 69  to match the ori
c3f0: 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 74 6f 0a  ginal values to.
c400: 2a 2a 20 20 20 61 76 6f 69 64 20 74 68 65 20 53  **   avoid the S
c410: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
c420: 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 2d 68 61  DATA conflict-ha
c430: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a  ndler callback..
c440: 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e 6f 20 72 6f  **.**   If no ro
c450: 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  w with matching 
c460: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
c470: 65 73 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  es is found in t
c480: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
c490: 20 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68    the conflict-h
c4a0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
c4b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
c4c0: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
c4d0: 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a 2a 2a 20 20  T_NOTFOUND].**  
c4e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
c4f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
c500: 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 55  **.**   If the U
c510: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  PDATE operation 
c520: 69 73 20 61 74 74 65 6d 70 74 65 64 2c 20 62 75  is attempted, bu
c530: 74 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e 73  t SQLite returns
c540: 20 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 43 4f   .**   SQLITE_CO
c550: 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 20 63 6f  NSTRAINT, the co
c560: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
c570: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
c580: 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 5b 53  ed with .**   [S
c590: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
c5a0: 43 4f 4e 53 54 52 41 49 4e 54 5d 20 70 61 73 73  CONSTRAINT] pass
c5b0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
c5c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20   argument..**   
c5d0: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68  This includes th
c5e0: 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  e case where the
c5f0: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
c600: 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 61  n is attempted a
c610: 66 74 65 72 20 0a 2a 2a 20 20 20 61 6e 20 65 61  fter .**   an ea
c620: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 74 68  rlier call to th
c630: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
c640: 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er function retu
c650: 72 6e 65 64 0a 2a 2a 20 20 20 5b 53 51 4c 49 54  rned.**   [SQLIT
c660: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
c670: 41 43 45 5d 2e 20 20 0a 2a 2a 20 3c 2f 64 6c 3e  ACE].  .** </dl>
c680: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 73 61 66  .**.** It is saf
c690: 65 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  e to execute SQL
c6a0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e 63   statements, inc
c6b0: 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61  luding those tha
c6c0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a  t write to the.*
c6d0: 2a 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  * table that the
c6e0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65   callback relate
c6f0: 64 20 74 6f 2c 20 66 72 6f 6d 20 77 69 74 68 69  d to, from withi
c700: 6e 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 20  n the xConflict 
c710: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  callback..** Thi
c720: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
c730: 20 66 75 72 74 68 65 72 20 63 75 73 74 6f 6d 69   further customi
c740: 7a 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  ze the applicati
c750: 6f 6e 73 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20  ons conflict.** 
c760: 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74  resolution strat
c770: 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  egy..**.** All c
c780: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
c790: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
c7a0: 72 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 61  re enclosed in a
c7b0: 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
c7c0: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e  action..** If an
c7d0: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 20 28 61  y other error (a
c7e0: 73 69 64 65 20 66 72 6f 6d 20 61 20 63 6f 6e 73  side from a cons
c7f0: 74 72 61 69 6e 74 20 66 61 69 6c 75 72 65 20 77  traint failure w
c800: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
c810: 6f 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68  o.** write to th
c820: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
c830: 65 29 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  e) occurs, then 
c840: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 72  the savepoint tr
c850: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
c860: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 72 65 73  rolled back, res
c870: 74 6f 72 69 6e 67 20 74 68 65 20 74 61 72 67 65  toring the targe
c880: 74 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  t database to it
c890: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
c8a0: 2c 20 61 6e 64 20 61 6e 20 0a 2a 2a 20 53 51 4c  , and an .** SQL
c8b0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72  ite error code r
c8c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
c8d0: 66 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  f the output par
c8e0: 61 6d 65 74 65 72 73 20 28 70 70 52 65 62 61 73  ameters (ppRebas
c8f0: 65 29 20 61 6e 64 20 28 70 6e 52 65 62 61 73 65  e) and (pnRebase
c900: 29 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  ) are non-NULL a
c910: 6e 64 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20  nd.** the input 
c920: 69 73 20 61 20 63 68 61 6e 67 65 73 65 74 20 28  is a changeset (
c930: 6e 6f 74 20 61 20 70 61 74 63 68 73 65 74 29 2c  not a patchset),
c940: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 63 68 61   then sqlite3cha
c950: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28  ngeset_apply_v2(
c960: 29 0a 2a 2a 20 6d 61 79 20 73 65 74 20 28 2a 70  ).** may set (*p
c970: 70 52 65 62 61 73 65 29 20 74 6f 20 70 6f 69 6e  pRebase) to poin
c980: 74 20 74 6f 20 61 20 22 72 65 62 61 73 65 22 20  t to a "rebase" 
c990: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
c9a0: 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 73 71   with the .** sq
c9b0: 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20 41 50  lite3_rebaser AP
c9c0: 49 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  Is buffer before
c9d0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20 74   returning. In t
c9e0: 68 69 73 20 63 61 73 65 20 28 2a 70 6e 52 65 62  his case (*pnReb
c9f0: 61 73 65 29 0a 2a 2a 20 69 73 20 73 65 74 20 74  ase).** is set t
ca00: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
ca10: 65 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  e buffer in byte
ca20: 73 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  s. It is the res
ca30: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
ca40: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
ca50: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
ca60: 61 6e 79 20 73 75 63 68 20 62 75 66 66 65 72 20  any such buffer 
ca70: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
ca80: 65 65 28 29 2e 20 54 68 65 20 62 75 66 66 65 72  ee(). The buffer
ca90: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  .** is only allo
caa0: 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
cab0: 74 65 64 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ted if one or mo
cac0: 72 65 20 63 6f 6e 66 6c 69 63 74 73 20 77 65 72  re conflicts wer
cad0: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a  e encountered.**
cae0: 20 77 68 69 6c 65 20 61 70 70 6c 79 69 6e 67 20   while applying 
caf0: 74 68 65 20 70 61 74 63 68 73 65 74 2e 20 53 65  the patchset. Se
cb00: 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f  e comments surro
cb10: 75 6e 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  unding the sqlit
cb20: 65 33 5f 72 65 62 61 73 65 72 0a 2a 2a 20 41 50  e3_rebaser.** AP
cb30: 49 73 20 66 6f 72 20 66 75 72 74 68 65 72 20 64  Is for further d
cb40: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  etails..**.** Th
cb50: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 73 71  e behavior of sq
cb60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
cb70: 70 70 6c 79 5f 76 32 28 29 20 61 6e 64 20 69 74  pply_v2() and it
cb80: 73 20 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69  s streaming equi
cb90: 76 61 6c 65 6e 74 0a 2a 2a 20 6d 61 79 20 62 65  valent.** may be
cba0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 70 61 73   modified by pas
cbb0: 73 69 6e 67 20 61 20 63 6f 6d 62 69 6e 61 74 69  sing a combinati
cbc0: 6f 6e 20 6f 66 0a 2a 2a 20 5b 53 51 4c 49 54 45  on of.** [SQLITE
cbd0: 5f 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f  _CHANGESETAPPLY_
cbe0: 4e 4f 53 41 56 45 50 4f 49 4e 54 20 7c 20 73 75  NOSAVEPOINT | su
cbf0: 70 70 6f 72 74 65 64 20 66 6c 61 67 73 5d 20 61  pported flags] a
cc00: 73 20 74 68 65 20 39 74 68 20 70 61 72 61 6d 65  s the 9th parame
cc10: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ter..**.** Note 
cc20: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
cc30: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
cc40: 76 32 28 29 20 41 50 49 20 69 73 20 73 74 69 6c  v2() API is stil
cc50: 6c 20 3c 62 3e 65 78 70 65 72 69 6d 65 6e 74 61  l <b>experimenta
cc60: 6c 3c 2f 62 3e 0a 2a 2a 20 61 6e 64 20 74 68 65  l</b>.** and the
cc70: 72 65 66 6f 72 65 20 73 75 62 6a 65 63 74 20 74  refore subject t
cc80: 6f 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  o change..*/.int
cc90: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
cca0: 74 5f 61 70 70 6c 79 28 0a 20 20 73 71 6c 69 74  t_apply(.  sqlit
ccb0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ccc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
ccd0: 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d  ply change to "m
cce0: 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20  ain" db of this 
ccf0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
cd00: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cd20: 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74  ize of changeset
cd30: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76   in bytes */.  v
cd40: 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c  oid *pChangeset,
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd60: 2a 20 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62  * Changeset blob
cd70: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74   */.  int(*xFilt
cd80: 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  er)(.    void *p
cd90: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
cda0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
cdb0: 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
cdc0: 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63  apply() */.    c
cdd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdf0: 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
ce00: 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c  ),.  int(*xConfl
ce10: 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a  ict)(.    void *
ce20: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
ce30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
ce40: 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20  of sixth arg to 
ce50: 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20  _apply() */.    
ce60: 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20  int eConflict,  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce80: 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20   DATA, MISSING, 
ce90: 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52  CONFLICT, CONSTR
cea0: 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69  AINT */.    sqli
ceb0: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
cec0: 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e  er *p     /* Han
ced0: 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63  dle describing c
cee0: 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69  hange and confli
cef0: 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69  ct */.  ),.  voi
cf00: 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20  d *pCtx         
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf20: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
cf30: 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69  assed to xConfli
cf40: 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c  ct */.);.int sql
cf50: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
cf60: 70 6c 79 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ply_v2(.  sqlite
cf70: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
cf80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
cf90: 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61  ly change to "ma
cfa0: 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68  in" db of this h
cfb0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
cfc0: 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20  Changeset,      
cfd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cfe0: 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20  ze of changeset 
cff0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f  in bytes */.  vo
d000: 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20  id *pChangeset, 
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d020: 20 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20   Changeset blob 
d030: 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65  */.  int(*xFilte
d040: 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  r)(.    void *pC
d050: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
d060: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
d070: 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
d080: 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f  pply() */.    co
d090: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20  nst char *zTab  
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d0b0: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29  able name */.  )
d0c0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69  ,.  int(*xConfli
d0d0: 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  ct)(.    void *p
d0e0: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
d0f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
d100: 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
d110: 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69  apply() */.    i
d120: 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20  nt eConflict,   
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d140: 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43  DATA, MISSING, C
d150: 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41  ONFLICT, CONSTRA
d160: 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INT */.    sqlit
d170: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
d180: 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64  r *p     /* Hand
d190: 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68  le describing ch
d1a0: 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63  ange and conflic
d1b0: 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64  t */.  ),.  void
d1c0: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d1e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
d1f0: 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63  ssed to xConflic
d200: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
d210: 52 65 62 61 73 65 2c 20 69 6e 74 20 2a 70 6e 52  Rebase, int *pnR
d220: 65 62 61 73 65 2c 20 2f 2a 20 4f 55 54 3a 20 52  ebase, /* OUT: R
d230: 65 62 61 73 65 20 64 61 74 61 20 2a 2f 0a 20 20  ebase data */.  
d240: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 2f 2a 20 53 45 53 53 49 4f 4e 5f 43 48 41 4e 47  /* SESSION_CHANG
d270: 45 53 45 54 41 50 50 4c 59 5f 2a 20 66 6c 61 67  ESETAPPLY_* flag
d280: 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.);../*.** C
d290: 41 50 49 33 52 45 46 3a 20 46 6c 61 67 73 20 66  API3REF: Flags f
d2a0: 6f 72 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  or sqlite3change
d2b0: 73 65 74 5f 61 70 70 6c 79 5f 76 32 0a 2a 2a 0a  set_apply_v2.**.
d2c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d2d0: 20 66 6c 61 67 73 20 6d 61 79 20 70 61 73 73 65   flags may passe
d2e0: 64 20 76 69 61 20 74 68 65 20 39 74 68 20 70 61  d via the 9th pa
d2f0: 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 5b 73  rameter to.** [s
d300: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
d310: 61 70 70 6c 79 5f 76 32 5d 20 61 6e 64 20 5b 73  apply_v2] and [s
d320: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
d330: 61 70 70 6c 79 5f 76 32 5f 73 74 72 6d 5d 3a 0a  apply_v2_strm]:.
d340: 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64  **.** <dl>.** <d
d350: 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  t>SQLITE_CHANGES
d360: 45 54 41 50 50 4c 59 5f 4e 4f 53 41 56 45 50 4f  ETAPPLY_NOSAVEPO
d370: 49 4e 54 20 3c 64 64 3e 0a 2a 2a 20 20 20 55 73  INT <dd>.**   Us
d380: 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 73 73 69  ually, the sessi
d390: 6f 6e 73 20 6d 6f 64 75 6c 65 20 65 6e 63 6c 6f  ons module enclo
d3a0: 73 65 73 20 61 6c 6c 20 6f 70 65 72 61 74 69 6f  ses all operatio
d3b0: 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 0a  ns performed by.
d3c0: 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 63 61  **   a single ca
d3d0: 6c 6c 20 74 6f 20 61 70 70 6c 79 5f 76 32 28 29  ll to apply_v2()
d3e0: 20 6f 72 20 61 70 70 6c 79 5f 76 32 5f 73 74 72   or apply_v2_str
d3f0: 6d 28 29 20 69 6e 20 61 20 5b 53 41 56 45 50 4f  m() in a [SAVEPO
d400: 49 4e 54 5d 2e 20 54 68 65 0a 2a 2a 20 20 20 53  INT]. The.**   S
d410: 41 56 45 50 4f 49 4e 54 20 69 73 20 63 6f 6d 6d  AVEPOINT is comm
d420: 69 74 74 65 64 20 69 66 20 74 68 65 20 63 68 61  itted if the cha
d430: 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73  ngeset or patchs
d440: 65 74 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  et is successful
d450: 6c 79 0a 2a 2a 20 20 20 61 70 70 6c 69 65 64 2c  ly.**   applied,
d460: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
d470: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
d480: 72 73 2e 20 53 70 65 63 69 66 79 69 6e 67 20 74  rs. Specifying t
d490: 68 69 73 20 66 6c 61 67 0a 2a 2a 20 20 20 63 61  his flag.**   ca
d4a0: 75 73 65 73 20 74 68 65 20 73 65 73 73 69 6f 6e  uses the session
d4b0: 73 20 6d 6f 64 75 6c 65 20 74 6f 20 6f 6d 69 74  s module to omit
d4c0: 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 2e   this savepoint.
d4d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
d4e0: 66 20 74 68 65 0a 2a 2a 20 20 20 63 61 6c 6c 65  f the.**   calle
d4f0: 72 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  r has an open tr
d500: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76  ansaction or sav
d510: 65 70 6f 69 6e 74 20 77 68 65 6e 20 61 70 70 6c  epoint when appl
d520: 79 5f 76 32 28 29 20 69 73 20 63 61 6c 6c 65 64  y_v2() is called
d530: 2c 20 0a 2a 2a 20 20 20 69 74 20 6d 61 79 20 72  , .**   it may r
d540: 65 76 65 72 74 20 74 68 65 20 70 61 72 74 69 61  evert the partia
d550: 6c 6c 79 20 61 70 70 6c 69 65 64 20 63 68 61 6e  lly applied chan
d560: 67 65 73 65 74 20 62 79 20 72 6f 6c 6c 69 6e 67  geset by rolling
d570: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
d580: 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47  <dt>SQLITE_CHANG
d590: 45 53 45 54 41 50 50 4c 59 5f 49 4e 56 45 52 54  ESETAPPLY_INVERT
d5a0: 20 3c 64 64 3e 0a 2a 2a 20 20 20 49 6e 76 65 72   <dd>.**   Inver
d5b0: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  t the changeset 
d5c0: 62 65 66 6f 72 65 20 61 70 70 6c 79 69 6e 67 20  before applying 
d5d0: 69 74 2e 20 54 68 69 73 20 69 73 20 65 71 75 69  it. This is equi
d5e0: 76 61 6c 65 6e 74 20 74 6f 20 69 6e 76 65 72 74  valent to invert
d5f0: 69 6e 67 0a 2a 2a 20 20 20 61 20 63 68 61 6e 67  ing.**   a chang
d600: 65 73 65 74 20 75 73 69 6e 67 20 73 71 6c 69 74  eset using sqlit
d610: 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  e3changeset_inve
d620: 72 74 28 29 20 62 65 66 6f 72 65 20 61 70 70 6c  rt() before appl
d630: 79 69 6e 67 20 69 74 2e 20 49 74 20 69 73 0a 2a  ying it. It is.*
d640: 2a 20 20 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  *   an error to 
d650: 73 70 65 63 69 66 79 20 74 68 69 73 20 66 6c 61  specify this fla
d660: 67 20 77 69 74 68 20 61 20 70 61 74 63 68 73 65  g with a patchse
d670: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  t..*/.#define SQ
d680: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41 50  LITE_CHANGESETAP
d690: 50 4c 59 5f 4e 4f 53 41 56 45 50 4f 49 4e 54 20  PLY_NOSAVEPOINT 
d6a0: 20 20 30 78 30 30 30 31 0a 23 64 65 66 69 6e 65    0x0001.#define
d6b0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
d6c0: 54 41 50 50 4c 59 5f 49 4e 56 45 52 54 20 20 20  TAPPLY_INVERT   
d6d0: 20 20 20 20 20 30 78 30 30 30 32 0a 0a 2f 2a 20       0x0002../* 
d6e0: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f  .** CAPI3REF: Co
d6f0: 6e 73 74 61 6e 74 73 20 50 61 73 73 65 64 20 54  nstants Passed T
d700: 6f 20 54 68 65 20 43 6f 6e 66 6c 69 63 74 20 48  o The Conflict H
d710: 61 6e 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 56 61 6c  andler.**.** Val
d720: 75 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ues that may be 
d730: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
d740: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
d750: 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64   a conflict-hand
d760: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a  ler..**.** <dl>.
d770: 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48  ** <dt>SQLITE_CH
d780: 41 4e 47 45 53 45 54 5f 44 41 54 41 3c 64 64 3e  ANGESET_DATA<dd>
d790: 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69  .**   The confli
d7a0: 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e  ct handler is in
d7b0: 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47  voked with CHANG
d7c0: 45 53 45 54 5f 44 41 54 41 20 61 73 20 74 68 65  ESET_DATA as the
d7d0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d7e0: 0a 2a 2a 20 20 20 77 68 65 6e 20 70 72 6f 63 65  .**   when proce
d7f0: 73 73 69 6e 67 20 61 20 44 45 4c 45 54 45 20 6f  ssing a DELETE o
d800: 72 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 20  r UPDATE change 
d810: 69 66 20 61 20 72 6f 77 20 77 69 74 68 20 74 68  if a row with th
d820: 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20  e required.**   
d830: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c  PRIMARY KEY fiel
d840: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  ds is present in
d850: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62   the database, b
d860: 75 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ut one or more o
d870: 74 68 65 72 20 0a 2a 2a 20 20 20 28 6e 6f 6e 20  ther .**   (non 
d880: 70 72 69 6d 61 72 79 2d 6b 65 79 29 20 66 69 65  primary-key) fie
d890: 6c 64 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  lds modified by 
d8a0: 74 68 65 20 75 70 64 61 74 65 20 64 6f 20 6e 6f  the update do no
d8b0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 0a 2a  t contain the .*
d8c0: 2a 20 20 20 65 78 70 65 63 74 65 64 20 22 62 65  *   expected "be
d8d0: 66 6f 72 65 22 20 76 61 6c 75 65 73 2e 0a 2a 2a  fore" values..**
d8e0: 20 0a 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c   .**   The confl
d8f0: 69 63 74 69 6e 67 20 72 6f 77 2c 20 69 6e 20 74  icting row, in t
d900: 68 69 73 20 63 61 73 65 2c 20 69 73 20 74 68 65  his case, is the
d910: 20 64 61 74 61 62 61 73 65 20 72 6f 77 20 77 69   database row wi
d920: 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a  th the matching.
d930: 2a 2a 20 20 20 70 72 69 6d 61 72 79 20 6b 65 79  **   primary key
d940: 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c  ..** .** <dt>SQL
d950: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f  ITE_CHANGESET_NO
d960: 54 46 4f 55 4e 44 3c 64 64 3e 0a 2a 2a 20 20 20  TFOUND<dd>.**   
d970: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  The conflict han
d980: 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20  dler is invoked 
d990: 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f 4e  with CHANGESET_N
d9a0: 4f 54 46 4f 55 4e 44 20 61 73 20 74 68 65 20 73  OTFOUND as the s
d9b0: 65 63 6f 6e 64 0a 2a 2a 20 20 20 61 72 67 75 6d  econd.**   argum
d9c0: 65 6e 74 20 77 68 65 6e 20 70 72 6f 63 65 73 73  ent when process
d9d0: 69 6e 67 20 61 20 44 45 4c 45 54 45 20 6f 72 20  ing a DELETE or 
d9e0: 55 50 44 41 54 45 20 63 68 61 6e 67 65 20 69 66  UPDATE change if
d9f0: 20 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 0a   a row with the.
da00: 2a 2a 20 20 20 72 65 71 75 69 72 65 64 20 50 52  **   required PR
da10: 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 73  IMARY KEY fields
da20: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
da30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
da40: 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 65 72 65 20  .** .**   There 
da50: 69 73 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e  is no conflictin
da60: 67 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61  g row in this ca
da70: 73 65 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20  se. The results 
da80: 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 0a  of invoking the.
da90: 2a 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e  **   sqlite3chan
daa0: 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74 28 29  geset_conflict()
dab0: 20 41 50 49 20 61 72 65 20 75 6e 64 65 66 69 6e   API are undefin
dac0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53  ed..** .** <dt>S
dad0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
dae0: 43 4f 4e 46 4c 49 43 54 3c 64 64 3e 0a 2a 2a 20  CONFLICT<dd>.** 
daf0: 20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46    CHANGESET_CONF
db00: 4c 49 43 54 20 69 73 20 70 61 73 73 65 64 20 61  LICT is passed a
db10: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
db20: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e  ument to the con
db30: 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c  flict.**   handl
db40: 65 72 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  er while process
db50: 69 6e 67 20 61 6e 20 49 4e 53 45 52 54 20 63 68  ing an INSERT ch
db60: 61 6e 67 65 20 69 66 20 74 68 65 20 6f 70 65 72  ange if the oper
db70: 61 74 69 6f 6e 20 77 6f 75 6c 64 20 72 65 73 75  ation would resu
db80: 6c 74 20 0a 2a 2a 20 20 20 69 6e 20 64 75 70 6c  lt .**   in dupl
db90: 69 63 61 74 65 20 70 72 69 6d 61 72 79 20 6b 65  icate primary ke
dba0: 79 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a 2a 2a  y values..** .**
dbb0: 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 69     The conflicti
dbc0: 6e 67 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63  ng row in this c
dbd0: 61 73 65 20 69 73 20 74 68 65 20 64 61 74 61 62  ase is the datab
dbe0: 61 73 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  ase row with the
dbf0: 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 20 20 70   matching.**   p
dc00: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
dc10: 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41  * <dt>SQLITE_CHA
dc20: 4e 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b  NGESET_FOREIGN_K
dc30: 45 59 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 66  EY<dd>.**   If f
dc40: 6f 72 65 69 67 6e 20 6b 65 79 20 68 61 6e 64 6c  oreign key handl
dc50: 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ing is enabled, 
dc60: 61 6e 64 20 61 70 70 6c 79 69 6e 67 20 61 20 63  and applying a c
dc70: 68 61 6e 67 65 73 65 74 20 6c 65 61 76 65 73 20  hangeset leaves 
dc80: 74 68 65 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  the.**   databas
dc90: 65 20 69 6e 20 61 20 73 74 61 74 65 20 63 6f 6e  e in a state con
dca0: 74 61 69 6e 69 6e 67 20 66 6f 72 65 69 67 6e 20  taining foreign 
dcb0: 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  key violations, 
dcc0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a  the conflict .**
dcd0: 20 20 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e     handler is in
dce0: 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47  voked with CHANG
dcf0: 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  ESET_FOREIGN_KEY
dd00: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
dd10: 72 67 75 6d 65 6e 74 0a 2a 2a 20 20 20 65 78 61  rgument.**   exa
dd20: 63 74 6c 79 20 6f 6e 63 65 20 62 65 66 6f 72 65  ctly once before
dd30: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69   the changeset i
dd40: 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  s committed. If 
dd50: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
dd60: 64 6c 65 72 0a 2a 2a 20 20 20 72 65 74 75 72 6e  dler.**   return
dd70: 73 20 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54  s CHANGESET_OMIT
dd80: 2c 20 74 68 65 20 63 68 61 6e 67 65 73 2c 20 69  , the changes, i
dd90: 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74  ncluding those t
dda0: 68 61 74 20 63 61 75 73 65 64 20 74 68 65 0a 2a  hat caused the.*
ddb0: 2a 20 20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  *   foreign key 
ddc0: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
ddd0: 74 69 6f 6e 2c 20 61 72 65 20 63 6f 6d 6d 69 74  tion, are commit
dde0: 74 65 64 2e 20 4f 72 2c 20 69 66 20 69 74 20 72  ted. Or, if it r
ddf0: 65 74 75 72 6e 73 0a 2a 2a 20 20 20 43 48 41 4e  eturns.**   CHAN
de00: 47 45 53 45 54 5f 41 42 4f 52 54 2c 20 74 68 65  GESET_ABORT, the
de10: 20 63 68 61 6e 67 65 73 65 74 20 69 73 20 72 6f   changeset is ro
de20: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
de30: 20 20 20 4e 6f 20 63 75 72 72 65 6e 74 20 6f 72     No current or
de40: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
de50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
de60: 70 72 6f 76 69 64 65 64 2e 20 54 68 65 20 6f 6e  provided. The on
de70: 6c 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  ly function.**  
de80: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
de90: 74 6f 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  to call on the s
dea0: 75 70 70 6c 69 65 64 20 73 71 6c 69 74 65 33 5f  upplied sqlite3_
deb0: 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 68  changeset_iter h
dec0: 61 6e 64 6c 65 0a 2a 2a 20 20 20 69 73 20 73 71  andle.**   is sq
ded0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66  lite3changeset_f
dee0: 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 29 2e 0a 2a  k_conflicts()..*
def0: 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  * .** <dt>SQLITE
df00: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54  _CHANGESET_CONST
df10: 52 41 49 4e 54 3c 64 64 3e 0a 2a 2a 20 20 20 49  RAINT<dd>.**   I
df20: 66 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 73  f any other cons
df30: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
df40: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 70   occurs while ap
df50: 70 6c 79 69 6e 67 20 61 20 63 68 61 6e 67 65 20  plying a change 
df60: 28 69 2e 65 2e 20 0a 2a 2a 20 20 20 61 20 55 4e  (i.e. .**   a UN
df70: 49 51 55 45 2c 20 43 48 45 43 4b 20 6f 72 20 4e  IQUE, CHECK or N
df80: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
df90: 6e 74 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63  nt), the conflic
dfa0: 74 20 68 61 6e 64 6c 65 72 20 69 73 20 0a 2a 2a  t handler is .**
dfb0: 20 20 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20     invoked with 
dfc0: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
dfd0: 41 49 4e 54 20 61 73 20 74 68 65 20 73 65 63 6f  AINT as the seco
dfe0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  nd argument..** 
dff0: 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e  .**   There is n
e000: 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  o conflicting ro
e010: 77 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  w in this case. 
e020: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 69  The results of i
e030: 6e 76 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 20  nvoking the.**  
e040: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
e050: 74 5f 63 6f 6e 66 6c 69 63 74 28 29 20 41 50 49  t_conflict() API
e060: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
e070: 2a 2a 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23  **.** </dl>.*/.#
e080: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48  define SQLITE_CH
e090: 41 4e 47 45 53 45 54 5f 44 41 54 41 20 20 20 20  ANGESET_DATA    
e0a0: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51      1.#define SQ
e0b0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e  LITE_CHANGESET_N
e0c0: 4f 54 46 4f 55 4e 44 20 20 20 20 32 0a 23 64 65  OTFOUND    2.#de
e0d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e  fine SQLITE_CHAN
e0e0: 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 20  GESET_CONFLICT  
e0f0: 20 20 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    3.#define SQLI
e100: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
e110: 53 54 52 41 49 4e 54 20 20 34 0a 23 64 65 66 69  STRAINT  4.#defi
e120: 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ne SQLITE_CHANGE
e130: 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20  SET_FOREIGN_KEY 
e140: 35 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52  5../* .** CAPI3R
e150: 45 46 3a 20 43 6f 6e 73 74 61 6e 74 73 20 52 65  EF: Constants Re
e160: 74 75 72 6e 65 64 20 42 79 20 54 68 65 20 43 6f  turned By The Co
e170: 6e 66 6c 69 63 74 20 48 61 6e 64 6c 65 72 0a 2a  nflict Handler.*
e180: 2a 0a 2a 2a 20 41 20 63 6f 6e 66 6c 69 63 74 20  *.** A conflict 
e190: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
e1a0: 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6f 6e 65   must return one
e1b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
e1c0: 67 20 74 68 72 65 65 20 76 61 6c 75 65 73 2e 0a  g three values..
e1d0: 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64  **.** <dl>.** <d
e1e0: 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  t>SQLITE_CHANGES
e1f0: 45 54 5f 4f 4d 49 54 3c 64 64 3e 0a 2a 2a 20 20  ET_OMIT<dd>.**  
e200: 20 49 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 68   If a conflict h
e210: 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20 74  andler returns t
e220: 68 69 73 20 76 61 6c 75 65 20 6e 6f 20 73 70 65  his value no spe
e230: 63 69 61 6c 20 61 63 74 69 6f 6e 20 69 73 20 74  cial action is t
e240: 61 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20 20 20 63  aken. The.**   c
e250: 68 61 6e 67 65 20 74 68 61 74 20 63 61 75 73 65  hange that cause
e260: 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 69  d the conflict i
e270: 73 20 6e 6f 74 20 61 70 70 6c 69 65 64 2e 20 54  s not applied. T
e280: 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c  he session modul
e290: 65 20 0a 2a 2a 20 20 20 63 6f 6e 74 69 6e 75 65  e .**   continue
e2a0: 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  s to the next ch
e2b0: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
e2c0: 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74  geset..**.** <dt
e2d0: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
e2e0: 54 5f 52 45 50 4c 41 43 45 3c 64 64 3e 0a 2a 2a  T_REPLACE<dd>.**
e2f0: 20 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61     This value ma
e300: 79 20 6f 6e 6c 79 20 62 65 20 72 65 74 75 72 6e  y only be return
e310: 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
e320: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
e330: 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68   conflict.**   h
e340: 61 6e 64 6c 65 72 20 77 61 73 20 53 51 4c 49 54  andler was SQLIT
e350: 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41  E_CHANGESET_DATA
e360: 20 6f 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47   or SQLITE_CHANG
e370: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 20 49  ESET_CONFLICT. I
e380: 66 20 74 68 69 73 0a 2a 2a 20 20 20 69 73 20 6e  f this.**   is n
e390: 6f 74 20 74 68 65 20 63 61 73 65 2c 20 61 6e 79  ot the case, any
e3a0: 20 63 68 61 6e 67 65 73 20 61 70 70 6c 69 65 64   changes applied
e3b0: 20 73 6f 20 66 61 72 20 61 72 65 20 72 6f 6c 6c   so far are roll
e3c0: 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 65 20  ed back and the 
e3d0: 0a 2a 2a 20 20 20 63 61 6c 6c 20 74 6f 20 73 71  .**   call to sq
e3e0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
e3f0: 70 70 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53  pply() returns S
e400: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2a  QLITE_MISUSE..**
e410: 0a 2a 2a 20 20 20 49 66 20 43 48 41 4e 47 45 53  .**   If CHANGES
e420: 45 54 5f 52 45 50 4c 41 43 45 20 69 73 20 72 65  ET_REPLACE is re
e430: 74 75 72 6e 65 64 20 62 79 20 61 6e 20 53 51 4c  turned by an SQL
e440: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41  ITE_CHANGESET_DA
e450: 54 41 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20  TA conflict.**  
e460: 20 68 61 6e 64 6c 65 72 2c 20 74 68 65 6e 20 74   handler, then t
e470: 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  he conflicting r
e480: 6f 77 20 69 73 20 65 69 74 68 65 72 20 75 70 64  ow is either upd
e490: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2c  ated or deleted,
e4a0: 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20 20   depending.**   
e4b0: 6f 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 63  on the type of c
e4c0: 68 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  hange..**.**   I
e4d0: 66 20 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  f CHANGESET_REPL
e4e0: 41 43 45 20 69 73 20 72 65 74 75 72 6e 65 64 20  ACE is returned 
e4f0: 62 79 20 61 6e 20 53 51 4c 49 54 45 5f 43 48 41  by an SQLITE_CHA
e500: 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20  NGESET_CONFLICT 
e510: 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61  conflict.**   ha
e520: 6e 64 6c 65 72 2c 20 74 68 65 6e 20 74 68 65 20  ndler, then the 
e530: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20  conflicting row 
e540: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
e550: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
e560: 20 61 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 61   a.**   second a
e570: 74 74 65 6d 70 74 20 74 6f 20 61 70 70 6c 79 20  ttempt to apply 
e580: 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 6d 61  the change is ma
e590: 64 65 2e 20 49 66 20 74 68 69 73 20 73 65 63 6f  de. If this seco
e5a0: 6e 64 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  nd attempt fails
e5b0: 2c 0a 2a 2a 20 20 20 74 68 65 20 6f 72 69 67 69  ,.**   the origi
e5c0: 6e 61 6c 20 72 6f 77 20 69 73 20 72 65 73 74 6f  nal row is resto
e5d0: 72 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  red to the datab
e5e0: 61 73 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  ase before conti
e5f0: 6e 75 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74  nuing..**.** <dt
e600: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
e610: 54 5f 41 42 4f 52 54 3c 64 64 3e 0a 2a 2a 20 20  T_ABORT<dd>.**  
e620: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
e630: 73 20 72 65 74 75 72 6e 65 64 2c 20 61 6e 79 20  s returned, any 
e640: 63 68 61 6e 67 65 73 20 61 70 70 6c 69 65 64 20  changes applied 
e650: 73 6f 20 66 61 72 20 61 72 65 20 72 6f 6c 6c 65  so far are rolle
e660: 64 20 62 61 63 6b 20 0a 2a 2a 20 20 20 61 6e 64  d back .**   and
e670: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
e680: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
e690: 70 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51  ply() returns SQ
e6a0: 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 2a 2a 20 3c  LITE_ABORT..** <
e6b0: 2f 64 6c 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  /dl>.*/.#define 
e6c0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
e6d0: 5f 4f 4d 49 54 20 20 20 20 20 20 20 30 0a 23 64  _OMIT       0.#d
e6e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
e6f0: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 20  NGESET_REPLACE  
e700: 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    1.#define SQLI
e710: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f  TE_CHANGESET_ABO
e720: 52 54 20 20 20 20 20 20 32 0a 0a 2f 2a 20 0a 2a  RT      2../* .*
e730: 2a 20 43 41 50 49 33 52 45 46 3a 20 52 65 62 61  * CAPI3REF: Reba
e740: 73 69 6e 67 20 63 68 61 6e 67 65 73 65 74 73 0a  sing changesets.
e750: 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a  ** EXPERIMENTAL.
e760: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
e770: 65 72 65 20 69 73 20 61 20 73 69 74 65 20 68 6f  ere is a site ho
e780: 73 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  sting a database
e790: 20 69 6e 20 73 74 61 74 65 20 53 30 2e 20 41 6e   in state S0. An
e7a0: 64 20 74 68 61 74 0a 2a 2a 20 6d 6f 64 69 66 69  d that.** modifi
e7b0: 63 61 74 69 6f 6e 73 20 61 72 65 20 6d 61 64 65  cations are made
e7c0: 20 74 68 61 74 20 6d 6f 76 65 20 74 68 61 74 20   that move that 
e7d0: 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 61 74  database to stat
e7e0: 65 20 53 31 20 61 6e 64 20 61 0a 2a 2a 20 63 68  e S1 and a.** ch
e7f0: 61 6e 67 65 73 65 74 20 72 65 63 6f 72 64 65 64  angeset recorded
e800: 20 28 74 68 65 20 22 6c 6f 63 61 6c 22 20 63 68   (the "local" ch
e810: 61 6e 67 65 73 65 74 29 2e 20 54 68 65 6e 2c 20  angeset). Then, 
e820: 61 20 63 68 61 6e 67 65 73 65 74 20 62 61 73 65  a changeset base
e830: 64 0a 2a 2a 20 6f 6e 20 53 30 20 69 73 20 72 65  d.** on S0 is re
e840: 63 65 69 76 65 64 20 66 72 6f 6d 20 61 6e 6f 74  ceived from anot
e850: 68 65 72 20 73 69 74 65 20 28 74 68 65 20 22 72  her site (the "r
e860: 65 6d 6f 74 65 22 20 63 68 61 6e 67 65 73 65 74  emote" changeset
e870: 29 20 61 6e 64 20 0a 2a 2a 20 61 70 70 6c 69 65  ) and .** applie
e880: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
e890: 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
e8a0: 69 73 20 74 68 65 6e 20 69 6e 20 73 74 61 74 65  is then in state
e8b0: 20 0a 2a 2a 20 28 53 31 2b 22 72 65 6d 6f 74 65   .** (S1+"remote
e8c0: 22 29 2c 20 77 68 65 72 65 20 74 68 65 20 65 78  "), where the ex
e8d0: 61 63 74 20 73 74 61 74 65 20 64 65 70 65 6e 64  act state depend
e8e0: 73 20 6f 6e 20 61 6e 79 20 63 6f 6e 66 6c 69 63  s on any conflic
e8f0: 74 0a 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20  t.** resolution 
e900: 64 65 63 69 73 69 6f 6e 73 20 28 4f 4d 49 54 20  decisions (OMIT 
e910: 6f 72 20 52 45 50 4c 41 43 45 29 20 6d 61 64 65  or REPLACE) made
e920: 20 77 68 69 6c 65 20 61 70 70 6c 79 69 6e 67 20   while applying 
e930: 22 72 65 6d 6f 74 65 22 2e 0a 2a 2a 20 52 65 62  "remote"..** Reb
e940: 61 73 69 6e 67 20 61 20 63 68 61 6e 67 65 73 65  asing a changese
e950: 74 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 69  t is to update i
e960: 74 20 74 6f 20 74 61 6b 65 20 74 68 6f 73 65 20  t to take those 
e970: 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20 72 65 73  conflict .** res
e980: 6f 6c 75 74 69 6f 6e 20 64 65 63 69 73 69 6f 6e  olution decision
e990: 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20  s into account, 
e9a0: 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
e9b0: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 64 6f   conflicts.** do
e9c0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20   not have to be 
e9d0: 72 65 73 6f 6c 76 65 64 20 65 6c 73 65 77 68 65  resolved elsewhe
e9e0: 72 65 20 69 6e 20 74 68 65 20 6e 65 74 77 6f 72  re in the networ
e9f0: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  k. .**.** For ex
ea00: 61 6d 70 6c 65 2c 20 69 66 20 62 6f 74 68 20 74  ample, if both t
ea10: 68 65 20 6c 6f 63 61 6c 20 61 6e 64 20 72 65 6d  he local and rem
ea20: 6f 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 63  ote changesets c
ea30: 6f 6e 74 61 69 6e 20 61 6e 0a 2a 2a 20 49 4e 53  ontain an.** INS
ea40: 45 52 54 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ERT of the same 
ea50: 6b 65 79 20 6f 6e 20 22 43 52 45 41 54 45 20 54  key on "CREATE T
ea60: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
ea70: 59 20 4b 45 59 2c 20 62 29 22 3a 0a 2a 2a 0a 2a  Y KEY, b)":.**.*
ea80: 2a 20 20 20 6c 6f 63 61 6c 3a 20 20 49 4e 53 45  *   local:  INSE
ea90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
eaa0: 53 28 31 2c 20 27 76 31 27 29 3b 0a 2a 2a 20 20  S(1, 'v1');.**  
eab0: 20 72 65 6d 6f 74 65 3a 20 49 4e 53 45 52 54 20   remote: INSERT 
eac0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
ead0: 2c 20 27 76 32 27 29 3b 0a 2a 2a 0a 2a 2a 20 61  , 'v2');.**.** a
eae0: 6e 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  nd the conflict 
eaf0: 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 52 45  resolution is RE
eb00: 50 4c 41 43 45 2c 20 74 68 65 6e 20 74 68 65 20  PLACE, then the 
eb10: 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 69 73  INSERT change is
eb20: 0a 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  .** removed from
eb30: 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67   the local chang
eb40: 65 73 65 74 20 28 69 74 20 77 61 73 20 6f 76 65  eset (it was ove
eb50: 72 72 69 64 64 65 6e 29 2e 20 4f 72 2c 20 69 66  rridden). Or, if
eb60: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
eb70: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20   resolution was 
eb80: 22 4f 4d 49 54 22 2c 20 74 68 65 6e 20 74 68 65  "OMIT", then the
eb90: 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74   local changeset
eba0: 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20   is modified.** 
ebb0: 74 6f 20 69 6e 73 74 65 61 64 20 63 6f 6e 74 61  to instead conta
ebc0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  in:.**.**       
ebd0: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
ebe0: 54 20 62 20 3d 20 27 76 32 27 20 57 48 45 52 45  T b = 'v2' WHERE
ebf0: 20 61 3d 31 3b 0a 2a 2a 0a 2a 2a 20 43 68 61 6e   a=1;.**.** Chan
ec00: 67 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 6c  ges within the l
ec10: 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74 20 61  ocal changeset a
ec20: 72 65 20 72 65 62 61 73 65 64 20 61 73 20 66 6f  re rebased as fo
ec30: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 64 6c  llows:.**.** <dl
ec40: 3e 0a 2a 2a 20 3c 64 74 3e 4c 6f 63 61 6c 20 49  >.** <dt>Local I
ec50: 4e 53 45 52 54 3c 64 64 3e 0a 2a 2a 20 20 20 54  NSERT<dd>.**   T
ec60: 68 69 73 20 6d 61 79 20 6f 6e 6c 79 20 63 6f 6e  his may only con
ec70: 66 6c 69 63 74 20 77 69 74 68 20 61 20 72 65 6d  flict with a rem
ec80: 6f 74 65 20 49 4e 53 45 52 54 2e 20 49 66 20 74  ote INSERT. If t
ec90: 68 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20  he conflict .** 
eca0: 20 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77 61 73    resolution was
ecb0: 20 4f 4d 49 54 2c 20 74 68 65 6e 20 61 64 64 20   OMIT, then add 
ecc0: 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67 65  an UPDATE change
ecd0: 20 74 6f 20 74 68 65 20 72 65 62 61 73 65 64 0a   to the rebased.
ece0: 2a 2a 20 20 20 63 68 61 6e 67 65 73 65 74 2e 20  **   changeset. 
ecf0: 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
ed00: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 77  ict resolution w
ed10: 61 73 20 52 45 50 4c 41 43 45 2c 20 61 64 64 0a  as REPLACE, add.
ed20: 2a 2a 20 20 20 6e 6f 74 68 69 6e 67 20 74 6f 20  **   nothing to 
ed30: 74 68 65 20 72 65 62 61 73 65 64 20 63 68 61 6e  the rebased chan
ed40: 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74  geset..**.** <dt
ed50: 3e 4c 6f 63 61 6c 20 44 45 4c 45 54 45 3c 64 64  >Local DELETE<dd
ed60: 3e 0a 2a 2a 20 20 20 54 68 69 73 20 6d 61 79 20  >.**   This may 
ed70: 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61 20  conflict with a 
ed80: 72 65 6d 6f 74 65 20 55 50 44 41 54 45 20 6f 72  remote UPDATE or
ed90: 20 44 45 4c 45 54 45 2e 20 49 6e 20 62 6f 74 68   DELETE. In both
eda0: 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 20 20   cases the.**   
edb0: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 72 65  only possible re
edc0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 4f 4d 49 54  solution is OMIT
edd0: 2e 20 49 66 20 74 68 65 20 72 65 6d 6f 74 65 20  . If the remote 
ede0: 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 61 0a  operation was a.
edf0: 2a 2a 20 20 20 44 45 4c 45 54 45 2c 20 74 68 65  **   DELETE, the
ee00: 6e 20 61 64 64 20 6e 6f 20 63 68 61 6e 67 65 20  n add no change 
ee10: 74 6f 20 74 68 65 20 72 65 62 61 73 65 64 20 63  to the rebased c
ee20: 68 61 6e 67 65 73 65 74 2e 20 49 66 20 74 68 65  hangeset. If the
ee30: 20 72 65 6d 6f 74 65 0a 2a 2a 20 20 20 6f 70 65   remote.**   ope
ee40: 72 61 74 69 6f 6e 20 77 61 73 20 61 6e 20 55 50  ration was an UP
ee50: 44 41 54 45 2c 20 74 68 65 6e 20 74 68 65 20 6f  DATE, then the o
ee60: 6c 64 2e 2a 20 66 69 65 6c 64 73 20 6f 66 20 63  ld.* fields of c
ee70: 68 61 6e 67 65 20 61 72 65 20 75 70 64 61 74 65  hange are update
ee80: 64 0a 2a 2a 20 20 20 74 6f 20 72 65 66 6c 65 63  d.**   to reflec
ee90: 74 20 74 68 65 20 6e 65 77 2e 2a 20 76 61 6c 75  t the new.* valu
eea0: 65 73 20 69 6e 20 74 68 65 20 55 50 44 41 54 45  es in the UPDATE
eeb0: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 4c 6f 63 61  ..**.** <dt>Loca
eec0: 6c 20 55 50 44 41 54 45 3c 64 64 3e 0a 2a 2a 20  l UPDATE<dd>.** 
eed0: 20 20 54 68 69 73 20 6d 61 79 20 63 6f 6e 66 6c    This may confl
eee0: 69 63 74 20 77 69 74 68 20 61 20 72 65 6d 6f 74  ict with a remot
eef0: 65 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  e UPDATE or DELE
ef00: 54 45 2e 20 49 66 20 69 74 20 63 6f 6e 66 6c 69  TE. If it confli
ef10: 63 74 73 0a 2a 2a 20 20 20 77 69 74 68 20 61 20  cts.**   with a 
ef20: 44 45 4c 45 54 45 2c 20 61 6e 64 20 74 68 65 20  DELETE, and the 
ef30: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
ef40: 69 6f 6e 20 77 61 73 20 4f 4d 49 54 2c 20 74 68  ion was OMIT, th
ef50: 65 6e 20 74 68 65 20 75 70 64 61 74 65 0a 2a 2a  en the update.**
ef60: 20 20 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e     is changed in
ef70: 74 6f 20 61 6e 20 49 4e 53 45 52 54 2e 20 41 6e  to an INSERT. An
ef80: 79 20 75 6e 64 65 66 69 6e 65 64 20 76 61 6c 75  y undefined valu
ef90: 65 73 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  es in the new.* 
efa0: 72 65 63 6f 72 64 0a 2a 2a 20 20 20 66 72 6f 6d  record.**   from
efb0: 20 74 68 65 20 75 70 64 61 74 65 20 63 68 61 6e   the update chan
efc0: 67 65 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e  ge are filled in
efd0: 20 75 73 69 6e 67 20 74 68 65 20 6f 6c 64 2e 2a   using the old.*
efe0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 2a 2a 20   values from.** 
eff0: 20 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e    the conflictin
f000: 67 20 44 45 4c 45 54 45 2e 20 4f 72 2c 20 69 66  g DELETE. Or, if
f010: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
f020: 73 6f 6c 75 74 69 6f 6e 20 77 61 73 20 52 45 50  solution was REP
f030: 4c 41 43 45 2c 0a 2a 2a 20 20 20 74 68 65 20 55  LACE,.**   the U
f040: 50 44 41 54 45 20 63 68 61 6e 67 65 20 69 73 20  PDATE change is 
f050: 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 66  simply omitted f
f060: 72 6f 6d 20 74 68 65 20 72 65 62 61 73 65 64 20  rom the rebased 
f070: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a  changeset..**.**
f080: 20 20 20 49 66 20 63 6f 6e 66 6c 69 63 74 20 69     If conflict i
f090: 73 20 77 69 74 68 20 61 20 72 65 6d 6f 74 65 20  s with a remote 
f0a0: 55 50 44 41 54 45 20 61 6e 64 20 74 68 65 20 72  UPDATE and the r
f0b0: 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 4f 4d 49  esolution is OMI
f0c0: 54 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 65  T, then.**   the
f0d0: 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 61 72   old.* values ar
f0e0: 65 20 72 65 62 61 73 65 64 20 75 73 69 6e 67 20  e rebased using 
f0f0: 74 68 65 20 6e 65 77 2e 2a 20 76 61 6c 75 65 73  the new.* values
f100: 20 69 6e 20 74 68 65 20 72 65 6d 6f 74 65 0a 2a   in the remote.*
f110: 2a 20 20 20 63 68 61 6e 67 65 2e 20 4f 72 2c 20  *   change. Or, 
f120: 69 66 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f  if the resolutio
f130: 6e 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  n is REPLACE, th
f140: 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  en the change is
f150: 20 63 6f 70 69 65 64 0a 2a 2a 20 20 20 69 6e 74   copied.**   int
f160: 6f 20 74 68 65 20 72 65 62 61 73 65 64 20 63 68  o the rebased ch
f170: 61 6e 67 65 73 65 74 20 77 69 74 68 20 75 70 64  angeset with upd
f180: 61 74 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  ates to columns 
f190: 61 6c 73 6f 20 75 70 64 61 74 65 64 20 62 79 0a  also updated by.
f1a0: 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69 63  **   the conflic
f1b0: 74 69 6e 67 20 72 65 6d 6f 74 65 20 55 50 44 41  ting remote UPDA
f1c0: 54 45 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 74  TE removed. If t
f1d0: 68 69 73 20 6d 65 61 6e 73 20 6e 6f 20 63 6f 6c  his means no col
f1e0: 75 6d 6e 73 20 77 6f 75 6c 64 20 0a 2a 2a 20 20  umns would .**  
f1f0: 20 62 65 20 75 70 64 61 74 65 64 2c 20 74 68 65   be updated, the
f200: 20 63 68 61 6e 67 65 20 69 73 20 6f 6d 69 74 74   change is omitt
f210: 65 64 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2a 0a  ed..** </dl>.**.
f220: 2a 2a 20 41 20 6c 6f 63 61 6c 20 63 68 61 6e 67  ** A local chang
f230: 65 20 6d 61 79 20 62 65 20 72 65 62 61 73 65 64  e may be rebased
f240: 20 61 67 61 69 6e 73 74 20 6d 75 6c 74 69 70 6c   against multipl
f250: 65 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65 73  e remote changes
f260: 20 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75   .** simultaneou
f270: 73 6c 79 2e 20 49 66 20 61 20 73 69 6e 67 6c 65  sly. If a single
f280: 20 6b 65 79 20 69 73 20 6d 6f 64 69 66 69 65 64   key is modified
f290: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 6d   by multiple rem
f2a0: 6f 74 65 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65  ote .** changese
f2b0: 74 73 2c 20 74 68 65 79 20 61 72 65 20 63 6f 6d  ts, they are com
f2c0: 62 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  bined as follows
f2d0: 20 62 65 66 6f 72 65 20 74 68 65 20 6c 6f 63 61   before the loca
f2e0: 6c 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 69  l changeset.** i
f2f0: 73 20 72 65 62 61 73 65 64 3a 0a 2a 2a 0a 2a 2a  s rebased:.**.**
f300: 20 3c 75 6c 3e 0a 2a 2a 20 20 20 20 3c 6c 69 3e   <ul>.**    <li>
f310: 20 49 66 20 74 68 65 72 65 20 68 61 73 20 62 65   If there has be
f320: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 52  en one or more R
f330: 45 50 4c 41 43 45 20 72 65 73 6f 6c 75 74 69 6f  EPLACE resolutio
f340: 6e 73 20 6f 6e 20 61 0a 2a 2a 20 20 20 20 20 20  ns on a.**      
f350: 20 20 20 6b 65 79 2c 20 69 74 20 69 73 20 72 65     key, it is re
f360: 62 61 73 65 64 20 61 63 63 6f 72 64 69 6e 67 20  based according 
f370: 74 6f 20 61 20 52 45 50 4c 41 43 45 2e 0a 2a 2a  to a REPLACE..**
f380: 0a 2a 2a 20 20 20 20 3c 6c 69 3e 20 49 66 20 74  .**    <li> If t
f390: 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
f3a0: 6f 20 52 45 50 4c 41 43 45 20 72 65 73 6f 6c 75  o REPLACE resolu
f3b0: 74 69 6f 6e 73 20 6f 6e 20 61 20 6b 65 79 2c 20  tions on a key, 
f3c0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
f3d0: 74 68 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  the local change
f3e0: 73 65 74 20 69 73 20 72 65 62 61 73 65 64 20 61  set is rebased a
f3f0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
f400: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 20  most recent.**  
f410: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 4f 4d         of the OM
f420: 49 54 20 72 65 73 6f 6c 75 74 69 6f 6e 73 2e 0a  IT resolutions..
f430: 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 4e  ** </ul>.**.** N
f440: 6f 74 65 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  ote that conflic
f450: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 73 20 66 72  t resolutions fr
f460: 6f 6d 20 6d 75 6c 74 69 70 6c 65 20 72 65 6d 6f  om multiple remo
f470: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 72  te changesets ar
f480: 65 20 0a 2a 2a 20 63 6f 6d 62 69 6e 65 64 20 6f  e .** combined o
f490: 6e 20 61 20 70 65 72 2d 66 69 65 6c 64 20 62 61  n a per-field ba
f4a0: 73 69 73 2c 20 6e 6f 74 20 70 65 72 2d 72 6f 77  sis, not per-row
f4b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
f4c0: 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 61 73  t in the .** cas
f4d0: 65 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 72 65  e of multiple re
f4e0: 6d 6f 74 65 20 55 50 44 41 54 45 20 6f 70 65 72  mote UPDATE oper
f4f0: 61 74 69 6f 6e 73 2c 20 73 6f 6d 65 20 66 69 65  ations, some fie
f500: 6c 64 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  lds of a single 
f510: 0a 2a 2a 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  .** local change
f520: 20 6d 61 79 20 62 65 20 72 65 62 61 73 65 64 20   may be rebased 
f530: 66 6f 72 20 52 45 50 4c 41 43 45 20 77 68 69 6c  for REPLACE whil
f540: 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 62  e others are reb
f550: 61 73 65 64 20 66 6f 72 20 0a 2a 2a 20 4f 4d 49  ased for .** OMI
f560: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  T..**.** In orde
f570: 72 20 74 6f 20 72 65 62 61 73 65 20 61 20 6c 6f  r to rebase a lo
f580: 63 61 6c 20 63 68 61 6e 67 65 73 65 74 2c 20 74  cal changeset, t
f590: 68 65 20 72 65 6d 6f 74 65 20 63 68 61 6e 67 65  he remote change
f5a0: 73 65 74 20 6d 75 73 74 20 66 69 72 73 74 0a 2a  set must first.*
f5b0: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
f5c0: 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61  the local databa
f5d0: 73 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  se using sqlite3
f5e0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
f5f0: 76 32 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  v2() and.** the 
f600: 62 75 66 66 65 72 20 6f 66 20 72 65 62 61 73 65  buffer of rebase
f610: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 70   information cap
f620: 74 75 72 65 64 2e 20 54 68 65 6e 3a 0a 2a 2a 0a  tured. Then:.**.
f630: 2a 2a 20 3c 6f 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ol>.**   <li
f640: 3e 20 41 6e 20 73 71 6c 69 74 65 33 5f 72 65 62  > An sqlite3_reb
f650: 61 73 65 72 20 6f 62 6a 65 63 74 20 69 73 20 63  aser object is c
f660: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
f670: 67 20 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c  g .**        sql
f680: 69 74 65 33 72 65 62 61 73 65 72 5f 63 72 65 61  ite3rebaser_crea
f690: 74 65 28 29 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20  te()..**   <li> 
f6a0: 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  The new object i
f6b0: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74  s configured wit
f6c0: 68 20 74 68 65 20 72 65 62 61 73 65 20 62 75 66  h the rebase buf
f6d0: 66 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  fer obtained fro
f6e0: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69  m.**        sqli
f6f0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
f700: 6c 79 5f 76 32 28 29 20 62 79 20 63 61 6c 6c 69  ly_v2() by calli
f710: 6e 67 20 73 71 6c 69 74 65 33 72 65 62 61 73 65  ng sqlite3rebase
f720: 72 5f 63 6f 6e 66 69 67 75 72 65 28 29 2e 0a 2a  r_configure()..*
f730: 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20  *        If the 
f740: 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 65 74 20  local changeset 
f750: 69 73 20 74 6f 20 62 65 20 72 65 62 61 73 65 64  is to be rebased
f760: 20 61 67 61 69 6e 73 74 20 6d 75 6c 74 69 70 6c   against multipl
f770: 65 20 72 65 6d 6f 74 65 0a 2a 2a 20 20 20 20 20  e remote.**     
f780: 20 20 20 63 68 61 6e 67 65 73 65 74 73 2c 20 74     changesets, t
f790: 68 65 6e 20 73 71 6c 69 74 65 33 72 65 62 61 73  hen sqlite3rebas
f7a0: 65 72 5f 63 6f 6e 66 69 67 75 72 65 28 29 20 73  er_configure() s
f7b0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 0a  hould be called.
f7c0: 2a 2a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70  **        multip
f7d0: 6c 65 20 74 69 6d 65 73 2c 20 69 6e 20 74 68 65  le times, in the
f7e0: 20 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61 74   same order that
f7f0: 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a   the multiple.**
f800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63          sqlite3c
f810: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76  hangeset_apply_v
f820: 32 28 29 20 63 61 6c 6c 73 20 77 65 72 65 20 6d  2() calls were m
f830: 61 64 65 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45  ade..**   <li> E
f840: 61 63 68 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65  ach local change
f850: 73 65 74 20 69 73 20 72 65 62 61 73 65 64 20 62  set is rebased b
f860: 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
f870: 33 72 65 62 61 73 65 72 5f 72 65 62 61 73 65 28  3rebaser_rebase(
f880: 29 2e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65  )..**   <li> The
f890: 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72   sqlite3_rebaser
f8a0: 20 6f 62 6a 65 63 74 20 69 73 20 64 65 6c 65 74   object is delet
f8b0: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  ed by calling.**
f8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 72          sqlite3r
f8d0: 65 62 61 73 65 72 5f 64 65 6c 65 74 65 28 29 2e  ebaser_delete().
f8e0: 0a 2a 2a 20 3c 2f 6f 6c 3e 0a 2a 2f 0a 74 79 70  .** </ol>.*/.typ
f8f0: 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69  edef struct sqli
f900: 74 65 33 5f 72 65 62 61 73 65 72 20 73 71 6c 69  te3_rebaser sqli
f910: 74 65 33 5f 72 65 62 61 73 65 72 3b 0a 0a 2f 2a  te3_rebaser;../*
f920: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 72  .** CAPI3REF: Cr
f930: 65 61 74 65 20 61 20 63 68 61 6e 67 65 73 65 74  eate a changeset
f940: 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e   rebaser object.
f950: 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c  .** EXPERIMENTAL
f960: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  .**.** Allocate 
f970: 61 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 20  a new changeset 
f980: 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 20  rebaser object. 
f990: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
f9a0: 65 74 20 28 2a 70 70 4e 65 77 29 20 74 6f 0a 2a  et (*ppNew) to.*
f9b0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  * point to the n
f9c0: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
f9d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
f9e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
f9f0: 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
fa00: 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
fa10: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65  te error code (e
fa20: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
fa30: 29 20 61 6e 64 20 73 65 74 20 28 2a 70 70 4e 65  ) and set (*ppNe
fa40: 77 29 20 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  w) .** to NULL. 
fa50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
fa60: 65 62 61 73 65 72 5f 63 72 65 61 74 65 28 73 71  ebaser_create(sq
fa70: 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20 2a 2a  lite3_rebaser **
fa80: 70 70 4e 65 77 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ppNew);../*.** C
fa90: 41 50 49 33 52 45 46 3a 20 43 6f 6e 66 69 67 75  API3REF: Configu
faa0: 72 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 72  re a changeset r
fab0: 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  ebaser object..*
fac0: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a  * EXPERIMENTAL.*
fad0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74  *.** Configure t
fae0: 68 65 20 63 68 61 6e 67 65 73 65 74 20 72 65 62  he changeset reb
faf0: 61 73 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 72  aser object to r
fb00: 65 62 61 73 65 20 63 68 61 6e 67 65 73 65 74 73  ebase changesets
fb10: 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f   according.** to
fb20: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
fb30: 73 6f 6c 75 74 69 6f 6e 73 20 64 65 73 63 72 69  solutions descri
fb40: 62 65 64 20 62 79 20 62 75 66 66 65 72 20 70 52  bed by buffer pR
fb50: 65 62 61 73 65 20 28 73 69 7a 65 20 6e 52 65 62  ebase (size nReb
fb60: 61 73 65 0a 2a 2a 20 62 79 74 65 73 29 2c 20 77  ase.** bytes), w
fb70: 68 69 63 68 20 6d 75 73 74 20 68 61 76 65 20 62  hich must have b
fb80: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
fb90: 6d 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c  m a previous cal
fba0: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 63  l to.** sqlite3c
fbb0: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76  hangeset_apply_v
fbc0: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
fbd0: 74 65 33 72 65 62 61 73 65 72 5f 63 6f 6e 66 69  te3rebaser_confi
fbe0: 67 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  gure(.  sqlite3_
fbf0: 72 65 62 61 73 65 72 2a 2c 20 0a 20 20 69 6e 74  rebaser*, .  int
fc00: 20 6e 52 65 62 61 73 65 2c 20 63 6f 6e 73 74 20   nRebase, const 
fc10: 76 6f 69 64 20 2a 70 52 65 62 61 73 65 0a 29 3b  void *pRebase.);
fc20: 20 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45   ../*.** CAPI3RE
fc30: 46 3a 20 52 65 62 61 73 65 20 61 20 63 68 61 6e  F: Rebase a chan
fc40: 67 65 73 65 74 0a 2a 2a 20 45 58 50 45 52 49 4d  geset.** EXPERIM
fc50: 45 4e 54 41 4c 0a 2a 2a 0a 2a 2a 20 41 72 67 75  ENTAL.**.** Argu
fc60: 6d 65 6e 74 20 70 49 6e 20 6d 75 73 74 20 70 6f  ment pIn must po
fc70: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
fc80: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 68 61  containing a cha
fc90: 6e 67 65 73 65 74 20 6e 49 6e 20 62 79 74 65 73  ngeset nIn bytes
fca0: 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  .** in size. Thi
fcb0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
fcc0: 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74  ates and populat
fcd0: 65 73 20 61 20 62 75 66 66 65 72 20 77 69 74 68  es a buffer with
fce0: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
fcf0: 65 20 63 68 61 6e 67 65 73 65 74 20 72 65 62 61  e changeset reba
fd00: 73 65 64 20 72 65 62 61 73 65 64 20 61 63 63 6f  sed rebased acco
fd10: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6e  rding to the con
fd20: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  figuration of th
fd30: 65 0a 2a 2a 20 72 65 62 61 73 65 72 20 6f 62 6a  e.** rebaser obj
fd40: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
fd50: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
fd60: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
fd70: 20 28 2a 70 70 4f 75 74 29 0a 2a 2a 20 69 73 20   (*ppOut).** is 
fd80: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
fd90: 74 68 65 20 6e 65 77 20 62 75 66 66 65 72 20 63  the new buffer c
fda0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
fdb0: 62 61 73 65 64 20 63 68 61 6e 67 73 65 74 20 61  based changset a
fdc0: 6e 64 20 0a 2a 2a 20 28 2a 70 6e 4f 75 74 29 20  nd .** (*pnOut) 
fdd0: 74 6f 20 69 74 73 20 73 69 7a 65 20 69 6e 20 62  to its size in b
fde0: 79 74 65 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  ytes and SQLITE_
fdf0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  OK returned. It 
fe00: 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e  is the.** respon
fe10: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
fe20: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
fe30: 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 6e 65  ally free the ne
fe40: 77 20 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a  w buffer using.*
fe50: 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
fe60: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
fe70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
fe80: 20 28 2a 70 70 4f 75 74 29 20 61 6e 64 20 28 2a   (*ppOut) and (*
fe90: 70 6e 4f 75 74 29 0a 2a 2a 20 61 72 65 20 73 65  pnOut).** are se
fea0: 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 6e  t to zero and an
feb0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
fec0: 64 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  de returned..*/.
fed0: 69 6e 74 20 73 71 6c 69 74 65 33 72 65 62 61 73  int sqlite3rebas
fee0: 65 72 5f 72 65 62 61 73 65 28 0a 20 20 73 71 6c  er_rebase(.  sql
fef0: 69 74 65 33 5f 72 65 62 61 73 65 72 2a 2c 0a 20  ite3_rebaser*,. 
ff00: 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74 20   int nIn, const 
ff10: 76 6f 69 64 20 2a 70 49 6e 2c 20 0a 20 20 69 6e  void *pIn, .  in
ff20: 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20 2a  t *pnOut, void *
ff30: 2a 70 70 4f 75 74 20 0a 29 3b 0a 0a 2f 2a 0a 2a  *ppOut .);../*.*
ff40: 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 6c 65  * CAPI3REF: Dele
ff50: 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 72  te a changeset r
ff60: 65 62 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  ebaser object..*
ff70: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 0a 2a  * EXPERIMENTAL.*
ff80: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
ff90: 63 68 61 6e 67 65 73 65 74 20 72 65 62 61 73 65  changeset rebase
ffa0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 61 6c 6c  r object and all
ffb0: 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
ffc0: 75 72 63 65 73 2e 20 54 68 65 72 65 0a 2a 2a 20  urces. There.** 
ffd0: 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 63 61  should be one ca
ffe0: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
fff0: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 75 63  ion for each suc
10000 63 65 73 73 66 75 6c 20 69 6e 76 6f 63 61 74 69  cessful invocati
10010 6f 6e 0a 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33  on.** of sqlite3
10020 72 65 62 61 73 65 72 5f 63 72 65 61 74 65 28 29  rebaser_create()
10030 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10040 33 72 65 62 61 73 65 72 5f 64 65 6c 65 74 65 28  3rebaser_delete(
10050 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20  sqlite3_rebaser 
10060 2a 70 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  *p); ../*.** CAP
10070 49 33 52 45 46 3a 20 53 74 72 65 61 6d 69 6e 67  I3REF: Streaming
10080 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 41 50 49   Versions of API
10090 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
100a0 2a 20 54 68 65 20 73 69 78 20 73 74 72 65 61 6d  * The six stream
100b0 69 6e 67 20 41 50 49 20 78 78 78 5f 73 74 72 6d  ing API xxx_strm
100c0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 73 65 72  () functions ser
100d0 76 65 20 73 69 6d 69 6c 61 72 20 70 75 72 70 6f  ve similar purpo
100e0 73 65 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63  ses to the .** c
100f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 6f 6e  orresponding non
10100 2d 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66  -streaming API f
10110 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
10120 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 31 20  <table border=1 
10130 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65  style="margin-le
10140 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69  ft:8ex;margin-ri
10150 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c  ght:8ex">.**   <
10160 74 72 3e 3c 74 68 3e 53 74 72 65 61 6d 69 6e 67  tr><th>Streaming
10170 20 66 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e 6f 6e   function<th>Non
10180 2d 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69 76  -streaming equiv
10190 61 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20 20 20  alent</th>.**   
101a0 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63  <tr><td>sqlite3c
101b0 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73  hangeset_apply_s
101c0 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63  trm<td>[sqlite3c
101d0 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5d 20  hangeset_apply] 
101e0 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71  .**   <tr><td>sq
101f0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
10200 70 70 6c 79 5f 73 74 72 6d 5f 76 32 3c 74 64 3e  pply_strm_v2<td>
10210 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
10220 74 5f 61 70 70 6c 79 5f 76 32 5d 20 0a 2a 2a 20  t_apply_v2] .** 
10230 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
10240 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
10250 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74  t_strm<td>[sqlit
10260 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63  e3changeset_conc
10270 61 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  at] .**   <tr><t
10280 64 3e 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  d>sqlite3changes
10290 65 74 5f 69 6e 76 65 72 74 5f 73 74 72 6d 3c 74  et_invert_strm<t
102a0 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  d>[sqlite3change
102b0 73 65 74 5f 69 6e 76 65 72 74 5d 20 0a 2a 2a 20  set_invert] .** 
102c0 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
102d0 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
102e0 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74 65  _strm<td>[sqlite
102f0 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
10300 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  ] .**   <tr><td>
10310 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
10320 68 61 6e 67 65 73 65 74 5f 73 74 72 6d 3c 74 64  hangeset_strm<td
10330 3e 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  >[sqlite3session
10340 5f 63 68 61 6e 67 65 73 65 74 5d 20 0a 2a 2a 20  _changeset] .** 
10350 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
10360 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
10370 74 5f 73 74 72 6d 3c 74 64 3e 5b 73 71 6c 69 74  t_strm<td>[sqlit
10380 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
10390 65 74 5d 20 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e  et] .** </table>
103a0 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 73 74 72 65 61  .**.** Non-strea
103b0 6d 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 74  ming functions t
103c0 68 61 74 20 61 63 63 65 70 74 20 63 68 61 6e 67  hat accept chang
103d0 65 73 65 74 73 20 28 6f 72 20 70 61 74 63 68 73  esets (or patchs
103e0 65 74 73 29 20 61 73 20 69 6e 70 75 74 0a 2a 2a  ets) as input.**
103f0 20 72 65 71 75 69 72 65 20 74 68 61 74 20 74 68   require that th
10400 65 20 65 6e 74 69 72 65 20 63 68 61 6e 67 65 73  e entire changes
10410 65 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  et be stored in 
10420 61 20 73 69 6e 67 6c 65 20 62 75 66 66 65 72 20  a single buffer 
10430 69 6e 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 20 53  in memory. .** S
10440 69 6d 69 6c 61 72 6c 79 2c 20 74 68 6f 73 65 20  imilarly, those 
10450 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 63 68  that return a ch
10460 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
10470 73 65 74 20 64 6f 20 73 6f 20 62 79 20 72 65 74  set do so by ret
10480 75 72 6e 69 6e 67 20 0a 2a 2a 20 61 20 70 6f 69  urning .** a poi
10490 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
104a0 20 6c 61 72 67 65 20 62 75 66 66 65 72 20 61 6c   large buffer al
104b0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
104c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
104d0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 20 74 68 69  .** Normally thi
104e0 73 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e  s is convenient.
104f0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 6e 20   However, if an 
10500 61 70 70 6c 69 63 61 74 69 6f 6e 20 72 75 6e 6e  application runn
10510 69 6e 67 20 69 6e 20 61 20 0a 2a 2a 20 6c 6f 77  ing in a .** low
10520 2d 6d 65 6d 6f 72 79 20 65 6e 76 69 72 6f 6e 6d  -memory environm
10530 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 20  ent is required 
10540 74 6f 20 68 61 6e 64 6c 65 20 76 65 72 79 20 6c  to handle very l
10550 61 72 67 65 20 63 68 61 6e 67 65 73 65 74 73 2c  arge changesets,
10560 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 20 63 6f   the.** large co
10570 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20  ntiguous memory 
10580 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 72 65 71 75  allocations requ
10590 69 72 65 64 20 63 61 6e 20 62 65 63 6f 6d 65 20  ired can become 
105a0 6f 6e 65 72 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 49  onerous..**.** I
105b0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
105c0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 69   this problem, i
105d0 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67  nstead of a sing
105e0 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2c  le large buffer,
105f0 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 70 61 73   input.** is pas
10600 73 65 64 20 74 6f 20 61 20 73 74 72 65 61 6d 69  sed to a streami
10610 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  ng API functions
10620 20 62 79 20 77 61 79 20 6f 66 20 61 20 63 61 6c   by way of a cal
10630 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
10640 68 61 74 0a 2a 2a 20 74 68 65 20 73 65 73 73 69  hat.** the sessi
10650 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 76 6f 6b  ons module invok
10660 65 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61  es to incrementa
10670 6c 6c 79 20 72 65 71 75 65 73 74 20 69 6e 70 75  lly request inpu
10680 74 20 64 61 74 61 20 61 73 20 69 74 20 69 73 0a  t data as it is.
10690 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 49 6e 20  ** required. In 
106a0 61 6c 6c 20 63 61 73 65 73 2c 20 61 20 70 61 69  all cases, a pai
106b0 72 20 6f 66 20 41 50 49 20 66 75 6e 63 74 69 6f  r of API functio
106c0 6e 20 70 61 72 61 6d 65 74 65 72 73 20 73 75 63  n parameters suc
106d0 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65  h as.**.**  <pre
106e0 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  >.**  &nbsp;    
106f0 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c   int nChangeset,
10700 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20  .**  &nbsp;     
10710 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74  void *pChangeset
10720 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a  ,.**  </pre>.**.
10730 2a 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20 62  ** Is replaced b
10740 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a  y:.**.**  <pre>.
10750 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69  **  &nbsp;     i
10760 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
10770 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
10780 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
10790 29 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20  ),.**  &nbsp;   
107a0 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 2a 2a 20    void *pIn,.** 
107b0 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 45 61   </pre>.**.** Ea
107c0 63 68 20 74 69 6d 65 20 74 68 65 20 78 49 6e 70  ch time the xInp
107d0 75 74 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ut callback is i
107e0 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 73 65  nvoked by the se
107f0 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 2c 20 74  ssions module, t
10800 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
10810 6d 65 6e 74 20 70 61 73 73 65 64 20 69 73 20 61  ment passed is a
10820 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 75 70   copy of the sup
10830 70 6c 69 65 64 20 70 49 6e 20 63 6f 6e 74 65 78  plied pIn contex
10840 74 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  t pointer. The s
10850 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
10860 6e 74 2c 20 70 44 61 74 61 2c 20 70 6f 69 6e 74  nt, pData, point
10870 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 28 2a  s to a buffer (*
10880 70 6e 44 61 74 61 29 20 62 79 74 65 73 20 69 6e  pnData) bytes in
10890 20 73 69 7a 65 2e 20 41 73 73 75 6d 69 6e 67 20   size. Assuming 
108a0 6e 6f 20 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  no .** error occ
108b0 75 72 73 20 74 68 65 20 78 49 6e 70 75 74 20 6d  urs the xInput m
108c0 65 74 68 6f 64 20 73 68 6f 75 6c 64 20 63 6f 70  ethod should cop
108d0 79 20 75 70 20 74 6f 20 28 2a 70 6e 44 61 74 61  y up to (*pnData
108e0 29 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  ) bytes of data 
108f0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 62 75 66  .** into the buf
10900 66 65 72 20 61 6e 64 20 73 65 74 20 28 2a 70 6e  fer and set (*pn
10910 44 61 74 61 29 20 74 6f 20 74 68 65 20 61 63 74  Data) to the act
10920 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
10930 74 65 73 20 63 6f 70 69 65 64 20 0a 2a 2a 20 62  tes copied .** b
10940 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
10950 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
10960 65 20 69 6e 70 75 74 20 69 73 20 63 6f 6d 70 6c  e input is compl
10970 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2c  etely exhausted,
10980 20 28 2a 70 6e 44 61 74 61 29 20 0a 2a 2a 20 73   (*pnData) .** s
10990 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
109a0 7a 65 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  zero to indicate
109b0 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 61 6e   this. Or, if an
109c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
109d0 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72  n SQLite .** err
109e0 6f 72 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62  or code should b
109f0 65 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 61  e returned. In a
10a00 6c 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20  ll cases, if an 
10a10 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20  xInput callback 
10a20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 6e 20 65 72  returns.** an er
10a30 72 6f 72 2c 20 61 6c 6c 20 70 72 6f 63 65 73 73  ror, all process
10a40 69 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e 65 64  ing is abandoned
10a50 20 61 6e 64 20 74 68 65 20 73 74 72 65 61 6d 69   and the streami
10a60 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 0a  ng API function.
10a70 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  ** returns a cop
10a80 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63  y of the error c
10a90 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
10aa0 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
10ab0 63 61 73 65 20 6f 66 20 73 71 6c 69 74 65 33 63  case of sqlite3c
10ac0 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73  hangeset_start_s
10ad0 74 72 6d 28 29 2c 20 74 68 65 20 78 49 6e 70 75  trm(), the xInpu
10ae0 74 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 62  t callback may b
10af0 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 62 79 20  e.** invoked by 
10b00 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64  the sessions mod
10b10 75 6c 65 20 61 74 20 61 6e 79 20 70 6f 69 6e 74  ule at any point
10b20 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
10b30 74 69 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69  time of the.** i
10b40 74 65 72 61 74 6f 72 2e 20 49 66 20 73 75 63 68  terator. If such
10b50 20 61 6e 20 78 49 6e 70 75 74 20 63 61 6c 6c 62   an xInput callb
10b60 61 63 6b 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ack returns an e
10b70 72 72 6f 72 2c 20 74 68 65 20 69 74 65 72 61 74  rror, the iterat
10b80 6f 72 20 65 6e 74 65 72 73 0a 2a 2a 20 61 6e 20  or enters.** an 
10b90 65 72 72 6f 72 20 73 74 61 74 65 2c 20 77 68 65  error state, whe
10ba0 72 65 62 79 20 61 6c 6c 20 73 75 62 73 65 71 75  reby all subsequ
10bb0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 69 74 65  ent calls to ite
10bc0 72 61 74 6f 72 20 66 75 6e 63 74 69 6f 6e 73 20  rator functions 
10bd0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
10be0 66 61 69 6c 20 77 69 74 68 20 74 68 65 20 73 61  fail with the sa
10bf0 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 73  me error code as
10c00 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 49 6e   returned by xIn
10c10 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d 69 6c  put..**.** Simil
10c20 61 72 6c 79 2c 20 73 74 72 65 61 6d 69 6e 67 20  arly, streaming 
10c30 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  API functions th
10c40 61 74 20 72 65 74 75 72 6e 20 63 68 61 6e 67 65  at return change
10c50 73 65 74 73 20 28 6f 72 20 70 61 74 63 68 73 65  sets (or patchse
10c60 74 73 29 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  ts).** return th
10c70 65 6d 20 69 6e 20 63 68 75 6e 6b 73 20 62 79 20  em in chunks by 
10c80 77 61 79 20 6f 66 20 61 20 63 61 6c 6c 62 61 63  way of a callbac
10c90 6b 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 74 65  k function inste
10ca0 61 64 20 6f 66 20 76 69 61 20 61 0a 2a 2a 20 70  ad of via a.** p
10cb0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
10cc0 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e  le large buffer.
10cd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
10ce0 20 70 61 69 72 20 6f 66 20 70 61 72 61 6d 65 74   pair of paramet
10cf0 65 72 73 20 73 75 63 68 0a 2a 2a 20 61 73 3a 0a  ers such.** as:.
10d00 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20  **.**  <pre>.** 
10d10 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20   &nbsp;     int 
10d20 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a  *pnChangeset,.**
10d30 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69    &nbsp;     voi
10d40 64 20 2a 2a 70 70 43 68 61 6e 67 65 73 65 74 2c  d **ppChangeset,
10d50 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a  .**  </pre>.**.*
10d60 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20 62 79  * Is replaced by
10d70 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a  :.**.**  <pre>.*
10d80 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e  *  &nbsp;     in
10d90 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69  t (*xOutput)(voi
10da0 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76  d *pOut, const v
10db0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
10dc0 6e 44 61 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73  nData),.**  &nbs
10dd0 70 3b 20 20 20 20 20 76 6f 69 64 20 2a 70 4f 75  p;     void *pOu
10de0 74 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a  t.**  </pre>.**.
10df0 2a 2a 20 54 68 65 20 78 4f 75 74 70 75 74 20 63  ** The xOutput c
10e00 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
10e10 65 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  ed zero or more 
10e20 74 69 6d 65 73 20 74 6f 20 72 65 74 75 72 6e 20  times to return 
10e30 64 61 74 61 20 74 6f 0a 2a 2a 20 74 68 65 20 61  data to.** the a
10e40 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68 65 20  pplication. The 
10e50 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
10e60 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 63  passed to each c
10e70 61 6c 6c 20 69 73 20 61 20 63 6f 70 79 20 6f 66  all is a copy of
10e80 20 74 68 65 0a 2a 2a 20 70 4f 75 74 20 70 6f 69   the.** pOut poi
10e90 6e 74 65 72 20 73 75 70 70 6c 69 65 64 20 62 79  nter supplied by
10ea0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
10eb0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  . The second par
10ec0 61 6d 65 74 65 72 2c 20 70 44 61 74 61 2c 0a 2a  ameter, pData,.*
10ed0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  * points to a bu
10ee0 66 66 65 72 20 6e 44 61 74 61 20 62 79 74 65 73  ffer nData bytes
10ef0 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
10f00 69 6e 67 20 74 68 65 20 63 68 75 6e 6b 20 6f 66  ing the chunk of
10f10 20 6f 75 74 70 75 74 0a 2a 2a 20 64 61 74 61 20   output.** data 
10f20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 20  being returned. 
10f30 49 66 20 74 68 65 20 78 4f 75 74 70 75 74 20 63  If the xOutput c
10f40 61 6c 6c 62 61 63 6b 20 73 75 63 63 65 73 73 66  allback successf
10f50 75 6c 6c 79 20 70 72 6f 63 65 73 73 65 73 20 74  ully processes t
10f60 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 64  he.** supplied d
10f70 61 74 61 2c 20 69 74 20 73 68 6f 75 6c 64 20 72  ata, it should r
10f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10f90 74 6f 20 69 6e 64 69 63 61 74 65 20 73 75 63 63  to indicate succ
10fa0 65 73 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ess. Otherwise,.
10fb0 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74  ** it should ret
10fc0 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 53  urn some other S
10fd0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
10fe0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 70  . In this case p
10ff0 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 69 73 20  rocessing.** is 
11000 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 61 6e  immediately aban
11010 64 6f 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74  doned and the st
11020 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63  reaming API func
11030 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 63  tion returns a c
11040 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  opy.** of the xO
11050 75 74 70 75 74 20 65 72 72 6f 72 20 63 6f 64 65  utput error code
11060 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74   to the applicat
11070 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
11080 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 6e  essions module n
11090 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 61 6e 20  ever invokes an 
110a0 78 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b  xOutput callback
110b0 20 77 69 74 68 20 74 68 65 20 74 68 69 72 64 20   with the third 
110c0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 73 65  .** parameter se
110d0 74 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73  t to a value les
110e0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
110f0 74 6f 20 7a 65 72 6f 2e 20 4f 74 68 65 72 20 74  to zero. Other t
11100 68 61 6e 20 74 68 69 73 2c 0a 2a 2a 20 6e 6f 20  han this,.** no 
11110 67 75 61 72 61 6e 74 65 65 73 20 61 72 65 20 6d  guarantees are m
11120 61 64 65 20 61 73 20 74 6f 20 74 68 65 20 73 69  ade as to the si
11130 7a 65 20 6f 66 20 74 68 65 20 63 68 75 6e 6b 73  ze of the chunks
11140 20 6f 66 20 64 61 74 61 20 72 65 74 75 72 6e 65   of data returne
11150 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11160 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
11170 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
11180 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
111a0 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
111b0 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
111c0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ndle */.  int (*
111d0 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49  xInput)(void *pI
111e0 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  n, void *pData, 
111f0 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a  int *pnData), /*
11200 20 49 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 20   Input function 
11210 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20  */.  void *pIn, 
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11250 74 20 61 72 67 20 66 6f 72 20 78 49 6e 70 75 74  t arg for xInput
11260 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74   */.  int(*xFilt
11270 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  er)(.    void *p
11280 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
11290 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
112a0 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
112b0 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63  apply() */.    c
112c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112e0 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
112f0 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c  ),.  int(*xConfl
11300 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a  ict)(.    void *
11310 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
11320 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
11330 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20  of sixth arg to 
11340 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20  _apply() */.    
11350 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20  int eConflict,  
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11370 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20   DATA, MISSING, 
11380 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52  CONFLICT, CONSTR
11390 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69  AINT */.    sqli
113a0 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
113b0 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e  er *p     /* Han
113c0 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63  dle describing c
113d0 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69  hange and confli
113e0 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69  ct */.  ),.  voi
113f0 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20  d *pCtx         
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11410 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
11420 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69  assed to xConfli
11430 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c  ct */.);.int sql
11440 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
11450 70 6c 79 5f 76 32 5f 73 74 72 6d 28 0a 20 20 73  ply_v2_strm(.  s
11460 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11480 2a 20 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74  * Apply change t
11490 6f 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74  o "main" db of t
114a0 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  his handle */.  
114b0 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f  int (*xInput)(vo
114c0 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
114d0 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
114e0 61 29 2c 20 2f 2a 20 49 6e 70 75 74 20 66 75 6e  a), /* Input fun
114f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
11500 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pIn,           
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11530 2a 20 46 69 72 73 74 20 61 72 67 20 66 6f 72 20  * First arg for 
11540 78 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 28  xInput */.  int(
11550 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76  *xFilter)(.    v
11560 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11580 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61 72  Copy of sixth ar
11590 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f  g to _apply() */
115a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
115b0 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20  *zTab           
115c0 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
115d0 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a   */.  ),.  int(*
115e0 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20 20  xConflict)(.    
115f0 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11610 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61   Copy of sixth a
11620 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a  rg to _apply() *
11630 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c  /.    int eConfl
11640 69 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ict,            
11650 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53      /* DATA, MIS
11660 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20  SING, CONFLICT, 
11670 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20  CONSTRAINT */.  
11680 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
11690 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20 20  set_iter *p     
116a0 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72 69  /* Handle descri
116b0 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20  bing change and 
116c0 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c  conflict */.  ),
116d0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
11700 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
11710 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 76 6f  Conflict */.  vo
11720 69 64 20 2a 2a 70 70 52 65 62 61 73 65 2c 20 69  id **ppRebase, i
11730 6e 74 20 2a 70 6e 52 65 62 61 73 65 2c 0a 20 20  nt *pnRebase,.  
11740 69 6e 74 20 66 6c 61 67 73 0a 29 3b 0a 69 6e 74  int flags.);.int
11750 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
11760 74 5f 63 6f 6e 63 61 74 5f 73 74 72 6d 28 0a 20  t_concat_strm(. 
11770 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 41 29 28   int (*xInputA)(
11780 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20  void *pIn, void 
11790 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44  *pData, int *pnD
117a0 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49  ata),.  void *pI
117b0 6e 41 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70  nA,.  int (*xInp
117c0 75 74 42 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20  utB)(void *pIn, 
117d0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
117e0 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69   *pnData),.  voi
117f0 64 20 2a 70 49 6e 42 2c 0a 20 20 69 6e 74 20 28  d *pInB,.  int (
11800 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
11810 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
11820 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
11830 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75  ta),.  void *pOu
11840 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.);.int sqlite3
11850 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74  changeset_invert
11860 5f 73 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a 78  _strm(.  int (*x
11870 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e  Input)(void *pIn
11880 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  , void *pData, i
11890 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76  nt *pnData),.  v
118a0 6f 69 64 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20  oid *pIn,.  int 
118b0 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20  (*xOutput)(void 
118c0 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69  *pOut, const voi
118d0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
118e0 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f  ata),.  void *pO
118f0 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  ut.);.int sqlite
11900 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
11910 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
11920 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
11930 2a 2a 70 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49  **pp,.  int (*xI
11940 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
11950 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
11960 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
11970 69 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e 74 20 73  id *pIn.);.int s
11980 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
11990 73 74 61 72 74 5f 76 32 5f 73 74 72 6d 28 0a 20  start_v2_strm(. 
119a0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
119b0 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 0a 20 20  et_iter **pp,.  
119c0 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f  int (*xInput)(vo
119d0 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
119e0 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
119f0 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c  a),.  void *pIn,
11a00 0a 20 20 69 6e 74 20 66 6c 61 67 73 0a 29 3b 0a  .  int flags.);.
11a10 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
11a20 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72  on_changeset_str
11a30 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  m(.  sqlite3_ses
11a40 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a  sion *pSession,.
11a50 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29    int (*xOutput)
11a60 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e  (void *pOut, con
11a70 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
11a80 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f  int nData),.  vo
11a90 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e 74 20  id *pOut.);.int 
11aa0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70  sqlite3session_p
11ab0 61 74 63 68 73 65 74 5f 73 74 72 6d 28 0a 20 20  atchset_strm(.  
11ac0 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
11ad0 2a 70 53 65 73 73 69 6f 6e 2c 0a 20 20 69 6e 74  *pSession,.  int
11ae0 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64   (*xOutput)(void
11af0 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f   *pOut, const vo
11b00 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
11b10 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
11b20 4f 75 74 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  Out.);.int sqlit
11b30 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
11b40 64 5f 73 74 72 6d 28 73 71 6c 69 74 65 33 5f 63  d_strm(sqlite3_c
11b50 68 61 6e 67 65 67 72 6f 75 70 2a 2c 20 0a 20 20  hangegroup*, .  
11b60 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
11b70 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20  void *pIn, void 
11b80 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44  *pData, int *pnD
11b90 61 74 61 29 2c 0a 20 20 20 20 76 6f 69 64 20 2a  ata),.    void *
11ba0 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  pIn.);.int sqlit
11bb0 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75  e3changegroup_ou
11bc0 74 70 75 74 5f 73 74 72 6d 28 73 71 6c 69 74 65  tput_strm(sqlite
11bd0 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c 0a  3_changegroup*,.
11be0 20 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75      int (*xOutpu
11bf0 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
11c00 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
11c10 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 20 0a 20  , int nData), . 
11c20 20 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b     void *pOut.);
11c30 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 65 62 61  .int sqlite3reba
11c40 73 65 72 5f 72 65 62 61 73 65 5f 73 74 72 6d 28  ser_rebase_strm(
11c50 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73  .  sqlite3_rebas
11c60 65 72 20 2a 70 52 65 62 61 73 65 72 2c 0a 20 20  er *pRebaser,.  
11c70 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f  int (*xInput)(vo
11c80 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
11c90 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
11ca0 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c  a),.  void *pIn,
11cb0 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74  .  int (*xOutput
11cc0 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f  )(void *pOut, co
11cd0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
11ce0 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76   int nData),.  v
11cf0 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 0a 2f 2a  oid *pOut.);../*
11d00 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f  .** CAPI3REF: Co
11d10 6e 66 69 67 75 72 65 20 67 6c 6f 62 61 6c 20 70  nfigure global p
11d20 61 72 61 6d 65 74 65 72 73 0a 2a 2a 0a 2a 2a 20  arameters.**.** 
11d30 54 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  The sqlite3sessi
11d40 6f 6e 5f 63 6f 6e 66 69 67 28 29 20 69 6e 74 65  on_config() inte
11d50 72 66 61 63 65 20 69 73 20 75 73 65 64 20 74 6f  rface is used to
11d60 20 6d 61 6b 65 20 67 6c 6f 62 61 6c 20 63 6f 6e   make global con
11d70 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 63 68  figuration.** ch
11d80 61 6e 67 65 73 20 74 6f 20 74 68 65 20 73 65 73  anges to the ses
11d90 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 20  sions module in 
11da0 6f 72 64 65 72 20 74 6f 20 74 75 6e 65 20 69 74  order to tune it
11db0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 63   to the specific
11dc0 20 6e 65 65 64 73 20 0a 2a 2a 20 6f 66 20 74 68   needs .** of th
11dd0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a  e application..*
11de0 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
11df0 73 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29  session_config()
11e00 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6e 6f   interface is no
11e10 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 49 66  t threadsafe. If
11e20 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a   it is invoked.*
11e30 2a 20 77 68 69 6c 65 20 61 6e 79 20 6f 74 68 65  * while any othe
11e40 72 20 74 68 72 65 61 64 20 69 73 20 69 6e 73 69  r thread is insi
11e50 64 65 20 61 6e 79 20 6f 74 68 65 72 20 73 65 73  de any other ses
11e60 73 69 6f 6e 73 20 6d 65 74 68 6f 64 20 74 68 65  sions method the
11e70 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  n the.** results
11e80 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
11e90 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
11ea0 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  it is invoked af
11eb0 74 65 72 20 61 6e 79 20 73 65 73 73 69 6f 6e 73  ter any sessions
11ec0 0a 2a 2a 20 72 65 6c 61 74 65 64 20 6f 62 6a 65  .** related obje
11ed0 63 74 73 20 68 61 76 65 20 62 65 65 6e 20 63 72  cts have been cr
11ee0 65 61 74 65 64 2c 20 74 68 65 20 72 65 73 75 6c  eated, the resul
11ef0 74 73 20 61 72 65 20 61 6c 73 6f 20 75 6e 64 65  ts are also unde
11f00 66 69 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  fined. .**.** Th
11f10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
11f20 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 73   to the sqlite3s
11f30 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 20  ession_config() 
11f40 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
11f50 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 53   one.** of the S
11f60 51 4c 49 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f  QLITE_SESSION_CO
11f70 4e 46 49 47 5f 58 58 58 20 63 6f 6e 73 74 61 6e  NFIG_XXX constan
11f80 74 73 20 64 65 66 69 6e 65 64 20 62 65 6c 6f 77  ts defined below
11f90 2e 20 54 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70  . The .** interp
11fa0 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  retation of the 
11fb0 28 76 6f 69 64 2a 29 20 76 61 6c 75 65 20 70 61  (void*) value pa
11fc0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11fd0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nd parameter and
11fe0 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f  .** the effect o
11ff0 66 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  f calling this f
12000 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 73 20  unction depends 
12010 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
12020 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 72  the first.** par
12030 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64  ameter..**.** <d
12040 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  l>.** <dt>SQLITE
12050 5f 53 45 53 53 49 4f 4e 5f 43 4f 4e 46 49 47 5f  _SESSION_CONFIG_
12060 53 54 52 4d 53 49 5a 45 3c 64 64 3e 0a 2a 2a 20  STRMSIZE<dd>.** 
12070 20 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74     By default, t
12080 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75  he sessions modu
12090 6c 65 20 73 74 72 65 61 6d 69 6e 67 20 69 6e 74  le streaming int
120a0 65 72 66 61 63 65 73 20 61 74 74 65 6d 70 74 20  erfaces attempt 
120b0 74 6f 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 61  to input.**    a
120c0 6e 64 20 6f 75 74 70 75 74 20 64 61 74 61 20 69  nd output data i
120d0 6e 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  n approximately 
120e0 31 20 4b 69 42 20 63 68 75 6e 6b 73 2e 20 54 68  1 KiB chunks. Th
120f0 69 73 20 6f 70 65 72 61 6e 64 20 6d 61 79 20 62  is operand may b
12100 65 20 75 73 65 64 0a 2a 2a 20 20 20 20 74 6f 20  e used.**    to 
12110 73 65 74 20 61 6e 64 20 71 75 65 72 79 20 74 68  set and query th
12120 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  e value of this 
12130 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
12140 74 74 69 6e 67 2e 20 54 68 65 20 70 6f 69 6e 74  tting. The point
12150 65 72 0a 2a 2a 20 20 20 20 70 61 73 73 65 64 20  er.**    passed 
12160 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12170 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
12180 74 20 74 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  t to a value of 
12190 74 79 70 65 20 28 69 6e 74 29 2e 0a 2a 2a 20 20  type (int)..**  
121a0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
121b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
121c0 30 2c 20 69 74 20 69 73 20 75 73 65 64 20 61 73  0, it is used as
121d0 20 74 68 65 20 6e 65 77 20 73 74 72 65 61 6d 69   the new streami
121e0 6e 67 20 64 61 74 61 0a 2a 2a 20 20 20 20 63 68  ng data.**    ch
121f0 75 6e 6b 20 73 69 7a 65 20 66 6f 72 20 62 6f 74  unk size for bot
12200 68 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70  h input and outp
12210 75 74 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ut. Before retur
12220 6e 69 6e 67 2c 20 74 68 65 20 28 69 6e 74 29 20  ning, the (int) 
12230 76 61 6c 75 65 0a 2a 2a 20 20 20 20 70 6f 69 6e  value.**    poin
12240 74 65 64 20 74 6f 20 62 79 20 70 41 72 67 20 69  ted to by pArg i
12250 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 6e  s set to the fin
12260 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
12270 73 74 72 65 61 6d 69 6e 67 20 69 6e 74 65 72 66  streaming interf
12280 61 63 65 0a 2a 2a 20 20 20 20 63 68 75 6e 6b 20  ace.**    chunk 
12290 73 69 7a 65 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a  size..** </dl>.*
122a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
122b0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
122c0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
122d0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
122e0 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f   error code.** o
122f0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
12300 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
12310 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 76  config(int op, v
12320 6f 69 64 20 2a 70 41 72 67 29 3b 0a 0a 2f 2a 0a  oid *pArg);../*.
12330 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 56 61 6c  ** CAPI3REF: Val
12340 75 65 73 20 66 6f 72 20 73 71 6c 69 74 65 33 73  ues for sqlite3s
12350 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 28 29 2e  ession_config().
12360 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
12370 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f 4e 46 49  TE_SESSION_CONFI
12380 47 5f 53 54 52 4d 53 49 5a 45 20 31 0a 0a 2f 2a  G_STRMSIZE 1../*
12390 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
123a0 20 63 61 6e 20 63 61 6c 6c 20 74 68 69 73 20 73   can call this s
123b0 74 75 66 66 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a  tuff from C++..*
123c0 2f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73  /.#ifdef __cplus
123d0 70 6c 75 73 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  plus.}.#endif..#
123e0 65 6e 64 69 66 20 20 2f 2a 20 21 64 65 66 69 6e  endif  /* !defin
123f0 65 64 28 5f 5f 53 51 4c 49 54 45 53 45 53 53 49  ed(__SQLITESESSI
12400 4f 4e 5f 48 5f 29 20 26 26 20 64 65 66 69 6e 65  ON_H_) && define
12410 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
12420 53 45 53 53 49 4f 4e 29 20 2a 2f 0a              SESSION) */.