/ Hex Artifact Content
Login

Artifact 64e9e7f185725ef43b97f4a9a0c0df0669844f1d:


0000: 0a 23 69 66 6e 64 65 66 20 5f 5f 53 51 4c 49 54  .#ifndef __SQLIT
0010: 45 53 45 53 53 49 4f 4e 5f 48 5f 0a 23 64 65 66  ESESSION_H_.#def
0020: 69 6e 65 20 5f 5f 53 51 4c 49 54 45 53 45 53 53  ine __SQLITESESS
0030: 49 4f 4e 5f 48 5f 20 31 0a 0a 2f 2a 0a 2a 2a 20  ION_H_ 1../*.** 
0040: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63 61 6e  Make sure we can
0050: 20 63 61 6c 6c 20 74 68 69 73 20 73 74 75 66 66   call this stuff
0060: 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f 0a 23 69   from C++..*/.#i
0070: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0080: 0a 65 78 74 65 72 6e 20 22 43 22 20 7b 0a 23 65  .extern "C" {.#e
0090: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
00a0: 73 71 6c 69 74 65 33 2e 68 22 0a 0a 2f 2a 0a 2a  sqlite3.h"../*.*
00b0: 2a 20 43 41 50 49 33 52 45 46 3a 20 53 65 73 73  * CAPI3REF: Sess
00c0: 69 6f 6e 20 4f 62 6a 65 63 74 20 48 61 6e 64 6c  ion Object Handl
00d0: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
00e0: 75 63 74 20 73 71 6c 69 74 65 33 5f 73 65 73 73  uct sqlite3_sess
00f0: 69 6f 6e 20 73 71 6c 69 74 65 33 5f 73 65 73 73  ion sqlite3_sess
0100: 69 6f 6e 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  ion;../*.** CAPI
0110: 33 52 45 46 3a 20 43 68 61 6e 67 65 73 65 74 20  3REF: Changeset 
0120: 49 74 65 72 61 74 6f 72 20 48 61 6e 64 6c 65 0a  Iterator Handle.
0130: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0140: 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  t sqlite3_change
0150: 73 65 74 5f 69 74 65 72 20 73 71 6c 69 74 65 33  set_iter sqlite3
0160: 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 3b  _changeset_iter;
0170: 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46  ../*.** CAPI3REF
0180: 3a 20 43 72 65 61 74 65 20 41 20 4e 65 77 20 53  : Create A New S
0190: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
01a0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
01b0: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
01c0: 61 74 74 61 63 68 65 64 20 74 6f 20 64 61 74 61  attached to data
01d0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 20  base handle db. 
01e0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
01f0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
0200: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
0210: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 53   written to *ppS
0220: 65 73 73 69 6f 6e 20 61 6e 64 20 53 51 4c 49 54  ession and SQLIT
0230: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
0240: 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
0250: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 65 73 73   occurs, *ppSess
0260: 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ion is set to NU
0270: 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65  LL and an SQLite
0280: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 28  .** error code (
0290: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e.g. SQLITE_NOME
02a0: 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  M) is returned..
02b0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f 73 73  **.** It is poss
02c0: 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 6d  ible to create m
02d0: 75 6c 74 69 70 6c 65 20 73 65 73 73 69 6f 6e 20  ultiple session 
02e0: 6f 62 6a 65 63 74 73 20 61 74 74 61 63 68 65 64  objects attached
02f0: 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   to a single.** 
0300: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
0310: 0a 2a 2a 0a 2a 2a 20 53 65 73 73 69 6f 6e 20 6f  .**.** Session o
0320: 62 6a 65 63 74 73 20 63 72 65 61 74 65 64 20 75  bjects created u
0330: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0340: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  on should be del
0350: 65 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a  eted using the.*
0360: 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  * [sqlite3sessio
0370: 6e 5f 64 65 6c 65 74 65 28 29 5d 20 66 75 6e 63  n_delete()] func
0380: 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
0390: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
03a0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65  that they.** are
03b0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 73 20   attached to is 
03c0: 69 74 73 65 6c 66 20 63 6c 6f 73 65 64 2e 20 49  itself closed. I
03d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
03e0: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
03f0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 73 65  before.** the se
0400: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73 20  ssion object is 
0410: 64 65 6c 65 74 65 64 2c 20 74 68 65 6e 20 74 68  deleted, then th
0420: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 61 6c  e results of cal
0430: 6c 69 6e 67 20 61 6e 79 20 73 65 73 73 69 6f 6e  ling any session
0440: 0a 2a 2a 20 6d 6f 64 75 6c 65 20 66 75 6e 63 74  .** module funct
0450: 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67 20 5b  ion, including [
0460: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64  sqlite3session_d
0470: 65 6c 65 74 65 28 29 5d 20 6f 6e 20 74 68 65 20  elete()] on the 
0480: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 0a 2a  session object.*
0490: 2a 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  * are undefined.
04a0: 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
04b0: 68 65 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c  he session modul
04c0: 65 20 75 73 65 73 20 74 68 65 20 5b 73 71 6c 69  e uses the [sqli
04d0: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
04e0: 6f 6b 28 29 5d 20 41 50 49 2c 20 69 74 0a 2a 2a  ok()] API, it.**
04f0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
0500: 20 66 6f 72 20 61 6e 20 61 70 70 6c 69 63 61 74   for an applicat
0510: 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20  ion to register 
0520: 61 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  a pre-update hoo
0530: 6b 20 6f 6e 20 61 0a 2a 2a 20 64 61 74 61 62 61  k on a.** databa
0540: 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 68  se handle that h
0550: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  as one or more s
0560: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61  ession objects a
0570: 74 74 61 63 68 65 64 2e 20 4e 6f 72 20 69 73 0a  ttached. Nor is.
0580: 2a 2a 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74  ** it possible t
0590: 6f 20 63 72 65 61 74 65 20 61 20 73 65 73 73 69  o create a sessi
05a0: 6f 6e 20 6f 62 6a 65 63 74 20 61 74 74 61 63 68  on object attach
05b0: 65 64 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  ed to a database
05c0: 20 68 61 6e 64 6c 65 20 66 6f 72 0a 2a 2a 20 77   handle for.** w
05d0: 68 69 63 68 20 61 20 70 72 65 2d 75 70 64 61 74  hich a pre-updat
05e0: 65 20 68 6f 6f 6b 20 69 73 20 61 6c 72 65 61 64  e hook is alread
05f0: 79 20 64 65 66 69 6e 65 64 2e 20 54 68 65 20 72  y defined. The r
0600: 65 73 75 6c 74 73 20 6f 66 20 61 74 74 65 6d 70  esults of attemp
0610: 74 69 6e 67 20 0a 2a 2a 20 65 69 74 68 65 72 20  ting .** either 
0620: 6f 66 20 74 68 65 73 65 20 74 68 69 6e 67 73 20  of these things 
0630: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
0640: 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73 69 6f 6e  *.** The session
0650: 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
0660: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 63  used to create c
0670: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 61  hangesets for ta
0680: 62 6c 65 73 20 69 6e 0a 2a 2a 20 64 61 74 61 62  bles in.** datab
0690: 61 73 65 20 7a 44 62 2c 20 77 68 65 72 65 20 7a  ase zDb, where z
06a0: 44 62 20 69 73 20 65 69 74 68 65 72 20 22 6d 61  Db is either "ma
06b0: 69 6e 22 2c 20 6f 72 20 22 74 65 6d 70 22 2c 20  in", or "temp", 
06c0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
06d0: 6e 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  n.** attached da
06e0: 74 61 62 61 73 65 2e 20 49 74 20 69 73 20 6e 6f  tabase. It is no
06f0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 64 61  t an error if da
0700: 74 61 62 61 73 65 20 7a 44 62 20 69 73 20 6e 6f  tabase zDb is no
0710: 74 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 74 6f  t attached.** to
0720: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
0730: 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  en the session o
0740: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
0750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0760: 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 0a  session_create(.
0770: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
07a0: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
07b0: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
07c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
07d0: 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20 22 6d  e of db (e.g. "m
07e0: 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ain") */.  sqlit
07f0: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70 70 53  e3_session **ppS
0800: 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20 4f 55  ession     /* OU
0810: 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e 20 6f  T: New session o
0820: 62 6a 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  bject */.);../*.
0830: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44 65 6c  ** CAPI3REF: Del
0840: 65 74 65 20 41 20 53 65 73 73 69 6f 6e 20 4f 62  ete A Session Ob
0850: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  ject.**.** Delet
0860: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
0870: 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  ct previously al
0880: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 0a 2a  located using .*
0890: 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  * [sqlite3sessio
08a0: 6e 5f 63 72 65 61 74 65 28 29 5d 2e 20 4f 6e 63  n_create()]. Onc
08b0: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
08c0: 63 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  ct has been dele
08d0: 74 65 64 2c 20 74 68 65 0a 2a 2a 20 72 65 73 75  ted, the.** resu
08e0: 6c 74 73 20 6f 66 20 61 74 74 65 6d 70 74 69 6e  lts of attemptin
08f0: 67 20 74 6f 20 75 73 65 20 70 53 65 73 73 69 6f  g to use pSessio
0900: 6e 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  n with any other
0910: 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 0a   session module.
0920: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  ** function are 
0930: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
0940: 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   Session objects
0950: 20 6d 75 73 74 20 62 65 20 64 65 6c 65 74 65 64   must be deleted
0960: 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61   before the data
0970: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 77  base handle to w
0980: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 72 65  hich they.** are
0990: 20 61 74 74 61 63 68 65 64 20 69 73 20 63 6c 6f   attached is clo
09a0: 73 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74 68  sed. Refer to th
09b0: 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
09c0: 66 6f 72 20 0a 2a 2a 20 5b 73 71 6c 69 74 65 33  for .** [sqlite3
09d0: 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 29  session_create()
09e0: 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ] for details..*
09f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65  /.void sqlite3se
0a00: 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 73 71 6c  ssion_delete(sql
0a10: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
0a20: 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ession);.../*.**
0a30: 20 43 41 50 49 33 52 45 46 3a 20 45 6e 61 62 6c   CAPI3REF: Enabl
0a40: 65 20 4f 72 20 44 69 73 61 62 6c 65 20 41 20 53  e Or Disable A S
0a50: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 0a 2a 2a  ession Object.**
0a60: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0a70: 73 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  sable the record
0a80: 69 6e 67 20 6f 66 20 63 68 61 6e 67 65 73 20 62  ing of changes b
0a90: 79 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  y a session obje
0aa0: 63 74 2e 20 57 68 65 6e 0a 2a 2a 20 65 6e 61 62  ct. When.** enab
0ab0: 6c 65 64 2c 20 61 20 73 65 73 73 69 6f 6e 20 6f  led, a session o
0ac0: 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20 63 68  bject records ch
0ad0: 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
0ae0: 65 20 64 61 74 61 62 61 73 65 2e 20 57 68 65 6e  e database. When
0af0: 0a 2a 2a 20 64 69 73 61 62 6c 65 64 20 2d 20 69  .** disabled - i
0b00: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 41 20 6e 65  t does not. A ne
0b10: 77 6c 79 20 63 72 65 61 74 65 64 20 73 65 73 73  wly created sess
0b20: 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73 20 65 6e  ion object is en
0b30: 61 62 6c 65 64 2e 0a 2a 2a 20 52 65 66 65 72 20  abled..** Refer 
0b40: 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  to the documenta
0b50: 74 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74 65  tion for [sqlite
0b60: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
0b70: 65 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68 65  et()] for furthe
0b80: 72 0a 2a 2a 20 64 65 74 61 69 6c 73 20 72 65 67  r.** details reg
0b90: 61 72 64 69 6e 67 20 68 6f 77 20 65 6e 61 62 6c  arding how enabl
0ba0: 69 6e 67 20 61 6e 64 20 64 69 73 61 62 6c 69 6e  ing and disablin
0bb0: 67 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  g a session obje
0bc0: 63 74 20 61 66 66 65 63 74 73 0a 2a 2a 20 74 68  ct affects.** th
0bd0: 65 20 65 76 65 6e 74 75 61 6c 20 63 68 61 6e 67  e eventual chang
0be0: 65 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 73  esets..**.** Pas
0bf0: 73 69 6e 67 20 7a 65 72 6f 20 74 6f 20 74 68 69  sing zero to thi
0c00: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 61 62  s function disab
0c10: 6c 65 73 20 74 68 65 20 73 65 73 73 69 6f 6e 2e  les the session.
0c20: 20 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65   Passing a value
0c30: 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
0c40: 20 7a 65 72 6f 20 65 6e 61 62 6c 65 73 20 69 74   zero enables it
0c50: 2e 20 50 61 73 73 69 6e 67 20 61 20 76 61 6c 75  . Passing a valu
0c60: 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  e less than zero
0c70: 20 69 73 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c   is a .** no-op,
0c80: 20 61 6e 64 20 6d 61 79 20 62 65 20 75 73 65 64   and may be used
0c90: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
0ca0: 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
0cb0: 68 65 20 73 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  he session..**.*
0cc0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
0cd0: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
0ce0: 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20   final state of 
0cf0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
0d00: 63 74 3a 20 30 20 69 66 20 0a 2a 2a 20 74 68 65  ct: 0 if .** the
0d10: 20 73 65 73 73 69 6f 6e 20 69 73 20 64 69 73 61   session is disa
0d20: 62 6c 65 64 2c 20 6f 72 20 31 20 69 66 20 69 74  bled, or 1 if it
0d30: 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a   is enabled..*/.
0d40: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
0d50: 6f 6e 5f 65 6e 61 62 6c 65 28 73 71 6c 69 74 65  on_enable(sqlite
0d60: 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  3_session *pSess
0d70: 69 6f 6e 2c 20 69 6e 74 20 62 45 6e 61 62 6c 65  ion, int bEnable
0d80: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  );../*.** CAPI3R
0d90: 45 46 3a 20 53 65 74 20 4f 72 20 43 6c 65 61 72  EF: Set Or Clear
0da0: 20 74 68 65 20 49 6e 64 69 72 65 63 74 20 43 68   the Indirect Ch
0db0: 61 6e 67 65 20 46 6c 61 67 0a 2a 2a 0a 2a 2a 20  ange Flag.**.** 
0dc0: 45 61 63 68 20 63 68 61 6e 67 65 20 72 65 63 6f  Each change reco
0dd0: 72 64 65 64 20 62 79 20 61 20 73 65 73 73 69 6f  rded by a sessio
0de0: 6e 20 6f 62 6a 65 63 74 20 69 73 20 6d 61 72 6b  n object is mark
0df0: 65 64 20 61 73 20 65 69 74 68 65 72 20 64 69 72  ed as either dir
0e00: 65 63 74 20 6f 72 0a 2a 2a 20 69 6e 64 69 72 65  ect or.** indire
0e10: 63 74 2e 20 41 20 63 68 61 6e 67 65 20 69 73 20  ct. A change is 
0e20: 6d 61 72 6b 65 64 20 61 73 20 69 6e 64 69 72 65  marked as indire
0e30: 63 74 20 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a  ct if either:.**
0e40: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c  .** <ul>.**   <l
0e50: 69 3e 20 54 68 65 20 73 65 73 73 69 6f 6e 20 6f  i> The session o
0e60: 62 6a 65 63 74 20 22 69 6e 64 69 72 65 63 74 22  bject "indirect"
0e70: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
0e80: 6e 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 0a  n the change is.
0e90: 2a 2a 20 20 20 20 20 20 20 20 6d 61 64 65 2c 20  **        made, 
0ea0: 6f 72 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65  or.**   <li> The
0eb0: 20 63 68 61 6e 67 65 20 69 73 20 6d 61 64 65 20   change is made 
0ec0: 62 79 20 61 6e 20 53 51 4c 20 74 72 69 67 67 65  by an SQL trigge
0ed0: 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79  r or foreign key
0ee0: 20 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20   action .**     
0ef0: 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20 64 69     instead of di
0f00: 72 65 63 74 6c 79 20 61 73 20 61 20 72 65 73 75  rectly as a resu
0f10: 6c 74 20 6f 66 20 61 20 75 73 65 72 73 20 53 51  lt of a users SQ
0f20: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
0f30: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  </ul>.**.** If a
0f40: 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 61   single row is a
0f50: 66 66 65 63 74 65 64 20 62 79 20 6d 6f 72 65 20  ffected by more 
0f60: 74 68 61 6e 20 6f 6e 65 20 6f 70 65 72 61 74 69  than one operati
0f70: 6f 6e 20 77 69 74 68 69 6e 20 61 20 73 65 73 73  on within a sess
0f80: 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ion,.** then the
0f90: 20 63 68 61 6e 67 65 20 69 73 20 63 6f 6e 73 69   change is consi
0fa0: 64 65 72 65 64 20 69 6e 64 69 72 65 63 74 20 69  dered indirect i
0fb0: 66 20 61 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 73  f all operations
0fc0: 20 6d 65 65 74 20 74 68 65 20 63 72 69 74 65 72   meet the criter
0fd0: 69 61 0a 2a 2a 20 66 6f 72 20 61 6e 20 69 6e 64  ia.** for an ind
0fe0: 69 72 65 63 74 20 63 68 61 6e 67 65 20 61 62 6f  irect change abo
0ff0: 76 65 2c 20 6f 72 20 64 69 72 65 63 74 20 6f 74  ve, or direct ot
1000: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  herwise..**.** T
1010: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1020: 75 73 65 64 20 74 6f 20 73 65 74 2c 20 63 6c 65  used to set, cle
1030: 61 72 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  ar or query the 
1040: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  session object i
1050: 6e 64 69 72 65 63 74 0a 2a 2a 20 66 6c 61 67 2e  ndirect.** flag.
1060: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1070: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1080: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1090: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
10a0: 68 65 0a 2a 2a 20 69 6e 64 69 72 65 63 74 20 66  he.** indirect f
10b0: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2e 20  lag is cleared. 
10c0: 49 66 20 69 74 20 69 73 20 67 72 65 61 74 65 72  If it is greater
10d0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 20   than zero, the 
10e0: 69 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 2a 2a  indirect flag.**
10f0: 20 69 73 20 73 65 74 2e 20 50 61 73 73 69 6e 67   is set. Passing
1100: 20 61 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68   a value less th
1110: 61 6e 20 7a 65 72 6f 20 64 6f 65 73 20 6e 6f 74  an zero does not
1120: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 75 72 72   modify the curr
1130: 65 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  ent value.** of 
1140: 74 68 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61  the indirect fla
1150: 67 2c 20 61 6e 64 20 6d 61 79 20 62 65 20 75 73  g, and may be us
1160: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
1170: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1180: 20 74 68 65 20 0a 2a 2a 20 69 6e 64 69 72 65 63   the .** indirec
1190: 74 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 73  t flag for the s
11a0: 70 65 63 69 66 69 65 64 20 73 65 73 73 69 6f 6e  pecified session
11b0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
11c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11d0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69  indicates the fi
11e0: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
11f0: 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 3a 20   indirect flag: 
1200: 30 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 20 63  0 if .** it is c
1210: 6c 65 61 72 2c 20 6f 72 20 31 20 69 66 20 69 74  lear, or 1 if it
1220: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20   is set..*/.int 
1230: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69  sqlite3session_i
1240: 6e 64 69 72 65 63 74 28 73 71 6c 69 74 65 33 5f  ndirect(sqlite3_
1250: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
1260: 6e 2c 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74  n, int bIndirect
1270: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52  );../*.** CAPI3R
1280: 45 46 3a 20 41 74 74 61 63 68 20 41 20 54 61 62  EF: Attach A Tab
1290: 6c 65 20 54 6f 20 41 20 53 65 73 73 69 6f 6e 20  le To A Session 
12a0: 4f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 49 66 20  Object.**.** If 
12b0: 61 72 67 75 6d 65 6e 74 20 7a 54 61 62 20 69 73  argument zTab is
12c0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
12d0: 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
12e0: 66 20 61 20 74 61 62 6c 65 20 74 6f 20 61 74 74  f a table to att
12f0: 61 63 68 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65  ach.** to the se
1300: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ssion object pas
1310: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1320: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c 20 73   argument. All s
1330: 75 62 73 65 71 75 65 6e 74 20 63 68 61 6e 67 65  ubsequent change
1340: 73 20 0a 2a 2a 20 6d 61 64 65 20 74 6f 20 74 68  s .** made to th
1350: 65 20 74 61 62 6c 65 20 77 68 69 6c 65 20 74 68  e table while th
1360: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
1370: 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69 6c 6c   is enabled will
1380: 20 62 65 20 72 65 63 6f 72 64 65 64 2e 20 53 65   be recorded. Se
1390: 65 20 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74  e .** documentat
13a0: 69 6f 6e 20 66 6f 72 20 5b 73 71 6c 69 74 65 33  ion for [sqlite3
13b0: 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
13c0: 74 28 29 5d 20 66 6f 72 20 66 75 72 74 68 65 72  t()] for further
13d0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
13e0: 4f 72 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  Or, if argument 
13f0: 7a 54 61 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68  zTab is NULL, th
1400: 65 6e 20 63 68 61 6e 67 65 73 20 61 72 65 20 72  en changes are r
1410: 65 63 6f 72 64 65 64 20 66 6f 72 20 61 6c 6c 20  ecorded for all 
1420: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74 68 65  tables.** in the
1430: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 64   database. If ad
1440: 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73 20  ditional tables 
1450: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
1460: 20 64 61 74 61 62 61 73 65 20 28 62 79 20 0a 2a   database (by .*
1470: 2a 20 65 78 65 63 75 74 69 6e 67 20 22 43 52 45  * executing "CRE
1480: 41 54 45 20 54 41 42 4c 45 22 20 73 74 61 74 65  ATE TABLE" state
1490: 6d 65 6e 74 73 29 20 61 66 74 65 72 20 74 68 69  ments) after thi
14a0: 73 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 2c 20  s call is made, 
14b0: 63 68 61 6e 67 65 73 20 66 6f 72 20 0a 2a 2a 20  changes for .** 
14c0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 61  the new tables a
14d0: 72 65 20 61 6c 73 6f 20 72 65 63 6f 72 64 65 64  re also recorded
14e0: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ..**.** Changes 
14f0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 65 63 6f  can only be reco
1500: 72 64 65 64 20 66 6f 72 20 74 61 62 6c 65 73 20  rded for tables 
1510: 74 68 61 74 20 68 61 76 65 20 61 20 50 52 49 4d  that have a PRIM
1520: 41 52 59 20 4b 45 59 20 65 78 70 6c 69 63 69 74  ARY KEY explicit
1530: 6c 79 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 73  ly.** defined as
1540: 20 70 61 72 74 20 6f 66 20 74 68 65 69 72 20 43   part of their C
1550: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1560: 65 6d 65 6e 74 2e 20 49 74 20 64 6f 65 73 20 6e  ement. It does n
1570: 6f 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65  ot matter if the
1580: 20 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59   .** PRIMARY KEY
1590: 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20   is an "INTEGER 
15a0: 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28 72 6f  PRIMARY KEY" (ro
15b0: 77 69 64 20 61 6c 69 61 73 29 20 6f 72 20 6e 6f  wid alias) or no
15c0: 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59 0a 2a  t. The PRIMARY.*
15d0: 2a 20 4b 45 59 20 6d 61 79 20 63 6f 6e 73 69 73  * KEY may consis
15e0: 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  t of a single co
15f0: 6c 75 6d 6e 2c 20 6f 72 20 6d 61 79 20 62 65 20  lumn, or may be 
1600: 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65 79 2e  a composite key.
1610: 0a 2a 2a 20 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  .** .** It is no
1620: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
1630: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 64 6f  e named table do
1640: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20  es not exist in 
1650: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4e 6f  the database. No
1660: 72 0a 2a 2a 20 69 73 20 69 74 20 61 6e 20 65 72  r.** is it an er
1670: 72 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ror if the named
1680: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
1690: 68 61 76 65 20 61 20 50 52 49 4d 41 52 59 20 4b  have a PRIMARY K
16a0: 45 59 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  EY. However,.** 
16b0: 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20  no changes will 
16c0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 65  be recorded in e
16d0: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 73  ither of these s
16e0: 63 65 6e 61 72 69 6f 73 2e 0a 2a 2a 0a 2a 2a 20  cenarios..**.** 
16f0: 43 68 61 6e 67 65 73 20 61 72 65 20 6e 6f 74 20  Changes are not 
1700: 72 65 63 6f 72 64 65 64 20 66 6f 72 20 69 6e 64  recorded for ind
1710: 69 76 69 64 75 61 6c 20 72 6f 77 73 20 74 68 61  ividual rows tha
1720: 74 20 68 61 76 65 20 4e 55 4c 4c 20 76 61 6c 75  t have NULL valu
1730: 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  es stored.** in 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
1750: 68 65 69 72 20 50 52 49 4d 41 52 59 20 4b 45 59  heir PRIMARY KEY
1760: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
1770: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1780: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
1790: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 77 69 74 68  l completes with
17a0: 6f 75 74 20 65 72 72 6f 72 2e 20 4f 72 2c 20 69  out error. Or, i
17b0: 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
17c0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
17d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65 2e 67   error code (e.g
17e0: 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20  . SQLITE_NOMEM) 
17f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1800: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
1810: 6f 6e 5f 61 74 74 61 63 68 28 0a 20 20 73 71 6c  on_attach(.  sql
1820: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
1830: 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20  ession,      /* 
1840: 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  Session object *
1850: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1860: 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20  zTab            
1870: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d      /* Table nam
1880: 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  e */.);../*.** C
1890: 41 50 49 33 52 45 46 3a 20 53 65 74 20 61 20 74  API3REF: Set a t
18a0: 61 62 6c 65 20 66 69 6c 74 65 72 20 6f 6e 20 61  able filter on a
18b0: 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 2e   Session Object.
18c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
18d0: 64 20 61 72 67 75 6d 65 6e 74 20 28 78 46 69 6c  d argument (xFil
18e0: 74 65 72 29 20 69 73 20 74 68 65 20 22 66 69 6c  ter) is the "fil
18f0: 74 65 72 20 63 61 6c 6c 62 61 63 6b 22 2e 20 46  ter callback". F
1900: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 72 6f  or changes to ro
1910: 77 73 20 0a 2a 2a 20 69 6e 20 74 61 62 6c 65 73  ws .** in tables
1920: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 74   that are not at
1930: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 53 65  tached to the Se
1940: 73 73 69 6f 6e 20 6f 6a 65 63 74 2c 20 74 68 65  ssion oject, the
1950: 20 66 69 6c 74 65 72 20 69 73 20 63 61 6c 6c 65   filter is calle
1960: 64 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  d.** to determin
1970: 65 20 77 68 65 74 68 65 72 20 63 68 61 6e 67 65  e whether change
1980: 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 27 73  s to the table's
1990: 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 62 65 20   rows should be 
19a0: 74 72 61 63 6b 65 64 20 6f 72 20 6e 6f 74 2e 20  tracked or not. 
19b0: 0a 2a 2a 20 49 66 20 78 46 69 6c 74 65 72 20 72  .** If xFilter r
19c0: 65 74 75 72 6e 73 20 30 2c 20 63 68 61 6e 67 65  eturns 0, change
19d0: 73 20 69 73 20 6e 6f 74 20 74 72 61 63 6b 65 64  s is not tracked
19e0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e 63 65  . Note that once
19f0: 20 61 20 74 61 62 6c 65 20 69 73 20 0a 2a 2a 20   a table is .** 
1a00: 61 74 74 61 63 68 65 64 2c 20 78 46 69 6c 74 65  attached, xFilte
1a10: 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 61  r will not be ca
1a20: 6c 6c 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76  lled again..*/.v
1a30: 6f 69 64 20 73 71 6c 69 74 65 33 73 65 73 73 69  oid sqlite3sessi
1a40: 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28  on_table_filter(
1a50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
1a60: 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20  on *pSession,   
1a70: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62     /* Session ob
1a80: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ject */.  int(*x
1a90: 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69  Filter)(.    voi
1aa0: 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
1ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1ac0: 70 79 20 6f 66 20 74 68 69 72 64 20 61 72 67 20  py of third arg 
1ad0: 74 6f 20 5f 66 69 6c 74 65 72 5f 74 61 62 6c 65  to _filter_table
1ae0: 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  () */.    const 
1af0: 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20  char *zTab      
1b00: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20   name */.  ),.  
1b20: 76 6f 69 64 20 2a 70 43 74 78 20 20 20 20 20 20  void *pCtx      
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
1b50: 74 20 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c  t passed to xFil
1b60: 74 65 72 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ter */.);../*.**
1b70: 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65 72   CAPI3REF: Gener
1b80: 61 74 65 20 41 20 43 68 61 6e 67 65 73 65 74 20  ate A Changeset 
1b90: 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20 4f  From A Session O
1ba0: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 4f 62 74 61  bject.**.** Obta
1bb0: 69 6e 20 61 20 63 68 61 6e 67 65 73 65 74 20 63  in a changeset c
1bc0: 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65  ontaining change
1bd0: 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 73 20  s to the tables 
1be0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1bf0: 0a 2a 2a 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  .** session obje
1c00: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1c10: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1c20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c30: 0a 2a 2a 20 73 65 74 20 2a 70 70 43 68 61 6e 67  .** set *ppChang
1c40: 65 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  eset to point to
1c50: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1c60: 6e 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73  ning the changes
1c70: 65 74 20 0a 2a 2a 20 61 6e 64 20 2a 70 6e 43 68  et .** and *pnCh
1c80: 61 6e 67 65 73 65 74 20 74 6f 20 74 68 65 20 73  angeset to the s
1c90: 69 7a 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ize of the chang
1ca0: 65 73 65 74 20 69 6e 20 62 79 74 65 73 20 62 65  eset in bytes be
1cb0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 0a 2a  fore returning.*
1cc0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1cd0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1ce0: 20 73 65 74 20 62 6f 74 68 20 2a 70 70 43 68 61   set both *ppCha
1cf0: 6e 67 65 73 65 74 20 61 6e 64 20 2a 70 6e 43 68  ngeset and *pnCh
1d00: 61 6e 67 65 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  angeset to.** ze
1d10: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
1d20: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1d30: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e  de..**.** A chan
1d40: 67 65 73 65 74 20 63 6f 6e 73 69 73 74 73 20 6f  geset consists o
1d50: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 49  f zero or more I
1d60: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e  NSERT, UPDATE an
1d70: 64 2f 6f 72 20 44 45 4c 45 54 45 20 63 68 61 6e  d/or DELETE chan
1d80: 67 65 73 2c 0a 2a 2a 20 65 61 63 68 20 72 65 70  ges,.** each rep
1d90: 72 65 73 65 6e 74 69 6e 67 20 61 20 63 68 61 6e  resenting a chan
1da0: 67 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 72  ge to a single r
1db0: 6f 77 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  ow of an attache
1dc0: 64 20 74 61 62 6c 65 2e 20 41 6e 20 49 4e 53 45  d table. An INSE
1dd0: 52 54 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 6e  RT.** change con
1de0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
1df0: 20 6f 66 20 65 61 63 68 20 66 69 65 6c 64 20 6f   of each field o
1e00: 66 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  f a new database
1e10: 20 72 6f 77 2e 20 41 20 44 45 4c 45 54 45 0a 2a   row. A DELETE.*
1e20: 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  * contains the o
1e30: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 6f  riginal values o
1e40: 66 20 65 61 63 68 20 66 69 65 6c 64 20 6f 66 20  f each field of 
1e50: 61 20 64 65 6c 65 74 65 64 20 64 61 74 61 62 61  a deleted databa
1e60: 73 65 20 72 6f 77 2e 20 41 6e 0a 2a 2a 20 55 50  se row. An.** UP
1e70: 44 41 54 45 20 63 68 61 6e 67 65 20 63 6f 6e 74  DATE change cont
1e80: 61 69 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  ains the origina
1e90: 6c 20 76 61 6c 75 65 73 20 6f 66 20 65 61 63 68  l values of each
1ea0: 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 75 70 64   field of an upd
1eb0: 61 74 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  ated.** database
1ec0: 20 72 6f 77 20 61 6c 6f 6e 67 20 77 69 74 68 20   row along with 
1ed0: 74 68 65 20 75 70 64 61 74 65 64 20 76 61 6c 75  the updated valu
1ee0: 65 73 20 66 6f 72 20 65 61 63 68 20 75 70 64 61  es for each upda
1ef0: 74 65 64 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 2d  ted non-primary-
1f00: 6b 65 79 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 49  key.** column. I
1f10: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1f20: 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45 20  e for an UPDATE 
1f30: 63 68 61 6e 67 65 20 74 6f 20 72 65 70 72 65 73  change to repres
1f40: 65 6e 74 20 61 20 63 68 61 6e 67 65 20 74 68 61  ent a change tha
1f50: 74 0a 2a 2a 20 6d 6f 64 69 66 69 65 73 20 74 68  t.** modifies th
1f60: 65 20 76 61 6c 75 65 73 20 6f 66 20 70 72 69 6d  e values of prim
1f70: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ary key columns.
1f80: 20 49 66 20 73 75 63 68 20 61 20 63 68 61 6e 67   If such a chang
1f90: 65 20 69 73 20 6d 61 64 65 2c 20 69 74 0a 2a 2a  e is made, it.**
1fa0: 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20   is represented 
1fb0: 69 6e 20 61 20 63 68 61 6e 67 65 73 65 74 20 61  in a changeset a
1fc0: 73 20 61 20 44 45 4c 45 54 45 20 66 6f 6c 6c 6f  s a DELETE follo
1fd0: 77 65 64 20 62 79 20 61 6e 20 49 4e 53 45 52 54  wed by an INSERT
1fe0: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ..**.** Changes 
1ff0: 61 72 65 20 6e 6f 74 20 72 65 63 6f 72 64 65 64  are not recorded
2000: 20 66 6f 72 20 72 6f 77 73 20 74 68 61 74 20 68   for rows that h
2010: 61 76 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ave NULL values 
2020: 73 74 6f 72 65 64 20 69 6e 20 6f 6e 65 20 6f 72  stored in one or
2030: 20 0a 2a 2a 20 6d 6f 72 65 20 6f 66 20 74 68 65   .** more of the
2040: 69 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ir PRIMARY KEY c
2050: 6f 6c 75 6d 6e 73 2e 20 49 66 20 73 75 63 68 20  olumns. If such 
2060: 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  a row is inserte
2070: 64 20 6f 72 20 64 65 6c 65 74 65 64 2c 0a 2a 2a  d or deleted,.**
2080: 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   no correspondin
2090: 67 20 63 68 61 6e 67 65 20 69 73 20 70 72 65 73  g change is pres
20a0: 65 6e 74 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ent in the chang
20b0: 65 73 65 74 73 20 72 65 74 75 72 6e 65 64 20 62  esets returned b
20c0: 79 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  y this.** functi
20d0: 6f 6e 2e 20 49 66 20 61 6e 20 65 78 69 73 74 69  on. If an existi
20e0: 6e 67 20 72 6f 77 20 77 69 74 68 20 6f 6e 65 20  ng row with one 
20f0: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
2100: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  ues stored in.**
2110: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
2120: 75 6d 6e 73 20 69 73 20 75 70 64 61 74 65 64 20  umns is updated 
2130: 73 6f 20 74 68 61 74 20 61 6c 6c 20 50 52 49 4d  so that all PRIM
2140: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
2150: 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 0a 2a 2a  are non-NULL,.**
2160: 20 6f 6e 6c 79 20 61 6e 20 49 4e 53 45 52 54 20   only an INSERT 
2170: 69 73 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  is appears in th
2180: 65 20 63 68 61 6e 67 65 73 65 74 2e 20 53 69 6d  e changeset. Sim
2190: 69 6c 61 72 6c 79 2c 20 69 66 20 61 6e 20 65 78  ilarly, if an ex
21a0: 69 73 74 69 6e 67 20 72 6f 77 0a 2a 2a 20 77 69  isting row.** wi
21b0: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 50 52 49 4d  th non-NULL PRIM
21c0: 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73 20 69  ARY KEY values i
21d0: 73 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  s updated so tha
21e0: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  t one or more of
21f0: 20 69 74 73 0a 2a 2a 20 50 52 49 4d 41 52 59 20   its.** PRIMARY 
2200: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  KEY columns are 
2210: 73 65 74 20 74 6f 20 4e 55 4c 4c 2c 20 74 68 65  set to NULL, the
2220: 20 72 65 73 75 6c 74 69 6e 67 20 63 68 61 6e 67   resulting chang
2230: 65 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a  eset contains a.
2240: 2a 2a 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ** DELETE change
2250: 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   only..**.** The
2260: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 63   contents of a c
2270: 68 61 6e 67 65 73 65 74 20 6d 61 79 20 62 65 20  hangeset may be 
2280: 74 72 61 76 65 72 73 65 64 20 75 73 69 6e 67 20  traversed using 
2290: 61 6e 20 69 74 65 72 61 74 6f 72 20 63 72 65 61  an iterator crea
22a0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ted.** using the
22b0: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
22c0: 65 74 5f 73 74 61 72 74 28 29 5d 20 41 50 49 2e  et_start()] API.
22d0: 20 41 20 63 68 61 6e 67 65 73 65 74 20 6d 61 79   A changeset may
22e0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 0a 2a   be applied to.*
22f0: 2a 20 61 20 64 61 74 61 62 61 73 65 20 77 69 74  * a database wit
2300: 68 20 61 20 63 6f 6d 70 61 74 69 62 6c 65 20 73  h a compatible s
2310: 63 68 65 6d 61 20 75 73 69 6e 67 20 74 68 65 20  chema using the 
2320: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
2330: 74 5f 61 70 70 6c 79 28 29 5d 0a 2a 2a 20 41 50  t_apply()].** AP
2340: 49 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  I..**.** Within 
2350: 61 20 63 68 61 6e 67 65 73 65 74 20 67 65 6e 65  a changeset gene
2360: 72 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  rated by this fu
2370: 6e 63 74 69 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e  nction, all chan
2380: 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 61  ges related to a
2390: 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  .** single table
23a0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
23b0: 65 74 68 65 72 2e 20 49 6e 20 6f 74 68 65 72 20  ether. In other 
23c0: 77 6f 72 64 73 2c 20 77 68 65 6e 20 69 74 65 72  words, when iter
23d0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 0a 2a 2a  ating through.**
23e0: 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20   a changeset or 
23f0: 77 68 65 6e 20 61 70 70 6c 79 69 6e 67 20 61 20  when applying a 
2400: 63 68 61 6e 67 65 73 65 74 20 74 6f 20 61 20 64  changeset to a d
2410: 61 74 61 62 61 73 65 2c 20 61 6c 6c 20 63 68 61  atabase, all cha
2420: 6e 67 65 73 20 72 65 6c 61 74 65 64 0a 2a 2a 20  nges related.** 
2430: 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  to a single tabl
2440: 65 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  e are processed 
2450: 62 65 66 6f 72 65 20 6d 6f 76 69 6e 67 20 6f 6e  before moving on
2460: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 61 62   to the next tab
2470: 6c 65 2e 20 54 61 62 6c 65 73 0a 2a 2a 20 61 72  le. Tables.** ar
2480: 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
2490: 73 61 6d 65 20 6f 72 64 65 72 20 69 6e 20 77 68  same order in wh
24a0: 69 63 68 20 74 68 65 79 20 77 65 72 65 20 61 74  ich they were at
24b0: 74 61 63 68 65 64 20 28 6f 72 20 61 75 74 6f 2d  tached (or auto-
24c0: 61 74 74 61 63 68 65 64 29 0a 2a 2a 20 74 6f 20  attached).** to 
24d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 65 73 73  the sqlite3_sess
24e0: 69 6f 6e 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ion object. The 
24f0: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
2500: 68 65 20 63 68 61 6e 67 65 73 20 72 65 6c 61 74  he changes relat
2510: 65 64 20 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c  ed to.** a singl
2520: 65 20 74 61 62 6c 65 20 61 72 65 20 73 74 6f 72  e table are stor
2530: 65 64 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ed is undefined.
2540: 0a 2a 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67  .**.** Following
2550: 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
2560: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
2570: 69 6f 6e 2c 20 69 74 20 69 73 20 74 68 65 20 72  ion, it is the r
2580: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
2590: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 74  .** the caller t
25a0: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
25b0: 65 20 74 68 65 20 62 75 66 66 65 72 20 74 68 61  e the buffer tha
25c0: 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74 20 70  t *ppChangeset p
25d0: 6f 69 6e 74 73 20 74 6f 20 75 73 69 6e 67 0a 2a  oints to using.*
25e0: 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65 65 28  * [sqlite3_free(
25f0: 29 5d 2e 0a 2a 2a 0a 2a 2a 20 3c 68 33 3e 43 68  )]..**.** <h3>Ch
2600: 61 6e 67 65 73 65 74 20 47 65 6e 65 72 61 74 69  angeset Generati
2610: 6f 6e 3c 2f 68 33 3e 0a 2a 2a 0a 2a 2a 20 4f 6e  on</h3>.**.** On
2620: 63 65 20 61 20 74 61 62 6c 65 20 68 61 73 20 62  ce a table has b
2630: 65 65 6e 20 61 74 74 61 63 68 65 64 20 74 6f 20  een attached to 
2640: 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  a session object
2650: 2c 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  , the session ob
2660: 6a 65 63 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ject.** records 
2670: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
2680: 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 6e 65  values of all ne
2690: 77 20 72 6f 77 73 20 69 6e 73 65 72 74 65 64 20  w rows inserted 
26a0: 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a  into the table..
26b0: 2a 2a 20 49 74 20 61 6c 73 6f 20 72 65 63 6f 72  ** It also recor
26c0: 64 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ds the original 
26d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20  primary key and 
26e0: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 76 61 6c  other column val
26f0: 75 65 73 20 6f 66 20 61 6e 79 0a 2a 2a 20 64 65  ues of any.** de
2700: 6c 65 74 65 64 20 6f 72 20 75 70 64 61 74 65 64  leted or updated
2710: 20 72 6f 77 73 2e 20 46 6f 72 20 65 61 63 68 20   rows. For each 
2720: 75 6e 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b  unique primary k
2730: 65 79 20 76 61 6c 75 65 2c 20 64 61 74 61 20 69  ey value, data i
2740: 73 20 6f 6e 6c 79 0a 2a 2a 20 72 65 63 6f 72 64  s only.** record
2750: 65 64 20 6f 6e 63 65 20 2d 20 74 68 65 20 66 69  ed once - the fi
2760: 72 73 74 20 74 69 6d 65 20 61 20 72 6f 77 20 77  rst time a row w
2770: 69 74 68 20 73 61 69 64 20 70 72 69 6d 61 72 79  ith said primary
2780: 20 6b 65 79 20 69 73 20 69 6e 73 65 72 74 65 64   key is inserted
2790: 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f 72 20  ,.** updated or 
27a0: 64 65 6c 65 74 65 64 20 69 6e 20 74 68 65 20 6c  deleted in the l
27b0: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 73  ifetime of the s
27c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
27d0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
27e0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 70 72 65 76  tion to the prev
27f0: 69 6f 75 73 20 70 61 72 61 67 72 61 70 68 3a 20  ious paragraph: 
2800: 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 69 6e  when a row is in
2810: 73 65 72 74 65 64 2c 0a 2a 2a 20 75 70 64 61 74  serted,.** updat
2820: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2c 20 69  ed or deleted, i
2830: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2840: 20 69 74 73 20 70 72 69 6d 61 72 79 20 6b 65 79   its primary key
2850: 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74 61 69 6e   columns contain
2860: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
2870: 2c 20 6e 6f 20 72 65 63 6f 72 64 20 6f 66 20 74  , no record of t
2880: 68 65 20 63 68 61 6e 67 65 20 69 73 20 6d 61 64  he change is mad
2890: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73  e..**.** The ses
28a0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 68 65 72  sion object ther
28b0: 65 66 6f 72 65 20 61 63 63 75 6d 75 6c 61 74 65  efore accumulate
28c0: 73 20 74 77 6f 20 74 79 70 65 73 20 6f 66 20 72  s two types of r
28d0: 65 63 6f 72 64 73 20 2d 20 74 68 6f 73 65 0a 2a  ecords - those.*
28e0: 2a 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f  * that consist o
28f0: 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  f primary key va
2900: 6c 75 65 73 20 6f 6e 6c 79 20 28 63 72 65 61 74  lues only (creat
2910: 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
2920: 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6e 65   inserts.** a ne
2930: 77 20 72 65 63 6f 72 64 29 20 61 6e 64 20 74 68  w record) and th
2940: 6f 73 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ose that consist
2950: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
2960: 6b 65 79 20 76 61 6c 75 65 73 20 61 6e 64 20 74  key values and t
2970: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 76  he.** original v
2980: 61 6c 75 65 73 20 6f 66 20 6f 74 68 65 72 20 74  alues of other t
2990: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 28 63 72  able columns (cr
29a0: 65 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 75  eated when the u
29b0: 73 65 72 73 20 64 65 6c 65 74 65 73 0a 2a 2a 20  sers deletes.** 
29c0: 6f 72 20 75 70 64 61 74 65 73 20 61 20 72 65 63  or updates a rec
29d0: 6f 72 64 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ord)..**.** When
29e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29f0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 72 65  s called, the re
2a00: 71 75 65 73 74 65 64 20 63 68 61 6e 67 65 73 65  quested changese
2a10: 74 20 69 73 20 63 72 65 61 74 65 64 20 75 73 69  t is created usi
2a20: 6e 67 0a 2a 2a 20 62 6f 74 68 20 74 68 65 20 61  ng.** both the a
2a30: 63 63 75 6d 75 6c 61 74 65 64 20 72 65 63 6f 72  ccumulated recor
2a40: 64 73 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ds and the curre
2a50: 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
2a60: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
2a70: 69 6c 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ile. Specificall
2a80: 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a  y:.**.** <ul>.**
2a90: 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68     <li> For each
2aa0: 20 72 65 63 6f 72 64 20 67 65 6e 65 72 61 74 65   record generate
2ab0: 64 20 62 79 20 61 6e 20 69 6e 73 65 72 74 2c 20  d by an insert, 
2ac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2ad0: 71 75 65 72 69 65 64 0a 2a 2a 20 20 20 20 20 20  queried.**      
2ae0: 20 20 66 6f 72 20 61 20 72 6f 77 20 77 69 74 68    for a row with
2af0: 20 61 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d   a matching prim
2b00: 61 72 79 20 6b 65 79 2e 20 49 66 20 6f 6e 65 20  ary key. If one 
2b10: 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 49 4e 53  is found, an INS
2b20: 45 52 54 0a 2a 2a 20 20 20 20 20 20 20 20 63 68  ERT.**        ch
2b30: 61 6e 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  ange is added to
2b40: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
2b50: 49 66 20 6e 6f 20 73 75 63 68 20 72 6f 77 20 69  If no such row i
2b60: 73 20 66 6f 75 6e 64 2c 20 6e 6f 20 63 68 61 6e  s found, no chan
2b70: 67 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 69 73  ge .**        is
2b80: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68   added to the ch
2b90: 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  angeset..**.**  
2ba0: 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72   <li> For each r
2bb0: 65 63 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20  ecord generated 
2bc0: 62 79 20 61 6e 20 75 70 64 61 74 65 20 6f 72 20  by an update or 
2bd0: 64 65 6c 65 74 65 2c 20 74 68 65 20 64 61 74 61  delete, the data
2be0: 62 61 73 65 20 69 73 20 0a 2a 2a 20 20 20 20 20  base is .**     
2bf0: 20 20 20 71 75 65 72 69 65 64 20 66 6f 72 20 61     queried for a
2c00: 20 72 6f 77 20 77 69 74 68 20 61 20 6d 61 74 63   row with a matc
2c10: 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  hing primary key
2c20: 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f 77 20  . If such a row 
2c30: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 75  is.**        fou
2c40: 6e 64 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  nd and one or mo
2c50: 72 65 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 70 72  re of the non-pr
2c60: 69 6d 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73  imary key fields
2c70: 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 20 20   have been.**   
2c80: 20 20 20 20 20 6d 6f 64 69 66 69 65 64 20 66 72       modified fr
2c90: 6f 6d 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  om their origina
2ca0: 6c 20 76 61 6c 75 65 73 2c 20 61 6e 20 55 50 44  l values, an UPD
2cb0: 41 54 45 20 63 68 61 6e 67 65 20 69 73 20 61 64  ATE change is ad
2cc0: 64 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ded to .**      
2cd0: 20 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e    the changeset.
2ce0: 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63 68 20   Or, if no such 
2cf0: 72 6f 77 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  row is found in 
2d00: 74 68 65 20 74 61 62 6c 65 2c 20 61 20 44 45 4c  the table, a DEL
2d10: 45 54 45 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ETE .**        c
2d20: 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20 74  hange is added t
2d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  o the changeset.
2d40: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 72   If there is a r
2d50: 6f 77 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  ow with a matchi
2d60: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 70 72 69  ng.**        pri
2d70: 6d 61 72 79 20 6b 65 79 20 69 6e 20 74 68 65 20  mary key in the 
2d80: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 61 6c  database, but al
2d90: 6c 20 66 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e  l fields contain
2da0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a   their original.
2db0: 2a 2a 20 20 20 20 20 20 20 20 76 61 6c 75 65 73  **        values
2dc0: 2c 20 6e 6f 20 63 68 61 6e 67 65 20 69 73 20 61  , no change is a
2dd0: 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e  dded to the chan
2de0: 67 65 73 65 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a  geset..** </ul>.
2df0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
2e00: 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 20  , amongst other 
2e10: 74 68 69 6e 67 73 2c 20 74 68 61 74 20 69 66 20  things, that if 
2e20: 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  a row is inserte
2e30: 64 20 61 6e 64 20 74 68 65 6e 20 6c 61 74 65 72  d and then later
2e40: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 69 6c  .** deleted whil
2e50: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
2e60: 63 74 20 69 73 20 61 63 74 69 76 65 2c 20 6e 65  ct is active, ne
2e70: 69 74 68 65 72 20 74 68 65 20 69 6e 73 65 72 74  ither the insert
2e80: 20 6e 6f 72 20 74 68 65 20 64 65 6c 65 74 65 0a   nor the delete.
2e90: 2a 2a 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65  ** will be prese
2ea0: 6e 74 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  nt in the change
2eb0: 73 65 74 2e 20 4f 72 20 69 66 20 61 20 72 6f 77  set. Or if a row
2ec0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
2ed0: 74 68 65 6e 20 6c 61 74 65 72 20 61 20 0a 2a 2a  then later a .**
2ee0: 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61   row with the sa
2ef0: 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  me primary key v
2f00: 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64 20 77  alues inserted w
2f10: 68 69 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 6f  hile a session o
2f20: 62 6a 65 63 74 20 69 73 0a 2a 2a 20 61 63 74 69  bject is.** acti
2f30: 76 65 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ve, the resultin
2f40: 67 20 63 68 61 6e 67 65 73 65 74 20 77 69 6c 6c  g changeset will
2f50: 20 63 6f 6e 74 61 69 6e 20 61 6e 20 55 50 44 41   contain an UPDA
2f60: 54 45 20 63 68 61 6e 67 65 20 69 6e 73 74 65 61  TE change instea
2f70: 64 20 6f 66 0a 2a 2a 20 61 20 44 45 4c 45 54 45  d of.** a DELETE
2f80: 20 61 6e 64 20 61 6e 20 49 4e 53 45 52 54 2e 0a   and an INSERT..
2f90: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 73 65 73  **.** When a ses
2fa0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73 20 64  sion object is d
2fb0: 69 73 61 62 6c 65 64 20 28 73 65 65 20 74 68 65  isabled (see the
2fc0: 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   [sqlite3session
2fd0: 5f 65 6e 61 62 6c 65 28 29 5d 20 41 50 49 29 2c  _enable()] API),
2fe0: 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  .** it does not 
2ff0: 61 63 63 75 6d 75 6c 61 74 65 20 72 65 63 6f 72  accumulate recor
3000: 64 73 20 77 68 65 6e 20 72 6f 77 73 20 61 72 65  ds when rows are
3010: 20 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74   inserted, updat
3020: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 2a  ed or deleted..*
3030: 2a 20 54 68 69 73 20 6d 61 79 20 61 70 70 65 61  * This may appea
3040: 72 20 74 6f 20 68 61 76 65 20 73 6f 6d 65 20 63  r to have some c
3050: 6f 75 6e 74 65 72 2d 69 6e 74 75 69 74 69 76 65  ounter-intuitive
3060: 20 65 66 66 65 63 74 73 20 69 66 20 61 20 73 69   effects if a si
3070: 6e 67 6c 65 20 72 6f 77 0a 2a 2a 20 69 73 20 77  ngle row.** is w
3080: 72 69 74 74 65 6e 20 74 6f 20 6d 6f 72 65 20 74  ritten to more t
3090: 68 61 6e 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  han once during 
30a0: 61 20 73 65 73 73 69 6f 6e 2e 20 46 6f 72 20 65  a session. For e
30b0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 72 6f 77  xample, if a row
30c0: 0a 2a 2a 20 69 73 20 69 6e 73 65 72 74 65 64 20  .** is inserted 
30d0: 77 68 69 6c 65 20 61 20 73 65 73 73 69 6f 6e 20  while a session 
30e0: 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c 65  object is enable
30f0: 64 2c 20 74 68 65 6e 20 6c 61 74 65 72 20 64 65  d, then later de
3100: 6c 65 74 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  leted while .** 
3110: 74 68 65 20 73 61 6d 65 20 73 65 73 73 69 6f 6e  the same session
3120: 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73 61 62   object is disab
3130: 6c 65 64 2c 20 6e 6f 20 49 4e 53 45 52 54 20 72  led, no INSERT r
3140: 65 63 6f 72 64 20 77 69 6c 6c 20 61 70 70 65 61  ecord will appea
3150: 72 20 69 6e 20 74 68 65 0a 2a 2a 20 63 68 61 6e  r in the.** chan
3160: 67 65 73 65 74 2c 20 65 76 65 6e 20 74 68 6f 75  geset, even thou
3170: 67 68 20 74 68 65 20 64 65 6c 65 74 65 20 74 6f  gh the delete to
3180: 6f 6b 20 70 6c 61 63 65 20 77 68 69 6c 65 20 74  ok place while t
3190: 68 65 20 73 65 73 73 69 6f 6e 20 77 61 73 20 64  he session was d
31a0: 69 73 61 62 6c 65 64 2e 0a 2a 2a 20 4f 72 2c 20  isabled..** Or, 
31b0: 69 66 20 6f 6e 65 20 66 69 65 6c 64 20 6f 66 20  if one field of 
31c0: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
31d0: 20 77 68 69 6c 65 20 61 20 73 65 73 73 69 6f 6e   while a session
31e0: 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 61 6e   is disabled, an
31f0: 64 20 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 66 69  d .** another fi
3200: 65 6c 64 20 6f 66 20 74 68 65 20 73 61 6d 65 20  eld of the same 
3210: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 20 77  row is updated w
3220: 68 69 6c 65 20 74 68 65 20 73 65 73 73 69 6f 6e  hile the session
3230: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
3240: 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 63 68  .** resulting ch
3250: 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63 6f 6e  angeset will con
3260: 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45 20 63  tain an UPDATE c
3270: 68 61 6e 67 65 20 74 68 61 74 20 75 70 64 61 74  hange that updat
3280: 65 73 20 62 6f 74 68 20 66 69 65 6c 64 73 2e 0a  es both fields..
3290: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
32a0: 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28  ssion_changeset(
32b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
32c0: 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20  on *pSession,   
32d0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62     /* Session ob
32e0: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
32f0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
3300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3310: 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  : Size of buffer
3320: 20 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74   at *ppChangeset
3330: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 43   */.  void **ppC
3340: 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20 20  hangeset        
3350: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75        /* OUT: Bu
3360: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3370: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a  changeset */.);.
3380: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
3390: 20 4c 6f 61 64 20 54 68 65 20 44 69 66 66 65 72   Load The Differ
33a0: 65 6e 63 65 20 42 65 74 77 65 65 6e 20 54 61 62  ence Between Tab
33b0: 6c 65 73 20 49 6e 74 6f 20 41 20 53 65 73 73 69  les Into A Sessi
33c0: 6f 6e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  on .**.** If it 
33d0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
33e0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
33f0: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61  ession object pa
3400: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3410: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74  t.** argument, t
3420: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
3430: 61 63 68 65 73 20 74 61 62 6c 65 20 7a 54 62 6c  aches table zTbl
3440: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 6e   in the same man
3450: 6e 65 72 20 61 73 20 74 68 65 0a 2a 2a 20 5b 73  ner as the.** [s
3460: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74  qlite3session_at
3470: 74 61 63 68 28 29 5d 20 66 75 6e 63 74 69 6f 6e  tach()] function
3480: 2e 20 49 66 20 7a 54 62 6c 20 64 6f 65 73 20 6e  . If zTbl does n
3490: 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66 20  ot exist, or if 
34a0: 69 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  it.** does not h
34b0: 61 76 65 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ave a primary ke
34c0: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
34d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 62 75 74   is a no-op (but
34e0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
34f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 29 2e 0a 2a  .** an error)..*
3500: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  *.** Argument zF
3510: 72 6f 6d 44 62 20 6d 75 73 74 20 62 65 20 74 68  romDb must be th
3520: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
3530: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
3540: 65 6d 70 22 20 65 74 63 2e 29 0a 2a 2a 20 61 74  emp" etc.).** at
3550: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 61  tached to the sa
3560: 6d 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  me database hand
3570: 6c 65 20 61 73 20 74 68 65 20 73 65 73 73 69 6f  le as the sessio
3580: 6e 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f  n object that co
3590: 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 74 61 62  ntains .** a tab
35a0: 6c 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  le compatible wi
35b0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 74 74  th the table att
35c0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 65 73  ached to the ses
35d0: 73 69 6f 6e 20 62 79 20 74 68 69 73 20 66 75 6e  sion by this fun
35e0: 63 74 69 6f 6e 2e 0a 2a 2a 20 41 20 74 61 62 6c  ction..** A tabl
35f0: 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  e is considered 
3600: 63 6f 6d 70 61 74 69 62 6c 65 20 69 66 20 69 74  compatible if it
3610: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
3620: 20 20 3c 6c 69 3e 20 48 61 73 20 74 68 65 20 73    <li> Has the s
3630: 61 6d 65 20 6e 61 6d 65 2c 0a 2a 2a 20 20 20 3c  ame name,.**   <
3640: 6c 69 3e 20 48 61 73 20 74 68 65 20 73 61 6d 65  li> Has the same
3650: 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   set of columns 
3660: 64 65 63 6c 61 72 65 64 20 69 6e 20 74 68 65 20  declared in the 
3670: 73 61 6d 65 20 6f 72 64 65 72 2c 20 61 6e 64 0a  same order, and.
3680: 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68  **   <li> Has th
3690: 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20 4b  e same PRIMARY K
36a0: 45 59 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  EY definition..*
36b0: 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 49 66  * </ul>.**.** If
36c0: 20 74 68 65 20 74 61 62 6c 65 73 20 61 72 65 20   the tables are 
36d0: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 2c 20  not compatible, 
36e0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 73  SQLITE_SCHEMA is
36f0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
3700: 65 20 74 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20  e tables.** are 
3710: 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 74 20 64  compatible but d
3720: 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 50  o not have any P
3730: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
3740: 6e 73 2c 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  ns, it is not an
3750: 20 65 72 72 6f 72 0a 2a 2a 20 62 75 74 20 6e 6f   error.** but no
3760: 20 63 68 61 6e 67 65 73 20 61 72 65 20 61 64 64   changes are add
3770: 65 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f  ed to the sessio
3780: 6e 20 6f 62 6a 65 63 74 2e 20 41 73 20 77 69 74  n object. As wit
3790: 68 20 6f 74 68 65 72 20 73 65 73 73 69 6f 6e 0a  h other session.
37a0: 2a 2a 20 41 50 49 73 2c 20 74 61 62 6c 65 73 20  ** APIs, tables 
37b0: 77 69 74 68 6f 75 74 20 50 52 49 4d 41 52 59 20  without PRIMARY 
37c0: 4b 45 59 73 20 61 72 65 20 73 69 6d 70 6c 79 20  KEYs are simply 
37d0: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ignored..**.** T
37e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64  his function add
37f0: 73 20 61 20 73 65 74 20 6f 66 20 63 68 61 6e 67  s a set of chang
3800: 65 73 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f  es to the sessio
3810: 6e 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f  n object that co
3820: 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20 74  uld be.** used t
3830: 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 61 62  o update the tab
3840: 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 7a  le in database z
3850: 46 72 6f 6d 20 28 63 61 6c 6c 20 74 68 69 73 20  From (call this 
3860: 74 68 65 20 22 66 72 6f 6d 2d 74 61 62 6c 65 22  the "from-table"
3870: 29 20 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  ) .** so that it
3880: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 74 68 65  s content is the
3890: 20 73 61 6d 65 20 61 73 20 74 68 65 20 74 61 62   same as the tab
38a0: 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  le attached to t
38b0: 68 65 20 73 65 73 73 69 6f 6e 20 0a 2a 2a 20 6f  he session .** o
38c0: 62 6a 65 63 74 20 28 63 61 6c 6c 20 74 68 69 73  bject (call this
38d0: 20 74 68 65 20 22 74 6f 2d 74 61 62 6c 65 22 29   the "to-table")
38e0: 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a  . Specifically:.
38f0: 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20  **.** <ul>.**   
3900: 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f  <li> For each ro
3910: 77 20 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20  w (primary key) 
3920: 74 68 61 74 20 65 78 69 73 74 73 20 69 6e 20 74  that exists in t
3930: 68 65 20 74 6f 2d 74 61 62 6c 65 20 62 75 74 20  he to-table but 
3940: 6e 6f 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20 74  not in .**     t
3950: 68 65 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20 61  he from-table, a
3960: 6e 20 49 4e 53 45 52 54 20 72 65 63 6f 72 64 20  n INSERT record 
3970: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
3980: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  session object..
3990: 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72  **.**   <li> For
39a0: 20 65 61 63 68 20 72 6f 77 20 28 70 72 69 6d 61   each row (prima
39b0: 72 79 20 6b 65 79 29 20 74 68 61 74 20 65 78 69  ry key) that exi
39c0: 73 74 73 20 69 6e 20 74 68 65 20 74 6f 2d 74 61  sts in the to-ta
39d0: 62 6c 65 20 62 75 74 20 6e 6f 74 20 69 6e 20 0a  ble but not in .
39e0: 2a 2a 20 20 20 20 20 74 68 65 20 66 72 6f 6d 2d  **     the from-
39f0: 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45 20  table, a DELETE 
3a00: 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
3a10: 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  to the session o
3a20: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c  bject..**.**   <
3a30: 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f 77  li> For each row
3a40: 20 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74   (primary key) t
3a50: 68 61 74 20 65 78 69 73 74 73 20 69 6e 20 62 6f  hat exists in bo
3a60: 74 68 20 74 61 62 6c 65 73 2c 20 62 75 74 20 66  th tables, but f
3a70: 65 61 74 75 72 65 73 20 0a 2a 2a 20 20 20 20 20  eatures .**     
3a80: 64 69 66 66 65 72 65 6e 74 20 69 6e 20 65 61 63  different in eac
3a90: 68 2c 20 61 6e 20 55 50 44 41 54 45 20 72 65 63  h, an UPDATE rec
3aa0: 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ord is added to 
3ab0: 74 68 65 20 73 65 73 73 69 6f 6e 2e 0a 2a 2a 20  the session..** 
3ac0: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63  </ul>.**.** To c
3ad0: 6c 61 72 69 66 79 2c 20 69 66 20 74 68 69 73 20  larify, if this 
3ae0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
3af0: 65 64 20 61 6e 64 20 74 68 65 6e 20 61 20 63 68  ed and then a ch
3b00: 61 6e 67 65 73 65 74 20 63 6f 6e 73 74 72 75 63  angeset construc
3b10: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 5b 73 71  ted.** using [sq
3b20: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61  lite3session_cha
3b30: 6e 67 65 73 65 74 28 29 5d 2c 20 74 68 65 6e 20  ngeset()], then 
3b40: 61 66 74 65 72 20 61 70 70 6c 79 69 6e 67 20 74  after applying t
3b50: 68 61 74 20 63 68 61 6e 67 65 73 65 74 20 74 6f  hat changeset to
3b60: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 7a 46   .** database zF
3b70: 72 6f 6d 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  rom the contents
3b80: 20 6f 66 20 74 68 65 20 74 77 6f 20 63 6f 6d 70   of the two comp
3b90: 61 74 69 62 6c 65 20 74 61 62 6c 65 73 20 77 6f  atible tables wo
3ba0: 75 6c 64 20 62 65 20 0a 2a 2a 20 69 64 65 6e 74  uld be .** ident
3bb0: 69 63 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 61  ical..**.** It a
3bc0: 6e 20 65 72 72 6f 72 20 69 66 20 64 61 74 61 62  n error if datab
3bd0: 61 73 65 20 7a 46 72 6f 6d 20 64 6f 65 73 20 6e  ase zFrom does n
3be0: 6f 74 20 65 78 69 73 74 20 6f 72 20 64 6f 65 73  ot exist or does
3bf0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65   not contain the
3c00: 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 63 6f 6d  .** required com
3c10: 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2e 0a 2a  patible table..*
3c20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  *.** If the oper
3c30: 61 74 69 6f 6e 20 73 75 63 63 65 73 73 66 75 6c  ation successful
3c40: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
3c50: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
3c60: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  se, an SQLite.**
3c70: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
3c80: 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 61 72  this case, if ar
3c90: 67 75 6d 65 6e 74 20 70 7a 45 72 72 4d 73 67 20  gument pzErrMsg 
3ca0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 7a  is not NULL, *pz
3cb0: 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
3cc0: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
3cd0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
3ce0: 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
3cf0: 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
3d00: 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
3d10: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
3d20: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
3d30: 65 72 20 74 6f 20 66 72 65 65 20 74 68 69 73 20  er to free this 
3d40: 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20  buffer using.** 
3d50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
3d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
3d70: 73 73 69 6f 6e 5f 64 69 66 66 28 0a 20 20 73 71  ssion_diff(.  sq
3d80: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
3d90: 53 65 73 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73 74  Session,.  const
3da0: 20 63 68 61 72 20 2a 7a 46 72 6f 6d 44 62 2c 0a   char *zFromDb,.
3db0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3dc0: 62 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  bl,.  char **pzE
3dd0: 72 72 4d 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  rrMsg.);.../*.**
3de0: 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65 72   CAPI3REF: Gener
3df0: 61 74 65 20 41 20 50 61 74 63 68 73 65 74 20 46  ate A Patchset F
3e00: 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20 4f 62  rom A Session Ob
3e10: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ject.**.** The d
3e20: 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77 65  ifferences betwe
3e30: 65 6e 20 61 20 70 61 74 63 68 73 65 74 20 61 6e  en a patchset an
3e40: 64 20 61 20 63 68 61 6e 67 65 73 65 74 20 61 72  d a changeset ar
3e50: 65 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75  e that:.**.** <u
3e60: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 44 45 4c  l>.**   <li> DEL
3e70: 45 54 45 20 72 65 63 6f 72 64 73 20 63 6f 6e 73  ETE records cons
3e80: 69 73 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  ist of the prima
3e90: 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 6f 6e  ry key fields on
3ea0: 6c 79 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20  ly. The .**     
3eb0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75     original valu
3ec0: 65 73 20 6f 66 20 6f 74 68 65 72 20 66 69 65 6c  es of other fiel
3ed0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 0a  ds are omitted..
3ee0: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6f 72  **   <li> The or
3ef0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 6f 66  iginal values of
3f00: 20 61 6e 79 20 6d 6f 64 69 66 69 65 64 20 66 69   any modified fi
3f10: 65 6c 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  elds are omitted
3f20: 20 66 72 6f 6d 20 0a 2a 2a 20 20 20 20 20 20 20   from .**       
3f30: 20 55 50 44 41 54 45 20 72 65 63 6f 72 64 73 2e   UPDATE records.
3f40: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
3f50: 41 20 70 61 74 63 68 73 65 74 20 62 6c 6f 62 20  A patchset blob 
3f60: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
3f70: 20 75 70 20 74 6f 20 64 61 74 65 20 76 65 72 73   up to date vers
3f80: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20  ions of all .** 
3f90: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
3fa0: 5f 78 78 78 20 41 50 49 20 66 75 6e 63 74 69 6f  _xxx API functio
3fb0: 6e 73 20 65 78 63 65 70 74 20 66 6f 72 20 73 71  ns except for sq
3fc0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69  lite3changeset_i
3fd0: 6e 76 65 72 74 28 29 2c 20 0a 2a 2a 20 77 68 69  nvert(), .** whi
3fe0: 63 68 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ch returns SQLIT
3ff0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 69 74 20  E_CORRUPT if it 
4000: 69 73 20 70 61 73 73 65 64 20 61 20 70 61 74 63  is passed a patc
4010: 68 73 65 74 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  hset. Similarly,
4020: 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74  .** attempting t
4030: 6f 20 75 73 65 20 61 20 70 61 74 63 68 73 65 74  o use a patchset
4040: 20 62 6c 6f 62 20 77 69 74 68 20 6f 6c 64 20 76   blob with old v
4050: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  ersions of the.*
4060: 2a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  * sqlite3changes
4070: 65 74 5f 78 78 78 20 41 50 49 73 20 61 6c 73 6f  et_xxx APIs also
4080: 20 70 72 6f 76 6f 6b 65 73 20 61 6e 20 53 51 4c   provokes an SQL
4090: 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
40a0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  r. .**.** Becaus
40b0: 65 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72  e the non-primar
40c0: 79 20 6b 65 79 20 22 6f 6c 64 2e 2a 22 20 66 69  y key "old.*" fi
40d0: 65 6c 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  elds are omitted
40e0: 2c 20 6e 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , no .** SQLITE_
40f0: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 63  CHANGESET_DATA c
4100: 6f 6e 66 6c 69 63 74 73 20 63 61 6e 20 62 65 20  onflicts can be 
4110: 64 65 74 65 63 74 65 64 20 6f 72 20 72 65 70 6f  detected or repo
4120: 72 74 65 64 20 69 66 20 61 20 70 61 74 63 68 73  rted if a patchs
4130: 65 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  et.** is passed 
4140: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 63 68  to the sqlite3ch
4150: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20  angeset_apply() 
4160: 41 50 49 2e 20 4f 74 68 65 72 20 63 6f 6e 66 6c  API. Other confl
4170: 69 63 74 20 74 79 70 65 73 20 77 6f 72 6b 0a 2a  ict types work.*
4180: 2a 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  * in the same wa
4190: 79 20 61 73 20 66 6f 72 20 63 68 61 6e 67 65 73  y as for changes
41a0: 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ets..**.** Chang
41b0: 65 73 20 77 69 74 68 69 6e 20 61 20 70 61 74 63  es within a patc
41c0: 68 73 65 74 20 61 72 65 20 6f 72 64 65 72 65 64  hset are ordered
41d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
41e0: 20 61 73 20 66 6f 72 20 63 68 61 6e 67 65 73 65   as for changese
41f0: 74 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  ts.** generated 
4200: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 73 65  by the sqlite3se
4210: 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28  ssion_changeset(
4220: 29 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  ) function (i.e.
4230: 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 66 6f 72   all changes for
4240: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
4250: 6c 65 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  le are grouped t
4260: 6f 67 65 74 68 65 72 2c 20 74 61 62 6c 65 73 20  ogether, tables 
4270: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
4280: 64 65 72 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20  der in which.** 
4290: 74 68 65 79 20 77 65 72 65 20 61 74 74 61 63 68  they were attach
42a0: 65 64 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f  ed to the sessio
42b0: 6e 20 6f 62 6a 65 63 74 29 2e 0a 2a 2f 0a 69 6e  n object)..*/.in
42c0: 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  t sqlite3session
42d0: 5f 70 61 74 63 68 73 65 74 28 0a 20 20 73 71 6c  _patchset(.  sql
42e0: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
42f0: 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20  ession,      /* 
4300: 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  Session object *
4310: 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 63 68  /.  int *pnPatch
4320: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
4330: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
4340: 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a 70   of buffer at *p
4350: 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20  pChangeset */.  
4360: 76 6f 69 64 20 2a 2a 70 70 50 61 74 63 68 73 65  void **ppPatchse
4370: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
4380: 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72 20 63  /* OUT: Buffer c
4390: 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65  ontaining change
43a0: 73 65 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  set */.);../*.**
43b0: 20 43 41 50 49 33 52 45 46 3a 20 54 65 73 74 20   CAPI3REF: Test 
43c0: 69 66 20 61 20 63 68 61 6e 67 65 73 65 74 20 68  if a changeset h
43d0: 61 73 20 72 65 63 6f 72 64 65 64 20 61 6e 79 20  as recorded any 
43e0: 63 68 61 6e 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  changes..**.** R
43f0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
4400: 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  f no changes to 
4410: 61 74 74 61 63 68 65 64 20 74 61 62 6c 65 73 20  attached tables 
4420: 68 61 76 65 20 62 65 65 6e 20 72 65 63 6f 72 64  have been record
4430: 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 73 65  ed by .** the se
4440: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ssion object pas
4450: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
4460: 20 61 72 67 75 6d 65 6e 74 2e 20 4f 74 68 65 72   argument. Other
4470: 77 69 73 65 2c 20 69 66 20 6f 6e 65 20 6f 72 20  wise, if one or 
4480: 0a 2a 2a 20 6d 6f 72 65 20 63 68 61 6e 67 65 73  .** more changes
4490: 20 68 61 76 65 20 62 65 65 6e 20 72 65 63 6f 72   have been recor
44a0: 64 65 64 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ded, return zero
44b0: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20 69 66 20  ..**.** Even if 
44c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
44d0: 74 75 72 6e 73 20 7a 65 72 6f 2c 20 69 74 20 69  turns zero, it i
44e0: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
44f0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 5b 73 71 6c 69  calling.** [sqli
4500: 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67  te3session_chang
4510: 65 73 65 74 28 29 5d 20 6f 6e 20 74 68 65 20 73  eset()] on the s
4520: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 65 20 6d 61  ession handle ma
4530: 79 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 61  y still return a
4540: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74 68  .** changeset th
4550: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  at contains no c
4560: 68 61 6e 67 65 73 2e 20 54 68 69 73 20 63 61 6e  hanges. This can
4570: 20 68 61 70 70 65 6e 20 77 68 65 6e 20 61 20 72   happen when a r
4580: 6f 77 20 69 6e 20 0a 2a 2a 20 61 6e 20 61 74 74  ow in .** an att
4590: 61 63 68 65 64 20 74 61 62 6c 65 20 69 73 20 6d  ached table is m
45a0: 6f 64 69 66 69 65 64 20 61 6e 64 20 74 68 65 6e  odified and then
45b0: 20 6c 61 74 65 72 20 6f 6e 20 74 68 65 20 6f 72   later on the or
45c0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 0a 2a  iginal values .*
45d0: 2a 20 61 72 65 20 72 65 73 74 6f 72 65 64 2e 20  * are restored. 
45e0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 69 73  However, if this
45f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4600: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
4610: 20 69 74 20 69 73 0a 2a 2a 20 67 75 61 72 61 6e   it is.** guaran
4620: 74 65 65 64 20 74 68 61 74 20 61 20 63 61 6c 6c  teed that a call
4630: 20 74 6f 20 73 71 6c 69 74 65 33 73 65 73 73 69   to sqlite3sessi
4640: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 77  on_changeset() w
4650: 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 0a 2a 2a  ill return a .**
4660: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74 61   changeset conta
4670: 69 6e 69 6e 67 20 7a 65 72 6f 20 63 68 61 6e 67  ining zero chang
4680: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
4690: 65 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74  e3session_isempt
46a0: 79 28 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f  y(sqlite3_sessio
46b0: 6e 20 2a 70 53 65 73 73 69 6f 6e 29 3b 0a 0a 2f  n *pSession);../
46c0: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43  *.** CAPI3REF: C
46d0: 72 65 61 74 65 20 41 6e 20 49 74 65 72 61 74 6f  reate An Iterato
46e0: 72 20 54 6f 20 54 72 61 76 65 72 73 65 20 41 20  r To Traverse A 
46f0: 43 68 61 6e 67 65 73 65 74 20 0a 2a 2a 0a 2a 2a  Changeset .**.**
4700: 20 43 72 65 61 74 65 20 61 6e 20 69 74 65 72 61   Create an itera
4710: 74 6f 72 20 75 73 65 64 20 74 6f 20 69 74 65 72  tor used to iter
4720: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4730: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 63 68  contents of a ch
4740: 61 6e 67 65 73 65 74 2e 0a 2a 2a 20 49 66 20 73  angeset..** If s
4750: 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 20 69  uccessful, *pp i
4760: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
4770: 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 68  o the iterator h
4780: 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54 45  andle and SQLITE
4790: 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
47a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
47b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
47c0: 73 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  s, *pp is set to
47d0: 20 7a 65 72 6f 20 61 6e 64 20 61 6e 0a 2a 2a 20   zero and an.** 
47e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
47f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
4800: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4810: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  ng functions can
4820: 20 62 65 20 75 73 65 64 20 74 6f 20 61 64 76 61   be used to adva
4830: 6e 63 65 20 61 6e 64 20 71 75 65 72 79 20 61 20  nce and query a 
4840: 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a 20 69 74  changeset .** it
4850: 65 72 61 74 6f 72 20 63 72 65 61 74 65 64 20 62  erator created b
4860: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3a  y this function:
4870: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
4880: 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63 68   <li> [sqlite3ch
4890: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 0a  angeset_next()].
48a0: 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74  **   <li> [sqlit
48b0: 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 29  e3changeset_op()
48c0: 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c  ].**   <li> [sql
48d0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
48e0: 77 28 29 5d 0a 2a 2a 20 20 20 3c 6c 69 3e 20 5b  w()].**   <li> [
48f0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
4900: 5f 6f 6c 64 28 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e  _old()].** </ul>
4910: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
4920: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
4930: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
4940: 20 65 76 65 6e 74 75 61 6c 6c 79 20 64 65 73 74   eventually dest
4950: 72 6f 79 20 74 68 65 20 69 74 65 72 61 74 6f 72  roy the iterator
4960: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 69  .** by passing i
4970: 74 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68 61  t to [sqlite3cha
4980: 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28  ngeset_finalize(
4990: 29 5d 2e 20 54 68 65 20 62 75 66 66 65 72 20 63  )]. The buffer c
49a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
49b0: 20 63 68 61 6e 67 65 73 65 74 20 28 70 43 68 61   changeset (pCha
49c0: 6e 67 65 73 65 74 29 20 6d 75 73 74 20 72 65 6d  ngeset) must rem
49d0: 61 69 6e 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ain valid until 
49e0: 61 66 74 65 72 20 74 68 65 20 69 74 65 72 61 74  after the iterat
49f0: 6f 72 20 69 73 0a 2a 2a 20 64 65 73 74 72 6f 79  or is.** destroy
4a00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69  ed..**.** Assumi
4a10: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  ng the changeset
4a20: 20 62 6c 6f 62 20 77 61 73 20 63 72 65 61 74 65   blob was create
4a30: 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a  d by one of the.
4a40: 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  ** [sqlite3sessi
4a50: 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 5d 2c  on_changeset()],
4a60: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
4a70: 65 74 5f 63 6f 6e 63 61 74 28 29 5d 20 6f 72 0a  et_concat()] or.
4a80: 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  ** [sqlite3chang
4a90: 65 73 65 74 5f 69 6e 76 65 72 74 28 29 5d 20 66  eset_invert()] f
4aa0: 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68  unctions, all ch
4ab0: 61 6e 67 65 73 20 77 69 74 68 69 6e 20 74 68 65  anges within the
4ac0: 20 63 68 61 6e 67 65 73 65 74 20 0a 2a 2a 20 74   changeset .** t
4ad0: 68 61 74 20 61 70 70 6c 79 20 74 6f 20 61 20 73  hat apply to a s
4ae0: 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20  ingle table are 
4af0: 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
4b00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
4b10: 74 20 77 68 65 6e 20 0a 2a 2a 20 61 6e 20 61 70  t when .** an ap
4b20: 70 6c 69 63 61 74 69 6f 6e 20 69 74 65 72 61 74  plication iterat
4b30: 65 73 20 74 68 72 6f 75 67 68 20 61 20 63 68 61  es through a cha
4b40: 6e 67 65 73 65 74 20 75 73 69 6e 67 20 61 6e 20  ngeset using an 
4b50: 69 74 65 72 61 74 6f 72 20 63 72 65 61 74 65 64  iterator created
4b60: 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e   by .** this fun
4b70: 63 74 69 6f 6e 2c 20 61 6c 6c 20 63 68 61 6e 67  ction, all chang
4b80: 65 73 20 74 68 61 74 20 72 65 6c 61 74 65 20 74  es that relate t
4b90: 6f 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  o a single table
4ba0: 20 61 72 65 20 76 69 73 74 65 64 20 0a 2a 2a 20   are visted .** 
4bb0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 20 54  consecutively. T
4bc0: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
4bd0: 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  e that the itera
4be0: 74 6f 72 20 77 69 6c 6c 20 76 69 73 69 74 20 61  tor will visit a
4bf0: 20 63 68 61 6e 67 65 20 0a 2a 2a 20 74 68 65 20   change .** the 
4c00: 61 70 70 6c 69 65 73 20 74 6f 20 74 61 62 6c 65  applies to table
4c10: 20 58 2c 20 74 68 65 6e 20 6f 6e 65 20 66 6f 72   X, then one for
4c20: 20 74 61 62 6c 65 20 59 2c 20 61 6e 64 20 74 68   table Y, and th
4c30: 65 6e 20 6c 61 74 65 72 20 6f 6e 20 76 69 73 69  en later on visi
4c40: 74 20 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 63 68  t .** another ch
4c50: 61 6e 67 65 20 66 6f 72 20 74 61 62 6c 65 20 58  ange for table X
4c60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4c70: 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
4c80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
4c90: 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20  eset_iter **pp, 
4ca0: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 63     /* OUT: New c
4cb0: 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f  hangeset iterato
4cc0: 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  r handle */.  in
4cd0: 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20  t nChangeset,   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cf0: 20 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73   Size of changes
4d00: 65 74 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73  et blob in bytes
4d10: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61   */.  void *pCha
4d20: 6e 67 65 73 65 74 20 20 20 20 20 20 20 20 20 20  ngeset          
4d30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4d40: 20 74 6f 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e   to blob contain
4d50: 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  ing changeset */
4d60: 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  .);.../*.** CAPI
4d70: 33 52 45 46 3a 20 41 64 76 61 6e 63 65 20 41 20  3REF: Advance A 
4d80: 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61 74  Changeset Iterat
4d90: 6f 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  or.**.** This fu
4da0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
4db0: 62 65 20 75 73 65 64 20 77 69 74 68 20 69 74 65  be used with ite
4dc0: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
4dd0: 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 5b 73  y function.** [s
4de0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4df0: 73 74 61 72 74 28 29 5d 2e 20 49 66 20 69 74 20  start()]. If it 
4e00: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  is called on an 
4e10: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
4e20: 74 6f 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74  to.** a conflict
4e30: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
4e40: 6b 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61  k by [sqlite3cha
4e50: 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c  ngeset_apply()],
4e60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 0a 2a   SQLITE_MISUSE.*
4e70: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
4e80: 64 20 74 68 65 20 63 61 6c 6c 20 68 61 73 20 6e  d the call has n
4e90: 6f 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o effect..**.** 
4ea0: 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
4eb0: 72 20 61 6e 20 69 74 65 72 61 74 6f 72 20 69 73  r an iterator is
4ec0: 20 63 72 65 61 74 65 64 20 62 79 20 73 71 6c 69   created by sqli
4ed0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
4ee0: 72 74 28 29 2c 20 69 74 0a 2a 2a 20 64 6f 65 73  rt(), it.** does
4ef0: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
4f00: 79 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  y change in the 
4f10: 63 68 61 6e 67 65 73 65 74 2e 20 41 73 73 75 6d  changeset. Assum
4f20: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
4f30: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 65 6d 70 74  t.** is not empt
4f40: 79 2c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  y, the first cal
4f50: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
4f60: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
4f70: 69 74 65 72 61 74 6f 72 20 74 6f 0a 2a 2a 20 70  iterator to.** p
4f80: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
4f90: 74 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  t change in the 
4fa0: 63 68 61 6e 67 65 73 65 74 2e 20 45 61 63 68 20  changeset. Each 
4fb0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
4fc0: 61 64 76 61 6e 63 65 73 0a 2a 2a 20 74 68 65 20  advances.** the 
4fd0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
4fe0: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  t to the next ch
4ff0: 61 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e  ange in the chan
5000: 67 65 73 65 74 20 28 69 66 20 61 6e 79 29 2e 20  geset (if any). 
5010: 49 66 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 6f  If.** no error o
5020: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
5030: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
5040: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 67 65 20   a valid change 
5050: 61 66 74 65 72 20 61 20 63 61 6c 6c 0a 2a 2a 20  after a call.** 
5060: 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  to sqlite3change
5070: 73 65 74 5f 6e 65 78 74 28 29 20 68 61 73 20 61  set_next() has a
5080: 64 76 61 6e 63 65 64 20 69 74 2c 20 53 51 4c 49  dvanced it, SQLI
5090: 54 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e  TE_ROW is return
50a0: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
50b0: 65 2c 20 69 66 20 61 6c 6c 20 63 68 61 6e 67 65  e, if all change
50c0: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
50d0: 65 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  et have already 
50e0: 62 65 65 6e 20 76 69 73 69 74 65 64 2c 0a 2a 2a  been visited,.**
50f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
5100: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5110: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5120: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
5130: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5140: 72 6e 65 64 2e 20 50 6f 73 73 69 62 6c 65 20 65  rned. Possible e
5150: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 73 20 69  rror .** codes i
5160: 6e 63 6c 75 64 65 20 53 51 4c 49 54 45 5f 43 4f  nclude SQLITE_CO
5170: 52 52 55 50 54 20 28 69 66 20 74 68 65 20 63 68  RRUPT (if the ch
5180: 61 6e 67 65 73 65 74 20 62 75 66 66 65 72 20 69  angeset buffer i
5190: 73 20 63 6f 72 72 75 70 74 29 20 6f 72 20 0a 2a  s corrupt) or .*
51a0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
51b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
51c0: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 73 71 6c  angeset_next(sql
51d0: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
51e0: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
51f0: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62  .** CAPI3REF: Ob
5200: 74 61 69 6e 20 54 68 65 20 43 75 72 72 65 6e 74  tain The Current
5210: 20 4f 70 65 72 61 74 69 6f 6e 20 46 72 6f 6d 20   Operation From 
5220: 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72  A Changeset Iter
5230: 61 74 6f 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ator.**.** The p
5240: 49 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70 61  Iter argument pa
5250: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
5260: 63 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65 72  ction may either
5270: 20 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72 0a   be an iterator.
5280: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20 63  ** passed to a c
5290: 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20  onflict-handler 
52a0: 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  by [sqlite3chang
52b0: 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20 6f  eset_apply()], o
52c0: 72 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a  r an iterator.**
52d0: 20 63 72 65 61 74 65 64 20 62 79 20 5b 73 71 6c   created by [sql
52e0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
52f0: 61 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20 6c  art()]. In the l
5300: 61 74 74 65 72 20 63 61 73 65 2c 20 74 68 65 20  atter case, the 
5310: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 63  most recent.** c
5320: 61 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 63  all to [sqlite3c
5330: 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d  hangeset_next()]
5340: 20 6d 75 73 74 20 68 61 76 65 20 72 65 74 75 72   must have retur
5350: 6e 65 64 20 5b 53 51 4c 49 54 45 5f 52 4f 57 5d  ned [SQLITE_ROW]
5360: 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  . If this.** is 
5370: 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 74 68  not the case, th
5380: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
5390: 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55  rns [SQLITE_MISU
53a0: 53 45 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  SE]..**.** If ar
53b0: 67 75 6d 65 6e 74 20 70 7a 54 61 62 20 69 73 20  gument pzTab is 
53c0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a  not NULL, then *
53d0: 70 7a 54 61 62 20 69 73 20 73 65 74 20 74 6f 20  pzTab is set to 
53e0: 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a 20 6e 75  point to a.** nu
53f0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 75 74 66  l-terminated utf
5400: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
5410: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
5420: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5430: 6c 65 0a 2a 2a 20 61 66 66 65 63 74 65 64 20 62  le.** affected b
5440: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  y the current ch
5450: 61 6e 67 65 2e 20 54 68 65 20 62 75 66 66 65 72  ange. The buffer
5460: 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
5470: 6e 74 69 6c 20 65 69 74 68 65 72 0a 2a 2a 20 73  ntil either.** s
5480: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
5490: 6e 65 78 74 28 29 20 69 73 20 63 61 6c 6c 65 64  next() is called
54a0: 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
54b0: 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 0a 2a   or until the .*
54c0: 2a 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  * conflict-handl
54d0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er function retu
54e0: 72 6e 73 2e 20 49 66 20 70 6e 43 6f 6c 20 69 73  rns. If pnCol is
54f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
5500: 2a 70 6e 43 6f 6c 20 69 73 20 0a 2a 2a 20 73 65  *pnCol is .** se
5510: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
5520: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
5530: 65 20 74 61 62 6c 65 20 61 66 66 65 63 74 65 64  e table affected
5540: 20 62 79 20 74 68 65 20 63 68 61 6e 67 65 2e 20   by the change. 
5550: 49 66 0a 2a 2a 20 70 62 49 6e 63 6f 72 72 65 63  If.** pbIncorrec
5560: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
5570: 68 65 6e 20 2a 70 62 49 6e 64 69 72 65 63 74 20  hen *pbIndirect 
5580: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 28  is set to true (
5590: 31 29 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  1) if the change
55a0: 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 64 69 72 65  .** is an indire
55b0: 63 74 20 63 68 61 6e 67 65 2c 20 6f 72 20 66 61  ct change, or fa
55c0: 6c 73 65 20 28 30 29 20 6f 74 68 65 72 77 69 73  lse (0) otherwis
55d0: 65 2e 20 53 65 65 20 74 68 65 20 64 6f 63 75 6d  e. See the docum
55e0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  entation for.** 
55f0: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
5600: 69 6e 64 69 72 65 63 74 28 29 5d 20 66 6f 72 20  indirect()] for 
5610: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
5620: 20 64 69 72 65 63 74 20 61 6e 64 20 69 6e 64 69   direct and indi
5630: 72 65 63 74 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  rect.** changes.
5640: 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70 4f 70   Finally, if pOp
5650: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
5660: 65 6e 20 2a 70 4f 70 20 69 73 20 73 65 74 20 74  en *pOp is set t
5670: 6f 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 5b 53 51  o one of .** [SQ
5680: 4c 49 54 45 5f 49 4e 53 45 52 54 5d 2c 20 5b 53  LITE_INSERT], [S
5690: 51 4c 49 54 45 5f 44 45 4c 45 54 45 5d 20 6f 72  QLITE_DELETE] or
56a0: 20 5b 53 51 4c 49 54 45 5f 55 50 44 41 54 45 5d   [SQLITE_UPDATE]
56b0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
56c0: 68 65 20 0a 2a 2a 20 74 79 70 65 20 6f 66 20 63  he .** type of c
56d0: 68 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 69  hange that the i
56e0: 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
56f0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
5700: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
5710: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
5720: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
5730: 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
5740: 63 63 75 72 2c 20 61 6e 0a 2a 2a 20 53 51 4c 69  ccur, an.** SQLi
5750: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
5760: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 76   returned. The v
5770: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 6f 75 74  alues of the out
5780: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 6d 61  put variables ma
5790: 79 20 6e 6f 74 0a 2a 2a 20 62 65 20 74 72 75 73  y not.** be trus
57a0: 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ted in this case
57b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
57c0: 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 0a 20 20  changeset_op(.  
57d0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
57e0: 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20  t_iter *pIter,  
57f0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65  /* Iterator obje
5800: 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
5810: 61 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20 20 20  ar **pzTab,     
5820: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5830: 50 6f 69 6e 74 65 72 20 74 6f 20 74 61 62 6c 65  Pointer to table
5840: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
5850: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
5860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5870: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  T: Number of col
5880: 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f  umns in table */
5890: 0a 20 20 69 6e 74 20 2a 70 4f 70 2c 20 20 20 20  .  int *pOp,    
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 49 54     /* OUT: SQLIT
58c0: 45 5f 49 4e 53 45 52 54 2c 20 44 45 4c 45 54 45  E_INSERT, DELETE
58d0: 20 6f 72 20 55 50 44 41 54 45 20 2a 2f 0a 20 20   or UPDATE */.  
58e0: 69 6e 74 20 2a 70 62 49 6e 64 69 72 65 63 74 20  int *pbIndirect 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 66 6f 72  /* OUT: True for
5910: 20 61 6e 20 27 69 6e 64 69 72 65 63 74 27 20 63   an 'indirect' c
5920: 68 61 6e 67 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  hange */.);../*.
5930: 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74  ** CAPI3REF: Obt
5940: 61 69 6e 20 54 68 65 20 50 72 69 6d 61 72 79 20  ain The Primary 
5950: 4b 65 79 20 44 65 66 69 6e 69 74 69 6f 6e 20 4f  Key Definition O
5960: 66 20 41 20 54 61 62 6c 65 0a 2a 2a 0a 2a 2a 20  f A Table.**.** 
5970: 46 6f 72 20 65 61 63 68 20 6d 6f 64 69 66 69 65  For each modifie
5980: 64 20 74 61 62 6c 65 2c 20 61 20 63 68 61 6e 67  d table, a chang
5990: 65 73 65 74 20 69 6e 63 6c 75 64 65 73 20 74 68  eset includes th
59a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
59b0: 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69  ** <ul>.**   <li
59c0: 3e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  > The number of 
59d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
59e0: 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c  able, and.**   <
59f0: 6c 69 3e 20 57 68 69 63 68 20 6f 66 20 74 68 6f  li> Which of tho
5a00: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 6b 65 20  se columns make 
5a10: 75 70 20 74 68 65 20 74 61 62 6c 65 73 20 50 52  up the tables PR
5a20: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 20 3c 2f  IMARY KEY..** </
5a30: 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ul>.**.** This f
5a40: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
5a50: 74 6f 20 66 69 6e 64 20 77 68 69 63 68 20 63 6f  to find which co
5a60: 6c 75 6d 6e 73 20 63 6f 6d 70 72 69 73 65 20 74  lumns comprise t
5a70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
5a80: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6d  f.** the table m
5a90: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 63  odified by the c
5aa0: 68 61 6e 67 65 20 74 68 61 74 20 69 74 65 72 61  hange that itera
5ab0: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
5ac0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
5ad0: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
5ae0: 20 2a 70 61 62 50 4b 20 69 73 20 73 65 74 20 74   *pabPK is set t
5af0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  o point to an ar
5b00: 72 61 79 20 6f 66 20 6e 43 6f 6c 20 65 6e 74 72  ray of nCol entr
5b10: 69 65 73 2c 20 77 68 65 72 65 0a 2a 2a 20 6e 43  ies, where.** nC
5b20: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
5b30: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
5b40: 68 65 20 74 61 62 6c 65 2e 20 45 6c 65 6d 65 6e  he table. Elemen
5b50: 74 73 20 6f 66 20 2a 70 61 62 50 4b 20 61 72 65  ts of *pabPK are
5b60: 20 73 65 74 20 74 6f 0a 2a 2a 20 30 78 30 31 20   set to.** 0x01 
5b70: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
5b80: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 73 20 70  ding column is p
5b90: 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  art of the table
5ba0: 73 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 6f  s primary key, o
5bb0: 72 0a 2a 2a 20 30 78 30 30 20 69 66 20 69 74 20  r.** 0x00 if it 
5bc0: 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is not..**.** If
5bd0: 20 61 72 67 75 6d 65 74 20 70 6e 43 6f 6c 20 69   argumet pnCol i
5be0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5bf0: 20 2a 70 6e 43 6f 6c 20 69 73 20 73 65 74 20 74   *pnCol is set t
5c00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
5c10: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
5c20: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
5c30: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
5c40: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
5c50: 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65 73  he iterator does
5c60: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
5c70: 76 61 6c 69 64 0a 2a 2a 20 65 6e 74 72 79 2c 20  valid.** entry, 
5c80: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 73  SQLITE_MISUSE is
5c90: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
5ca0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
5cb0: 65 73 20 7a 65 72 6f 65 64 2e 20 4f 74 68 65 72  es zeroed. Other
5cc0: 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
5cd0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
5ce0: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  nd the output va
5cf0: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
5d00: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 0a 2a  d as described.*
5d10: 2a 20 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20  * above..*/.int 
5d20: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
5d30: 5f 70 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  _pk(.  sqlite3_c
5d40: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
5d50: 49 74 65 72 2c 20 20 2f 2a 20 49 74 65 72 61 74  Iter,  /* Iterat
5d60: 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  or object */.  u
5d70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 70  nsigned char **p
5d80: 61 62 50 4b 2c 20 20 20 20 20 20 20 20 20 20 2f  abPK,          /
5d90: 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20  * OUT: Array of 
5da0: 62 6f 6f 6c 65 61 6e 20 2d 20 74 72 75 65 20 66  boolean - true f
5db0: 6f 72 20 50 4b 20 63 6f 6c 73 20 2a 2f 0a 20 20  or PK cols */.  
5dc0: 69 6e 74 20 2a 70 6e 43 6f 6c 20 20 20 20 20 20  int *pnCol      
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
5df0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 6f 75 74  f entries in out
5e00: 70 75 74 20 61 72 72 61 79 20 2a 2f 0a 29 3b 0a  put array */.);.
5e10: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
5e20: 20 4f 62 74 61 69 6e 20 6f 6c 64 2e 2a 20 56 61   Obtain old.* Va
5e30: 6c 75 65 73 20 46 72 6f 6d 20 41 20 43 68 61 6e  lues From A Chan
5e40: 67 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a 2a  geset Iterator.*
5e50: 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65 72 20 61  *.** The pIter a
5e60: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
5e70: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
5e80: 6d 61 79 20 65 69 74 68 65 72 20 62 65 20 61 6e  may either be an
5e90: 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73   iterator.** pas
5ea0: 73 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63  sed to a conflic
5eb0: 74 2d 68 61 6e 64 6c 65 72 20 62 79 20 5b 73 71  t-handler by [sq
5ec0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
5ed0: 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61 6e 20 69  pply()], or an i
5ee0: 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72 65 61 74  terator.** creat
5ef0: 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 63 68  ed by [sqlite3ch
5f00: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29 5d  angeset_start()]
5f10: 2e 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20  . In the latter 
5f20: 63 61 73 65 2c 20 74 68 65 20 6d 6f 73 74 20 72  case, the most r
5f30: 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74 6f  ecent.** call to
5f40: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
5f50: 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75 73 74 20  et_next()] must 
5f60: 68 61 76 65 20 72 65 74 75 72 6e 65 64 20 53 51  have returned SQ
5f70: 4c 49 54 45 5f 52 4f 57 2e 20 0a 2a 2a 20 46 75  LITE_ROW. .** Fu
5f80: 72 74 68 65 72 6d 6f 72 65 2c 20 69 74 20 6d 61  rthermore, it ma
5f90: 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
5fa0: 20 69 66 20 74 68 65 20 74 79 70 65 20 6f 66 20   if the type of 
5fb0: 63 68 61 6e 67 65 20 74 68 61 74 20 74 68 65 20  change that the 
5fc0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 75 72 72  iterator.** curr
5fd0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
5fe0: 69 73 20 65 69 74 68 65 72 20 5b 53 51 4c 49 54  is either [SQLIT
5ff0: 45 5f 44 45 4c 45 54 45 5d 20 6f 72 20 5b 53 51  E_DELETE] or [SQ
6000: 4c 49 54 45 5f 55 50 44 41 54 45 5d 2e 20 4f 74  LITE_UPDATE]. Ot
6010: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73  herwise,.** this
6020: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6030: 73 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  s [SQLITE_MISUSE
6040: 5d 20 61 6e 64 20 73 65 74 73 20 2a 70 70 56 61  ] and sets *ppVa
6050: 6c 75 65 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  lue to NULL..**.
6060: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 56 61 6c  ** Argument iVal
6070: 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
6080: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
6090: 6f 20 30 2c 20 61 6e 64 20 6c 65 73 73 20 74 68  o 0, and less th
60a0: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  an the number.**
60b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
60c0: 68 65 20 74 61 62 6c 65 20 61 66 66 65 63 74 65  he table affecte
60d0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
60e0: 20 63 68 61 6e 67 65 2e 20 4f 74 68 65 72 77 69   change. Otherwi
60f0: 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 52  se,.** [SQLITE_R
6100: 41 4e 47 45 5d 20 69 73 20 72 65 74 75 72 6e 65  ANGE] is returne
6110: 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20 69  d and *ppValue i
6120: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
6130: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
6140: 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
6150: 6e 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20  n sets *ppValue 
6160: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 70 72  to point to a pr
6170: 6f 74 65 63 74 65 64 0a 2a 2a 20 73 71 6c 69 74  otected.** sqlit
6180: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20  e3_value object 
6190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
61a0: 56 61 6c 27 74 68 20 76 61 6c 75 65 20 66 72 6f  Val'th value fro
61b0: 6d 20 74 68 65 20 76 65 63 74 6f 72 20 6f 66 20  m the vector of 
61c0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77  .** original row
61d0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61   values stored a
61e0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 50  s part of the UP
61f0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 63  DATE or DELETE c
6200: 68 61 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74  hange and.** ret
6210: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
6220: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6230: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 73 20 66  function comes f
6240: 72 6f 6d 20 74 68 65 20 66 61 63 74 20 74 68 61  rom the fact tha
6250: 74 20 74 68 69 73 20 0a 2a 2a 20 69 73 20 73 69  t this .** is si
6260: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22 6f 6c  milar to the "ol
6270: 64 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20 61 76 61  d.*" columns ava
6280: 69 6c 61 62 6c 65 20 74 6f 20 75 70 64 61 74 65  ilable to update
6290: 20 6f 72 20 64 65 6c 65 74 65 20 74 72 69 67 67   or delete trigg
62a0: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f  ers..**.** If so
62b0: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  me other error o
62c0: 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f  ccurs (e.g. an O
62d0: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61  OM condition), a
62e0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
62f0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
6300: 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20  ed and *ppValue 
6310: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
6320: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
6330: 61 6e 67 65 73 65 74 5f 6f 6c 64 28 0a 20 20 73  angeset_old(.  s
6340: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
6350: 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
6360: 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
6370: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56  ator */.  int iV
6380: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
6390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
63a0: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
63b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
63c0: 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
63d0: 2f 2a 20 4f 55 54 3a 20 4f 6c 64 20 76 61 6c 75  /* OUT: Old valu
63e0: 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74  e (or NULL point
63f0: 65 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  er) */.);../*.**
6400: 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69   CAPI3REF: Obtai
6410: 6e 20 6e 65 77 2e 2a 20 56 61 6c 75 65 73 20 46  n new.* Values F
6420: 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20  rom A Changeset 
6430: 49 74 65 72 61 74 6f 72 0a 2a 2a 0a 2a 2a 20 54  Iterator.**.** T
6440: 68 65 20 70 49 74 65 72 20 61 72 67 75 6d 65 6e  he pIter argumen
6450: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
6460: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65 69   function may ei
6470: 74 68 65 72 20 62 65 20 61 6e 20 69 74 65 72 61  ther be an itera
6480: 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  tor.** passed to
6490: 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64   a conflict-hand
64a0: 6c 65 72 20 62 79 20 5b 73 71 6c 69 74 65 33 63  ler by [sqlite3c
64b0: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
64c0: 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72 61 74 6f  ], or an iterato
64d0: 72 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  r.** created by 
64e0: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
64f0: 74 5f 73 74 61 72 74 28 29 5d 2e 20 49 6e 20 74  t_start()]. In t
6500: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 2c 20  he latter case, 
6510: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
6520: 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c 69  ** call to [sqli
6530: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  te3changeset_nex
6540: 74 28 29 5d 20 6d 75 73 74 20 68 61 76 65 20 72  t()] must have r
6550: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 52  eturned SQLITE_R
6560: 4f 57 2e 20 0a 2a 2a 20 46 75 72 74 68 65 72 6d  OW. .** Furtherm
6570: 6f 72 65 2c 20 69 74 20 6d 61 79 20 6f 6e 6c 79  ore, it may only
6580: 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
6590: 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65  e type of change
65a0: 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
65b0: 6f 72 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  or.** currently 
65c0: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 65 69 74  points to is eit
65d0: 68 65 72 20 5b 53 51 4c 49 54 45 5f 55 50 44 41  her [SQLITE_UPDA
65e0: 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f 49  TE] or [SQLITE_I
65f0: 4e 53 45 52 54 5d 2e 20 4f 74 68 65 72 77 69 73  NSERT]. Otherwis
6600: 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  e,.** this funct
6610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51 4c  ion returns [SQL
6620: 49 54 45 5f 4d 49 53 55 53 45 5d 20 61 6e 64 20  ITE_MISUSE] and 
6630: 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f  sets *ppValue to
6640: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   NULL..**.** Arg
6650: 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74 20  ument iVal must 
6660: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
6670: 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 61  or equal to 0, a
6680: 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  nd less than the
6690: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f   number.** of co
66a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
66b0: 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74  le affected by t
66c0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
66d0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  e. Otherwise,.**
66e0: 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20   [SQLITE_RANGE] 
66f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
6700: 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65 74 20  *ppValue is set 
6710: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
6720: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
6730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
6740: 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f 69   *ppValue to poi
6750: 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74 65  nt to a protecte
6760: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c  d.** sqlite3_val
6770: 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  ue object contai
6780: 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74 68  ning the iVal'th
6790: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
67a0: 76 65 63 74 6f 72 20 6f 66 20 0a 2a 2a 20 6e 65  vector of .** ne
67b0: 77 20 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f  w row values sto
67c0: 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
67d0: 68 65 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53  he UPDATE or INS
67e0: 45 52 54 20 63 68 61 6e 67 65 20 61 6e 64 0a 2a  ERT change and.*
67f0: 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  * returns SQLITE
6800: 5f 4f 4b 2e 20 49 66 20 74 68 65 20 63 68 61 6e  _OK. If the chan
6810: 67 65 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  ge is an UPDATE 
6820: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  and does not inc
6830: 6c 75 64 65 0a 2a 2a 20 61 20 6e 65 77 20 76 61  lude.** a new va
6840: 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  lue for the requ
6850: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 2a 70  ested column, *p
6860: 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f  pValue is set to
6870: 20 4e 55 4c 4c 20 61 6e 64 20 0a 2a 2a 20 53 51   NULL and .** SQ
6880: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
6890: 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  . The name of th
68a0: 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 73  e function comes
68b0: 20 66 72 6f 6d 20 74 68 65 20 66 61 63 74 20 74   from the fact t
68c0: 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hat .** this is 
68d0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22  similar to the "
68e0: 6e 65 77 2e 2a 22 20 63 6f 6c 75 6d 6e 73 20 61  new.*" columns a
68f0: 76 61 69 6c 61 62 6c 65 20 74 6f 20 75 70 64 61  vailable to upda
6900: 74 65 20 6f 72 20 64 65 6c 65 74 65 20 0a 2a 2a  te or delete .**
6910: 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a   triggers..**.**
6920: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   If some other e
6930: 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67  rror occurs (e.g
6940: 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  . an OOM conditi
6950: 6f 6e 29 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  on), an SQLite e
6960: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
6970: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
6980: 56 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  Value is set to 
6990: 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  NULL..*/.int sql
69a0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
69b0: 77 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  w(.  sqlite3_cha
69c0: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74  ngeset_iter *pIt
69d0: 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65  er,  /* Changese
69e0: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
69f0: 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20  int iVal,       
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
6a20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
6a30: 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20  lue **ppValue   
6a40: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
6a50: 77 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c 4c  w value (or NULL
6a60: 20 70 6f 69 6e 74 65 72 29 20 2a 2f 0a 29 3b 0a   pointer) */.);.
6a70: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
6a80: 20 4f 62 74 61 69 6e 20 43 6f 6e 66 6c 69 63 74   Obtain Conflict
6a90: 69 6e 67 20 52 6f 77 20 56 61 6c 75 65 73 20 46  ing Row Values F
6aa0: 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74 20  rom A Changeset 
6ab0: 49 74 65 72 61 74 6f 72 0a 2a 2a 0a 2a 2a 20 54  Iterator.**.** T
6ac0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
6ad0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  uld only be used
6ae0: 20 77 69 74 68 20 69 74 65 72 61 74 6f 72 20 6f   with iterator o
6af0: 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 74 6f  bjects passed to
6b00: 20 61 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68   a.** conflict-h
6b10: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
6b20: 62 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67  by [sqlite3chang
6b30: 65 73 65 74 5f 61 70 70 6c 79 28 29 5d 20 77 69  eset_apply()] wi
6b40: 74 68 20 65 69 74 68 65 72 0a 2a 2a 20 5b 53 51  th either.** [SQ
6b50: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
6b60: 41 54 41 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ATA] or [SQLITE_
6b70: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
6b80: 43 54 5d 2e 20 49 66 20 74 68 69 73 20 66 75 6e  CT]. If this fun
6b90: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
6ba0: 65 64 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20  ed on any other 
6bb0: 69 74 65 72 61 74 6f 72 2c 20 5b 53 51 4c 49 54  iterator, [SQLIT
6bc0: 45 5f 4d 49 53 55 53 45 5d 20 69 73 20 72 65 74  E_MISUSE] is ret
6bd0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
6be0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
6bf0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  NULL..**.** Argu
6c00: 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74 20 62  ment iVal must b
6c10: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
6c20: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 61 6e  r equal to 0, an
6c30: 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  d less than the 
6c40: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c  number.** of col
6c50: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6c60: 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68  e affected by th
6c70: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65  e current change
6c80: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
6c90: 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d 20 69  [SQLITE_RANGE] i
6ca0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
6cb0: 70 70 56 61 6c 75 65 20 69 73 20 73 65 74 20 74  ppValue is set t
6cc0: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  o NULL..**.** If
6cd0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
6ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
6cf0: 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f 69 6e  *ppValue to poin
6d00: 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74 65 64  t to a protected
6d10: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
6d20: 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  e object contain
6d30: 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74 68 20  ing the iVal'th 
6d40: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 0a  value from the .
6d50: 2a 2a 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20  ** "conflicting 
6d60: 72 6f 77 22 20 61 73 73 6f 63 69 61 74 65 64 20  row" associated 
6d70: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
6d80: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
6d90: 72 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e  r callback.** an
6da0: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
6db0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 6f  _OK..**.** If so
6dc0: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  me other error o
6dd0: 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f  ccurs (e.g. an O
6de0: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20 61  OM condition), a
6df0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
6e00: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
6e10: 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 20  ed and *ppValue 
6e20: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
6e30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
6e40: 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69 63 74  angeset_conflict
6e50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
6e60: 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
6e70: 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74  r,  /* Changeset
6e80: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6e90: 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20  nt iVal,        
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6eb0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
6ec0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
6ed0: 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20 20  ue **ppValue    
6ee0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
6ef0: 75 65 20 66 72 6f 6d 20 63 6f 6e 66 6c 69 63 74  ue from conflict
6f00: 69 6e 67 20 72 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f  ing row */.);../
6f10: 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 44  *.** CAPI3REF: D
6f20: 65 74 65 72 6d 69 6e 65 20 54 68 65 20 4e 75 6d  etermine The Num
6f30: 62 65 72 20 4f 66 20 46 6f 72 65 69 67 6e 20 4b  ber Of Foreign K
6f40: 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 20 56 69  ey Constraint Vi
6f50: 6f 6c 61 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 54  olations.**.** T
6f60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
6f70: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
6f80: 77 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f 72  with an iterator
6f90: 20 70 61 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a   passed to an.**
6fa0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
6fb0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f  T_FOREIGN_KEY co
6fc0: 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63  nflict handler c
6fd0: 61 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  allback. In this
6fe0: 20 63 61 73 65 0a 2a 2a 20 69 74 20 73 65 74 73   case.** it sets
6ff0: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
7000: 61 62 6c 65 20 74 6f 20 74 68 65 20 74 6f 74 61  able to the tota
7010: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77  l number of know
7020: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a  n foreign key.**
7030: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74   violations in t
7040: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64  he destination d
7050: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
7060: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
7070: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65  *.** In all othe
7080: 72 20 63 61 73 65 73 20 74 68 69 73 20 66 75 6e  r cases this fun
7090: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
70a0: 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
70b0: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
70c0: 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74  eset_fk_conflict
70d0: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  s(.  sqlite3_cha
70e0: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74  ngeset_iter *pIt
70f0: 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65  er,  /* Changese
7100: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
7110: 69 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 20  int *pnOut      
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
7140: 66 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  f FK violations 
7150: 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41  */.);.../*.** CA
7160: 50 49 33 52 45 46 3a 20 46 69 6e 61 6c 69 7a 65  PI3REF: Finalize
7170: 20 41 20 43 68 61 6e 67 65 73 65 74 20 49 74 65   A Changeset Ite
7180: 72 61 74 6f 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rator.**.** This
7190: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
71a0: 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 6e  d to finalize an
71b0: 20 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61   iterator alloca
71c0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 5b 73 71 6c  ted with.** [sql
71d0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
71e0: 61 72 74 28 29 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  art()]..**.** Th
71f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7200: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7210: 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63  d on iterators c
7220: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
7230: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68 61 6e  .** [sqlite3chan
7240: 67 65 73 65 74 5f 73 74 61 72 74 28 29 5d 20 66  geset_start()] f
7250: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 61  unction. If an a
7260: 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73  pplication calls
7270: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
7280: 6e 20 77 69 74 68 20 61 6e 20 69 74 65 72 61 74  n with an iterat
7290: 6f 72 20 70 61 73 73 65 64 20 74 6f 20 61 20 63  or passed to a c
72a0: 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20  onflict-handler 
72b0: 62 79 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63 68  by.** [sqlite3ch
72c0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 5d  angeset_apply()]
72d0: 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  , [SQLITE_MISUSE
72e0: 5d 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  ] is immediately
72f0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
7300: 65 0a 2a 2a 20 63 61 6c 6c 20 68 61 73 20 6e 6f  e.** call has no
7310: 20 65 66 66 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49   effect..**.** I
7320: 66 20 61 6e 20 65 72 72 6f 72 20 77 61 73 20 65  f an error was e
7330: 6e 63 6f 75 6e 74 65 72 65 64 20 77 69 74 68 69  ncountered withi
7340: 6e 20 61 20 63 61 6c 6c 20 74 6f 20 61 6e 20 73  n a call to an s
7350: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7360: 78 78 78 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xxx().** functio
7370: 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 61  n (for example a
7380: 6e 20 5b 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  n [SQLITE_CORRUP
7390: 54 5d 20 69 6e 20 5b 73 71 6c 69 74 65 33 63 68  T] in [sqlite3ch
73a0: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20  angeset_next()] 
73b0: 6f 72 20 61 6e 20 0a 2a 2a 20 5b 53 51 4c 49 54  or an .** [SQLIT
73c0: 45 5f 4e 4f 4d 45 4d 5d 20 69 6e 20 5b 73 71 6c  E_NOMEM] in [sql
73d0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
73e0: 77 28 29 5d 29 20 74 68 65 6e 20 61 6e 20 65 72  w()]) then an er
73f0: 72 6f 72 20 63 6f 64 65 20 63 6f 72 72 65 73 70  ror code corresp
7400: 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 61  onding.** to tha
7410: 74 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  t error is retur
7420: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
7430: 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
7440: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
7450: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
7460: 69 73 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20  is to allow the 
7470: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65 72  following patter
7480: 6e 20 28 70 73 65 75 64 6f 2d 63 6f 64 65 29 3a  n (pseudo-code):
7490: 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  .**.**   sqlite3
74a0: 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
74b0: 29 3b 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 53  );.**   while( S
74c0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
74d0: 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74  e3changeset_next
74e0: 28 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  () ){.**     // 
74f0: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
7500: 68 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20 7d  h change..**   }
7510: 0a 2a 2a 20 20 20 72 63 20 3d 20 73 71 6c 69 74  .**   rc = sqlit
7520: 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e 61  e3changeset_fina
7530: 6c 69 7a 65 28 29 3b 0a 2a 2a 20 20 20 69 66 28  lize();.**   if(
7540: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7550: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 41 6e 20 65  {.**     // An e
7560: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
7570: 64 20 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 69 6e 74  d .**   }.*/.int
7580: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
7590: 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  t_finalize(sqlit
75a0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
75b0: 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a 0a 2a  r *pIter);../*.*
75c0: 2a 20 43 41 50 49 33 52 45 46 3a 20 49 6e 76 65  * CAPI3REF: Inve
75d0: 72 74 20 41 20 43 68 61 6e 67 65 73 65 74 0a 2a  rt A Changeset.*
75e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
75f0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 22 69  on is used to "i
7600: 6e 76 65 72 74 22 20 61 20 63 68 61 6e 67 65 73  nvert" a changes
7610: 65 74 20 6f 62 6a 65 63 74 2e 20 41 70 70 6c 79  et object. Apply
7620: 69 6e 67 20 61 6e 20 69 6e 76 65 72 74 65 64 0a  ing an inverted.
7630: 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20  ** changeset to 
7640: 61 20 64 61 74 61 62 61 73 65 20 72 65 76 65 72  a database rever
7650: 73 65 73 20 74 68 65 20 65 66 66 65 63 74 73 20  ses the effects 
7660: 6f 66 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20  of applying the 
7670: 75 6e 69 6e 76 65 72 74 65 64 0a 2a 2a 20 63 68  uninverted.** ch
7680: 61 6e 67 65 73 65 74 2e 20 53 70 65 63 69 66 69  angeset. Specifi
7690: 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c  cally:.**.** <ul
76a0: 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 45 61 63 68  >.**   <li> Each
76b0: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 20 69   DELETE change i
76c0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  s changed to an 
76d0: 49 4e 53 45 52 54 2c 20 61 6e 64 0a 2a 2a 20 20  INSERT, and.**  
76e0: 20 3c 6c 69 3e 20 45 61 63 68 20 49 4e 53 45 52   <li> Each INSER
76f0: 54 20 63 68 61 6e 67 65 20 69 73 20 63 68 61 6e  T change is chan
7700: 67 65 64 20 74 6f 20 61 20 44 45 4c 45 54 45 2c  ged to a DELETE,
7710: 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46   and.**   <li> F
7720: 6f 72 20 65 61 63 68 20 55 50 44 41 54 45 20 63  or each UPDATE c
7730: 68 61 6e 67 65 2c 20 74 68 65 20 6f 6c 64 2e 2a  hange, the old.*
7740: 20 61 6e 64 20 6e 65 77 2e 2a 20 76 61 6c 75 65   and new.* value
7750: 73 20 61 72 65 20 65 78 63 68 61 6e 67 65 64 2e  s are exchanged.
7760: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
7770: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
7780: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  es not change th
7790: 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
77a0: 20 63 68 61 6e 67 65 73 20 61 70 70 65 61 72 20   changes appear 
77b0: 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 63 68  within.** the ch
77c0: 61 6e 67 65 73 65 74 2e 20 49 74 20 6d 65 72 65  angeset. It mere
77d0: 6c 79 20 72 65 76 65 72 73 65 73 20 74 68 65 20  ly reverses the 
77e0: 73 65 6e 73 65 20 6f 66 20 65 61 63 68 20 69 6e  sense of each in
77f0: 64 69 76 69 64 75 61 6c 20 63 68 61 6e 67 65 2e  dividual change.
7800: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
7810: 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
7820: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
7830: 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 76 65 72  aining the inver
7840: 74 65 64 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a  ted changeset.**
7850: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
7860: 70 4f 75 74 2c 20 74 68 65 20 73 69 7a 65 20 6f  pOut, the size o
7870: 66 20 74 68 65 20 73 61 6d 65 20 62 75 66 66 65  f the same buffe
7880: 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  r is stored in *
7890: 70 6e 4f 75 74 2c 20 61 6e 64 0a 2a 2a 20 53 51  pnOut, and.** SQ
78a0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
78b0: 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
78c0: 20 6f 63 63 75 72 73 2c 20 62 6f 74 68 20 2a 70   occurs, both *p
78d0: 6e 4f 75 74 20 61 6e 64 20 2a 70 70 4f 75 74 20  nOut and *ppOut 
78e0: 61 72 65 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e  are.** zeroed an
78f0: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
7900: 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
7910: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
7920: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
7930: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
7940: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
7950: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 0a   sqlite3_free().
7960: 2a 2a 20 6f 6e 20 74 68 65 20 2a 70 70 4f 75 74  ** on the *ppOut
7970: 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 72 65 65   pointer to free
7980: 20 74 68 65 20 62 75 66 66 65 72 20 61 6c 6c 6f   the buffer allo
7990: 63 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67  cation following
79a0: 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 0a 2a   a successful .*
79b0: 2a 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  * call to this f
79c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
79d0: 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 54 68 69  ARNING/TODO: Thi
79e0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 75 72 72 65  s function curre
79f0: 6e 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ntly assumes tha
7a00: 74 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 61  t the input is a
7a10: 20 76 61 6c 69 64 0a 2a 2a 20 63 68 61 6e 67 65   valid.** change
7a20: 73 65 74 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  set. If it is no
7a30: 74 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  t, the results a
7a40: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  re undefined..*/
7a50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
7a60: 67 65 73 65 74 5f 69 6e 76 65 72 74 28 0a 20 20  geset_invert(.  
7a70: 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74 20 76  int nIn, const v
7a80: 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  oid *pIn,       
7a90: 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67 65 73  /* Input changes
7aa0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f  et */.  int *pnO
7ab0: 75 74 2c 20 76 6f 69 64 20 2a 2a 70 70 4f 75 74  ut, void **ppOut
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
7ad0: 49 6e 76 65 72 73 65 20 6f 66 20 69 6e 70 75 74  Inverse of input
7ae0: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41   */.);../*.** CA
7af0: 50 49 33 52 45 46 3a 20 43 6f 6e 63 61 74 65 6e  PI3REF: Concaten
7b00: 61 74 65 20 54 77 6f 20 43 68 61 6e 67 65 73 65  ate Two Changese
7b10: 74 20 4f 62 6a 65 63 74 73 0a 2a 2a 0a 2a 2a 20  t Objects.**.** 
7b20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7b30: 20 75 73 65 64 20 74 6f 20 63 6f 6e 63 61 74 65   used to concate
7b40: 6e 61 74 65 20 74 77 6f 20 63 68 61 6e 67 65 73  nate two changes
7b50: 65 74 73 2c 20 41 20 61 6e 64 20 42 2c 20 69 6e  ets, A and B, in
7b60: 74 6f 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  to a .** single 
7b70: 63 68 61 6e 67 65 73 65 74 2e 20 54 68 65 20 72  changeset. The r
7b80: 65 73 75 6c 74 20 69 73 20 61 20 63 68 61 6e 67  esult is a chang
7b90: 65 73 65 74 20 65 71 75 69 76 61 6c 65 6e 74 20  eset equivalent 
7ba0: 74 6f 20 61 70 70 6c 79 69 6e 67 0a 2a 2a 20 63  to applying.** c
7bb0: 68 61 6e 67 65 73 65 74 20 41 20 66 6f 6c 6c 6f  hangeset A follo
7bc0: 77 65 64 20 62 79 20 63 68 61 6e 67 65 73 65 74  wed by changeset
7bd0: 20 42 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   B. .**.** This 
7be0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 62 69 6e 65  function combine
7bf0: 73 20 74 68 65 20 74 77 6f 20 69 6e 70 75 74 20  s the two input 
7c00: 63 68 61 6e 67 65 73 65 74 73 20 75 73 69 6e 67  changesets using
7c10: 20 61 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   an .** sqlite3_
7c20: 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65  changegroup obje
7c30: 63 74 2e 20 43 61 6c 6c 69 6e 67 20 69 74 20 70  ct. Calling it p
7c40: 72 6f 64 75 63 65 73 20 73 69 6d 69 6c 61 72 20  roduces similar 
7c50: 72 65 73 75 6c 74 73 20 61 73 20 74 68 65 0a 2a  results as the.*
7c60: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  * following code
7c70: 20 66 72 61 67 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a   fragment:.**.**
7c80: 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67     sqlite3_chang
7c90: 65 67 72 6f 75 70 20 2a 70 47 72 70 3b 0a 2a 2a  egroup *pGrp;.**
7ca0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7cb0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28  changegroup_new(
7cc0: 26 70 47 72 70 29 3b 0a 2a 2a 20 20 20 69 66 28  &pGrp);.**   if(
7cd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7ce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
7cf0: 6e 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47 72  ngegroup_add(pGr
7d00: 70 2c 20 6e 41 2c 20 70 41 29 3b 0a 2a 2a 20 20  p, nA, pA);.**  
7d10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7d20: 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65  OK ) rc = sqlite
7d30: 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64  3changegroup_add
7d40: 28 70 47 72 70 2c 20 6e 42 2c 20 70 42 29 3b 0a  (pGrp, nB, pB);.
7d50: 2a 2a 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  **   if( rc==SQL
7d60: 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20 20 20 20  ITE_OK ){.**    
7d70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
7d80: 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28  ngegroup_output(
7d90: 70 47 72 70 2c 20 70 6e 4f 75 74 2c 20 70 70 4f  pGrp, pnOut, ppO
7da0: 75 74 29 3b 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b  ut);.**   }else{
7db0: 0a 2a 2a 20 20 20 20 20 2a 70 70 4f 75 74 20 3d  .**     *ppOut =
7dc0: 20 30 3b 0a 2a 2a 20 20 20 20 20 2a 70 6e 4f 75   0;.**     *pnOu
7dd0: 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  t = 0;.**   }.**
7de0: 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74 68 65  .** Refer to the
7df0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
7e00: 72 6f 75 70 20 64 6f 63 75 6d 65 6e 74 61 74 69  roup documentati
7e10: 6f 6e 20 62 65 6c 6f 77 20 66 6f 72 20 64 65 74  on below for det
7e20: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
7e30: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
7e40: 6e 63 61 74 28 0a 20 20 69 6e 74 20 6e 41 2c 20  ncat(.  int nA, 
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
7e80: 66 66 65 72 20 70 41 20 2a 2f 0a 20 20 76 6f 69  ffer pA */.  voi
7e90: 64 20 2a 70 41 2c 20 20 20 20 20 20 20 20 20 20  d *pA,          
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7eb0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
7ec0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61  r containing cha
7ed0: 6e 67 65 73 65 74 20 41 20 2a 2f 0a 20 20 69 6e  ngeset A */.  in
7ee0: 74 20 6e 42 2c 20 20 20 20 20 20 20 20 20 20 20  t nB,           
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7f10: 20 69 6e 20 62 75 66 66 65 72 20 70 42 20 2a 2f   in buffer pB */
7f20: 0a 20 20 76 6f 69 64 20 2a 70 42 2c 20 20 20 20  .  void *pB,    
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7f50: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
7f60: 6e 67 20 63 68 61 6e 67 65 73 65 74 20 42 20 2a  ng changeset B *
7f70: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20  /.  int *pnOut, 
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
7fa0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6f  er of bytes in o
7fb0: 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74 20  utput changeset 
7fc0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4f 75  */.  void **ppOu
7fd0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
7fe0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66       /* OUT: Buf
7ff0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f  fer containing o
8000: 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74 20  utput changeset 
8010: 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  */.);.../*.** Ch
8020: 61 6e 67 65 67 72 6f 75 70 20 68 61 6e 64 6c 65  angegroup handle
8030: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
8040: 75 63 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  uct sqlite3_chan
8050: 67 65 67 72 6f 75 70 20 73 71 6c 69 74 65 33 5f  gegroup sqlite3_
8060: 63 68 61 6e 67 65 67 72 6f 75 70 3b 0a 0a 2f 2a  changegroup;../*
8070: 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f  .** CAPI3REF: Co
8080: 6d 62 69 6e 65 20 74 77 6f 20 6f 72 20 6d 6f 72  mbine two or mor
8090: 65 20 63 68 61 6e 67 65 73 65 74 73 20 69 6e 74  e changesets int
80a0: 6f 20 61 20 73 69 6e 67 6c 65 20 63 68 61 6e 67  o a single chang
80b0: 65 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 73  eset..**.** An s
80c0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
80d0: 75 70 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  up object is use
80e0: 64 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 77 6f  d to combine two
80f0: 20 6f 72 20 6d 6f 72 65 20 63 68 61 6e 67 65 73   or more changes
8100: 65 74 73 0a 2a 2a 20 28 6f 72 20 70 61 74 63 68  ets.** (or patch
8110: 73 65 74 73 29 20 69 6e 74 6f 20 61 20 73 69 6e  sets) into a sin
8120: 67 6c 65 20 63 68 61 6e 67 65 73 65 74 20 28 6f  gle changeset (o
8130: 72 20 70 61 74 63 68 73 65 74 29 2e 20 41 20 73  r patchset). A s
8140: 69 6e 67 6c 65 20 63 68 61 6e 67 65 67 72 6f 75  ingle changegrou
8150: 70 0a 2a 2a 20 6f 62 6a 65 63 74 20 6d 61 79 20  p.** object may 
8160: 63 6f 6d 62 69 6e 65 20 63 68 61 6e 67 65 73 65  combine changese
8170: 74 73 20 6f 72 20 70 61 74 63 68 73 65 74 73 2c  ts or patchsets,
8180: 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 54   but not both. T
8190: 68 65 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20  he output is.** 
81a0: 61 6c 77 61 79 73 20 69 6e 20 74 68 65 20 73 61  always in the sa
81b0: 6d 65 20 66 6f 72 6d 61 74 20 61 73 20 74 68 65  me format as the
81c0: 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   input..**.** If
81d0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
81e0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
81f0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  ns SQLITE_OK and
8200: 20 70 6f 70 75 6c 61 74 65 73 20 28 2a 70 70 29   populates (*pp)
8210: 20 77 69 74 68 0a 2a 2a 20 61 20 70 6f 69 6e 74   with.** a point
8220: 65 72 20 74 6f 20 61 20 6e 65 77 20 73 71 6c 69  er to a new sqli
8230: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20  te3_changegroup 
8240: 6f 62 6a 65 63 74 20 62 65 66 6f 72 65 20 72 65  object before re
8250: 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 63 61 6c  turning. The cal
8260: 6c 65 72 0a 2a 2a 20 73 68 6f 75 6c 64 20 65 76  ler.** should ev
8270: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
8280: 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
8290: 74 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  t using a call t
82a0: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68 61  o .** sqlite3cha
82b0: 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28  ngegroup_delete(
82c0: 29 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ). If an error o
82d0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
82e0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 28   error code.** (
82f0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  i.e. SQLITE_NOME
8300: 4d 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  M) is returned a
8310: 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
8320: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
8330: 20 75 73 75 61 6c 20 75 73 61 67 65 20 70 61 74   usual usage pat
8340: 74 65 72 6e 20 66 6f 72 20 61 6e 20 73 71 6c 69  tern for an sqli
8350: 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20  te3_changegroup 
8360: 6f 62 6a 65 63 74 20 69 73 20 61 73 20 66 6f 6c  object is as fol
8370: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e  lows:.**.** <ul>
8380: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 49 74 20 69 73  .**   <li> It is
8390: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 61   created using a
83a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
83b0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28  changegroup_new(
83c0: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20  )..**.**   <li> 
83d0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61  Zero or more cha
83e0: 6e 67 65 73 65 74 73 20 28 6f 72 20 70 61 74 63  ngesets (or patc
83f0: 68 73 65 74 73 29 20 61 72 65 20 61 64 64 65 64  hsets) are added
8400: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   to the object.*
8410: 2a 20 20 20 20 20 20 20 20 62 79 20 63 61 6c 6c  *        by call
8420: 69 6e 67 20 73 71 6c 69 74 65 33 63 68 61 6e 67  ing sqlite3chang
8430: 65 67 72 6f 75 70 5f 61 64 64 28 29 2e 0a 2a 2a  egroup_add()..**
8440: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 72  .**   <li> The r
8450: 65 73 75 6c 74 20 6f 66 20 63 6f 6d 62 69 6e 69  esult of combini
8460: 6e 67 20 61 6c 6c 20 69 6e 70 75 74 20 63 68 61  ng all input cha
8470: 6e 67 65 73 65 74 73 20 74 6f 67 65 74 68 65 72  ngesets together
8480: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 0a 2a 2a   is obtained .**
8490: 20 20 20 20 20 20 20 20 62 79 20 74 68 65 20 61          by the a
84a0: 70 70 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61  pplication via a
84b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
84c0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70  changegroup_outp
84d0: 75 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c  ut()..**.**   <l
84e0: 69 3e 20 54 68 65 20 6f 62 6a 65 63 74 20 69 73  i> The object is
84f0: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 61   deleted using a
8500: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8510: 63 68 61 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65  changegroup_dele
8520: 74 65 28 29 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  te()..** </ul>.*
8530: 2a 0a 2a 2a 20 41 6e 79 20 6e 75 6d 62 65 72 20  *.** Any number 
8540: 6f 66 20 63 61 6c 6c 73 20 74 6f 20 61 64 64 28  of calls to add(
8550: 29 20 61 6e 64 20 6f 75 74 70 75 74 28 29 20 6d  ) and output() m
8560: 61 79 20 62 65 20 6d 61 64 65 20 62 65 74 77 65  ay be made betwe
8570: 65 6e 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 0a  en the calls to.
8580: 2a 2a 20 6e 65 77 28 29 20 61 6e 64 20 64 65 6c  ** new() and del
8590: 65 74 65 28 29 2c 20 61 6e 64 20 69 6e 20 61 6e  ete(), and in an
85a0: 79 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  y order..**.** A
85b0: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65  s well as the re
85c0: 67 75 6c 61 72 20 73 71 6c 69 74 65 33 63 68 61  gular sqlite3cha
85d0: 6e 67 65 67 72 6f 75 70 5f 61 64 64 28 29 20 61  ngegroup_add() a
85e0: 6e 64 20 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  nd .** sqlite3ch
85f0: 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74  angegroup_output
8600: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c  () functions, al
8610: 73 6f 20 61 76 61 69 6c 61 62 6c 65 20 61 72 65  so available are
8620: 20 74 68 65 20 73 74 72 65 61 6d 69 6e 67 0a 2a   the streaming.*
8630: 2a 20 76 65 72 73 69 6f 6e 73 20 73 71 6c 69 74  * versions sqlit
8640: 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
8650: 64 5f 73 74 72 6d 28 29 20 61 6e 64 20 73 71 6c  d_strm() and sql
8660: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
8670: 6f 75 74 70 75 74 5f 73 74 72 6d 28 29 2e 0a 2a  output_strm()..*
8680: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
8690: 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28 73 71 6c  ngegroup_new(sql
86a0: 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
86b0: 20 2a 2a 70 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41   **pp);../*.** A
86c0: 64 64 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 77  dd all changes w
86d0: 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ithin the change
86e0: 73 65 74 20 28 6f 72 20 70 61 74 63 68 73 65 74  set (or patchset
86f0: 29 20 69 6e 20 62 75 66 66 65 72 20 70 44 61 74  ) in buffer pDat
8700: 61 20 28 73 69 7a 65 0a 2a 2a 20 6e 44 61 74 61  a (size.** nData
8710: 20 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 63   bytes) to the c
8720: 68 61 6e 67 65 67 72 6f 75 70 2e 20 0a 2a 2a 0a  hangegroup. .**.
8730: 2a 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  ** If the buffer
8740: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 74 63   contains a patc
8750: 68 73 65 74 2c 20 74 68 65 6e 20 61 6c 6c 20 70  hset, then all p
8760: 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 74 68  rior calls to th
8770: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f  is function.** o
8780: 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e 67  n the same chang
8790: 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20 6d 75  egroup object mu
87a0: 73 74 20 61 6c 73 6f 20 68 61 76 65 20 73 70 65  st also have spe
87b0: 63 69 66 69 65 64 20 70 61 74 63 68 73 65 74 73  cified patchsets
87c0: 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 20  . Or, if.** the 
87d0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 73 20  buffer contains 
87e0: 61 20 63 68 61 6e 67 65 73 65 74 2c 20 73 6f 20  a changeset, so 
87f0: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 65 61  must have the ea
8800: 72 6c 69 65 72 20 63 61 6c 6c 73 20 74 6f 20 74  rlier calls to t
8810: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
8820: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
8830: 54 45 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  TE_ERROR is retu
8840: 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e  rned and no chan
8850: 67 65 73 20 61 72 65 20 61 64 64 65 64 0a 2a 2a  ges are added.**
8860: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72   to the changegr
8870: 6f 75 70 2e 0a 2a 2a 0a 2a 2a 20 52 6f 77 73 20  oup..**.** Rows 
8880: 77 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67  within the chang
8890: 65 73 65 74 20 61 6e 64 20 63 68 61 6e 67 65 67  eset and changeg
88a0: 72 6f 75 70 20 61 72 65 20 69 64 65 6e 74 69 66  roup are identif
88b0: 69 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65  ied by the value
88c0: 73 20 69 6e 0a 2a 2a 20 74 68 65 69 72 20 50 52  s in.** their PR
88d0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
88e0: 73 2e 20 41 20 63 68 61 6e 67 65 20 69 6e 20 74  s. A change in t
88f0: 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 20  he changeset is 
8900: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 0a 2a 2a  considered to.**
8910: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 73 61   apply to the sa
8920: 6d 65 20 72 6f 77 20 61 73 20 61 20 63 68 61 6e  me row as a chan
8930: 67 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  ge already prese
8940: 6e 74 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  nt in the change
8950: 67 72 6f 75 70 20 69 66 0a 2a 2a 20 74 68 65 20  group if.** the 
8960: 74 77 6f 20 72 6f 77 73 20 68 61 76 65 20 74 68  two rows have th
8970: 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20 6b  e same primary k
8980: 65 79 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  ey..**.** Change
8990: 73 20 74 6f 20 72 6f 77 73 20 74 68 61 74 20 74  s to rows that t
89a0: 68 61 74 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61  hat do not alrea
89b0: 64 79 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  dy appear in the
89c0: 20 63 68 61 6e 67 65 67 72 6f 75 70 20 61 72 65   changegroup are
89d0: 0a 2a 2a 20 73 69 6d 70 6c 79 20 63 6f 70 69 65  .** simply copie
89e0: 64 20 69 6e 74 6f 20 69 74 2e 20 4f 72 2c 20 69  d into it. Or, i
89f0: 66 20 62 6f 74 68 20 74 68 65 20 6e 65 77 20 63  f both the new c
8a00: 68 61 6e 67 65 73 65 74 20 61 6e 64 20 74 68 65  hangeset and the
8a10: 20 63 68 61 6e 67 65 67 72 6f 75 70 0a 2a 2a 20   changegroup.** 
8a20: 63 6f 6e 74 61 69 6e 20 63 68 61 6e 67 65 73 20  contain changes 
8a30: 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20 61 20  that apply to a 
8a40: 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 20  single row, the 
8a50: 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  final contents o
8a60: 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 67  f the.** changeg
8a70: 72 6f 75 70 20 64 65 70 65 6e 64 73 20 6f 6e 20  roup depends on 
8a80: 74 68 65 20 74 79 70 65 20 6f 66 20 65 61 63 68  the type of each
8a90: 20 63 68 61 6e 67 65 2c 20 61 73 20 66 6f 6c 6c   change, as foll
8aa0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 3c 74 61 62 6c  ows:.**.** <tabl
8ab0: 65 20 62 6f 72 64 65 72 3d 31 20 73 74 79 6c 65  e border=1 style
8ac0: 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 38 65  ="margin-left:8e
8ad0: 78 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74 3a 38  x;margin-right:8
8ae0: 65 78 22 3e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  ex">.**   <tr><t
8af0: 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73  h style="white-s
8b00: 70 61 63 65 3a 70 72 65 22 3e 45 78 69 73 74 69  pace:pre">Existi
8b10: 6e 67 20 43 68 61 6e 67 65 20 20 3c 2f 74 68 3e  ng Change  </th>
8b20: 0a 2a 2a 20 20 20 20 20 20 20 3c 74 68 20 73 74  .**       <th st
8b30: 79 6c 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65  yle="white-space
8b40: 3a 70 72 65 22 3e 4e 65 77 20 43 68 61 6e 67 65  :pre">New Change
8b50: 20 20 20 20 20 20 20 3c 2f 74 68 3e 0a 2a 2a 20         </th>.** 
8b60: 20 20 20 20 20 20 3c 74 68 3e 4f 75 74 70 75 74        <th>Output
8b70: 20 43 68 61 6e 67 65 0a 2a 2a 20 20 20 3c 74 72   Change.**   <tr
8b80: 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e  ><td>INSERT <td>
8b90: 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20  INSERT <td>.**  
8ba0: 20 20 20 20 20 54 68 65 20 6e 65 77 20 63 68 61       The new cha
8bb0: 6e 67 65 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  nge is ignored. 
8bc0: 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e  This case does n
8bd0: 6f 74 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ot occur if the 
8be0: 6e 65 77 0a 2a 2a 20 20 20 20 20 20 20 63 68 61  new.**       cha
8bf0: 6e 67 65 73 65 74 20 77 61 73 20 72 65 63 6f 72  ngeset was recor
8c00: 64 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ded immediately 
8c10: 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
8c20: 73 65 74 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  sets already.** 
8c30: 20 20 20 20 20 20 61 64 64 65 64 20 74 6f 20 74        added to t
8c40: 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a  he changegroup..
8c50: 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49 4e 53  **   <tr><td>INS
8c60: 45 52 54 20 3c 74 64 3e 55 50 44 41 54 45 20 3c  ERT <td>UPDATE <
8c70: 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  td>.**       The
8c80: 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 72   INSERT change r
8c90: 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 63 68  emains in the ch
8ca0: 61 6e 67 65 67 72 6f 75 70 2e 20 54 68 65 20 76  angegroup. The v
8cb0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 0a 2a 2a  alues in the .**
8cc0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 63 68         INSERT ch
8cd0: 61 6e 67 65 20 61 72 65 20 6d 6f 64 69 66 69 65  ange are modifie
8ce0: 64 20 61 73 20 69 66 20 74 68 65 20 72 6f 77 20  d as if the row 
8cf0: 77 61 73 20 69 6e 73 65 72 74 65 64 20 62 79 20  was inserted by 
8d00: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 69  the.**       exi
8d10: 73 74 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64  sting change and
8d20: 20 74 68 65 6e 20 75 70 64 61 74 65 64 20 61 63   then updated ac
8d30: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  cording to the n
8d40: 65 77 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 20 20  ew change..**   
8d50: 3c 74 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c  <tr><td>INSERT <
8d60: 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a  td>DELETE <td>.*
8d70: 2a 20 20 20 20 20 20 20 54 68 65 20 65 78 69 73  *       The exis
8d80: 74 69 6e 67 20 49 4e 53 45 52 54 20 69 73 20 72  ting INSERT is r
8d90: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
8da0: 63 68 61 6e 67 65 67 72 6f 75 70 2e 20 54 68 65  changegroup. The
8db0: 20 44 45 4c 45 54 45 20 69 73 0a 2a 2a 20 20 20   DELETE is.**   
8dc0: 20 20 20 20 6e 6f 74 20 61 64 64 65 64 2e 0a 2a      not added..*
8dd0: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41  *   <tr><td>UPDA
8de0: 54 45 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74  TE <td>INSERT <t
8df0: 64 3e 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  d>.**       The 
8e00: 6e 65 77 20 63 68 61 6e 67 65 20 69 73 20 69 67  new change is ig
8e10: 6e 6f 72 65 64 2e 20 54 68 69 73 20 63 61 73 65  nored. This case
8e20: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
8e30: 69 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20  if the new.**   
8e40: 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 77 61      changeset wa
8e50: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
8e60: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
8e70: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65   changesets alre
8e80: 61 64 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64  ady.**       add
8e90: 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65  ed to the change
8ea0: 67 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e  group..**   <tr>
8eb0: 3c 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 55  <td>UPDATE <td>U
8ec0: 50 44 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20  PDATE <td>.**   
8ed0: 20 20 20 20 54 68 65 20 65 78 69 73 74 69 6e 67      The existing
8ee0: 20 55 50 44 41 54 45 20 72 65 6d 61 69 6e 73 20   UPDATE remains 
8ef0: 77 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67  within the chang
8f00: 65 67 72 6f 75 70 2e 20 49 74 20 69 73 20 61 6d  egroup. It is am
8f10: 65 6e 64 65 64 20 0a 2a 2a 20 20 20 20 20 20 20  ended .**       
8f20: 73 6f 20 74 68 61 74 20 74 68 65 20 61 63 63 6f  so that the acco
8f30: 6d 70 61 6e 79 69 6e 67 20 76 61 6c 75 65 73 20  mpanying values 
8f40: 61 72 65 20 61 73 20 69 66 20 74 68 65 20 72 6f  are as if the ro
8f50: 77 20 77 61 73 20 75 70 64 61 74 65 64 20 6f 6e  w was updated on
8f60: 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 62 79 20  ce .**       by 
8f70: 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 68 61  the existing cha
8f80: 6e 67 65 20 61 6e 64 20 74 68 65 6e 20 61 67 61  nge and then aga
8f90: 69 6e 20 62 79 20 74 68 65 20 6e 65 77 20 63 68  in by the new ch
8fa0: 61 6e 67 65 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c  ange..**   <tr><
8fb0: 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 44 45  td>UPDATE <td>DE
8fc0: 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20  LETE <td>.**    
8fd0: 20 20 20 54 68 65 20 65 78 69 73 74 69 6e 67 20     The existing 
8fe0: 55 50 44 41 54 45 20 69 73 20 72 65 70 6c 61 63  UPDATE is replac
8ff0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 44 45  ed by the new DE
9000: 4c 45 54 45 20 77 69 74 68 69 6e 20 74 68 65 0a  LETE within the.
9010: 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 67  **       changeg
9020: 72 6f 75 70 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c  roup..**   <tr><
9030: 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 49 4e  td>DELETE <td>IN
9040: 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20 20 20 20  SERT <td>.**    
9050: 20 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72     If one or mor
9060: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
9070: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72 6f  values in the ro
9080: 77 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  w inserted by th
9090: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 65 77 20 63  e.**       new c
90a0: 68 61 6e 67 65 20 64 69 66 66 65 72 20 66 72 6f  hange differ fro
90b0: 6d 20 74 68 6f 73 65 20 69 6e 20 74 68 65 20 72  m those in the r
90c0: 6f 77 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ow deleted by th
90d0: 65 20 65 78 69 73 74 69 6e 67 20 0a 2a 2a 20 20  e existing .**  
90e0: 20 20 20 20 20 63 68 61 6e 67 65 2c 20 74 68 65       change, the
90f0: 20 65 78 69 73 74 69 6e 67 20 44 45 4c 45 54 45   existing DELETE
9100: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
9110: 61 6e 20 55 50 44 41 54 45 20 77 69 74 68 69 6e  an UPDATE within
9120: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 63 68   the.**       ch
9130: 61 6e 67 65 67 72 6f 75 70 2e 20 4f 74 68 65 72  angegroup. Other
9140: 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 6e 73  wise, if the ins
9150: 65 72 74 65 64 20 72 6f 77 20 69 73 20 65 78 61  erted row is exa
9160: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ctly the same .*
9170: 2a 20 20 20 20 20 20 20 61 73 20 74 68 65 20 64  *       as the d
9180: 65 6c 65 74 65 64 20 72 6f 77 2c 20 74 68 65 20  eleted row, the 
9190: 65 78 69 73 74 69 6e 67 20 44 45 4c 45 54 45 20  existing DELETE 
91a0: 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63 61 72  is simply discar
91b0: 64 65 64 2e 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  ded..**   <tr><t
91c0: 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 55 50 44  d>DELETE <td>UPD
91d0: 41 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20  ATE <td>.**     
91e0: 20 20 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65    The new change
91f0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 54 68 69   is ignored. Thi
9200: 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  s case does not 
9210: 6f 63 63 75 72 20 69 66 20 74 68 65 20 6e 65 77  occur if the new
9220: 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65  .**       change
9230: 73 65 74 20 77 61 73 20 72 65 63 6f 72 64 65 64  set was recorded
9240: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
9250: 65 72 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  er the changeset
9260: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  s already.**    
9270: 20 20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20     added to the 
9280: 63 68 61 6e 67 65 67 72 6f 75 70 2e 0a 2a 2a 20  changegroup..** 
9290: 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45    <tr><td>DELETE
92a0: 20 3c 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e   <td>DELETE <td>
92b0: 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6e 65  .**       The ne
92c0: 77 20 63 68 61 6e 67 65 20 69 73 20 69 67 6e 6f  w change is igno
92d0: 72 65 64 2e 20 54 68 69 73 20 63 61 73 65 20 64  red. This case d
92e0: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 69 66  oes not occur if
92f0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 20 20 20 20   the new.**     
9300: 20 20 63 68 61 6e 67 65 73 65 74 20 77 61 73 20    changeset was 
9310: 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64 69 61  recorded immedia
9320: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 63  tely after the c
9330: 68 61 6e 67 65 73 65 74 73 20 61 6c 72 65 61 64  hangesets alread
9340: 79 0a 2a 2a 20 20 20 20 20 20 20 61 64 64 65 64  y.**       added
9350: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72   to the changegr
9360: 6f 75 70 2e 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e  oup..** </table>
9370: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 65  .**.** If the ne
9380: 77 20 63 68 61 6e 67 65 73 65 74 20 63 6f 6e 74  w changeset cont
9390: 61 69 6e 73 20 63 68 61 6e 67 65 73 20 74 6f 20  ains changes to 
93a0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  a table that is 
93b0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
93c0: 2a 2a 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ** in the change
93d0: 67 72 6f 75 70 2c 20 74 68 65 6e 20 74 68 65 20  group, then the 
93e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
93f0: 73 20 61 6e 64 20 74 68 65 20 70 6f 73 69 74 69  s and the positi
9400: 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 69  on of the.** pri
9410: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
9420: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
9430: 75 73 74 20 62 65 20 63 6f 6e 73 69 73 74 65 6e  ust be consisten
9440: 74 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  t. If this is no
9450: 74 20 74 68 65 0a 2a 2a 20 63 61 73 65 2c 20 74  t the.** case, t
9460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 61 69  his function fai
9470: 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53  ls with SQLITE_S
9480: 43 48 45 4d 41 2e 20 49 66 20 74 68 65 20 69 6e  CHEMA. If the in
9490: 70 75 74 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a  put changeset.**
94a0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
94b0: 6f 72 72 75 70 74 20 61 6e 64 20 74 68 65 20 63  orrupt and the c
94c0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
94d0: 65 63 74 65 64 2c 20 53 51 4c 49 54 45 5f 43 4f  ected, SQLITE_CO
94e0: 52 52 55 50 54 20 69 73 0a 2a 2a 20 72 65 74 75  RRUPT is.** retu
94f0: 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rned. Or, if an 
9500: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
9510: 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ndition occurs d
9520: 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67  uring processing
9530: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
9540: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
9550: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 61 6c 6c 20  E_NOMEM. In all 
9560: 63 61 73 65 73 2c 20 69 66 20 61 6e 20 65 72 72  cases, if an err
9570: 6f 72 20 6f 63 63 75 72 73 20 74 68 65 0a 2a 2a  or occurs the.**
9580: 20 66 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 73 20   final contents 
9590: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  of the changegro
95a0: 75 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  up is undefined.
95b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
95c0: 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
95d0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
95e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
95f0: 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 28  changegroup_add(
9600: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
9610: 6f 75 70 2a 2c 20 69 6e 74 20 6e 44 61 74 61 2c  oup*, int nData,
9620: 20 76 6f 69 64 20 2a 70 44 61 74 61 29 3b 0a 0a   void *pData);..
9630: 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 62  /*.** Obtain a b
9640: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
9650: 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72   a changeset (or
9660: 20 70 61 74 63 68 73 65 74 29 20 72 65 70 72 65   patchset) repre
9670: 73 65 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  senting the.** c
9680: 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
9690: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f  of the changegro
96a0: 75 70 2e 20 49 66 20 74 68 65 20 69 6e 70 75 74  up. If the input
96b0: 73 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  s to the changeg
96c0: 72 6f 75 70 0a 2a 2a 20 77 65 72 65 20 74 68 65  roup.** were the
96d0: 6d 73 65 6c 76 65 73 20 63 68 61 6e 67 65 73 65  mselves changese
96e0: 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20 69  ts, the output i
96f0: 73 20 61 20 63 68 61 6e 67 65 73 65 74 2e 20 4f  s a changeset. O
9700: 72 2c 20 69 66 20 74 68 65 0a 2a 2a 20 69 6e 70  r, if the.** inp
9710: 75 74 73 20 77 65 72 65 20 70 61 74 63 68 73 65  uts were patchse
9720: 74 73 2c 20 74 68 65 20 6f 75 74 70 75 74 20 69  ts, the output i
9730: 73 20 61 6c 73 6f 20 61 20 70 61 74 63 68 73 65  s also a patchse
9740: 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 69 74 68  t..**.** As with
9750: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
9760: 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  he sqlite3sessio
9770: 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 20 61 6e  n_changeset() an
9780: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 73 65 73 73  d.** sqlite3sess
9790: 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 29 20 66  ion_patchset() f
97a0: 75 6e 63 74 69 6f 6e 73 2c 20 61 6c 6c 20 63 68  unctions, all ch
97b0: 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f  anges related to
97c0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 74 61 62   a single.** tab
97d0: 6c 65 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  le are grouped t
97e0: 6f 67 65 74 68 65 72 20 69 6e 20 74 68 65 20 6f  ogether in the o
97f0: 75 74 70 75 74 20 6f 66 20 74 68 69 73 20 66 75  utput of this fu
9800: 6e 63 74 69 6f 6e 2e 20 54 61 62 6c 65 73 20 61  nction. Tables a
9810: 70 70 65 61 72 0a 2a 2a 20 69 6e 20 74 68 65 20  ppear.** in the 
9820: 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 66 6f  same order as fo
9830: 72 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  r the very first
9840: 20 63 68 61 6e 67 65 73 65 74 20 61 64 64 65 64   changeset added
9850: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67 72   to the changegr
9860: 6f 75 70 2e 0a 2a 2a 20 49 66 20 74 68 65 20 73  oup..** If the s
9870: 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
9880: 65 6e 74 20 63 68 61 6e 67 65 73 65 74 73 20 61  ent changesets a
9890: 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61 6e  dded to the chan
98a0: 67 65 67 72 6f 75 70 20 63 6f 6e 74 61 69 6e 0a  gegroup contain.
98b0: 2a 2a 20 63 68 61 6e 67 65 73 20 66 6f 72 20 74  ** changes for t
98c0: 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  ables that do no
98d0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
98e0: 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 2c  first changeset,
98f0: 20 74 68 65 79 20 61 72 65 0a 2a 2a 20 61 70 70   they are.** app
9900: 65 6e 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  ended onto the e
9910: 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  nd of the output
9920: 20 63 68 61 6e 67 65 73 65 74 2c 20 61 67 61 69   changeset, agai
9930: 6e 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  n in the order i
9940: 6e 0a 2a 2a 20 77 68 69 63 68 20 74 68 65 79 20  n.** which they 
9950: 61 72 65 20 66 69 72 73 74 20 65 6e 63 6f 75 6e  are first encoun
9960: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
9970: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9980: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
9990: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
99a0: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
99b0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 28 2a  .** variables (*
99c0: 70 6e 44 61 74 61 29 20 61 6e 64 20 28 2a 70 70  pnData) and (*pp
99d0: 44 61 74 61 29 20 61 72 65 20 73 65 74 20 74 6f  Data) are set to
99e0: 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53   0. Otherwise, S
99f0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
9a00: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
9a10: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
9a20: 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20   are set to the 
9a30: 73 69 7a 65 20 6f 66 20 61 6e 64 20 61 20 0a 2a  size of and a .*
9a40: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
9a50: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
9a60: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 49 6e  respectively. In
9a70: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
9a80: 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69   the.** responsi
9a90: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
9aa0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
9ab0: 6c 79 20 66 72 65 65 20 74 68 65 20 62 75 66 66  ly free the buff
9ac0: 65 72 20 75 73 69 6e 67 20 61 0a 2a 2a 20 63 61  er using a.** ca
9ad0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  ll to sqlite3_fr
9ae0: 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
9af0: 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
9b00: 6f 75 74 70 75 74 28 0a 20 20 73 71 6c 69 74 65  output(.  sqlite
9b10: 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 2c 0a  3_changegroup*,.
9b20: 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 2c 20 20    int *pnData,  
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
9b50: 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
9b60: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f  in bytes */.  vo
9b70: 69 64 20 2a 2a 70 70 44 61 74 61 20 20 20 20 20  id **ppData     
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b90: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
9ba0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
9bb0: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  /.);../*.** Dele
9bc0: 74 65 20 61 20 63 68 61 6e 67 65 67 72 6f 75 70  te a changegroup
9bd0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
9be0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
9bf0: 6f 75 70 5f 64 65 6c 65 74 65 28 73 71 6c 69 74  oup_delete(sqlit
9c00: 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 29  e3_changegroup*)
9c10: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
9c20: 46 3a 20 41 70 70 6c 79 20 41 20 43 68 61 6e 67  F: Apply A Chang
9c30: 65 73 65 74 20 54 6f 20 41 20 44 61 74 61 62 61  eset To A Databa
9c40: 73 65 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  se.**.** Apply a
9c50: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 61 20   changeset to a 
9c60: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66  database. This f
9c70: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
9c80: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 0a 2a   to update the.*
9c90: 2a 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  * "main" databas
9ca0: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 68 61  e attached to ha
9cb0: 6e 64 6c 65 20 64 62 20 77 69 74 68 20 74 68 65  ndle db with the
9cc0: 20 63 68 61 6e 67 65 73 20 66 6f 75 6e 64 20 69   changes found i
9cd0: 6e 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73  n the.** changes
9ce0: 65 74 20 70 61 73 73 65 64 20 76 69 61 20 74 68  et passed via th
9cf0: 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
9d00: 72 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a  rd arguments..**
9d10: 0a 2a 2a 20 54 68 65 20 66 6f 75 72 74 68 20 61  .** The fourth a
9d20: 72 67 75 6d 65 6e 74 20 28 78 46 69 6c 74 65 72  rgument (xFilter
9d30: 29 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  ) passed to this
9d40: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
9d50: 20 22 66 69 6c 74 65 72 0a 2a 2a 20 63 61 6c 6c   "filter.** call
9d60: 62 61 63 6b 22 2e 20 49 66 20 69 74 20 69 73 20  back". If it is 
9d70: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66  not NULL, then f
9d80: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 61 66  or each table af
9d90: 66 65 63 74 65 64 20 62 79 20 61 74 20 6c 65 61  fected by at lea
9da0: 73 74 20 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67 65  st one.** change
9db0: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
9dc0: 74 2c 20 74 68 65 20 66 69 6c 74 65 72 20 63 61  t, the filter ca
9dd0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
9de0: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 74 61  d with.** the ta
9df0: 62 6c 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ble name as the 
9e00: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
9e10: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
9e20: 68 65 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74  he context point
9e30: 65 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  er.** passed as 
9e40: 74 68 65 20 73 69 78 74 68 20 61 72 67 75 6d 65  the sixth argume
9e50: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
9e60: 69 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  ion as the first
9e70: 2e 20 49 66 20 74 68 65 20 22 66 69 6c 74 65 72  . If the "filter
9e80: 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 22 20 72 65  .** callback" re
9e90: 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
9ea0: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
9eb0: 61 64 65 20 74 6f 20 61 70 70 6c 79 20 61 6e 79  ade to apply any
9ec0: 20 63 68 61 6e 67 65 73 20 74 6f 20 0a 2a 2a 20   changes to .** 
9ed0: 74 68 65 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  the table. Other
9ee0: 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 74  wise, if the ret
9ef0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e  urn value is non
9f00: 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 78 46 69  -zero or the xFi
9f10: 6c 74 65 72 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  lter.** argument
9f20: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9f30: 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 63  n is NULL, all c
9f40: 68 61 6e 67 65 73 20 72 65 6c 61 74 65 64 20 74  hanges related t
9f50: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 0a  o the table are.
9f60: 2a 2a 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a  ** attempted..**
9f70: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 61 62  .** For each tab
9f80: 6c 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 65  le that is not e
9f90: 78 63 6c 75 64 65 64 20 62 79 20 74 68 65 20 66  xcluded by the f
9fa0: 69 6c 74 65 72 20 63 61 6c 6c 62 61 63 6b 2c 20  ilter callback, 
9fb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
9fc0: 2a 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65  * tests that the
9fd0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
9fe0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 70   contains a comp
9ff0: 61 74 69 62 6c 65 20 74 61 62 6c 65 2e 20 41 20  atible table. A 
a000: 74 61 62 6c 65 20 69 73 20 0a 2a 2a 20 63 6f 6e  table is .** con
a010: 73 69 64 65 72 65 64 20 63 6f 6d 70 61 74 69 62  sidered compatib
a020: 6c 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  le if all of the
a030: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
a040: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  rue:.**.** <ul>.
a050: 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 74 61  **   <li> The ta
a060: 62 6c 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ble has the same
a070: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6e 61 6d   name as the nam
a080: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  e recorded in th
a090: 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61  e .**        cha
a0a0: 6e 67 65 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20  ngeset, and.**  
a0b0: 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20   <li> The table 
a0c0: 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
a0d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61  ber of columns a
a0e0: 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  s recorded in th
a0f0: 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61  e .**        cha
a100: 6e 67 65 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20  ngeset, and.**  
a110: 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65 20   <li> The table 
a120: 68 61 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20  has primary key 
a130: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
a140: 61 6d 65 20 70 6f 73 69 74 69 6f 6e 20 61 73 20  ame position as 
a150: 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 6f 72  .**        recor
a160: 64 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ded in the chang
a170: 65 73 65 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  eset..** </ul>.*
a180: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
a190: 20 6e 6f 20 63 6f 6d 70 61 74 69 62 6c 65 20 74   no compatible t
a1a0: 61 62 6c 65 2c 20 69 74 20 69 73 20 6e 6f 74 20  able, it is not 
a1b0: 61 6e 20 65 72 72 6f 72 2c 20 62 75 74 20 6e 6f  an error, but no
a1c0: 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61  ne of the.** cha
a1d0: 6e 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  nges associated 
a1e0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
a1f0: 72 65 20 61 70 70 6c 69 65 64 2e 20 41 20 77 61  re applied. A wa
a200: 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 20 69 73  rning message is
a210: 20 69 73 73 75 65 64 0a 2a 2a 20 76 69 61 20 74   issued.** via t
a220: 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  he sqlite3_log()
a230: 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 74 68 20   mechanism with 
a240: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 53  the error code S
a250: 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 20 41 74  QLITE_SCHEMA. At
a260: 20 6d 6f 73 74 0a 2a 2a 20 6f 6e 65 20 73 75 63   most.** one suc
a270: 68 20 77 61 72 6e 69 6e 67 20 69 73 20 69 73 73  h warning is iss
a280: 75 65 64 20 66 6f 72 20 65 61 63 68 20 74 61 62  ued for each tab
a290: 6c 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  le in the change
a2a0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  set..**.** For e
a2b0: 61 63 68 20 63 68 61 6e 67 65 20 66 6f 72 20 77  ach change for w
a2c0: 68 69 63 68 20 74 68 65 72 65 20 69 73 20 61 20  hich there is a 
a2d0: 63 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65  compatible table
a2e0: 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
a2f0: 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 6d 6f 64 69  made .** to modi
a300: 66 79 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  fy the table con
a310: 74 65 6e 74 73 20 61 63 63 6f 72 64 69 6e 67 20  tents according 
a320: 74 6f 20 74 68 65 20 55 50 44 41 54 45 2c 20 49  to the UPDATE, I
a330: 4e 53 45 52 54 20 6f 72 20 44 45 4c 45 54 45 20  NSERT or DELETE 
a340: 0a 2a 2a 20 63 68 61 6e 67 65 2e 20 49 66 20 61  .** change. If a
a350: 20 63 68 61 6e 67 65 20 63 61 6e 6e 6f 74 20 62   change cannot b
a360: 65 20 61 70 70 6c 69 65 64 20 63 6c 65 61 6e 6c  e applied cleanl
a370: 79 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  y, the conflict 
a380: 68 61 6e 64 6c 65 72 20 0a 2a 2a 20 66 75 6e 63  handler .** func
a390: 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
a3a0: 68 65 20 66 69 66 74 68 20 61 72 67 75 6d 65 6e  he fifth argumen
a3b0: 74 20 74 6f 20 73 71 6c 69 74 65 33 63 68 61 6e  t to sqlite3chan
a3c0: 67 65 73 65 74 5f 61 70 70 6c 79 28 29 20 6d 61  geset_apply() ma
a3d0: 79 20 62 65 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64  y be .** invoked
a3e0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
a3f0: 6f 66 20 65 78 61 63 74 6c 79 20 77 68 65 6e 20  of exactly when 
a400: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
a410: 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20  dler is invoked 
a420: 66 6f 72 20 0a 2a 2a 20 65 61 63 68 20 74 79 70  for .** each typ
a430: 65 20 6f 66 20 63 68 61 6e 67 65 20 69 73 20 62  e of change is b
a440: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69  elow..**.** Unli
a450: 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 61  ke the xFilter a
a460: 72 67 75 6d 65 6e 74 2c 20 78 43 6f 6e 66 6c 69  rgument, xConfli
a470: 63 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 61  ct may not be pa
a480: 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68 65 20 72  ssed NULL. The r
a490: 65 73 75 6c 74 73 0a 2a 2a 20 6f 66 20 70 61 73  esults.** of pas
a4a0: 73 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 6f 74  sing anything ot
a4b0: 68 65 72 20 74 68 61 6e 20 61 20 76 61 6c 69 64  her than a valid
a4c0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
a4d0: 72 20 61 73 20 74 68 65 20 78 43 6f 6e 66 6c 69  r as the xConfli
a4e0: 63 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61  ct.** argument a
a4f0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  re undefined..**
a500: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 74 68  .** Each time th
a510: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
a520: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
a530: 6e 76 6f 6b 65 64 2c 20 69 74 20 6d 75 73 74 20  nvoked, it must 
a540: 72 65 74 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66  return one.** of
a550: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
a560: 45 54 5f 4f 4d 49 54 5d 2c 20 5b 53 51 4c 49 54  ET_OMIT], [SQLIT
a570: 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52  E_CHANGESET_ABOR
a580: 54 5d 20 6f 72 20 0a 2a 2a 20 5b 53 51 4c 49 54  T] or .** [SQLIT
a590: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
a5a0: 41 43 45 5d 2e 20 53 51 4c 49 54 45 5f 43 48 41  ACE]. SQLITE_CHA
a5b0: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 6d  NGESET_REPLACE m
a5c0: 61 79 20 6f 6e 6c 79 20 62 65 20 72 65 74 75 72  ay only be retur
a5d0: 6e 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 73 65  ned.** if the se
a5e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61  cond argument pa
a5f0: 73 73 65 64 20 74 6f 20 74 68 65 20 63 6f 6e 66  ssed to the conf
a600: 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20  lict handler is 
a610: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
a620: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
a630: 6f 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  or SQLITE_CHANGE
a640: 53 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66  SET_CONFLICT. If
a650: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
a660: 6e 64 6c 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  ndler.** returns
a670: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75   an illegal valu
a680: 65 2c 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  e, any changes a
a690: 6c 72 65 61 64 79 20 6d 61 64 65 20 61 72 65 20  lready made are 
a6a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a  rolled back and.
a6b0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** the call to s
a6c0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
a6d0: 61 70 70 6c 79 28 29 20 72 65 74 75 72 6e 73 20  apply() returns 
a6e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 44  SQLITE_MISUSE. D
a6f0: 69 66 66 65 72 65 6e 74 20 0a 2a 2a 20 61 63 74  ifferent .** act
a700: 69 6f 6e 73 20 61 72 65 20 74 61 6b 65 6e 20 62  ions are taken b
a710: 79 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  y sqlite3changes
a720: 65 74 5f 61 70 70 6c 79 28 29 20 64 65 70 65 6e  et_apply() depen
a730: 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
a740: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79  e.** returned by
a750: 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
a760: 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   of the conflict
a770: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
a780: 6e 2e 20 52 65 66 65 72 20 74 6f 0a 2a 2a 20 74  n. Refer to.** t
a790: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
a7a0: 20 66 6f 72 20 74 68 65 20 74 68 72 65 65 20 0a   for the three .
a7b0: 2a 2a 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  ** [SQLITE_CHANG
a7c0: 45 53 45 54 5f 4f 4d 49 54 7c 61 76 61 69 6c 61  ESET_OMIT|availa
a7d0: 62 6c 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ble return value
a7e0: 73 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  s] for details..
a7f0: 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64  **.** <dl>.** <d
a800: 74 3e 44 45 4c 45 54 45 20 43 68 61 6e 67 65 73  t>DELETE Changes
a810: 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f 72 20 65 61  <dd>.**   For ea
a820: 63 68 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  ch DELETE change
a830: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
a840: 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 74 61  checks if the ta
a850: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a  rget database .*
a860: 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  *   contains a r
a870: 6f 77 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ow with the same
a880: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
a890: 75 65 20 28 6f 72 20 76 61 6c 75 65 73 29 20 61  ue (or values) a
a8a0: 73 20 74 68 65 20 0a 2a 2a 20 20 20 6f 72 69 67  s the .**   orig
a8b0: 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75 65 73 20  inal row values 
a8c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 68  stored in the ch
a8d0: 61 6e 67 65 73 65 74 2e 20 49 66 20 69 74 20 64  angeset. If it d
a8e0: 6f 65 73 2c 20 61 6e 64 20 74 68 65 20 76 61 6c  oes, and the val
a8f0: 75 65 73 20 0a 2a 2a 20 20 20 73 74 6f 72 65 64  ues .**   stored
a900: 20 69 6e 20 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d   in all non-prim
a910: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
a920: 61 6c 73 6f 20 6d 61 74 63 68 20 74 68 65 20 76  also match the v
a930: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
a940: 0a 2a 2a 20 20 20 74 68 65 20 63 68 61 6e 67 65  .**   the change
a950: 73 65 74 20 74 68 65 20 72 6f 77 20 69 73 20 64  set the row is d
a960: 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
a970: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e  target database.
a980: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f  .**.**   If a ro
a990: 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  w with matching 
a9a0: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
a9b0: 65 73 20 69 73 20 66 6f 75 6e 64 2c 20 62 75 74  es is found, but
a9c0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a   one or more of.
a9d0: 2a 2a 20 20 20 74 68 65 20 6e 6f 6e 2d 70 72 69  **   the non-pri
a9e0: 6d 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20  mary key fields 
a9f0: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
aa00: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
aa10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
aa20: 20 20 72 6f 77 20 76 61 6c 75 65 20 73 74 6f 72    row value stor
aa30: 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ed in the change
aa40: 73 65 74 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63  set, the conflic
aa50: 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  t-handler functi
aa60: 6f 6e 20 69 73 0a 2a 2a 20 20 20 69 6e 76 6f 6b  on is.**   invok
aa70: 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f  ed with [SQLITE_
aa80: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20  CHANGESET_DATA] 
aa90: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
aaa0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  gument..**.**   
aab0: 49 66 20 6e 6f 20 72 6f 77 20 77 69 74 68 20 6d  If no row with m
aac0: 61 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20  atching primary 
aad0: 6b 65 79 20 76 61 6c 75 65 73 20 69 73 20 66 6f  key values is fo
aae0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
aaf0: 61 73 65 2c 0a 2a 2a 20 20 20 74 68 65 20 63 6f  ase,.**   the co
ab00: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66  nflict-handler f
ab10: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
ab20: 65 64 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f  ed with [SQLITE_
ab30: 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55  CHANGESET_NOTFOU
ab40: 4e 44 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20  ND].**   passed 
ab50: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
ab60: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  gument..**.**   
ab70: 49 66 20 74 68 65 20 44 45 4c 45 54 45 20 6f 70  If the DELETE op
ab80: 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74 65 6d  eration is attem
ab90: 70 74 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65  pted, but SQLite
aba0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
abb0: 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 20 20  CONSTRAINT.**   
abc0: 28 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20  (which can only 
abd0: 68 61 70 70 65 6e 20 69 66 20 61 20 66 6f 72 65  happen if a fore
abe0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
abf0: 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 29 2c  nt is violated),
ac00: 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69   the.**   confli
ac10: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
ac20: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
ac30: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
ac40: 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54  GESET_CONSTRAINT
ac50: 5d 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73  ].**   passed as
ac60: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
ac70: 6d 65 6e 74 2e 20 54 68 69 73 20 69 6e 63 6c 75  ment. This inclu
ac80: 64 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65  des the case whe
ac90: 72 65 20 74 68 65 20 44 45 4c 45 54 45 0a 2a 2a  re the DELETE.**
aca0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20     operation is 
acb0: 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75 73  attempted becaus
acc0: 65 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  e an earlier cal
acd0: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  l to the conflic
ace0: 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66  t handler.**   f
acf0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
ad00: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
ad10: 45 54 5f 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a  ET_REPLACE]..**.
ad20: 2a 2a 20 3c 64 74 3e 49 4e 53 45 52 54 20 43 68  ** <dt>INSERT Ch
ad30: 61 6e 67 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46  anges<dd>.**   F
ad40: 6f 72 20 65 61 63 68 20 49 4e 53 45 52 54 20 63  or each INSERT c
ad50: 68 61 6e 67 65 2c 20 61 6e 20 61 74 74 65 6d 70  hange, an attemp
ad60: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e 73  t is made to ins
ad70: 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
ad80: 69 6e 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64 61  into.**   the da
ad90: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
ada0: 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
adb0: 6f 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f 77  o insert the row
adc0: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 74   fails because t
add0: 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
ade0: 61 64 79 20 0a 2a 2a 20 20 20 63 6f 6e 74 61 69  ady .**   contai
adf0: 6e 73 20 61 20 72 6f 77 20 77 69 74 68 20 74 68  ns a row with th
ae00: 65 20 73 61 6d 65 20 70 72 69 6d 61 72 79 20 6b  e same primary k
ae10: 65 79 20 76 61 6c 75 65 73 2c 20 74 68 65 20 63  ey values, the c
ae20: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a  onflict handler.
ae30: 2a 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 73  **   function is
ae40: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 74 68   invoked with th
ae50: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
ae60: 74 20 73 65 74 20 74 6f 20 0a 2a 2a 20 20 20 5b  t set to .**   [
ae70: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
ae80: 5f 43 4f 4e 46 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a  _CONFLICT]..**.*
ae90: 2a 20 20 20 49 66 20 74 68 65 20 61 74 74 65 6d  *   If the attem
aea0: 70 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  pt to insert the
aeb0: 20 72 6f 77 20 66 61 69 6c 73 20 62 65 63 61 75   row fails becau
aec0: 73 65 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  se of some other
aed0: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
aee0: 20 76 69 6f 6c 61 74 69 6f 6e 20 28 65 2e 67 2e   violation (e.g.
aef0: 20 4e 4f 54 20 4e 55 4c 4c 20 6f 72 20 55 4e 49   NOT NULL or UNI
af00: 51 55 45 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69  QUE), the confli
af10: 63 74 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct handler funct
af20: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 69 6e 76  ion is .**   inv
af30: 6f 6b 65 64 20 77 69 74 68 20 74 68 65 20 73 65  oked with the se
af40: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 65  cond argument se
af50: 74 20 74 6f 20 5b 53 51 4c 49 54 45 5f 43 48 41  t to [SQLITE_CHA
af60: 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e  NGESET_CONSTRAIN
af70: 54 5d 2e 0a 2a 2a 20 20 20 54 68 69 73 20 69 6e  T]..**   This in
af80: 63 6c 75 64 65 73 20 74 68 65 20 63 61 73 65 20  cludes the case 
af90: 77 68 65 72 65 20 74 68 65 20 49 4e 53 45 52 54  where the INSERT
afa0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65   operation is re
afb0: 2d 61 74 74 65 6d 70 74 65 64 20 62 65 63 61 75  -attempted becau
afc0: 73 65 20 0a 2a 2a 20 20 20 61 6e 20 65 61 72 6c  se .**   an earl
afd0: 69 65 72 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  ier call to the 
afe0: 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
aff0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
b000: 65 64 20 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45  ed .**   [SQLITE
b010: 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41  _CHANGESET_REPLA
b020: 43 45 5d 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 55  CE]..**.** <dt>U
b030: 50 44 41 54 45 20 43 68 61 6e 67 65 73 3c 64 64  PDATE Changes<dd
b040: 3e 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20  >.**   For each 
b050: 55 50 44 41 54 45 20 63 68 61 6e 67 65 2c 20 74  UPDATE change, t
b060: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
b070: 63 6b 73 20 69 66 20 74 68 65 20 74 61 72 67 65  cks if the targe
b080: 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  t database .**  
b090: 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20   contains a row 
b0a0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72  with the same pr
b0b0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20  imary key value 
b0c0: 28 6f 72 20 76 61 6c 75 65 73 29 20 61 73 20 74  (or values) as t
b0d0: 68 65 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61  he .**   origina
b0e0: 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f  l row values sto
b0f0: 72 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67  red in the chang
b100: 65 73 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73  eset. If it does
b110: 2c 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73  , and the values
b120: 20 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e   .**   stored in
b130: 20 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79   all non-primary
b140: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73   key columns als
b150: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
b160: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a  es stored in .**
b170: 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 65 74     the changeset
b180: 20 74 68 65 20 72 6f 77 20 69 73 20 75 70 64 61   the row is upda
b190: 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 74  ted within the t
b1a0: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 0a  arget database..
b1b0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f 77  **.**   If a row
b1c0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70   with matching p
b1d0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
b1e0: 73 20 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20  s is found, but 
b1f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a  one or more of.*
b200: 2a 20 20 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d  *   the non-prim
b210: 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 63  ary key fields c
b220: 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20  ontains a value 
b230: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 61  different from a
b240: 6e 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  n original.**   
b250: 72 6f 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  row value stored
b260: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
b270: 74 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d  t, the conflict-
b280: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
b290: 20 69 73 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64   is.**   invoked
b2a0: 20 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48   with [SQLITE_CH
b2b0: 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20 61 73  ANGESET_DATA] as
b2c0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b2d0: 6d 65 6e 74 2e 20 53 69 6e 63 65 0a 2a 2a 20 20  ment. Since.**  
b2e0: 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 73 20   UPDATE changes 
b2f0: 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 20 76 61 6c  only contain val
b300: 75 65 73 20 66 6f 72 20 6e 6f 6e 2d 70 72 69 6d  ues for non-prim
b310: 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 74  ary key fields t
b320: 68 61 74 20 61 72 65 0a 2a 2a 20 20 20 74 6f 20  hat are.**   to 
b330: 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 6f 6e 6c  be modified, onl
b340: 79 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 6e  y those fields n
b350: 65 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  eed to match the
b360: 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73   original values
b370: 20 74 6f 0a 2a 2a 20 20 20 61 76 6f 69 64 20 74   to.**   avoid t
b380: 68 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  he SQLITE_CHANGE
b390: 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63  SET_DATA conflic
b3a0: 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  t-handler callba
b3b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e  ck..**.**   If n
b3c0: 6f 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63 68  o row with match
b3d0: 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ing primary key 
b3e0: 76 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64 20  values is found 
b3f0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
b400: 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c 69  .**   the confli
b410: 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  ct-handler funct
b420: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
b430: 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e  ith [SQLITE_CHAN
b440: 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a  GESET_NOTFOUND].
b450: 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73 20 74  **   passed as t
b460: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b470: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74  nt..**.**   If t
b480: 68 65 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  he UPDATE operat
b490: 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64  ion is attempted
b4a0: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 72 65 74  , but SQLite ret
b4b0: 75 72 6e 73 20 0a 2a 2a 20 20 20 53 51 4c 49 54  urns .**   SQLIT
b4c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
b4d0: 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  e conflict-handl
b4e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
b4f0: 6e 76 6f 6b 65 64 20 77 69 74 68 20 0a 2a 2a 20  nvoked with .** 
b500: 20 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45    [SQLITE_CHANGE
b510: 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 20  SET_CONSTRAINT] 
b520: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
b530: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
b540: 2a 20 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65  *   This include
b550: 73 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  s the case where
b560: 20 74 68 65 20 55 50 44 41 54 45 20 6f 70 65 72   the UPDATE oper
b570: 61 74 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74  ation is attempt
b580: 65 64 20 61 66 74 65 72 20 0a 2a 2a 20 20 20 61  ed after .**   a
b590: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
b5a0: 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  o the conflict h
b5b0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
b5c0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 20 20 5b 53  returned.**   [S
b5d0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
b5e0: 52 45 50 4c 41 43 45 5d 2e 20 20 0a 2a 2a 20 3c  REPLACE].  .** <
b5f0: 2f 64 6c 3e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  /dl>.**.** It is
b600: 20 73 61 66 65 20 74 6f 20 65 78 65 63 75 74 65   safe to execute
b610: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c   SQL statements,
b620: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
b630: 20 74 68 61 74 20 77 72 69 74 65 20 74 6f 20 74   that write to t
b640: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74  he.** table that
b650: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   the callback re
b660: 6c 61 74 65 64 20 74 6f 2c 20 66 72 6f 6d 20 77  lated to, from w
b670: 69 74 68 69 6e 20 74 68 65 20 78 43 6f 6e 66 6c  ithin the xConfl
b680: 69 63 74 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  ict callback..**
b690: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
b6a0: 64 20 74 6f 20 66 75 72 74 68 65 72 20 63 75 73  d to further cus
b6b0: 74 6f 6d 69 7a 65 20 74 68 65 20 61 70 70 6c 69  tomize the appli
b6c0: 63 61 74 69 6f 6e 73 20 63 6f 6e 66 6c 69 63 74  cations conflict
b6d0: 0a 2a 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73  .** resolution s
b6e0: 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 41  trategy..**.** A
b6f0: 6c 6c 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ll changes made 
b700: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b710: 20 61 72 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e   are enclosed in
b720: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
b730: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  nsaction..** If 
b740: 61 6e 79 20 6f 74 68 65 72 20 65 72 72 6f 72 20  any other error 
b750: 28 61 73 69 64 65 20 66 72 6f 6d 20 61 20 63 6f  (aside from a co
b760: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72 65  nstraint failure
b770: 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   when attempting
b780: 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20   to.** write to 
b790: 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
b7a0: 61 73 65 29 20 6f 63 63 75 72 73 2c 20 74 68 65  ase) occurs, the
b7b0: 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
b7c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
b7d0: 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 72  * rolled back, r
b7e0: 65 73 74 6f 72 69 6e 67 20 74 68 65 20 74 61 72  estoring the tar
b7f0: 67 65 74 20 64 61 74 61 62 61 73 65 20 74 6f 20  get database to 
b800: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
b810: 74 65 2c 20 61 6e 64 20 61 6e 20 0a 2a 2a 20 53  te, and an .** S
b820: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b830: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
b840: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
b850: 65 74 5f 61 70 70 6c 79 28 0a 20 20 73 71 6c 69  et_apply(.  sqli
b860: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
b870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b880: 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22  pply change to "
b890: 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73  main" db of this
b8a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
b8b0: 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20   nChangeset,    
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8d0: 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65  Size of changese
b8e0: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
b8f0: 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74  void *pChangeset
b900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b910: 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 62 6c 6f  /* Changeset blo
b920: 62 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c  b */.  int(*xFil
b930: 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a  ter)(.    void *
b940: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
b950: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
b960: 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20  of sixth arg to 
b970: 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20  _apply() */.    
b980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9a0: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
b9b0: 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66   ),.  int(*xConf
b9c0: 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20  lict)(.    void 
b9d0: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
b9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
b9f0: 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f   of sixth arg to
ba00: 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20   _apply() */.   
ba10: 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20   int eConflict, 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba30: 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c  * DATA, MISSING,
ba40: 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54   CONFLICT, CONST
ba50: 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c  RAINT */.    sql
ba60: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
ba70: 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61  ter *p     /* Ha
ba80: 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20  ndle describing 
ba90: 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c  change and confl
baa0: 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f  ict */.  ),.  vo
bab0: 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20  id *pCtx        
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bad0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
bae0: 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c  passed to xConfl
baf0: 69 63 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 0a 2a  ict */.);../* .*
bb00: 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 73  * CAPI3REF: Cons
bb10: 74 61 6e 74 73 20 50 61 73 73 65 64 20 54 6f 20  tants Passed To 
bb20: 54 68 65 20 43 6f 6e 66 6c 69 63 74 20 48 61 6e  The Conflict Han
bb30: 64 6c 65 72 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  dler.**.** Value
bb40: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
bb50: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
bb60: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61  nd argument to a
bb70: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
bb80: 72 2e 0a 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a  r..**.** <dl>.**
bb90: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
bba0: 47 45 53 45 54 5f 44 41 54 41 3c 64 64 3e 0a 2a  GESET_DATA<dd>.*
bbb0: 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74  *   The conflict
bbc0: 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f   handler is invo
bbd0: 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47 45 53  ked with CHANGES
bbe0: 45 54 5f 44 41 54 41 20 61 73 20 74 68 65 20 73  ET_DATA as the s
bbf0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
bc00: 2a 20 20 20 77 68 65 6e 20 70 72 6f 63 65 73 73  *   when process
bc10: 69 6e 67 20 61 20 44 45 4c 45 54 45 20 6f 72 20  ing a DELETE or 
bc20: 55 50 44 41 54 45 20 63 68 61 6e 67 65 20 69 66  UPDATE change if
bc30: 20 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 20   a row with the 
bc40: 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 50 52  required.**   PR
bc50: 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 73  IMARY KEY fields
bc60: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
bc70: 68 65 20 64 61 74 61 62 61 73 65 2c 20 62 75 74  he database, but
bc80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 74 68   one or more oth
bc90: 65 72 20 0a 2a 2a 20 20 20 28 6e 6f 6e 20 70 72  er .**   (non pr
bca0: 69 6d 61 72 79 2d 6b 65 79 29 20 66 69 65 6c 64  imary-key) field
bcb0: 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  s modified by th
bcc0: 65 20 75 70 64 61 74 65 20 64 6f 20 6e 6f 74 20  e update do not 
bcd0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 0a 2a 2a 20  contain the .** 
bce0: 20 20 65 78 70 65 63 74 65 64 20 22 62 65 66 6f    expected "befo
bcf0: 72 65 22 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a  re" values..** .
bd00: 2a 2a 20 20 20 54 68 65 20 63 6f 6e 66 6c 69 63  **   The conflic
bd10: 74 69 6e 67 20 72 6f 77 2c 20 69 6e 20 74 68 69  ting row, in thi
bd20: 73 20 63 61 73 65 2c 20 69 73 20 74 68 65 20 64  s case, is the d
bd30: 61 74 61 62 61 73 65 20 72 6f 77 20 77 69 74 68  atabase row with
bd40: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 2a 2a   the matching.**
bd50: 20 20 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a     primary key..
bd60: 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54  ** .** <dt>SQLIT
bd70: 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46  E_CHANGESET_NOTF
bd80: 4f 55 4e 44 3c 64 64 3e 0a 2a 2a 20 20 20 54 68  OUND<dd>.**   Th
bd90: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
bda0: 65 72 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  er is invoked wi
bdb0: 74 68 20 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  th CHANGESET_NOT
bdc0: 46 4f 55 4e 44 20 61 73 20 74 68 65 20 73 65 63  FOUND as the sec
bdd0: 6f 6e 64 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e  ond.**   argumen
bde0: 74 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  t when processin
bdf0: 67 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50  g a DELETE or UP
be00: 44 41 54 45 20 63 68 61 6e 67 65 20 69 66 20 61  DATE change if a
be10: 20 72 6f 77 20 77 69 74 68 20 74 68 65 0a 2a 2a   row with the.**
be20: 20 20 20 72 65 71 75 69 72 65 64 20 50 52 49 4d     required PRIM
be30: 41 52 59 20 4b 45 59 20 66 69 65 6c 64 73 20 69  ARY KEY fields i
be40: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
be50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
be60: 2a 20 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73  * .**   There is
be70: 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20   no conflicting 
be80: 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61 73 65  row in this case
be90: 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  . The results of
bea0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a   invoking the.**
beb0: 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65     sqlite3change
bec0: 73 65 74 5f 63 6f 6e 66 6c 69 63 74 28 29 20 41  set_conflict() A
bed0: 50 49 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  PI are undefined
bee0: 2e 0a 2a 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c  ..** .** <dt>SQL
bef0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
bf00: 4e 46 4c 49 43 54 3c 64 64 3e 0a 2a 2a 20 20 20  NFLICT<dd>.**   
bf10: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
bf20: 43 54 20 69 73 20 70 61 73 73 65 64 20 61 73 20  CT is passed as 
bf30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
bf40: 65 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c  ent to the confl
bf50: 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72  ict.**   handler
bf60: 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
bf70: 67 20 61 6e 20 49 4e 53 45 52 54 20 63 68 61 6e  g an INSERT chan
bf80: 67 65 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ge if the operat
bf90: 69 6f 6e 20 77 6f 75 6c 64 20 72 65 73 75 6c 74  ion would result
bfa0: 20 0a 2a 2a 20 20 20 69 6e 20 64 75 70 6c 69 63   .**   in duplic
bfb0: 61 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ate primary key 
bfc0: 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20  values..** .**  
bfd0: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67   The conflicting
bfe0: 20 72 6f 77 20 69 6e 20 74 68 69 73 20 63 61 73   row in this cas
bff0: 65 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  e is the databas
c000: 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
c010: 61 74 63 68 69 6e 67 0a 2a 2a 20 20 20 70 72 69  atching.**   pri
c020: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
c030: 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47  <dt>SQLITE_CHANG
c040: 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  ESET_FOREIGN_KEY
c050: 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 66 6f 72  <dd>.**   If for
c060: 65 69 67 6e 20 6b 65 79 20 68 61 6e 64 6c 69 6e  eign key handlin
c070: 67 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e  g is enabled, an
c080: 64 20 61 70 70 6c 79 69 6e 67 20 61 20 63 68 61  d applying a cha
c090: 6e 67 65 73 65 74 20 6c 65 61 76 65 73 20 74 68  ngeset leaves th
c0a0: 65 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20  e.**   database 
c0b0: 69 6e 20 61 20 73 74 61 74 65 20 63 6f 6e 74 61  in a state conta
c0c0: 69 6e 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  ining foreign ke
c0d0: 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 74 68  y violations, th
c0e0: 65 20 63 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20 20  e conflict .**  
c0f0: 20 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f   handler is invo
c100: 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47 45 53  ked with CHANGES
c110: 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 61  ET_FOREIGN_KEY a
c120: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
c130: 75 6d 65 6e 74 0a 2a 2a 20 20 20 65 78 61 63 74  ument.**   exact
c140: 6c 79 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 74  ly once before t
c150: 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 20  he changeset is 
c160: 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
c170: 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
c180: 65 72 0a 2a 2a 20 20 20 72 65 74 75 72 6e 73 20  er.**   returns 
c190: 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 2c 20  CHANGESET_OMIT, 
c1a0: 74 68 65 20 63 68 61 6e 67 65 73 2c 20 69 6e 63  the changes, inc
c1b0: 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61  luding those tha
c1c0: 74 20 63 61 75 73 65 64 20 74 68 65 0a 2a 2a 20  t caused the.** 
c1d0: 20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f    foreign key co
c1e0: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
c1f0: 6f 6e 2c 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  on, are committe
c200: 64 2e 20 4f 72 2c 20 69 66 20 69 74 20 72 65 74  d. Or, if it ret
c210: 75 72 6e 73 0a 2a 2a 20 20 20 43 48 41 4e 47 45  urns.**   CHANGE
c220: 53 45 54 5f 41 42 4f 52 54 2c 20 74 68 65 20 63  SET_ABORT, the c
c230: 68 61 6e 67 65 73 65 74 20 69 73 20 72 6f 6c 6c  hangeset is roll
c240: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
c250: 20 4e 6f 20 63 75 72 72 65 6e 74 20 6f 72 20 63   No current or c
c260: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69  onflicting row i
c270: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 72  nformation is pr
c280: 6f 76 69 64 65 64 2e 20 54 68 65 20 6f 6e 6c 79  ovided. The only
c290: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 69   function.**   i
c2a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
c2b0: 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 75 70   call on the sup
c2c0: 70 6c 69 65 64 20 73 71 6c 69 74 65 33 5f 63 68  plied sqlite3_ch
c2d0: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 68 61 6e  angeset_iter han
c2e0: 64 6c 65 0a 2a 2a 20 20 20 69 73 20 73 71 6c 69  dle.**   is sqli
c2f0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 6b 5f  te3changeset_fk_
c300: 63 6f 6e 66 6c 69 63 74 73 28 29 2e 0a 2a 2a 20  conflicts()..** 
c310: 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43  .** <dt>SQLITE_C
c320: 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41  HANGESET_CONSTRA
c330: 49 4e 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20  INT<dd>.**   If 
c340: 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 73 74 72  any other constr
c350: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 6f  aint violation o
c360: 63 63 75 72 73 20 77 68 69 6c 65 20 61 70 70 6c  ccurs while appl
c370: 79 69 6e 67 20 61 20 63 68 61 6e 67 65 20 28 69  ying a change (i
c380: 2e 65 2e 20 0a 2a 2a 20 20 20 61 20 55 4e 49 51  .e. .**   a UNIQ
c390: 55 45 2c 20 43 48 45 43 4b 20 6f 72 20 4e 4f 54  UE, CHECK or NOT
c3a0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
c3b0: 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ), the conflict 
c3c0: 68 61 6e 64 6c 65 72 20 69 73 20 0a 2a 2a 20 20  handler is .**  
c3d0: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43 48   invoked with CH
c3e0: 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49  ANGESET_CONSTRAI
c3f0: 4e 54 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  NT as the second
c400: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a   argument..** .*
c410: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
c420: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20  conflicting row 
c430: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 54 68  in this case. Th
c440: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 69 6e 76  e results of inv
c450: 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 73  oking the.**   s
c460: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
c470: 63 6f 6e 66 6c 69 63 74 28 29 20 41 50 49 20 61  conflict() API a
c480: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  re undefined..**
c490: 0a 2a 2a 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64 65  .** </dl>.*/.#de
c4a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e  fine SQLITE_CHAN
c4b0: 47 45 53 45 54 5f 44 41 54 41 20 20 20 20 20 20  GESET_DATA      
c4c0: 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    1.#define SQLI
c4d0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  TE_CHANGESET_NOT
c4e0: 46 4f 55 4e 44 20 20 20 20 32 0a 23 64 65 66 69  FOUND    2.#defi
c4f0: 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ne SQLITE_CHANGE
c500: 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 20 20 20  SET_CONFLICT    
c510: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  3.#define SQLITE
c520: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54  _CHANGESET_CONST
c530: 52 41 49 4e 54 20 20 34 0a 23 64 65 66 69 6e 65  RAINT  4.#define
c540: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
c550: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 35 0a  T_FOREIGN_KEY 5.
c560: 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 33 52 45 46  ./* .** CAPI3REF
c570: 3a 20 43 6f 6e 73 74 61 6e 74 73 20 52 65 74 75  : Constants Retu
c580: 72 6e 65 64 20 42 79 20 54 68 65 20 43 6f 6e 66  rned By The Conf
c590: 6c 69 63 74 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a  lict Handler.**.
c5a0: 2a 2a 20 41 20 63 6f 6e 66 6c 69 63 74 20 68 61  ** A conflict ha
c5b0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 6d  ndler callback m
c5c0: 75 73 74 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  ust return one o
c5d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
c5e0: 74 68 72 65 65 20 76 61 6c 75 65 73 2e 0a 2a 2a  three values..**
c5f0: 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e  .** <dl>.** <dt>
c600: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
c610: 5f 4f 4d 49 54 3c 64 64 3e 0a 2a 2a 20 20 20 49  _OMIT<dd>.**   I
c620: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  f a conflict han
c630: 64 6c 65 72 20 72 65 74 75 72 6e 73 20 74 68 69  dler returns thi
c640: 73 20 76 61 6c 75 65 20 6e 6f 20 73 70 65 63 69  s value no speci
c650: 61 6c 20 61 63 74 69 6f 6e 20 69 73 20 74 61 6b  al action is tak
c660: 65 6e 2e 20 54 68 65 0a 2a 2a 20 20 20 63 68 61  en. The.**   cha
c670: 6e 67 65 20 74 68 61 74 20 63 61 75 73 65 64 20  nge that caused 
c680: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20  the conflict is 
c690: 6e 6f 74 20 61 70 70 6c 69 65 64 2e 20 54 68 65  not applied. The
c6a0: 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 20   session module 
c6b0: 0a 2a 2a 20 20 20 63 6f 6e 74 69 6e 75 65 73 20  .**   continues 
c6c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61 6e  to the next chan
c6d0: 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ge in the change
c6e0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53  set..**.** <dt>S
c6f0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
c700: 52 45 50 4c 41 43 45 3c 64 64 3e 0a 2a 2a 20 20  REPLACE<dd>.**  
c710: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
c720: 6f 6e 6c 79 20 62 65 20 72 65 74 75 72 6e 65 64  only be returned
c730: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
c740: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 63  rgument to the c
c750: 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e  onflict.**   han
c760: 64 6c 65 72 20 77 61 73 20 53 51 4c 49 54 45 5f  dler was SQLITE_
c770: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 6f  CHANGESET_DATA o
c780: 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  r SQLITE_CHANGES
c790: 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66 20  ET_CONFLICT. If 
c7a0: 74 68 69 73 0a 2a 2a 20 20 20 69 73 20 6e 6f 74  this.**   is not
c7b0: 20 74 68 65 20 63 61 73 65 2c 20 61 6e 79 20 63   the case, any c
c7c0: 68 61 6e 67 65 73 20 61 70 70 6c 69 65 64 20 73  hanges applied s
c7d0: 6f 20 66 61 72 20 61 72 65 20 72 6f 6c 6c 65 64  o far are rolled
c7e0: 20 62 61 63 6b 20 61 6e 64 20 74 68 65 20 0a 2a   back and the .*
c7f0: 2a 20 20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  *   call to sqli
c800: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
c810: 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ly() returns SQL
c820: 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2a 0a 2a  ITE_MISUSE..**.*
c830: 2a 20 20 20 49 66 20 43 48 41 4e 47 45 53 45 54  *   If CHANGESET
c840: 5f 52 45 50 4c 41 43 45 20 69 73 20 72 65 74 75  _REPLACE is retu
c850: 72 6e 65 64 20 62 79 20 61 6e 20 53 51 4c 49 54  rned by an SQLIT
c860: 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41  E_CHANGESET_DATA
c870: 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68   conflict.**   h
c880: 61 6e 64 6c 65 72 2c 20 74 68 65 6e 20 74 68 65  andler, then the
c890: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
c8a0: 20 69 73 20 65 69 74 68 65 72 20 75 70 64 61 74   is either updat
c8b0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2c 20 64  ed or deleted, d
c8c0: 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e  epending.**   on
c8d0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 63 68 61   the type of cha
c8e0: 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20  nge..**.**   If 
c8f0: 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43  CHANGESET_REPLAC
c900: 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  E is returned by
c910: 20 61 6e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47   an SQLITE_CHANG
c920: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 63 6f  ESET_CONFLICT co
c930: 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64  nflict.**   hand
c940: 6c 65 72 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ler, then the co
c950: 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 73  nflicting row is
c960: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
c970: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 61  e database and a
c980: 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 61 74 74  .**   second att
c990: 65 6d 70 74 20 74 6f 20 61 70 70 6c 79 20 74 68  empt to apply th
c9a0: 65 20 63 68 61 6e 67 65 20 69 73 20 6d 61 64 65  e change is made
c9b0: 2e 20 49 66 20 74 68 69 73 20 73 65 63 6f 6e 64  . If this second
c9c0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 0a   attempt fails,.
c9d0: 2a 2a 20 20 20 74 68 65 20 6f 72 69 67 69 6e 61  **   the origina
c9e0: 6c 20 72 6f 77 20 69 73 20 72 65 73 74 6f 72 65  l row is restore
c9f0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
ca00: 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  e before continu
ca10: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53  ing..**.** <dt>S
ca20: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
ca30: 41 42 4f 52 54 3c 64 64 3e 0a 2a 2a 20 20 20 49  ABORT<dd>.**   I
ca40: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
ca50: 72 65 74 75 72 6e 65 64 2c 20 61 6e 79 20 63 68  returned, any ch
ca60: 61 6e 67 65 73 20 61 70 70 6c 69 65 64 20 73 6f  anges applied so
ca70: 20 66 61 72 20 61 72 65 20 72 6f 6c 6c 65 64 20   far are rolled 
ca80: 62 61 63 6b 20 0a 2a 2a 20 20 20 61 6e 64 20 74  back .**   and t
ca90: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
caa0: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
cab0: 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49  y() returns SQLI
cac0: 54 45 5f 41 42 4f 52 54 2e 0a 2a 2a 20 3c 2f 64  TE_ABORT..** </d
cad0: 6c 3e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  l>.*/.#define SQ
cae0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f  LITE_CHANGESET_O
caf0: 4d 49 54 20 20 20 20 20 20 20 30 0a 23 64 65 66  MIT       0.#def
cb00: 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  ine SQLITE_CHANG
cb10: 45 53 45 54 5f 52 45 50 4c 41 43 45 20 20 20 20  ESET_REPLACE    
cb20: 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  1.#define SQLITE
cb30: 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f 52 54  _CHANGESET_ABORT
cb40: 20 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43        2../*.** C
cb50: 41 50 49 33 52 45 46 3a 20 53 74 72 65 61 6d 69  API3REF: Streami
cb60: 6e 67 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 41  ng Versions of A
cb70: 50 49 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  PI functions..**
cb80: 0a 2a 2a 20 54 68 65 20 73 69 78 20 73 74 72 65  .** The six stre
cb90: 61 6d 69 6e 67 20 41 50 49 20 78 78 78 5f 73 74  aming API xxx_st
cba0: 72 6d 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 73  rm() functions s
cbb0: 65 72 76 65 20 73 69 6d 69 6c 61 72 20 70 75 72  erve similar pur
cbc0: 70 6f 73 65 73 20 74 6f 20 74 68 65 20 0a 2a 2a  poses to the .**
cbd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e   corresponding n
cbe0: 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 41 50 49  on-streaming API
cbf0: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
cc00: 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  * <table border=
cc10: 31 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d  1 style="margin-
cc20: 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d  left:8ex;margin-
cc30: 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20  right:8ex">.**  
cc40: 20 3c 74 72 3e 3c 74 68 3e 53 74 72 65 61 6d 69   <tr><th>Streami
cc50: 6e 67 20 66 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e  ng function<th>N
cc60: 6f 6e 2d 73 74 72 65 61 6d 69 6e 67 20 65 71 75  on-streaming equ
cc70: 69 76 61 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20  ivalent</th>.** 
cc80: 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
cc90: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
cca0: 5f 73 74 72 3c 74 64 3e 5b 73 71 6c 69 74 65 33  _str<td>[sqlite3
ccb0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5d  changeset_apply]
ccc0: 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73   .**   <tr><td>s
ccd0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
cce0: 63 6f 6e 63 61 74 5f 73 74 72 3c 74 64 3e 5b 73  concat_str<td>[s
ccf0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
cd00: 63 6f 6e 63 61 74 5d 20 0a 2a 2a 20 20 20 3c 74  concat] .**   <t
cd10: 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63 68 61  r><td>sqlite3cha
cd20: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 73 74  ngeset_invert_st
cd30: 72 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61  r<td>[sqlite3cha
cd40: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5d 20 0a  ngeset_invert] .
cd50: 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c  **   <tr><td>sql
cd60: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74  ite3changeset_st
cd70: 61 72 74 5f 73 74 72 3c 74 64 3e 5b 73 71 6c 69  art_str<td>[sqli
cd80: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
cd90: 72 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74  rt] .**   <tr><t
cda0: 64 3e 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  d>sqlite3session
cdb0: 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72 3c 74  _changeset_str<t
cdc0: 64 3e 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f  d>[sqlite3sessio
cdd0: 6e 5f 63 68 61 6e 67 65 73 65 74 5d 20 0a 2a 2a  n_changeset] .**
cde0: 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74     <tr><td>sqlit
cdf0: 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
ce00: 65 74 5f 73 74 72 3c 74 64 3e 5b 73 71 6c 69 74  et_str<td>[sqlit
ce10: 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
ce20: 65 74 5d 20 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e  et] .** </table>
ce30: 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 73 74 72 65 61  .**.** Non-strea
ce40: 6d 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 74  ming functions t
ce50: 68 61 74 20 61 63 63 65 70 74 20 63 68 61 6e 67  hat accept chang
ce60: 65 73 65 74 73 20 28 6f 72 20 70 61 74 63 68 73  esets (or patchs
ce70: 65 74 73 29 20 61 73 20 69 6e 70 75 74 0a 2a 2a  ets) as input.**
ce80: 20 72 65 71 75 69 72 65 20 74 68 61 74 20 74 68   require that th
ce90: 65 20 65 6e 74 69 72 65 20 63 68 61 6e 67 65 73  e entire changes
cea0: 65 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  et be stored in 
ceb0: 61 20 73 69 6e 67 6c 65 20 62 75 66 66 65 72 20  a single buffer 
cec0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 20 53  in memory. .** S
ced0: 69 6d 69 6c 61 72 6c 79 2c 20 74 68 6f 73 65 20  imilarly, those 
cee0: 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 63 68  that return a ch
cef0: 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
cf00: 73 65 74 20 64 6f 20 73 6f 20 62 79 20 72 65 74  set do so by ret
cf10: 75 72 6e 69 6e 67 20 0a 2a 2a 20 61 20 70 6f 69  urning .** a poi
cf20: 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65  nter to a single
cf30: 20 6c 61 72 67 65 20 62 75 66 66 65 72 20 61 6c   large buffer al
cf40: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
cf50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
cf60: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 20 74 68 69  .** Normally thi
cf70: 73 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e  s is convenient.
cf80: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 61 6e 20   However, if an 
cf90: 61 70 70 6c 69 63 61 74 69 6f 6e 20 72 75 6e 6e  application runn
cfa0: 69 6e 67 20 69 6e 20 61 20 0a 2a 2a 20 6c 6f 77  ing in a .** low
cfb0: 2d 6d 65 6d 6f 72 79 20 65 6e 76 69 72 6f 6e 6d  -memory environm
cfc0: 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 20  ent is required 
cfd0: 74 6f 20 68 61 6e 64 6c 65 20 76 65 72 79 20 6c  to handle very l
cfe0: 61 72 67 65 20 63 68 61 6e 67 65 73 65 74 73 2c  arge changesets,
cff0: 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 20 63 6f   the.** large co
d000: 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20  ntiguous memory 
d010: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 72 65 71 75  allocations requ
d020: 69 72 65 64 20 63 61 6e 20 62 65 63 6f 6d 65 20  ired can become 
d030: 6f 6e 65 72 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 49  onerous..**.** I
d040: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
d050: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 69   this problem, i
d060: 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67  nstead of a sing
d070: 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2c  le large buffer,
d080: 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 70 61 73   input.** is pas
d090: 73 65 64 20 74 6f 20 61 20 73 74 72 65 61 6d 69  sed to a streami
d0a0: 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  ng API functions
d0b0: 20 62 79 20 77 61 79 20 6f 66 20 61 20 63 61 6c   by way of a cal
d0c0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
d0d0: 68 61 74 0a 2a 2a 20 74 68 65 20 73 65 73 73 69  hat.** the sessi
d0e0: 6f 6e 73 20 6d 6f 64 75 6c 65 20 69 6e 76 6f 6b  ons module invok
d0f0: 65 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61  es to incrementa
d100: 6c 6c 79 20 72 65 71 75 65 73 74 20 69 6e 70 75  lly request inpu
d110: 74 20 64 61 74 61 20 61 73 20 69 74 20 69 73 0a  t data as it is.
d120: 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 49 6e 20  ** required. In 
d130: 61 6c 6c 20 63 61 73 65 73 2c 20 61 20 70 61 69  all cases, a pai
d140: 72 20 6f 66 20 41 50 49 20 66 75 6e 63 74 69 6f  r of API functio
d150: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 73 75 63  n parameters suc
d160: 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65  h as.**.**  <pre
d170: 3e 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20  >.**  &nbsp;    
d180: 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c   int nChangeset,
d190: 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20  .**  &nbsp;     
d1a0: 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74  void *pChangeset
d1b0: 2c 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a  ,.**  </pre>.**.
d1c0: 2a 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20 62  ** Is replaced b
d1d0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a  y:.**.**  <pre>.
d1e0: 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69  **  &nbsp;     i
d1f0: 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
d200: 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
d210: 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
d220: 29 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20  ),.**  &nbsp;   
d230: 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 2a 2a 20    void *pIn,.** 
d240: 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 45 61   </pre>.**.** Ea
d250: 63 68 20 74 69 6d 65 20 74 68 65 20 78 49 6e 70  ch time the xInp
d260: 75 74 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ut callback is i
d270: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 73 65  nvoked by the se
d280: 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 2c 20 74  ssions module, t
d290: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
d2a0: 6d 65 6e 74 20 70 61 73 73 65 64 20 69 73 20 61  ment passed is a
d2b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 75 70   copy of the sup
d2c0: 70 6c 69 65 64 20 70 49 6e 20 63 6f 6e 74 65 78  plied pIn contex
d2d0: 74 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  t pointer. The s
d2e0: 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
d2f0: 6e 74 2c 20 70 44 61 74 61 2c 20 70 6f 69 6e 74  nt, pData, point
d300: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 28 2a  s to a buffer (*
d310: 70 6e 44 61 74 61 29 20 62 79 74 65 73 20 69 6e  pnData) bytes in
d320: 20 73 69 7a 65 2e 20 41 73 73 75 6d 69 6e 67 20   size. Assuming 
d330: 6e 6f 20 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  no .** error occ
d340: 75 72 73 20 74 68 65 20 78 49 6e 70 75 74 20 6d  urs the xInput m
d350: 65 74 68 6f 64 20 73 68 6f 75 6c 64 20 63 6f 70  ethod should cop
d360: 79 20 75 70 20 74 6f 20 28 2a 70 6e 44 61 74 61  y up to (*pnData
d370: 29 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  ) bytes of data 
d380: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 62 75 66  .** into the buf
d390: 66 65 72 20 61 6e 64 20 73 65 74 20 28 2a 70 6e  fer and set (*pn
d3a0: 44 61 74 61 29 20 74 6f 20 74 68 65 20 61 63 74  Data) to the act
d3b0: 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
d3c0: 74 65 73 20 63 6f 70 69 65 64 20 0a 2a 2a 20 62  tes copied .** b
d3d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
d3e0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
d3f0: 65 20 69 6e 70 75 74 20 69 73 20 63 6f 6d 70 6c  e input is compl
d400: 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2c  etely exhausted,
d410: 20 28 2a 70 6e 44 61 74 61 29 20 0a 2a 2a 20 73   (*pnData) .** s
d420: 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
d430: 7a 65 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  zero to indicate
d440: 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 61 6e   this. Or, if an
d450: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
d460: 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72  n SQLite .** err
d470: 6f 72 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62  or code should b
d480: 65 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 61  e returned. In a
d490: 6c 6c 20 63 61 73 65 73 2c 20 69 66 20 61 6e 20  ll cases, if an 
d4a0: 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b 20  xInput callback 
d4b0: 72 65 74 75 72 6e 73 0a 2a 2a 20 61 6e 20 65 72  returns.** an er
d4c0: 72 6f 72 2c 20 61 6c 6c 20 70 72 6f 63 65 73 73  ror, all process
d4d0: 69 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e 65 64  ing is abandoned
d4e0: 20 61 6e 64 20 74 68 65 20 73 74 72 65 61 6d 69   and the streami
d4f0: 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 0a  ng API function.
d500: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  ** returns a cop
d510: 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63  y of the error c
d520: 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
d530: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
d540: 63 61 73 65 20 6f 66 20 73 71 6c 69 74 65 33 63  case of sqlite3c
d550: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73  hangeset_start_s
d560: 74 72 6d 28 29 2c 20 74 68 65 20 78 49 6e 70 75  trm(), the xInpu
d570: 74 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 62  t callback may b
d580: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 62 79 20  e.** invoked by 
d590: 74 68 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64  the sessions mod
d5a0: 75 6c 65 20 61 74 20 61 6e 79 20 70 6f 69 6e 74  ule at any point
d5b0: 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
d5c0: 74 69 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69  time of the.** i
d5d0: 74 65 72 61 74 6f 72 2e 20 49 66 20 73 75 63 68  terator. If such
d5e0: 20 61 6e 20 78 49 6e 70 75 74 20 63 61 6c 6c 62   an xInput callb
d5f0: 61 63 6b 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ack returns an e
d600: 72 72 6f 72 2c 20 74 68 65 20 69 74 65 72 61 74  rror, the iterat
d610: 6f 72 20 65 6e 74 65 72 73 0a 2a 2a 20 61 6e 20  or enters.** an 
d620: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 77 68 65  error state, whe
d630: 72 65 62 79 20 61 6c 6c 20 73 75 62 73 65 71 75  reby all subsequ
d640: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 69 74 65  ent calls to ite
d650: 72 61 74 6f 72 20 66 75 6e 63 74 69 6f 6e 73 20  rator functions 
d660: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
d670: 66 61 69 6c 20 77 69 74 68 20 74 68 65 20 73 61  fail with the sa
d680: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 73  me error code as
d690: 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 49 6e   returned by xIn
d6a0: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d 69 6c  put..**.** Simil
d6b0: 61 72 6c 79 2c 20 73 74 72 65 61 6d 69 6e 67 20  arly, streaming 
d6c0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  API functions th
d6d0: 61 74 20 72 65 74 75 72 6e 20 63 68 61 6e 67 65  at return change
d6e0: 73 65 74 73 20 28 6f 72 20 70 61 74 63 68 73 65  sets (or patchse
d6f0: 74 73 29 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  ts).** return th
d700: 65 6d 20 69 6e 20 63 68 75 6e 6b 73 20 62 79 20  em in chunks by 
d710: 77 61 79 20 6f 66 20 61 20 63 61 6c 6c 62 61 63  way of a callbac
d720: 6b 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 74 65  k function inste
d730: 61 64 20 6f 66 20 76 69 61 20 61 0a 2a 2a 20 70  ad of via a.** p
d740: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
d750: 6c 65 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e  le large buffer.
d760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
d770: 20 70 61 69 72 20 6f 66 20 70 61 72 61 6d 65 74   pair of paramet
d780: 65 72 73 20 73 75 63 68 0a 2a 2a 20 61 73 3a 0a  ers such.** as:.
d790: 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20  **.**  <pre>.** 
d7a0: 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20   &nbsp;     int 
d7b0: 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a  *pnChangeset,.**
d7c0: 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69    &nbsp;     voi
d7d0: 64 20 2a 2a 70 70 43 68 61 6e 67 65 73 65 74 2c  d **ppChangeset,
d7e0: 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a  .**  </pre>.**.*
d7f0: 2a 20 49 73 20 72 65 70 6c 61 63 65 64 20 62 79  * Is replaced by
d800: 3a 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a  :.**.**  <pre>.*
d810: 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e  *  &nbsp;     in
d820: 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69  t (*xOutput)(voi
d830: 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76  d *pOut, const v
d840: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
d850: 6e 44 61 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73  nData),.**  &nbs
d860: 70 3b 20 20 20 20 20 76 6f 69 64 20 2a 70 4f 75  p;     void *pOu
d870: 74 0a 2a 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a  t.**  </pre>.**.
d880: 2a 2a 20 54 68 65 20 78 4f 75 74 70 75 74 20 63  ** The xOutput c
d890: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
d8a0: 65 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  ed zero or more 
d8b0: 74 69 6d 65 73 20 74 6f 20 72 65 74 75 72 6e 20  times to return 
d8c0: 64 61 74 61 20 74 6f 0a 2a 2a 20 74 68 65 20 61  data to.** the a
d8d0: 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68 65 20  pplication. The 
d8e0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
d8f0: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 63  passed to each c
d900: 61 6c 6c 20 69 73 20 61 20 63 6f 70 79 20 6f 66  all is a copy of
d910: 20 74 68 65 0a 2a 2a 20 70 4f 75 74 20 70 6f 69   the.** pOut poi
d920: 6e 74 65 72 20 73 75 70 70 6c 69 65 64 20 62 79  nter supplied by
d930: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
d940: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  . The second par
d950: 61 6d 65 74 65 72 2c 20 70 44 61 74 61 2c 0a 2a  ameter, pData,.*
d960: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  * points to a bu
d970: 66 66 65 72 20 6e 44 61 74 61 20 62 79 74 65 73  ffer nData bytes
d980: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
d990: 69 6e 67 20 74 68 65 20 63 68 75 6e 6b 20 6f 66  ing the chunk of
d9a0: 20 6f 75 74 70 75 74 0a 2a 2a 20 64 61 74 61 20   output.** data 
d9b0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 20  being returned. 
d9c0: 49 66 20 74 68 65 20 78 4f 75 74 70 75 74 20 63  If the xOutput c
d9d0: 61 6c 6c 62 61 63 6b 20 73 75 63 63 65 73 73 66  allback successf
d9e0: 75 6c 6c 79 20 70 72 6f 63 65 73 73 65 73 20 74  ully processes t
d9f0: 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 64  he.** supplied d
da00: 61 74 61 2c 20 69 74 20 73 68 6f 75 6c 64 20 72  ata, it should r
da10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
da20: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 75 63 63  to indicate succ
da30: 65 73 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ess. Otherwise,.
da40: 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74  ** it should ret
da50: 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 53  urn some other S
da60: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
da70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 70  . In this case p
da80: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 69 73 20  rocessing.** is 
da90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 61 6e  immediately aban
daa0: 64 6f 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74  doned and the st
dab0: 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75 6e 63  reaming API func
dac0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 63  tion returns a c
dad0: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  opy.** of the xO
dae0: 75 74 70 75 74 20 65 72 72 6f 72 20 63 6f 64 65  utput error code
daf0: 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74   to the applicat
db00: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
db10: 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 6e  essions module n
db20: 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 61 6e 20  ever invokes an 
db30: 78 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b  xOutput callback
db40: 20 77 69 74 68 20 74 68 65 20 74 68 69 72 64 20   with the third 
db50: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 73 65  .** parameter se
db60: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73  t to a value les
db70: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
db80: 74 6f 20 7a 65 72 6f 2e 20 4f 74 68 65 72 20 74  to zero. Other t
db90: 68 61 6e 20 74 68 69 73 2c 0a 2a 2a 20 6e 6f 20  han this,.** no 
dba0: 67 75 61 72 61 6e 74 65 65 73 20 61 72 65 20 6d  guarantees are m
dbb0: 61 64 65 20 61 73 20 74 6f 20 74 68 65 20 73 69  ade as to the si
dbc0: 7a 65 20 6f 66 20 74 68 65 20 63 68 75 6e 6b 73  ze of the chunks
dbd0: 20 6f 66 20 64 61 74 61 20 72 65 74 75 72 6e 65   of data returne
dbe0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
dbf0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
dc00: 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
dc10: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
dc30: 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
dc40: 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
dc50: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ndle */.  int (*
dc60: 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49  xInput)(void *pI
dc70: 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  n, void *pData, 
dc80: 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a  int *pnData), /*
dc90: 20 49 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 20   Input function 
dca0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20  */.  void *pIn, 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
dce0: 74 20 61 72 67 20 66 6f 72 20 78 49 6e 70 75 74  t arg for xInput
dcf0: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74   */.  int(*xFilt
dd00: 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  er)(.    void *p
dd10: 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
dd20: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
dd30: 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
dd40: 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63  apply() */.    c
dd50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd70: 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
dd80: 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c  ),.  int(*xConfl
dd90: 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a  ict)(.    void *
dda0: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
ddb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
ddc0: 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20  of sixth arg to 
ddd0: 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20  _apply() */.    
dde0: 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20  int eConflict,  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de00: 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20   DATA, MISSING, 
de10: 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52  CONFLICT, CONSTR
de20: 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69  AINT */.    sqli
de30: 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
de40: 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e  er *p     /* Han
de50: 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63  dle describing c
de60: 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69  hange and confli
de70: 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69  ct */.  ),.  voi
de80: 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20 20  d *pCtx         
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dea0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
deb0: 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69  assed to xConfli
dec0: 63 74 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c  ct */.);.int sql
ded0: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
dee0: 6e 63 61 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74  ncat_strm(.  int
def0: 20 28 2a 78 49 6e 70 75 74 41 29 28 76 6f 69 64   (*xInputA)(void
df00: 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61   *pIn, void *pDa
df10: 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29  ta, int *pnData)
df20: 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 41 2c 0a  ,.  void *pInA,.
df30: 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 42 29    int (*xInputB)
df40: 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
df50: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
df60: 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
df70: 49 6e 42 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75  InB,.  int (*xOu
df80: 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74  tput)(void *pOut
df90: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44  , const void *pD
dfa0: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c  ata, int nData),
dfb0: 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b  .  void *pOut.);
dfc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
dfd0: 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 73 74 72  geset_invert_str
dfe0: 6d 28 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75  m(.  int (*xInpu
dff0: 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  t)(void *pIn, vo
e000: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
e010: 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20  pnData),.  void 
e020: 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f  *pIn,.  int (*xO
e030: 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
e040: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
e050: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
e060: 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29  ,.  void *pOut.)
e070: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  ;.int sqlite3cha
e080: 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72  ngeset_start_str
e090: 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  m(.  sqlite3_cha
e0a0: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70  ngeset_iter **pp
e0b0: 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  ,.  int (*xInput
e0c0: 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
e0d0: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
e0e0: 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
e0f0: 70 49 6e 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  pIn.);.int sqlit
e100: 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65  e3session_change
e110: 73 65 74 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69  set_strm(.  sqli
e120: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
e130: 73 73 69 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78  ssion,.  int (*x
e140: 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f  Output)(void *pO
e150: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
e160: 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
e170: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a  ),.  void *pOut.
e180: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  );.int sqlite3se
e190: 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 5f 73  ssion_patchset_s
e1a0: 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 73  trm(.  sqlite3_s
e1b0: 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
e1c0: 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75  ,.  int (*xOutpu
e1d0: 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
e1e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
e1f0: 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20  , int nData),.  
e200: 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e  void *pOut.);.in
e210: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  t sqlite3changeg
e220: 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 73 71  roup_add_strm(sq
e230: 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75  lite3_changegrou
e240: 70 2a 2c 20 0a 20 20 20 20 69 6e 74 20 28 2a 78  p*, .    int (*x
e250: 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e  Input)(void *pIn
e260: 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  , void *pData, i
e270: 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 20  nt *pnData),.   
e280: 20 76 6f 69 64 20 2a 70 49 6e 0a 29 3b 0a 69 6e   void *pIn.);.in
e290: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  t sqlite3changeg
e2a0: 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73 74 72 6d  roup_output_strm
e2b0: 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67  (sqlite3_changeg
e2c0: 72 6f 75 70 2a 2c 0a 20 20 20 20 69 6e 74 20 28  roup*,.    int (
e2d0: 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
e2e0: 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
e2f0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
e300: 74 61 29 2c 20 0a 20 20 20 20 76 6f 69 64 20 2a  ta), .    void *
e310: 70 4f 75 74 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  pOut.);.../*.** 
e320: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63 61 6e  Make sure we can
e330: 20 63 61 6c 6c 20 74 68 69 73 20 73 74 75 66 66   call this stuff
e340: 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f 0a 23 69   from C++..*/.#i
e350: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
e360: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
e370: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  f  /* SQLITE_ENA
e380: 42 4c 45 5f 53 45 53 53 49 4f 4e 20 26 26 20 53  BLE_SESSION && S
e390: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
e3a0: 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.