/ Hex Artifact Content
Login

Artifact d9ebd8d4c5791aafdf18165575c7f2223c09279b:


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 46 6f 6c 6c 6f 77 69  I..**.** Followi
2350: 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
2360: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
2370: 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 74 68 65  ction, it is the
2380: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2390: 6f 66 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  of.** the caller
23a0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
23b0: 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20 74  ree the buffer t
23c0: 68 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74  hat *ppChangeset
23d0: 20 70 6f 69 6e 74 73 20 74 6f 20 75 73 69 6e 67   points to using
23e0: 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 5f 66 72 65  .** [sqlite3_fre
23f0: 65 28 29 5d 2e 0a 2a 2a 0a 2a 2a 20 3c 68 33 3e  e()]..**.** <h3>
2400: 43 68 61 6e 67 65 73 65 74 20 47 65 6e 65 72 61  Changeset Genera
2410: 74 69 6f 6e 3c 2f 68 33 3e 0a 2a 2a 0a 2a 2a 20  tion</h3>.**.** 
2420: 4f 6e 63 65 20 61 20 74 61 62 6c 65 20 68 61 73  Once a table has
2430: 20 62 65 65 6e 20 61 74 74 61 63 68 65 64 20 74   been attached t
2440: 6f 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  o a session obje
2450: 63 74 2c 20 74 68 65 20 73 65 73 73 69 6f 6e 20  ct, the session 
2460: 6f 62 6a 65 63 74 0a 2a 2a 20 72 65 63 6f 72 64  object.** record
2470: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
2480: 79 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20  y values of all 
2490: 6e 65 77 20 72 6f 77 73 20 69 6e 73 65 72 74 65  new rows inserte
24a0: 64 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  d into the table
24b0: 2e 0a 2a 2a 20 49 74 20 61 6c 73 6f 20 72 65 63  ..** It also rec
24c0: 6f 72 64 73 20 74 68 65 20 6f 72 69 67 69 6e 61  ords the origina
24d0: 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e  l primary key an
24e0: 64 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 76  d other column v
24f0: 61 6c 75 65 73 20 6f 66 20 61 6e 79 0a 2a 2a 20  alues of any.** 
2500: 64 65 6c 65 74 65 64 20 6f 72 20 75 70 64 61 74  deleted or updat
2510: 65 64 20 72 6f 77 73 2e 20 46 6f 72 20 65 61 63  ed rows. For eac
2520: 68 20 75 6e 69 71 75 65 20 70 72 69 6d 61 72 79  h unique primary
2530: 20 6b 65 79 20 76 61 6c 75 65 2c 20 64 61 74 61   key value, data
2540: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 65 63 6f   is only.** reco
2550: 72 64 65 64 20 6f 6e 63 65 20 2d 20 74 68 65 20  rded once - the 
2560: 66 69 72 73 74 20 74 69 6d 65 20 61 20 72 6f 77  first time a row
2570: 20 77 69 74 68 20 73 61 69 64 20 70 72 69 6d 61   with said prima
2580: 72 79 20 6b 65 79 20 69 73 20 69 6e 73 65 72 74  ry key is insert
2590: 65 64 2c 0a 2a 2a 20 75 70 64 61 74 65 64 20 6f  ed,.** updated o
25a0: 72 20 64 65 6c 65 74 65 64 20 69 6e 20 74 68 65  r deleted in the
25b0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65   lifetime of the
25c0: 20 73 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20   session..**.** 
25d0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
25e0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 70 72  eption to the pr
25f0: 65 76 69 6f 75 73 20 70 61 72 61 67 72 61 70 68  evious paragraph
2600: 3a 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  : when a row is 
2610: 69 6e 73 65 72 74 65 64 2c 0a 2a 2a 20 75 70 64  inserted,.** upd
2620: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2c  ated or deleted,
2630: 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
2640: 6f 66 20 69 74 73 20 70 72 69 6d 61 72 79 20 6b  of its primary k
2650: 65 79 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74 61  ey columns conta
2660: 69 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  in a.** NULL val
2670: 75 65 2c 20 6e 6f 20 72 65 63 6f 72 64 20 6f 66  ue, no record of
2680: 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 6d   the change is m
2690: 61 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ade..**.** The s
26a0: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 68  ession object th
26b0: 65 72 65 66 6f 72 65 20 61 63 63 75 6d 75 6c 61  erefore accumula
26c0: 74 65 73 20 74 77 6f 20 74 79 70 65 73 20 6f 66  tes two types of
26d0: 20 72 65 63 6f 72 64 73 20 2d 20 74 68 6f 73 65   records - those
26e0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 73 69 73 74  .** that consist
26f0: 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
2700: 76 61 6c 75 65 73 20 6f 6e 6c 79 20 28 63 72 65  values only (cre
2710: 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  ated when the us
2720: 65 72 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20  er inserts.** a 
2730: 6e 65 77 20 72 65 63 6f 72 64 29 20 61 6e 64 20  new record) and 
2740: 74 68 6f 73 65 20 74 68 61 74 20 63 6f 6e 73 69  those that consi
2750: 73 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  st of the primar
2760: 79 20 6b 65 79 20 76 61 6c 75 65 73 20 61 6e 64  y key values and
2770: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2780: 20 76 61 6c 75 65 73 20 6f 66 20 6f 74 68 65 72   values of other
2790: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 28   table columns (
27a0: 63 72 65 61 74 65 64 20 77 68 65 6e 20 74 68 65  created when the
27b0: 20 75 73 65 72 73 20 64 65 6c 65 74 65 73 0a 2a   users deletes.*
27c0: 2a 20 6f 72 20 75 70 64 61 74 65 73 20 61 20 72  * or updates a r
27d0: 65 63 6f 72 64 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ecord)..**.** Wh
27e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27f0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
2800: 72 65 71 75 65 73 74 65 64 20 63 68 61 6e 67 65  requested change
2810: 73 65 74 20 69 73 20 63 72 65 61 74 65 64 20 75  set is created u
2820: 73 69 6e 67 0a 2a 2a 20 62 6f 74 68 20 74 68 65  sing.** both the
2830: 20 61 63 63 75 6d 75 6c 61 74 65 64 20 72 65 63   accumulated rec
2840: 6f 72 64 73 20 61 6e 64 20 74 68 65 20 63 75 72  ords and the cur
2850: 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
2860: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2870: 20 66 69 6c 65 2e 20 53 70 65 63 69 66 69 63 61   file. Specifica
2880: 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  lly:.**.** <ul>.
2890: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
28a0: 63 68 20 72 65 63 6f 72 64 20 67 65 6e 65 72 61  ch record genera
28b0: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 65 72 74  ted by an insert
28c0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  , the database i
28d0: 73 20 71 75 65 72 69 65 64 0a 2a 2a 20 20 20 20  s queried.**    
28e0: 20 20 20 20 66 6f 72 20 61 20 72 6f 77 20 77 69      for a row wi
28f0: 74 68 20 61 20 6d 61 74 63 68 69 6e 67 20 70 72  th a matching pr
2900: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 6f 6e  imary key. If on
2910: 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 49  e is found, an I
2920: 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20 20 20 20  NSERT.**        
2930: 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64 20  change is added 
2940: 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  to the changeset
2950: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 72 6f 77  . If no such row
2960: 20 69 73 20 66 6f 75 6e 64 2c 20 6e 6f 20 63 68   is found, no ch
2970: 61 6e 67 65 20 0a 2a 2a 20 20 20 20 20 20 20 20  ange .**        
2980: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2990: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a 2a  changeset..**.**
29a0: 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68     <li> For each
29b0: 20 72 65 63 6f 72 64 20 67 65 6e 65 72 61 74 65   record generate
29c0: 64 20 62 79 20 61 6e 20 75 70 64 61 74 65 20 6f  d by an update o
29d0: 72 20 64 65 6c 65 74 65 2c 20 74 68 65 20 64 61  r delete, the da
29e0: 74 61 62 61 73 65 20 69 73 20 0a 2a 2a 20 20 20  tabase is .**   
29f0: 20 20 20 20 20 71 75 65 72 69 65 64 20 66 6f 72       queried for
2a00: 20 61 20 72 6f 77 20 77 69 74 68 20 61 20 6d 61   a row with a ma
2a10: 74 63 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  tching primary k
2a20: 65 79 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f  ey. If such a ro
2a30: 77 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 66  w is.**        f
2a40: 6f 75 6e 64 20 61 6e 64 20 6f 6e 65 20 6f 72 20  ound and one or 
2a50: 6d 6f 72 65 20 6f 66 20 74 68 65 20 6e 6f 6e 2d  more of the non-
2a60: 70 72 69 6d 61 72 79 20 6b 65 79 20 66 69 65 6c  primary key fiel
2a70: 64 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ds have been.** 
2a80: 20 20 20 20 20 20 20 6d 6f 64 69 66 69 65 64 20         modified 
2a90: 66 72 6f 6d 20 74 68 65 69 72 20 6f 72 69 67 69  from their origi
2aa0: 6e 61 6c 20 76 61 6c 75 65 73 2c 20 61 6e 20 55  nal values, an U
2ab0: 50 44 41 54 45 20 63 68 61 6e 67 65 20 69 73 20  PDATE change is 
2ac0: 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  added to .**    
2ad0: 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 65      the changese
2ae0: 74 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63  t. Or, if no suc
2af0: 68 20 72 6f 77 20 69 73 20 66 6f 75 6e 64 20 69  h row is found i
2b00: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 20 44  n the table, a D
2b10: 45 4c 45 54 45 20 0a 2a 2a 20 20 20 20 20 20 20  ELETE .**       
2b20: 20 63 68 61 6e 67 65 20 69 73 20 61 64 64 65 64   change is added
2b30: 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 73 65   to the changese
2b40: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
2b50: 20 72 6f 77 20 77 69 74 68 20 61 20 6d 61 74 63   row with a matc
2b60: 68 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 70  hing.**        p
2b70: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 20 74 68  rimary key in th
2b80: 65 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20  e database, but 
2b90: 61 6c 6c 20 66 69 65 6c 64 73 20 63 6f 6e 74 61  all fields conta
2ba0: 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
2bb0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 76 61 6c 75  l.**        valu
2bc0: 65 73 2c 20 6e 6f 20 63 68 61 6e 67 65 20 69 73  es, no change is
2bd0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68   added to the ch
2be0: 61 6e 67 65 73 65 74 2e 0a 2a 2a 20 3c 2f 75 6c  angeset..** </ul
2bf0: 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  >.**.** This mea
2c00: 6e 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  ns, amongst othe
2c10: 72 20 74 68 69 6e 67 73 2c 20 74 68 61 74 20 69  r things, that i
2c20: 66 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72  f a row is inser
2c30: 74 65 64 20 61 6e 64 20 74 68 65 6e 20 6c 61 74  ted and then lat
2c40: 65 72 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  er.** deleted wh
2c50: 69 6c 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62  ile a session ob
2c60: 6a 65 63 74 20 69 73 20 61 63 74 69 76 65 2c 20  ject is active, 
2c70: 6e 65 69 74 68 65 72 20 74 68 65 20 69 6e 73 65  neither the inse
2c80: 72 74 20 6e 6f 72 20 74 68 65 20 64 65 6c 65 74  rt nor the delet
2c90: 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 72 65  e.** will be pre
2ca0: 73 65 6e 74 20 69 6e 20 74 68 65 20 63 68 61 6e  sent in the chan
2cb0: 67 65 73 65 74 2e 20 4f 72 20 69 66 20 61 20 72  geset. Or if a r
2cc0: 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  ow is deleted an
2cd0: 64 20 74 68 65 6e 20 6c 61 74 65 72 20 61 20 0a  d then later a .
2ce0: 2a 2a 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  ** row with the 
2cf0: 73 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79  same primary key
2d00: 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65 64   values inserted
2d10: 20 77 68 69 6c 65 20 61 20 73 65 73 73 69 6f 6e   while a session
2d20: 20 6f 62 6a 65 63 74 20 69 73 0a 2a 2a 20 61 63   object is.** ac
2d30: 74 69 76 65 2c 20 74 68 65 20 72 65 73 75 6c 74  tive, the result
2d40: 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 77 69  ing changeset wi
2d50: 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 6e 20 55 50  ll contain an UP
2d60: 44 41 54 45 20 63 68 61 6e 67 65 20 69 6e 73 74  DATE change inst
2d70: 65 61 64 20 6f 66 0a 2a 2a 20 61 20 44 45 4c 45  ead of.** a DELE
2d80: 54 45 20 61 6e 64 20 61 6e 20 49 4e 53 45 52 54  TE and an INSERT
2d90: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 73  ..**.** When a s
2da0: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73  ession object is
2db0: 20 64 69 73 61 62 6c 65 64 20 28 73 65 65 20 74   disabled (see t
2dc0: 68 65 20 5b 73 71 6c 69 74 65 33 73 65 73 73 69  he [sqlite3sessi
2dd0: 6f 6e 5f 65 6e 61 62 6c 65 28 29 5d 20 41 50 49  on_enable()] API
2de0: 29 2c 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f  ),.** it does no
2df0: 74 20 61 63 63 75 6d 75 6c 61 74 65 20 72 65 63  t accumulate rec
2e00: 6f 72 64 73 20 77 68 65 6e 20 72 6f 77 73 20 61  ords when rows a
2e10: 72 65 20 69 6e 73 65 72 74 65 64 2c 20 75 70 64  re inserted, upd
2e20: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  ated or deleted.
2e30: 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 61 70 70  .** This may app
2e40: 65 61 72 20 74 6f 20 68 61 76 65 20 73 6f 6d 65  ear to have some
2e50: 20 63 6f 75 6e 74 65 72 2d 69 6e 74 75 69 74 69   counter-intuiti
2e60: 76 65 20 65 66 66 65 63 74 73 20 69 66 20 61 20  ve effects if a 
2e70: 73 69 6e 67 6c 65 20 72 6f 77 0a 2a 2a 20 69 73  single row.** is
2e80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6d 6f 72 65   written to more
2e90: 20 74 68 61 6e 20 6f 6e 63 65 20 64 75 72 69 6e   than once durin
2ea0: 67 20 61 20 73 65 73 73 69 6f 6e 2e 20 46 6f 72  g a session. For
2eb0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 72   example, if a r
2ec0: 6f 77 0a 2a 2a 20 69 73 20 69 6e 73 65 72 74 65  ow.** is inserte
2ed0: 64 20 77 68 69 6c 65 20 61 20 73 65 73 73 69 6f  d while a sessio
2ee0: 6e 20 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62  n object is enab
2ef0: 6c 65 64 2c 20 74 68 65 6e 20 6c 61 74 65 72 20  led, then later 
2f00: 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 0a 2a  deleted while .*
2f10: 2a 20 74 68 65 20 73 61 6d 65 20 73 65 73 73 69  * the same sessi
2f20: 6f 6e 20 6f 62 6a 65 63 74 20 69 73 20 64 69 73  on object is dis
2f30: 61 62 6c 65 64 2c 20 6e 6f 20 49 4e 53 45 52 54  abled, no INSERT
2f40: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 61 70 70   record will app
2f50: 65 61 72 20 69 6e 20 74 68 65 0a 2a 2a 20 63 68  ear in the.** ch
2f60: 61 6e 67 65 73 65 74 2c 20 65 76 65 6e 20 74 68  angeset, even th
2f70: 6f 75 67 68 20 74 68 65 20 64 65 6c 65 74 65 20  ough the delete 
2f80: 74 6f 6f 6b 20 70 6c 61 63 65 20 77 68 69 6c 65  took place while
2f90: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 77 61 73   the session was
2fa0: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 20 4f 72   disabled..** Or
2fb0: 2c 20 69 66 20 6f 6e 65 20 66 69 65 6c 64 20 6f  , if one field o
2fc0: 66 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  f a row is updat
2fd0: 65 64 20 77 68 69 6c 65 20 61 20 73 65 73 73 69  ed while a sessi
2fe0: 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  on is disabled, 
2ff0: 61 6e 64 20 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  and .** another 
3000: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 61 6d  field of the sam
3010: 65 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  e row is updated
3020: 20 77 68 69 6c 65 20 74 68 65 20 73 65 73 73 69   while the sessi
3030: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
3040: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20  he.** resulting 
3050: 63 68 61 6e 67 65 73 65 74 20 77 69 6c 6c 20 63  changeset will c
3060: 6f 6e 74 61 69 6e 20 61 6e 20 55 50 44 41 54 45  ontain an UPDATE
3070: 20 63 68 61 6e 67 65 20 74 68 61 74 20 75 70 64   change that upd
3080: 61 74 65 73 20 62 6f 74 68 20 66 69 65 6c 64 73  ates both fields
3090: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30a0: 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
30b0: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  t(.  sqlite3_ses
30c0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
30d0: 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20       /* Session 
30e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
30f0: 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20  *pnChangeset,   
3100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3110: 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  UT: Size of buff
3120: 65 72 20 61 74 20 2a 70 70 43 68 61 6e 67 65 73  er at *ppChanges
3130: 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  et */.  void **p
3140: 70 43 68 61 6e 67 65 73 65 74 20 20 20 20 20 20  pChangeset      
3150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3160: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3170: 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29  g changeset */.)
3180: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  ;../*.** CAPI3RE
3190: 46 3a 20 4c 6f 61 64 20 54 68 65 20 44 69 66 66  F: Load The Diff
31a0: 65 72 65 6e 63 65 20 42 65 74 77 65 65 6e 20 54  erence Between T
31b0: 61 62 6c 65 73 20 49 6e 74 6f 20 41 20 53 65 73  ables Into A Ses
31c0: 73 69 6f 6e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 69  sion .**.** If i
31d0: 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
31e0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
31f0: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
3200: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3210: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
3220: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
3230: 74 74 61 63 68 65 73 20 74 61 62 6c 65 20 7a 54  ttaches table zT
3240: 62 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6d  bl in the same m
3250: 61 6e 6e 65 72 20 61 73 20 74 68 65 0a 2a 2a 20  anner as the.** 
3260: 5b 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f  [sqlite3session_
3270: 61 74 74 61 63 68 28 29 5d 20 66 75 6e 63 74 69  attach()] functi
3280: 6f 6e 2e 20 49 66 20 7a 54 62 6c 20 64 6f 65 73  on. If zTbl does
3290: 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
32a0: 66 20 69 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  f it.** does not
32b0: 20 68 61 76 65 20 61 20 70 72 69 6d 61 72 79 20   have a primary 
32c0: 6b 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  key, this functi
32d0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 62  on is a no-op (b
32e0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  ut does not retu
32f0: 72 6e 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 29 2e  rn.** an error).
3300: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
3310: 7a 46 72 6f 6d 44 62 20 6d 75 73 74 20 62 65 20  zFromDb must be 
3320: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
3330: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
3340: 22 74 65 6d 70 22 20 65 74 63 2e 29 0a 2a 2a 20  "temp" etc.).** 
3350: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
3360: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 68 61  same database ha
3370: 6e 64 6c 65 20 61 73 20 74 68 65 20 73 65 73 73  ndle as the sess
3380: 69 6f 6e 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ion object that 
3390: 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 74  contains .** a t
33a0: 61 62 6c 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  able compatible 
33b0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
33c0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
33d0: 65 73 73 69 6f 6e 20 62 79 20 74 68 69 73 20 66  ession by this f
33e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 41 20 74 61  unction..** A ta
33f0: 62 6c 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ble is considere
3400: 64 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 66 20  d compatible if 
3410: 69 74 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a  it:.**.** <ul>.*
3420: 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20 74 68 65  *   <li> Has the
3430: 20 73 61 6d 65 20 6e 61 6d 65 2c 0a 2a 2a 20 20   same name,.**  
3440: 20 3c 6c 69 3e 20 48 61 73 20 74 68 65 20 73 61   <li> Has the sa
3450: 6d 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  me set of column
3460: 73 20 64 65 63 6c 61 72 65 64 20 69 6e 20 74 68  s declared in th
3470: 65 20 73 61 6d 65 20 6f 72 64 65 72 2c 20 61 6e  e same order, an
3480: 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 48 61 73 20  d.**   <li> Has 
3490: 74 68 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59  the same PRIMARY
34a0: 20 4b 45 59 20 64 65 66 69 6e 69 74 69 6f 6e 2e   KEY definition.
34b0: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
34c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
34d0: 64 73 20 61 20 73 65 74 20 6f 66 20 63 68 61 6e  ds a set of chan
34e0: 67 65 73 20 74 6f 20 74 68 65 20 73 65 73 73 69  ges to the sessi
34f0: 6f 6e 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  on object that c
3500: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20  ould be.** used 
3510: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 61  to update the ta
3520: 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
3530: 7a 46 72 6f 6d 20 28 63 61 6c 6c 20 74 68 69 73  zFrom (call this
3540: 20 74 68 65 20 22 66 72 6f 6d 2d 74 61 62 6c 65   the "from-table
3550: 22 29 20 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ") .** so that i
3560: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 74 68  ts content is th
3570: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 74 61  e same as the ta
3580: 62 6c 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  ble attached to 
3590: 74 68 65 20 73 65 73 73 69 6f 6e 20 0a 2a 2a 20  the session .** 
35a0: 6f 62 6a 65 63 74 20 28 63 61 6c 6c 20 74 68 69  object (call thi
35b0: 73 20 74 68 65 20 22 74 6f 2d 74 61 62 6c 65 22  s the "to-table"
35c0: 29 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a  ). Specifically:
35d0: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 20  .**.** <ul>.**  
35e0: 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72   <li> For each r
35f0: 6f 77 20 28 70 72 69 6d 61 72 79 20 6b 65 79 29  ow (primary key)
3600: 20 74 68 61 74 20 65 78 69 73 74 73 20 69 6e 20   that exists in 
3610: 74 68 65 20 74 6f 2d 74 61 62 6c 65 20 62 75 74  the to-table but
3620: 20 6e 6f 74 20 69 6e 20 0a 2a 2a 20 20 20 20 20   not in .**     
3630: 74 68 65 20 66 72 6f 6d 2d 74 61 62 6c 65 2c 20  the from-table, 
3640: 61 6e 20 49 4e 53 45 52 54 20 72 65 63 6f 72 64  an INSERT record
3650: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
3660: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e   session object.
3670: 0a 2a 2a 0a 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f  .**.**   <li> Fo
3680: 72 20 65 61 63 68 20 72 6f 77 20 28 70 72 69 6d  r each row (prim
3690: 61 72 79 20 6b 65 79 29 20 74 68 61 74 20 65 78  ary key) that ex
36a0: 69 73 74 73 20 69 6e 20 74 68 65 20 74 6f 2d 74  ists in the to-t
36b0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 69 6e 20  able but not in 
36c0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72 6f 6d  .**     the from
36d0: 2d 74 61 62 6c 65 2c 20 61 20 44 45 4c 45 54 45  -table, a DELETE
36e0: 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
36f0: 20 74 6f 20 74 68 65 20 73 65 73 73 69 6f 6e 20   to the session 
3700: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  object..**.**   
3710: 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 72 6f  <li> For each ro
3720: 77 20 28 70 72 69 6d 61 72 79 20 6b 65 79 29 20  w (primary key) 
3730: 74 68 61 74 20 65 78 69 73 74 73 20 69 6e 20 62  that exists in b
3740: 6f 74 68 20 74 61 62 6c 65 73 2c 20 62 75 74 20  oth tables, but 
3750: 66 65 61 74 75 72 65 73 20 0a 2a 2a 20 20 20 20  features .**    
3760: 20 64 69 66 66 65 72 65 6e 74 20 69 6e 20 65 61   different in ea
3770: 63 68 2c 20 61 6e 20 55 50 44 41 54 45 20 72 65  ch, an UPDATE re
3780: 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
3790: 20 74 68 65 20 73 65 73 73 69 6f 6e 2e 0a 2a 2a   the session..**
37a0: 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 6f 20   </ul>.**.** To 
37b0: 63 6c 61 72 69 66 79 2c 20 69 66 20 74 68 69 73  clarify, if this
37c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37d0: 6c 65 64 20 61 6e 64 20 74 68 65 6e 20 61 20 63  led and then a c
37e0: 68 61 6e 67 65 73 65 74 20 63 6f 6e 73 74 72 75  hangeset constru
37f0: 63 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 5b 73  cted.** using [s
3800: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
3810: 61 6e 67 65 73 65 74 28 29 5d 2c 20 74 68 65 6e  angeset()], then
3820: 20 61 66 74 65 72 20 61 70 70 6c 79 69 6e 67 20   after applying 
3830: 74 68 61 74 20 63 68 61 6e 67 65 73 65 74 20 74  that changeset t
3840: 6f 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 7a  o .** database z
3850: 46 72 6f 6d 20 74 68 65 20 63 6f 6e 74 65 6e 74  From the content
3860: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 63 6f 6d  s of the two com
3870: 70 61 74 69 62 6c 65 20 74 61 62 6c 65 73 20 77  patible tables w
3880: 6f 75 6c 64 20 62 65 20 0a 2a 2a 20 69 64 65 6e  ould be .** iden
3890: 74 69 63 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  tical..**.** It 
38a0: 61 6e 20 65 72 72 6f 72 20 69 66 20 64 61 74 61  an error if data
38b0: 62 61 73 65 20 7a 46 72 6f 6d 20 64 6f 65 73 20  base zFrom does 
38c0: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 64 6f 65  not exist or doe
38d0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68  s not contain th
38e0: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 63 6f  e.** required co
38f0: 6d 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2e 0a  mpatible table..
3900: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  **.** If the ope
3910: 72 61 74 69 6f 6e 20 73 75 63 63 65 73 73 66 75  ration successfu
3920: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
3930: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
3940: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ise, an SQLite.*
3950: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e  * error code. In
3960: 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 61   this case, if a
3970: 72 67 75 6d 65 6e 74 20 70 7a 45 72 72 4d 73 67  rgument pzErrMsg
3980: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70   is not NULL, *p
3990: 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
39a0: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
39b0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
39c0: 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
39d0: 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
39e0: 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
39f0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
3a00: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
3a10: 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 69 73  ler to free this
3a20: 20 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a 2a   buffer using.**
3a30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
3a40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .*/.int sqlite3s
3a50: 65 73 73 69 6f 6e 5f 64 69 66 66 28 0a 20 20 73  ession_diff(.  s
3a60: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
3a70: 70 53 65 73 73 69 6f 6e 2c 0a 20 20 63 6f 6e 73  pSession,.  cons
3a80: 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 44 62 2c  t char *zFromDb,
3a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3aa0: 54 62 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Tbl,.  char **pz
3ab0: 45 72 72 4d 73 67 0a 29 3b 0a 0a 0a 2f 2a 0a 2a  ErrMsg.);.../*.*
3ac0: 2a 20 43 41 50 49 33 52 45 46 3a 20 47 65 6e 65  * CAPI3REF: Gene
3ad0: 72 61 74 65 20 41 20 50 61 74 63 68 73 65 74 20  rate A Patchset 
3ae0: 46 72 6f 6d 20 41 20 53 65 73 73 69 6f 6e 20 4f  From A Session O
3af0: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
3b00: 64 69 66 66 65 72 65 6e 63 65 73 20 62 65 74 77  differences betw
3b10: 65 65 6e 20 61 20 70 61 74 63 68 73 65 74 20 61  een a patchset a
3b20: 6e 64 20 61 20 63 68 61 6e 67 65 73 65 74 20 61  nd a changeset a
3b30: 72 65 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 3c  re that:.**.** <
3b40: 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 44 45  ul>.**   <li> DE
3b50: 4c 45 54 45 20 72 65 63 6f 72 64 73 20 63 6f 6e  LETE records con
3b60: 73 69 73 74 20 6f 66 20 74 68 65 20 70 72 69 6d  sist of the prim
3b70: 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20 6f  ary key fields o
3b80: 6e 6c 79 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20  nly. The .**    
3b90: 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c      original val
3ba0: 75 65 73 20 6f 66 20 6f 74 68 65 72 20 66 69 65  ues of other fie
3bb0: 6c 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  lds are omitted.
3bc0: 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65 20 6f  .**   <li> The o
3bd0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 6f  riginal values o
3be0: 66 20 61 6e 79 20 6d 6f 64 69 66 69 65 64 20 66  f any modified f
3bf0: 69 65 6c 64 73 20 61 72 65 20 6f 6d 69 74 74 65  ields are omitte
3c00: 64 20 66 72 6f 6d 20 0a 2a 2a 20 20 20 20 20 20  d from .**      
3c10: 20 20 55 50 44 41 54 45 20 72 65 63 6f 72 64 73    UPDATE records
3c20: 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a  ..** </ul>.**.**
3c30: 20 41 20 70 61 74 63 68 73 65 74 20 62 6c 6f 62   A patchset blob
3c40: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3c50: 68 20 75 70 20 74 6f 20 64 61 74 65 20 76 65 72  h up to date ver
3c60: 73 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 0a 2a 2a  sions of all .**
3c70: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
3c80: 74 5f 78 78 78 20 41 50 49 20 66 75 6e 63 74 69  t_xxx API functi
3c90: 6f 6e 73 20 65 78 63 65 70 74 20 66 6f 72 20 73  ons except for s
3ca0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
3cb0: 69 6e 76 65 72 74 28 29 2c 20 0a 2a 2a 20 77 68  invert(), .** wh
3cc0: 69 63 68 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ich returns SQLI
3cd0: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 69 74  TE_CORRUPT if it
3ce0: 20 69 73 20 70 61 73 73 65 64 20 61 20 70 61 74   is passed a pat
3cf0: 63 68 73 65 74 2e 20 53 69 6d 69 6c 61 72 6c 79  chset. Similarly
3d00: 2c 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  ,.** attempting 
3d10: 74 6f 20 75 73 65 20 61 20 70 61 74 63 68 73 65  to use a patchse
3d20: 74 20 62 6c 6f 62 20 77 69 74 68 20 6f 6c 64 20  t blob with old 
3d30: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  versions of the.
3d40: 2a 2a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  ** sqlite3change
3d50: 73 65 74 5f 78 78 78 20 41 50 49 73 20 61 6c 73  set_xxx APIs als
3d60: 6f 20 70 72 6f 76 6f 6b 65 73 20 61 6e 20 53 51  o provokes an SQ
3d70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
3d80: 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  or. .**.** Becau
3d90: 73 65 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61  se the non-prima
3da0: 72 79 20 6b 65 79 20 22 6f 6c 64 2e 2a 22 20 66  ry key "old.*" f
3db0: 69 65 6c 64 73 20 61 72 65 20 6f 6d 69 74 74 65  ields are omitte
3dc0: 64 2c 20 6e 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  d, no .** SQLITE
3dd0: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
3de0: 63 6f 6e 66 6c 69 63 74 73 20 63 61 6e 20 62 65  conflicts can be
3df0: 20 64 65 74 65 63 74 65 64 20 6f 72 20 72 65 70   detected or rep
3e00: 6f 72 74 65 64 20 69 66 20 61 20 70 61 74 63 68  orted if a patch
3e10: 73 65 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  set.** is passed
3e20: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 63   to the sqlite3c
3e30: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
3e40: 20 41 50 49 2e 20 4f 74 68 65 72 20 63 6f 6e 66   API. Other conf
3e50: 6c 69 63 74 20 74 79 70 65 73 20 77 6f 72 6b 0a  lict types work.
3e60: 2a 2a 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ** in the same w
3e70: 61 79 20 61 73 20 66 6f 72 20 63 68 61 6e 67 65  ay as for change
3e80: 73 65 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sets..*/.int sql
3e90: 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63  ite3session_patc
3ea0: 68 73 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f  hset(.  sqlite3_
3eb0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
3ec0: 6e 2c 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69  n,      /* Sessi
3ed0: 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  on object */.  i
3ee0: 6e 74 20 2a 70 6e 50 61 74 63 68 73 65 74 2c 20  nt *pnPatchset, 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f00: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62  * OUT: Size of b
3f10: 75 66 66 65 72 20 61 74 20 2a 70 70 43 68 61 6e  uffer at *ppChan
3f20: 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20  geset */.  void 
3f30: 2a 2a 70 70 50 61 74 63 68 73 65 74 20 20 20 20  **ppPatchset    
3f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
3f50: 54 3a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  T: Buffer contai
3f60: 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
3f70: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
3f80: 33 52 45 46 3a 20 54 65 73 74 20 69 66 20 61 20  3REF: Test if a 
3f90: 63 68 61 6e 67 65 73 65 74 20 68 61 73 20 72 65  changeset has re
3fa0: 63 6f 72 64 65 64 20 61 6e 79 20 63 68 61 6e 67  corded any chang
3fb0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
3fc0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6e 6f 20   non-zero if no 
3fd0: 63 68 61 6e 67 65 73 20 74 6f 20 61 74 74 61 63  changes to attac
3fe0: 68 65 64 20 74 61 62 6c 65 73 20 68 61 76 65 20  hed tables have 
3ff0: 62 65 65 6e 20 72 65 63 6f 72 64 65 64 20 62 79  been recorded by
4000: 20 0a 2a 2a 20 74 68 65 20 73 65 73 73 69 6f 6e   .** the session
4010: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
4020: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
4030: 6d 65 6e 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  ment. Otherwise,
4040: 20 69 66 20 6f 6e 65 20 6f 72 20 0a 2a 2a 20 6d   if one or .** m
4050: 6f 72 65 20 63 68 61 6e 67 65 73 20 68 61 76 65  ore changes have
4060: 20 62 65 65 6e 20 72 65 63 6f 72 64 65 64 2c 20   been recorded, 
4070: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a  return zero..**.
4080: 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 69 73 20  ** Even if this 
4090: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
40a0: 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 70 6f 73   zero, it is pos
40b0: 73 69 62 6c 65 20 74 68 61 74 20 63 61 6c 6c 69  sible that calli
40c0: 6e 67 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 73 65  ng.** [sqlite3se
40d0: 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28  ssion_changeset(
40e0: 29 5d 20 6f 6e 20 74 68 65 20 73 65 73 73 69 6f  )] on the sessio
40f0: 6e 20 68 61 6e 64 6c 65 20 6d 61 79 20 73 74 69  n handle may sti
4100: 6c 6c 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 63  ll return a.** c
4110: 68 61 6e 67 65 73 65 74 20 74 68 61 74 20 63 6f  hangeset that co
4120: 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 6e 67 65  ntains no change
4130: 73 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  s. This can happ
4140: 65 6e 20 77 68 65 6e 20 61 20 72 6f 77 20 69 6e  en when a row in
4150: 20 0a 2a 2a 20 61 6e 20 61 74 74 61 63 68 65 64   .** an attached
4160: 20 74 61 62 6c 65 20 69 73 20 6d 6f 64 69 66 69   table is modifi
4170: 65 64 20 61 6e 64 20 74 68 65 6e 20 6c 61 74 65  ed and then late
4180: 72 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r on the origina
4190: 6c 20 76 61 6c 75 65 73 20 0a 2a 2a 20 61 72 65  l values .** are
41a0: 20 72 65 73 74 6f 72 65 64 2e 20 48 6f 77 65 76   restored. Howev
41b0: 65 72 2c 20 69 66 20 74 68 69 73 20 66 75 6e 63  er, if this func
41c0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
41d0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
41e0: 73 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20  s.** guaranteed 
41f0: 74 68 61 74 20 61 20 63 61 6c 6c 20 74 6f 20 73  that a call to s
4200: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4210: 61 6e 67 65 73 65 74 28 29 20 77 69 6c 6c 20 72  angeset() will r
4220: 65 74 75 72 6e 20 61 20 0a 2a 2a 20 63 68 61 6e  eturn a .** chan
4230: 67 65 73 65 74 20 63 6f 6e 74 61 69 6e 69 6e 67  geset containing
4240: 20 7a 65 72 6f 20 63 68 61 6e 67 65 73 2e 0a 2a   zero changes..*
4250: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73  /.int sqlite3ses
4260: 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 73 71 6c  sion_isempty(sql
4270: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
4280: 65 73 73 69 6f 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ession);../*.** 
4290: 43 41 50 49 33 52 45 46 3a 20 43 72 65 61 74 65  CAPI3REF: Create
42a0: 20 41 6e 20 49 74 65 72 61 74 6f 72 20 54 6f 20   An Iterator To 
42b0: 54 72 61 76 65 72 73 65 20 41 20 43 68 61 6e 67  Traverse A Chang
42c0: 65 73 65 74 20 0a 2a 2a 0a 2a 2a 20 43 72 65 61  eset .**.** Crea
42d0: 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 75  te an iterator u
42e0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
42f0: 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65  hrough the conte
4300: 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67 65 73  nts of a changes
4310: 65 74 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  et..** If succes
4320: 73 66 75 6c 2c 20 2a 70 70 20 69 73 20 73 65 74  sful, *pp is set
4330: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
4340: 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64 6c 65   iterator handle
4350: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
4360: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  * is returned. O
4370: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
4380: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
4390: 70 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  p is set to zero
43a0: 20 61 6e 64 20 61 6e 0a 2a 2a 20 53 51 4c 69 74   and an.** SQLit
43b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
43c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
43d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
43e0: 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 75  nctions can be u
43f0: 73 65 64 20 74 6f 20 61 64 76 61 6e 63 65 20 61  sed to advance a
4400: 6e 64 20 71 75 65 72 79 20 61 20 63 68 61 6e 67  nd query a chang
4410: 65 73 65 74 20 0a 2a 2a 20 69 74 65 72 61 74 6f  eset .** iterato
4420: 72 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  r created by thi
4430: 73 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a  s function:.**.*
4440: 2a 20 3c 75 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e  * <ul>.**   <li>
4450: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
4460: 65 74 5f 6e 65 78 74 28 29 5d 0a 2a 2a 20 20 20  et_next()].**   
4470: 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63 68 61  <li> [sqlite3cha
4480: 6e 67 65 73 65 74 5f 6f 70 28 29 5d 0a 2a 2a 20  ngeset_op()].** 
4490: 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74 65 33 63    <li> [sqlite3c
44a0: 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29 5d 0a  hangeset_new()].
44b0: 2a 2a 20 20 20 3c 6c 69 3e 20 5b 73 71 6c 69 74  **   <li> [sqlit
44c0: 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28  e3changeset_old(
44d0: 29 5d 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  )].** </ul>.**.*
44e0: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
44f0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
4500: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
4510: 74 75 61 6c 6c 79 20 64 65 73 74 72 6f 79 20 74  tually destroy t
4520: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 62  he iterator.** b
4530: 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  y passing it to 
4540: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
4550: 74 5f 66 69 6e 61 6c 69 7a 65 28 29 5d 2e 20 54  t_finalize()]. T
4560: 68 65 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  he buffer contai
4570: 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 68 61 6e  ning the.** chan
4580: 67 65 73 65 74 20 28 70 43 68 61 6e 67 65 73 65  geset (pChangese
4590: 74 29 20 6d 75 73 74 20 72 65 6d 61 69 6e 20 76  t) must remain v
45a0: 61 6c 69 64 20 75 6e 74 69 6c 20 61 66 74 65 72  alid until after
45b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
45c0: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
45d0: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68  *.** Assuming th
45e0: 65 20 63 68 61 6e 67 65 73 65 74 20 62 6c 6f 62  e changeset blob
45f0: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
4600: 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 5b 73  one of the.** [s
4610: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
4620: 61 6e 67 65 73 65 74 28 29 5d 2c 20 5b 73 71 6c  angeset()], [sql
4630: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
4640: 6e 63 61 74 28 29 5d 20 6f 72 0a 2a 2a 20 5b 73  ncat()] or.** [s
4650: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4660: 69 6e 76 65 72 74 28 29 5d 20 66 75 6e 63 74 69  invert()] functi
4670: 6f 6e 73 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73  ons, all changes
4680: 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e   within the chan
4690: 67 65 73 65 74 20 0a 2a 2a 20 74 68 61 74 20 61  geset .** that a
46a0: 70 70 6c 79 20 74 6f 20 61 20 73 69 6e 67 6c 65  pply to a single
46b0: 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f 75 70   table are group
46c0: 65 64 20 74 6f 67 65 74 68 65 72 2e 20 54 68 69  ed together. Thi
46d0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  s means that whe
46e0: 6e 20 0a 2a 2a 20 61 6e 20 61 70 70 6c 69 63 61  n .** an applica
46f0: 74 69 6f 6e 20 69 74 65 72 61 74 65 73 20 74 68  tion iterates th
4700: 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65 73 65  rough a changese
4710: 74 20 75 73 69 6e 67 20 61 6e 20 69 74 65 72 61  t using an itera
4720: 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 0a  tor created by .
4730: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
4740: 2c 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68  , all changes th
4750: 61 74 20 72 65 6c 61 74 65 20 74 6f 20 61 20 73  at relate to a s
4760: 69 6e 67 6c 65 20 74 61 62 6c 65 20 61 72 65 20  ingle table are 
4770: 76 69 73 74 65 64 20 0a 2a 2a 20 63 6f 6e 73 65  visted .** conse
4780: 63 75 74 69 76 65 6c 79 2e 20 54 68 65 72 65 20  cutively. There 
4790: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
47a0: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 77  t the iterator w
47b0: 69 6c 6c 20 76 69 73 69 74 20 61 20 63 68 61 6e  ill visit a chan
47c0: 67 65 20 0a 2a 2a 20 74 68 65 20 61 70 70 6c 69  ge .** the appli
47d0: 65 73 20 74 6f 20 74 61 62 6c 65 20 58 2c 20 74  es to table X, t
47e0: 68 65 6e 20 6f 6e 65 20 66 6f 72 20 74 61 62 6c  hen one for tabl
47f0: 65 20 59 2c 20 61 6e 64 20 74 68 65 6e 20 6c 61  e Y, and then la
4800: 74 65 72 20 6f 6e 20 76 69 73 69 74 20 0a 2a 2a  ter on visit .**
4810: 20 61 6e 6f 74 68 65 72 20 63 68 61 6e 67 65 20   another change 
4820: 66 6f 72 20 74 61 62 6c 65 20 58 2e 0a 2a 2f 0a  for table X..*/.
4830: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
4840: 65 73 65 74 5f 73 74 61 72 74 28 0a 20 20 73 71  eset_start(.  sq
4850: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
4860: 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f 2a  iter **pp,    /*
4870: 20 4f 55 54 3a 20 4e 65 77 20 63 68 61 6e 67 65   OUT: New change
4880: 73 65 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e  set iterator han
4890: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  dle */.  int nCh
48a0: 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
48c0: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 62 6c   of changeset bl
48d0: 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ob in bytes */. 
48e0: 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65   void *pChangese
48f0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
4900: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
4910: 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  lob containing c
4920: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a  hangeset */.);..
4930: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a  ./*.** CAPI3REF:
4940: 20 41 64 76 61 6e 63 65 20 41 20 43 68 61 6e 67   Advance A Chang
4950: 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a 2a 2a  eset Iterator.**
4960: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4970: 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  n may only be us
4980: 65 64 20 77 69 74 68 20 69 74 65 72 61 74 6f 72  ed with iterator
4990: 73 20 63 72 65 61 74 65 64 20 62 79 20 66 75 6e  s created by fun
49a0: 63 74 69 6f 6e 0a 2a 2a 20 5b 73 71 6c 69 74 65  ction.** [sqlite
49b0: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
49c0: 28 29 5d 2e 20 49 66 20 69 74 20 69 73 20 63 61  ()]. If it is ca
49d0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 69 74 65 72 61  lled on an itera
49e0: 74 6f 72 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  tor passed to.**
49f0: 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64   a conflict-hand
4a00: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20  ler callback by 
4a10: 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  [sqlite3changese
4a20: 74 5f 61 70 70 6c 79 28 29 5d 2c 20 53 51 4c 49  t_apply()], SQLI
4a30: 54 45 5f 4d 49 53 55 53 45 0a 2a 2a 20 69 73 20  TE_MISUSE.** is 
4a40: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
4a50: 20 63 61 6c 6c 20 68 61 73 20 6e 6f 20 65 66 66   call has no eff
4a60: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64  ect..**.** Immed
4a70: 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 6e 20  iately after an 
4a80: 69 74 65 72 61 74 6f 72 20 69 73 20 63 72 65 61  iterator is crea
4a90: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 63 68  ted by sqlite3ch
4aa0: 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29 2c  angeset_start(),
4ab0: 20 69 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20   it.** does not 
4ac0: 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 63 68 61  point to any cha
4ad0: 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67  nge in the chang
4ae0: 65 73 65 74 2e 20 41 73 73 75 6d 69 6e 67 20 74  eset. Assuming t
4af0: 68 65 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20  he changeset.** 
4b00: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
4b10: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
4b20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  this function ad
4b30: 76 61 6e 63 65 73 20 74 68 65 20 69 74 65 72 61  vances the itera
4b40: 74 6f 72 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  tor to.** point 
4b50: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61  to the first cha
4b60: 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67  nge in the chang
4b70: 65 73 65 74 2e 20 45 61 63 68 20 73 75 62 73 65  eset. Each subse
4b80: 71 75 65 6e 74 20 63 61 6c 6c 20 61 64 76 61 6e  quent call advan
4b90: 63 65 73 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  ces.** the itera
4ba0: 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tor to point to 
4bb0: 74 68 65 20 6e 65 78 74 20 63 68 61 6e 67 65 20  the next change 
4bc0: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
4bd0: 20 28 69 66 20 61 6e 79 29 2e 20 49 66 0a 2a 2a   (if any). If.**
4be0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
4bf0: 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f   and the iterato
4c00: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  r points to a va
4c10: 6c 69 64 20 63 68 61 6e 67 65 20 61 66 74 65 72  lid change after
4c20: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71   a call.** to sq
4c30: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
4c40: 65 78 74 28 29 20 68 61 73 20 61 64 76 61 6e 63  ext() has advanc
4c50: 65 64 20 69 74 2c 20 53 51 4c 49 54 45 5f 52 4f  ed it, SQLITE_RO
4c60: 57 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  W is returned. .
4c70: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
4c80: 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 69 6e 20   all changes in 
4c90: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 68 61  the changeset ha
4ca0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
4cb0: 76 69 73 69 74 65 64 2c 0a 2a 2a 20 53 51 4c 49  visited,.** SQLI
4cc0: 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
4cd0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
4ce0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
4cf0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
4d00: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
4d10: 20 50 6f 73 73 69 62 6c 65 20 65 72 72 6f 72 20   Possible error 
4d20: 0a 2a 2a 20 63 6f 64 65 73 20 69 6e 63 6c 75 64  .** codes includ
4d30: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
4d40: 20 28 69 66 20 74 68 65 20 63 68 61 6e 67 65 73   (if the changes
4d50: 65 74 20 62 75 66 66 65 72 20 69 73 20 63 6f 72  et buffer is cor
4d60: 72 75 70 74 29 20 6f 72 20 0a 2a 2a 20 53 51 4c  rupt) or .** SQL
4d70: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
4d80: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
4d90: 65 74 5f 6e 65 78 74 28 73 71 6c 69 74 65 33 5f  et_next(sqlite3_
4da0: 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
4db0: 70 49 74 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  pIter);../*.** C
4dc0: 41 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20  API3REF: Obtain 
4dd0: 54 68 65 20 43 75 72 72 65 6e 74 20 4f 70 65 72  The Current Oper
4de0: 61 74 69 6f 6e 20 46 72 6f 6d 20 41 20 43 68 61  ation From A Cha
4df0: 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72 0a  ngeset Iterator.
4e00: 2a 2a 0a 2a 2a 20 54 68 65 20 70 49 74 65 72 20  **.** The pIter 
4e10: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
4e20: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4e30: 20 6d 61 79 20 65 69 74 68 65 72 20 62 65 20 61   may either be a
4e40: 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  n iterator.** pa
4e50: 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69  ssed to a confli
4e60: 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 20 5b 73  ct-handler by [s
4e70: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4e80: 61 70 70 6c 79 28 29 5d 2c 20 6f 72 20 61 6e 20  apply()], or an 
4e90: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 72 65 61  iterator.** crea
4ea0: 74 65 64 20 62 79 20 5b 73 71 6c 69 74 65 33 63  ted by [sqlite3c
4eb0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29  hangeset_start()
4ec0: 5d 2e 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72  ]. In the latter
4ed0: 20 63 61 73 65 2c 20 74 68 65 20 6d 6f 73 74 20   case, the most 
4ee0: 72 65 63 65 6e 74 0a 2a 2a 20 63 61 6c 6c 20 74  recent.** call t
4ef0: 6f 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  o [sqlite3change
4f00: 73 65 74 5f 6e 65 78 74 28 29 5d 20 6d 75 73 74  set_next()] must
4f10: 20 68 61 76 65 20 72 65 74 75 72 6e 65 64 20 5b   have returned [
4f20: 53 51 4c 49 54 45 5f 52 4f 57 5d 2e 20 49 66 20  SQLITE_ROW]. If 
4f30: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
4f40: 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  he case, this fu
4f50: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b  nction returns [
4f60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5d 2e 0a  SQLITE_MISUSE]..
4f70: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
4f80: 74 20 70 7a 54 61 62 20 69 73 20 6e 6f 74 20 4e  t pzTab is not N
4f90: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 7a 54 61 62  ULL, then *pzTab
4fa0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
4fb0: 20 74 6f 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72   to a.** nul-ter
4fc0: 6d 69 6e 61 74 65 64 20 75 74 66 2d 38 20 65 6e  minated utf-8 en
4fd0: 63 6f 64 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  coded string con
4fe0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
4ff0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
5000: 20 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65   affected by the
5010: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2e   current change.
5020: 20 54 68 65 20 62 75 66 66 65 72 20 72 65 6d 61   The buffer rema
5030: 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
5040: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
5050: 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
5060: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
5070: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 72 20 75  he iterator or u
5080: 6e 74 69 6c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  ntil the .** con
5090: 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 66 75  flict-handler fu
50a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
50b0: 49 66 20 70 6e 43 6f 6c 20 69 73 20 6e 6f 74 20  If pnCol is not 
50c0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 43 6f  NULL, then *pnCo
50d0: 6c 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20  l is .** set to 
50e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
50f0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
5100: 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20 74  le affected by t
5110: 68 65 20 63 68 61 6e 67 65 2e 20 49 66 0a 2a 2a  he change. If.**
5120: 20 70 62 49 6e 63 6f 72 72 65 63 74 20 69 73 20   pbIncorrect is 
5130: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a  not NULL, then *
5140: 70 62 49 6e 64 69 72 65 63 74 20 69 73 20 73 65  pbIndirect is se
5150: 74 20 74 6f 20 74 72 75 65 20 28 31 29 20 69 66  t to true (1) if
5160: 20 74 68 65 20 63 68 61 6e 67 65 0a 2a 2a 20 69   the change.** i
5170: 73 20 61 6e 20 69 6e 64 69 72 65 63 74 20 63 68  s an indirect ch
5180: 61 6e 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 28  ange, or false (
5190: 30 29 20 6f 74 68 65 72 77 69 73 65 2e 20 53 65  0) otherwise. Se
51a0: 65 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  e the documentat
51b0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 5b 73 71 6c 69  ion for.** [sqli
51c0: 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72  te3session_indir
51d0: 65 63 74 28 29 5d 20 66 6f 72 20 61 20 64 65 73  ect()] for a des
51e0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 64 69 72 65  cription of dire
51f0: 63 74 20 61 6e 64 20 69 6e 64 69 72 65 63 74 0a  ct and indirect.
5200: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 46 69 6e 61  ** changes. Fina
5210: 6c 6c 79 2c 20 69 66 20 70 4f 70 20 69 73 20 6e  lly, if pOp is n
5220: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70  ot NULL, then *p
5230: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  Op is set to one
5240: 20 6f 66 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f   of .** [SQLITE_
5250: 49 4e 53 45 52 54 5d 2c 20 5b 53 51 4c 49 54 45  INSERT], [SQLITE
5260: 5f 44 45 4c 45 54 45 5d 20 6f 72 20 5b 53 51 4c  _DELETE] or [SQL
5270: 49 54 45 5f 55 50 44 41 54 45 5d 2c 20 64 65 70  ITE_UPDATE], dep
5280: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 0a 2a  ending on the .*
5290: 2a 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65  * type of change
52a0: 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
52b0: 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
52c0: 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  nts to..**.** If
52d0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
52e0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
52f0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
5300: 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
5310: 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72   an.** SQLite er
5320: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5330: 72 6e 65 64 2e 20 54 68 65 20 76 61 6c 75 65 73  rned. The values
5340: 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 76   of the output v
5350: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
5360: 0a 2a 2a 20 62 65 20 74 72 75 73 74 65 64 20 69  .** be trusted i
5370: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
5380: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
5390: 65 73 65 74 5f 6f 70 28 0a 20 20 73 71 6c 69 74  eset_op(.  sqlit
53a0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
53b0: 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49 74  r *pIter,  /* It
53c0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
53d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
53e0: 70 7a 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  pzTab,          
53f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
5400: 65 72 20 74 6f 20 74 61 62 6c 65 20 6e 61 6d 65  er to table name
5410: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c   */.  int *pnCol
5420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5430: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
5440: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5450: 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  in table */.  in
5460: 74 20 2a 70 4f 70 2c 20 20 20 20 20 20 20 20 20  t *pOp,         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5480: 20 4f 55 54 3a 20 53 51 4c 49 54 45 5f 49 4e 53   OUT: SQLITE_INS
5490: 45 52 54 2c 20 44 45 4c 45 54 45 20 6f 72 20 55  ERT, DELETE or U
54a0: 50 44 41 54 45 20 2a 2f 0a 20 20 69 6e 74 20 2a  PDATE */.  int *
54b0: 70 62 49 6e 64 69 72 65 63 74 20 20 20 20 20 20  pbIndirect      
54c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
54d0: 54 3a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 27  T: True for an '
54e0: 69 6e 64 69 72 65 63 74 27 20 63 68 61 6e 67 65  indirect' change
54f0: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41   */.);../*.** CA
5500: 50 49 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 54  PI3REF: Obtain T
5510: 68 65 20 50 72 69 6d 61 72 79 20 4b 65 79 20 44  he Primary Key D
5520: 65 66 69 6e 69 74 69 6f 6e 20 4f 66 20 41 20 54  efinition Of A T
5530: 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  able.**.** For e
5540: 61 63 68 20 6d 6f 64 69 66 69 65 64 20 74 61 62  ach modified tab
5550: 6c 65 2c 20 61 20 63 68 61 6e 67 65 73 65 74 20  le, a changeset 
5560: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 66 6f 6c  includes the fol
5570: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 3c 75  lowing:.**.** <u
5580: 6c 3e 0a 2a 2a 20 20 20 3c 6c 69 3e 20 54 68 65  l>.**   <li> The
5590: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
55a0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ns in the table,
55b0: 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e 20 57   and.**   <li> W
55c0: 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 63 6f  hich of those co
55d0: 6c 75 6d 6e 73 20 6d 61 6b 65 20 75 70 20 74 68  lumns make up th
55e0: 65 20 74 61 62 6c 65 73 20 50 52 49 4d 41 52 59  e tables PRIMARY
55f0: 20 4b 45 59 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a   KEY..** </ul>.*
5600: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5610: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 69  on is used to fi
5620: 6e 64 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  nd which columns
5630: 20 63 6f 6d 70 72 69 73 65 20 74 68 65 20 50 52   comprise the PR
5640: 49 4d 41 52 59 20 4b 45 59 20 6f 66 0a 2a 2a 20  IMARY KEY of.** 
5650: 74 68 65 20 74 61 62 6c 65 20 6d 6f 64 69 66 69  the table modifi
5660: 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 67 65  ed by the change
5670: 20 74 68 61 74 20 69 74 65 72 61 74 6f 72 20 70   that iterator p
5680: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
5690: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 20 49 66 20  oints to..** If 
56a0: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 61 62  successful, *pab
56b0: 50 4b 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  PK is set to poi
56c0: 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  nt to an array o
56d0: 66 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 2c 20  f nCol entries, 
56e0: 77 68 65 72 65 0a 2a 2a 20 6e 43 6f 6c 20 69 73  where.** nCol is
56f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5700: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
5710: 62 6c 65 2e 20 45 6c 65 6d 65 6e 74 73 20 6f 66  ble. Elements of
5720: 20 2a 70 61 62 50 4b 20 61 72 65 20 73 65 74 20   *pabPK are set 
5730: 74 6f 0a 2a 2a 20 30 78 30 31 20 69 66 20 74 68  to.** 0x01 if th
5740: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
5750: 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72 74 20 6f  column is part o
5760: 66 20 74 68 65 20 74 61 62 6c 65 73 20 70 72 69  f the tables pri
5770: 6d 61 72 79 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20  mary key, or.** 
5780: 30 78 30 30 20 69 66 20 69 74 20 69 73 20 6e 6f  0x00 if it is no
5790: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  t..**.** If argu
57a0: 6d 65 74 20 70 6e 43 6f 6c 20 69 73 20 6e 6f 74  met pnCol is not
57b0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 43   NULL, then *pnC
57c0: 6f 6c 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ol is set to the
57d0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
57e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ns.** in the tab
57f0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  le..**.** If thi
5800: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
5810: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 69 74  lled when the it
5820: 65 72 61 74 6f 72 20 64 6f 65 73 20 6e 6f 74 20  erator does not 
5830: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
5840: 0a 2a 2a 20 65 6e 74 72 79 2c 20 53 51 4c 49 54  .** entry, SQLIT
5850: 45 5f 4d 49 53 55 53 45 20 69 73 20 72 65 74 75  E_MISUSE is retu
5860: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
5870: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 7a 65  put variables ze
5880: 72 6f 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roed. Otherwise,
5890: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
58a0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
58b0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
58c0: 65 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20  es populated as 
58d0: 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f  described.** abo
58e0: 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
58f0: 65 33 63 68 61 6e 67 65 73 65 74 5f 70 6b 28 0a  e3changeset_pk(.
5900: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
5910: 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c  set_iter *pIter,
5920: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62    /* Iterator ob
5930: 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ject */.  unsign
5940: 65 64 20 63 68 61 72 20 2a 2a 70 61 62 50 4b 2c  ed char **pabPK,
5950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5960: 3a 20 41 72 72 61 79 20 6f 66 20 62 6f 6f 6c 65  : Array of boole
5970: 61 6e 20 2d 20 74 72 75 65 20 66 6f 72 20 50 4b  an - true for PK
5980: 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 2a   cols */.  int *
5990: 70 6e 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  pnCol           
59a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
59b0: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  T: Number of ent
59c0: 72 69 65 73 20 69 6e 20 6f 75 74 70 75 74 20 61  ries in output a
59d0: 72 72 61 79 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  rray */.);../*.*
59e0: 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61  * CAPI3REF: Obta
59f0: 69 6e 20 6f 6c 64 2e 2a 20 56 61 6c 75 65 73 20  in old.* Values 
5a00: 46 72 6f 6d 20 41 20 43 68 61 6e 67 65 73 65 74  From A Changeset
5a10: 20 49 74 65 72 61 74 6f 72 0a 2a 2a 0a 2a 2a 20   Iterator.**.** 
5a20: 54 68 65 20 70 49 74 65 72 20 61 72 67 75 6d 65  The pIter argume
5a30: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
5a40: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 65  s function may e
5a50: 69 74 68 65 72 20 62 65 20 61 6e 20 69 74 65 72  ither be an iter
5a60: 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 74  ator.** passed t
5a70: 6f 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  o a conflict-han
5a80: 64 6c 65 72 20 62 79 20 5b 73 71 6c 69 74 65 33  dler by [sqlite3
5a90: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
5aa0: 29 5d 2c 20 6f 72 20 61 6e 20 69 74 65 72 61 74  )], or an iterat
5ab0: 6f 72 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  or.** created by
5ac0: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
5ad0: 65 74 5f 73 74 61 72 74 28 29 5d 2e 20 49 6e 20  et_start()]. In 
5ae0: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 2c  the latter case,
5af0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5b00: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 5b 73 71 6c  .** call to [sql
5b10: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65  ite3changeset_ne
5b20: 78 74 28 29 5d 20 6d 75 73 74 20 68 61 76 65 20  xt()] must have 
5b30: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
5b40: 52 4f 57 2e 20 0a 2a 2a 20 46 75 72 74 68 65 72  ROW. .** Further
5b50: 6d 6f 72 65 2c 20 69 74 20 6d 61 79 20 6f 6e 6c  more, it may onl
5b60: 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  y be called if t
5b70: 68 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67  he type of chang
5b80: 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  e that the itera
5b90: 74 6f 72 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  tor.** currently
5ba0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 65 69   points to is ei
5bb0: 74 68 65 72 20 5b 53 51 4c 49 54 45 5f 44 45 4c  ther [SQLITE_DEL
5bc0: 45 54 45 5d 20 6f 72 20 5b 53 51 4c 49 54 45 5f  ETE] or [SQLITE_
5bd0: 55 50 44 41 54 45 5d 2e 20 4f 74 68 65 72 77 69  UPDATE]. Otherwi
5be0: 73 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  se,.** this func
5bf0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 5b 53 51  tion returns [SQ
5c00: 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 61 6e 64  LITE_MISUSE] and
5c10: 20 73 65 74 73 20 2a 70 70 56 61 6c 75 65 20 74   sets *ppValue t
5c20: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 72  o NULL..**.** Ar
5c30: 67 75 6d 65 6e 74 20 69 56 61 6c 20 6d 75 73 74  gument iVal must
5c40: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
5c50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20   or equal to 0, 
5c60: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 74 68  and less than th
5c70: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
5c80: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
5c90: 62 6c 65 20 61 66 66 65 63 74 65 64 20 62 79 20  ble affected by 
5ca0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
5cb0: 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ge. Otherwise,.*
5cc0: 2a 20 5b 53 51 4c 49 54 45 5f 52 41 4e 47 45 5d  * [SQLITE_RANGE]
5cd0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
5ce0: 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65 74   *ppValue is set
5cf0: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
5d00: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
5d10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
5d20: 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70 6f  s *ppValue to po
5d30: 69 6e 74 20 74 6f 20 61 20 70 72 6f 74 65 63 74  int to a protect
5d40: 65 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61  ed.** sqlite3_va
5d50: 6c 75 65 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  lue object conta
5d60: 69 6e 69 6e 67 20 74 68 65 20 69 56 61 6c 27 74  ining the iVal't
5d70: 68 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  h value from the
5d80: 20 76 65 63 74 6f 72 20 6f 66 20 0a 2a 2a 20 6f   vector of .** o
5d90: 72 69 67 69 6e 61 6c 20 72 6f 77 20 76 61 6c 75  riginal row valu
5da0: 65 73 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  es stored as par
5db0: 74 20 6f 66 20 74 68 65 20 55 50 44 41 54 45 20  t of the UPDATE 
5dc0: 6f 72 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65  or DELETE change
5dd0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 73 20   and.** returns 
5de0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 6e  SQLITE_OK. The n
5df0: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
5e00: 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
5e10: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 69  he fact that thi
5e20: 73 20 0a 2a 2a 20 69 73 20 73 69 6d 69 6c 61 72  s .** is similar
5e30: 20 74 6f 20 74 68 65 20 22 6f 6c 64 2e 2a 22 20   to the "old.*" 
5e40: 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61 62 6c  columns availabl
5e50: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
5e60: 65 6c 65 74 65 20 74 72 69 67 67 65 72 73 2e 0a  elete triggers..
5e70: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
5e80: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
5e90: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
5ea0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
5eb0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
5ec0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
5ed0: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
5ee0: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
5ef0: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
5f00: 65 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69 74 65  et_old(.  sqlite
5f10: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
5f20: 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61   *pIter,  /* Cha
5f30: 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
5f40: 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c 20 20  */.  int iVal,  
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
5f70: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
5f80: 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c  e3_value **ppVal
5f90: 75 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ue         /* OU
5fa0: 54 3a 20 4f 6c 64 20 76 61 6c 75 65 20 28 6f 72  T: Old value (or
5fb0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 29 20 2a   NULL pointer) *
5fc0: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  /.);../*.** CAPI
5fd0: 33 52 45 46 3a 20 4f 62 74 61 69 6e 20 6e 65 77  3REF: Obtain new
5fe0: 2e 2a 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  .* Values From A
5ff0: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
6000: 74 6f 72 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 49  tor.**.** The pI
6010: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ter argument pas
6020: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
6030: 74 69 6f 6e 20 6d 61 79 20 65 69 74 68 65 72 20  tion may either 
6040: 62 65 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a  be an iterator.*
6050: 2a 20 70 61 73 73 65 64 20 74 6f 20 61 20 63 6f  * passed to a co
6060: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 62  nflict-handler b
6070: 79 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  y [sqlite3change
6080: 73 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20 6f 72  set_apply()], or
6090: 20 61 6e 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20   an iterator.** 
60a0: 63 72 65 61 74 65 64 20 62 79 20 5b 73 71 6c 69  created by [sqli
60b0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
60c0: 72 74 28 29 5d 2e 20 49 6e 20 74 68 65 20 6c 61  rt()]. In the la
60d0: 74 74 65 72 20 63 61 73 65 2c 20 74 68 65 20 6d  tter case, the m
60e0: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 63 61  ost recent.** ca
60f0: 6c 6c 20 74 6f 20 5b 73 71 6c 69 74 65 33 63 68  ll to [sqlite3ch
6100: 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 5d 20  angeset_next()] 
6110: 6d 75 73 74 20 68 61 76 65 20 72 65 74 75 72 6e  must have return
6120: 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e 20 0a  ed SQLITE_ROW. .
6130: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
6140: 69 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  it may only be c
6150: 61 6c 6c 65 64 20 69 66 20 74 68 65 20 74 79 70  alled if the typ
6160: 65 20 6f 66 20 63 68 61 6e 67 65 20 74 68 61 74  e of change that
6170: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
6180: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
6190: 73 20 74 6f 20 69 73 20 65 69 74 68 65 72 20 5b  s to is either [
61a0: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 5d 20 6f  SQLITE_UPDATE] o
61b0: 72 20 5b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  r [SQLITE_INSERT
61c0: 5d 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  ]. Otherwise,.**
61d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
61e0: 65 74 75 72 6e 73 20 5b 53 51 4c 49 54 45 5f 4d  eturns [SQLITE_M
61f0: 49 53 55 53 45 5d 20 61 6e 64 20 73 65 74 73 20  ISUSE] and sets 
6200: 2a 70 70 56 61 6c 75 65 20 74 6f 20 4e 55 4c 4c  *ppValue to NULL
6210: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
6220: 20 69 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72   iVal must be gr
6230: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
6240: 75 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65  ual to 0, and le
6250: 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  ss than the numb
6260: 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  er.** of columns
6270: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66   in the table af
6280: 66 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75  fected by the cu
6290: 72 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74  rrent change. Ot
62a0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c  herwise,.** [SQL
62b0: 49 54 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65  ITE_RANGE] is re
62c0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61  turned and *ppVa
62d0: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
62e0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  LL..**.** If suc
62f0: 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
6300: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56  nction sets *ppV
6310: 61 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  alue to point to
6320: 20 61 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20   a protected.** 
6330: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
6340: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
6350: 74 68 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75  the iVal'th valu
6360: 65 20 66 72 6f 6d 20 74 68 65 20 76 65 63 74 6f  e from the vecto
6370: 72 20 6f 66 20 0a 2a 2a 20 6e 65 77 20 72 6f 77  r of .** new row
6380: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61   values stored a
6390: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 50  s part of the UP
63a0: 44 41 54 45 20 6f 72 20 49 4e 53 45 52 54 20 63  DATE or INSERT c
63b0: 68 61 6e 67 65 20 61 6e 64 0a 2a 2a 20 72 65 74  hange and.** ret
63c0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
63d0: 49 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  If the change is
63e0: 20 61 6e 20 55 50 44 41 54 45 20 61 6e 64 20 64   an UPDATE and d
63f0: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 0a  oes not include.
6400: 2a 2a 20 61 20 6e 65 77 20 76 61 6c 75 65 20 66  ** a new value f
6410: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
6420: 20 63 6f 6c 75 6d 6e 2c 20 2a 70 70 56 61 6c 75   column, *ppValu
6430: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
6440: 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
6450: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
6460: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e   name of the fun
6470: 63 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ction comes from
6480: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 0a   the fact that .
6490: 2a 2a 20 74 68 69 73 20 69 73 20 73 69 6d 69 6c  ** this is simil
64a0: 61 72 20 74 6f 20 74 68 65 20 22 6e 65 77 2e 2a  ar to the "new.*
64b0: 22 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61  " columns availa
64c0: 62 6c 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72  ble to update or
64d0: 20 64 65 6c 65 74 65 20 0a 2a 2a 20 74 72 69 67   delete .** trig
64e0: 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  gers..**.** If s
64f0: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
6500: 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20  occurs (e.g. an 
6510: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 2c 20  OOM condition), 
6520: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
6530: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
6540: 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c 75 65  ned and *ppValue
6550: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
6560: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
6570: 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 0a 20 20  hangeset_new(.  
6580: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
6590: 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20  t_iter *pIter,  
65a0: 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65  /* Changeset ite
65b0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
65c0: 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Val,            
65d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
65e0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  lumn number */. 
65f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6600: 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20  *ppValue        
6610: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c   /* OUT: New val
6620: 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e  ue (or NULL poin
6630: 74 65 72 29 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ter) */.);../*.*
6640: 2a 20 43 41 50 49 33 52 45 46 3a 20 4f 62 74 61  * CAPI3REF: Obta
6650: 69 6e 20 43 6f 6e 66 6c 69 63 74 69 6e 67 20 52  in Conflicting R
6660: 6f 77 20 56 61 6c 75 65 73 20 46 72 6f 6d 20 41  ow Values From A
6670: 20 43 68 61 6e 67 65 73 65 74 20 49 74 65 72 61   Changeset Itera
6680: 74 6f 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  tor.**.** This f
6690: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
66a0: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
66b0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
66c0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a  s passed to a.**
66d0: 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65   conflict-handle
66e0: 72 20 63 61 6c 6c 62 61 63 6b 20 62 79 20 5b 73  r callback by [s
66f0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
6700: 61 70 70 6c 79 28 29 5d 20 77 69 74 68 20 65 69  apply()] with ei
6710: 74 68 65 72 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f  ther.** [SQLITE_
6720: 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 5d 20  CHANGESET_DATA] 
6730: 6f 72 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  or [SQLITE_CHANG
6740: 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 5d 2e 20  ESET_CONFLICT]. 
6750: 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
6760: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  .** is called on
6770: 20 61 6e 79 20 6f 74 68 65 72 20 69 74 65 72 61   any other itera
6780: 74 6f 72 2c 20 5b 53 51 4c 49 54 45 5f 4d 49 53  tor, [SQLITE_MIS
6790: 55 53 45 5d 20 69 73 20 72 65 74 75 72 6e 65 64  USE] is returned
67a0: 20 61 6e 64 20 2a 70 70 56 61 6c 75 65 0a 2a 2a   and *ppValue.**
67b0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
67c0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
67d0: 69 56 61 6c 20 6d 75 73 74 20 62 65 20 67 72 65  iVal must be gre
67e0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
67f0: 61 6c 20 74 6f 20 30 2c 20 61 6e 64 20 6c 65 73  al to 0, and les
6800: 73 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  s than the numbe
6810: 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  r.** of columns 
6820: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 66 66  in the table aff
6830: 65 63 74 65 64 20 62 79 20 74 68 65 20 63 75 72  ected by the cur
6840: 72 65 6e 74 20 63 68 61 6e 67 65 2e 20 4f 74 68  rent change. Oth
6850: 65 72 77 69 73 65 2c 0a 2a 2a 20 5b 53 51 4c 49  erwise,.** [SQLI
6860: 54 45 5f 52 41 4e 47 45 5d 20 69 73 20 72 65 74  TE_RANGE] is ret
6870: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
6880: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
6890: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  L..**.** If succ
68a0: 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
68b0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 70 56 61  ction sets *ppVa
68c0: 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
68d0: 61 20 70 72 6f 74 65 63 74 65 64 0a 2a 2a 20 73  a protected.** s
68e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
68f0: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
6900: 68 65 20 69 56 61 6c 27 74 68 20 76 61 6c 75 65  he iVal'th value
6910: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 22 63   from the .** "c
6920: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 22 20  onflicting row" 
6930: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6940: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
6950: 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 63 61 6c  lict-handler cal
6960: 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 72 65 74  lback.** and ret
6970: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
6980: 2a 2a 0a 2a 2a 20 49 66 20 73 6f 6d 65 20 6f 74  **.** If some ot
6990: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
69a0: 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (e.g. an OOM co
69b0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 53 51 4c  ndition), an SQL
69c0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
69d0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
69e0: 64 20 2a 70 70 56 61 6c 75 65 20 69 73 20 73 65  d *ppValue is se
69f0: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
6a00: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
6a10: 65 74 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  et_conflict(.  s
6a20: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
6a30: 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
6a40: 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
6a50: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56  ator */.  int iV
6a60: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
6a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
6a80: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
6a90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6aa0: 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
6ab0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 66 72  /* OUT: Value fr
6ac0: 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  om conflicting r
6ad0: 6f 77 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.);../*.** 
6ae0: 43 41 50 49 33 52 45 46 3a 20 44 65 74 65 72 6d  CAPI3REF: Determ
6af0: 69 6e 65 20 54 68 65 20 4e 75 6d 62 65 72 20 4f  ine The Number O
6b00: 66 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f  f Foreign Key Co
6b10: 6e 73 74 72 61 69 6e 74 20 56 69 6f 6c 61 74 69  nstraint Violati
6b20: 6f 6e 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ons.**.** This f
6b30: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
6b40: 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
6b50: 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  an iterator pass
6b60: 65 64 20 74 6f 20 61 6e 0a 2a 2a 20 53 51 4c 49  ed to an.** SQLI
6b70: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46 4f 52  TE_CHANGESET_FOR
6b80: 45 49 47 4e 5f 4b 45 59 20 63 6f 6e 66 6c 69 63  EIGN_KEY conflic
6b90: 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  t handler callba
6ba0: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
6bb0: 0a 2a 2a 20 69 74 20 73 65 74 73 20 74 68 65 20  .** it sets the 
6bc0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
6bd0: 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
6be0: 62 65 72 20 6f 66 20 6b 6e 6f 77 6e 20 66 6f 72  ber of known for
6bf0: 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 76 69 6f 6c  eign key.** viol
6c00: 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 65  ations in the de
6c10: 73 74 69 6e 61 74 69 6f 6e 20 64 61 74 61 62 61  stination databa
6c20: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  se and returns S
6c30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
6c40: 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
6c50: 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
6c60: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
6c70: 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73  MISUSE..*/.int s
6c80: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
6c90: 66 6b 5f 63 6f 6e 66 6c 69 63 74 73 28 0a 20 20  fk_conflicts(.  
6ca0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
6cb0: 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20  t_iter *pIter,  
6cc0: 2f 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65  /* Changeset ite
6cd0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  rator */.  int *
6ce0: 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  pnOut           
6cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
6d00: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 46 4b 20  T: Number of FK 
6d10: 76 69 6f 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 3b  violations */.);
6d20: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45  .../*.** CAPI3RE
6d30: 46 3a 20 46 69 6e 61 6c 69 7a 65 20 41 20 43 68  F: Finalize A Ch
6d40: 61 6e 67 65 73 65 74 20 49 74 65 72 61 74 6f 72  angeset Iterator
6d50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6d60: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6d70: 66 69 6e 61 6c 69 7a 65 20 61 6e 20 69 74 65 72  finalize an iter
6d80: 61 74 6f 72 20 61 6c 6c 6f 63 61 74 65 64 20 77  ator allocated w
6d90: 69 74 68 0a 2a 2a 20 5b 73 71 6c 69 74 65 33 63  ith.** [sqlite3c
6da0: 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29  hangeset_start()
6db0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ]..**.** This fu
6dc0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
6dd0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ly be called on 
6de0: 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65  iterators create
6df0: 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 5b  d using the.** [
6e00: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
6e10: 5f 73 74 61 72 74 28 29 5d 20 66 75 6e 63 74 69  _start()] functi
6e20: 6f 6e 2e 20 49 66 20 61 6e 20 61 70 70 6c 69 63  on. If an applic
6e30: 61 74 69 6f 6e 20 63 61 6c 6c 73 20 74 68 69 73  ation calls this
6e40: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  .** function wit
6e50: 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20 70 61  h an iterator pa
6e60: 73 73 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69  ssed to a confli
6e70: 63 74 2d 68 61 6e 64 6c 65 72 20 62 79 0a 2a 2a  ct-handler by.**
6e80: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
6e90: 65 74 5f 61 70 70 6c 79 28 29 5d 2c 20 5b 53 51  et_apply()], [SQ
6ea0: 4c 49 54 45 5f 4d 49 53 55 53 45 5d 20 69 73 20  LITE_MISUSE] is 
6eb0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
6ec0: 72 6e 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rned and the.** 
6ed0: 63 61 6c 6c 20 68 61 73 20 6e 6f 20 65 66 66 65  call has no effe
6ee0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ct..**.** If an 
6ef0: 65 72 72 6f 72 20 77 61 73 20 65 6e 63 6f 75 6e  error was encoun
6f00: 74 65 72 65 64 20 77 69 74 68 69 6e 20 61 20 63  tered within a c
6f10: 61 6c 6c 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  all to an sqlite
6f20: 33 63 68 61 6e 67 65 73 65 74 5f 78 78 78 28 29  3changeset_xxx()
6f30: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f  .** function (fo
6f40: 72 20 65 78 61 6d 70 6c 65 20 61 6e 20 5b 53 51  r example an [SQ
6f50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5d 20 69 6e  LITE_CORRUPT] in
6f60: 20 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   [sqlite3changes
6f70: 65 74 5f 6e 65 78 74 28 29 5d 20 6f 72 20 61 6e  et_next()] or an
6f80: 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 4e 4f 4d   .** [SQLITE_NOM
6f90: 45 4d 5d 20 69 6e 20 5b 73 71 6c 69 74 65 33 63  EM] in [sqlite3c
6fa0: 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 29 5d 29  hangeset_new()])
6fb0: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 63   then an error c
6fc0: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ode correspondin
6fd0: 67 0a 2a 2a 20 74 6f 20 74 68 61 74 20 65 72 72  g.** to that err
6fe0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
6ff0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
7000: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
7010: 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75  TE_OK is.** retu
7020: 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20 74 6f  rned. This is to
7030: 20 61 6c 6c 6f 77 20 74 68 65 20 66 6f 6c 6c 6f   allow the follo
7040: 77 69 6e 67 20 70 61 74 74 65 72 6e 20 28 70 73  wing pattern (ps
7050: 65 75 64 6f 2d 63 6f 64 65 29 3a 0a 2a 2a 0a 2a  eudo-code):.**.*
7060: 2a 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  *   sqlite3chang
7070: 65 73 65 74 5f 73 74 61 72 74 28 29 3b 0a 2a 2a  eset_start();.**
7080: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
7090: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 63 68 61  _ROW==sqlite3cha
70a0: 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 20 29 7b  ngeset_next() ){
70b0: 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f  .**     // Do so
70c0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 63 68 61  mething with cha
70d0: 6e 67 65 2e 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20  nge..**   }.**  
70e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
70f0: 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28  ngeset_finalize(
7100: 29 3b 0a 2a 2a 20 20 20 69 66 28 20 72 63 21 3d  );.**   if( rc!=
7110: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 2a 2a 20  SQLITE_OK ){.** 
7120: 20 20 20 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20      // An error 
7130: 68 61 73 20 6f 63 63 75 72 72 65 64 20 0a 2a 2a  has occurred .**
7140: 20 20 20 7d 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69     }.*/.int sqli
7150: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e  te3changeset_fin
7160: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 68  alize(sqlite3_ch
7170: 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
7180: 74 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  ter);../*.** CAP
7190: 49 33 52 45 46 3a 20 49 6e 76 65 72 74 20 41 20  I3REF: Invert A 
71a0: 43 68 61 6e 67 65 73 65 74 0a 2a 2a 0a 2a 2a 20  Changeset.**.** 
71b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
71c0: 20 75 73 65 64 20 74 6f 20 22 69 6e 76 65 72 74   used to "invert
71d0: 22 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 62  " a changeset ob
71e0: 6a 65 63 74 2e 20 41 70 70 6c 79 69 6e 67 20 61  ject. Applying a
71f0: 6e 20 69 6e 76 65 72 74 65 64 0a 2a 2a 20 63 68  n inverted.** ch
7200: 61 6e 67 65 73 65 74 20 74 6f 20 61 20 64 61 74  angeset to a dat
7210: 61 62 61 73 65 20 72 65 76 65 72 73 65 73 20 74  abase reverses t
7220: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 61 70  he effects of ap
7230: 70 6c 79 69 6e 67 20 74 68 65 20 75 6e 69 6e 76  plying the uninv
7240: 65 72 74 65 64 0a 2a 2a 20 63 68 61 6e 67 65 73  erted.** changes
7250: 65 74 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  et. Specifically
7260: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
7270: 20 20 3c 6c 69 3e 20 45 61 63 68 20 44 45 4c 45    <li> Each DELE
7280: 54 45 20 63 68 61 6e 67 65 20 69 73 20 63 68 61  TE change is cha
7290: 6e 67 65 64 20 74 6f 20 61 6e 20 49 4e 53 45 52  nged to an INSER
72a0: 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c 69 3e  T, and.**   <li>
72b0: 20 45 61 63 68 20 49 4e 53 45 52 54 20 63 68 61   Each INSERT cha
72c0: 6e 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  nge is changed t
72d0: 6f 20 61 20 44 45 4c 45 54 45 2c 20 61 6e 64 0a  o a DELETE, and.
72e0: 2a 2a 20 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61  **   <li> For ea
72f0: 63 68 20 55 50 44 41 54 45 20 63 68 61 6e 67 65  ch UPDATE change
7300: 2c 20 74 68 65 20 6f 6c 64 2e 2a 20 61 6e 64 20  , the old.* and 
7310: 6e 65 77 2e 2a 20 76 61 6c 75 65 73 20 61 72 65  new.* values are
7320: 20 65 78 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 3c   exchanged..** <
7330: 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  /ul>.**.** If su
7340: 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
7350: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
7360: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
7370: 6e 76 65 72 74 65 64 20 63 68 61 6e 67 65 73 65  nverted changese
7380: 74 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  t.** is stored i
7390: 6e 20 2a 70 70 4f 75 74 2c 20 74 68 65 20 73 69  n *ppOut, the si
73a0: 7a 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 62  ze of the same b
73b0: 75 66 66 65 72 20 69 73 20 73 74 6f 72 65 64 20  uffer is stored 
73c0: 69 6e 20 2a 70 6e 4f 75 74 2c 20 61 6e 64 0a 2a  in *pnOut, and.*
73d0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
73e0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
73f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74  rror occurs, bot
7400: 68 20 2a 70 6e 4f 75 74 20 61 6e 64 20 2a 70 70  h *pnOut and *pp
7410: 4f 75 74 20 61 72 65 0a 2a 2a 20 7a 65 72 6f 65  Out are.** zeroe
7420: 64 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20  d and an SQLite 
7430: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
7440: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ned..**.** It is
7450: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
7460: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
7470: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
7480: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
7490: 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 2a 70  e().** on the *p
74a0: 70 4f 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  pOut pointer to 
74b0: 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
74c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 6c 6c 6f  allocation follo
74d0: 77 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75  wing a successfu
74e0: 6c 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 74 68  l .** call to th
74f0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
7500: 2a 2a 20 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a  ** WARNING/TODO:
7510: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
7520: 75 72 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73  urrently assumes
7530: 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
7540: 69 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 63 68  is a valid.** ch
7550: 61 6e 67 65 73 65 74 2e 20 49 66 20 69 74 20 69  angeset. If it i
7560: 73 20 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c  s not, the resul
7570: 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
7580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7590: 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74  changeset_invert
75a0: 28 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e  (.  int nIn, con
75b0: 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20  st void *pIn,   
75c0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
75d0: 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ngeset */.  int 
75e0: 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20 2a 2a 70  *pnOut, void **p
75f0: 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f  pOut        /* O
7600: 55 54 3a 20 49 6e 76 65 72 73 65 20 6f 66 20 69  UT: Inverse of i
7610: 6e 70 75 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  nput */.);../*.*
7620: 2a 20 43 41 50 49 33 52 45 46 3a 20 43 6f 6e 63  * CAPI3REF: Conc
7630: 61 74 65 6e 61 74 65 20 54 77 6f 20 43 68 61 6e  atenate Two Chan
7640: 67 65 73 65 74 20 4f 62 6a 65 63 74 73 0a 2a 2a  geset Objects.**
7650: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7660: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  n is used to con
7670: 63 61 74 65 6e 61 74 65 20 74 77 6f 20 63 68 61  catenate two cha
7680: 6e 67 65 73 65 74 73 2c 20 41 20 61 6e 64 20 42  ngesets, A and B
7690: 2c 20 69 6e 74 6f 20 61 20 0a 2a 2a 20 73 69 6e  , into a .** sin
76a0: 67 6c 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54  gle changeset. T
76b0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
76c0: 68 61 6e 67 65 73 65 74 20 65 71 75 69 76 61 6c  hangeset equival
76d0: 65 6e 74 20 74 6f 20 61 70 70 6c 79 69 6e 67 0a  ent to applying.
76e0: 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 41 20 66  ** changeset A f
76f0: 6f 6c 6c 6f 77 65 64 20 62 79 20 63 68 61 6e 67  ollowed by chang
7700: 65 73 65 74 20 42 2e 20 0a 2a 2a 0a 2a 2a 20 52  eset B. .**.** R
7710: 6f 77 73 20 61 72 65 20 69 64 65 6e 74 69 66 69  ows are identifi
7720: 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 73  ed by the values
7730: 20 69 6e 20 74 68 65 69 72 20 50 52 49 4d 41 52   in their PRIMAR
7740: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 20 41  Y KEY columns. A
7750: 20 63 68 61 6e 67 65 0a 2a 2a 20 69 6e 20 63 68   change.** in ch
7760: 61 6e 67 65 73 65 74 20 41 20 69 73 20 63 6f 6e  angeset A is con
7770: 73 69 64 65 72 65 64 20 74 6f 20 61 70 70 6c 79  sidered to apply
7780: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77   to the same row
7790: 20 61 73 20 61 20 63 68 61 6e 67 65 20 69 6e 0a   as a change in.
77a0: 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 42 20 69  ** changeset B i
77b0: 66 20 74 68 65 20 74 77 6f 20 72 6f 77 73 20 68  f the two rows h
77c0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 70 72 69  ave the same pri
77d0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
77e0: 43 68 61 6e 67 65 73 20 74 6f 20 72 6f 77 73 20  Changes to rows 
77f0: 74 68 61 74 20 61 70 70 65 61 72 20 6f 6e 6c 79  that appear only
7800: 20 69 6e 20 63 68 61 6e 67 65 73 65 74 20 41 20   in changeset A 
7810: 6f 72 20 42 20 61 72 65 20 63 6f 70 69 65 64 20  or B are copied 
7820: 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 6f 75 74 70  into the.** outp
7830: 75 74 20 63 68 61 6e 67 65 73 65 74 2e 20 4f 72  ut changeset. Or
7840: 2c 20 69 66 20 62 6f 74 68 20 63 68 61 6e 67 65  , if both change
7850: 73 65 74 20 41 20 61 6e 64 20 42 20 63 6f 6e 74  set A and B cont
7860: 61 69 6e 20 61 20 63 68 61 6e 67 65 20 74 68 61  ain a change tha
7870: 74 0a 2a 2a 20 61 70 70 6c 69 65 73 20 74 6f 20  t.** applies to 
7880: 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
7890: 65 20 6f 75 74 70 75 74 20 64 65 70 65 6e 64 73  e output depends
78a0: 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20   on the type of 
78b0: 65 61 63 68 20 63 68 61 6e 67 65 2c 0a 2a 2a 20  each change,.** 
78c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
78d0: 2a 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  * <table border=
78e0: 31 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d  1 style="margin-
78f0: 6c 65 66 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d  left:8ex;margin-
7900: 72 69 67 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20  right:8ex">.**  
7910: 20 3c 74 72 3e 3c 74 68 20 73 74 79 6c 65 3d 22   <tr><th style="
7920: 77 68 69 74 65 2d 73 70 61 63 65 3a 70 72 65 22  white-space:pre"
7930: 3e 43 68 61 6e 67 65 20 41 20 20 20 20 20 20 3c  >Change A      <
7940: 2f 74 68 3e 0a 2a 2a 20 20 20 20 20 20 20 3c 74  /th>.**       <t
7950: 68 20 73 74 79 6c 65 3d 22 77 68 69 74 65 2d 73  h style="white-s
7960: 70 61 63 65 3a 70 72 65 22 3e 43 68 61 6e 67 65  pace:pre">Change
7970: 20 42 20 20 20 20 20 20 3c 2f 74 68 3e 0a 2a 2a   B      </th>.**
7980: 20 20 20 20 20 20 20 3c 74 68 3e 4f 75 74 70 75         <th>Outpu
7990: 74 20 43 68 61 6e 67 65 0a 2a 2a 20 20 20 3c 74  t Change.**   <t
79a0: 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64  r><td>INSERT <td
79b0: 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a 2a 2a 20  >INSERT <td>.** 
79c0: 20 20 20 20 20 20 43 68 61 6e 67 65 20 41 20 69        Change A i
79d0: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
79e0: 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67 65 73  e output changes
79f0: 65 74 2e 20 43 68 61 6e 67 65 20 42 20 69 73 20  et. Change B is 
7a00: 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 20 20 20  discarded..**   
7a10: 20 20 20 20 54 68 69 73 20 63 61 73 65 20 64 6f      This case do
7a20: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 69 66 20  es not occur if 
7a30: 63 68 61 6e 67 65 73 65 74 20 42 20 69 73 20 72  changeset B is r
7a40: 65 63 6f 72 64 65 64 20 69 6d 6d 65 64 69 61 74  ecorded immediat
7a50: 65 6c 79 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  ely after.**    
7a60: 20 20 20 63 68 61 6e 67 65 73 65 74 20 41 2e 20     changeset A. 
7a70: 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 49 4e  .**   <tr><td>IN
7a80: 53 45 52 54 20 3c 74 64 3e 55 50 44 41 54 45 20  SERT <td>UPDATE 
7a90: 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20 41 6e  <td>.**       An
7aa0: 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20 69   INSERT change i
7ab0: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
7ac0: 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67 65 73  e output changes
7ad0: 65 74 2e 20 54 68 65 20 76 61 6c 75 65 73 20 69  et. The values i
7ae0: 6e 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 49  n.**       the I
7af0: 4e 53 45 52 54 20 63 68 61 6e 67 65 20 61 72 65  NSERT change are
7b00: 20 61 73 20 69 66 20 74 68 65 20 72 6f 77 20 77   as if the row w
7b10: 61 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 63  as inserted by c
7b20: 68 61 6e 67 65 20 41 20 61 6e 64 20 74 68 65 6e  hange A and then
7b30: 0a 2a 2a 20 20 20 20 20 20 20 75 70 64 61 74 65  .**       update
7b40: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 63  d according to c
7b50: 68 61 6e 67 65 20 42 2e 0a 2a 2a 20 20 20 3c 74  hange B..**   <t
7b60: 72 3e 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64  r><td>INSERT <td
7b70: 3e 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a 2a 20  >DELETE <td>.** 
7b80: 20 20 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 20        No change 
7b90: 61 74 20 61 6c 6c 20 69 73 20 63 6f 70 69 65 64  at all is copied
7ba0: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
7bb0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 20 20   changeset..**  
7bc0: 20 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54 45 20   <tr><td>UPDATE 
7bd0: 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e 0a  <td>INSERT <td>.
7be0: 2a 2a 20 20 20 20 20 20 20 43 68 61 6e 67 65 20  **       Change 
7bf0: 41 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  A is copied into
7c00: 20 74 68 65 20 6f 75 74 70 75 74 20 63 68 61 6e   the output chan
7c10: 67 65 73 65 74 2e 20 43 68 61 6e 67 65 20 42 20  geset. Change B 
7c20: 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a  is discarded..**
7c30: 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
7c40: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
7c50: 69 66 20 63 68 61 6e 67 65 73 65 74 20 42 20 69  if changeset B i
7c60: 73 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64  s recorded immed
7c70: 69 61 74 65 6c 79 20 61 66 74 65 72 0a 2a 2a 20  iately after.** 
7c80: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20        changeset 
7c90: 41 2e 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64  A. .**   <tr><td
7ca0: 3e 55 50 44 41 54 45 20 3c 74 64 3e 55 50 44 41  >UPDATE <td>UPDA
7cb0: 54 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20  TE <td>.**      
7cc0: 20 41 20 73 69 6e 67 6c 65 20 55 50 44 41 54 45   A single UPDATE
7cd0: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
7ce0: 74 68 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67  the output chang
7cf0: 65 73 65 74 2e 20 54 68 65 20 61 63 63 6f 6d 70  eset. The accomp
7d00: 61 6e 79 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  anying.**       
7d10: 76 61 6c 75 65 73 20 61 72 65 20 61 73 20 69 66  values are as if
7d20: 20 74 68 65 20 72 6f 77 20 77 61 73 20 75 70 64   the row was upd
7d30: 61 74 65 64 20 6f 6e 63 65 20 62 79 20 63 68 61  ated once by cha
7d40: 6e 67 65 20 41 20 61 6e 64 20 74 68 65 6e 20 61  nge A and then a
7d50: 67 61 69 6e 0a 2a 2a 20 20 20 20 20 20 20 62 79  gain.**       by
7d60: 20 63 68 61 6e 67 65 20 42 2e 0a 2a 2a 20 20 20   change B..**   
7d70: 3c 74 72 3e 3c 74 64 3e 55 50 44 41 54 45 20 3c  <tr><td>UPDATE <
7d80: 74 64 3e 44 45 4c 45 54 45 20 3c 74 64 3e 0a 2a  td>DELETE <td>.*
7d90: 2a 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65  *       A single
7da0: 20 44 45 4c 45 54 45 20 69 73 20 63 6f 70 69 65   DELETE is copie
7db0: 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
7dc0: 74 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 20  t changeset..** 
7dd0: 20 20 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45    <tr><td>DELETE
7de0: 20 3c 74 64 3e 49 4e 53 45 52 54 20 3c 74 64 3e   <td>INSERT <td>
7df0: 0a 2a 2a 20 20 20 20 20 20 20 49 66 20 6f 6e 65  .**       If one
7e00: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
7e10: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 69 6e  column values in
7e20: 20 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74 65   the row inserte
7e30: 64 20 62 79 20 63 68 61 6e 67 65 20 0a 2a 2a 20  d by change .** 
7e40: 20 20 20 20 20 20 42 20 64 69 66 66 65 72 20 66        B differ f
7e50: 72 6f 6d 20 74 68 6f 73 65 20 69 6e 20 74 68 65  rom those in the
7e60: 20 72 6f 77 20 64 65 6c 65 74 65 64 20 62 79 20   row deleted by 
7e70: 63 68 61 6e 67 65 20 41 2c 20 61 6e 20 55 50 44  change A, an UPD
7e80: 41 54 45 0a 2a 2a 20 20 20 20 20 20 20 63 68 61  ATE.**       cha
7e90: 6e 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  nge is added to 
7ea0: 74 68 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67  the output chang
7eb0: 65 73 65 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  eset. Otherwise,
7ec0: 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 65 64   if the inserted
7ed0: 0a 2a 2a 20 20 20 20 20 20 20 72 6f 77 20 69 73  .**       row is
7ee0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7ef0: 65 20 61 73 20 74 68 65 20 64 65 6c 65 74 65 64  e as the deleted
7f00: 20 72 6f 77 2c 20 6e 6f 20 63 68 61 6e 67 65 20   row, no change 
7f10: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20  is added to.**  
7f20: 20 20 20 20 20 74 68 65 20 6f 75 74 70 75 74 20       the output 
7f30: 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 20 20 20  changeset..**   
7f40: 3c 74 72 3e 3c 74 64 3e 44 45 4c 45 54 45 20 3c  <tr><td>DELETE <
7f50: 74 64 3e 55 50 44 41 54 45 20 3c 74 64 3e 0a 2a  td>UPDATE <td>.*
7f60: 2a 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 41  *       Change A
7f70: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
7f80: 74 68 65 20 6f 75 74 70 75 74 20 63 68 61 6e 67  the output chang
7f90: 65 73 65 74 2e 20 43 68 61 6e 67 65 20 42 20 69  eset. Change B i
7fa0: 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 20  s discarded..** 
7fb0: 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
7fc0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 69  does not occur i
7fd0: 66 20 63 68 61 6e 67 65 73 65 74 20 42 20 69 73  f changeset B is
7fe0: 20 72 65 63 6f 72 64 65 64 20 69 6d 6d 65 64 69   recorded immedi
7ff0: 61 74 65 6c 79 20 61 66 74 65 72 0a 2a 2a 20 20  ately after.**  
8000: 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 41       changeset A
8010: 2e 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e  . .**   <tr><td>
8020: 44 45 4c 45 54 45 20 3c 74 64 3e 44 45 4c 45 54  DELETE <td>DELET
8030: 45 20 3c 74 64 3e 0a 2a 2a 20 20 20 20 20 20 20  E <td>.**       
8040: 43 68 61 6e 67 65 20 41 20 69 73 20 63 6f 70 69  Change A is copi
8050: 65 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ed into the outp
8060: 75 74 20 63 68 61 6e 67 65 73 65 74 2e 20 43 68  ut changeset. Ch
8070: 61 6e 67 65 20 42 20 69 73 20 64 69 73 63 61 72  ange B is discar
8080: 64 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 54 68  ded..**       Th
8090: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
80a0: 20 6f 63 63 75 72 20 69 66 20 63 68 61 6e 67 65   occur if change
80b0: 73 65 74 20 42 20 69 73 20 72 65 63 6f 72 64 65  set B is recorde
80c0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
80d0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 63 68 61  ter.**       cha
80e0: 6e 67 65 73 65 74 20 41 2e 20 0a 2a 2a 20 3c 2f  ngeset A. .** </
80f0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
8100: 74 68 65 20 74 77 6f 20 63 68 61 6e 67 65 73 65  the two changese
8110: 74 73 20 63 6f 6e 74 61 69 6e 20 63 68 61 6e 67  ts contain chang
8120: 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
8130: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e  able, then the n
8140: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75  umber.** of colu
8150: 6d 6e 73 20 61 6e 64 20 74 68 65 20 70 6f 73 69  mns and the posi
8160: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 69 6d  tion of the prim
8170: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
8180: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
8190: 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61 6d  st.** be the sam
81a0: 65 20 69 6e 20 65 61 63 68 20 63 68 61 6e 67 65  e in each change
81b0: 73 65 74 2e 20 49 66 20 74 68 69 73 20 69 73 20  set. If this is 
81c0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 61 74  not the case, at
81d0: 74 65 6d 70 74 69 6e 67 20 74 6f 0a 2a 2a 20 63  tempting to.** c
81e0: 6f 6e 63 61 74 65 6e 61 74 65 20 74 68 65 20 74  oncatenate the t
81f0: 77 6f 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f  wo changesets to
8200: 67 65 74 68 65 72 20 66 61 69 6c 73 20 61 6e 64  gether fails and
8210: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
8220: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
8230: 5f 53 43 48 45 4d 41 2e 20 49 66 20 65 69 74 68  _SCHEMA. If eith
8240: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 69 6e  er of the two in
8250: 70 75 74 20 63 68 61 6e 67 65 73 65 74 73 20 61  put changesets a
8260: 70 70 65 61 72 20 74 6f 20 62 65 20 63 6f 72 72  ppear to be corr
8270: 75 70 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  upt,.** and the 
8280: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
8290: 74 65 63 74 65 64 2c 20 53 51 4c 49 54 45 5f 43  tected, SQLITE_C
82a0: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
82b0: 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 0a 2a 2a  ed. Or, if an.**
82c0: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
82d0: 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 20  ondition occurs 
82e0: 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  during processin
82f0: 67 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  g, this function
8300: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49   returns.** SQLI
8310: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20  TE_NOMEM..**.** 
8320: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
8330: 62 6f 76 65 20 65 72 72 6f 72 73 20 6f 63 63 75  bove errors occu
8340: 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
8350: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
8360: 4f 75 74 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f  Out set.** to po
8370: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
8380: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f  containing the o
8390: 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74 2e  utput changeset.
83a0: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
83b0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
83c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
83d0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
83e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
83f0: 20 2a 70 70 4f 75 74 20 0a 2a 2a 20 74 6f 20 72   *ppOut .** to r
8400: 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 61 6c  elease memory al
8410: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8420: 62 75 66 66 65 72 2e 20 2a 70 6e 4f 75 74 20 69  buffer. *pnOut i
8430: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
8440: 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
8450: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 63   in the output c
8460: 68 61 6e 67 65 73 65 74 2e 20 49 66 20 61 6e 20  hangeset. If an 
8470: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
8480: 2c 20 62 6f 74 68 20 2a 70 70 4f 75 74 20 61 6e  , both *ppOut an
8490: 64 20 0a 2a 2a 20 2a 70 6e 4f 75 74 20 61 72 65  d .** *pnOut are
84a0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66   set to zero bef
84b0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
84c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
84d0: 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 28 0a 20  ngeset_concat(. 
84e0: 20 69 6e 74 20 6e 41 2c 20 20 20 20 20 20 20 20   int nA,        
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
8510: 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 70 41  tes in buffer pA
8520: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 2c 20   */.  void *pA, 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8550: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
8560: 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20  ining changeset 
8570: 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 2c 20 20  A */.  int nB,  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
85a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66   of bytes in buf
85b0: 66 65 72 20 70 42 20 2a 2f 0a 20 20 76 6f 69 64  fer pB */.  void
85c0: 20 2a 70 42 2c 20 20 20 20 20 20 20 20 20 20 20   *pB,           
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
85e0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
85f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e   containing chan
8600: 67 65 73 65 74 20 42 20 2a 2f 0a 20 20 69 6e 74  geset B */.  int
8610: 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20 20 20   *pnOut,        
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8630: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  OUT: Number of b
8640: 79 74 65 73 20 69 6e 20 6f 75 74 70 75 74 20 63  ytes in output c
8650: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f  hangeset */.  vo
8660: 69 64 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  id **ppOut      
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8680: 20 4f 55 54 3a 20 42 75 66 66 65 72 20 63 6f 6e   OUT: Buffer con
8690: 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20 63  taining output c
86a0: 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a 0a  hangeset */.);..
86b0: 2f 2a 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20  /*.** CAPI3REF: 
86c0: 41 70 70 6c 79 20 41 20 43 68 61 6e 67 65 73 65  Apply A Changese
86d0: 74 20 54 6f 20 41 20 44 61 74 61 62 61 73 65 0a  t To A Database.
86e0: 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 63 68  **.** Apply a ch
86f0: 61 6e 67 65 73 65 74 20 74 6f 20 61 20 64 61 74  angeset to a dat
8700: 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63  abase. This func
8710: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
8720: 20 75 70 64 61 74 65 20 74 68 65 0a 2a 2a 20 22   update the.** "
8730: 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 20 61  main" database a
8740: 74 74 61 63 68 65 64 20 74 6f 20 68 61 6e 64 6c  ttached to handl
8750: 65 20 64 62 20 77 69 74 68 20 74 68 65 20 63 68  e db with the ch
8760: 61 6e 67 65 73 20 66 6f 75 6e 64 20 69 6e 20 74  anges found in t
8770: 68 65 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20  he.** changeset 
8780: 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
8790: 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
87a0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  arguments..**.**
87b0: 20 54 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   The fourth argu
87c0: 6d 65 6e 74 20 28 78 46 69 6c 74 65 72 29 20 70  ment (xFilter) p
87d0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
87e0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 22 66  nction is the "f
87f0: 69 6c 74 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ilter.** callbac
8800: 6b 22 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  k". If it is not
8810: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 6f 72 20   NULL, then for 
8820: 65 61 63 68 20 74 61 62 6c 65 20 61 66 66 65 63  each table affec
8830: 74 65 64 20 62 79 20 61 74 20 6c 65 61 73 74 20  ted by at least 
8840: 6f 6e 65 0a 2a 2a 20 63 68 61 6e 67 65 20 69 6e  one.** change in
8850: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
8860: 74 68 65 20 66 69 6c 74 65 72 20 63 61 6c 6c 62  the filter callb
8870: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ack is invoked w
8880: 69 74 68 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ith.** the table
8890: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 73 65 63   name as the sec
88a0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e  ond argument, an
88b0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
88c0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 0a  context pointer.
88d0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
88e0: 20 73 69 78 74 68 20 61 72 67 75 6d 65 6e 74 20   sixth argument 
88f0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8900: 20 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 49   as the first. I
8910: 66 20 74 68 65 20 22 66 69 6c 74 65 72 0a 2a 2a  f the "filter.**
8920: 20 63 61 6c 6c 62 61 63 6b 22 20 72 65 74 75 72   callback" retur
8930: 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6e 6f  ns zero, then no
8940: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
8950: 20 74 6f 20 61 70 70 6c 79 20 61 6e 79 20 63 68   to apply any ch
8960: 61 6e 67 65 73 20 74 6f 20 0a 2a 2a 20 74 68 65  anges to .** the
8970: 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
8980: 65 2c 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  e, if the return
8990: 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
89a0: 72 6f 20 6f 72 20 74 68 65 20 78 46 69 6c 74 65  ro or the xFilte
89b0: 72 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  r.** argument to
89c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
89d0: 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 63 68 61 6e  s NULL, all chan
89e0: 67 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ges related to t
89f0: 68 65 20 74 61 62 6c 65 20 61 72 65 0a 2a 2a 20  he table are.** 
8a00: 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
8a10: 20 46 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   For each table 
8a20: 74 68 61 74 20 69 73 20 6e 6f 74 20 65 78 63 6c  that is not excl
8a30: 75 64 65 64 20 62 79 20 74 68 65 20 66 69 6c 74  uded by the filt
8a40: 65 72 20 63 61 6c 6c 62 61 63 6b 2c 20 74 68 69  er callback, thi
8a50: 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 74  s function .** t
8a60: 65 73 74 73 20 74 68 61 74 20 74 68 65 20 74 61  ests that the ta
8a70: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63 6f  rget database co
8a80: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 70 61 74 69  ntains a compati
8a90: 62 6c 65 20 74 61 62 6c 65 2e 20 41 20 74 61 62  ble table. A tab
8aa0: 6c 65 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  le is .** consid
8ab0: 65 72 65 64 20 63 6f 6d 70 61 74 69 62 6c 65 20  ered compatible 
8ac0: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
8ad0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
8ae0: 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  :.**.** <ul>.** 
8af0: 20 20 3c 6c 69 3e 20 54 68 65 20 74 61 62 6c 65    <li> The table
8b00: 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
8b10: 6d 65 20 61 73 20 74 68 65 20 6e 61 6d 65 20 72  me as the name r
8b20: 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a  ecorded in the .
8b30: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
8b40: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c  set, and.**   <l
8b50: 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61 73  i> The table has
8b60: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
8b70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 73 20 72   of columns as r
8b80: 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 0a  ecorded in the .
8b90: 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  **        change
8ba0: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 3c 6c  set, and.**   <l
8bb0: 69 3e 20 54 68 65 20 74 61 62 6c 65 20 68 61 73  i> The table has
8bc0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
8bd0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 61 6d 65  umns in the same
8be0: 20 70 6f 73 69 74 69 6f 6e 20 61 73 20 0a 2a 2a   position as .**
8bf0: 20 20 20 20 20 20 20 20 72 65 63 6f 72 64 65 64          recorded
8c00: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
8c10: 74 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a  t..** </ul>.**.*
8c20: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
8c30: 20 63 6f 6d 70 61 74 69 62 6c 65 20 74 61 62 6c   compatible tabl
8c40: 65 2c 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20  e, it is not an 
8c50: 65 72 72 6f 72 2c 20 62 75 74 20 6e 6f 6e 65 20  error, but none 
8c60: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65  of the.** change
8c70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
8c80: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
8c90: 61 70 70 6c 69 65 64 2e 20 41 20 77 61 72 6e 69  applied. A warni
8ca0: 6e 67 20 6d 65 73 73 61 67 65 20 69 73 20 69 73  ng message is is
8cb0: 73 75 65 64 0a 2a 2a 20 76 69 61 20 74 68 65 20  sued.** via the 
8cc0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65  sqlite3_log() me
8cd0: 63 68 61 6e 69 73 6d 20 77 69 74 68 20 74 68 65  chanism with the
8ce0: 20 65 72 72 6f 72 20 63 6f 64 65 20 53 51 4c 49   error code SQLI
8cf0: 54 45 5f 53 43 48 45 4d 41 2e 20 41 74 20 6d 6f  TE_SCHEMA. At mo
8d00: 73 74 0a 2a 2a 20 6f 6e 65 20 73 75 63 68 20 77  st.** one such w
8d10: 61 72 6e 69 6e 67 20 69 73 20 69 73 73 75 65 64  arning is issued
8d20: 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
8d30: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
8d40: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
8d50: 20 63 68 61 6e 67 65 20 66 6f 72 20 77 68 69 63   change for whic
8d60: 68 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6d  h there is a com
8d70: 70 61 74 69 62 6c 65 20 74 61 62 6c 65 2c 20 61  patible table, a
8d80: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
8d90: 65 20 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  e .** to modify 
8da0: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  the table conten
8db0: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
8dc0: 74 68 65 20 55 50 44 41 54 45 2c 20 49 4e 53 45  the UPDATE, INSE
8dd0: 52 54 20 6f 72 20 44 45 4c 45 54 45 20 0a 2a 2a  RT or DELETE .**
8de0: 20 63 68 61 6e 67 65 2e 20 49 66 20 61 20 63 68   change. If a ch
8df0: 61 6e 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  ange cannot be a
8e00: 70 70 6c 69 65 64 20 63 6c 65 61 6e 6c 79 2c 20  pplied cleanly, 
8e10: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
8e20: 64 6c 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  dler .** functio
8e30: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
8e40: 66 69 66 74 68 20 61 72 67 75 6d 65 6e 74 20 74  fifth argument t
8e50: 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  o sqlite3changes
8e60: 65 74 5f 61 70 70 6c 79 28 29 20 6d 61 79 20 62  et_apply() may b
8e70: 65 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 41  e .** invoked. A
8e80: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
8e90: 65 78 61 63 74 6c 79 20 77 68 65 6e 20 74 68 65  exactly when the
8ea0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
8eb0: 72 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 72  r is invoked for
8ec0: 20 0a 2a 2a 20 65 61 63 68 20 74 79 70 65 20 6f   .** each type o
8ed0: 66 20 63 68 61 6e 67 65 20 69 73 20 62 65 6c 6f  f change is belo
8ee0: 77 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20  w..**.** Unlike 
8ef0: 74 68 65 20 78 46 69 6c 74 65 72 20 61 72 67 75  the xFilter argu
8f00: 6d 65 6e 74 2c 20 78 43 6f 6e 66 6c 69 63 74 20  ment, xConflict 
8f10: 6d 61 79 20 6e 6f 74 20 62 65 20 70 61 73 73 65  may not be passe
8f20: 64 20 4e 55 4c 4c 2e 20 54 68 65 20 72 65 73 75  d NULL. The resu
8f30: 6c 74 73 0a 2a 2a 20 6f 66 20 70 61 73 73 69 6e  lts.** of passin
8f40: 67 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  g anything other
8f50: 20 74 68 61 6e 20 61 20 76 61 6c 69 64 20 66 75   than a valid fu
8f60: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 61  nction pointer a
8f70: 73 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 0a  s the xConflict.
8f80: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20  ** argument are 
8f90: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
8fa0: 20 45 61 63 68 20 74 69 6d 65 20 74 68 65 20 63   Each time the c
8fb0: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
8fc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
8fd0: 6b 65 64 2c 20 69 74 20 6d 75 73 74 20 72 65 74  ked, it must ret
8fe0: 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20 5b 53  urn one.** of [S
8ff0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
9000: 4f 4d 49 54 5d 2c 20 5b 53 51 4c 49 54 45 5f 43  OMIT], [SQLITE_C
9010: 48 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 5d 20  HANGESET_ABORT] 
9020: 6f 72 20 0a 2a 2a 20 5b 53 51 4c 49 54 45 5f 43  or .** [SQLITE_C
9030: 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
9040: 5d 2e 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ]. SQLITE_CHANGE
9050: 53 45 54 5f 52 45 50 4c 41 43 45 20 6d 61 79 20  SET_REPLACE may 
9060: 6f 6e 6c 79 20 62 65 20 72 65 74 75 72 6e 65 64  only be returned
9070: 0a 2a 2a 20 69 66 20 74 68 65 20 73 65 63 6f 6e  .** if the secon
9080: 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  d argument passe
9090: 64 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  d to the conflic
90a0: 74 20 68 61 6e 64 6c 65 72 20 69 73 20 65 69 74  t handler is eit
90b0: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 48  her.** SQLITE_CH
90c0: 41 4e 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20  ANGESET_DATA or 
90d0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
90e0: 5f 43 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68  _CONFLICT. If th
90f0: 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c  e conflict-handl
9100: 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
9110: 20 69 6c 6c 65 67 61 6c 20 76 61 6c 75 65 2c 20   illegal value, 
9120: 61 6e 79 20 63 68 61 6e 67 65 73 20 61 6c 72 65  any changes alre
9130: 61 64 79 20 6d 61 64 65 20 61 72 65 20 72 6f 6c  ady made are rol
9140: 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20  led back and.** 
9150: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
9160: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
9170: 6c 79 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c  ly() returns SQL
9180: 49 54 45 5f 4d 49 53 55 53 45 2e 20 44 69 66 66  ITE_MISUSE. Diff
9190: 65 72 65 6e 74 20 0a 2a 2a 20 61 63 74 69 6f 6e  erent .** action
91a0: 73 20 61 72 65 20 74 61 6b 65 6e 20 62 79 20 73  s are taken by s
91b0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
91c0: 61 70 70 6c 79 28 29 20 64 65 70 65 6e 64 69 6e  apply() dependin
91d0: 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  g on the value.*
91e0: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 65 61  * returned by ea
91f0: 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ch invocation of
9200: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61   the conflict-ha
9210: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20  ndler function. 
9220: 52 65 66 65 72 20 74 6f 0a 2a 2a 20 74 68 65 20  Refer to.** the 
9230: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
9240: 72 20 74 68 65 20 74 68 72 65 65 20 0a 2a 2a 20  r the three .** 
9250: 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  [SQLITE_CHANGESE
9260: 54 5f 4f 4d 49 54 7c 61 76 61 69 6c 61 62 6c 65  T_OMIT|available
9270: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 5d 20   return values] 
9280: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
9290: 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 44  ** <dl>.** <dt>D
92a0: 45 4c 45 54 45 20 43 68 61 6e 67 65 73 3c 64 64  ELETE Changes<dd
92b0: 3e 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68 20  >.**   For each 
92c0: 44 45 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 74  DELETE change, t
92d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
92e0: 63 6b 73 20 69 66 20 74 68 65 20 74 61 72 67 65  cks if the targe
92f0: 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  t database .**  
9300: 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20   contains a row 
9310: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72  with the same pr
9320: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 20  imary key value 
9330: 28 6f 72 20 76 61 6c 75 65 73 29 20 61 73 20 74  (or values) as t
9340: 68 65 20 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61  he .**   origina
9350: 6c 20 72 6f 77 20 76 61 6c 75 65 73 20 73 74 6f  l row values sto
9360: 72 65 64 20 69 6e 20 74 68 65 20 63 68 61 6e 67  red in the chang
9370: 65 73 65 74 2e 20 49 66 20 69 74 20 64 6f 65 73  eset. If it does
9380: 2c 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73  , and the values
9390: 20 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e   .**   stored in
93a0: 20 61 6c 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79   all non-primary
93b0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73   key columns als
93c0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
93d0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a  es stored in .**
93e0: 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 65 74     the changeset
93f0: 20 74 68 65 20 72 6f 77 20 69 73 20 64 65 6c 65   the row is dele
9400: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 61 72  ted from the tar
9410: 67 65 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  get database..**
9420: 0a 2a 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77  .**   If a row w
9430: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69  ith matching pri
9440: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20  mary key values 
9450: 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e  is found, but on
9460: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20  e or more of.** 
9470: 20 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72    the non-primar
9480: 79 20 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e  y key fields con
9490: 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69  tains a value di
94a0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
94b0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 72   original.**   r
94c0: 6f 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ow value stored 
94d0: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
94e0: 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68  , the conflict-h
94f0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
9500: 69 73 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20  is.**   invoked 
9510: 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41  with [SQLITE_CHA
9520: 4e 47 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20  NGESET_DATA] as 
9530: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9540: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20  ent..**.**   If 
9550: 6e 6f 20 72 6f 77 20 77 69 74 68 20 6d 61 74 63  no row with matc
9560: 68 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  hing primary key
9570: 20 76 61 6c 75 65 73 20 69 73 20 66 6f 75 6e 64   values is found
9580: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9590: 2c 0a 2a 2a 20 20 20 74 68 65 20 63 6f 6e 66 6c  ,.**   the confl
95a0: 69 63 74 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  ict-handler func
95b0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
95c0: 77 69 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41  with [SQLITE_CHA
95d0: 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d  NGESET_NOTFOUND]
95e0: 0a 2a 2a 20 20 20 70 61 73 73 65 64 20 61 73 20  .**   passed as 
95f0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9600: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20  ent..**.**   If 
9610: 74 68 65 20 44 45 4c 45 54 45 20 6f 70 65 72 61  the DELETE opera
9620: 74 69 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65  tion is attempte
9630: 64 2c 20 62 75 74 20 53 51 4c 69 74 65 20 72 65  d, but SQLite re
9640: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 4e  turns SQLITE_CON
9650: 53 54 52 41 49 4e 54 0a 2a 2a 20 20 20 28 77 68  STRAINT.**   (wh
9660: 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
9670: 70 65 6e 20 69 66 20 61 20 66 6f 72 65 69 67 6e  pen if a foreign
9680: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
9690: 69 73 20 76 69 6f 6c 61 74 65 64 29 2c 20 74 68  is violated), th
96a0: 65 0a 2a 2a 20 20 20 63 6f 6e 66 6c 69 63 74 2d  e.**   conflict-
96b0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
96c0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
96d0: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
96e0: 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 0a 2a  ET_CONSTRAINT].*
96f0: 2a 20 20 20 70 61 73 73 65 64 20 61 73 20 74 68  *   passed as th
9700: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9710: 74 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  t. This includes
9720: 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
9730: 74 68 65 20 44 45 4c 45 54 45 0a 2a 2a 20 20 20  the DELETE.**   
9740: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 74 74  operation is att
9750: 65 6d 70 74 65 64 20 62 65 63 61 75 73 65 20 61  empted because a
9760: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
9770: 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  o the conflict h
9780: 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 66 75 6e 63  andler.**   func
9790: 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 5b 53  tion returned [S
97a0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
97b0: 52 45 50 4c 41 43 45 5d 2e 0a 2a 2a 0a 2a 2a 20  REPLACE]..**.** 
97c0: 3c 64 74 3e 49 4e 53 45 52 54 20 43 68 61 6e 67  <dt>INSERT Chang
97d0: 65 73 3c 64 64 3e 0a 2a 2a 20 20 20 46 6f 72 20  es<dd>.**   For 
97e0: 65 61 63 68 20 49 4e 53 45 52 54 20 63 68 61 6e  each INSERT chan
97f0: 67 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69  ge, an attempt i
9800: 73 20 6d 61 64 65 20 74 6f 20 69 6e 73 65 72 74  s made to insert
9810: 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74   the new row int
9820: 6f 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62  o.**   the datab
9830: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20  ase..**.**   If 
9840: 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 69  the attempt to i
9850: 6e 73 65 72 74 20 74 68 65 20 72 6f 77 20 66 61  nsert the row fa
9860: 69 6c 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ils because the 
9870: 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
9880: 20 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20   .**   contains 
9890: 61 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 73  a row with the s
98a0: 61 6d 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ame primary key 
98b0: 76 61 6c 75 65 73 2c 20 74 68 65 20 63 6f 6e 66  values, the conf
98c0: 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  lict handler.** 
98d0: 20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e    function is in
98e0: 76 6f 6b 65 64 20 77 69 74 68 20 74 68 65 20 73  voked with the s
98f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
9900: 65 74 20 74 6f 20 0a 2a 2a 20 20 20 5b 53 51 4c  et to .**   [SQL
9910: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
9920: 4e 46 4c 49 43 54 5d 2e 0a 2a 2a 0a 2a 2a 20 20  NFLICT]..**.**  
9930: 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   If the attempt 
9940: 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 72 6f  to insert the ro
9950: 77 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  w fails because 
9960: 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  of some other co
9970: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 76 69  nstraint.**   vi
9980: 6f 6c 61 74 69 6f 6e 20 28 65 2e 67 2e 20 4e 4f  olation (e.g. NO
9990: 54 20 4e 55 4c 4c 20 6f 72 20 55 4e 49 51 55 45  T NULL or UNIQUE
99a0: 29 2c 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ), the conflict 
99b0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
99c0: 20 69 73 20 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65   is .**   invoke
99d0: 64 20 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e  d with the secon
99e0: 64 20 61 72 67 75 6d 65 6e 74 20 73 65 74 20 74  d argument set t
99f0: 6f 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  o [SQLITE_CHANGE
9a00: 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 2e  SET_CONSTRAINT].
9a10: 0a 2a 2a 20 20 20 54 68 69 73 20 69 6e 63 6c 75  .**   This inclu
9a20: 64 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65  des the case whe
9a30: 72 65 20 74 68 65 20 49 4e 53 45 52 54 20 6f 70  re the INSERT op
9a40: 65 72 61 74 69 6f 6e 20 69 73 20 72 65 2d 61 74  eration is re-at
9a50: 74 65 6d 70 74 65 64 20 62 65 63 61 75 73 65 20  tempted because 
9a60: 0a 2a 2a 20 20 20 61 6e 20 65 61 72 6c 69 65 72  .**   an earlier
9a70: 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 6f 6e   call to the con
9a80: 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 66 75  flict handler fu
9a90: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
9aa0: 0a 2a 2a 20 20 20 5b 53 51 4c 49 54 45 5f 43 48  .**   [SQLITE_CH
9ab0: 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 5d  ANGESET_REPLACE]
9ac0: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 55 50 44 41  ..**.** <dt>UPDA
9ad0: 54 45 20 43 68 61 6e 67 65 73 3c 64 64 3e 0a 2a  TE Changes<dd>.*
9ae0: 2a 20 20 20 46 6f 72 20 65 61 63 68 20 55 50 44  *   For each UPD
9af0: 41 54 45 20 63 68 61 6e 67 65 2c 20 74 68 69 73  ATE change, this
9b00: 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
9b10: 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20 64   if the target d
9b20: 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 63 6f  atabase .**   co
9b30: 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77 69 74  ntains a row wit
9b40: 68 20 74 68 65 20 73 61 6d 65 20 70 72 69 6d 61  h the same prima
9b50: 72 79 20 6b 65 79 20 76 61 6c 75 65 20 28 6f 72  ry key value (or
9b60: 20 76 61 6c 75 65 73 29 20 61 73 20 74 68 65 20   values) as the 
9b70: 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20 72  .**   original r
9b80: 6f 77 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  ow values stored
9b90: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
9ba0: 74 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 61  t. If it does, a
9bb0: 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 0a 2a  nd the values .*
9bc0: 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20 61 6c  *   stored in al
9bd0: 6c 20 6e 6f 6e 2d 70 72 69 6d 61 72 79 20 6b 65  l non-primary ke
9be0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6c 73 6f 20 6d  y columns also m
9bf0: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 73 20  atch the values 
9c00: 73 74 6f 72 65 64 20 69 6e 20 0a 2a 2a 20 20 20  stored in .**   
9c10: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74 68  the changeset th
9c20: 65 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  e row is updated
9c30: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 72 67   within the targ
9c40: 65 74 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  et database..**.
9c50: 2a 2a 20 20 20 49 66 20 61 20 72 6f 77 20 77 69  **   If a row wi
9c60: 74 68 20 6d 61 74 63 68 69 6e 67 20 70 72 69 6d  th matching prim
9c70: 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ary key values i
9c80: 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 6f 6e 65  s found, but one
9c90: 20 6f 72 20 6d 6f 72 65 20 6f 66 0a 2a 2a 20 20   or more of.**  
9ca0: 20 74 68 65 20 6e 6f 6e 2d 70 72 69 6d 61 72 79   the non-primary
9cb0: 20 6b 65 79 20 66 69 65 6c 64 73 20 63 6f 6e 74   key fields cont
9cc0: 61 69 6e 73 20 61 20 76 61 6c 75 65 20 64 69 66  ains a value dif
9cd0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 61 6e 20 6f  ferent from an o
9ce0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 72 6f 77  riginal.**   row
9cf0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
9d00: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
9d10: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e  the conflict-han
9d20: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  dler function is
9d30: 0a 2a 2a 20 20 20 69 6e 76 6f 6b 65 64 20 77 69  .**   invoked wi
9d40: 74 68 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47  th [SQLITE_CHANG
9d50: 45 53 45 54 5f 44 41 54 41 5d 20 61 73 20 74 68  ESET_DATA] as th
9d60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9d70: 74 2e 20 53 69 6e 63 65 0a 2a 2a 20 20 20 55 50  t. Since.**   UP
9d80: 44 41 54 45 20 63 68 61 6e 67 65 73 20 6f 6e 6c  DATE changes onl
9d90: 79 20 63 6f 6e 74 61 69 6e 20 76 61 6c 75 65 73  y contain values
9da0: 20 66 6f 72 20 6e 6f 6e 2d 70 72 69 6d 61 72 79   for non-primary
9db0: 20 6b 65 79 20 66 69 65 6c 64 73 20 74 68 61 74   key fields that
9dc0: 20 61 72 65 0a 2a 2a 20 20 20 74 6f 20 62 65 20   are.**   to be 
9dd0: 6d 6f 64 69 66 69 65 64 2c 20 6f 6e 6c 79 20 74  modified, only t
9de0: 68 6f 73 65 20 66 69 65 6c 64 73 20 6e 65 65 64  hose fields need
9df0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6f 72   to match the or
9e00: 69 67 69 6e 61 6c 20 76 61 6c 75 65 73 20 74 6f  iginal values to
9e10: 0a 2a 2a 20 20 20 61 76 6f 69 64 20 74 68 65 20  .**   avoid the 
9e20: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
9e30: 5f 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 2d 68  _DATA conflict-h
9e40: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e  andler callback.
9e50: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 6e 6f 20 72  .**.**   If no r
9e60: 6f 77 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67  ow with matching
9e70: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
9e80: 75 65 73 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ues is found in 
9e90: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
9ea0: 20 20 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d     the conflict-
9eb0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
9ec0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68   is invoked with
9ed0: 20 5b 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53   [SQLITE_CHANGES
9ee0: 45 54 5f 4e 4f 54 46 4f 55 4e 44 5d 0a 2a 2a 20  ET_NOTFOUND].** 
9ef0: 20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20    passed as the 
9f00: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
9f10: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  .**.**   If the 
9f20: 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
9f30: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2c 20 62   is attempted, b
9f40: 75 74 20 53 51 4c 69 74 65 20 72 65 74 75 72 6e  ut SQLite return
9f50: 73 20 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 43  s .**   SQLITE_C
9f60: 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 20 63  ONSTRAINT, the c
9f70: 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20  onflict-handler 
9f80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
9f90: 6b 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 5b  ked with .**   [
9fa0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
9fb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5d 20 70 61 73  _CONSTRAINT] pas
9fc0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
9fd0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20  d argument..**  
9fe0: 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 74   This includes t
9ff0: 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68  he case where th
a000: 65 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  e UPDATE operati
a010: 6f 6e 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  on is attempted 
a020: 61 66 74 65 72 20 0a 2a 2a 20 20 20 61 6e 20 65  after .**   an e
a030: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 74  arlier call to t
a040: 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
a050: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ler function ret
a060: 75 72 6e 65 64 0a 2a 2a 20 20 20 5b 53 51 4c 49  urned.**   [SQLI
a070: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50  TE_CHANGESET_REP
a080: 4c 41 43 45 5d 2e 20 20 0a 2a 2a 20 3c 2f 64 6c  LACE].  .** </dl
a090: 3e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 73 61  >.**.** It is sa
a0a0: 66 65 20 74 6f 20 65 78 65 63 75 74 65 20 53 51  fe to execute SQ
a0b0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e  L statements, in
a0c0: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68  cluding those th
a0d0: 61 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a  at write to the.
a0e0: 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  ** table that th
a0f0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 6c 61 74  e callback relat
a100: 65 64 20 74 6f 2c 20 66 72 6f 6d 20 77 69 74 68  ed to, from with
a110: 69 6e 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74  in the xConflict
a120: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
a130: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
a140: 6f 20 66 75 72 74 68 65 72 20 63 75 73 74 6f 6d  o further custom
a150: 69 7a 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  ize the applicat
a160: 69 6f 6e 73 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a  ions conflict.**
a170: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61   resolution stra
a180: 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  tegy..**.** All 
a190: 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
a1a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 72  this function ar
a1b0: 65 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 61 20  e enclosed in a 
a1c0: 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
a1d0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ction..** If any
a1e0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 28 61 73   other error (as
a1f0: 69 64 65 20 66 72 6f 6d 20 61 20 63 6f 6e 73 74  ide from a const
a200: 72 61 69 6e 74 20 66 61 69 6c 75 72 65 20 77 68  raint failure wh
a210: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
a220: 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
a230: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
a240: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  ) occurs, then t
a250: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61  he savepoint tra
a260: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 72  nsaction is.** r
a270: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 72 65 73 74  olled back, rest
a280: 6f 72 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  oring the target
a290: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
a2a0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2c   original state,
a2b0: 20 61 6e 64 20 61 6e 20 0a 2a 2a 20 53 51 4c 69   and an .** SQLi
a2c0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  te error code re
a2d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
a2e0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
a2f0: 61 70 70 6c 79 28 0a 20 20 73 71 6c 69 74 65 33  apply(.  sqlite3
a300: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
a310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
a320: 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
a330: 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
a340: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ndle */.  int nC
a350: 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20  hangeset,       
a360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a370: 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20 69  e of changeset i
a380: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69  n bytes */.  voi
a390: 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20 20  d *pChangeset,  
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3b0: 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20 2a  Changeset blob *
a3c0: 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72  /.  int(*xFilter
a3d0: 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
a3e0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
a3f0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
a400: 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
a410: 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e  ply() */.    con
a420: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20  st char *zTab   
a430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
a440: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c  ble name */.  ),
a450: 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63  .  int(*xConflic
a460: 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  t)(.    void *pC
a470: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
a480: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
a490: 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
a4a0: 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e  pply() */.    in
a4b0: 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20  t eConflict,    
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a4d0: 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f  ATA, MISSING, CO
a4e0: 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49  NFLICT, CONSTRAI
a4f0: 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NT */.    sqlite
a500: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
a510: 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c   *p     /* Handl
a520: 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61  e describing cha
a530: 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74  nge and conflict
a540: 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20   */.  ),.  void 
a550: 2a 70 43 74 78 20 20 20 20 20 20 20 20 20 20 20  *pCtx           
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
a570: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
a580: 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74  sed to xConflict
a590: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43   */.);../* .** C
a5a0: 41 50 49 33 52 45 46 3a 20 43 6f 6e 73 74 61 6e  API3REF: Constan
a5b0: 74 73 20 50 61 73 73 65 64 20 54 6f 20 54 68 65  ts Passed To The
a5c0: 20 43 6f 6e 66 6c 69 63 74 20 48 61 6e 64 6c 65   Conflict Handle
a5d0: 72 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74  r.**.** Values t
a5e0: 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
a5f0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
a600: 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 20 63 6f  argument to a co
a610: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 2e 0a  nflict-handler..
a620: 2a 2a 0a 2a 2a 20 3c 64 6c 3e 0a 2a 2a 20 3c 64  **.** <dl>.** <d
a630: 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  t>SQLITE_CHANGES
a640: 45 54 5f 44 41 54 41 3c 64 64 3e 0a 2a 2a 20 20  ET_DATA<dd>.**  
a650: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61   The conflict ha
a660: 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64  ndler is invoked
a670: 20 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f   with CHANGESET_
a680: 44 41 54 41 20 61 73 20 74 68 65 20 73 65 63 6f  DATA as the seco
a690: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 20  nd argument.**  
a6a0: 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   when processing
a6b0: 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44   a DELETE or UPD
a6c0: 41 54 45 20 63 68 61 6e 67 65 20 69 66 20 61 20  ATE change if a 
a6d0: 72 6f 77 20 77 69 74 68 20 74 68 65 20 72 65 71  row with the req
a6e0: 75 69 72 65 64 0a 2a 2a 20 20 20 50 52 49 4d 41  uired.**   PRIMA
a6f0: 52 59 20 4b 45 59 20 66 69 65 6c 64 73 20 69 73  RY KEY fields is
a700: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
a710: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 6f 6e  database, but on
a720: 65 20 6f 72 20 6d 6f 72 65 20 6f 74 68 65 72 20  e or more other 
a730: 0a 2a 2a 20 20 20 28 6e 6f 6e 20 70 72 69 6d 61  .**   (non prima
a740: 72 79 2d 6b 65 79 29 20 66 69 65 6c 64 73 20 6d  ry-key) fields m
a750: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75  odified by the u
a760: 70 64 61 74 65 20 64 6f 20 6e 6f 74 20 63 6f 6e  pdate do not con
a770: 74 61 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 65  tain the .**   e
a780: 78 70 65 63 74 65 64 20 22 62 65 66 6f 72 65 22  xpected "before"
a790: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 0a 2a 2a 20   values..** .** 
a7a0: 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e    The conflictin
a7b0: 67 20 72 6f 77 2c 20 69 6e 20 74 68 69 73 20 63  g row, in this c
a7c0: 61 73 65 2c 20 69 73 20 74 68 65 20 64 61 74 61  ase, is the data
a7d0: 62 61 73 65 20 72 6f 77 20 77 69 74 68 20 74 68  base row with th
a7e0: 65 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 20 20  e matching.**   
a7f0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 20  primary key..** 
a800: 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43  .** <dt>SQLITE_C
a810: 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55 4e  HANGESET_NOTFOUN
a820: 44 3c 64 64 3e 0a 2a 2a 20 20 20 54 68 65 20 63  D<dd>.**   The c
a830: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
a840: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
a850: 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55  CHANGESET_NOTFOU
a860: 4e 44 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ND as the second
a870: 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 77  .**   argument w
a880: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
a890: 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
a8a0: 45 20 63 68 61 6e 67 65 20 69 66 20 61 20 72 6f  E change if a ro
a8b0: 77 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20 20  w with the.**   
a8c0: 72 65 71 75 69 72 65 64 20 50 52 49 4d 41 52 59  required PRIMARY
a8d0: 20 4b 45 59 20 66 69 65 6c 64 73 20 69 73 20 6e   KEY fields is n
a8e0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
a8f0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a  e database..** .
a900: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
a910: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
a920: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 54   in this case. T
a930: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 69 6e  he results of in
a940: 76 6f 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  voking the.**   
a950: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
a960: 5f 63 6f 6e 66 6c 69 63 74 28 29 20 41 50 49 20  _conflict() API 
a970: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
a980: 2a 20 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49 54 45  * .** <dt>SQLITE
a990: 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c  _CHANGESET_CONFL
a9a0: 49 43 54 3c 64 64 3e 0a 2a 2a 20 20 20 43 48 41  ICT<dd>.**   CHA
a9b0: 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20  NGESET_CONFLICT 
a9c0: 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
a9d0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a9e0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   to the conflict
a9f0: 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72 20 77 68  .**   handler wh
aa00: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ile processing a
aa10: 6e 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20  n INSERT change 
aa20: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  if the operation
aa30: 20 77 6f 75 6c 64 20 72 65 73 75 6c 74 20 0a 2a   would result .*
aa40: 2a 20 20 20 69 6e 20 64 75 70 6c 69 63 61 74 65  *   in duplicate
aa50: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
aa60: 75 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68  ues..** .**   Th
aa70: 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
aa80: 77 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  w in this case i
aa90: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  s the database r
aaa0: 6f 77 20 77 69 74 68 20 74 68 65 20 6d 61 74 63  ow with the matc
aab0: 68 69 6e 67 0a 2a 2a 20 20 20 70 72 69 6d 61 72  hing.**   primar
aac0: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74  y key..**.** <dt
aad0: 3e 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  >SQLITE_CHANGESE
aae0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 3c 64 64  T_FOREIGN_KEY<dd
aaf0: 3e 0a 2a 2a 20 20 20 49 66 20 66 6f 72 65 69 67  >.**   If foreig
ab00: 6e 20 6b 65 79 20 68 61 6e 64 6c 69 6e 67 20 69  n key handling i
ab10: 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64 20 61  s enabled, and a
ab20: 70 70 6c 79 69 6e 67 20 61 20 63 68 61 6e 67 65  pplying a change
ab30: 73 65 74 20 6c 65 61 76 65 73 20 74 68 65 0a 2a  set leaves the.*
ab40: 2a 20 20 20 64 61 74 61 62 61 73 65 20 69 6e 20  *   database in 
ab50: 61 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 69  a state containi
ab60: 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  ng foreign key v
ab70: 69 6f 6c 61 74 69 6f 6e 73 2c 20 74 68 65 20 63  iolations, the c
ab80: 6f 6e 66 6c 69 63 74 20 0a 2a 2a 20 20 20 68 61  onflict .**   ha
ab90: 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b 65 64  ndler is invoked
aba0: 20 77 69 74 68 20 43 48 41 4e 47 45 53 45 54 5f   with CHANGESET_
abb0: 46 4f 52 45 49 47 4e 5f 4b 45 59 20 61 73 20 74  FOREIGN_KEY as t
abc0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
abd0: 6e 74 0a 2a 2a 20 20 20 65 78 61 63 74 6c 79 20  nt.**   exactly 
abe0: 6f 6e 63 65 20 62 65 66 6f 72 65 20 74 68 65 20  once before the 
abf0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 63 6f 6d  changeset is com
ac00: 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 20 63  mitted. If the c
ac10: 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 0a  onflict handler.
ac20: 2a 2a 20 20 20 72 65 74 75 72 6e 73 20 43 48 41  **   returns CHA
ac30: 4e 47 45 53 45 54 5f 4f 4d 49 54 2c 20 74 68 65  NGESET_OMIT, the
ac40: 20 63 68 61 6e 67 65 73 2c 20 69 6e 63 6c 75 64   changes, includ
ac50: 69 6e 67 20 74 68 6f 73 65 20 74 68 61 74 20 63  ing those that c
ac60: 61 75 73 65 64 20 74 68 65 0a 2a 2a 20 20 20 66  aused the.**   f
ac70: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
ac80: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2c  raint violation,
ac90: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 2e 20   are committed. 
aca0: 4f 72 2c 20 69 66 20 69 74 20 72 65 74 75 72 6e  Or, if it return
acb0: 73 0a 2a 2a 20 20 20 43 48 41 4e 47 45 53 45 54  s.**   CHANGESET
acc0: 5f 41 42 4f 52 54 2c 20 74 68 65 20 63 68 61 6e  _ABORT, the chan
acd0: 67 65 73 65 74 20 69 73 20 72 6f 6c 6c 65 64 20  geset is rolled 
ace0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f  back..**.**   No
acf0: 20 63 75 72 72 65 6e 74 20 6f 72 20 63 6f 6e 66   current or conf
ad00: 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 66 6f  licting row info
ad10: 72 6d 61 74 69 6f 6e 20 69 73 20 70 72 6f 76 69  rmation is provi
ad20: 64 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 66 75  ded. The only fu
ad30: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 74 20 69  nction.**   it i
ad40: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 61  s possible to ca
ad50: 6c 6c 20 6f 6e 20 74 68 65 20 73 75 70 70 6c 69  ll on the suppli
ad60: 65 64 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ed sqlite3_chang
ad70: 65 73 65 74 5f 69 74 65 72 20 68 61 6e 64 6c 65  eset_iter handle
ad80: 0a 2a 2a 20 20 20 69 73 20 73 71 6c 69 74 65 33  .**   is sqlite3
ad90: 63 68 61 6e 67 65 73 65 74 5f 66 6b 5f 63 6f 6e  changeset_fk_con
ada0: 66 6c 69 63 74 73 28 29 2e 0a 2a 2a 20 0a 2a 2a  flicts()..** .**
adb0: 20 3c 64 74 3e 53 51 4c 49 54 45 5f 43 48 41 4e   <dt>SQLITE_CHAN
adc0: 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54  GESET_CONSTRAINT
add0: 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 61 6e 79  <dd>.**   If any
ade0: 20 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e   other constrain
adf0: 74 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 63 63 75  t violation occu
ae00: 72 73 20 77 68 69 6c 65 20 61 70 70 6c 79 69 6e  rs while applyin
ae10: 67 20 61 20 63 68 61 6e 67 65 20 28 69 2e 65 2e  g a change (i.e.
ae20: 20 0a 2a 2a 20 20 20 61 20 55 4e 49 51 55 45 2c   .**   a UNIQUE,
ae30: 20 43 48 45 43 4b 20 6f 72 20 4e 4f 54 20 4e 55   CHECK or NOT NU
ae40: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 29 2c 20  LL constraint), 
ae50: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  the conflict han
ae60: 64 6c 65 72 20 69 73 20 0a 2a 2a 20 20 20 69 6e  dler is .**   in
ae70: 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41 4e 47  voked with CHANG
ae80: 45 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 20  ESET_CONSTRAINT 
ae90: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
aea0: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 20  gument..** .**  
aeb0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   There is no con
aec0: 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 6e 20  flicting row in 
aed0: 74 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 72  this case. The r
aee0: 65 73 75 6c 74 73 20 6f 66 20 69 6e 76 6f 6b 69  esults of invoki
aef0: 6e 67 20 74 68 65 0a 2a 2a 20 20 20 73 71 6c 69  ng the.**   sqli
af00: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
af10: 66 6c 69 63 74 28 29 20 41 50 49 20 61 72 65 20  flict() API are 
af20: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
af30: 20 3c 2f 64 6c 3e 0a 2a 2f 0a 23 64 65 66 69 6e   </dl>.*/.#defin
af40: 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
af50: 45 54 5f 44 41 54 41 20 20 20 20 20 20 20 20 31  ET_DATA        1
af60: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
af70: 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46 4f 55  CHANGESET_NOTFOU
af80: 4e 44 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20  ND    2.#define 
af90: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
afa0: 5f 43 4f 4e 46 4c 49 43 54 20 20 20 20 33 0a 23  _CONFLICT    3.#
afb0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48  define SQLITE_CH
afc0: 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41 49  ANGESET_CONSTRAI
afd0: 4e 54 20 20 34 0a 23 64 65 66 69 6e 65 20 53 51  NT  4.#define SQ
afe0: 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46  LITE_CHANGESET_F
aff0: 4f 52 45 49 47 4e 5f 4b 45 59 20 35 0a 0a 2f 2a  OREIGN_KEY 5../*
b000: 20 0a 2a 2a 20 43 41 50 49 33 52 45 46 3a 20 43   .** CAPI3REF: C
b010: 6f 6e 73 74 61 6e 74 73 20 52 65 74 75 72 6e 65  onstants Returne
b020: 64 20 42 79 20 54 68 65 20 43 6f 6e 66 6c 69 63  d By The Conflic
b030: 74 20 48 61 6e 64 6c 65 72 0a 2a 2a 0a 2a 2a 20  t Handler.**.** 
b040: 41 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  A conflict handl
b050: 65 72 20 63 61 6c 6c 62 61 63 6b 20 6d 75 73 74  er callback must
b060: 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74   return one of t
b070: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
b080: 65 65 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ee values..**.**
b090: 20 3c 64 6c 3e 0a 2a 2a 20 3c 64 74 3e 53 51 4c   <dl>.** <dt>SQL
b0a0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d  ITE_CHANGESET_OM
b0b0: 49 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 61  IT<dd>.**   If a
b0c0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
b0d0: 72 20 72 65 74 75 72 6e 73 20 74 68 69 73 20 76  r returns this v
b0e0: 61 6c 75 65 20 6e 6f 20 73 70 65 63 69 61 6c 20  alue no special 
b0f0: 61 63 74 69 6f 6e 20 69 73 20 74 61 6b 65 6e 2e  action is taken.
b100: 20 54 68 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65   The.**   change
b110: 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65   that caused the
b120: 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 6e 6f 74   conflict is not
b130: 20 61 70 70 6c 69 65 64 2e 20 54 68 65 20 73 65   applied. The se
b140: 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 20 0a 2a 2a  ssion module .**
b150: 20 20 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20     continues to 
b160: 74 68 65 20 6e 65 78 74 20 63 68 61 6e 67 65 20  the next change 
b170: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
b180: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  ..**.** <dt>SQLI
b190: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50  TE_CHANGESET_REP
b1a0: 4c 41 43 45 3c 64 64 3e 0a 2a 2a 20 20 20 54 68  LACE<dd>.**   Th
b1b0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 6f 6e 6c  is value may onl
b1c0: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 66  y be returned if
b1d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b1e0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e 66  ment to the conf
b1f0: 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65  lict.**   handle
b200: 72 20 77 61 73 20 53 51 4c 49 54 45 5f 43 48 41  r was SQLITE_CHA
b210: 4e 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 53  NGESET_DATA or S
b220: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
b230: 43 4f 4e 46 4c 49 43 54 2e 20 49 66 20 74 68 69  CONFLICT. If thi
b240: 73 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 74 68  s.**   is not th
b250: 65 20 63 61 73 65 2c 20 61 6e 79 20 63 68 61 6e  e case, any chan
b260: 67 65 73 20 61 70 70 6c 69 65 64 20 73 6f 20 66  ges applied so f
b270: 61 72 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  ar are rolled ba
b280: 63 6b 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 20  ck and the .**  
b290: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b2a0: 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
b2b0: 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  ) returns SQLITE
b2c0: 5f 4d 49 53 55 53 45 2e 0a 2a 2a 0a 2a 2a 20 20  _MISUSE..**.**  
b2d0: 20 49 66 20 43 48 41 4e 47 45 53 45 54 5f 52 45   If CHANGESET_RE
b2e0: 50 4c 41 43 45 20 69 73 20 72 65 74 75 72 6e 65  PLACE is returne
b2f0: 64 20 62 79 20 61 6e 20 53 51 4c 49 54 45 5f 43  d by an SQLITE_C
b300: 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 63 6f  HANGESET_DATA co
b310: 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64  nflict.**   hand
b320: 6c 65 72 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ler, then the co
b330: 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 69 73  nflicting row is
b340: 20 65 69 74 68 65 72 20 75 70 64 61 74 65 64 20   either updated 
b350: 6f 72 20 64 65 6c 65 74 65 64 2c 20 64 65 70 65  or deleted, depe
b360: 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68  nding.**   on th
b370: 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e 67 65  e type of change
b380: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 43 48 41  ..**.**   If CHA
b390: 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 20 69  NGESET_REPLACE i
b3a0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
b3b0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
b3c0: 54 5f 43 4f 4e 46 4c 49 43 54 20 63 6f 6e 66 6c  T_CONFLICT confl
b3d0: 69 63 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 72  ict.**   handler
b3e0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 66 6c  , then the confl
b3f0: 69 63 74 69 6e 67 20 72 6f 77 20 69 73 20 72 65  icting row is re
b400: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
b410: 61 74 61 62 61 73 65 20 61 6e 64 20 61 0a 2a 2a  atabase and a.**
b420: 20 20 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70     second attemp
b430: 74 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63  t to apply the c
b440: 68 61 6e 67 65 20 69 73 20 6d 61 64 65 2e 20 49  hange is made. I
b450: 66 20 74 68 69 73 20 73 65 63 6f 6e 64 20 61 74  f this second at
b460: 74 65 6d 70 74 20 66 61 69 6c 73 2c 0a 2a 2a 20  tempt fails,.** 
b470: 20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72    the original r
b480: 6f 77 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  ow is restored t
b490: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
b4a0: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
b4b0: 2e 0a 2a 2a 0a 2a 2a 20 3c 64 74 3e 53 51 4c 49  ..**.** <dt>SQLI
b4c0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42 4f  TE_CHANGESET_ABO
b4d0: 52 54 3c 64 64 3e 0a 2a 2a 20 20 20 49 66 20 74  RT<dd>.**   If t
b4e0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 74  his value is ret
b4f0: 75 72 6e 65 64 2c 20 61 6e 79 20 63 68 61 6e 67  urned, any chang
b500: 65 73 20 61 70 70 6c 69 65 64 20 73 6f 20 66 61  es applied so fa
b510: 72 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  r are rolled bac
b520: 6b 20 0a 2a 2a 20 20 20 61 6e 64 20 74 68 65 20  k .**   and the 
b530: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 63  call to sqlite3c
b540: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
b550: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b560: 41 42 4f 52 54 2e 0a 2a 2a 20 3c 2f 64 6c 3e 0a  ABORT..** </dl>.
b570: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  */.#define SQLIT
b580: 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54  E_CHANGESET_OMIT
b590: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
b5a0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
b5b0: 54 5f 52 45 50 4c 41 43 45 20 20 20 20 31 0a 23  T_REPLACE    1.#
b5c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48  define SQLITE_CH
b5d0: 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 20 20 20  ANGESET_ABORT   
b5e0: 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49     2../*.** CAPI
b5f0: 33 52 45 46 3a 20 53 74 72 65 61 6d 69 6e 67 20  3REF: Streaming 
b600: 56 65 72 73 69 6f 6e 73 20 6f 66 20 41 50 49 20  Versions of API 
b610: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
b620: 20 54 68 65 20 73 69 78 20 73 74 72 65 61 6d 69   The six streami
b630: 6e 67 20 41 50 49 20 78 78 78 5f 73 74 72 6d 28  ng API xxx_strm(
b640: 29 20 66 75 6e 63 74 69 6f 6e 73 20 73 65 72 76  ) functions serv
b650: 65 20 73 69 6d 69 6c 61 72 20 70 75 72 70 6f 73  e similar purpos
b660: 65 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 6f  es to the .** co
b670: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 6f 6e 2d  rresponding non-
b680: 73 74 72 65 61 6d 69 6e 67 20 41 50 49 20 66 75  streaming API fu
b690: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 3c  nctions:.**.** <
b6a0: 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 73  table border=1 s
b6b0: 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66  tyle="margin-lef
b6c0: 74 3a 38 65 78 3b 6d 61 72 67 69 6e 2d 72 69 67  t:8ex;margin-rig
b6d0: 68 74 3a 38 65 78 22 3e 0a 2a 2a 20 20 20 3c 74  ht:8ex">.**   <t
b6e0: 72 3e 3c 74 68 3e 53 74 72 65 61 6d 69 6e 67 20  r><th>Streaming 
b6f0: 66 75 6e 63 74 69 6f 6e 3c 74 68 3e 4e 6f 6e 2d  function<th>Non-
b700: 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69 76 61  streaming equiva
b710: 6c 65 6e 74 3c 2f 74 68 3e 0a 2a 2a 20 20 20 3c  lent</th>.**   <
b720: 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 63 68  tr><td>sqlite3ch
b730: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73 74  angeset_apply_st
b740: 72 3c 74 64 3e 5b 73 71 6c 69 74 65 33 63 68 61  r<td>[sqlite3cha
b750: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5d 20 0a 2a  ngeset_apply] .*
b760: 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69  *   <tr><td>sqli
b770: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
b780: 63 61 74 5f 73 74 72 3c 74 64 3e 5b 73 71 6c 69  cat_str<td>[sqli
b790: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
b7a0: 63 61 74 5d 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c  cat] .**   <tr><
b7b0: 74 64 3e 73 71 6c 69 74 65 33 63 68 61 6e 67 65  td>sqlite3change
b7c0: 73 65 74 5f 69 6e 76 65 72 74 5f 73 74 72 3c 74  set_invert_str<t
b7d0: 64 3e 5b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  d>[sqlite3change
b7e0: 73 65 74 5f 69 6e 76 65 72 74 5d 20 0a 2a 2a 20  set_invert] .** 
b7f0: 20 20 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65    <tr><td>sqlite
b800: 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
b810: 5f 73 74 72 3c 74 64 3e 5b 73 71 6c 69 74 65 33  _str<td>[sqlite3
b820: 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 5d  changeset_start]
b830: 20 0a 2a 2a 20 20 20 3c 74 72 3e 3c 74 64 3e 73   .**   <tr><td>s
b840: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
b850: 61 6e 67 65 73 65 74 5f 73 74 72 3c 74 64 3e 5b  angeset_str<td>[
b860: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
b870: 68 61 6e 67 65 73 65 74 5d 20 0a 2a 2a 20 20 20  hangeset] .**   
b880: 3c 74 72 3e 3c 74 64 3e 73 71 6c 69 74 65 33 73  <tr><td>sqlite3s
b890: 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 5f  ession_patchset_
b8a0: 73 74 72 3c 74 64 3e 5b 73 71 6c 69 74 65 33 73  str<td>[sqlite3s
b8b0: 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 5d  ession_patchset]
b8c0: 20 0a 2a 2a 20 3c 2f 74 61 62 6c 65 3e 0a 2a 2a   .** </table>.**
b8d0: 0a 2a 2a 20 4e 6f 6e 2d 73 74 72 65 61 6d 69 6e  .** Non-streamin
b8e0: 67 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  g functions that
b8f0: 20 61 63 63 65 70 74 20 63 68 61 6e 67 65 73 65   accept changese
b900: 74 73 20 28 6f 72 20 70 61 74 63 68 73 65 74 73  ts (or patchsets
b910: 29 20 61 73 20 69 6e 70 75 74 0a 2a 2a 20 72 65  ) as input.** re
b920: 71 75 69 72 65 20 74 68 61 74 20 74 68 65 20 65  quire that the e
b930: 6e 74 69 72 65 20 63 68 61 6e 67 65 73 65 74 20  ntire changeset 
b940: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  be stored in a s
b950: 69 6e 67 6c 65 20 62 75 66 66 65 72 20 69 6e 20  ingle buffer in 
b960: 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 20 53 69 6d 69  memory. .** Simi
b970: 6c 61 72 6c 79 2c 20 74 68 6f 73 65 20 74 68 61  larly, those tha
b980: 74 20 72 65 74 75 72 6e 20 61 20 63 68 61 6e 67  t return a chang
b990: 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
b9a0: 20 64 6f 20 73 6f 20 62 79 20 72 65 74 75 72 6e   do so by return
b9b0: 69 6e 67 20 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ing .** a pointe
b9c0: 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61  r to a single la
b9d0: 72 67 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  rge buffer alloc
b9e0: 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
b9f0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 0a 2a 2a  e3_malloc(). .**
ba00: 20 4e 6f 72 6d 61 6c 6c 79 20 74 68 69 73 20 69   Normally this i
ba10: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 2e 20 48 6f  s convenient. Ho
ba20: 77 65 76 65 72 2c 20 69 66 20 61 6e 20 61 70 70  wever, if an app
ba30: 6c 69 63 61 74 69 6f 6e 20 72 75 6e 6e 69 6e 67  lication running
ba40: 20 69 6e 20 61 20 0a 2a 2a 20 6c 6f 77 2d 6d 65   in a .** low-me
ba50: 6d 6f 72 79 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  mory environment
ba60: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
ba70: 68 61 6e 64 6c 65 20 76 65 72 79 20 6c 61 72 67  handle very larg
ba80: 65 20 63 68 61 6e 67 65 73 65 74 73 2c 20 74 68  e changesets, th
ba90: 65 0a 2a 2a 20 6c 61 72 67 65 20 63 6f 6e 74 69  e.** large conti
baa0: 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 61 6c 6c  guous memory all
bab0: 6f 63 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  ocations require
bac0: 64 20 63 61 6e 20 62 65 63 6f 6d 65 20 6f 6e 65  d can become one
bad0: 72 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  rous..**.** In o
bae0: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 74 68  rder to avoid th
baf0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 69 6e 73 74  is problem, inst
bb00: 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ead of a single 
bb10: 6c 61 72 67 65 20 62 75 66 66 65 72 2c 20 69 6e  large buffer, in
bb20: 70 75 74 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  put.** is passed
bb30: 20 74 6f 20 61 20 73 74 72 65 61 6d 69 6e 67 20   to a streaming 
bb40: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 62 79  API functions by
bb50: 20 77 61 79 20 6f 66 20 61 20 63 61 6c 6c 62 61   way of a callba
bb60: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ck function that
bb70: 0a 2a 2a 20 74 68 65 20 73 65 73 73 69 6f 6e 73  .** the sessions
bb80: 20 6d 6f 64 75 6c 65 20 69 6e 76 6f 6b 65 73 20   module invokes 
bb90: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  to incrementally
bba0: 20 72 65 71 75 65 73 74 20 69 6e 70 75 74 20 64   request input d
bbb0: 61 74 61 20 61 73 20 69 74 20 69 73 0a 2a 2a 20  ata as it is.** 
bbc0: 72 65 71 75 69 72 65 64 2e 20 49 6e 20 61 6c 6c  required. In all
bbd0: 20 63 61 73 65 73 2c 20 61 20 70 61 69 72 20 6f   cases, a pair o
bbe0: 66 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 70  f API function p
bbf0: 61 72 61 6d 65 74 65 72 73 20 73 75 63 68 20 61  arameters such a
bc00: 73 0a 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a  s.**.**  <pre>.*
bc10: 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e  *  &nbsp;     in
bc20: 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a  t nChangeset,.**
bc30: 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76 6f 69    &nbsp;     voi
bc40: 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 0a 2a  d *pChangeset,.*
bc50: 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20  *  </pre>.**.** 
bc60: 49 73 20 72 65 70 6c 61 63 65 64 20 62 79 3a 0a  Is replaced by:.
bc70: 2a 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20  **.**  <pre>.** 
bc80: 20 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20   &nbsp;     int 
bc90: 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a  (*xInput)(void *
bca0: 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  pIn, void *pData
bcb0: 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a  , int *pnData),.
bcc0: 2a 2a 20 20 26 6e 62 73 70 3b 20 20 20 20 20 76  **  &nbsp;     v
bcd0: 6f 69 64 20 2a 70 49 6e 2c 0a 2a 2a 20 20 3c 2f  oid *pIn,.**  </
bce0: 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  pre>.**.** Each 
bcf0: 74 69 6d 65 20 74 68 65 20 78 49 6e 70 75 74 20  time the xInput 
bd00: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
bd10: 6b 65 64 20 62 79 20 74 68 65 20 73 65 73 73 69  ked by the sessi
bd20: 6f 6e 73 20 6d 6f 64 75 6c 65 2c 20 74 68 65 20  ons module, the 
bd30: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
bd40: 74 20 70 61 73 73 65 64 20 69 73 20 61 20 63 6f  t passed is a co
bd50: 70 79 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  py of the suppli
bd60: 65 64 20 70 49 6e 20 63 6f 6e 74 65 78 74 20 70  ed pIn context p
bd70: 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 65 63 6f  ointer. The seco
bd80: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  nd .** argument,
bd90: 20 70 44 61 74 61 2c 20 70 6f 69 6e 74 73 20 74   pData, points t
bda0: 6f 20 61 20 62 75 66 66 65 72 20 28 2a 70 6e 44  o a buffer (*pnD
bdb0: 61 74 61 29 20 62 79 74 65 73 20 69 6e 20 73 69  ata) bytes in si
bdc0: 7a 65 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ze. Assuming no 
bdd0: 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
bde0: 20 74 68 65 20 78 49 6e 70 75 74 20 6d 65 74 68   the xInput meth
bdf0: 6f 64 20 73 68 6f 75 6c 64 20 63 6f 70 79 20 75  od should copy u
be00: 70 20 74 6f 20 28 2a 70 6e 44 61 74 61 29 20 62  p to (*pnData) b
be10: 79 74 65 73 20 6f 66 20 64 61 74 61 20 0a 2a 2a  ytes of data .**
be20: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
be30: 20 61 6e 64 20 73 65 74 20 28 2a 70 6e 44 61 74   and set (*pnDat
be40: 61 29 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  a) to the actual
be50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
be60: 20 63 6f 70 69 65 64 20 0a 2a 2a 20 62 65 66 6f   copied .** befo
be70: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
be80: 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 20 69  ITE_OK. If the i
be90: 6e 70 75 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  nput is complete
bea0: 6c 79 20 65 78 68 61 75 73 74 65 64 2c 20 28 2a  ly exhausted, (*
beb0: 70 6e 44 61 74 61 29 20 0a 2a 2a 20 73 68 6f 75  pnData) .** shou
bec0: 6c 64 20 62 65 20 73 65 74 20 74 6f 20 7a 65 72  ld be set to zer
bed0: 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  o to indicate th
bee0: 69 73 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  is. Or, if an er
bef0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
bf00: 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20  QLite .** error 
bf10: 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 72  code should be r
bf20: 65 74 75 72 6e 65 64 2e 20 49 6e 20 61 6c 6c 20  eturned. In all 
bf30: 63 61 73 65 73 2c 20 69 66 20 61 6e 20 78 49 6e  cases, if an xIn
bf40: 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  put callback ret
bf50: 75 72 6e 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urns.** an error
bf60: 2c 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67  , all processing
bf70: 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e   is abandoned an
bf80: 64 20 74 68 65 20 73 74 72 65 61 6d 69 6e 67 20  d the streaming 
bf90: 41 50 49 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  API function.** 
bfa0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
bfb0: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
bfc0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
bfd0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 61 73  **.** In the cas
bfe0: 65 20 6f 66 20 73 71 6c 69 74 65 33 63 68 61 6e  e of sqlite3chan
bff0: 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d  geset_start_strm
c000: 28 29 2c 20 74 68 65 20 78 49 6e 70 75 74 20 63  (), the xInput c
c010: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 62 65 0a 2a  allback may be.*
c020: 2a 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  * invoked by the
c030: 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65   sessions module
c040: 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 64 75   at any point du
c050: 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d  ring the lifetim
c060: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 74 65 72  e of the.** iter
c070: 61 74 6f 72 2e 20 49 66 20 73 75 63 68 20 61 6e  ator. If such an
c080: 20 78 49 6e 70 75 74 20 63 61 6c 6c 62 61 63 6b   xInput callback
c090: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
c0a0: 72 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  r, the iterator 
c0b0: 65 6e 74 65 72 73 0a 2a 2a 20 61 6e 20 65 72 72  enters.** an err
c0c0: 6f 72 20 73 74 61 74 65 2c 20 77 68 65 72 65 62  or state, whereb
c0d0: 79 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  y all subsequent
c0e0: 20 63 61 6c 6c 73 20 74 6f 20 69 74 65 72 61 74   calls to iterat
c0f0: 6f 72 20 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a  or functions .**
c100: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 61 69   immediately fai
c110: 6c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  l with the same 
c120: 65 72 72 6f 72 20 63 6f 64 65 20 61 73 20 72 65  error code as re
c130: 74 75 72 6e 65 64 20 62 79 20 78 49 6e 70 75 74  turned by xInput
c140: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c  ..**.** Similarl
c150: 79 2c 20 73 74 72 65 61 6d 69 6e 67 20 41 50 49  y, streaming API
c160: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
c170: 72 65 74 75 72 6e 20 63 68 61 6e 67 65 73 65 74  return changeset
c180: 73 20 28 6f 72 20 70 61 74 63 68 73 65 74 73 29  s (or patchsets)
c190: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 6d 20  .** return them 
c1a0: 69 6e 20 63 68 75 6e 6b 73 20 62 79 20 77 61 79  in chunks by way
c1b0: 20 6f 66 20 61 20 63 61 6c 6c 62 61 63 6b 20 66   of a callback f
c1c0: 75 6e 63 74 69 6f 6e 20 69 6e 73 74 65 61 64 20  unction instead 
c1d0: 6f 66 20 76 69 61 20 61 0a 2a 2a 20 70 6f 69 6e  of via a.** poin
c1e0: 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ter to a single 
c1f0: 6c 61 72 67 65 20 62 75 66 66 65 72 2e 20 49 6e  large buffer. In
c200: 20 74 68 69 73 20 63 61 73 65 2c 20 61 20 70 61   this case, a pa
c210: 69 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  ir of parameters
c220: 20 73 75 63 68 0a 2a 2a 20 61 73 3a 0a 2a 2a 0a   such.** as:.**.
c230: 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20 26 6e  **  <pre>.**  &n
c240: 62 73 70 3b 20 20 20 20 20 69 6e 74 20 2a 70 6e  bsp;     int *pn
c250: 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20 20 26  Changeset,.**  &
c260: 6e 62 73 70 3b 20 20 20 20 20 76 6f 69 64 20 2a  nbsp;     void *
c270: 2a 70 70 43 68 61 6e 67 65 73 65 74 2c 0a 2a 2a  *ppChangeset,.**
c280: 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20 49    </pre>.**.** I
c290: 73 20 72 65 70 6c 61 63 65 64 20 62 79 3a 0a 2a  s replaced by:.*
c2a0: 2a 0a 2a 2a 20 20 3c 70 72 65 3e 0a 2a 2a 20 20  *.**  <pre>.**  
c2b0: 26 6e 62 73 70 3b 20 20 20 20 20 69 6e 74 20 28  &nbsp;     int (
c2c0: 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a  *xOutput)(void *
c2d0: 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pOut, const void
c2e0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
c2f0: 74 61 29 2c 0a 2a 2a 20 20 26 6e 62 73 70 3b 20  ta),.**  &nbsp; 
c300: 20 20 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 2a      void *pOut.*
c310: 2a 20 20 3c 2f 70 72 65 3e 0a 2a 2a 0a 2a 2a 20  *  </pre>.**.** 
c320: 54 68 65 20 78 4f 75 74 70 75 74 20 63 61 6c 6c  The xOutput call
c330: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
c340: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 69 6d  zero or more tim
c350: 65 73 20 74 6f 20 72 65 74 75 72 6e 20 64 61 74  es to return dat
c360: 61 20 74 6f 0a 2a 2a 20 74 68 65 20 61 70 70 6c  a to.** the appl
c370: 69 63 61 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  ication. The fir
c380: 73 74 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  st parameter pas
c390: 73 65 64 20 74 6f 20 65 61 63 68 20 63 61 6c 6c  sed to each call
c3a0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
c3b0: 65 0a 2a 2a 20 70 4f 75 74 20 70 6f 69 6e 74 65  e.** pOut pointe
c3c0: 72 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68  r supplied by th
c3d0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54  e application. T
c3e0: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
c3f0: 74 65 72 2c 20 70 44 61 74 61 2c 0a 2a 2a 20 70  ter, pData,.** p
c400: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
c410: 72 20 6e 44 61 74 61 20 62 79 74 65 73 20 69 6e  r nData bytes in
c420: 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
c430: 20 74 68 65 20 63 68 75 6e 6b 20 6f 66 20 6f 75   the chunk of ou
c440: 74 70 75 74 0a 2a 2a 20 64 61 74 61 20 62 65 69  tput.** data bei
c450: 6e 67 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  ng returned. If 
c460: 74 68 65 20 78 4f 75 74 70 75 74 20 63 61 6c 6c  the xOutput call
c470: 62 61 63 6b 20 73 75 63 63 65 73 73 66 75 6c 6c  back successfull
c480: 79 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 0a  y processes the.
c490: 2a 2a 20 73 75 70 70 6c 69 65 64 20 64 61 74 61  ** supplied data
c4a0: 2c 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  , it should retu
c4b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 74 6f 20  rn SQLITE_OK to 
c4c0: 69 6e 64 69 63 61 74 65 20 73 75 63 63 65 73 73  indicate success
c4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
c4e0: 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  it should return
c4f0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
c500: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
c510: 6e 20 74 68 69 73 20 63 61 73 65 20 70 72 6f 63  n this case proc
c520: 65 73 73 69 6e 67 0a 2a 2a 20 69 73 20 69 6d 6d  essing.** is imm
c530: 65 64 69 61 74 65 6c 79 20 61 62 61 6e 64 6f 6e  ediately abandon
c540: 65 64 20 61 6e 64 20 74 68 65 20 73 74 72 65 61  ed and the strea
c550: 6d 69 6e 67 20 41 50 49 20 66 75 6e 63 74 69 6f  ming API functio
c560: 6e 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  n returns a copy
c570: 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 75 74 70  .** of the xOutp
c580: 75 74 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  ut error code to
c590: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
c5a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 73 73  ..**.** The sess
c5b0: 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65  ions module neve
c5c0: 72 20 69 6e 76 6f 6b 65 73 20 61 6e 20 78 4f 75  r invokes an xOu
c5d0: 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 77 69  tput callback wi
c5e0: 74 68 20 74 68 65 20 74 68 69 72 64 20 0a 2a 2a  th the third .**
c5f0: 20 70 61 72 61 6d 65 74 65 72 20 73 65 74 20 74   parameter set t
c600: 6f 20 61 20 76 61 6c 75 65 20 6c 65 73 73 20 74  o a value less t
c610: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
c620: 7a 65 72 6f 2e 20 4f 74 68 65 72 20 74 68 61 6e  zero. Other than
c630: 20 74 68 69 73 2c 0a 2a 2a 20 6e 6f 20 67 75 61   this,.** no gua
c640: 72 61 6e 74 65 65 73 20 61 72 65 20 6d 61 64 65  rantees are made
c650: 20 61 73 20 74 6f 20 74 68 65 20 73 69 7a 65 20   as to the size 
c660: 6f 66 20 74 68 65 20 63 68 75 6e 6b 73 20 6f 66  of the chunks of
c670: 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 2e 0a   data returned..
c680: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
c690: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73 74  angeset_apply_st
c6a0: 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rm(.  sqlite3 *d
c6b0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c6c0: 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63        /* Apply c
c6d0: 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20  hange to "main" 
c6e0: 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c  db of this handl
c6f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e  e */.  int (*xIn
c700: 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20  put)(void *pIn, 
c710: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
c720: 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a 20 49 6e   *pnData), /* In
c730: 70 75 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  put function */.
c740: 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20    void *pIn,    
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
c780: 72 67 20 66 6f 72 20 78 49 6e 70 75 74 20 2a 2f  rg for xInput */
c790: 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72 29  .  int(*xFilter)
c7a0: 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78  (.    void *pCtx
c7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c7c0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73      /* Copy of s
c7d0: 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70  ixth arg to _app
c7e0: 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ly() */.    cons
c7f0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20  t char *zTab    
c800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
c810: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a  le name */.  ),.
c820: 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74    int(*xConflict
c830: 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
c840: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c850: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
c860: 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
c870: 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  ply() */.    int
c880: 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20   eConflict,     
c890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41             /* DA
c8a0: 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e  TA, MISSING, CON
c8b0: 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e  FLICT, CONSTRAIN
c8c0: 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  T */.    sqlite3
c8d0: 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
c8e0: 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  *p     /* Handle
c8f0: 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e   describing chan
c900: 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20  ge and conflict 
c910: 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a  */.  ),.  void *
c920: 70 43 74 78 20 20 20 20 20 20 20 20 20 20 20 20  pCtx            
c930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c940: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
c950: 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20  ed to xConflict 
c960: 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  */.);.int sqlite
c970: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
c980: 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a  t_strm(.  int (*
c990: 78 49 6e 70 75 74 41 29 28 76 6f 69 64 20 2a 70  xInputA)(void *p
c9a0: 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  In, void *pData,
c9b0: 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20   int *pnData),. 
c9c0: 20 76 6f 69 64 20 2a 70 49 6e 41 2c 0a 20 20 69   void *pInA,.  i
c9d0: 6e 74 20 28 2a 78 49 6e 70 75 74 42 29 28 76 6f  nt (*xInputB)(vo
c9e0: 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
c9f0: 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
ca00: 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 42  a),.  void *pInB
ca10: 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75  ,.  int (*xOutpu
ca20: 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
ca30: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
ca40: 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20  , int nData),.  
ca50: 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69 6e  void *pOut.);.in
ca60: 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
ca70: 65 74 5f 69 6e 76 65 72 74 5f 73 74 72 6d 28 0a  et_invert_strm(.
ca80: 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
ca90: 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20  void *pIn, void 
caa0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44  *pData, int *pnD
cab0: 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49  ata),.  void *pI
cac0: 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70  n,.  int (*xOutp
cad0: 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ut)(void *pOut, 
cae0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
caf0: 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20  a, int nData),. 
cb00: 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a 69   void *pOut.);.i
cb10: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
cb20: 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28 0a  set_start_strm(.
cb30: 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
cb40: 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 0a 20  set_iter **pp,. 
cb50: 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76   int (*xInput)(v
cb60: 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a  oid *pIn, void *
cb70: 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61  pData, int *pnDa
cb80: 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e  ta),.  void *pIn
cb90: 0a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .);.int sqlite3s
cba0: 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
cbb0: 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
cbc0: 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
cbd0: 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  on,.  int (*xOut
cbe0: 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
cbf0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
cc00: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
cc10: 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 3b 0a    void *pOut.);.
cc20: 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
cc30: 6f 6e 5f 70 61 74 63 68 73 65 74 5f 73 74 72 6d  on_patchset_strm
cc40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  (.  sqlite3_sess
cc50: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20  ion *pSession,. 
cc60: 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28   int (*xOutput)(
cc70: 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73  void *pOut, cons
cc80: 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
cc90: 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69  nt nData),.  voi
cca0: 64 20 2a 70 4f 75 74 0a 29 3b 0a 0a 0a 2f 2a 0a  d *pOut.);.../*.
ccb0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
ccc0: 63 61 6e 20 63 61 6c 6c 20 74 68 69 73 20 73 74  can call this st
ccd0: 75 66 66 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f  uff from C++..*/
cce0: 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70  .#ifdef __cplusp
ccf0: 6c 75 73 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65  lus.}.#endif..#e
cd00: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
cd10: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 20 26  ENABLE_SESSION &
cd20: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
cd30: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
cd40: 2f 0a                                            /.