/ Hex Artifact Content
Login

Artifact 3d9d3a414be386b87d83e642f4d93c8cbe83fe7b975d17b398f96caa1bfdc2cf:


0000: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0010: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
0020: 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ON) && defined(S
0030: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
0040: 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 23 69 6e  UPDATE_HOOK).#in
0050: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 73 65  clude "sqlite3se
0060: 73 73 69 6f 6e 2e 68 22 0a 23 69 6e 63 6c 75 64  ssion.h".#includ
0070: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e  e <assert.h>.#in
0080: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0090: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
00a0: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20  _AMALGAMATION.# 
00b0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
00c0: 6e 74 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20  nt.h".# include 
00d0: 22 76 64 62 65 49 6e 74 2e 68 22 0a 23 65 6e 64  "vdbeInt.h".#end
00e0: 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  if..typedef stru
00f0: 63 74 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20  ct SessionTable 
0100: 53 65 73 73 69 6f 6e 54 61 62 6c 65 3b 0a 74 79  SessionTable;.ty
0110: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 65 73  pedef struct Ses
0120: 73 69 6f 6e 43 68 61 6e 67 65 20 53 65 73 73 69  sionChange Sessi
0130: 6f 6e 43 68 61 6e 67 65 3b 0a 74 79 70 65 64 65  onChange;.typede
0140: 66 20 73 74 72 75 63 74 20 53 65 73 73 69 6f 6e  f struct Session
0150: 42 75 66 66 65 72 20 53 65 73 73 69 6f 6e 42 75  Buffer SessionBu
0160: 66 66 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  ffer;.typedef st
0170: 72 75 63 74 20 53 65 73 73 69 6f 6e 49 6e 70 75  ruct SessionInpu
0180: 74 20 53 65 73 73 69 6f 6e 49 6e 70 75 74 3b 0a  t SessionInput;.
0190: 0a 2f 2a 0a 2a 2a 20 4d 69 6e 69 6d 75 6d 20 63  ./*.** Minimum c
01a0: 68 75 6e 6b 20 73 69 7a 65 20 75 73 65 64 20 62  hunk size used b
01b0: 79 20 73 74 72 65 61 6d 69 6e 67 20 76 65 72 73  y streaming vers
01c0: 69 6f 6e 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ions of function
01d0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 45  s..*/.#ifndef SE
01e0: 53 53 49 4f 4e 53 5f 53 54 52 4d 5f 43 48 55 4e  SSIONS_STRM_CHUN
01f0: 4b 5f 53 49 5a 45 0a 23 20 69 66 64 65 66 20 53  K_SIZE.# ifdef S
0200: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 20 20 64  QLITE_TEST.#   d
0210: 65 66 69 6e 65 20 53 45 53 53 49 4f 4e 53 5f 53  efine SESSIONS_S
0220: 54 52 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 36  TRM_CHUNK_SIZE 6
0230: 34 0a 23 20 65 6c 73 65 0a 23 20 20 20 64 65 66  4.# else.#   def
0240: 69 6e 65 20 53 45 53 53 49 4f 4e 53 5f 53 54 52  ine SESSIONS_STR
0250: 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 31 30 32  M_CHUNK_SIZE 102
0260: 34 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  4.# endif.#endif
0270: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ..static int ses
0280: 73 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b  sions_strm_chunk
0290: 5f 73 69 7a 65 20 3d 20 53 45 53 53 49 4f 4e 53  _size = SESSIONS
02a0: 5f 53 54 52 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45  _STRM_CHUNK_SIZE
02b0: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
02c0: 74 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 53 65  t SessionHook Se
02d0: 73 73 69 6f 6e 48 6f 6f 6b 3b 0a 73 74 72 75 63  ssionHook;.struc
02e0: 74 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 7b 0a  t SessionHook {.
02f0: 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20    void *pCtx;.  
0300: 69 6e 74 20 28 2a 78 4f 6c 64 29 28 76 6f 69 64  int (*xOld)(void
0310: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
0320: 6c 75 65 2a 2a 29 3b 0a 20 20 69 6e 74 20 28 2a  lue**);.  int (*
0330: 78 4e 65 77 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xNew)(void*,int,
0340: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
0350: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 75 6e 74  ;.  int (*xCount
0360: 29 28 76 6f 69 64 2a 29 3b 0a 20 20 69 6e 74 20  )(void*);.  int 
0370: 28 2a 78 44 65 70 74 68 29 28 76 6f 69 64 2a 29  (*xDepth)(void*)
0380: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 73 73  ;.};../*.** Sess
0390: 69 6f 6e 20 68 61 6e 64 6c 65 20 73 74 72 75 63  ion handle struc
03a0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
03b0: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
03c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
03f0: 68 61 6e 64 6c 65 20 73 65 73 73 69 6f 6e 20 69  handle session i
0400: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
0410: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
0440: 74 61 62 61 73 65 20 73 65 73 73 69 6f 6e 20 69  tabase session i
0450: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
0460: 0a 20 20 69 6e 74 20 62 45 6e 61 62 6c 65 3b 20  .  int bEnable; 
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75     /* True if cu
0490: 72 72 65 6e 74 6c 79 20 72 65 63 6f 72 64 69 6e  rrently recordin
04a0: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 64 69  g */.  int bIndi
04b0: 72 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  rect;           
04c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
04d0: 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 61 72  f all changes ar
04e0: 65 20 69 6e 64 69 72 65 63 74 20 2a 2f 0a 20 20  e indirect */.  
04f0: 69 6e 74 20 62 41 75 74 6f 41 74 74 61 63 68 3b  int bAutoAttach;
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0510: 2f 2a 20 54 72 75 65 20 74 6f 20 61 75 74 6f 2d  /* True to auto-
0520: 61 74 74 61 63 68 20 74 61 62 6c 65 73 20 2a 2f  attach tables */
0530: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0550: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
0560: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
0570: 63 63 75 72 72 65 64 20 2a 2f 0a 20 20 76 6f 69  ccurred */.  voi
0580: 64 20 2a 70 46 69 6c 74 65 72 43 74 78 3b 20 20  d *pFilterCtx;  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
05a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
05b0: 6f 20 70 61 73 73 20 74 6f 20 78 54 61 62 6c 65  o pass to xTable
05c0: 46 69 6c 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  Filter */.  int 
05d0: 28 2a 78 54 61 62 6c 65 46 69 6c 74 65 72 29 28  (*xTableFilter)(
05e0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73  void *pCtx, cons
05f0: 74 20 63 68 61 72 20 2a 7a 54 61 62 29 3b 0a 20  t char *zTab);. 
0600: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0610: 70 5a 65 72 6f 42 6c 6f 62 3b 20 20 20 20 20 20  pZeroBlob;      
0620: 20 2f 2a 20 56 61 6c 75 65 20 63 6f 6e 74 61 69   /* Value contai
0630: 6e 69 6e 67 20 58 27 27 20 2a 2f 0a 20 20 73 71  ning X'' */.  sq
0640: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
0650: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
0660: 20 4e 65 78 74 20 73 65 73 73 69 6f 6e 20 6f 62   Next session ob
0670: 6a 65 63 74 20 6f 6e 20 73 61 6d 65 20 64 62 2e  ject on same db.
0680: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54 61 62   */.  SessionTab
0690: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
06a0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
06b0: 20 61 74 74 61 63 68 65 64 20 74 61 62 6c 65 73   attached tables
06c0: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 48 6f 6f   */.  SessionHoo
06d0: 6b 20 68 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20  k hook;         
06e0: 20 20 20 20 20 20 2f 2a 20 41 50 49 73 20 74 6f        /* APIs to
06f0: 20 67 72 61 62 20 6e 65 77 20 61 6e 64 20 6f 6c   grab new and ol
0700: 64 20 64 61 74 61 20 77 69 74 68 20 2a 2f 0a 7d  d data with */.}
0710: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6e 63  ;../*.** Instanc
0720: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0730: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
0740: 20 62 75 69 6c 64 20 73 74 72 69 6e 67 73 20 6f   build strings o
0750: 72 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 73  r binary records
0760: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 73 73  ..*/.struct Sess
0770: 69 6f 6e 42 75 66 66 65 72 20 7b 0a 20 20 75 38  ionBuffer {.  u8
0780: 20 2a 61 42 75 66 3b 20 20 20 20 20 20 20 20 20   *aBuf;         
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
07a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 61 6e   Pointer to chan
07b0: 67 65 73 65 74 20 62 75 66 66 65 72 20 2a 2f 0a  geset buffer */.
07c0: 20 20 69 6e 74 20 6e 42 75 66 3b 20 20 20 20 20    int nBuf;     
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
07f0: 66 65 72 20 61 42 75 66 20 2a 2f 0a 20 20 69 6e  fer aBuf */.  in
0800: 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0820: 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74   Size of allocat
0830: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ion containing a
0840: 42 75 66 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Buf */.};../*.**
0850: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   An object of th
0860: 69 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20  is type is used 
0870: 69 6e 74 65 72 6e 61 6c 6c 79 20 61 73 20 61 6e  internally as an
0880: 20 61 62 73 74 72 61 63 74 69 6f 6e 20 66 6f 72   abstraction for
0890: 20 0a 2a 2a 20 69 6e 70 75 74 20 64 61 74 61 2e   .** input data.
08a0: 20 49 6e 70 75 74 20 64 61 74 61 20 6d 61 79 20   Input data may 
08b0: 62 65 20 73 75 70 70 6c 69 65 64 20 65 69 74 68  be supplied eith
08c0: 65 72 20 61 73 20 61 20 73 69 6e 67 6c 65 20 6c  er as a single l
08d0: 61 72 67 65 20 62 75 66 66 65 72 0a 2a 2a 20 28  arge buffer.** (
08e0: 65 2e 67 2e 20 73 71 6c 69 74 65 33 63 68 61 6e  e.g. sqlite3chan
08f0: 67 65 73 65 74 5f 73 74 61 72 74 28 29 29 20 6f  geset_start()) o
0900: 72 20 75 73 69 6e 67 20 61 20 73 74 72 65 61 6d  r using a stream
0910: 20 66 75 6e 63 74 69 6f 6e 20 28 65 2e 67 2e 0a   function (e.g..
0920: 2a 2a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  **  sqlite3chang
0930: 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28  eset_start_strm(
0940: 29 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65  ))..*/.struct Se
0950: 73 73 69 6f 6e 49 6e 70 75 74 20 7b 0a 20 20 69  ssionInput {.  i
0960: 6e 74 20 62 4e 6f 44 69 73 63 61 72 64 3b 20 20  nt bNoDiscard;  
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0980: 2a 20 49 66 20 74 72 75 65 2c 20 64 6f 20 6e 6f  * If true, do no
0990: 74 20 64 69 73 63 61 72 64 20 69 6e 20 49 6e 70  t discard in Inp
09a0: 75 74 42 75 66 66 65 72 28 29 20 2a 2f 0a 20 20  utBuffer() */.  
09b0: 69 6e 74 20 69 43 75 72 72 65 6e 74 3b 20 20 20  int iCurrent;   
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 44 61  /* Offset in aDa
09e0: 74 61 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74 20  ta[] of current 
09f0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
0a00: 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  iNext;          
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0a20: 66 66 73 65 74 20 69 6e 20 61 44 61 74 61 5b 5d  ffset in aData[]
0a30: 20 6f 66 20 6e 65 78 74 20 63 68 61 6e 67 65 20   of next change 
0a40: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20  */.  u8 *aData; 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0a70: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
0a80: 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
0a90: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20  /.  int nData;  
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ac0: 20 62 79 74 65 73 20 69 6e 20 61 44 61 74 61 20   bytes in aData 
0ad0: 2a 2f 0a 0a 20 20 53 65 73 73 69 6f 6e 42 75 66  */..  SessionBuf
0ae0: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
0af0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
0b00: 20 72 65 61 64 20 62 75 66 66 65 72 20 2a 2f 0a   read buffer */.
0b10: 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
0b20: 76 6f 69 64 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e  void*, void*, in
0b30: 74 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 49  t*);        /* I
0b40: 6e 70 75 74 20 73 74 72 65 61 6d 20 63 61 6c 6c  nput stream call
0b50: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
0b60: 76 6f 69 64 20 2a 70 49 6e 3b 20 20 20 20 20 20  void *pIn;      
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
0b90: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
0ba0: 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 62  Input */.  int b
0bb0: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
0bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
0bd0: 74 20 74 6f 20 74 72 75 65 20 61 66 74 65 72 20  t to true after 
0be0: 78 49 6e 70 75 74 20 66 69 6e 69 73 68 65 64 20  xInput finished 
0bf0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  */.};../*.** Str
0c00: 75 63 74 75 72 65 20 66 6f 72 20 63 68 61 6e 67  ucture for chang
0c10: 65 73 65 74 20 69 74 65 72 61 74 6f 72 73 2e 0a  eset iterators..
0c20: 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  */.struct sqlite
0c30: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
0c40: 20 7b 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75   {.  SessionInpu
0c50: 74 20 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t in;           
0c60: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 62 75       /* Input bu
0c70: 66 66 65 72 20 6f 72 20 73 74 72 65 61 6d 20 2a  ffer or stream *
0c80: 2f 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65  /.  SessionBuffe
0c90: 72 20 74 62 6c 68 64 72 3b 20 20 20 20 20 20 20  r tblhdr;       
0ca0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
0cb0: 20 68 6f 6c 64 20 61 70 56 61 6c 75 65 2f 7a 54   hold apValue/zT
0cc0: 61 62 2f 61 62 50 4b 2f 20 2a 2f 0a 20 20 69 6e  ab/abPK/ */.  in
0cd0: 74 20 62 50 61 74 63 68 73 65 74 3b 20 20 20 20  t bPatchset;    
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0cf0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
0d00: 20 61 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 20   a patchset */. 
0d10: 20 69 6e 74 20 62 49 6e 76 65 72 74 3b 20 20 20   int bInvert;   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 65   /* True to inve
0d40: 72 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  rt changeset */.
0d50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 65 72    /* Iterator er
0d80: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  ror code */.  sq
0d90: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e  lite3_stmt *pCon
0da0: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  flict;        /*
0db0: 20 50 6f 69 6e 74 73 20 74 6f 20 63 6f 6e 66 6c   Points to confl
0dc0: 69 63 74 69 6e 67 20 72 6f 77 2c 20 69 66 20 61  icting row, if a
0dd0: 6e 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  ny */.  char *zT
0de0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
0df0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0e00: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
0e10: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0e30: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
0e40: 6e 73 20 69 6e 20 7a 54 61 62 20 2a 2f 0a 20 20  ns in zTab */.  
0e50: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61  /* Current opera
0e80: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 49  tion */.  int bI
0e90: 6e 64 69 72 65 63 74 3b 20 20 20 20 20 20 20 20  ndirect;        
0ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0eb0: 65 20 69 66 20 63 75 72 72 65 6e 74 20 63 68 61  e if current cha
0ec0: 6e 67 65 20 77 61 73 20 69 6e 64 69 72 65 63 74  nge was indirect
0ed0: 20 2a 2f 0a 20 20 75 38 20 2a 61 62 50 4b 3b 20   */.  u8 *abPK; 
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79        /* Primary
0f00: 20 6b 65 79 20 61 72 72 61 79 20 2a 2f 0a 20 20   key array */.  
0f10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0f20: 61 70 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20  apValue;        
0f30: 2f 2a 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77  /* old.* and new
0f40: 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 7d 3b 0a  .* values */.};.
0f50: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 65 73 73  ./*.** Each sess
0f60: 69 6f 6e 20 6f 62 6a 65 63 74 20 6d 61 69 6e 74  ion object maint
0f70: 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 68  ains a set of th
0f80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0f90: 63 74 75 72 65 73 2c 20 6f 6e 65 0a 2a 2a 20 66  ctures, one.** f
0fa0: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 74 68  or each table th
0fb0: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
0fc0: 20 69 73 20 6d 6f 6e 69 74 6f 72 69 6e 67 2e 20   is monitoring. 
0fd0: 54 68 65 20 73 74 72 75 63 74 75 72 65 73 20 61  The structures a
0fe0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
0ff0: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  a linked list st
1000: 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65  arting at sqlite
1010: 33 5f 73 65 73 73 69 6f 6e 2e 70 54 61 62 6c 65  3_session.pTable
1020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6b 65 79 73  ..**.** The keys
1030: 20 6f 66 20 74 68 65 20 53 65 73 73 69 6f 6e 54   of the SessionT
1040: 61 62 6c 65 2e 61 43 68 61 6e 67 65 5b 5d 20 68  able.aChange[] h
1050: 61 73 68 20 74 61 62 6c 65 20 61 72 65 20 61 6c  ash table are al
1060: 6c 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65  l rows that have
1070: 0a 2a 2a 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  .** been modifie
1080: 64 20 69 6e 20 61 6e 79 20 77 61 79 20 73 69 6e  d in any way sin
1090: 63 65 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ce the session o
10a0: 62 6a 65 63 74 20 77 61 73 20 61 74 74 61 63 68  bject was attach
10b0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62  ed to the.** tab
10c0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  le..**.** The da
10d0: 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
10e0: 74 68 20 65 61 63 68 20 68 61 73 68 2d 74 61 62  th each hash-tab
10f0: 6c 65 20 65 6e 74 72 79 20 69 73 20 61 20 73 74  le entry is a st
1100: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
1110: 6e 67 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  ng.** a subset o
1120: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  f the initial va
1130: 6c 75 65 73 20 74 68 61 74 20 74 68 65 20 6d 6f  lues that the mo
1140: 64 69 66 69 65 64 20 72 6f 77 20 63 6f 6e 74 61  dified row conta
1150: 69 6e 65 64 20 61 74 20 74 68 65 0a 2a 2a 20 73  ined at the.** s
1160: 74 61 72 74 20 6f 66 20 74 68 65 20 73 65 73 73  tart of the sess
1170: 69 6f 6e 2e 20 4f 72 20 6e 6f 20 69 6e 69 74 69  ion. Or no initi
1180: 61 6c 20 76 61 6c 75 65 73 20 69 66 20 74 68 65  al values if the
1190: 20 72 6f 77 20 77 61 73 20 69 6e 73 65 72 74 65   row was inserte
11a0: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 73  d..*/.struct Ses
11b0: 73 69 6f 6e 54 61 62 6c 65 20 7b 0a 20 20 53 65  sionTable {.  Se
11c0: 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 4e 65 78  ssionTable *pNex
11d0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  t;.  char *zName
11e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61       /* Local na
1200: 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  me of table */. 
1210: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1240: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a  lumns in table z
1250: 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 62 53  Name */.  int bS
1260: 74 61 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  tat1;           
1270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1280: 65 20 69 66 20 74 68 69 73 20 69 73 20 73 71 6c  e if this is sql
1290: 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 63  ite_stat1 */.  c
12a0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
12b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
12c0: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  * Column names *
12d0: 2f 0a 20 20 75 38 20 2a 61 62 50 4b 3b 20 20 20  /.  u8 *abPK;   
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1300: 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6c 61 67  primary key flag
1310: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 72  s */.  int nEntr
1320: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1330: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1340: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
1350: 73 20 69 6e 20 68 61 73 68 20 74 61 62 6c 65 20  s in hash table 
1360: 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65  */.  int nChange
1370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1380: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1390: 61 70 43 68 61 6e 67 65 5b 5d 20 61 72 72 61 79  apChange[] array
13a0: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 43 68 61   */.  SessionCha
13b0: 6e 67 65 20 2a 2a 61 70 43 68 61 6e 67 65 3b 20  nge **apChange; 
13c0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
13d0: 62 6c 65 20 62 75 63 6b 65 74 73 20 2a 2f 0a 7d  ble buckets */.}
13e0: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 52 45 43 4f 52 44  ;../* .** RECORD
13f0: 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 54   FORMAT:.**.** T
1400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  he following rec
1410: 6f 72 64 20 66 6f 72 6d 61 74 20 69 73 20 73 69  ord format is si
1420: 6d 69 6c 61 72 20 74 6f 20 28 62 75 74 20 6e 6f  milar to (but no
1430: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
1440: 68 29 20 74 68 61 74 20 0a 2a 2a 20 75 73 65 64  h) that .** used
1450: 20 69 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   in SQLite datab
1460: 61 73 65 20 66 69 6c 65 73 2e 20 54 68 69 73 20  ase files. This 
1470: 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64 20 61  format is used a
1480: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 2a  s part of the .*
1490: 2a 20 63 68 61 6e 67 65 2d 73 65 74 20 62 69 6e  * change-set bin
14a0: 61 72 79 20 66 6f 72 6d 61 74 2c 20 61 6e 64 20  ary format, and 
14b0: 73 6f 20 6d 75 73 74 20 62 65 20 61 72 63 68 69  so must be archi
14c0: 74 65 63 74 75 72 65 20 69 6e 64 65 70 65 6e 64  tecture independ
14d0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b  ent..**.** Unlik
14e0: 65 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74  e the SQLite dat
14f0: 61 62 61 73 65 20 72 65 63 6f 72 64 20 66 6f 72  abase record for
1500: 6d 61 74 2c 20 65 61 63 68 20 66 69 65 6c 64 20  mat, each field 
1510: 69 73 20 73 65 6c 66 2d 63 6f 6e 74 61 69 6e 65  is self-containe
1520: 64 20 2d 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  d -.** there is 
1530: 6e 6f 20 73 65 70 61 72 61 74 69 6f 6e 20 6f 66  no separation of
1540: 20 68 65 61 64 65 72 20 61 6e 64 20 64 61 74 61   header and data
1550: 2e 20 45 61 63 68 20 66 69 65 6c 64 20 62 65 67  . Each field beg
1560: 69 6e 73 20 77 69 74 68 20 61 0a 2a 2a 20 73 69  ins with a.** si
1570: 6e 67 6c 65 20 62 79 74 65 20 64 65 73 63 72 69  ngle byte descri
1580: 62 69 6e 67 20 69 74 73 20 74 79 70 65 2c 20 61  bing its type, a
1590: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
15a0: 20 20 20 20 20 20 20 30 78 30 30 3a 20 55 6e 64         0x00: Und
15b0: 65 66 69 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2a  efined value..**
15c0: 20 20 20 20 20 20 20 30 78 30 31 3a 20 49 6e 74         0x01: Int
15d0: 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 20  eger value..**  
15e0: 20 20 20 20 20 30 78 30 32 3a 20 52 65 61 6c 20       0x02: Real 
15f0: 76 61 6c 75 65 2e 0a 2a 2a 20 20 20 20 20 20 20  value..**       
1600: 30 78 30 33 3a 20 54 65 78 74 20 76 61 6c 75 65  0x03: Text value
1610: 2e 0a 2a 2a 20 20 20 20 20 20 20 30 78 30 34 3a  ..**       0x04:
1620: 20 42 6c 6f 62 20 76 61 6c 75 65 2e 0a 2a 2a 20   Blob value..** 
1630: 20 20 20 20 20 20 30 78 30 35 3a 20 53 51 4c 20        0x05: SQL 
1640: 4e 55 4c 4c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  NULL value..**.*
1650: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1660: 61 62 6f 76 65 20 6d 61 74 63 68 20 74 68 65 20  above match the 
1670: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 53  definitions of S
1680: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 2c 20 53  QLITE_INTEGER, S
1690: 51 4c 49 54 45 5f 54 45 58 54 0a 2a 2a 20 61 6e  QLITE_TEXT.** an
16a0: 64 20 73 6f 20 6f 6e 20 69 6e 20 73 71 6c 69 74  d so on in sqlit
16b0: 65 33 2e 68 2e 20 46 6f 72 20 75 6e 64 65 66 69  e3.h. For undefi
16c0: 6e 65 64 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ned and NULL val
16d0: 75 65 73 2c 20 74 68 65 20 66 69 65 6c 64 20 63  ues, the field c
16e0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 6e 6c 79 20  onsists.** only 
16f0: 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 20 74 79  of the single ty
1700: 70 65 20 62 79 74 65 2e 20 46 6f 72 20 6f 74 68  pe byte. For oth
1710: 65 72 20 74 79 70 65 73 20 6f 66 20 76 61 6c 75  er types of valu
1720: 65 73 2c 20 74 68 65 20 74 79 70 65 20 62 79 74  es, the type byt
1730: 65 0a 2a 2a 20 69 73 20 66 6f 6c 6c 6f 77 65 64  e.** is followed
1740: 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 65 78   by:.**.**   Tex
1750: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 20 20 20 20  t values:.**    
1760: 20 41 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69   A varint contai
1770: 6e 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ning the number 
1780: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1790: 76 61 6c 75 65 20 28 65 6e 63 6f 64 65 64 20 75  value (encoded u
17a0: 73 69 6e 67 0a 2a 2a 20 20 20 20 20 55 54 46 2d  sing.**     UTF-
17b0: 38 29 2e 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  8). Followed by 
17c0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
17d0: 69 6e 67 20 74 68 65 20 55 54 46 2d 38 20 72 65  ing the UTF-8 re
17e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
17f0: 20 20 20 20 6f 66 20 74 68 65 20 74 65 78 74 20      of the text 
1800: 76 61 6c 75 65 2e 20 54 68 65 72 65 20 69 73 20  value. There is 
1810: 6e 6f 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 6f  no nul terminato
1820: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 6c 6f 62 20  r..**.**   Blob 
1830: 76 61 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41  values:.**     A
1840: 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69   varint containi
1850: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
1860: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 76 61   bytes in the va
1870: 6c 75 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lue, followed by
1880: 0a 2a 2a 20 20 20 20 20 61 20 62 75 66 66 65 72  .**     a buffer
1890: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
18a0: 76 61 6c 75 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  value itself..**
18b0: 0a 2a 2a 20 20 20 49 6e 74 65 67 65 72 20 76 61  .**   Integer va
18c0: 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41 6e 20  lues:.**     An 
18d0: 38 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  8-byte big-endia
18e0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  n integer value.
18f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 61 6c 20 76 61  .**.**   Real va
1900: 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41 6e 20  lues:.**     An 
1910: 38 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  8-byte big-endia
1920: 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
1930: 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  real value..**.*
1940: 2a 20 56 61 72 69 6e 74 20 76 61 6c 75 65 73 20  * Varint values 
1950: 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 74  are encoded in t
1960: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 76  he same way as v
1970: 61 72 69 6e 74 73 20 69 6e 20 74 68 65 20 53 51  arints in the SQ
1980: 4c 69 74 65 20 0a 2a 2a 20 72 65 63 6f 72 64 20  Lite .** record 
1990: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 43 48  format..**.** CH
19a0: 41 4e 47 45 53 45 54 20 46 4f 52 4d 41 54 3a 0a  ANGESET FORMAT:.
19b0: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
19c0: 74 20 69 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f  t is a collectio
19d0: 6e 20 6f 66 20 44 45 4c 45 54 45 2c 20 55 50 44  n of DELETE, UPD
19e0: 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 6f  ATE and INSERT o
19f0: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20  perations on.** 
1a00: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  one or more tabl
1a10: 65 73 2e 20 4f 70 65 72 61 74 69 6f 6e 73 20 6f  es. Operations o
1a20: 6e 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  n a single table
1a30: 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1a40: 65 74 68 65 72 2c 0a 2a 2a 20 62 75 74 20 6d 61  ether,.** but ma
1a50: 79 20 6f 63 63 75 72 20 69 6e 20 61 6e 79 20 6f  y occur in any o
1a60: 72 64 65 72 20 28 69 2e 65 2e 20 64 65 6c 65 74  rder (i.e. delet
1a70: 65 73 2c 20 75 70 64 61 74 65 73 20 61 6e 64 20  es, updates and 
1a80: 69 6e 73 65 72 74 73 20 61 72 65 20 61 6c 6c 0a  inserts are all.
1a90: 2a 2a 20 6d 69 78 65 64 20 74 6f 67 65 74 68 65  ** mixed togethe
1aa0: 72 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 67  r)..**.** Each g
1ab0: 72 6f 75 70 20 6f 66 20 63 68 61 6e 67 65 73 20  roup of changes 
1ac0: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 74 61  begins with a ta
1ad0: 62 6c 65 20 68 65 61 64 65 72 3a 0a 2a 2a 0a 2a  ble header:.**.*
1ae0: 2a 20 20 20 31 20 62 79 74 65 3a 20 43 6f 6e 73  *   1 byte: Cons
1af0: 74 61 6e 74 20 30 78 35 34 20 28 63 61 70 69 74  tant 0x54 (capit
1b00: 61 6c 20 27 54 27 29 0a 2a 2a 20 20 20 56 61 72  al 'T').**   Var
1b10: 69 6e 74 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  int: Number of c
1b20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
1b30: 62 6c 65 2e 0a 2a 2a 20 20 20 6e 43 6f 6c 20 62  ble..**   nCol b
1b40: 79 74 65 73 3a 20 30 78 30 31 20 66 6f 72 20 50  ytes: 0x01 for P
1b50: 4b 20 63 6f 6c 75 6d 6e 73 2c 20 30 78 30 30 20  K columns, 0x00 
1b60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 20 20  otherwise..**   
1b70: 4e 20 62 79 74 65 73 3a 20 55 6e 71 75 61 6c 69  N bytes: Unquali
1b80: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  fied table name 
1b90: 28 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 55  (encoded using U
1ba0: 54 46 2d 38 29 2e 20 4e 75 6c 2d 74 65 72 6d 69  TF-8). Nul-termi
1bb0: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 6c  nated..**.** Fol
1bc0: 6c 6f 77 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  lowed by one or 
1bd0: 6d 6f 72 65 20 63 68 61 6e 67 65 73 20 74 6f 20  more changes to 
1be0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1bf0: 20 20 20 31 20 62 79 74 65 3a 20 45 69 74 68 65     1 byte: Eithe
1c00: 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  r SQLITE_INSERT 
1c10: 28 30 78 31 32 29 2c 20 55 50 44 41 54 45 20 28  (0x12), UPDATE (
1c20: 30 78 31 37 29 20 6f 72 20 44 45 4c 45 54 45 20  0x17) or DELETE 
1c30: 28 30 78 30 39 29 2e 0a 2a 2a 20 20 20 31 20 62  (0x09)..**   1 b
1c40: 79 74 65 3a 20 54 68 65 20 22 69 6e 64 69 72 65  yte: The "indire
1c50: 63 74 2d 63 68 61 6e 67 65 22 20 66 6c 61 67 2e  ct-change" flag.
1c60: 0a 2a 2a 20 20 20 6f 6c 64 2e 2a 20 72 65 63 6f  .**   old.* reco
1c70: 72 64 3a 20 28 64 65 6c 65 74 65 20 61 6e 64 20  rd: (delete and 
1c80: 75 70 64 61 74 65 20 6f 6e 6c 79 29 0a 2a 2a 20  update only).** 
1c90: 20 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 3a 20    new.* record: 
1ca0: 28 69 6e 73 65 72 74 20 61 6e 64 20 75 70 64 61  (insert and upda
1cb0: 74 65 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 54  te only).**.** T
1cc0: 68 65 20 22 6f 6c 64 2e 2a 22 20 61 6e 64 20 22  he "old.*" and "
1cd0: 6e 65 77 2e 2a 22 20 72 65 63 6f 72 64 73 2c 20  new.*" records, 
1ce0: 69 66 20 70 72 65 73 65 6e 74 2c 20 61 72 65 20  if present, are 
1cf0: 4e 20 66 69 65 6c 64 20 72 65 63 6f 72 64 73 20  N field records 
1d00: 69 6e 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74  in the.** format
1d10: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1d20: 20 75 6e 64 65 72 20 22 52 45 43 4f 52 44 20 46   under "RECORD F
1d30: 4f 52 4d 41 54 22 2c 20 77 68 65 72 65 20 4e 20  ORMAT", where N 
1d40: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1d50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  .** columns in t
1d60: 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20 69 27  he table. The i'
1d70: 74 68 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  th field of each
1d80: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 6f 63   record is assoc
1d90: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
1da0: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
1db0: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 6f 75 6e   the table, coun
1dc0: 74 69 6e 67 20 66 72 6f 6d 20 6c 65 66 74 20 74  ting from left t
1dd0: 6f 20 72 69 67 68 74 20 69 6e 20 74 68 65 20 6f  o right in the o
1de0: 72 64 65 72 0a 2a 2a 20 69 6e 20 77 68 69 63 68  rder.** in which
1df0: 20 63 6f 6c 75 6d 6e 73 20 77 65 72 65 20 64 65   columns were de
1e00: 63 6c 61 72 65 64 20 69 6e 20 74 68 65 20 43 52  clared in the CR
1e10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1e20: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
1e30: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 74 68 61  new.* record tha
1e40: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 61 63  t is part of eac
1e50: 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20  h INSERT change 
1e60: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
1e70: 75 65 73 0a 2a 2a 20 74 68 61 74 20 6d 61 6b 65  ues.** that make
1e80: 20 75 70 20 74 68 65 20 6e 65 77 20 72 6f 77 2e   up the new row.
1e90: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
1ea0: 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20 74 68 61  old.* record tha
1eb0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 61 63  t is part of eac
1ec0: 68 0a 2a 2a 20 44 45 4c 45 54 45 20 63 68 61 6e  h.** DELETE chan
1ed0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ge contains the 
1ee0: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 64 65  values that made
1ef0: 20 75 70 20 74 68 65 20 72 6f 77 20 74 68 61 74   up the row that
1f00: 20 77 61 73 20 64 65 6c 65 74 65 64 20 0a 2a 2a   was deleted .**
1f10: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f20: 73 65 2e 20 49 6e 20 74 68 65 20 63 68 61 6e 67  se. In the chang
1f30: 65 73 65 74 20 66 6f 72 6d 61 74 2c 20 74 68 65  eset format, the
1f40: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 61 72   records that ar
1f50: 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 49 4e 53  e part.** of INS
1f60: 45 52 54 20 6f 72 20 44 45 4c 45 54 45 20 63 68  ERT or DELETE ch
1f70: 61 6e 67 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  anges never cont
1f80: 61 69 6e 20 61 6e 79 20 75 6e 64 65 66 69 6e 65  ain any undefine
1f90: 64 20 28 74 79 70 65 20 62 79 74 65 20 30 78 30  d (type byte 0x0
1fa0: 30 29 0a 2a 2a 20 66 69 65 6c 64 73 2e 0a 2a 2a  0).** fields..**
1fb0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 65 20 6f  .** Within the o
1fc0: 6c 64 2e 2a 20 72 65 63 6f 72 64 20 61 73 73 6f  ld.* record asso
1fd0: 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 55  ciated with an U
1fe0: 50 44 41 54 45 20 63 68 61 6e 67 65 2c 20 61 6c  PDATE change, al
1ff0: 6c 20 66 69 65 6c 64 73 0a 2a 2a 20 61 73 73 6f  l fields.** asso
2000: 63 69 61 74 65 64 20 77 69 74 68 20 74 61 62 6c  ciated with tabl
2010: 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  e columns that a
2020: 72 65 20 6e 6f 74 20 50 52 49 4d 41 52 59 20 4b  re not PRIMARY K
2030: 45 59 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 61  EY columns and a
2040: 72 65 0a 2a 2a 20 6e 6f 74 20 6d 6f 64 69 66 69  re.** not modifi
2050: 65 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45  ed by the UPDATE
2060: 20 63 68 61 6e 67 65 20 61 72 65 20 73 65 74 20   change are set 
2070: 74 6f 20 22 75 6e 64 65 66 69 6e 65 64 22 2e 20  to "undefined". 
2080: 4f 74 68 65 72 20 66 69 65 6c 64 73 0a 2a 2a 20  Other fields.** 
2090: 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20 76  are set to the v
20a0: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 64 65 20  alues that made 
20b0: 75 70 20 74 68 65 20 72 6f 77 20 62 65 66 6f 72  up the row befor
20c0: 65 20 74 68 65 20 55 50 44 41 54 45 20 74 68 61  e the UPDATE tha
20d0: 74 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 20  t the.** change 
20e0: 72 65 63 6f 72 64 73 20 74 6f 6f 6b 20 70 6c 61  records took pla
20f0: 63 65 2e 20 57 69 74 68 69 6e 20 74 68 65 20 6e  ce. Within the n
2100: 65 77 2e 2a 20 72 65 63 6f 72 64 2c 20 66 69 65  ew.* record, fie
2110: 6c 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  lds associated .
2120: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 63 6f  ** with table co
2130: 6c 75 6d 6e 73 20 6d 6f 64 69 66 69 65 64 20 62  lumns modified b
2140: 79 20 74 68 65 20 55 50 44 41 54 45 20 63 68 61  y the UPDATE cha
2150: 6e 67 65 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  nge contain the 
2160: 6e 65 77 20 0a 2a 2a 20 76 61 6c 75 65 73 2e 20  new .** values. 
2170: 46 69 65 6c 64 73 20 61 73 73 6f 63 69 61 74 65  Fields associate
2180: 64 20 77 69 74 68 20 74 61 62 6c 65 20 63 6f 6c  d with table col
2190: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f  umns that are no
21a0: 74 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 61 72  t modified.** ar
21b0: 65 20 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69  e set to "undefi
21c0: 6e 65 64 22 2e 0a 2a 2a 0a 2a 2a 20 50 41 54 43  ned"..**.** PATC
21d0: 48 53 45 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a  HSET FORMAT:.**.
21e0: 2a 2a 20 41 20 70 61 74 63 68 73 65 74 20 69 73  ** A patchset is
21f0: 20 61 6c 73 6f 20 61 20 63 6f 6c 6c 65 63 74 69   also a collecti
2200: 6f 6e 20 6f 66 20 63 68 61 6e 67 65 73 2e 20 49  on of changes. I
2210: 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  t is similar to 
2220: 61 20 63 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20  a changeset,.** 
2230: 62 75 74 20 6c 65 61 76 65 73 20 75 6e 64 65 66  but leaves undef
2240: 69 6e 65 64 20 74 68 6f 73 65 20 66 69 65 6c 64  ined those field
2250: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 75  s that are not u
2260: 73 65 66 75 6c 20 69 66 20 6e 6f 20 63 6f 6e 66  seful if no conf
2270: 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c 75 74 69  lict.** resoluti
2280: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 77  on is required w
2290: 68 65 6e 20 61 70 70 6c 79 69 6e 67 20 74 68 65  hen applying the
22a0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a   changeset..**.*
22b0: 2a 20 45 61 63 68 20 67 72 6f 75 70 20 6f 66 20  * Each group of 
22c0: 63 68 61 6e 67 65 73 20 62 65 67 69 6e 73 20 77  changes begins w
22d0: 69 74 68 20 61 20 74 61 62 6c 65 20 68 65 61 64  ith a table head
22e0: 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62 79  er:.**.**   1 by
22f0: 74 65 3a 20 43 6f 6e 73 74 61 6e 74 20 30 78 35  te: Constant 0x5
2300: 30 20 28 63 61 70 69 74 61 6c 20 27 50 27 29 0a  0 (capital 'P').
2310: 2a 2a 20 20 20 56 61 72 69 6e 74 3a 20 4e 75 6d  **   Varint: Num
2320: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2330: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
2340: 20 20 6e 43 6f 6c 20 62 79 74 65 73 3a 20 30 78    nCol bytes: 0x
2350: 30 31 20 66 6f 72 20 50 4b 20 63 6f 6c 75 6d 6e  01 for PK column
2360: 73 2c 20 30 78 30 30 20 6f 74 68 65 72 77 69 73  s, 0x00 otherwis
2370: 65 2e 0a 2a 2a 20 20 20 4e 20 62 79 74 65 73 3a  e..**   N bytes:
2380: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   Unqualified tab
2390: 6c 65 20 6e 61 6d 65 20 28 65 6e 63 6f 64 65 64  le name (encoded
23a0: 20 75 73 69 6e 67 20 55 54 46 2d 38 29 2e 20 4e   using UTF-8). N
23b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ul-terminated..*
23c0: 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79  *.** Followed by
23d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 68 61   one or more cha
23e0: 6e 67 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nges to the tabl
23f0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62 79 74  e..**.**   1 byt
2400: 65 3a 20 45 69 74 68 65 72 20 53 51 4c 49 54 45  e: Either SQLITE
2410: 5f 49 4e 53 45 52 54 20 28 30 78 31 32 29 2c 20  _INSERT (0x12), 
2420: 55 50 44 41 54 45 20 28 30 78 31 37 29 20 6f 72  UPDATE (0x17) or
2430: 20 44 45 4c 45 54 45 20 28 30 78 30 39 29 2e 0a   DELETE (0x09)..
2440: 2a 2a 20 20 20 31 20 62 79 74 65 3a 20 54 68 65  **   1 byte: The
2450: 20 22 69 6e 64 69 72 65 63 74 2d 63 68 61 6e 67   "indirect-chang
2460: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 73 69  e" flag..**   si
2470: 6e 67 6c 65 20 72 65 63 6f 72 64 3a 20 28 50 4b  ngle record: (PK
2480: 20 66 69 65 6c 64 73 20 66 6f 72 20 44 45 4c 45   fields for DELE
2490: 54 45 2c 20 50 4b 20 61 6e 64 20 6d 6f 64 69 66  TE, PK and modif
24a0: 69 65 64 20 66 69 65 6c 64 73 20 66 6f 72 20 55  ied fields for U
24b0: 50 44 41 54 45 2c 0a 2a 2a 20 20 20 20 20 20 20  PDATE,.**       
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c 6c              full
24d0: 20 72 65 63 6f 72 64 20 66 6f 72 20 49 4e 53 45   record for INSE
24e0: 52 54 29 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 69 6e  RT)..**.** As in
24f0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 66   the changeset f
2500: 6f 72 6d 61 74 2c 20 65 61 63 68 20 66 69 65 6c  ormat, each fiel
2510: 64 20 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 20  d of the single 
2520: 72 65 63 6f 72 64 20 74 68 61 74 20 69 73 20 70  record that is p
2530: 61 72 74 0a 2a 2a 20 6f 66 20 61 20 70 61 74 63  art.** of a patc
2540: 68 73 65 74 20 63 68 61 6e 67 65 20 69 73 20 61  hset change is a
2550: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2560: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2570: 6c 79 20 70 6f 73 69 74 69 6f 6e 65 64 0a 2a 2a  ly positioned.**
2580: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 63   table column, c
2590: 6f 75 6e 74 69 6e 67 20 66 72 6f 6d 20 6c 65 66  ounting from lef
25a0: 74 20 74 6f 20 72 69 67 68 74 20 77 69 74 68 69  t to right withi
25b0: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
25c0: 4c 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  LE .** statement
25d0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 44 45  ..**.** For a DE
25e0: 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 61 6c 6c  LETE change, all
25f0: 20 66 69 65 6c 64 73 20 77 69 74 68 69 6e 20 74   fields within t
2600: 68 65 20 72 65 63 6f 72 64 20 65 78 63 65 70 74  he record except
2610: 20 74 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65   those associate
2620: 64 0a 2a 2a 20 77 69 74 68 20 50 52 49 4d 41 52  d.** with PRIMAR
2630: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72  Y KEY columns ar
2640: 65 20 6f 6d 69 74 74 65 64 2e 20 54 68 65 20 50  e omitted. The P
2650: 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64  RIMARY KEY field
2660: 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  s contain the.**
2670: 20 76 61 6c 75 65 73 20 69 64 65 6e 74 69 66 79   values identify
2680: 69 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20 64  ing the row to d
2690: 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elete..**.** For
26a0: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
26b0: 65 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  e, all fields ex
26c0: 63 65 70 74 20 74 68 6f 73 65 20 61 73 73 6f 63  cept those assoc
26d0: 69 61 74 65 64 20 77 69 74 68 20 50 52 49 4d 41  iated with PRIMA
26e0: 52 59 20 4b 45 59 0a 2a 2a 20 63 6f 6c 75 6d 6e  RY KEY.** column
26f0: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 74 68  s and columns th
2700: 61 74 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  at are modified 
2710: 62 79 20 74 68 65 20 55 50 44 41 54 45 20 61 72  by the UPDATE ar
2720: 65 20 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69  e set to "undefi
2730: 6e 65 64 22 2e 0a 2a 2a 20 50 52 49 4d 41 52 59  ned"..** PRIMARY
2740: 20 4b 45 59 20 66 69 65 6c 64 73 20 63 6f 6e 74   KEY fields cont
2750: 61 69 6e 20 74 68 65 20 76 61 6c 75 65 73 20 69  ain the values i
2760: 64 65 6e 74 69 66 79 69 6e 67 20 74 68 65 20 74  dentifying the t
2770: 61 62 6c 65 20 72 6f 77 20 74 6f 20 75 70 64 61  able row to upda
2780: 74 65 2c 0a 2a 2a 20 61 6e 64 20 66 69 65 6c 64  te,.** and field
2790: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27a0: 68 20 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d  h modified colum
27b0: 6e 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ns contain the n
27c0: 65 77 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ew column values
27d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 63 6f  ..**.** The reco
27e0: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
27f0: 69 74 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67  ith INSERT chang
2800: 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  es are in the sa
2810: 6d 65 20 66 6f 72 6d 61 74 20 61 73 20 66 6f 72  me format as for
2820: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 73 2e 20  .** changesets. 
2830: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
2840: 6c 65 20 66 6f 72 20 61 20 72 65 63 6f 72 64 20  le for a record 
2850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2860: 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 63 68 61  an INSERT.** cha
2870: 6e 67 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  nge to contain a
2880: 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 22 75   field set to "u
2890: 6e 64 65 66 69 6e 65 64 22 2e 0a 2a 2a 0a 2a 2a  ndefined"..**.**
28a0: 20 52 45 42 41 53 45 20 42 4c 4f 42 20 46 4f 52   REBASE BLOB FOR
28b0: 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 41 20 72 65 62  MAT:.**.** A reb
28c0: 61 73 65 20 62 6c 6f 62 20 6d 61 79 20 62 65 20  ase blob may be 
28d0: 6f 75 74 70 75 74 20 62 79 20 73 71 6c 69 74 65  output by sqlite
28e0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
28f0: 5f 76 32 28 29 20 61 6e 64 20 69 74 73 20 0a 2a  _v2() and its .*
2900: 2a 20 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69  * streaming equi
2910: 76 61 6c 65 6e 74 20 66 6f 72 20 75 73 65 20 77  valent for use w
2920: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
2930: 72 65 62 61 73 65 72 20 41 50 49 73 20 74 6f 20  rebaser APIs to 
2940: 72 65 62 61 73 65 0a 2a 2a 20 65 78 69 73 74 69  rebase.** existi
2950: 6e 67 20 63 68 61 6e 67 65 73 65 74 73 2e 20 41  ng changesets. A
2960: 20 72 65 62 61 73 65 20 62 6c 6f 62 20 63 6f 6e   rebase blob con
2970: 74 61 69 6e 73 20 6f 6e 65 20 65 6e 74 72 79 20  tains one entry 
2980: 66 6f 72 20 65 61 63 68 20 63 6f 6e 66 6c 69 63  for each conflic
2990: 74 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 75 73  t.** resolved us
29a0: 69 6e 67 20 65 69 74 68 65 72 20 74 68 65 20 4f  ing either the O
29b0: 4d 49 54 20 6f 72 20 52 45 50 4c 41 43 45 20 73  MIT or REPLACE s
29c0: 74 72 61 74 65 67 69 65 73 20 77 69 74 68 69 6e  trategies within
29d0: 20 74 68 65 20 61 70 70 6c 79 5f 76 32 28 29 0a   the apply_v2().
29e0: 2a 2a 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ** call..**.** T
29f0: 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 66  he format used f
2a00: 6f 72 20 61 20 72 65 62 61 73 65 20 62 6c 6f 62  or a rebase blob
2a10: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
2a20: 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 66 6f   to that used fo
2a30: 72 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 73 2e  r.** changesets.
2a40: 20 41 6c 6c 20 65 6e 74 72 69 65 73 20 72 65 6c   All entries rel
2a50: 61 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  ated to a single
2a60: 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f 75 70   table are group
2a70: 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a  ed together..**.
2a80: 2a 2a 20 45 61 63 68 20 67 72 6f 75 70 20 6f 66  ** Each group of
2a90: 20 65 6e 74 72 69 65 73 20 62 65 67 69 6e 73 20   entries begins 
2aa0: 77 69 74 68 20 61 20 74 61 62 6c 65 20 68 65 61  with a table hea
2ab0: 64 65 72 20 69 6e 20 63 68 61 6e 67 65 73 65 74  der in changeset
2ac0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
2ad0: 20 31 20 62 79 74 65 3a 20 43 6f 6e 73 74 61 6e   1 byte: Constan
2ae0: 74 20 30 78 35 34 20 28 63 61 70 69 74 61 6c 20  t 0x54 (capital 
2af0: 27 54 27 29 0a 2a 2a 20 20 20 56 61 72 69 6e 74  'T').**   Varint
2b00: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
2b10: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
2b20: 2e 0a 2a 2a 20 20 20 6e 43 6f 6c 20 62 79 74 65  ..**   nCol byte
2b30: 73 3a 20 30 78 30 31 20 66 6f 72 20 50 4b 20 63  s: 0x01 for PK c
2b40: 6f 6c 75 6d 6e 73 2c 20 30 78 30 30 20 6f 74 68  olumns, 0x00 oth
2b50: 65 72 77 69 73 65 2e 0a 2a 2a 20 20 20 4e 20 62  erwise..**   N b
2b60: 79 74 65 73 3a 20 55 6e 71 75 61 6c 69 66 69 65  ytes: Unqualifie
2b70: 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 65 6e  d table name (en
2b80: 63 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d  coded using UTF-
2b90: 38 29 2e 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74  8). Nul-terminat
2ba0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77  ed..**.** Follow
2bb0: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
2bc0: 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
2bd0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
2be0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62  ble..**.**   1 b
2bf0: 79 74 65 3a 20 45 69 74 68 65 72 20 53 51 4c 49  yte: Either SQLI
2c00: 54 45 5f 49 4e 53 45 52 54 20 28 30 78 31 32 29  TE_INSERT (0x12)
2c10: 2c 20 44 45 4c 45 54 45 20 28 30 78 30 39 29 2e  , DELETE (0x09).
2c20: 0a 2a 2a 20 20 20 31 20 62 79 74 65 3a 20 46 6c  .**   1 byte: Fl
2c30: 61 67 2e 20 30 78 30 31 20 66 6f 72 20 52 45 50  ag. 0x01 for REP
2c40: 4c 41 43 45 2c 20 30 78 30 30 20 66 6f 72 20 4f  LACE, 0x00 for O
2c50: 4d 49 54 2e 0a 2a 2a 20 20 20 72 65 63 6f 72 64  MIT..**   record
2c60: 3a 20 28 69 6e 20 74 68 65 20 72 65 63 6f 72 64  : (in the record
2c70: 20 66 6f 72 6d 61 74 20 64 65 66 69 6e 65 64 20   format defined 
2c80: 61 62 6f 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  above)..**.** In
2c90: 20 61 20 72 65 62 61 73 65 20 62 6c 6f 62 2c 20   a rebase blob, 
2ca0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
2cb0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
2cc0: 5f 49 4e 53 45 52 54 20 69 66 20 74 68 65 20 63  _INSERT if the c
2cd0: 68 61 6e 67 65 0a 2a 2a 20 74 68 61 74 20 63 61  hange.** that ca
2ce0: 75 73 65 64 20 74 68 65 20 63 6f 6e 66 6c 69 63  used the conflic
2cf0: 74 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 20  t was an INSERT 
2d00: 6f 72 20 55 50 44 41 54 45 2c 20 6f 72 20 74 6f  or UPDATE, or to
2d10: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 69   SQLITE_DELETE i
2d20: 66 0a 2a 2a 20 69 74 20 77 61 73 20 61 20 44 45  f.** it was a DE
2d30: 4c 45 54 45 2e 20 54 68 65 20 73 65 63 6f 6e 64  LETE. The second
2d40: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2d50: 20 30 78 30 31 20 69 66 20 74 68 65 20 63 6f 6e   0x01 if the con
2d60: 66 6c 69 63 74 20 0a 2a 2a 20 72 65 73 6f 6c 75  flict .** resolu
2d70: 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20 77 61  tion strategy wa
2d80: 73 20 52 45 50 4c 41 43 45 2c 20 6f 72 20 30 78  s REPLACE, or 0x
2d90: 30 30 20 69 66 20 69 74 20 77 61 73 20 4f 4d 49  00 if it was OMI
2da0: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  T..**.** If the 
2db0: 63 68 61 6e 67 65 20 74 68 61 74 20 63 61 75 73  change that caus
2dc0: 65 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ed the conflict 
2dd0: 77 61 73 20 61 20 44 45 4c 45 54 45 2c 20 74 68  was a DELETE, th
2de0: 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
2df0: 20 72 65 63 6f 72 64 20 69 73 20 61 20 63 6f 70   record is a cop
2e00: 79 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 72  y of the old.* r
2e10: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 6f  ecord from the o
2e20: 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65  riginal changese
2e30: 74 2e 20 49 66 20 69 74 0a 2a 2a 20 77 61 73 20  t. If it.** was 
2e40: 61 6e 20 49 4e 53 45 52 54 2c 20 74 68 65 6e 20  an INSERT, then 
2e50: 74 68 65 20 73 69 6e 67 6c 65 20 72 65 63 6f 72  the single recor
2e60: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
2e70: 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e  he new.* record.
2e80: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 66 6c   If.** the confl
2e90: 69 63 74 69 6e 67 20 63 68 61 6e 67 65 20 77 61  icting change wa
2ea0: 73 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68 65  s an UPDATE, the
2eb0: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 72 65 63  n the single rec
2ec0: 6f 72 64 20 69 73 20 61 20 63 6f 70 79 0a 2a 2a  ord is a copy.**
2ed0: 20 6f 66 20 74 68 65 20 6e 65 77 2e 2a 20 72 65   of the new.* re
2ee0: 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 50 4b  cord with the PK
2ef0: 20 66 69 65 6c 64 73 20 66 69 6c 6c 65 64 20 69   fields filled i
2f00: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6f  n based on the o
2f10: 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 6c 64 2e 2a  riginal.** old.*
2f20: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 0a 2f 2a 0a   record..*/../*.
2f30: 2a 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  ** For each row 
2f40: 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20  modified during 
2f50: 61 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 72 65  a session, there
2f60: 20 65 78 69 73 74 73 20 61 20 73 69 6e 67 6c 65   exists a single
2f70: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
2f80: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 73  this structure s
2f90: 74 6f 72 65 64 20 69 6e 20 61 20 53 65 73 73 69  tored in a Sessi
2fa0: 6f 6e 54 61 62 6c 65 2e 61 43 68 61 6e 67 65 5b  onTable.aChange[
2fb0: 5d 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f  ] hash table..*/
2fc0: 0a 73 74 72 75 63 74 20 53 65 73 73 69 6f 6e 43  .struct SessionC
2fd0: 68 61 6e 67 65 20 7b 0a 20 20 69 6e 74 20 6f 70  hange {.  int op
2fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3000: 20 6f 66 20 55 50 44 41 54 45 2c 20 44 45 4c 45   of UPDATE, DELE
3010: 54 45 2c 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20  TE, INSERT */.  
3020: 69 6e 74 20 62 49 6e 64 69 72 65 63 74 3b 20 20  int bIndirect;  
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
3050: 63 68 61 6e 67 65 20 69 73 20 22 69 6e 64 69 72  change is "indir
3060: 65 63 74 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ect" */.  int nR
3070: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
3080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3090: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
30a0: 62 75 66 66 65 72 20 61 52 65 63 6f 72 64 5b 5d  buffer aRecord[]
30b0: 20 2a 2f 0a 20 20 75 38 20 2a 61 52 65 63 6f 72   */.  u8 *aRecor
30c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
30d0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
30e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6c 64 2e 2a  containing old.*
30f0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 53 65 73   record */.  Ses
3100: 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 4e 65 78  sionChange *pNex
3110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
3120: 46 6f 72 20 68 61 73 68 2d 74 61 62 6c 65 20 63  For hash-table c
3130: 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a  ollisions */.};.
3140: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 76  ./*.** Write a v
3150: 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
3160: 20 69 56 61 6c 20 69 6e 74 6f 20 74 68 65 20 62   iVal into the b
3170: 75 66 66 65 72 20 61 74 20 61 42 75 66 2e 20 52  uffer at aBuf. R
3180: 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 6e 75  eturn the .** nu
3190: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
31a0: 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  itten..*/.static
31b0: 20 69 6e 74 20 73 65 73 73 69 6f 6e 56 61 72 69   int sessionVari
31c0: 6e 74 50 75 74 28 75 38 20 2a 61 42 75 66 2c 20  ntPut(u8 *aBuf, 
31d0: 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 72 65 74  int iVal){.  ret
31e0: 75 72 6e 20 70 75 74 56 61 72 69 6e 74 33 32 28  urn putVarint32(
31f0: 61 42 75 66 2c 20 69 56 61 6c 29 3b 0a 7d 0a 0a  aBuf, iVal);.}..
3200: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3210: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
3220: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
3230: 72 65 20 76 61 6c 75 65 20 69 56 61 6c 20 61 73  re value iVal as
3240: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2f 0a 73 74   a varint..*/.st
3250: 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
3260: 56 61 72 69 6e 74 4c 65 6e 28 69 6e 74 20 69 56  VarintLen(int iV
3270: 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  al){.  return sq
3280: 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 69  lite3VarintLen(i
3290: 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Val);.}../*.** R
32a0: 65 61 64 20 61 20 76 61 72 69 6e 74 20 76 61 6c  ead a varint val
32b0: 75 65 20 66 72 6f 6d 20 61 42 75 66 5b 5d 20 69  ue from aBuf[] i
32c0: 6e 74 6f 20 2a 70 69 56 61 6c 2e 20 52 65 74 75  nto *piVal. Retu
32d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
32e0: 20 0a 2a 2a 20 62 79 74 65 73 20 72 65 61 64 2e   .** bytes read.
32f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3300: 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28  essionVarintGet(
3310: 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  u8 *aBuf, int *p
3320: 69 56 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  iVal){.  return 
3330: 67 65 74 56 61 72 69 6e 74 33 32 28 61 42 75 66  getVarint32(aBuf
3340: 2c 20 2a 70 69 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a  , *piVal);.}../*
3350: 20 4c 6f 61 64 20 61 6e 20 75 6e 61 6c 69 67 6e   Load an unalign
3360: 65 64 20 61 6e 64 20 75 6e 73 69 67 6e 65 64 20  ed and unsigned 
3370: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 2a  32-bit integer *
3380: 2f 0a 23 64 65 66 69 6e 65 20 53 45 53 53 49 4f  /.#define SESSIO
3390: 4e 5f 55 49 4e 54 33 32 28 78 29 20 28 28 28 75  N_UINT32(x) (((u
33a0: 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
33b0: 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
33c0: 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
33d0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 36 34  ./*.** Read a 64
33e0: 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
33f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 72  integer value fr
3400: 6f 6d 20 62 75 66 66 65 72 20 61 52 65 63 5b 5d  om buffer aRec[]
3410: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  . Return.** the 
3420: 76 61 6c 75 65 20 72 65 61 64 2e 0a 2a 2f 0a 73  value read..*/.s
3430: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
3440: 74 36 34 20 73 65 73 73 69 6f 6e 47 65 74 49 36  t64 sessionGetI6
3450: 34 28 75 38 20 2a 61 52 65 63 29 7b 0a 20 20 75  4(u8 *aRec){.  u
3460: 36 34 20 78 20 3d 20 53 45 53 53 49 4f 4e 5f 55  64 x = SESSION_U
3470: 49 4e 54 33 32 28 61 52 65 63 29 3b 0a 20 20 75  INT32(aRec);.  u
3480: 33 32 20 79 20 3d 20 53 45 53 53 49 4f 4e 5f 55  32 y = SESSION_U
3490: 49 4e 54 33 32 28 61 52 65 63 2b 34 29 3b 0a 20  INT32(aRec+4);. 
34a0: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
34b0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
34c0: 74 65 33 5f 69 6e 74 36 34 29 78 3b 0a 7d 0a 0a  te3_int64)x;.}..
34d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36 34  /*.** Write a 64
34e0: 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
34f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 6f  integer value to
3500: 20 74 68 65 20 62 75 66 66 65 72 20 61 42 75 66   the buffer aBuf
3510: 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  []..*/.static vo
3520: 69 64 20 73 65 73 73 69 6f 6e 50 75 74 49 36 34  id sessionPutI64
3530: 28 75 38 20 2a 61 42 75 66 2c 20 73 71 6c 69 74  (u8 *aBuf, sqlit
3540: 65 33 5f 69 6e 74 36 34 20 69 29 7b 0a 20 20 61  e3_int64 i){.  a
3550: 42 75 66 5b 30 5d 20 3d 20 28 69 3e 3e 35 36 29  Buf[0] = (i>>56)
3560: 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
3570: 31 5d 20 3d 20 28 69 3e 3e 34 38 29 20 26 20 30  1] = (i>>48) & 0
3580: 78 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d  xFF;.  aBuf[2] =
3590: 20 28 69 3e 3e 34 30 29 20 26 20 30 78 46 46 3b   (i>>40) & 0xFF;
35a0: 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 3e  .  aBuf[3] = (i>
35b0: 3e 33 32 29 20 26 20 30 78 46 46 3b 0a 20 20 61  >32) & 0xFF;.  a
35c0: 42 75 66 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29  Buf[4] = (i>>24)
35d0: 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
35e0: 35 5d 20 3d 20 28 69 3e 3e 31 36 29 20 26 20 30  5] = (i>>16) & 0
35f0: 78 46 46 3b 0a 20 20 61 42 75 66 5b 36 5d 20 3d  xFF;.  aBuf[6] =
3600: 20 28 69 3e 3e 20 38 29 20 26 20 30 78 46 46 3b   (i>> 8) & 0xFF;
3610: 0a 20 20 61 42 75 66 5b 37 5d 20 3d 20 28 69 3e  .  aBuf[7] = (i>
3620: 3e 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a  > 0) & 0xFF;.}..
3630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3640: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
3650: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  erialize the con
3660: 74 65 6e 74 73 20 6f 66 20 76 61 6c 75 65 20 70  tents of value p
3670: 56 61 6c 75 65 20 28 73 65 65 0a 2a 2a 20 63 6f  Value (see.** co
3680: 6d 6d 65 6e 74 20 74 69 74 6c 65 64 20 22 52 45  mment titled "RE
3690: 43 4f 52 44 20 46 4f 52 4d 41 54 22 20 61 62 6f  CORD FORMAT" abo
36a0: 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ve)..**.** If it
36b0: 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
36c0: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 66 6f 72  e serialized for
36d0: 6d 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69  m of the value i
36e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 0a 2a 2a  s written to .**
36f0: 20 62 75 66 66 65 72 20 61 42 75 66 2e 20 2a 70   buffer aBuf. *p
3700: 6e 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  nWrite is set to
3710: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3720: 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 65 66  ytes written bef
3730: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
3740: 2e 20 4f 72 2c 20 69 66 20 61 42 75 66 20 69 73  . Or, if aBuf is
3750: 20 4e 55 4c 4c 2c 20 74 68 65 20 6f 6e 6c 79 20   NULL, the only 
3760: 74 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  thing this funct
3770: 69 6f 6e 20 64 6f 65 73 20 69 73 0a 2a 2a 20 73  ion does is.** s
3780: 65 74 20 2a 70 6e 57 72 69 74 65 2e 0a 2a 2a 0a  et *pnWrite..**.
3790: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
37a0: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
37b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
37c0: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
37d0: 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 69 74 68  r occurs.** with
37e0: 69 6e 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  in a call to sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3800: 29 20 28 6d 61 79 20 66 61 69 6c 20 69 66 20 74  ) (may fail if t
3810: 68 65 20 64 62 20 69 73 20 75 74 66 2d 31 36 29  he db is utf-16)
3820: 29 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  ) .** SQLITE_NOM
3830: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
3840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
3850: 73 73 69 6f 6e 53 65 72 69 61 6c 69 7a 65 56 61  ssionSerializeVa
3860: 6c 75 65 28 0a 20 20 75 38 20 2a 61 42 75 66 2c  lue(.  u8 *aBuf,
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
3890: 2d 4e 55 4c 4c 2c 20 77 72 69 74 65 20 73 65 72  -NULL, write ser
38a0: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 68 65  ialized value he
38b0: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
38c0: 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 2c 20 20  value *pValue,  
38d0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
38e0: 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 2a 2f   to serialize */
38f0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3900: 20 2a 70 6e 57 72 69 74 65 20 20 20 20 20 20 20   *pnWrite       
3910: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e     /* IN/OUT: In
3920: 63 72 65 6d 65 6e 74 20 62 79 20 62 79 74 65 73  crement by bytes
3930: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
3940: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 72 69   /* Size of seri
3970: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 69 6e 20  alized value in 
3980: 62 79 74 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  bytes */..  if( 
3990: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  pValue ){.    in
39a0: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
39c0: 61 6c 75 65 20 74 79 70 65 20 28 53 51 4c 49 54  alue type (SQLIT
39d0: 45 5f 4e 55 4c 4c 2c 20 54 45 58 54 20 65 74 63  E_NULL, TEXT etc
39e0: 2e 29 20 2a 2f 0a 20 20 0a 20 20 20 20 65 54 79  .) */.  .    eTy
39f0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
3a00: 75 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29 3b  ue_type(pValue);
3a10: 0a 20 20 20 20 69 66 28 20 61 42 75 66 20 29 20  .    if( aBuf ) 
3a20: 61 42 75 66 5b 30 5d 20 3d 20 65 54 79 70 65 3b  aBuf[0] = eType;
3a30: 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68 28 20  .  .    switch( 
3a40: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
3a50: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
3a60: 20 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20   .        nByte 
3a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3a80: 61 6b 3b 0a 20 20 0a 20 20 20 20 20 20 63 61 73  ak;.  .      cas
3a90: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
3aa0: 3a 20 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  : .      case SQ
3ab0: 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
3ac0: 20 20 20 20 69 66 28 20 61 42 75 66 20 29 7b 0a      if( aBuf ){.
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44            /* TOD
3ae0: 4f 3a 20 53 51 4c 69 74 65 20 64 6f 65 73 20 73  O: SQLite does s
3af0: 6f 6d 65 74 68 69 6e 67 20 73 70 65 63 69 61 6c  omething special
3b00: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6d 69   to deal with mi
3b10: 78 65 64 2d 65 6e 64 69 61 6e 0a 20 20 20 20 20  xed-endian.     
3b20: 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
3b30: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 28 65   point values (e
3b40: 2e 67 2e 20 41 52 4d 37 29 2e 20 54 68 69 73 20  .g. ARM7). This 
3b50: 63 6f 64 65 20 70 72 6f 62 61 62 6c 79 20 73 68  code probably sh
3b60: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
3b70: 2a 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20  * too.  */.     
3b80: 20 20 20 20 20 75 36 34 20 69 3b 0a 20 20 20 20       u64 i;.    
3b90: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
3ba0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
3bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
3bc0: 20 3d 20 28 75 36 34 29 73 71 6c 69 74 65 33 5f   = (u64)sqlite3_
3bd0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
3be0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ue);.          }
3bf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3c00: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
3c10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3c20: 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d  sizeof(double)==
3c30: 38 20 26 26 20 73 69 7a 65 6f 66 28 75 36 34 29  8 && sizeof(u64)
3c40: 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==8 );.         
3c50: 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76     r = sqlite3_v
3c60: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
3c70: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
3c80: 20 6d 65 6d 63 70 79 28 26 69 2c 20 26 72 2c 20   memcpy(&i, &r, 
3c90: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  8);.          }.
3ca0: 20 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f            sessio
3cb0: 6e 50 75 74 49 36 34 28 26 61 42 75 66 5b 31 5d  nPutI64(&aBuf[1]
3cc0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , i);.        }.
3cd0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
3ce0: 39 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61  9; .        brea
3cf0: 6b 3b 0a 20 20 0a 20 20 20 20 20 20 64 65 66 61  k;.  .      defa
3d00: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 75  ult: {.        u
3d10: 38 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  8 *z;.        in
3d20: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t n;.        int
3d30: 20 6e 56 61 72 69 6e 74 3b 0a 20 20 0a 20 20 20   nVarint;.  .   
3d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
3d50: 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
3d60: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
3d70: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20  _BLOB );.       
3d80: 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
3d90: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
3da0: 20 20 20 20 20 7a 20 3d 20 28 75 38 20 2a 29 73       z = (u8 *)s
3db0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3dc0: 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  t(pValue);.     
3dd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3de0: 20 20 20 20 7a 20 3d 20 28 75 38 20 2a 29 73 71      z = (u8 *)sq
3df0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3e00: 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (pValue);.      
3e10: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
3e20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
3e30: 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  tes(pValue);.   
3e40: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26       if( z==0 &&
3e50: 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
3e60: 42 4c 4f 42 20 7c 7c 20 6e 3e 30 29 20 29 20 72  BLOB || n>0) ) r
3e70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3e80: 45 4d 3b 0a 20 20 20 20 20 20 20 20 6e 56 61 72  EM;.        nVar
3e90: 69 6e 74 20 3d 20 73 65 73 73 69 6f 6e 56 61 72  int = sessionVar
3ea0: 69 6e 74 4c 65 6e 28 6e 29 3b 0a 20 20 0a 20 20  intLen(n);.  .  
3eb0: 20 20 20 20 20 20 69 66 28 20 61 42 75 66 20 29        if( aBuf )
3ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 73 73  {.          sess
3ed0: 69 6f 6e 56 61 72 69 6e 74 50 75 74 28 26 61 42  ionVarintPut(&aB
3ee0: 75 66 5b 31 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  uf[1], n);.     
3ef0: 20 20 20 20 20 69 66 28 20 6e 20 29 20 6d 65 6d       if( n ) mem
3f00: 63 70 79 28 26 61 42 75 66 5b 6e 56 61 72 69 6e  cpy(&aBuf[nVarin
3f10: 74 20 2b 20 31 5d 2c 20 7a 2c 20 6e 29 3b 0a 20  t + 1], z, n);. 
3f20: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
3f30: 20 20 20 20 6e 42 79 74 65 20 3d 20 31 20 2b 20      nByte = 1 + 
3f40: 6e 56 61 72 69 6e 74 20 2b 20 6e 3b 0a 20 20 20  nVarint + n;.   
3f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
3f70: 65 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 31  e{.    nByte = 1
3f80: 3b 0a 20 20 20 20 69 66 28 20 61 42 75 66 20 29  ;.    if( aBuf )
3f90: 20 61 42 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b   aBuf[0] = '\0';
3fa0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 6e 57 72  .  }..  if( pnWr
3fb0: 69 74 65 20 29 20 2a 70 6e 57 72 69 74 65 20 2b  ite ) *pnWrite +
3fc0: 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72  = nByte;.  retur
3fd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3fe0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
3ff0: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 6c  o is used to cal
4000: 63 75 6c 61 74 65 20 68 61 73 68 20 6b 65 79 20  culate hash key 
4010: 76 61 6c 75 65 73 20 66 6f 72 20 64 61 74 61 20  values for data 
4020: 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 0a 2a  structures. In.*
4030: 2a 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 74  * order to use t
4040: 68 69 73 20 6d 61 63 72 6f 2c 20 74 68 65 20 65  his macro, the e
4050: 6e 74 69 72 65 20 64 61 74 61 20 73 74 72 75 63  ntire data struc
4060: 74 75 72 65 20 6d 75 73 74 20 62 65 20 72 65 70  ture must be rep
4070: 72 65 73 65 6e 74 65 64 0a 2a 2a 20 61 73 20 61  resented.** as a
4080: 20 73 65 72 69 65 73 20 6f 66 20 75 6e 73 69 67   series of unsig
4090: 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 20 49 6e  ned integers. In
40a0: 20 6f 72 64 65 72 20 74 6f 20 63 61 6c 63 75 6c   order to calcul
40b0: 61 74 65 20 61 20 68 61 73 68 2d 6b 65 79 20 76  ate a hash-key v
40c0: 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 61 20 64 61  alue.** for a da
40d0: 74 61 20 73 74 72 75 63 74 75 72 65 20 72 65 70  ta structure rep
40e0: 72 65 73 65 6e 74 65 64 20 61 73 20 74 68 72 65  resented as thre
40f0: 65 20 73 75 63 68 20 69 6e 74 65 67 65 72 73 2c  e such integers,
4100: 20 74 68 65 20 6d 61 63 72 6f 20 6d 61 79 0a 2a   the macro may.*
4110: 2a 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  * then be used a
4120: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4130: 20 20 20 20 69 6e 74 20 68 61 73 68 5f 6b 65 79      int hash_key
4140: 5f 76 61 6c 75 65 3b 0a 2a 2a 20 20 20 20 68 61  _value;.**    ha
4150: 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d 20 48  sh_key_value = H
4160: 41 53 48 5f 41 50 50 45 4e 44 28 30 2c 20 3c 76  ASH_APPEND(0, <v
4170: 61 6c 75 65 20 31 3e 29 3b 0a 2a 2a 20 20 20 20  alue 1>);.**    
4180: 68 61 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d  hash_key_value =
4190: 20 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73   HASH_APPEND(has
41a0: 68 5f 6b 65 79 5f 76 61 6c 75 65 2c 20 3c 76 61  h_key_value, <va
41b0: 6c 75 65 20 32 3e 29 3b 0a 2a 2a 20 20 20 20 68  lue 2>);.**    h
41c0: 61 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d 20  ash_key_value = 
41d0: 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73 68  HASH_APPEND(hash
41e0: 5f 6b 65 79 5f 76 61 6c 75 65 2c 20 3c 76 61 6c  _key_value, <val
41f0: 75 65 20 33 3e 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  ue 3>);.**.** In
4200: 20 70 72 61 63 74 69 63 65 2c 20 74 68 65 20 64   practice, the d
4210: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
4220: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
4230: 64 20 66 6f 72 20 61 72 65 20 74 68 65 20 70 72  d for are the pr
4240: 69 6d 61 72 79 0a 2a 2a 20 6b 65 79 20 76 61 6c  imary.** key val
4250: 75 65 73 20 6f 66 20 6d 6f 64 69 66 69 65 64 20  ues of modified 
4260: 72 6f 77 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rows..*/.#define
4270: 20 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73   HASH_APPEND(has
4280: 68 2c 20 61 64 64 29 20 28 28 68 61 73 68 29 20  h, add) ((hash) 
4290: 3c 3c 20 33 29 20 5e 20 28 68 61 73 68 29 20 5e  << 3) ^ (hash) ^
42a0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28   (unsigned int)(
42b0: 61 64 64 29 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  add)../*.** Appe
42c0: 6e 64 20 74 68 65 20 68 61 73 68 20 6f 66 20 74  nd the hash of t
42d0: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
42e0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
42f0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4300: 74 6f 20 74 68 65 0a 2a 2a 20 68 61 73 68 2d 6b  to the.** hash-k
4310: 65 79 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ey value passed 
4320: 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 52 65  as the first. Re
4330: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 68 61 73  turn the new has
4340: 68 2d 6b 65 79 20 76 61 6c 75 65 2e 0a 2a 2f 0a  h-key value..*/.
4350: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
4360: 69 6e 74 20 73 65 73 73 69 6f 6e 48 61 73 68 41  int sessionHashA
4370: 70 70 65 6e 64 49 36 34 28 75 6e 73 69 67 6e 65  ppendI64(unsigne
4380: 64 20 69 6e 74 20 68 2c 20 69 36 34 20 69 29 7b  d int h, i64 i){
4390: 0a 20 20 68 20 3d 20 48 41 53 48 5f 41 50 50 45  .  h = HASH_APPE
43a0: 4e 44 28 68 2c 20 69 20 26 20 30 78 46 46 46 46  ND(h, i & 0xFFFF
43b0: 46 46 46 46 29 3b 0a 20 20 72 65 74 75 72 6e 20  FFFF);.  return 
43c0: 48 41 53 48 5f 41 50 50 45 4e 44 28 68 2c 20 28  HASH_APPEND(h, (
43d0: 69 3e 3e 33 32 29 26 30 78 46 46 46 46 46 46 46  i>>32)&0xFFFFFFF
43e0: 46 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  F);.}../*.** App
43f0: 65 6e 64 20 74 68 65 20 68 61 73 68 20 6f 66 20  end the hash of 
4400: 74 68 65 20 62 6c 6f 62 20 70 61 73 73 65 64 20  the blob passed 
4410: 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
4420: 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
4430: 74 73 20 74 6f 20 0a 2a 2a 20 74 68 65 20 68 61  ts to .** the ha
4440: 73 68 2d 6b 65 79 20 76 61 6c 75 65 20 70 61 73  sh-key value pas
4450: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
4460: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77  . Return the new
4470: 20 68 61 73 68 2d 6b 65 79 20 76 61 6c 75 65 2e   hash-key value.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
4490: 6e 65 64 20 69 6e 74 20 73 65 73 73 69 6f 6e 48  ned int sessionH
44a0: 61 73 68 41 70 70 65 6e 64 42 6c 6f 62 28 75 6e  ashAppendBlob(un
44b0: 73 69 67 6e 65 64 20 69 6e 74 20 68 2c 20 69 6e  signed int h, in
44c0: 74 20 6e 2c 20 63 6f 6e 73 74 20 75 38 20 2a 7a  t n, const u8 *z
44d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
44e0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
44f0: 20 68 20 3d 20 48 41 53 48 5f 41 50 50 45 4e 44   h = HASH_APPEND
4500: 28 68 2c 20 7a 5b 69 5d 29 3b 0a 20 20 72 65 74  (h, z[i]);.  ret
4510: 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn h;.}../*.** 
4520: 41 70 70 65 6e 64 20 74 68 65 20 68 61 73 68 20  Append the hash 
4530: 6f 66 20 74 68 65 20 64 61 74 61 20 74 79 70 65  of the data type
4540: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
4550: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
4560: 6f 20 74 68 65 0a 2a 2a 20 68 61 73 68 2d 6b 65  o the.** hash-ke
4570: 79 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  y value passed a
4580: 73 20 74 68 65 20 66 69 72 73 74 2e 20 52 65 74  s the first. Ret
4590: 75 72 6e 20 74 68 65 20 6e 65 77 20 68 61 73 68  urn the new hash
45a0: 2d 6b 65 79 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  -key value..*/.s
45b0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
45c0: 6e 74 20 73 65 73 73 69 6f 6e 48 61 73 68 41 70  nt sessionHashAp
45d0: 70 65 6e 64 54 79 70 65 28 75 6e 73 69 67 6e 65  pendType(unsigne
45e0: 64 20 69 6e 74 20 68 2c 20 69 6e 74 20 65 54 79  d int h, int eTy
45f0: 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 48 41  pe){.  return HA
4600: 53 48 5f 41 50 50 45 4e 44 28 68 2c 20 65 54 79  SH_APPEND(h, eTy
4610: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
4620: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
4630: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
4640: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 70 72 65  rom within a pre
4650: 2d 75 70 64 61 74 65 20 63 61 6c 6c 62 61 63 6b  -update callback
4660: 2e 0a 2a 2a 20 49 74 20 63 61 6c 63 75 6c 61 74  ..** It calculat
4670: 65 73 20 61 20 68 61 73 68 20 62 61 73 65 64 20  es a hash based 
4680: 6f 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  on the primary k
4690: 65 79 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ey values of the
46a0: 20 6f 6c 64 2e 2a 20 6f 72 20 0a 2a 2a 20 6e 65   old.* or .** ne
46b0: 77 2e 2a 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  w.* row currentl
46c0: 79 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 2c  y available and,
46d0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
46e0: 6f 72 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65  or occurs, write
46f0: 73 20 69 74 20 74 6f 0a 2a 2a 20 2a 70 69 48 61  s it to.** *piHa
4700: 73 68 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  sh before return
4710: 69 6e 67 2e 20 49 66 20 74 68 65 20 70 72 69 6d  ing. If the prim
4720: 61 72 79 20 6b 65 79 20 63 6f 6e 74 61 69 6e 73  ary key contains
4730: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
4740: 4c 0a 2a 2a 20 76 61 6c 75 65 73 2c 20 2a 70 62  L.** values, *pb
4750: 4e 75 6c 6c 50 4b 20 69 73 20 73 65 74 20 74 6f  NullPK is set to
4760: 20 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74   true before ret
4770: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
4780: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4790: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
47a0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
47b0: 65 64 20 61 6e 64 20 74 68 65 20 66 69 6e 61 6c  ed and the final
47c0: 20 76 61 6c 75 65 73 0a 2a 2a 20 6f 66 20 2a 70   values.** of *p
47d0: 69 48 61 73 68 20 61 73 6e 20 2a 70 62 4e 75 6c  iHash asn *pbNul
47e0: 6c 50 4b 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lPK are undefine
47f0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
4800: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4810: 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6f  ned.** and the o
4820: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
4830: 61 72 65 20 73 65 74 20 61 73 20 64 65 73 63 72  are set as descr
4840: 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
4850: 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
4860: 6e 50 72 65 75 70 64 61 74 65 48 61 73 68 28 0a  nPreupdateHash(.
4870: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
4880: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
4890: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
48a0: 65 63 74 20 74 68 61 74 20 6f 77 6e 73 20 70 54  ect that owns pT
48b0: 61 62 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54  ab */.  SessionT
48c0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
48d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69          /* Sessi
48e0: 6f 6e 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  on table handle 
48f0: 2a 2f 0a 20 20 69 6e 74 20 62 4e 65 77 2c 20 20  */.  int bNew,  
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
4920: 68 61 73 68 20 74 68 65 20 6e 65 77 2e 2a 20 50  hash the new.* P
4930: 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 61  K */.  int *piHa
4940: 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sh,             
4950: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48         /* OUT: H
4960: 61 73 68 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ash value */.  i
4970: 6e 74 20 2a 70 62 4e 75 6c 6c 50 4b 20 20 20 20  nt *pbNullPK    
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4990: 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 74  * OUT: True if t
49a0: 68 65 72 65 20 61 72 65 20 4e 55 4c 4c 20 76 61  here are NULL va
49b0: 6c 75 65 73 20 69 6e 20 50 4b 20 2a 2f 0a 29 7b  lues in PK */.){
49c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
49d0: 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  h = 0;          
49e0: 20 20 20 2f 2a 20 48 61 73 68 20 76 61 6c 75 65     /* Hash value
49f0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
4a00: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
4a30: 74 65 20 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d  te through colum
4a40: 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
4a50: 20 2a 70 62 4e 75 6c 6c 50 4b 3d 3d 30 20 29 3b   *pbNullPK==0 );
4a60: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
4a70: 3e 6e 43 6f 6c 3d 3d 70 53 65 73 73 69 6f 6e 2d  >nCol==pSession-
4a80: 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74 28 70 53 65  >hook.xCount(pSe
4a90: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78  ssion->hook.pCtx
4aa0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
4ab0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
4ac0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
4ad0: 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20  ->abPK[i] ){.   
4ae0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
4af0: 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
4b00: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4b10: 2a 70 56 61 6c 3b 0a 0a 20 20 20 20 20 20 69 66  *pVal;..      if
4b20: 28 20 62 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( bNew ){.      
4b30: 20 20 72 63 20 3d 20 70 53 65 73 73 69 6f 6e 2d    rc = pSession-
4b40: 3e 68 6f 6f 6b 2e 78 4e 65 77 28 70 53 65 73 73  >hook.xNew(pSess
4b50: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20  ion->hook.pCtx, 
4b60: 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  i, &pVal);.     
4b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4b80: 72 63 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 68  rc = pSession->h
4b90: 6f 6f 6b 2e 78 4f 6c 64 28 70 53 65 73 73 69 6f  ook.xOld(pSessio
4ba0: 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 2c  n->hook.pCtx, i,
4bb0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d   &pVal);.      }
4bc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
4bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4be0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 65 54 79  n rc;..      eTy
4bf0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
4c00: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ue_type(pVal);. 
4c10: 20 20 20 20 20 68 20 3d 20 73 65 73 73 69 6f 6e       h = session
4c20: 48 61 73 68 41 70 70 65 6e 64 54 79 70 65 28 68  HashAppendType(h
4c30: 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , eType);.      
4c40: 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
4c50: 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54 79  E_INTEGER || eTy
4c60: 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
4c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
4c80: 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  iVal;.        if
4c90: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
4ca0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
4cb0: 20 20 20 20 20 69 56 61 6c 20 3d 20 73 71 6c 69       iVal = sqli
4cc0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
4cd0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pVal);.        }
4ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4cf0: 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71  double rVal = sq
4d00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
4d10: 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  le(pVal);.      
4d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
4d30: 6f 66 28 69 56 61 6c 29 3d 3d 38 20 26 26 20 73  of(iVal)==8 && s
4d40: 69 7a 65 6f 66 28 72 56 61 6c 29 3d 3d 38 20 29  izeof(rVal)==8 )
4d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
4d60: 70 79 28 26 69 56 61 6c 2c 20 26 72 56 61 6c 2c  py(&iVal, &rVal,
4d70: 20 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   8);.        }. 
4d80: 20 20 20 20 20 20 20 68 20 3d 20 73 65 73 73 69         h = sessi
4d90: 6f 6e 48 61 73 68 41 70 70 65 6e 64 49 36 34 28  onHashAppendI64(
4da0: 68 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  h, iVal);.      
4db0: 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
4dc0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
4dd0: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
4de0: 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  OB ){.        co
4df0: 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
4e00: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
4e10: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
4e20: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
4e30: 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
4e40: 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
4e50: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
4e60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4e70: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f           z = (co
4e80: 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
4e90: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
4ea0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4eb0: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
4ec0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
4ed0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
4ee0: 21 7a 20 26 26 20 28 65 54 79 70 65 21 3d 53 51  !z && (eType!=SQ
4ef0: 4c 49 54 45 5f 42 4c 4f 42 20 7c 7c 20 6e 3e 30  LITE_BLOB || n>0
4f00: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
4f10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
4f20: 20 68 20 3d 20 73 65 73 73 69 6f 6e 48 61 73 68   h = sessionHash
4f30: 41 70 70 65 6e 64 42 6c 6f 62 28 68 2c 20 6e 2c  AppendBlob(h, n,
4f40: 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
4f50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4f60: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
4f70: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
4f80: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 62 53  assert( pTab->bS
4f90: 74 61 74 31 3d 3d 30 20 7c 7c 20 69 21 3d 31 20  tat1==0 || i!=1 
4fa0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 75  );.        *pbNu
4fb0: 6c 6c 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20  llPK = 1;.      
4fc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
4fd0: 70 69 48 61 73 68 20 3d 20 28 68 20 25 20 70 54  piHash = (h % pT
4fe0: 61 62 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20  ab->nChange);.  
4ff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62  ;.}../*.** The b
5010: 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20 61  uffer that the a
5020: 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74  rgument points t
5030: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 72  o contains a ser
5040: 69 61 6c 69 7a 65 64 20 53 51 4c 20 76 61 6c 75  ialized SQL valu
5050: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
5060: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5070: 20 6f 66 20 73 70 61 63 65 20 6f 63 63 75 70 69   of space occupi
5080: 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  ed by the value 
5090: 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68  (including.** th
50a0: 65 20 74 79 70 65 20 62 79 74 65 29 2e 0a 2a 2f  e type byte)..*/
50b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
50c0: 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 75 38 20  ionSerialLen(u8 
50d0: 2a 61 29 7b 0a 20 20 69 6e 74 20 65 20 3d 20 2a  *a){.  int e = *
50e0: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66  a;.  int n;.  if
50f0: 28 20 65 3d 3d 30 20 7c 7c 20 65 3d 3d 30 78 46  ( e==0 || e==0xF
5100: 46 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  F ) return 1;.  
5110: 69 66 28 20 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  if( e==SQLITE_NU
5120: 4c 4c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  LL ) return 1;. 
5130: 20 69 66 28 20 65 3d 3d 53 51 4c 49 54 45 5f 49   if( e==SQLITE_I
5140: 4e 54 45 47 45 52 20 7c 7c 20 65 3d 3d 53 51 4c  NTEGER || e==SQL
5150: 49 54 45 5f 46 4c 4f 41 54 20 29 20 72 65 74 75  ITE_FLOAT ) retu
5160: 72 6e 20 39 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 9;.  return s
5170: 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28  essionVarintGet(
5180: 26 61 5b 31 5d 2c 20 26 6e 29 20 2b 20 31 20 2b  &a[1], &n) + 1 +
5190: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 73   n;.}../*.** Bas
51a0: 65 64 20 6f 6e 20 74 68 65 20 70 72 69 6d 61 72  ed on the primar
51b0: 79 20 6b 65 79 20 76 61 6c 75 65 73 20 73 74 6f  y key values sto
51c0: 72 65 64 20 69 6e 20 63 68 61 6e 67 65 20 61 52  red in change aR
51d0: 65 63 6f 72 64 2c 20 63 61 6c 63 75 6c 61 74 65  ecord, calculate
51e0: 20 61 0a 2a 2a 20 68 61 73 68 20 6b 65 79 2e 20   a.** hash key. 
51f0: 41 73 73 75 6d 65 20 74 68 65 20 68 61 73 20 74  Assume the has t
5200: 61 62 6c 65 20 68 61 73 20 6e 42 75 63 6b 65 74  able has nBucket
5210: 20 62 75 63 6b 65 74 73 2e 20 54 68 65 20 68 61   buckets. The ha
5220: 73 68 20 6b 65 79 73 0a 2a 2a 20 63 61 6c 63 75  sh keys.** calcu
5230: 6c 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  lated by this fu
5240: 6e 63 74 69 6f 6e 20 61 72 65 20 63 6f 6d 70 61  nction are compa
5250: 74 69 62 6c 65 20 77 69 74 68 20 74 68 6f 73 65  tible with those
5260: 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 0a 2a   calculated by.*
5270: 2a 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61  * sessionPreupda
5280: 74 65 48 61 73 68 28 29 2e 0a 2a 2a 0a 2a 2a 20  teHash()..**.** 
5290: 54 68 65 20 62 50 6b 4f 6e 6c 79 20 61 72 67 75  The bPkOnly argu
52a0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
52b0: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 61   if the record a
52c0: 74 20 61 52 65 63 6f 72 64 5b 5d 20 69 73 20 66  t aRecord[] is f
52d0: 72 6f 6d 0a 2a 2a 20 61 20 70 61 74 63 68 73 65  rom.** a patchse
52e0: 74 20 44 45 4c 45 54 45 2e 20 49 6e 20 74 68 69  t DELETE. In thi
52f0: 73 20 63 61 73 65 20 74 68 65 20 6e 6f 6e 2d 50  s case the non-P
5300: 4b 20 66 69 65 6c 64 73 20 61 72 65 20 6f 6d 69  K fields are omi
5310: 74 74 65 64 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  tted entirely..*
5320: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
5330: 64 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  d int sessionCha
5340: 6e 67 65 48 61 73 68 28 0a 20 20 53 65 73 73 69  ngeHash(.  Sessi
5350: 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20  onTable *pTab,  
5360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
5370: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
5380: 69 6e 74 20 62 50 6b 4f 6e 6c 79 2c 20 20 20 20  int bPkOnly,    
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 52 65 63 6f 72 64 20 63 6f 6e 73 69 73  /* Record consis
53b0: 74 73 20 6f 66 20 50 4b 20 66 69 65 6c 64 73 20  ts of PK fields 
53c0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 2a 61 52  only */.  u8 *aR
53d0: 65 63 6f 72 64 2c 20 20 20 20 20 20 20 20 20 20  ecord,          
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
53f0: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  nge record */.  
5400: 69 6e 74 20 6e 42 75 63 6b 65 74 20 20 20 20 20  int nBucket     
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 2f 2a 20 41 73 73 75 6d 65 20 74 68 69 73 20 6d  /* Assume this m
5430: 61 6e 79 20 62 75 63 6b 65 74 73 20 69 6e 20 68  any buckets in h
5440: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ash table */.){.
5450: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 68    unsigned int h
5460: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5470: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
5480: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  turn */.  int i;
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
54b0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
54c0: 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ough columns */.
54d0: 20 20 75 38 20 2a 61 20 3d 20 61 52 65 63 6f 72    u8 *a = aRecor
54e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
54f0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
5500: 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68 61  rate through cha
5510: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  nge record */.. 
5520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
5530: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
5540: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a 61    int eType = *a
5550: 3b 0a 20 20 20 20 69 6e 74 20 69 73 50 4b 20 3d  ;.    int isPK =
5560: 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 3b 0a   pTab->abPK[i];.
5570: 20 20 20 20 69 66 28 20 62 50 6b 4f 6e 6c 79 20      if( bPkOnly 
5580: 26 26 20 69 73 50 4b 3d 3d 30 20 29 20 63 6f 6e  && isPK==0 ) con
5590: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
55a0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
55b0: 65 20 66 6f 72 20 65 54 79 70 65 20 74 6f 20 62  e for eType to b
55c0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 68 65  e SQLITE_NULL he
55d0: 72 65 2e 20 54 68 65 20 73 65 73 73 69 6f 6e 20  re. The session 
55e0: 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 64  .    ** module d
55f0: 6f 65 73 20 6e 6f 74 20 72 65 63 6f 72 64 20 63  oes not record c
5600: 68 61 6e 67 65 73 20 66 6f 72 20 72 6f 77 73 20  hanges for rows 
5610: 77 69 74 68 20 4e 55 4c 4c 20 76 61 6c 75 65 73  with NULL values
5620: 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 2a   stored in.    *
5630: 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  * primary key co
5640: 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 61 73  lumns. */.    as
5650: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
5660: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65  ITE_INTEGER || e
5670: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
5680: 41 54 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  AT .         || 
5690: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
56a0: 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  XT || eType==SQL
56b0: 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  ITE_BLOB .      
56c0: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
56d0: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 54 79 70  ITE_NULL || eTyp
56e0: 65 3d 3d 30 20 0a 20 20 20 20 29 3b 0a 20 20 20  e==0 .    );.   
56f0: 20 61 73 73 65 72 74 28 20 21 69 73 50 4b 20 7c   assert( !isPK |
5700: 7c 20 28 65 54 79 70 65 21 3d 30 20 26 26 20 65  | (eType!=0 && e
5710: 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type!=SQLITE_NUL
5720: 4c 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  L) );..    if( i
5730: 73 50 4b 20 29 7b 0a 20 20 20 20 20 20 61 2b 2b  sPK ){.      a++
5740: 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 65 73 73  ;.      h = sess
5750: 69 6f 6e 48 61 73 68 41 70 70 65 6e 64 54 79 70  ionHashAppendTyp
5760: 65 28 68 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  e(h, eType);.   
5770: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
5780: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20  LITE_INTEGER || 
5790: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
57a0: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 68  OAT ){.        h
57b0: 20 3d 20 73 65 73 73 69 6f 6e 48 61 73 68 41 70   = sessionHashAp
57c0: 70 65 6e 64 49 36 34 28 68 2c 20 73 65 73 73 69  pendI64(h, sessi
57d0: 6f 6e 47 65 74 49 36 34 28 61 29 29 3b 0a 20 20  onGetI64(a));.  
57e0: 20 20 20 20 20 20 61 20 2b 3d 20 38 3b 0a 20 20        a += 8;.  
57f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5800: 20 20 20 69 6e 74 20 6e 3b 20 0a 20 20 20 20 20     int n; .     
5810: 20 20 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 56     a += sessionV
5820: 61 72 69 6e 74 47 65 74 28 61 2c 20 26 6e 29 3b  arintGet(a, &n);
5830: 0a 20 20 20 20 20 20 20 20 68 20 3d 20 73 65 73  .        h = ses
5840: 73 69 6f 6e 48 61 73 68 41 70 70 65 6e 64 42 6c  sionHashAppendBl
5850: 6f 62 28 68 2c 20 6e 2c 20 61 29 3b 0a 20 20 20  ob(h, n, a);.   
5860: 20 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20       a += n;.   
5870: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5880: 20 20 20 20 20 20 61 20 2b 3d 20 73 65 73 73 69        a += sessi
5890: 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 29 3b 0a  onSerialLen(a);.
58a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
58b0: 72 6e 20 28 68 20 25 20 6e 42 75 63 6b 65 74 29  rn (h % nBucket)
58c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
58d0: 65 6e 74 73 20 61 4c 65 66 74 20 61 6e 64 20 61  ents aLeft and a
58e0: 52 69 67 68 74 20 61 72 65 20 70 6f 69 6e 74 65  Right are pointe
58f0: 72 73 20 74 6f 20 63 68 61 6e 67 65 20 72 65 63  rs to change rec
5900: 6f 72 64 73 20 66 6f 72 20 74 61 62 6c 65 20 70  ords for table p
5910: 54 61 62 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  Tab..** This fun
5920: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
5930: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 72 65  ue if the two re
5940: 63 6f 72 64 73 20 61 70 70 6c 79 20 74 6f 20 74  cords apply to t
5950: 68 65 20 73 61 6d 65 20 72 6f 77 20 28 69 2e 65  he same row (i.e
5960: 2e 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  ..** have the sa
5970: 6d 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  me values stored
5980: 20 69 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20   in the primary 
5990: 6b 65 79 20 63 6f 6c 75 6d 6e 73 29 2c 20 6f 72  key columns), or
59a0: 20 66 61 6c 73 65 20 0a 2a 2a 20 6f 74 68 65 72   false .** other
59b0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
59c0: 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  int sessionChang
59d0: 65 45 71 75 61 6c 28 0a 20 20 53 65 73 73 69 6f  eEqual(.  Sessio
59e0: 6e 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  nTable *pTab,   
59f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
5a00: 6c 65 20 75 73 65 64 20 66 6f 72 20 50 4b 20 64  le used for PK d
5a10: 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  efinition */.  i
5a20: 6e 74 20 62 4c 65 66 74 50 6b 4f 6e 6c 79 2c 20  nt bLeftPkOnly, 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a40: 2a 20 54 72 75 65 20 69 66 20 61 4c 65 66 74 5b  * True if aLeft[
5a50: 5d 20 63 6f 6e 74 61 69 6e 73 20 50 4b 20 66 69  ] contains PK fi
5a60: 65 6c 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75  elds only */.  u
5a70: 38 20 2a 61 4c 65 66 74 2c 20 20 20 20 20 20 20  8 *aLeft,       
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a90: 2a 20 43 68 61 6e 67 65 20 72 65 63 6f 72 64 20  * Change record 
5aa0: 2a 2f 0a 20 20 69 6e 74 20 62 52 69 67 68 74 50  */.  int bRightP
5ab0: 6b 4f 6e 6c 79 2c 20 20 20 20 20 20 20 20 20 20  kOnly,          
5ac0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5ad0: 61 52 69 67 68 74 5b 5d 20 63 6f 6e 74 61 69 6e  aRight[] contain
5ae0: 73 20 50 4b 20 66 69 65 6c 64 73 20 6f 6e 6c 79  s PK fields only
5af0: 20 2a 2f 0a 20 20 75 38 20 2a 61 52 69 67 68 74   */.  u8 *aRight
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
5b20: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 75  record */.){.  u
5b30: 38 20 2a 61 31 20 3d 20 61 4c 65 66 74 3b 20 20  8 *a1 = aLeft;  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b50: 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72  * Cursor to iter
5b60: 61 74 65 20 74 68 72 6f 75 67 68 20 61 4c 65 66  ate through aLef
5b70: 74 20 2a 2f 0a 20 20 75 38 20 2a 61 32 20 3d 20  t */.  u8 *a2 = 
5b80: 61 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  aRight;         
5b90: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
5ba0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
5bb0: 75 67 68 20 61 52 69 67 68 74 20 2a 2f 0a 20 20  ugh aRight */.  
5bc0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
5bf0: 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
5c00: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 66   columns */..  f
5c10: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
5c20: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
5c30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
5c40: 62 2d 3e 61 62 50 4b 5b 69 43 6f 6c 5d 20 29 7b  b->abPK[iCol] ){
5c50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 31 20 3d 20  .      int n1 = 
5c60: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
5c70: 28 61 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (a1);.      int 
5c80: 6e 32 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69  n2 = sessionSeri
5c90: 61 6c 4c 65 6e 28 61 32 29 3b 0a 0a 20 20 20 20  alLen(a2);..    
5ca0: 20 20 69 66 28 20 6e 31 21 3d 6e 32 20 7c 7c 20    if( n1!=n2 || 
5cb0: 6d 65 6d 63 6d 70 28 61 31 2c 20 61 32 2c 20 6e  memcmp(a1, a2, n
5cc0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  1) ){.        re
5cd0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
5ce0: 20 20 20 20 20 20 61 31 20 2b 3d 20 6e 31 3b 0a        a1 += n1;.
5cf0: 20 20 20 20 20 20 61 32 20 2b 3d 20 6e 32 3b 0a        a2 += n2;.
5d00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d10: 20 69 66 28 20 62 4c 65 66 74 50 6b 4f 6e 6c 79   if( bLeftPkOnly
5d20: 3d 3d 30 20 29 20 61 31 20 2b 3d 20 73 65 73 73  ==0 ) a1 += sess
5d30: 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 31 29  ionSerialLen(a1)
5d40: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 69 67  ;.      if( bRig
5d50: 68 74 50 6b 4f 6e 6c 79 3d 3d 30 20 29 20 61 32  htPkOnly==0 ) a2
5d60: 20 2b 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61   += sessionSeria
5d70: 6c 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20 7d 0a  lLen(a2);.    }.
5d80: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
5d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
5da0: 6e 74 73 20 61 4c 65 66 74 20 61 6e 64 20 61 52  nts aLeft and aR
5db0: 69 67 68 74 20 62 6f 74 68 20 70 6f 69 6e 74 20  ight both point 
5dc0: 74 6f 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61  to buffers conta
5dd0: 69 6e 69 6e 67 20 63 68 61 6e 67 65 0a 2a 2a 20  ining change.** 
5de0: 72 65 63 6f 72 64 73 20 77 69 74 68 20 6e 43 6f  records with nCo
5df0: 6c 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  l columns. This 
5e00: 66 75 6e 63 74 69 6f 6e 20 22 6d 65 72 67 65 73  function "merges
5e10: 22 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64  " the two record
5e20: 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  s into.** a sing
5e30: 6c 65 20 72 65 63 6f 72 64 73 20 77 68 69 63 68  le records which
5e40: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
5e50: 68 65 20 62 75 66 66 65 72 20 61 74 20 2a 70 61  he buffer at *pa
5e60: 4f 75 74 2e 20 2a 70 61 4f 75 74 20 69 73 0a 2a  Out. *paOut is.*
5e70: 2a 20 74 68 65 6e 20 73 65 74 20 74 6f 20 70 6f  * then set to po
5e80: 69 6e 74 20 74 6f 20 6f 6e 65 20 62 79 74 65 20  int to one byte 
5e90: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
5ea0: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
5eb0: 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  re .** returning
5ec0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 72 67  ..**.** The merg
5ed0: 69 6e 67 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ing of records i
5ee0: 73 20 64 6f 6e 65 20 61 73 20 66 6f 6c 6c 6f 77  s done as follow
5ef0: 73 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75  s: For each colu
5f00: 6d 6e 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  mn, if the .** a
5f10: 52 69 67 68 74 20 72 65 63 6f 72 64 20 63 6f 6e  Right record con
5f20: 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 66 6f  tains a value fo
5f30: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 63 6f  r the column, co
5f40: 70 79 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  py the value fro
5f50: 6d 0a 2a 2a 20 74 68 65 69 72 2e 20 4f 74 68 65  m.** their. Othe
5f60: 72 77 69 73 65 2c 20 69 66 20 61 4c 65 66 74 20  rwise, if aLeft 
5f70: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
5f80: 2c 20 63 6f 70 79 20 69 74 2e 20 49 66 20 6e 65  , copy it. If ne
5f90: 69 74 68 65 72 0a 2a 2a 20 72 65 63 6f 72 64 20  ither.** record 
5fa0: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
5fb0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63 6f 6c   for a given col
5fc0: 75 6d 6e 2c 20 74 68 65 6e 20 6e 65 69 74 68 65  umn, then neithe
5fd0: 72 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 6f 75  r does the.** ou
5fe0: 74 70 75 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  tput record..*/.
5ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
6000: 69 6f 6e 4d 65 72 67 65 52 65 63 6f 72 64 28 0a  ionMergeRecord(.
6010: 20 20 75 38 20 2a 2a 70 61 4f 75 74 2c 20 0a 20    u8 **paOut, . 
6020: 20 69 6e 74 20 6e 43 6f 6c 2c 0a 20 20 75 38 20   int nCol,.  u8 
6030: 2a 61 4c 65 66 74 2c 0a 20 20 75 38 20 2a 61 52  *aLeft,.  u8 *aR
6040: 69 67 68 74 0a 29 7b 0a 20 20 75 38 20 2a 61 31  ight.){.  u8 *a1
6050: 20 3d 20 61 4c 65 66 74 3b 20 20 20 20 20 20 20   = aLeft;       
6060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
6070: 73 6f 72 20 75 73 65 64 20 74 6f 20 69 74 65 72  sor used to iter
6080: 61 74 65 20 74 68 72 6f 75 67 68 20 61 4c 65 66  ate through aLef
6090: 74 20 2a 2f 0a 20 20 75 38 20 2a 61 32 20 3d 20  t */.  u8 *a2 = 
60a0: 61 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  aRight;         
60b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
60c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
60d0: 20 74 68 72 6f 75 67 68 20 61 52 69 67 68 74 20   through aRight 
60e0: 2a 2f 0a 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  */.  u8 *aOut = 
60f0: 2a 70 61 4f 75 74 3b 20 20 20 20 20 20 20 20 20  *paOut;         
6100: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
6110: 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  ursor */.  int i
6120: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
6130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
6140: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 66 72  ed to iterate fr
6150: 6f 6d 20 30 20 74 6f 20 6e 43 6f 6c 20 2a 2f 0a  om 0 to nCol */.
6160: 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69  .  for(iCol=0; i
6170: 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  Col<nCol; iCol++
6180: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 31 20 3d 20  ){.    int n1 = 
6190: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
61a0: 28 61 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 32  (a1);.    int n2
61b0: 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c   = sessionSerial
61c0: 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20 69 66 28  Len(a2);.    if(
61d0: 20 2a 61 32 20 29 7b 0a 20 20 20 20 20 20 6d 65   *a2 ){.      me
61e0: 6d 63 70 79 28 61 4f 75 74 2c 20 61 32 2c 20 6e  mcpy(aOut, a2, n
61f0: 32 29 3b 0a 20 20 20 20 20 20 61 4f 75 74 20 2b  2);.      aOut +
6200: 3d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = n2;.    }else{
6210: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 4f  .      memcpy(aO
6220: 75 74 2c 20 61 31 2c 20 6e 31 29 3b 0a 20 20 20  ut, a1, n1);.   
6230: 20 20 20 61 4f 75 74 20 2b 3d 20 6e 31 3b 0a 20     aOut += n1;. 
6240: 20 20 20 7d 0a 20 20 20 20 61 31 20 2b 3d 20 6e     }.    a1 += n
6250: 31 3b 0a 20 20 20 20 61 32 20 2b 3d 20 6e 32 3b  1;.    a2 += n2;
6260: 0a 20 20 7d 0a 0a 20 20 2a 70 61 4f 75 74 20 3d  .  }..  *paOut =
6270: 20 61 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOut;.}../*.** 
6280: 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65 72  This is a helper
6290: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
62a0: 79 20 73 65 73 73 69 6f 6e 4d 65 72 67 65 55 70  y sessionMergeUp
62b0: 64 61 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  date()..**.** Wh
62c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
62d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 6f 74 68   is called, both
62e0: 20 2a 70 61 4f 6e 65 20 61 6e 64 20 2a 70 61 54   *paOne and *paT
62f0: 77 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  wo point to a va
6300: 6c 75 65 20 0a 2a 2a 20 77 69 74 68 69 6e 20 61  lue .** within a
6310: 20 63 68 61 6e 67 65 20 72 65 63 6f 72 64 2e 20   change record. 
6320: 42 65 66 6f 72 65 20 69 74 20 72 65 74 75 72 6e  Before it return
6330: 73 2c 20 62 6f 74 68 20 68 61 76 65 20 62 65 65  s, both have bee
6340: 6e 20 61 64 76 61 6e 63 65 64 20 73 6f 20 0a 2a  n advanced so .*
6350: 2a 20 61 73 20 74 6f 20 70 6f 69 6e 74 20 74 6f  * as to point to
6360: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
6370: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 2a  in the record..*
6380: 2a 0a 2a 2a 20 49 66 2c 20 77 68 65 6e 20 74 68  *.** If, when th
6390: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
63a0: 61 6c 6c 65 64 2c 20 2a 70 61 54 77 6f 20 70 6f  alled, *paTwo po
63b0: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
63c0: 76 61 6c 75 65 20 28 69 2e 65 2e 0a 2a 2a 20 2a  value (i.e..** *
63d0: 70 61 54 77 6f 5b 30 5d 20 69 73 20 6e 6f 74 20  paTwo[0] is not 
63e0: 30 78 30 30 20 2d 20 74 68 65 20 22 6e 6f 20 76  0x00 - the "no v
63f0: 61 6c 75 65 22 20 70 6c 61 63 65 68 6f 6c 64 65  alue" placeholde
6400: 72 29 2c 20 61 20 63 6f 70 79 20 6f 66 20 74 68  r), a copy of th
6410: 65 20 2a 70 61 54 77 6f 0a 2a 2a 20 70 6f 69 6e  e *paTwo.** poin
6420: 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ter is returned 
6430: 61 6e 64 20 2a 70 6e 56 61 6c 20 69 73 20 73 65  and *pnVal is se
6440: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
6450: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
6460: 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 76  .** serialized v
6470: 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
6480: 20 61 20 63 6f 70 79 20 6f 66 20 2a 70 61 4f 6e   a copy of *paOn
6490: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
64a0: 64 20 2a 70 6e 56 61 6c 0a 2a 2a 20 73 65 74 20  d *pnVal.** set 
64b0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
64c0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 76 61   bytes in the va
64d0: 6c 75 65 20 61 74 20 2a 70 61 4f 6e 65 2e 20 49  lue at *paOne. I
64e0: 66 20 2a 70 61 4f 6e 65 20 70 6f 69 6e 74 73 0a  f *paOne points.
64f0: 2a 2a 20 74 6f 20 74 68 65 20 22 6e 6f 20 76 61  ** to the "no va
6500: 6c 75 65 22 20 70 6c 61 63 65 68 6f 6c 64 65 72  lue" placeholder
6510: 2c 20 2a 70 6e 56 61 6c 20 69 73 20 73 65 74 20  , *pnVal is set 
6520: 74 6f 20 31 2e 20 49 6e 20 6f 74 68 65 72 20 77  to 1. In other w
6530: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ords:.**.**   if
6540: 28 20 2a 70 61 54 77 6f 20 69 73 20 76 61 6c 69  ( *paTwo is vali
6550: 64 20 29 20 72 65 74 75 72 6e 20 2a 70 61 54 77  d ) return *paTw
6560: 6f 3b 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20 2a  o;.**   return *
6570: 70 61 4f 6e 65 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61  paOne;.**.*/.sta
6580: 74 69 63 20 75 38 20 2a 73 65 73 73 69 6f 6e 4d  tic u8 *sessionM
6590: 65 72 67 65 56 61 6c 75 65 28 0a 20 20 75 38 20  ergeValue(.  u8 
65a0: 2a 2a 70 61 4f 6e 65 2c 20 20 20 20 20 20 20 20  **paOne,        
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65c0: 49 4e 2f 4f 55 54 3a 20 4c 65 66 74 2d 68 61 6e  IN/OUT: Left-han
65d0: 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 72  d buffer pointer
65e0: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61 54 77 6f   */.  u8 **paTwo
65f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6600: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
6610: 20 52 69 67 68 74 2d 68 61 6e 64 20 62 75 66 66   Right-hand buff
6620: 65 72 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  er pointer */.  
6630: 69 6e 74 20 2a 70 6e 56 61 6c 20 20 20 20 20 20  int *pnVal      
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 2f 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 69 6e  /* OUT: Bytes in
6660: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
6670: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 31 20 3d  */.){.  u8 *a1 =
6680: 20 2a 70 61 4f 6e 65 3b 0a 20 20 75 38 20 2a 61   *paOne;.  u8 *a
6690: 32 20 3d 20 2a 70 61 54 77 6f 3b 0a 20 20 75 38  2 = *paTwo;.  u8
66a0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
66b0: 74 20 6e 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  t n1;..  assert(
66c0: 20 61 31 20 29 3b 0a 20 20 69 66 28 20 61 32 20   a1 );.  if( a2 
66d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ){.    int n2 = 
66e0: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
66f0: 28 61 32 29 3b 0a 20 20 20 20 69 66 28 20 2a 61  (a2);.    if( *a
6700: 32 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 56 61  2 ){.      *pnVa
6710: 6c 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 70 52  l = n2;.      pR
6720: 65 74 20 3d 20 61 32 3b 0a 20 20 20 20 7d 0a 20  et = a2;.    }. 
6730: 20 20 20 2a 70 61 54 77 6f 20 3d 20 26 61 32 5b     *paTwo = &a2[
6740: 6e 32 5d 3b 0a 20 20 7d 0a 0a 20 20 6e 31 20 3d  n2];.  }..  n1 =
6750: 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65   sessionSerialLe
6760: 6e 28 61 31 29 3b 0a 20 20 69 66 28 20 70 52 65  n(a1);.  if( pRe
6770: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 6e 56  t==0 ){.    *pnV
6780: 61 6c 20 3d 20 6e 31 3b 0a 20 20 20 20 70 52 65  al = n1;.    pRe
6790: 74 20 3d 20 61 31 3b 0a 20 20 7d 0a 20 20 2a 70  t = a1;.  }.  *p
67a0: 61 4f 6e 65 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a  aOne = &a1[n1];.
67b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
67c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
67d0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
67e0: 79 20 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63  y changeset_conc
67f0: 61 74 28 29 20 74 6f 20 6d 65 72 67 65 20 74 77  at() to merge tw
6800: 6f 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 73  o UPDATE changes
6810: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  .** on the same 
6820: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
6830: 6e 74 20 73 65 73 73 69 6f 6e 4d 65 72 67 65 55  nt sessionMergeU
6840: 70 64 61 74 65 28 0a 20 20 75 38 20 2a 2a 70 61  pdate(.  u8 **pa
6850: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
6860: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
6870: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f  UT: Pointer to o
6880: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
6890: 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
68a0: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
68b0: 20 20 2f 2a 20 54 61 62 6c 65 20 63 68 61 6e 67    /* Table chang
68c0: 65 20 70 65 72 74 61 69 6e 73 20 74 6f 20 2a 2f  e pertains to */
68d0: 0a 20 20 69 6e 74 20 62 50 61 74 63 68 73 65 74  .  int bPatchset
68e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
68f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
6900: 63 6f 72 64 73 20 61 72 65 20 70 61 74 63 68 73  cords are patchs
6910: 65 74 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  et records */.  
6920: 75 38 20 2a 61 4f 6c 64 52 65 63 6f 72 64 31 2c  u8 *aOldRecord1,
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 2f 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20  /* old.* record 
6950: 66 6f 72 20 66 69 72 73 74 20 63 68 61 6e 67 65  for first change
6960: 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 6c 64 52 65   */.  u8 *aOldRe
6970: 63 6f 72 64 32 2c 20 20 20 20 20 20 20 20 20 20  cord2,          
6980: 20 20 20 20 20 20 2f 2a 20 6f 6c 64 2e 2a 20 72        /* old.* r
6990: 65 63 6f 72 64 20 66 6f 72 20 73 65 63 6f 6e 64  ecord for second
69a0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20   change */.  u8 
69b0: 2a 61 4e 65 77 52 65 63 6f 72 64 31 2c 20 20 20  *aNewRecord1,   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
69d0: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 66 6f 72  new.* record for
69e0: 20 66 69 72 73 74 20 63 68 61 6e 67 65 20 2a 2f   first change */
69f0: 0a 20 20 75 38 20 2a 61 4e 65 77 52 65 63 6f 72  .  u8 *aNewRecor
6a00: 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d2              
6a10: 20 20 20 2f 2a 20 6e 65 77 2e 2a 20 72 65 63 6f     /* new.* reco
6a20: 72 64 20 66 6f 72 20 73 65 63 6f 6e 64 20 63 68  rd for second ch
6a30: 61 6e 67 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ange */.){.  u8 
6a40: 2a 61 4f 6c 64 31 20 3d 20 61 4f 6c 64 52 65 63  *aOld1 = aOldRec
6a50: 6f 72 64 31 3b 0a 20 20 75 38 20 2a 61 4f 6c 64  ord1;.  u8 *aOld
6a60: 32 20 3d 20 61 4f 6c 64 52 65 63 6f 72 64 32 3b  2 = aOldRecord2;
6a70: 0a 20 20 75 38 20 2a 61 4e 65 77 31 20 3d 20 61  .  u8 *aNew1 = a
6a80: 4e 65 77 52 65 63 6f 72 64 31 3b 0a 20 20 75 38  NewRecord1;.  u8
6a90: 20 2a 61 4e 65 77 32 20 3d 20 61 4e 65 77 52 65   *aNew2 = aNewRe
6aa0: 63 6f 72 64 32 3b 0a 0a 20 20 75 38 20 2a 61 4f  cord2;..  u8 *aO
6ab0: 75 74 20 3d 20 2a 70 61 4f 75 74 3b 0a 20 20 69  ut = *paOut;.  i
6ac0: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 62 50 61  nt i;..  if( bPa
6ad0: 74 63 68 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  tchset==0 ){.   
6ae0: 20 69 6e 74 20 62 52 65 71 75 69 72 65 64 20 3d   int bRequired =
6af0: 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   0;..    assert(
6b00: 20 61 4f 6c 64 52 65 63 6f 72 64 31 20 26 26 20   aOldRecord1 && 
6b10: 61 4e 65 77 52 65 63 6f 72 64 31 20 29 3b 0a 0a  aNewRecord1 );..
6b20: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6b30: 20 6f 6c 64 2e 2a 20 76 65 63 74 6f 72 20 66 69   old.* vector fi
6b40: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rst. */.    for(
6b50: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
6b60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
6b70: 6e 74 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 75  nt nOld;.      u
6b80: 38 20 2a 61 4f 6c 64 3b 0a 20 20 20 20 20 20 69  8 *aOld;.      i
6b90: 6e 74 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 75  nt nNew;.      u
6ba0: 38 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20 20 20  8 *aNew;..      
6bb0: 61 4f 6c 64 20 3d 20 73 65 73 73 69 6f 6e 4d 65  aOld = sessionMe
6bc0: 72 67 65 56 61 6c 75 65 28 26 61 4f 6c 64 31 2c  rgeValue(&aOld1,
6bd0: 20 26 61 4f 6c 64 32 2c 20 26 6e 4f 6c 64 29 3b   &aOld2, &nOld);
6be0: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 65  .      aNew = se
6bf0: 73 73 69 6f 6e 4d 65 72 67 65 56 61 6c 75 65 28  ssionMergeValue(
6c00: 26 61 4e 65 77 31 2c 20 26 61 4e 65 77 32 2c 20  &aNew1, &aNew2, 
6c10: 26 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66  &nNew);.      if
6c20: 28 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 20  ( pTab->abPK[i] 
6c30: 7c 7c 20 6e 4f 6c 64 21 3d 6e 4e 65 77 20 7c 7c  || nOld!=nNew ||
6c40: 20 6d 65 6d 63 6d 70 28 61 4f 6c 64 2c 20 61 4e   memcmp(aOld, aN
6c50: 65 77 2c 20 6e 4e 65 77 29 20 29 7b 0a 20 20 20  ew, nNew) ){.   
6c60: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61       if( pTab->a
6c70: 62 50 4b 5b 69 5d 3d 3d 30 20 29 20 62 52 65 71  bPK[i]==0 ) bReq
6c80: 75 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  uired = 1;.     
6c90: 20 20 20 6d 65 6d 63 70 79 28 61 4f 75 74 2c 20     memcpy(aOut, 
6ca0: 61 4f 6c 64 2c 20 6e 4f 6c 64 29 3b 0a 20 20 20  aOld, nOld);.   
6cb0: 20 20 20 20 20 61 4f 75 74 20 2b 3d 20 6e 4f 6c       aOut += nOl
6cc0: 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
6cd0: 20 20 20 20 20 20 20 20 2a 28 61 4f 75 74 2b 2b          *(aOut++
6ce0: 29 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ) = '\0';.      
6cf0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
6d00: 20 21 62 52 65 71 75 69 72 65 64 20 29 20 72 65   !bRequired ) re
6d10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
6d20: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 2e  * Write the new.
6d30: 2a 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 61 4f  * vector */.  aO
6d40: 6c 64 31 20 3d 20 61 4f 6c 64 52 65 63 6f 72 64  ld1 = aOldRecord
6d50: 31 3b 0a 20 20 61 4f 6c 64 32 20 3d 20 61 4f 6c  1;.  aOld2 = aOl
6d60: 64 52 65 63 6f 72 64 32 3b 0a 20 20 61 4e 65 77  dRecord2;.  aNew
6d70: 31 20 3d 20 61 4e 65 77 52 65 63 6f 72 64 31 3b  1 = aNewRecord1;
6d80: 0a 20 20 61 4e 65 77 32 20 3d 20 61 4e 65 77 52  .  aNew2 = aNewR
6d90: 65 63 6f 72 64 32 3b 0a 20 20 66 6f 72 28 69 3d  ecord2;.  for(i=
6da0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
6db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
6dc0: 4f 6c 64 3b 0a 20 20 20 20 75 38 20 2a 61 4f 6c  Old;.    u8 *aOl
6dd0: 64 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  d;.    int nNew;
6de0: 0a 20 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 0a  .    u8 *aNew;..
6df0: 20 20 20 20 61 4f 6c 64 20 3d 20 73 65 73 73 69      aOld = sessi
6e00: 6f 6e 4d 65 72 67 65 56 61 6c 75 65 28 26 61 4f  onMergeValue(&aO
6e10: 6c 64 31 2c 20 26 61 4f 6c 64 32 2c 20 26 6e 4f  ld1, &aOld2, &nO
6e20: 6c 64 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  ld);.    aNew = 
6e30: 73 65 73 73 69 6f 6e 4d 65 72 67 65 56 61 6c 75  sessionMergeValu
6e40: 65 28 26 61 4e 65 77 31 2c 20 26 61 4e 65 77 32  e(&aNew1, &aNew2
6e50: 2c 20 26 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  , &nNew);.    if
6e60: 28 20 62 50 61 74 63 68 73 65 74 3d 3d 30 20 0a  ( bPatchset==0 .
6e70: 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61       && (pTab->a
6e80: 62 50 4b 5b 69 5d 20 7c 7c 20 28 6e 4f 6c 64 3d  bPK[i] || (nOld=
6e90: 3d 6e 4e 65 77 20 26 26 20 30 3d 3d 6d 65 6d 63  =nNew && 0==memc
6ea0: 6d 70 28 61 4f 6c 64 2c 20 61 4e 65 77 2c 20 6e  mp(aOld, aNew, n
6eb0: 4e 65 77 29 29 29 20 0a 20 20 20 20 29 7b 0a 20  New))) .    ){. 
6ec0: 20 20 20 20 20 2a 28 61 4f 75 74 2b 2b 29 20 3d       *(aOut++) =
6ed0: 20 27 5c 30 27 3b 0a 20 20 20 20 7d 65 6c 73 65   '\0';.    }else
6ee0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  {.      memcpy(a
6ef0: 4f 75 74 2c 20 61 4e 65 77 2c 20 6e 4e 65 77 29  Out, aNew, nNew)
6f00: 3b 0a 20 20 20 20 20 20 61 4f 75 74 20 2b 3d 20  ;.      aOut += 
6f10: 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nNew;.    }.  }.
6f20: 0a 20 20 2a 70 61 4f 75 74 20 3d 20 61 4f 75 74  .  *paOut = aOut
6f30: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
6f40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6f50: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
6f60: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
6f70: 61 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f  a pre-update-hoo
6f80: 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 49  k callback..** I
6f90: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
6fa0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 65 2d  the current pre-
6fb0: 75 70 64 61 74 65 2d 68 6f 6f 6b 20 63 68 61 6e  update-hook chan
6fc0: 67 65 20 61 66 66 65 63 74 73 20 74 68 65 20 73  ge affects the s
6fd0: 61 6d 65 20 72 6f 77 0a 2a 2a 20 61 73 20 74 68  ame row.** as th
6fe0: 65 20 63 68 61 6e 67 65 20 73 74 6f 72 65 64 20  e change stored 
6ff0: 69 6e 20 61 72 67 75 6d 65 6e 74 20 70 43 68 61  in argument pCha
7000: 6e 67 65 2e 20 49 66 20 73 6f 2c 20 69 74 20 72  nge. If so, it r
7010: 65 74 75 72 6e 73 20 74 72 75 65 2e 20 4f 74 68  eturns true. Oth
7020: 65 72 77 69 73 65 0a 2a 2a 20 69 66 20 74 68 65  erwise.** if the
7030: 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b   pre-update-hook
7040: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
7050: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73   the same row as
7060: 20 70 43 68 61 6e 67 65 2c 20 69 74 20 72 65 74   pChange, it ret
7070: 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a  urns.** false..*
7080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
7090: 73 69 6f 6e 50 72 65 75 70 64 61 74 65 45 71 75  sionPreupdateEqu
70a0: 61 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  al(.  sqlite3_se
70b0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
70c0: 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e        /* Session
70d0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 6f 77 6e   object that own
70e0: 73 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a  s SessionTable *
70f0: 2f 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65  /.  SessionTable
7100: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
7110: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
7120: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 68 61  ociated with cha
7130: 6e 67 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e  nge */.  Session
7140: 43 68 61 6e 67 65 20 2a 70 43 68 61 6e 67 65 2c  Change *pChange,
7150: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
7160: 67 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f  ge to compare to
7170: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 20 20 20 20   */.  int op    
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
71a0: 20 70 72 65 2d 75 70 64 61 74 65 20 6f 70 65 72   pre-update oper
71b0: 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ation */.){.  in
71c0: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
71f0: 20 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73   through columns
7200: 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 70 43   */.  u8 *a = pC
7210: 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64 3b 20  hange->aRecord; 
7220: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
7230: 75 73 65 64 20 74 6f 20 73 63 61 6e 20 63 68 61  used to scan cha
7240: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  nge record */.. 
7250: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
7260: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
7270: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
7280: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
7290: 4c 45 54 45 20 29 3b 0a 20 20 66 6f 72 28 69 43  LETE );.  for(iC
72a0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
72b0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
72c0: 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 61      if( !pTab->a
72d0: 62 50 4b 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20  bPK[iCol] ){.   
72e0: 20 20 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 53     a += sessionS
72f0: 65 72 69 61 6c 4c 65 6e 28 61 29 3b 0a 20 20 20  erialLen(a);.   
7300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
7310: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
7320: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l;        /* Val
7330: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ue returned by p
7340: 72 65 75 70 64 61 74 65 5f 6e 65 77 2f 6f 6c 64  reupdate_new/old
7350: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63   */.      int rc
7360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7370: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
7380: 6f 64 65 20 66 72 6f 6d 20 70 72 65 75 70 64 61  ode from preupda
7390: 74 65 5f 6e 65 77 2f 6f 6c 64 20 2a 2f 0a 20 20  te_new/old */.  
73a0: 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
73b0: 2a 61 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  *a++;           
73c0: 2f 2a 20 54 79 70 65 20 6f 66 20 76 61 6c 75 65  /* Type of value
73d0: 20 66 72 6f 6d 20 63 68 61 6e 67 65 20 72 65 63   from change rec
73e0: 6f 72 64 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ord */..      /*
73f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
7400: 61 6c 6c 73 20 74 6f 20 70 72 65 75 70 64 61 74  alls to preupdat
7410: 65 5f 6e 65 77 28 29 20 61 6e 64 20 70 72 65 75  e_new() and preu
7420: 70 64 61 74 65 5f 6f 6c 64 28 29 20 63 61 6e 20  pdate_old() can 
7430: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 66 61 69  not.      ** fai
7440: 6c 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  l. This is becau
7450: 73 65 20 74 68 65 79 20 63 61 63 68 65 20 74 68  se they cache th
7460: 65 69 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  eir return value
7470: 73 2c 20 61 6e 64 20 62 79 20 74 68 65 0a 20 20  s, and by the.  
7480: 20 20 20 20 2a 2a 20 74 69 6d 65 20 63 6f 6e 74      ** time cont
7490: 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72  rol flows to her
74a0: 65 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  e they have alre
74b0: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
74c0: 6f 6e 63 65 20 66 72 6f 6d 0a 20 20 20 20 20 20  once from.      
74d0: 2a 2a 20 77 69 74 68 69 6e 20 73 65 73 73 69 6f  ** within sessio
74e0: 6e 50 72 65 75 70 64 61 74 65 48 61 73 68 28 29  nPreupdateHash()
74f0: 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
7500: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 76 65  asserts below ve
7510: 72 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  rify.      ** th
7520: 69 73 20 28 74 68 61 74 20 74 68 65 20 6d 65 74  is (that the met
7530: 68 6f 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  hod has already 
7540: 62 65 65 6e 20 63 61 6c 6c 65 64 29 2e 20 2a 2f  been called). */
7550: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  .      if( op==S
7560: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a  QLITE_INSERT ){.
7570: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72          /* asser
7580: 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
7590: 65 2d 3e 70 4e 65 77 55 6e 70 61 63 6b 65 64 20  e->pNewUnpacked 
75a0: 7c 7c 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  || db->pPreUpdat
75b0: 65 2d 3e 61 4e 65 77 20 29 3b 20 2a 2f 0a 20 20  e->aNew ); */.  
75c0: 20 20 20 20 20 20 72 63 20 3d 20 70 53 65 73 73        rc = pSess
75d0: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e 65 77 28 70  ion->hook.xNew(p
75e0: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43  Session->hook.pC
75f0: 74 78 2c 20 69 43 6f 6c 2c 20 26 70 56 61 6c 29  tx, iCol, &pVal)
7600: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7610: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74         /* assert
7620: 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
7630: 2d 3e 70 55 6e 70 61 63 6b 65 64 20 29 3b 20 2a  ->pUnpacked ); *
7640: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
7650: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f  Session->hook.xO
7660: 6c 64 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  ld(pSession->hoo
7670: 6b 2e 70 43 74 78 2c 20 69 43 6f 6c 2c 20 26 70  k.pCtx, iCol, &p
7680: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Val);.      }.  
7690: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
76b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
76c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 21  alue_type(pVal)!
76d0: 3d 65 54 79 70 65 20 29 20 72 65 74 75 72 6e 20  =eType ) return 
76e0: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 20 53  0;..      /* A S
76f0: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 6f 62 6a  essionChange obj
7700: 65 63 74 20 6e 65 76 65 72 20 68 61 73 20 61 20  ect never has a 
7710: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 61 20  NULL value in a 
7720: 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  PK column */.   
7730: 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
7740: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
7750: 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
7760: 45 5f 46 4c 4f 41 54 0a 20 20 20 20 20 20 20 20  E_FLOAT.        
7770: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
7780: 49 54 45 5f 42 4c 4f 42 20 20 20 20 7c 7c 20 65  ITE_BLOB    || e
7790: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
77a0: 54 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  T.      );..    
77b0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
77c0: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65  ITE_INTEGER || e
77d0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
77e0: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  AT ){.        i6
77f0: 34 20 69 56 61 6c 20 3d 20 73 65 73 73 69 6f 6e  4 iVal = session
7800: 47 65 74 49 36 34 28 61 29 3b 0a 20 20 20 20 20  GetI64(a);.     
7810: 20 20 20 61 20 2b 3d 20 38 3b 0a 20 20 20 20 20     a += 8;.     
7820: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
7830: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
7840: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
7860: 34 28 70 56 61 6c 29 21 3d 69 56 61 6c 20 29 20  4(pVal)!=iVal ) 
7870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
7880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7890: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a     double rVal;.
78a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
78b0: 28 20 73 69 7a 65 6f 66 28 69 56 61 6c 29 3d 3d  ( sizeof(iVal)==
78c0: 38 20 26 26 20 73 69 7a 65 6f 66 28 72 56 61 6c  8 && sizeof(rVal
78d0: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
78e0: 20 20 6d 65 6d 63 70 79 28 26 72 56 61 6c 2c 20    memcpy(&rVal, 
78f0: 26 69 56 61 6c 2c 20 38 29 3b 0a 20 20 20 20 20  &iVal, 8);.     
7900: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7910: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56  _value_double(pV
7920: 61 6c 29 21 3d 72 56 61 6c 20 29 20 72 65 74 75  al)!=rVal ) retu
7930: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
7940: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7950: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
7960: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
7970: 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20 73 65  .        a += se
7980: 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 61  ssionVarintGet(a
7990: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  , &n);.        i
79a0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
79b0: 5f 62 79 74 65 73 28 70 56 61 6c 29 21 3d 6e 20  _bytes(pVal)!=n 
79c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
79d0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
79e0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
79f0: 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69          z = sqli
7a00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
7a10: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Val);.        }e
7a20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
7a30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7a40: 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
7a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7a60: 66 28 20 6e 3e 30 20 26 26 20 6d 65 6d 63 6d 70  f( n>0 && memcmp
7a70: 28 61 2c 20 7a 2c 20 6e 29 20 29 20 72 65 74 75  (a, z, n) ) retu
7a80: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 61 20  rn 0;.        a 
7a90: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
7aa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
7ab0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
7ac0: 20 72 65 71 75 69 72 65 64 2c 20 67 72 6f 77 20   required, grow 
7ad0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
7ae0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 68 61  sed to store cha
7af0: 6e 67 65 73 20 6f 6e 20 74 61 62 6c 65 20 70 54  nges on table pT
7b00: 61 62 20 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ab .** (part of 
7b10: 74 68 65 20 73 65 73 73 69 6f 6e 20 70 53 65 73  the session pSes
7b20: 73 69 6f 6e 29 2e 20 49 66 20 61 20 66 61 74 61  sion). If a fata
7b30: 6c 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  l OOM error occu
7b40: 72 73 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 73  rs, set the.** s
7b50: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f  ession object to
7b60: 20 66 61 69 6c 65 64 20 61 6e 64 20 72 65 74 75   failed and retu
7b70: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
7b80: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
7b90: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
7ba0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f 73  .**.** It is pos
7bb0: 73 69 62 6c 65 20 74 68 61 74 20 61 20 6e 6f 6e  sible that a non
7bc0: 2d 66 61 74 61 6c 20 4f 4f 4d 20 65 72 72 6f 72  -fatal OOM error
7bd0: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 69 73 20   occurs in this 
7be0: 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 0a 2a 2a 20  function. In.** 
7bf0: 74 68 61 74 20 63 61 73 65 20 74 68 65 20 68 61  that case the ha
7c00: 73 68 2d 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  sh-table does no
7c10: 74 20 67 72 6f 77 2c 20 62 75 74 20 53 51 4c 49  t grow, but SQLI
7c20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7c30: 64 20 61 6e 79 77 61 79 2e 0a 2a 2a 20 47 72 6f  d anyway..** Gro
7c40: 77 69 6e 67 20 74 68 65 20 68 61 73 68 20 74 61  wing the hash ta
7c50: 62 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ble in this case
7c60: 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   is a performanc
7c70: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  e optimization o
7c80: 6e 6c 79 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  nly,.** it is no
7c90: 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  t required for c
7ca0: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
7cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7cc0: 73 65 73 73 69 6f 6e 47 72 6f 77 48 61 73 68 28  sessionGrowHash(
7cd0: 69 6e 74 20 62 50 61 74 63 68 73 65 74 2c 20 53  int bPatchset, S
7ce0: 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61  essionTable *pTa
7cf0: 62 29 7b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  b){.  if( pTab->
7d00: 6e 43 68 61 6e 67 65 3d 3d 30 20 7c 7c 20 70 54  nChange==0 || pT
7d10: 61 62 2d 3e 6e 45 6e 74 72 79 3e 3d 28 70 54 61  ab->nEntry>=(pTa
7d20: 62 2d 3e 6e 43 68 61 6e 67 65 2f 32 29 20 29 7b  b->nChange/2) ){
7d30: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7d40: 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 2a  SessionChange **
7d50: 61 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c 69 74  apNew;.    sqlit
7d60: 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20  e3_int64 nNew = 
7d70: 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  2*(sqlite3_int64
7d80: 29 28 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65 20  )(pTab->nChange 
7d90: 3f 20 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65 20  ? pTab->nChange 
7da0: 3a 20 31 32 38 29 3b 0a 0a 20 20 20 20 61 70 4e  : 128);..    apN
7db0: 65 77 20 3d 20 28 53 65 73 73 69 6f 6e 43 68 61  ew = (SessionCha
7dc0: 6e 67 65 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d  nge **)sqlite3_m
7dd0: 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 53  alloc64(sizeof(S
7de0: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 29 20  essionChange *) 
7df0: 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  * nNew);.    if(
7e00: 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   apNew==0 ){.   
7e10: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 68     if( pTab->nCh
7e20: 61 6e 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ange==0 ){.     
7e30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
7e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7e60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
7e70: 20 20 6d 65 6d 73 65 74 28 61 70 4e 65 77 2c 20    memset(apNew, 
7e80: 30 2c 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f  0, sizeof(Sessio
7e90: 6e 43 68 61 6e 67 65 20 2a 29 20 2a 20 6e 4e 65  nChange *) * nNe
7ea0: 77 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  w);..    for(i=0
7eb0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 68 61 6e 67  ; i<pTab->nChang
7ec0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53  e; i++){.      S
7ed0: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 3b  essionChange *p;
7ee0: 0a 20 20 20 20 20 20 53 65 73 73 69 6f 6e 43 68  .      SessionCh
7ef0: 61 6e 67 65 20 2a 70 4e 65 78 74 3b 0a 20 20 20  ange *pNext;.   
7f00: 20 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 61     for(p=pTab->a
7f10: 70 43 68 61 6e 67 65 5b 69 5d 3b 20 70 3b 20 70  pChange[i]; p; p
7f20: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  =pNext){.       
7f30: 20 69 6e 74 20 62 50 6b 4f 6e 6c 79 20 3d 20 28   int bPkOnly = (
7f40: 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  p->op==SQLITE_DE
7f50: 4c 45 54 45 20 26 26 20 62 50 61 74 63 68 73 65  LETE && bPatchse
7f60: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t);.        int 
7f70: 69 48 61 73 68 20 3d 20 73 65 73 73 69 6f 6e 43  iHash = sessionC
7f80: 68 61 6e 67 65 48 61 73 68 28 70 54 61 62 2c 20  hangeHash(pTab, 
7f90: 62 50 6b 4f 6e 6c 79 2c 20 70 2d 3e 61 52 65 63  bPkOnly, p->aRec
7fa0: 6f 72 64 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ord, nNew);.    
7fb0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
7fc0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  Next;.        p-
7fd0: 3e 70 4e 65 78 74 20 3d 20 61 70 4e 65 77 5b 69  >pNext = apNew[i
7fe0: 48 61 73 68 5d 3b 0a 20 20 20 20 20 20 20 20 61  Hash];.        a
7ff0: 70 4e 65 77 5b 69 48 61 73 68 5d 20 3d 20 70 3b  pNew[iHash] = p;
8000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8010: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8020: 28 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 29  (pTab->apChange)
8030: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 43 68 61  ;.    pTab->nCha
8040: 6e 67 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  nge = nNew;.    
8050: 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 20 3d  pTab->apChange =
8060: 20 61 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72   apNew;.  }..  r
8070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
8090: 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
80a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
80b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
80c0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  e columns of tab
80d0: 6c 65 0a 2a 2a 20 7a 54 68 69 73 2c 20 69 6e 20  le.** zThis, in 
80e0: 73 63 68 65 6d 61 20 7a 44 62 2e 0a 2a 2a 0a 2a  schema zDb..**.*
80f0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
8100: 74 68 65 79 20 61 72 65 20 6e 6f 74 20 4e 55 4c  they are not NUL
8110: 4c 2c 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 43  L, variable *pnC
8120: 6f 6c 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ol is set to the
8130: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f   number.** of co
8140: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 61 74  lumns in the dat
8150: 61 62 61 73 65 20 74 61 62 6c 65 20 61 6e 64 20  abase table and 
8160: 76 61 72 69 61 62 6c 65 20 2a 70 7a 54 61 62 20  variable *pzTab 
8170: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
8180: 74 6f 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  to a.** nul-term
8190: 69 6e 61 74 65 64 20 63 6f 70 79 20 6f 66 20 74  inated copy of t
81a0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a  he table name. *
81b0: 70 61 7a 43 6f 6c 20 28 69 66 20 6e 6f 74 20 4e  pazCol (if not N
81c0: 55 4c 4c 29 20 69 73 20 73 65 74 20 74 6f 0a 2a  ULL) is set to.*
81d0: 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  * point to an ar
81e0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
81f0: 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  to column names.
8200: 20 41 6e 64 20 2a 70 61 62 50 4b 20 28 61 67 61   And *pabPK (aga
8210: 69 6e 2c 20 69 66 20 6e 6f 74 0a 2a 2a 20 4e 55  in, if not.** NU
8220: 4c 4c 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f  LL) is set to po
8230: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
8240: 6f 66 20 62 6f 6f 6c 65 61 6e 73 20 2d 20 74 72  of booleans - tr
8250: 75 65 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ue if the corres
8260: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 63 6f 6c 75 6d  ponding.** colum
8270: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
8280: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8290: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
82a0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
82b0: 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 2a 2a   declared as:.**
82c0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
82d0: 41 42 4c 45 20 74 62 6c 31 28 77 2c 20 78 2c 20  ABLE tbl1(w, x, 
82e0: 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  y, z, PRIMARY KE
82f0: 59 28 77 2c 20 7a 29 29 3b 0a 2a 2a 0a 2a 2a 20  Y(w, z));.**.** 
8300: 54 68 65 6e 20 74 68 65 20 66 6f 75 72 20 6f 75  Then the four ou
8310: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 61  tput variables a
8320: 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20  re populated as 
8330: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
8340: 20 20 20 2a 70 6e 43 6f 6c 20 20 3d 20 34 0a 2a     *pnCol  = 4.*
8350: 2a 20 20 20 20 20 2a 70 7a 54 61 62 20 20 3d 20  *     *pzTab  = 
8360: 22 74 62 6c 31 22 0a 2a 2a 20 20 20 20 20 2a 70  "tbl1".**     *p
8370: 61 7a 43 6f 6c 20 3d 20 7b 22 77 22 2c 20 22 78  azCol = {"w", "x
8380: 22 2c 20 22 79 22 2c 20 22 7a 22 7d 0a 2a 2a 20  ", "y", "z"}.** 
8390: 20 20 20 20 2a 70 61 62 50 4b 20 20 3d 20 7b 31      *pabPK  = {1
83a0: 2c 20 30 2c 20 30 2c 20 31 7d 0a 2a 2a 0a 2a 2a  , 0, 0, 1}.**.**
83b0: 20 41 6c 6c 20 72 65 74 75 72 6e 65 64 20 62 75   All returned bu
83c0: 66 66 65 72 73 20 61 72 65 20 70 61 72 74 20 6f  ffers are part o
83d0: 66 20 74 68 65 20 73 61 6d 65 20 73 69 6e 67 6c  f the same singl
83e0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 77 68  e allocation, wh
83f0: 69 63 68 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66  ich must.** be f
8400: 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
8410: 65 33 5f 66 72 65 65 28 29 20 62 79 20 74 68 65  e3_free() by the
8420: 20 63 61 6c 6c 65 72 0a 2a 2f 0a 73 74 61 74 69   caller.*/.stati
8430: 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 54 61 62  c int sessionTab
8440: 6c 65 49 6e 66 6f 28 0a 20 20 73 71 6c 69 74 65  leInfo(.  sqlite
8450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
8460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8470: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8480: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8490: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
84a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
84b0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
84c0: 73 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29  se (e.g. "main")
84d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
84e0: 20 2a 7a 54 68 69 73 2c 20 20 20 20 20 20 20 20   *zThis,        
84f0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e        /* Table n
8500: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ame */.  int *pn
8510: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
8520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8530: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
8540: 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ns */.  const ch
8550: 61 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20 20 20  ar **pzTab,     
8560: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8570: 43 6f 70 79 20 6f 66 20 7a 54 68 69 73 20 2a 2f  Copy of zThis */
8580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
8590: 2a 70 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  *pazCol,        
85a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79     /* OUT: Array
85b0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
85c0: 20 66 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20   for table */.  
85d0: 75 38 20 2a 2a 70 61 62 50 4b 20 20 20 20 20 20  u8 **pabPK      
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
8600: 20 62 6f 6f 6c 65 61 6e 73 20 2d 20 74 72 75 65   booleans - true
8610: 20 66 6f 72 20 50 4b 20 63 6f 6c 20 2a 2f 0a 29   for PK col */.)
8620: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 61 67 6d  {.  char *zPragm
8630: 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  a;.  sqlite3_stm
8640: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
8650: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
8660: 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  t64 nByte;.  int
8670: 20 6e 44 62 43 6f 6c 20 3d 20 30 3b 0a 20 20 69   nDbCol = 0;.  i
8680: 6e 74 20 6e 54 68 69 73 3b 0a 20 20 69 6e 74 20  nt nThis;.  int 
8690: 69 3b 0a 20 20 75 38 20 2a 70 41 6c 6c 6f 63 20  i;.  u8 *pAlloc 
86a0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a  = 0;.  char **az
86b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 75 38 20 2a 61  Col = 0;.  u8 *a
86c0: 62 50 4b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  bPK = 0;..  asse
86d0: 72 74 28 20 70 61 7a 43 6f 6c 20 26 26 20 70 61  rt( pazCol && pa
86e0: 62 50 4b 20 29 3b 0a 0a 20 20 6e 54 68 69 73 20  bPK );..  nThis 
86f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8700: 30 28 7a 54 68 69 73 29 3b 0a 20 20 69 66 28 20  0(zThis);.  if( 
8710: 6e 54 68 69 73 3d 3d 31 32 20 26 26 20 30 3d 3d  nThis==12 && 0==
8720: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
8730: 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20  "sqlite_stat1", 
8740: 7a 54 68 69 73 29 20 29 7b 0a 20 20 20 20 72 63  zThis) ){.    rc
8750: 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
8760: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
8770: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 68 69 73 2c  (db, zDb, zThis,
8780: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8790: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
87a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
87b0: 20 20 20 2f 2a 20 46 6f 72 20 73 71 6c 69 74 65     /* For sqlite
87c0: 5f 73 74 61 74 31 2c 20 70 72 65 74 65 6e 64 20  _stat1, pretend 
87d0: 74 68 61 74 20 28 74 62 6c 2c 69 64 78 29 20 69  that (tbl,idx) i
87e0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
87f0: 59 2e 20 2a 2f 0a 20 20 20 20 20 20 7a 50 72 61  Y. */.      zPra
8800: 67 6d 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  gma = sqlite3_mp
8810: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
8820: 20 22 53 45 4c 45 43 54 20 30 2c 20 27 74 62 6c   "SELECT 0, 'tbl
8830: 27 2c 20 20 27 27 2c 20 30 2c 20 27 27 2c 20 31  ',  '', 0, '', 1
8840: 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 22       UNION ALL "
8850: 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
8860: 43 54 20 31 2c 20 27 69 64 78 27 2c 20 20 27 27  CT 1, 'idx',  ''
8870: 2c 20 30 2c 20 27 27 2c 20 32 20 20 20 20 20 55  , 0, '', 2     U
8880: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
8890: 20 20 20 20 20 22 53 45 4c 45 43 54 20 32 2c 20       "SELECT 2, 
88a0: 27 73 74 61 74 27 2c 20 27 27 2c 20 30 2c 20 27  'stat', '', 0, '
88b0: 27 2c 20 30 22 0a 20 20 20 20 20 20 29 3b 0a 20  ', 0".      );. 
88c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
88d0: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b  =SQLITE_ERROR ){
88e0: 0a 20 20 20 20 20 20 7a 50 72 61 67 6d 61 20 3d  .      zPragma =
88f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8900: 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ("");.    }else{
8910: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8930: 0a 20 20 20 20 7a 50 72 61 67 6d 61 20 3d 20 73  .    zPragma = s
8940: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8950: 50 52 41 47 4d 41 20 27 25 71 27 2e 74 61 62 6c  PRAGMA '%q'.tabl
8960: 65 5f 69 6e 66 6f 28 27 25 71 27 29 22 2c 20 7a  e_info('%q')", z
8970: 44 62 2c 20 7a 54 68 69 73 29 3b 0a 20 20 7d 0a  Db, zThis);.  }.
8980: 20 20 69 66 28 20 21 7a 50 72 61 67 6d 61 20 29    if( !zPragma )
8990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
89a0: 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71  OMEM;..  rc = sq
89b0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
89c0: 28 64 62 2c 20 7a 50 72 61 67 6d 61 2c 20 2d 31  (db, zPragma, -1
89d0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
89e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
89f0: 61 67 6d 61 29 3b 0a 20 20 69 66 28 20 72 63 21  agma);.  if( rc!
8a00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8a10: 75 72 6e 20 72 63 3b 0a 0a 20 20 6e 42 79 74 65  urn rc;..  nByte
8a20: 20 3d 20 6e 54 68 69 73 20 2b 20 31 3b 0a 20 20   = nThis + 1;.  
8a30: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
8a40: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
8a50: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 6e 42  pStmt) ){.    nB
8a60: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63  yte += sqlite3_c
8a70: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
8a80: 74 2c 20 31 29 3b 0a 20 20 20 20 6e 44 62 43 6f  t, 1);.    nDbCo
8a90: 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  l++;.  }.  rc = 
8aa0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
8ab0: 74 6d 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  tmt);..  if( rc=
8ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8ad0: 20 20 6e 42 79 74 65 20 2b 3d 20 6e 44 62 43 6f    nByte += nDbCo
8ae0: 6c 20 2a 20 28 73 69 7a 65 6f 66 28 63 6f 6e 73  l * (sizeof(cons
8af0: 74 20 63 68 61 72 20 2a 29 20 2b 20 73 69 7a 65  t char *) + size
8b00: 6f 66 28 75 38 29 20 2b 20 31 29 3b 0a 20 20 20  of(u8) + 1);.   
8b10: 20 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   pAlloc = sqlite
8b20: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
8b30: 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 6c 6f  );.    if( pAllo
8b40: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c==0 ){.      rc
8b50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8b80: 7b 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 28 63  {.    azCol = (c
8b90: 68 61 72 20 2a 2a 29 70 41 6c 6c 6f 63 3b 0a 20  har **)pAlloc;. 
8ba0: 20 20 20 70 41 6c 6c 6f 63 20 3d 20 28 75 38 20     pAlloc = (u8 
8bb0: 2a 29 26 61 7a 43 6f 6c 5b 6e 44 62 43 6f 6c 5d  *)&azCol[nDbCol]
8bc0: 3b 0a 20 20 20 20 61 62 50 4b 20 3d 20 28 75 38  ;.    abPK = (u8
8bd0: 20 2a 29 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70   *)pAlloc;.    p
8be0: 41 6c 6c 6f 63 20 3d 20 26 61 62 50 4b 5b 6e 44  Alloc = &abPK[nD
8bf0: 62 43 6f 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70  bCol];.    if( p
8c00: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 6d 65  zTab ){.      me
8c10: 6d 63 70 79 28 70 41 6c 6c 6f 63 2c 20 7a 54 68  mcpy(pAlloc, zTh
8c20: 69 73 2c 20 6e 54 68 69 73 2b 31 29 3b 0a 20 20  is, nThis+1);.  
8c30: 20 20 20 20 2a 70 7a 54 61 62 20 3d 20 28 63 68      *pzTab = (ch
8c40: 61 72 20 2a 29 70 41 6c 6c 6f 63 3b 0a 20 20 20  ar *)pAlloc;.   
8c50: 20 20 20 70 41 6c 6c 6f 63 20 2b 3d 20 6e 54 68     pAlloc += nTh
8c60: 69 73 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  is+1;.    }.  . 
8c70: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68     i = 0;.    wh
8c80: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
8c90: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
8ca0: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  tmt) ){.      in
8cb0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
8cc0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
8cd0: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
8ce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8cf0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
8d00: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
8d10: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
8d20: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 65   break;.      me
8d40: 6d 63 70 79 28 70 41 6c 6c 6f 63 2c 20 7a 4e 61  mcpy(pAlloc, zNa
8d50: 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
8d60: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 28      azCol[i] = (
8d70: 63 68 61 72 20 2a 29 70 41 6c 6c 6f 63 3b 0a 20  char *)pAlloc;. 
8d80: 20 20 20 20 20 70 41 6c 6c 6f 63 20 2b 3d 20 6e       pAlloc += n
8d90: 4e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 61 62  Name+1;.      ab
8da0: 50 4b 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  PK[i] = sqlite3_
8db0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
8dc0: 2c 20 35 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  , 5);.      i++;
8dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8de0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
8df0: 74 6d 74 29 3b 0a 20 20 0a 20 20 7d 0a 0a 20 20  tmt);.  .  }..  
8e00: 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  /* If successful
8e10: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
8e20: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e  utput variables.
8e30: 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
8e40: 20 74 68 65 6d 20 61 6e 64 0a 20 20 2a 2a 20 66   them and.  ** f
8e50: 72 65 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69  ree any allocati
8e60: 6f 6e 20 6d 61 64 65 2e 20 41 6e 20 65 72 72 6f  on made. An erro
8e70: 72 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72  r code will be r
8e80: 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
8e90: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
8ea0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8eb0: 7b 0a 20 20 20 20 2a 70 61 7a 43 6f 6c 20 3d 20  {.    *pazCol = 
8ec0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 61  (const char **)a
8ed0: 7a 43 6f 6c 3b 0a 20 20 20 20 2a 70 61 62 50 4b  zCol;.    *pabPK
8ee0: 20 3d 20 61 62 50 4b 3b 0a 20 20 20 20 2a 70 6e   = abPK;.    *pn
8ef0: 43 6f 6c 20 3d 20 6e 44 62 43 6f 6c 3b 0a 20 20  Col = nDbCol;.  
8f00: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 61 7a 43  }else{.    *pazC
8f10: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 61 62  ol = 0;.    *pab
8f20: 50 4b 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  PK = 0;.    *pnC
8f30: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ol = 0;.    if( 
8f40: 70 7a 54 61 62 20 29 20 2a 70 7a 54 61 62 20 3d  pzTab ) *pzTab =
8f50: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
8f60: 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 7d  free(azCol);.  }
8f70: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
8f80: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
8f90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8fa0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8fb0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
8fc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 70 72 65  rom within a pre
8fd0: 2d 75 70 64 61 74 65 20 68 61 6e 64 6c 65 72 20  -update handler 
8fe0: 66 6f 72 20 61 0a 2a 2a 20 77 72 69 74 65 20 74  for a.** write t
8ff0: 6f 20 74 61 62 6c 65 20 70 54 61 62 2c 20 70 61  o table pTab, pa
9000: 72 74 20 6f 66 20 73 65 73 73 69 6f 6e 20 70 53  rt of session pS
9010: 65 73 73 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  ession. If this 
9020: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
9030: 77 72 69 74 65 20 74 6f 20 74 68 69 73 20 74 61  write to this ta
9040: 62 6c 65 2c 20 69 6e 69 74 61 6c 69 7a 65 20 74  ble, initalize t
9050: 68 65 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 2e  he SessionTable.
9060: 6e 43 6f 6c 2c 20 61 7a 43 6f 6c 5b 5d 20 61 6e  nCol, azCol[] an
9070: 64 0a 2a 2a 20 61 62 50 4b 5b 5d 20 61 72 72 61  d.** abPK[] arra
9080: 79 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ys accordingly..
9090: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
90a0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
90b0: 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65  or code is store
90c0: 64 20 69 6e 20 73 71 6c 69 74 65 33 5f 73 65 73  d in sqlite3_ses
90d0: 73 69 6f 6e 2e 72 63 20 61 6e 64 0a 2a 2a 20 6e  sion.rc and.** n
90e0: 6f 6e 2d 7a 65 72 6f 20 72 65 74 75 72 6e 65 64  on-zero returned
90f0: 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 65 72 72 6f  . Or, if no erro
9100: 72 20 6f 63 63 75 72 73 20 62 75 74 20 74 68 65  r occurs but the
9110: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 70 72   table has no pr
9120: 69 6d 61 72 79 0a 2a 2a 20 6b 65 79 2c 20 73 71  imary.** key, sq
9130: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 2e 72 63  lite3_session.rc
9140: 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 20   is left set to 
9150: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 6e 6f  SQLITE_OK and no
9160: 6e 2d 7a 65 72 6f 20 72 65 74 75 72 6e 65 64 20  n-zero returned 
9170: 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 74  to.** indicate t
9180: 68 61 74 20 75 70 64 61 74 65 73 20 6f 6e 20 74  hat updates on t
9190: 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  his table should
91a0: 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 53 65 73   be ignored. Ses
91b0: 73 69 6f 6e 54 61 62 6c 65 2e 61 62 50 4b 20 0a  sionTable.abPK .
91c0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ** is set to NUL
91d0: 4c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  L in this case..
91e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
91f0: 73 73 69 6f 6e 49 6e 69 74 54 61 62 6c 65 28 73  ssionInitTable(s
9200: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
9210: 70 53 65 73 73 69 6f 6e 2c 20 53 65 73 73 69 6f  pSession, Sessio
9220: 6e 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  nTable *pTab){. 
9230: 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d   if( pTab->nCol=
9240: 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 62  =0 ){.    u8 *ab
9250: 50 4b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PK;.    assert( 
9260: 70 54 61 62 2d 3e 61 7a 43 6f 6c 3d 3d 30 20 7c  pTab->azCol==0 |
9270: 7c 20 70 54 61 62 2d 3e 61 62 50 4b 3d 3d 30 20  | pTab->abPK==0 
9280: 29 3b 0a 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  );.    pSession-
9290: 3e 72 63 20 3d 20 73 65 73 73 69 6f 6e 54 61 62  >rc = sessionTab
92a0: 6c 65 49 6e 66 6f 28 70 53 65 73 73 69 6f 6e 2d  leInfo(pSession-
92b0: 3e 64 62 2c 20 70 53 65 73 73 69 6f 6e 2d 3e 7a  >db, pSession->z
92c0: 44 62 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61  Db, .        pTa
92d0: 62 2d 3e 7a 4e 61 6d 65 2c 20 26 70 54 61 62 2d  b->zName, &pTab-
92e0: 3e 6e 43 6f 6c 2c 20 30 2c 20 26 70 54 61 62 2d  >nCol, 0, &pTab-
92f0: 3e 61 7a 43 6f 6c 2c 20 26 61 62 50 4b 0a 20 20  >azCol, &abPK.  
9300: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65    );.    if( pSe
9310: 73 73 69 6f 6e 2d 3e 72 63 3d 3d 53 51 4c 49 54  ssion->rc==SQLIT
9320: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
9330: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
9340: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
9350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9360: 69 66 28 20 61 62 50 4b 5b 69 5d 20 29 7b 0a 20  if( abPK[i] ){. 
9370: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
9380: 62 50 4b 20 3d 20 61 62 50 4b 3b 0a 20 20 20 20  bPK = abPK;.    
9390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
93a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
93b0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
93c0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 73 71 6c  te3_stricmp("sql
93d0: 69 74 65 5f 73 74 61 74 31 22 2c 20 70 54 61 62  ite_stat1", pTab
93e0: 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
93f0: 20 20 20 20 70 54 61 62 2d 3e 62 53 74 61 74 31      pTab->bStat1
9400: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9410: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9420: 20 28 70 53 65 73 73 69 6f 6e 2d 3e 72 63 20 7c   (pSession->rc |
9430: 7c 20 70 54 61 62 2d 3e 61 62 50 4b 3d 3d 30 29  | pTab->abPK==0)
9440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73 69  ;.}../*.** Versi
9450: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 75 72 20  ons of the four 
9460: 6d 65 74 68 6f 64 73 20 69 6e 20 6f 62 6a 65 63  methods in objec
9470: 74 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 66 6f  t SessionHook fo
9480: 72 20 75 73 65 20 77 69 74 68 20 74 68 65 0a 2a  r use with the.*
9490: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  * sqlite_stat1 t
94a0: 61 62 6c 65 2e 20 54 68 65 20 70 75 72 70 6f 73  able. The purpos
94b0: 65 20 6f 66 20 74 68 69 73 20 69 73 20 74 6f 20  e of this is to 
94c0: 73 75 62 73 74 69 74 75 74 65 20 61 20 7a 65 72  substitute a zer
94d0: 6f 2d 6c 65 6e 67 74 68 0a 2a 2a 20 62 6c 6f 62  o-length.** blob
94e0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 4e 55 4c   each time a NUL
94f0: 4c 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 20  L value is read 
9500: 66 72 6f 6d 20 74 68 65 20 22 69 64 78 22 20 63  from the "idx" c
9510: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  olumn of the.** 
9520: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
9530: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  le..*/.typedef s
9540: 74 72 75 63 74 20 53 65 73 73 69 6f 6e 53 74 61  truct SessionSta
9550: 74 31 43 74 78 20 53 65 73 73 69 6f 6e 53 74 61  t1Ctx SessionSta
9560: 74 31 43 74 78 3b 0a 73 74 72 75 63 74 20 53 65  t1Ctx;.struct Se
9570: 73 73 69 6f 6e 53 74 61 74 31 43 74 78 20 7b 0a  ssionStat1Ctx {.
9580: 20 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 68 6f    SessionHook ho
9590: 6f 6b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  ok;.  sqlite3_se
95a0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 3b  ssion *pSession;
95b0: 0a 7d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .};.static int s
95c0: 65 73 73 69 6f 6e 53 74 61 74 31 4f 6c 64 28 76  essionStat1Old(v
95d0: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 69  oid *pCtx, int i
95e0: 43 6f 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Col, sqlite3_val
95f0: 75 65 20 2a 2a 70 70 56 61 6c 29 7b 0a 20 20 53  ue **ppVal){.  S
9600: 65 73 73 69 6f 6e 53 74 61 74 31 43 74 78 20 2a  essionStat1Ctx *
9610: 70 20 3d 20 28 53 65 73 73 69 6f 6e 53 74 61 74  p = (SessionStat
9620: 31 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 73 71  1Ctx*)pCtx;.  sq
9630: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
9640: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
9650: 3d 20 70 2d 3e 68 6f 6f 6b 2e 78 4f 6c 64 28 70  = p->hook.xOld(p
9660: 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 43 6f  ->hook.pCtx, iCo
9670: 6c 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69 66 28  l, &pVal);.  if(
9680: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
9690: 26 20 69 43 6f 6c 3d 3d 31 20 26 26 20 73 71 6c  & iCol==1 && sql
96a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
96b0: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  pVal)==SQLITE_NU
96c0: 4c 4c 20 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d  LL ){.    pVal =
96d0: 20 70 2d 3e 70 53 65 73 73 69 6f 6e 2d 3e 70 5a   p->pSession->pZ
96e0: 65 72 6f 42 6c 6f 62 3b 0a 20 20 7d 0a 20 20 2a  eroBlob;.  }.  *
96f0: 70 70 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20  ppVal = pVal;.  
9700: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
9710: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 53  tic int sessionS
9720: 74 61 74 31 4e 65 77 28 76 6f 69 64 20 2a 70 43  tat1New(void *pC
9730: 74 78 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71  tx, int iCol, sq
9740: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
9750: 56 61 6c 29 7b 0a 20 20 53 65 73 73 69 6f 6e 53  Val){.  SessionS
9760: 74 61 74 31 43 74 78 20 2a 70 20 3d 20 28 53 65  tat1Ctx *p = (Se
9770: 73 73 69 6f 6e 53 74 61 74 31 43 74 78 2a 29 70  ssionStat1Ctx*)p
9780: 43 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Ctx;.  sqlite3_v
9790: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
97a0: 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 68 6f    int rc = p->ho
97b0: 6f 6b 2e 78 4e 65 77 28 70 2d 3e 68 6f 6f 6b 2e  ok.xNew(p->hook.
97c0: 70 43 74 78 2c 20 69 43 6f 6c 2c 20 26 70 56 61  pCtx, iCol, &pVa
97d0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  l);.  if( rc==SQ
97e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3d  LITE_OK && iCol=
97f0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  =1 && sqlite3_va
9800: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
9810: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
9820: 20 20 20 70 56 61 6c 20 3d 20 70 2d 3e 70 53 65     pVal = p->pSe
9830: 73 73 69 6f 6e 2d 3e 70 5a 65 72 6f 42 6c 6f 62  ssion->pZeroBlob
9840: 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c 20 3d  ;.  }.  *ppVal =
9850: 20 70 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20   pVal;.  return 
9860: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
9870: 20 73 65 73 73 69 6f 6e 53 74 61 74 31 43 6f 75   sessionStat1Cou
9880: 6e 74 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a  nt(void *pCtx){.
9890: 20 20 53 65 73 73 69 6f 6e 53 74 61 74 31 43 74    SessionStat1Ct
98a0: 78 20 2a 70 20 3d 20 28 53 65 73 73 69 6f 6e 53  x *p = (SessionS
98b0: 74 61 74 31 43 74 78 2a 29 70 43 74 78 3b 0a 20  tat1Ctx*)pCtx;. 
98c0: 20 72 65 74 75 72 6e 20 70 2d 3e 68 6f 6f 6b 2e   return p->hook.
98d0: 78 43 6f 75 6e 74 28 70 2d 3e 68 6f 6f 6b 2e 70  xCount(p->hook.p
98e0: 43 74 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Ctx);.}.static i
98f0: 6e 74 20 73 65 73 73 69 6f 6e 53 74 61 74 31 44  nt sessionStat1D
9900: 65 70 74 68 28 76 6f 69 64 20 2a 70 43 74 78 29  epth(void *pCtx)
9910: 7b 0a 20 20 53 65 73 73 69 6f 6e 53 74 61 74 31  {.  SessionStat1
9920: 43 74 78 20 2a 70 20 3d 20 28 53 65 73 73 69 6f  Ctx *p = (Sessio
9930: 6e 53 74 61 74 31 43 74 78 2a 29 70 43 74 78 3b  nStat1Ctx*)pCtx;
9940: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 68 6f 6f  .  return p->hoo
9950: 6b 2e 78 44 65 70 74 68 28 70 2d 3e 68 6f 6f 6b  k.xDepth(p->hook
9960: 2e 70 43 74 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  .pCtx);.}.../*.*
9970: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9980: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
9990: 72 6f 6d 20 77 69 74 68 20 61 20 70 72 65 2d 75  rom with a pre-u
99a0: 70 64 61 74 65 2d 68 6f 6f 6b 20 72 65 70 6f 72  pdate-hook repor
99b0: 74 69 6e 67 20 61 20 0a 2a 2a 20 63 68 61 6e 67  ting a .** chang
99c0: 65 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20  e on table pTab 
99d0: 28 61 74 74 61 63 68 65 64 20 74 6f 20 73 65 73  (attached to ses
99e0: 73 69 6f 6e 20 70 53 65 73 73 69 6f 6e 29 2e 20  sion pSession). 
99f0: 54 68 65 20 74 79 70 65 20 6f 66 20 63 68 61 6e  The type of chan
9a00: 67 65 0a 2a 2a 20 28 55 50 44 41 54 45 2c 20 49  ge.** (UPDATE, I
9a10: 4e 53 45 52 54 2c 20 44 45 4c 45 54 45 29 20 69  NSERT, DELETE) i
9a20: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
9a30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9a40: 74 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  t..**.** Unless 
9a50: 6f 6e 65 20 69 73 20 61 6c 72 65 61 64 79 20 70  one is already p
9a60: 72 65 73 65 6e 74 20 6f 72 20 61 6e 20 65 72 72  resent or an err
9a70: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 6e  or occurs, an en
9a80: 74 72 79 20 69 73 20 61 64 64 65 64 0a 2a 2a 20  try is added.** 
9a90: 74 6f 20 74 68 65 20 63 68 61 6e 67 65 64 2d 72  to the changed-r
9aa0: 6f 77 73 20 68 61 73 68 20 74 61 62 6c 65 20 61  ows hash table a
9ab0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9ac0: 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a 73 74  able pTab..*/.st
9ad0: 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
9ae0: 6e 50 72 65 75 70 64 61 74 65 4f 6e 65 43 68 61  nPreupdateOneCha
9af0: 6e 67 65 28 0a 20 20 69 6e 74 20 6f 70 2c 20 20  nge(.  int op,  
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9b20: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2c 20   SQLITE_UPDATE, 
9b30: 49 4e 53 45 52 54 2c 20 44 45 4c 45 54 45 20 2a  INSERT, DELETE *
9b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  /.  sqlite3_sess
9b50: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20  ion *pSession,  
9b60: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f      /* Session o
9b70: 62 6a 65 63 74 20 70 54 61 62 20 69 73 20 61 74  bject pTab is at
9b80: 74 61 63 68 65 64 20 74 6f 20 2a 2f 0a 20 20 53  tached to */.  S
9b90: 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61  essionTable *pTa
9ba0: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b              /
9bb0: 2a 20 54 61 62 6c 65 20 74 68 61 74 20 63 68 61  * Table that cha
9bc0: 6e 67 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  nge applies to *
9bd0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 61 73 68  /.){.  int iHash
9be0: 3b 20 0a 20 20 69 6e 74 20 62 4e 75 6c 6c 20 3d  ; .  int bNull =
9bf0: 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 20 3d 20   0; .  int rc = 
9c00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 65 73  SQLITE_OK;.  Ses
9c10: 73 69 6f 6e 53 74 61 74 31 43 74 78 20 73 74 61  sionStat1Ctx sta
9c20: 74 31 20 3d 20 7b 7b 30 2c 30 2c 30 2c 30 2c 30  t1 = {{0,0,0,0,0
9c30: 7d 2c 30 7d 3b 0a 0a 20 20 69 66 28 20 70 53 65  },0};..  if( pSe
9c40: 73 73 69 6f 6e 2d 3e 72 63 20 29 20 72 65 74 75  ssion->rc ) retu
9c50: 72 6e 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  rn;..  /* Load t
9c60: 61 62 6c 65 20 64 65 74 61 69 6c 73 20 69 66 20  able details if 
9c70: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
9c80: 28 20 73 65 73 73 69 6f 6e 49 6e 69 74 54 61 62  ( sessionInitTab
9c90: 6c 65 28 70 53 65 73 73 69 6f 6e 2c 20 70 54 61  le(pSession, pTa
9ca0: 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  b) ) return;..  
9cb0: 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 6e 75 6d  /* Check the num
9cc0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9cd0: 6e 20 74 68 69 73 20 78 50 72 65 55 70 64 61 74  n this xPreUpdat
9ce0: 65 20 63 61 6c 6c 20 6d 61 74 63 68 65 73 20 74  e call matches t
9cf0: 68 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  he .  ** number 
9d00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9d10: 65 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  e table.  */.  i
9d20: 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70  f( pTab->nCol!=p
9d30: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 43  Session->hook.xC
9d40: 6f 75 6e 74 28 70 53 65 73 73 69 6f 6e 2d 3e 68  ount(pSession->h
9d50: 6f 6f 6b 2e 70 43 74 78 29 20 29 7b 0a 20 20 20  ook.pCtx) ){.   
9d60: 20 70 53 65 73 73 69 6f 6e 2d 3e 72 63 20 3d 20   pSession->rc = 
9d70: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20  SQLITE_SCHEMA;. 
9d80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
9d90: 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 68 61    /* Grow the ha
9da0: 73 68 20 74 61 62 6c 65 20 69 66 20 72 65 71 75  sh table if requ
9db0: 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 65  ired */.  if( se
9dc0: 73 73 69 6f 6e 47 72 6f 77 48 61 73 68 28 30 2c  ssionGrowHash(0,
9dd0: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 53   pTab) ){.    pS
9de0: 65 73 73 69 6f 6e 2d 3e 72 63 20 3d 20 53 51 4c  ession->rc = SQL
9df0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
9e00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
9e10: 28 20 70 54 61 62 2d 3e 62 53 74 61 74 31 20 29  ( pTab->bStat1 )
9e20: 7b 0a 20 20 20 20 73 74 61 74 31 2e 68 6f 6f 6b  {.    stat1.hook
9e30: 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f   = pSession->hoo
9e40: 6b 3b 0a 20 20 20 20 73 74 61 74 31 2e 70 53 65  k;.    stat1.pSe
9e50: 73 73 69 6f 6e 20 3d 20 70 53 65 73 73 69 6f 6e  ssion = pSession
9e60: 3b 0a 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e  ;.    pSession->
9e70: 68 6f 6f 6b 2e 70 43 74 78 20 3d 20 28 76 6f 69  hook.pCtx = (voi
9e80: 64 2a 29 26 73 74 61 74 31 3b 0a 20 20 20 20 70  d*)&stat1;.    p
9e90: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e  Session->hook.xN
9ea0: 65 77 20 3d 20 73 65 73 73 69 6f 6e 53 74 61 74  ew = sessionStat
9eb0: 31 4e 65 77 3b 0a 20 20 20 20 70 53 65 73 73 69  1New;.    pSessi
9ec0: 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f 6c 64 20 3d 20  on->hook.xOld = 
9ed0: 73 65 73 73 69 6f 6e 53 74 61 74 31 4f 6c 64 3b  sessionStat1Old;
9ee0: 0a 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68  .    pSession->h
9ef0: 6f 6f 6b 2e 78 43 6f 75 6e 74 20 3d 20 73 65 73  ook.xCount = ses
9f00: 73 69 6f 6e 53 74 61 74 31 43 6f 75 6e 74 3b 0a  sionStat1Count;.
9f10: 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f      pSession->ho
9f20: 6f 6b 2e 78 44 65 70 74 68 20 3d 20 73 65 73 73  ok.xDepth = sess
9f30: 69 6f 6e 53 74 61 74 31 44 65 70 74 68 3b 0a 20  ionStat1Depth;. 
9f40: 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
9f50: 3e 70 5a 65 72 6f 42 6c 6f 62 3d 3d 30 20 29 7b  >pZeroBlob==0 ){
9f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
9f70: 61 6c 75 65 20 2a 70 20 3d 20 73 71 6c 69 74 65  alue *p = sqlite
9f80: 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
9f90: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
9fa0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
9fb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9fc0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
9fd0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9fe0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
9ff0: 53 74 72 28 70 2c 20 30 2c 20 22 22 2c 20 30 2c  Str(p, 0, "", 0,
a000: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
a010: 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  .      pSession-
a020: 3e 70 5a 65 72 6f 42 6c 6f 62 20 3d 20 70 3b 0a  >pZeroBlob = p;.
a030: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a040: 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 68 61  Calculate the ha
a050: 73 68 2d 6b 65 79 20 66 6f 72 20 74 68 69 73 20  sh-key for this 
a060: 63 68 61 6e 67 65 2e 20 49 66 20 74 68 65 20 70  change. If the p
a070: 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68  rimary key of th
a080: 65 20 72 6f 77 0a 20 20 2a 2a 20 69 6e 63 6c 75  e row.  ** inclu
a090: 64 65 73 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  des a NULL value
a0a0: 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 53 75  , exit early. Su
a0b0: 63 68 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ch changes are i
a0c0: 67 6e 6f 72 65 64 20 62 79 20 74 68 65 0a 20 20  gnored by the.  
a0d0: 2a 2a 20 73 65 73 73 69 6f 6e 20 6d 6f 64 75 6c  ** session modul
a0e0: 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 65 73  e. */.  rc = ses
a0f0: 73 69 6f 6e 50 72 65 75 70 64 61 74 65 48 61 73  sionPreupdateHas
a100: 68 28 70 53 65 73 73 69 6f 6e 2c 20 70 54 61 62  h(pSession, pTab
a110: 2c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  , op==SQLITE_INS
a120: 45 52 54 2c 20 26 69 48 61 73 68 2c 20 26 62 4e  ERT, &iHash, &bN
a130: 75 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ull);.  if( rc!=
a140: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a150: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 0a 20 20 69   error_out;..  i
a160: 66 28 20 62 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  f( bNull==0 ){. 
a170: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
a180: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
a190: 61 6e 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f  an existing reco
a1a0: 72 64 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  rd for this row.
a1b0: 20 2a 2f 0a 20 20 20 20 53 65 73 73 69 6f 6e 43   */.    SessionC
a1c0: 68 61 6e 67 65 20 2a 70 43 3b 0a 20 20 20 20 66  hange *pC;.    f
a1d0: 6f 72 28 70 43 3d 70 54 61 62 2d 3e 61 70 43 68  or(pC=pTab->apCh
a1e0: 61 6e 67 65 5b 69 48 61 73 68 5d 3b 20 70 43 3b  ange[iHash]; pC;
a1f0: 20 70 43 3d 70 43 2d 3e 70 4e 65 78 74 29 7b 0a   pC=pC->pNext){.
a200: 20 20 20 20 20 20 69 66 28 20 73 65 73 73 69 6f        if( sessio
a210: 6e 50 72 65 75 70 64 61 74 65 45 71 75 61 6c 28  nPreupdateEqual(
a220: 70 53 65 73 73 69 6f 6e 2c 20 70 54 61 62 2c 20  pSession, pTab, 
a230: 70 43 2c 20 6f 70 29 20 29 20 62 72 65 61 6b 3b  pC, op) ) break;
a240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a250: 70 43 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  pC==0 ){.      /
a260: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
a270: 68 61 6e 67 65 20 6f 62 6a 65 63 74 20 63 6f 6e  hange object con
a280: 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 68 65 20  taining all the 
a290: 6f 6c 64 20 76 61 6c 75 65 73 20 28 69 66 0a 20  old values (if. 
a2a0: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
a2b0: 61 6e 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  an SQLITE_UPDATE
a2c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4c 45 54   or SQLITE_DELET
a2d0: 45 29 2c 20 6f 72 20 6a 75 73 74 20 74 68 65 20  E), or just the 
a2e0: 50 4b 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  PK.      ** valu
a2f0: 65 73 20 28 69 66 20 74 68 69 73 20 69 73 20 61  es (if this is a
a300: 6e 20 49 4e 53 45 52 54 29 2e 20 2a 2f 0a 20 20  n INSERT). */.  
a310: 20 20 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67      SessionChang
a320: 65 20 2a 70 43 68 61 6e 67 65 3b 20 2f 2a 20 4e  e *pChange; /* N
a330: 65 77 20 63 68 61 6e 67 65 20 6f 62 6a 65 63 74  ew change object
a340: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a350: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 20 20  3_int64 nByte;  
a360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
a370: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
a380: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
a3b0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 6f 6c  rate through col
a3c0: 75 6d 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20 20  umns */.  .     
a3d0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
a3e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3f0: 70 54 61 62 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a  pTab->nEntry++;.
a400: 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75    .      /* Figu
a410: 72 65 20 6f 75 74 20 68 6f 77 20 6c 61 72 67 65  re out how large
a420: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69   an allocation i
a430: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
a440: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
a450: 6f 66 28 53 65 73 73 69 6f 6e 43 68 61 6e 67 65  of(SessionChange
a460: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
a470: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
a480: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
a490: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 20 3d  lite3_value *p =
a4a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
a4b0: 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op!=SQLITE_INSER
a4c0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  T ){.          T
a4d0: 45 53 54 4f 4e 4c 59 28 69 6e 74 20 74 72 63 20  ESTONLY(int trc 
a4e0: 3d 20 29 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f  = ) pSession->ho
a4f0: 6f 6b 2e 78 4f 6c 64 28 70 53 65 73 73 69 6f 6e  ok.xOld(pSession
a500: 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 2c 20  ->hook.pCtx, i, 
a510: 26 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  &p);.          a
a520: 73 73 65 72 74 28 20 74 72 63 3d 3d 53 51 4c 49  ssert( trc==SQLI
a530: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
a540: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
a550: 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20  >abPK[i] ){.    
a560: 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 69        TESTONLY(i
a570: 6e 74 20 74 72 63 20 3d 20 29 20 70 53 65 73 73  nt trc = ) pSess
a580: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e 65 77 28 70  ion->hook.xNew(p
a590: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43  Session->hook.pC
a5a0: 74 78 2c 20 69 2c 20 26 70 29 3b 0a 20 20 20 20  tx, i, &p);.    
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 72        assert( tr
a5c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
a5d0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
a5e0: 20 20 20 2f 2a 20 54 68 69 73 20 6d 61 79 20 66     /* This may f
a5f0: 61 69 6c 20 69 66 20 53 51 4c 69 74 65 20 76 61  ail if SQLite va
a600: 6c 75 65 20 70 20 63 6f 6e 74 61 69 6e 73 20 61  lue p contains a
a610: 20 75 74 66 2d 31 36 20 73 74 72 69 6e 67 20 74   utf-16 string t
a620: 68 61 74 20 6d 75 73 74 0a 20 20 20 20 20 20 20  hat must.       
a630: 20 2a 2a 20 62 65 20 63 6f 6e 76 65 72 74 65 64   ** be converted
a640: 20 74 6f 20 75 74 66 2d 38 20 61 6e 64 20 61 6e   to utf-8 and an
a650: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
a660: 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
a670: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
a680: 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 69  = sessionSeriali
a690: 7a 65 56 61 6c 75 65 28 30 2c 20 70 2c 20 26 6e  zeValue(0, p, &n
a6a0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
a6b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a6c0: 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75   ) goto error_ou
a6d0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
a6e0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
a6f0: 74 68 65 20 63 68 61 6e 67 65 20 6f 62 6a 65 63  the change objec
a700: 74 20 2a 2f 0a 20 20 20 20 20 20 70 43 68 61 6e  t */.      pChan
a710: 67 65 20 3d 20 28 53 65 73 73 69 6f 6e 43 68 61  ge = (SessionCha
a720: 6e 67 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  nge *)sqlite3_ma
a730: 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
a740: 20 20 20 20 20 69 66 28 20 21 70 43 68 61 6e 67       if( !pChang
a750: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
a760: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
a770: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
a780: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 65  or_out;.      }e
a790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
a7a0: 73 65 74 28 70 43 68 61 6e 67 65 2c 20 30 2c 20  set(pChange, 0, 
a7b0: 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 43 68  sizeof(SessionCh
a7c0: 61 6e 67 65 29 29 3b 0a 20 20 20 20 20 20 20 20  ange));.        
a7d0: 70 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64  pChange->aRecord
a7e0: 20 3d 20 28 75 38 20 2a 29 26 70 43 68 61 6e 67   = (u8 *)&pChang
a7f0: 65 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e[1];.      }.  
a800: 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  .      /* Popula
a810: 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 6f 62  te the change ob
a820: 6a 65 63 74 2e 20 4e 6f 6e 65 20 6f 66 20 74 68  ject. None of th
a830: 65 20 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  e preupdate_old(
a840: 29 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 75  ),.      ** preu
a850: 70 64 61 74 65 5f 6e 65 77 28 29 20 6f 72 20 53  pdate_new() or S
a860: 65 72 69 61 6c 69 7a 65 56 61 6c 75 65 28 29 20  erializeValue() 
a870: 63 61 6c 6c 73 20 62 65 6c 6f 77 20 6d 61 79 20  calls below may 
a880: 66 61 69 6c 20 61 73 20 61 6c 6c 0a 20 20 20 20  fail as all.    
a890: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 76 61    ** required va
a8a0: 6c 75 65 73 20 61 6e 64 20 65 6e 63 6f 64 69 6e  lues and encodin
a8b0: 67 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  gs have already 
a8c0: 62 65 65 6e 20 63 61 63 68 65 64 20 69 6e 20 6d  been cached in m
a8d0: 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2a 20  emory..      ** 
a8e0: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
a8f0: 6c 65 20 66 6f 72 20 61 6e 20 4f 4f 4d 20 74 6f  le for an OOM to
a900: 20 6f 63 63 75 72 20 69 6e 20 74 68 69 73 20 62   occur in this b
a910: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  lock. */.      n
a920: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Byte = 0;.      
a930: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
a940: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
a950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
a960: 75 65 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20  ue *p = 0;.     
a970: 20 20 20 69 66 28 20 6f 70 21 3d 53 51 4c 49 54     if( op!=SQLIT
a980: 45 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20  E_INSERT ){.    
a990: 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
a9a0: 68 6f 6f 6b 2e 78 4f 6c 64 28 70 53 65 73 73 69  hook.xOld(pSessi
a9b0: 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69  on->hook.pCtx, i
a9c0: 2c 20 26 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , &p);.        }
a9d0: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
a9e0: 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  bPK[i] ){.      
a9f0: 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f      pSession->ho
aa00: 6f 6b 2e 78 4e 65 77 28 70 53 65 73 73 69 6f 6e  ok.xNew(pSession
aa10: 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 2c 20  ->hook.pCtx, i, 
aa20: 26 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  &p);.        }. 
aa30: 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 53 65         sessionSe
aa40: 72 69 61 6c 69 7a 65 56 61 6c 75 65 28 26 70 43  rializeValue(&pC
aa50: 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64 5b 6e  hange->aRecord[n
aa60: 42 79 74 65 5d 2c 20 70 2c 20 26 6e 42 79 74 65  Byte], p, &nByte
aa70: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
aa80: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 68 61    /* Add the cha
aa90: 6e 67 65 20 74 6f 20 74 68 65 20 68 61 73 68 2d  nge to the hash-
aaa0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  table */.      i
aab0: 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 62 49 6e  f( pSession->bIn
aac0: 64 69 72 65 63 74 20 7c 7c 20 70 53 65 73 73 69  direct || pSessi
aad0: 6f 6e 2d 3e 68 6f 6f 6b 2e 78 44 65 70 74 68 28  on->hook.xDepth(
aae0: 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70  pSession->hook.p
aaf0: 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ctx) ){.        
ab00: 70 43 68 61 6e 67 65 2d 3e 62 49 6e 64 69 72 65  pChange->bIndire
ab10: 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
ab20: 20 20 20 20 20 20 70 43 68 61 6e 67 65 2d 3e 6e        pChange->n
ab30: 52 65 63 6f 72 64 20 3d 20 6e 42 79 74 65 3b 0a  Record = nByte;.
ab40: 20 20 20 20 20 20 70 43 68 61 6e 67 65 2d 3e 6f        pChange->o
ab50: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 70 43  p = op;.      pC
ab60: 68 61 6e 67 65 2d 3e 70 4e 65 78 74 20 3d 20 70  hange->pNext = p
ab70: 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 5b 69 48  Tab->apChange[iH
ab80: 61 73 68 5d 3b 0a 20 20 20 20 20 20 70 54 61 62  ash];.      pTab
ab90: 2d 3e 61 70 43 68 61 6e 67 65 5b 69 48 61 73 68  ->apChange[iHash
aba0: 5d 20 3d 20 70 43 68 61 6e 67 65 3b 0a 0a 20 20  ] = pChange;..  
abb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e    }else if( pC->
abc0: 62 49 6e 64 69 72 65 63 74 20 29 7b 0a 20 20 20  bIndirect ){.   
abd0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 69     /* If the exi
abe0: 73 74 69 6e 67 20 63 68 61 6e 67 65 20 69 73 20  sting change is 
abf0: 63 6f 6e 73 69 64 65 72 65 64 20 22 69 6e 64 69  considered "indi
ac00: 72 65 63 74 22 2c 20 62 75 74 20 74 68 69 73 20  rect", but this 
ac10: 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  current.      **
ac20: 20 63 68 61 6e 67 65 20 69 73 20 22 64 69 72 65   change is "dire
ac30: 63 74 22 2c 20 6d 61 72 6b 20 74 68 65 20 63 68  ct", mark the ch
ac40: 61 6e 67 65 20 6f 62 6a 65 63 74 20 61 73 20 64  ange object as d
ac50: 69 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20  irect. */.      
ac60: 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f  if( pSession->ho
ac70: 6f 6b 2e 78 44 65 70 74 68 28 70 53 65 73 73 69  ok.xDepth(pSessi
ac80: 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 29 3d 3d  on->hook.pCtx)==
ac90: 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 53 65  0 .       && pSe
aca0: 73 73 69 6f 6e 2d 3e 62 49 6e 64 69 72 65 63 74  ssion->bIndirect
acb0: 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==0 .      ){.  
acc0: 20 20 20 20 20 20 70 43 2d 3e 62 49 6e 64 69 72        pC->bIndir
acd0: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ect = 0;.      }
ace0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
acf0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
ad00: 20 6f 63 63 75 72 72 65 64 2c 20 6d 61 72 6b 20   occurred, mark 
ad10: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
ad20: 63 74 20 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  ct as failed. */
ad30: 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69  . error_out:.  i
ad40: 66 28 20 70 54 61 62 2d 3e 62 53 74 61 74 31 20  f( pTab->bStat1 
ad50: 29 7b 0a 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  ){.    pSession-
ad60: 3e 68 6f 6f 6b 20 3d 20 73 74 61 74 31 2e 68 6f  >hook = stat1.ho
ad70: 6f 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ok;.  }.  if( rc
ad80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ad90: 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 72 63 20     pSession->rc 
ada0: 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  = rc;.  }.}..sta
adb0: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 46  tic int sessionF
adc0: 69 6e 64 54 61 62 6c 65 28 0a 20 20 73 71 6c 69  indTable(.  sqli
add0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
ade0: 73 73 69 6f 6e 2c 20 0a 20 20 63 6f 6e 73 74 20  ssion, .  const 
adf0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 53  char *zName,.  S
ae00: 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 2a 70 70  essionTable **pp
ae10: 54 61 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Tab.){.  int rc 
ae20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ae30: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
ae40: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
ae50: 29 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c  );.  SessionTabl
ae60: 65 20 2a 70 52 65 74 3b 0a 0a 20 20 2f 2a 20 53  e *pRet;..  /* S
ae70: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
ae80: 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  sting table */. 
ae90: 20 66 6f 72 28 70 52 65 74 3d 70 53 65 73 73 69   for(pRet=pSessi
aea0: 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20 70 52 65 74  on->pTable; pRet
aeb0: 3b 20 70 52 65 74 3d 70 52 65 74 2d 3e 70 4e 65  ; pRet=pRet->pNe
aec0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  xt){.    if( 0==
aed0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
aee0: 28 70 52 65 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  (pRet->zName, zN
aef0: 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 20 29 20  ame, nName+1) ) 
af00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
af10: 28 20 70 52 65 74 3d 3d 30 20 26 26 20 70 53 65  ( pRet==0 && pSe
af20: 73 73 69 6f 6e 2d 3e 62 41 75 74 6f 41 74 74 61  ssion->bAutoAtta
af30: 63 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ch ){.    /* If 
af40: 74 68 65 72 65 20 69 73 20 61 20 74 61 62 6c 65  there is a table
af50: 2d 66 69 6c 74 65 72 20 63 6f 6e 66 69 67 75 72  -filter configur
af60: 65 64 2c 20 69 6e 76 6f 6b 65 20 69 74 2e 20 49  ed, invoke it. I
af70: 66 20 69 74 20 72 65 74 75 72 6e 73 20 30 2c 0a  f it returns 0,.
af80: 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 75      ** do not au
af90: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 64 20  tomatically add 
afa0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 2a  the new table. *
afb0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 73 73 69  /.    if( pSessi
afc0: 6f 6e 2d 3e 78 54 61 62 6c 65 46 69 6c 74 65 72  on->xTableFilter
afd0: 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 70 53 65 73  ==0.     || pSes
afe0: 73 69 6f 6e 2d 3e 78 54 61 62 6c 65 46 69 6c 74  sion->xTableFilt
aff0: 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 46 69  er(pSession->pFi
b000: 6c 74 65 72 43 74 78 2c 20 7a 4e 61 6d 65 29 20  lterCtx, zName) 
b010: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
b020: 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
b030: 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
b040: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
b050: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b060: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  OK ){.        fo
b070: 72 28 70 52 65 74 3d 70 53 65 73 73 69 6f 6e 2d  r(pRet=pSession-
b080: 3e 70 54 61 62 6c 65 3b 20 70 52 65 74 2d 3e 70  >pTable; pRet->p
b090: 4e 65 78 74 3b 20 70 52 65 74 3d 70 52 65 74 2d  Next; pRet=pRet-
b0a0: 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >pNext);.       
b0b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
b0c0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 52 65  te3_strnicmp(pRe
b0d0: 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  t->zName, zName,
b0e0: 20 6e 4e 61 6d 65 2b 31 29 20 29 3b 0a 20 20 20   nName+1) );.   
b0f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
b100: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
b110: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 3d  LITE_OK || pRet=
b120: 3d 30 20 29 3b 0a 20 20 2a 70 70 54 61 62 20 3d  =0 );.  *ppTab =
b130: 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
b140: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
b150: 20 27 70 72 65 2d 75 70 64 61 74 65 27 20 68 6f   'pre-update' ho
b160: 6f 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ok registered by
b170: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 77 69 74   this module wit
b180: 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  h SQLite databas
b190: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
b1a0: 69 64 20 78 50 72 65 55 70 64 61 74 65 28 0a 20  id xPreUpdate(. 
b1b0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 69 72   /* Copy of thir
b1e0: 64 20 61 72 67 20 74 6f 20 70 72 65 75 70 64 61  d arg to preupda
b1f0: 74 65 5f 68 6f 6f 6b 28 29 20 2a 2f 0a 20 20 73  te_hook() */.  s
b200: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b220: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
b230: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  e */.  int op,  
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
b260: 5f 55 50 44 41 54 45 2c 20 44 45 4c 45 54 45 20  _UPDATE, DELETE 
b270: 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 63  or INSERT */.  c
b280: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 62 2c 20  har const *zDb, 
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2a0: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
b2b0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
b2c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
b2d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
b2e0: 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  me */.  sqlite3_
b2f0: 69 6e 74 36 34 20 69 4b 65 79 31 2c 20 20 20 20  int64 iKey1,    
b300: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
b310: 20 6f 66 20 72 6f 77 20 61 62 6f 75 74 20 74 6f   of row about to
b320: 20 62 65 20 64 65 6c 65 74 65 64 2f 75 70 64 61   be deleted/upda
b330: 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ted */.  sqlite3
b340: 5f 69 6e 74 36 34 20 69 4b 65 79 32 20 20 20 20  _int64 iKey2    
b350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
b360: 72 6f 77 69 64 20 76 61 6c 75 65 20 28 66 6f 72  rowid value (for
b370: 20 61 20 72 6f 77 69 64 20 55 50 44 41 54 45 29   a rowid UPDATE)
b380: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b390: 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
b3a0: 6f 6e 3b 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20  on;.  int nDb = 
b3b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b3c0: 7a 44 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  zDb);..  assert(
b3d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b3e0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
b3f0: 3b 0a 0a 20 20 66 6f 72 28 70 53 65 73 73 69 6f  ;..  for(pSessio
b400: 6e 3d 28 73 71 6c 69 74 65 33 5f 73 65 73 73 69  n=(sqlite3_sessi
b410: 6f 6e 20 2a 29 70 43 74 78 3b 20 70 53 65 73 73  on *)pCtx; pSess
b420: 69 6f 6e 3b 20 70 53 65 73 73 69 6f 6e 3d 70 53  ion; pSession=pS
b430: 65 73 73 69 6f 6e 2d 3e 70 4e 65 78 74 29 7b 0a  ession->pNext){.
b440: 20 20 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65      SessionTable
b450: 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20   *pTab;..    /* 
b460: 49 66 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20  If this session 
b470: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 61  is attached to a
b480: 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62   different datab
b490: 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ase ("main", "te
b4a0: 6d 70 22 20 0a 20 20 20 20 2a 2a 20 65 74 63 2e  mp" .    ** etc.
b4b0: 29 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 6e  ), or if it is n
b4c0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 65 6e 61  ot currently ena
b4d0: 62 6c 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  bled, there is n
b4e0: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 53 6b  othing to do. Sk
b4f0: 69 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ip .    ** to th
b500: 65 20 6e 65 78 74 20 73 65 73 73 69 6f 6e 20 6f  e next session o
b510: 62 6a 65 63 74 20 61 74 74 61 63 68 65 64 20 74  bject attached t
b520: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  o this database.
b530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 73   */.    if( pSes
b540: 73 69 6f 6e 2d 3e 62 45 6e 61 62 6c 65 3d 3d 30  sion->bEnable==0
b550: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b560: 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 72   if( pSession->r
b570: 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  c ) continue;.  
b580: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
b590: 72 6e 69 63 6d 70 28 7a 44 62 2c 20 70 53 65 73  rnicmp(zDb, pSes
b5a0: 73 69 6f 6e 2d 3e 7a 44 62 2c 20 6e 44 62 2b 31  sion->zDb, nDb+1
b5b0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  ) ) continue;.. 
b5c0: 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 72 63 20     pSession->rc 
b5d0: 3d 20 73 65 73 73 69 6f 6e 46 69 6e 64 54 61 62  = sessionFindTab
b5e0: 6c 65 28 70 53 65 73 73 69 6f 6e 2c 20 7a 4e 61  le(pSession, zNa
b5f0: 6d 65 2c 20 26 70 54 61 62 29 3b 0a 20 20 20 20  me, &pTab);.    
b600: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
b610: 20 20 61 73 73 65 72 74 28 20 70 53 65 73 73 69    assert( pSessi
b620: 6f 6e 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  on->rc==SQLITE_O
b630: 4b 20 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69  K );.      sessi
b640: 6f 6e 50 72 65 75 70 64 61 74 65 4f 6e 65 43 68  onPreupdateOneCh
b650: 61 6e 67 65 28 6f 70 2c 20 70 53 65 73 73 69 6f  ange(op, pSessio
b660: 6e 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  n, pTab);.      
b670: 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
b680: 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20  PDATE ){.       
b690: 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61 74   sessionPreupdat
b6a0: 65 4f 6e 65 43 68 61 6e 67 65 28 53 51 4c 49 54  eOneChange(SQLIT
b6b0: 45 5f 49 4e 53 45 52 54 2c 20 70 53 65 73 73 69  E_INSERT, pSessi
b6c0: 6f 6e 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  on, pTab);.     
b6d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
b6e0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 65 2d 75 70  /*.** The pre-up
b6f0: 64 61 74 65 20 68 6f 6f 6b 20 69 6d 70 6c 65 6d  date hook implem
b700: 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  entations..*/.st
b710: 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
b720: 50 72 65 75 70 64 61 74 65 4f 6c 64 28 76 6f 69  PreupdateOld(voi
b730: 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 69 56 61  d *pCtx, int iVa
b740: 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  l, sqlite3_value
b750: 20 2a 2a 70 70 56 61 6c 29 7b 0a 20 20 72 65 74   **ppVal){.  ret
b760: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 75  urn sqlite3_preu
b770: 70 64 61 74 65 5f 6f 6c 64 28 28 73 71 6c 69 74  pdate_old((sqlit
b780: 65 33 2a 29 70 43 74 78 2c 20 69 56 61 6c 2c 20  e3*)pCtx, iVal, 
b790: 70 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  ppVal);.}.static
b7a0: 20 69 6e 74 20 73 65 73 73 69 6f 6e 50 72 65 75   int sessionPreu
b7b0: 70 64 61 74 65 4e 65 77 28 76 6f 69 64 20 2a 70  pdateNew(void *p
b7c0: 43 74 78 2c 20 69 6e 74 20 69 56 61 6c 2c 20 73  Ctx, int iVal, s
b7d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
b7e0: 70 56 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  pVal){.  return 
b7f0: 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
b800: 65 5f 6e 65 77 28 28 73 71 6c 69 74 65 33 2a 29  e_new((sqlite3*)
b810: 70 43 74 78 2c 20 69 56 61 6c 2c 20 70 70 56 61  pCtx, iVal, ppVa
b820: 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  l);.}.static int
b830: 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61 74   sessionPreupdat
b840: 65 43 6f 75 6e 74 28 76 6f 69 64 20 2a 70 43 74  eCount(void *pCt
b850: 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  x){.  return sql
b860: 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 63  ite3_preupdate_c
b870: 6f 75 6e 74 28 28 73 71 6c 69 74 65 33 2a 29 70  ount((sqlite3*)p
b880: 43 74 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Ctx);.}.static i
b890: 6e 74 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64  nt sessionPreupd
b8a0: 61 74 65 44 65 70 74 68 28 76 6f 69 64 20 2a 70  ateDepth(void *p
b8b0: 43 74 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Ctx){.  return s
b8c0: 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
b8d0: 5f 64 65 70 74 68 28 28 73 71 6c 69 74 65 33 2a  _depth((sqlite3*
b8e0: 29 70 43 74 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )pCtx);.}../*.**
b8f0: 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 70 72 65   Install the pre
b900: 2d 75 70 64 61 74 65 20 68 6f 6f 6b 73 20 6f 6e  -update hooks on
b910: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a   the session obj
b920: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
b930: 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65  e only.** argume
b940: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
b950: 69 64 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64  id sessionPreupd
b960: 61 74 65 48 6f 6f 6b 73 28 0a 20 20 73 71 6c 69  ateHooks(.  sqli
b970: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
b980: 73 73 69 6f 6e 0a 29 7b 0a 20 20 70 53 65 73 73  ssion.){.  pSess
b990: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 20 3d  ion->hook.pCtx =
b9a0: 20 28 76 6f 69 64 2a 29 70 53 65 73 73 69 6f 6e   (void*)pSession
b9b0: 2d 3e 64 62 3b 0a 20 20 70 53 65 73 73 69 6f 6e  ->db;.  pSession
b9c0: 2d 3e 68 6f 6f 6b 2e 78 4f 6c 64 20 3d 20 73 65  ->hook.xOld = se
b9d0: 73 73 69 6f 6e 50 72 65 75 70 64 61 74 65 4f 6c  ssionPreupdateOl
b9e0: 64 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68  d;.  pSession->h
b9f0: 6f 6f 6b 2e 78 4e 65 77 20 3d 20 73 65 73 73 69  ook.xNew = sessi
ba00: 6f 6e 50 72 65 75 70 64 61 74 65 4e 65 77 3b 0a  onPreupdateNew;.
ba10: 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b    pSession->hook
ba20: 2e 78 43 6f 75 6e 74 20 3d 20 73 65 73 73 69 6f  .xCount = sessio
ba30: 6e 50 72 65 75 70 64 61 74 65 43 6f 75 6e 74 3b  nPreupdateCount;
ba40: 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  .  pSession->hoo
ba50: 6b 2e 78 44 65 70 74 68 20 3d 20 73 65 73 73 69  k.xDepth = sessi
ba60: 6f 6e 50 72 65 75 70 64 61 74 65 44 65 70 74 68  onPreupdateDepth
ba70: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
ba80: 75 63 74 20 53 65 73 73 69 6f 6e 44 69 66 66 43  uct SessionDiffC
ba90: 74 78 20 53 65 73 73 69 6f 6e 44 69 66 66 43 74  tx SessionDiffCt
baa0: 78 3b 0a 73 74 72 75 63 74 20 53 65 73 73 69 6f  x;.struct Sessio
bab0: 6e 44 69 66 66 43 74 78 20 7b 0a 20 20 73 71 6c  nDiffCtx {.  sql
bac0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
bad0: 3b 0a 20 20 69 6e 74 20 6e 4f 6c 64 4f 66 66 3b  ;.  int nOldOff;
bae0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  .};../*.** The d
baf0: 69 66 66 20 68 6f 6f 6b 20 69 6d 70 6c 65 6d 65  iff hook impleme
bb00: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  ntations..*/.sta
bb10: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 44  tic int sessionD
bb20: 69 66 66 4f 6c 64 28 76 6f 69 64 20 2a 70 43 74  iffOld(void *pCt
bb30: 78 2c 20 69 6e 74 20 69 56 61 6c 2c 20 73 71 6c  x, int iVal, sql
bb40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56  ite3_value **ppV
bb50: 61 6c 29 7b 0a 20 20 53 65 73 73 69 6f 6e 44 69  al){.  SessionDi
bb60: 66 66 43 74 78 20 2a 70 20 3d 20 28 53 65 73 73  ffCtx *p = (Sess
bb70: 69 6f 6e 44 69 66 66 43 74 78 2a 29 70 43 74 78  ionDiffCtx*)pCtx
bb80: 3b 0a 20 20 2a 70 70 56 61 6c 20 3d 20 73 71 6c  ;.  *ppVal = sql
bb90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
bba0: 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 56 61 6c  e(p->pStmt, iVal
bbb0: 2b 70 2d 3e 6e 4f 6c 64 4f 66 66 29 3b 0a 20 20  +p->nOldOff);.  
bbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bbd0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
bbe0: 65 73 73 69 6f 6e 44 69 66 66 4e 65 77 28 76 6f  essionDiffNew(vo
bbf0: 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 69 56  id *pCtx, int iV
bc00: 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  al, sqlite3_valu
bc10: 65 20 2a 2a 70 70 56 61 6c 29 7b 0a 20 20 53 65  e **ppVal){.  Se
bc20: 73 73 69 6f 6e 44 69 66 66 43 74 78 20 2a 70 20  ssionDiffCtx *p 
bc30: 3d 20 28 53 65 73 73 69 6f 6e 44 69 66 66 43 74  = (SessionDiffCt
bc40: 78 2a 29 70 43 74 78 3b 0a 20 20 2a 70 70 56 61  x*)pCtx;.  *ppVa
bc50: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
bc60: 6d 6e 5f 76 61 6c 75 65 28 70 2d 3e 70 53 74 6d  mn_value(p->pStm
bc70: 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 72 65 74  t, iVal);.   ret
bc80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bc90: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
bca0: 69 6f 6e 44 69 66 66 43 6f 75 6e 74 28 76 6f 69  ionDiffCount(voi
bcb0: 64 20 2a 70 43 74 78 29 7b 0a 20 20 53 65 73 73  d *pCtx){.  Sess
bcc0: 69 6f 6e 44 69 66 66 43 74 78 20 2a 70 20 3d 20  ionDiffCtx *p = 
bcd0: 28 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78 2a  (SessionDiffCtx*
bce0: 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e 20  )pCtx;.  return 
bcf0: 70 2d 3e 6e 4f 6c 64 4f 66 66 20 3f 20 70 2d 3e  p->nOldOff ? p->
bd00: 6e 4f 6c 64 4f 66 66 20 3a 20 73 71 6c 69 74 65  nOldOff : sqlite
bd10: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
bd20: 2d 3e 70 53 74 6d 74 29 3b 0a 7d 0a 73 74 61 74  ->pStmt);.}.stat
bd30: 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 44 69  ic int sessionDi
bd40: 66 66 44 65 70 74 68 28 76 6f 69 64 20 2a 70 43  ffDepth(void *pC
bd50: 74 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  tx){.  return 0;
bd60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6c  .}../*.** Instal
bd70: 6c 20 74 68 65 20 64 69 66 66 20 68 6f 6f 6b 73  l the diff hooks
bd80: 20 6f 6e 20 74 68 65 20 73 65 73 73 69 6f 6e 20   on the session 
bd90: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
bda0: 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67   the only.** arg
bdb0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
bdc0: 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 44 69 66   void sessionDif
bdd0: 66 48 6f 6f 6b 73 28 0a 20 20 73 71 6c 69 74 65  fHooks(.  sqlite
bde0: 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  3_session *pSess
bdf0: 69 6f 6e 2c 0a 20 20 53 65 73 73 69 6f 6e 44 69  ion,.  SessionDi
be00: 66 66 43 74 78 20 2a 70 44 69 66 66 43 74 78 0a  ffCtx *pDiffCtx.
be10: 29 7b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68  ){.  pSession->h
be20: 6f 6f 6b 2e 70 43 74 78 20 3d 20 28 76 6f 69 64  ook.pCtx = (void
be30: 2a 29 70 44 69 66 66 43 74 78 3b 0a 20 20 70 53  *)pDiffCtx;.  pS
be40: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f 6c  ession->hook.xOl
be50: 64 20 3d 20 73 65 73 73 69 6f 6e 44 69 66 66 4f  d = sessionDiffO
be60: 6c 64 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e  ld;.  pSession->
be70: 68 6f 6f 6b 2e 78 4e 65 77 20 3d 20 73 65 73 73  hook.xNew = sess
be80: 69 6f 6e 44 69 66 66 4e 65 77 3b 0a 20 20 70 53  ionDiffNew;.  pS
be90: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 43 6f  ession->hook.xCo
bea0: 75 6e 74 20 3d 20 73 65 73 73 69 6f 6e 44 69 66  unt = sessionDif
beb0: 66 43 6f 75 6e 74 3b 0a 20 20 70 53 65 73 73 69  fCount;.  pSessi
bec0: 6f 6e 2d 3e 68 6f 6f 6b 2e 78 44 65 70 74 68 20  on->hook.xDepth 
bed0: 3d 20 73 65 73 73 69 6f 6e 44 69 66 66 44 65 70  = sessionDiffDep
bee0: 74 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  th;.}..static ch
bef0: 61 72 20 2a 73 65 73 73 69 6f 6e 45 78 70 72 43  ar *sessionExprC
bf00: 6f 6d 70 61 72 65 50 4b 28 0a 20 20 69 6e 74 20  omparePK(.  int 
bf10: 6e 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nCol,.  const ch
bf20: 61 72 20 2a 7a 44 62 31 2c 20 63 6f 6e 73 74 20  ar *zDb1, const 
bf30: 63 68 61 72 20 2a 7a 44 62 32 2c 20 0a 20 20 63  char *zDb2, .  c
bf40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
bf50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
bf60: 61 7a 43 6f 6c 2c 20 75 38 20 2a 61 62 50 4b 0a  azCol, u8 *abPK.
bf70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
bf80: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
bf90: 20 22 22 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65   "";.  char *zRe
bfa0: 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  t = 0;..  for(i=
bfb0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
bfc0: 0a 20 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d  .    if( abPK[i]
bfd0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
bfe0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
bff0: 28 22 25 7a 25 73 5c 22 25 77 5c 22 2e 5c 22 25  ("%z%s\"%w\".\"%
c000: 77 5c 22 2e 5c 22 25 77 5c 22 3d 5c 22 25 77 5c  w\".\"%w\"=\"%w\
c010: 22 2e 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22  ".\"%w\".\"%w\""
c020: 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74  ,.          zRet
c030: 2c 20 7a 53 65 70 2c 20 7a 44 62 31 2c 20 7a 54  , zSep, zDb1, zT
c040: 61 62 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 44  ab, azCol[i], zD
c050: 62 32 2c 20 7a 54 61 62 2c 20 61 7a 43 6f 6c 5b  b2, zTab, azCol[
c060: 69 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  i].      );.    
c070: 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22    zSep = " AND "
c080: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74  ;.      if( zRet
c090: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
c0a0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c0b0: 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   zRet;.}..static
c0c0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 45 78   char *sessionEx
c0d0: 70 72 43 6f 6d 70 61 72 65 4f 74 68 65 72 28 0a  prCompareOther(.
c0e0: 20 20 69 6e 74 20 6e 43 6f 6c 2c 0a 20 20 63 6f    int nCol,.  co
c0f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 31 2c 20  nst char *zDb1, 
c100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 32  const char *zDb2
c110: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
c120: 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  *zTab,.  const c
c130: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 75 38 20  har **azCol, u8 
c140: 2a 61 62 50 4b 0a 29 7b 0a 20 20 69 6e 74 20 69  *abPK.){.  int i
c150: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c160: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 63 68 61  zSep = "";.  cha
c170: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69  r *zRet = 0;.  i
c180: 6e 74 20 62 48 61 76 65 20 3d 20 30 3b 0a 0a 20  nt bHave = 0;.. 
c190: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
c1a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
c1b0: 61 62 50 4b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  abPK[i]==0 ){.  
c1c0: 20 20 20 20 62 48 61 76 65 20 3d 20 31 3b 0a 20      bHave = 1;. 
c1d0: 20 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69       zRet = sqli
c1e0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c1f0: 20 20 20 20 20 20 20 22 25 7a 25 73 5c 22 25 77         "%z%s\"%w
c200: 5c 22 2e 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22  \".\"%w\".\"%w\"
c210: 20 49 53 20 4e 4f 54 20 5c 22 25 77 5c 22 2e 5c   IS NOT \"%w\".\
c220: 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c 0a 20  "%w\".\"%w\"",. 
c230: 20 20 20 20 20 20 20 20 20 7a 52 65 74 2c 20 7a           zRet, z
c240: 53 65 70 2c 20 7a 44 62 31 2c 20 7a 54 61 62 2c  Sep, zDb1, zTab,
c250: 20 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 44 62 32 2c   azCol[i], zDb2,
c260: 20 7a 54 61 62 2c 20 61 7a 43 6f 6c 5b 69 5d 0a   zTab, azCol[i].
c270: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
c280: 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20  Sep = " OR ";.  
c290: 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
c2a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
c2b0: 20 7d 0a 0a 20 20 69 66 28 20 62 48 61 76 65 3d   }..  if( bHave=
c2c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
c2d0: 28 20 7a 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20  ( zRet==0 );.   
c2e0: 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   zRet = sqlite3_
c2f0: 6d 70 72 69 6e 74 66 28 22 30 22 29 3b 0a 20 20  mprintf("0");.  
c300: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74  }..  return zRet
c310: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
c320: 20 2a 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 46   *sessionSelectF
c330: 69 6e 64 4e 65 77 28 0a 20 20 69 6e 74 20 6e 43  indNew(.  int nC
c340: 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol,.  const char
c350: 20 2a 7a 44 62 31 2c 20 20 20 20 20 20 2f 2a 20   *zDb1,      /* 
c360: 50 69 63 6b 20 72 6f 77 73 20 69 6e 20 74 68 69  Pick rows in thi
c370: 73 20 64 62 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63  s db only */.  c
c380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 32 2c  onst char *zDb2,
c390: 20 20 20 20 20 20 2f 2a 20 42 75 74 20 6e 6f 74        /* But not
c3a0: 20 69 6e 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a   in this one */.
c3b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
c3c0: 62 6c 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  bl,      /* Tabl
c3d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
c3e0: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 0a 29 7b  t char *zExpr.){
c3f0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
c400: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c410: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a  .      "SELECT *
c420: 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25   FROM \"%w\".\"%
c430: 77 5c 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58  w\" WHERE NOT EX
c440: 49 53 54 53 20 28 22 0a 20 20 20 20 20 20 22 20  ISTS (".      " 
c450: 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 5c   SELECT 1 FROM \
c460: 22 25 77 5c 22 2e 5c 22 25 77 5c 22 20 57 48 45  "%w\".\"%w\" WHE
c470: 52 45 20 25 73 22 0a 20 20 20 20 20 20 22 29 22  RE %s".      ")"
c480: 2c 0a 20 20 20 20 20 20 7a 44 62 31 2c 20 7a 54  ,.      zDb1, zT
c490: 62 6c 2c 20 7a 44 62 32 2c 20 7a 54 62 6c 2c 20  bl, zDb2, zTbl, 
c4a0: 7a 45 78 70 72 0a 20 20 29 3b 0a 20 20 72 65 74  zExpr.  );.  ret
c4b0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn zRet;.}..sta
c4c0: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 44  tic int sessionD
c4d0: 69 66 66 46 69 6e 64 4e 65 77 28 0a 20 20 69 6e  iffFindNew(.  in
c4e0: 74 20 6f 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f  t op,.  sqlite3_
c4f0: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
c500: 6e 2c 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c  n,.  SessionTabl
c510: 65 20 2a 70 54 61 62 2c 0a 20 20 63 6f 6e 73 74  e *pTab,.  const
c520: 20 63 68 61 72 20 2a 7a 44 62 31 2c 0a 20 20 63   char *zDb1,.  c
c530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 32 2c  onst char *zDb2,
c540: 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 72 0a 29  .  char *zExpr.)
c550: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c560: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
c570: 7a 53 74 6d 74 20 3d 20 73 65 73 73 69 6f 6e 53  zStmt = sessionS
c580: 65 6c 65 63 74 46 69 6e 64 4e 65 77 28 70 54 61  electFindNew(pTa
c590: 62 2d 3e 6e 43 6f 6c 2c 20 7a 44 62 31 2c 20 7a  b->nCol, zDb1, z
c5a0: 44 62 32 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db2, pTab->zName
c5b0: 2c 7a 45 78 70 72 29 3b 0a 0a 20 20 69 66 28 20  ,zExpr);..  if( 
c5c0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c5d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c5e0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
c5f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c600: 74 6d 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  tmt;.    rc = sq
c610: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 53  lite3_prepare(pS
c620: 65 73 73 69 6f 6e 2d 3e 64 62 2c 20 7a 53 74 6d  ession->db, zStm
c630: 74 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  t, -1, &pStmt, 0
c640: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
c650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c660: 20 20 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78    SessionDiffCtx
c670: 20 2a 70 44 69 66 66 43 74 78 20 3d 20 28 53 65   *pDiffCtx = (Se
c680: 73 73 69 6f 6e 44 69 66 66 43 74 78 2a 29 70 53  ssionDiffCtx*)pS
c690: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74  ession->hook.pCt
c6a0: 78 3b 0a 20 20 20 20 20 20 70 44 69 66 66 43 74  x;.      pDiffCt
c6b0: 78 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  x->pStmt = pStmt
c6c0: 3b 0a 20 20 20 20 20 20 70 44 69 66 66 43 74 78  ;.      pDiffCtx
c6d0: 2d 3e 6e 4f 6c 64 4f 66 66 20 3d 20 30 3b 0a 20  ->nOldOff = 0;. 
c6e0: 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49       while( SQLI
c6f0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
c700: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
c710: 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 50 72         sessionPr
c720: 65 75 70 64 61 74 65 4f 6e 65 43 68 61 6e 67 65  eupdateOneChange
c730: 28 6f 70 2c 20 70 53 65 73 73 69 6f 6e 2c 20 70  (op, pSession, p
c740: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
c750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c760: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
c770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c780: 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b  te3_free(zStmt);
c790: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
c7a0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
c7b0: 20 73 65 73 73 69 6f 6e 44 69 66 66 46 69 6e 64   sessionDiffFind
c7c0: 4d 6f 64 69 66 69 65 64 28 0a 20 20 73 71 6c 69  Modified(.  sqli
c7d0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
c7e0: 73 73 69 6f 6e 2c 20 0a 20 20 53 65 73 73 69 6f  ssion, .  Sessio
c7f0: 6e 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 0a 20  nTable *pTab, . 
c800: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72   const char *zFr
c810: 6f 6d 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  om, .  const cha
c820: 72 20 2a 7a 45 78 70 72 0a 29 7b 0a 20 20 69 6e  r *zExpr.){.  in
c830: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c840: 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 72  ;..  char *zExpr
c850: 32 20 3d 20 73 65 73 73 69 6f 6e 45 78 70 72 43  2 = sessionExprC
c860: 6f 6d 70 61 72 65 4f 74 68 65 72 28 70 54 61 62  ompareOther(pTab
c870: 2d 3e 6e 43 6f 6c 2c 0a 20 20 20 20 20 20 70 53  ->nCol,.      pS
c880: 65 73 73 69 6f 6e 2d 3e 7a 44 62 2c 20 7a 46 72  ession->zDb, zFr
c890: 6f 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  om, pTab->zName,
c8a0: 20 70 54 61 62 2d 3e 61 7a 43 6f 6c 2c 20 70 54   pTab->azCol, pT
c8b0: 61 62 2d 3e 61 62 50 4b 0a 20 20 29 3b 0a 20 20  ab->abPK.  );.  
c8c0: 69 66 28 20 7a 45 78 70 72 32 3d 3d 30 20 29 7b  if( zExpr2==0 ){
c8d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c8e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
c8f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
c900: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
c910: 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
c920: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
c930: 22 2e 5c 22 25 77 5c 22 2c 20 5c 22 25 77 5c 22  ".\"%w\", \"%w\"
c940: 2e 5c 22 25 77 5c 22 20 57 48 45 52 45 20 25 73  .\"%w\" WHERE %s
c950: 20 41 4e 44 20 28 25 7a 29 22 2c 0a 20 20 20 20   AND (%z)",.    
c960: 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 44      pSession->zD
c970: 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  b, pTab->zName, 
c980: 7a 46 72 6f 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61  zFrom, pTab->zNa
c990: 6d 65 2c 20 7a 45 78 70 72 2c 20 7a 45 78 70 72  me, zExpr, zExpr
c9a0: 32 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  2.    );.    if(
c9b0: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
c9c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
c9d0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
c9e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
c9f0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
ca00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
ca10: 72 65 70 61 72 65 28 70 53 65 73 73 69 6f 6e 2d  repare(pSession-
ca20: 3e 64 62 2c 20 7a 53 74 6d 74 2c 20 2d 31 2c 20  >db, zStmt, -1, 
ca30: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 0a 20 20 20  &pStmt, 0);..   
ca40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ca50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ca60: 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78 20 2a  SessionDiffCtx *
ca70: 70 44 69 66 66 43 74 78 20 3d 20 28 53 65 73 73  pDiffCtx = (Sess
ca80: 69 6f 6e 44 69 66 66 43 74 78 2a 29 70 53 65 73  ionDiffCtx*)pSes
ca90: 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 3b  sion->hook.pCtx;
caa0: 0a 20 20 20 20 20 20 20 20 70 44 69 66 66 43 74  .        pDiffCt
cab0: 78 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  x->pStmt = pStmt
cac0: 3b 0a 20 20 20 20 20 20 20 20 70 44 69 66 66 43  ;.        pDiffC
cad0: 74 78 2d 3e 6e 4f 6c 64 4f 66 66 20 3d 20 70 54  tx->nOldOff = pT
cae0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
caf0: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
cb00: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
cb10: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
cb20: 20 20 20 20 20 20 73 65 73 73 69 6f 6e 50 72 65        sessionPre
cb30: 75 70 64 61 74 65 4f 6e 65 43 68 61 6e 67 65 28  updateOneChange(
cb40: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2c 20 70  SQLITE_UPDATE, p
cb50: 53 65 73 73 69 6f 6e 2c 20 70 54 61 62 29 3b 0a  Session, pTab);.
cb60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
cb80: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
cb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
cba0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74  lite3_free(zStmt
cbb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
cbc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
cbd0: 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  t sqlite3session
cbe0: 5f 64 69 66 66 28 0a 20 20 73 71 6c 69 74 65 33  _diff(.  sqlite3
cbf0: 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
cc00: 6f 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on,.  const char
cc10: 20 2a 7a 46 72 6f 6d 2c 0a 20 20 63 6f 6e 73 74   *zFrom,.  const
cc20: 20 63 68 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 63   char *zTbl,.  c
cc30: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 0a 29  har **pzErrMsg.)
cc40: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
cc50: 7a 44 62 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e  zDb = pSession->
cc60: 7a 44 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  zDb;.  int rc = 
cc70: 70 53 65 73 73 69 6f 6e 2d 3e 72 63 3b 0a 20 20  pSession->rc;.  
cc80: 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78 20 64  SessionDiffCtx d
cc90: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 64 2c 20  ;..  memset(&d, 
cca0: 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20  0, sizeof(d));. 
ccb0: 20 73 65 73 73 69 6f 6e 44 69 66 66 48 6f 6f 6b   sessionDiffHook
ccc0: 73 28 70 53 65 73 73 69 6f 6e 2c 20 26 64 29 3b  s(pSession, &d);
ccd0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
cce0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
ccf0: 64 62 5f 6d 75 74 65 78 28 70 53 65 73 73 69 6f  db_mutex(pSessio
cd00: 6e 2d 3e 64 62 29 29 3b 0a 20 20 69 66 28 20 70  n->db));.  if( p
cd10: 7a 45 72 72 4d 73 67 20 29 20 2a 70 7a 45 72 72  zErrMsg ) *pzErr
cd20: 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Msg = 0;.  if( r
cd30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cd40: 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 72 20      char *zExpr 
cd50: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
cd60: 20 2a 64 62 20 3d 20 70 53 65 73 73 69 6f 6e 2d   *db = pSession-
cd70: 3e 64 62 3b 0a 20 20 20 20 53 65 73 73 69 6f 6e  >db;.    Session
cd80: 54 61 62 6c 65 20 2a 70 54 6f 3b 20 20 20 20 20  Table *pTo;     
cd90: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
cda0: 7a 54 62 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  zTbl */..    /* 
cdb0: 4c 6f 63 61 74 65 20 61 6e 64 20 69 66 20 6e 65  Locate and if ne
cdc0: 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
cdd0: 7a 65 20 74 68 65 20 74 61 72 67 65 74 20 74 61  ze the target ta
cde0: 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ble object */.  
cdf0: 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 46 69    rc = sessionFi
ce00: 6e 64 54 61 62 6c 65 28 70 53 65 73 73 69 6f 6e  ndTable(pSession
ce10: 2c 20 7a 54 62 6c 2c 20 26 70 54 6f 29 3b 0a 20  , zTbl, &pTo);. 
ce20: 20 20 20 69 66 28 20 70 54 6f 3d 3d 30 20 29 20     if( pTo==0 ) 
ce30: 67 6f 74 6f 20 64 69 66 66 5f 6f 75 74 3b 0a 20  goto diff_out;. 
ce40: 20 20 20 69 66 28 20 73 65 73 73 69 6f 6e 49 6e     if( sessionIn
ce50: 69 74 54 61 62 6c 65 28 70 53 65 73 73 69 6f 6e  itTable(pSession
ce60: 2c 20 70 54 6f 29 20 29 7b 0a 20 20 20 20 20 20  , pTo) ){.      
ce70: 72 63 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 72  rc = pSession->r
ce80: 63 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 69  c;.      goto di
ce90: 66 66 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ff_out;.    }.. 
cea0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
ceb0: 74 61 62 6c 65 20 73 63 68 65 6d 61 73 20 6d 61  table schemas ma
cec0: 74 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  tch */.    if( r
ced0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cee0: 20 20 20 20 20 20 69 6e 74 20 62 48 61 73 50 6b        int bHasPk
cef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
cf00: 62 4d 69 73 6d 61 74 63 68 20 3d 20 30 3b 0a 20  bMismatch = 0;. 
cf10: 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20       int nCol;  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 7a   /* Columns in z
cf40: 46 72 6f 6d 2e 7a 54 62 6c 20 2a 2f 0a 20 20 20  From.zTbl */.   
cf50: 20 20 20 75 38 20 2a 61 62 50 4b 3b 0a 20 20 20     u8 *abPK;.   
cf60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a     const char **
cf70: 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  azCol = 0;.     
cf80: 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 54 61 62   rc = sessionTab
cf90: 6c 65 49 6e 66 6f 28 64 62 2c 20 7a 46 72 6f 6d  leInfo(db, zFrom
cfa0: 2c 20 7a 54 62 6c 2c 20 26 6e 43 6f 6c 2c 20 30  , zTbl, &nCol, 0
cfb0: 2c 20 26 61 7a 43 6f 6c 2c 20 26 61 62 50 4b 29  , &azCol, &abPK)
cfc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
cfd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cfe0: 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6e 43       if( pTo->nC
cff0: 6f 6c 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ol!=nCol ){.    
d000: 20 20 20 20 20 20 62 4d 69 73 6d 61 74 63 68 20        bMismatch 
d010: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
d020: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
d030: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t i;.          f
d040: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
d050: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d060: 20 20 69 66 28 20 70 54 6f 2d 3e 61 62 50 4b 5b    if( pTo->abPK[
d070: 69 5d 21 3d 61 62 50 4b 5b 69 5d 20 29 20 62 4d  i]!=abPK[i] ) bM
d080: 69 73 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  ismatch = 1;.   
d090: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
d0a0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 43  ite3_stricmp(azC
d0b0: 6f 6c 5b 69 5d 2c 20 70 54 6f 2d 3e 61 7a 43 6f  ol[i], pTo->azCo
d0c0: 6c 5b 69 5d 29 20 29 20 62 4d 69 73 6d 61 74 63  l[i]) ) bMismatc
d0d0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
d0e0: 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d 20 29     if( abPK[i] )
d0f0: 20 62 48 61 73 50 6b 20 3d 20 31 3b 0a 20 20 20   bHasPk = 1;.   
d100: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d110: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d120: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63   sqlite3_free((c
d130: 68 61 72 2a 29 61 7a 43 6f 6c 29 3b 0a 20 20 20  har*)azCol);.   
d140: 20 20 20 69 66 28 20 62 4d 69 73 6d 61 74 63 68     if( bMismatch
d150: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d160: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
d170: 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
d180: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
d190: 66 28 22 74 61 62 6c 65 20 73 63 68 65 6d 61 73  f("table schemas
d1a0: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 22 29 3b   do not match");
d1b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
d1d0: 43 48 45 4d 41 3b 0a 20 20 20 20 20 20 7d 0a 20  CHEMA;.      }. 
d1e0: 20 20 20 20 20 69 66 28 20 62 48 61 73 50 6b 3d       if( bHasPk=
d1f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
d200: 20 49 67 6e 6f 72 65 20 74 61 62 6c 65 73 20 77   Ignore tables w
d210: 69 74 68 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b  ith no primary k
d220: 65 79 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  eys */.        g
d230: 6f 74 6f 20 64 69 66 66 5f 6f 75 74 3b 0a 20 20  oto diff_out;.  
d240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d250: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d260: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 7a 45 78 70  OK ){.      zExp
d270: 72 20 3d 20 73 65 73 73 69 6f 6e 45 78 70 72 43  r = sessionExprC
d280: 6f 6d 70 61 72 65 50 4b 28 70 54 6f 2d 3e 6e 43  omparePK(pTo->nC
d290: 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  ol, .          z
d2a0: 44 62 2c 20 7a 46 72 6f 6d 2c 20 70 54 6f 2d 3e  Db, zFrom, pTo->
d2b0: 7a 4e 61 6d 65 2c 20 70 54 6f 2d 3e 61 7a 43 6f  zName, pTo->azCo
d2c0: 6c 2c 20 70 54 6f 2d 3e 61 62 50 4b 0a 20 20 20  l, pTo->abPK.   
d2d0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
d2e0: 20 2f 2a 20 46 69 6e 64 20 6e 65 77 20 72 6f 77   /* Find new row
d2f0: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
d300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d310: 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
d320: 44 69 66 66 46 69 6e 64 4e 65 77 28 53 51 4c 49  DiffFindNew(SQLI
d330: 54 45 5f 49 4e 53 45 52 54 2c 20 70 53 65 73 73  TE_INSERT, pSess
d340: 69 6f 6e 2c 20 70 54 6f 2c 20 7a 44 62 2c 20 7a  ion, pTo, zDb, z
d350: 46 72 6f 6d 2c 20 7a 45 78 70 72 29 3b 0a 20 20  From, zExpr);.  
d360: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
d370: 20 6f 6c 64 20 72 6f 77 73 20 2a 2f 0a 20 20 20   old rows */.   
d380: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d390: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
d3a0: 20 73 65 73 73 69 6f 6e 44 69 66 66 46 69 6e 64   sessionDiffFind
d3b0: 4e 65 77 28 53 51 4c 49 54 45 5f 44 45 4c 45 54  New(SQLITE_DELET
d3c0: 45 2c 20 70 53 65 73 73 69 6f 6e 2c 20 70 54 6f  E, pSession, pTo
d3d0: 2c 20 7a 46 72 6f 6d 2c 20 7a 44 62 2c 20 7a 45  , zFrom, zDb, zE
d3e0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  xpr);.    }..   
d3f0: 20 2f 2a 20 46 69 6e 64 20 6d 6f 64 69 66 69 65   /* Find modifie
d400: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 69 66  d rows */.    if
d410: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d420: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
d430: 73 73 69 6f 6e 44 69 66 66 46 69 6e 64 4d 6f 64  ssionDiffFindMod
d440: 69 66 69 65 64 28 70 53 65 73 73 69 6f 6e 2c 20  ified(pSession, 
d450: 70 54 6f 2c 20 7a 46 72 6f 6d 2c 20 7a 45 78 70  pTo, zFrom, zExp
d460: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  r);.    }..    s
d470: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78 70  qlite3_free(zExp
d480: 72 29 3b 0a 20 20 7d 0a 0a 20 64 69 66 66 5f 6f  r);.  }.. diff_o
d490: 75 74 3a 0a 20 20 73 65 73 73 69 6f 6e 50 72 65  ut:.  sessionPre
d4a0: 75 70 64 61 74 65 48 6f 6f 6b 73 28 70 53 65 73  updateHooks(pSes
d4b0: 73 69 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  sion);.  sqlite3
d4c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
d4d0: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 70 53  ite3_db_mutex(pS
d4e0: 65 73 73 69 6f 6e 2d 3e 64 62 29 29 3b 0a 20 20  ession->db));.  
d4f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d500: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 73 65 73  .** Create a ses
d510: 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20 54 68 69  sion object. Thi
d520: 73 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  s session object
d530: 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 63 68 61   will record cha
d540: 6e 67 65 73 20 74 6f 0a 2a 2a 20 64 61 74 61 62  nges to.** datab
d550: 61 73 65 20 7a 44 62 20 61 74 74 61 63 68 65 64  ase zDb attached
d560: 20 74 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   to connection d
d570: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
d580: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
d590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
d5c0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
d5d0: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
d5f0: 6d 65 20 6f 66 20 64 62 20 28 65 2e 67 2e 20 22  me of db (e.g. "
d600: 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 73 71 6c 69  main") */.  sqli
d610: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70 70  te3_session **pp
d620: 53 65 73 73 69 6f 6e 20 20 20 20 20 2f 2a 20 4f  Session     /* O
d630: 55 54 3a 20 4e 65 77 20 73 65 73 73 69 6f 6e 20  UT: New session 
d640: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
d650: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
d660: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  pNew;          /
d670: 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
d680: 64 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  d session object
d690: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65   */.  sqlite3_se
d6a0: 73 73 69 6f 6e 20 2a 70 4f 6c 64 3b 20 20 20 20  ssion *pOld;    
d6b0: 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e        /* Session
d6c0: 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
d6d0: 61 74 74 61 63 68 65 64 20 74 6f 20 64 62 20 2a  attached to db *
d6e0: 2f 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20 73 71  /.  int nDb = sq
d6f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 44  lite3Strlen30(zD
d700: 62 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  b); /* Length of
d710: 20 7a 44 62 20 69 6e 20 62 79 74 65 73 20 2a 2f   zDb in bytes */
d720: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
d730: 6f 75 74 70 75 74 20 76 61 6c 75 65 20 69 6e 20  output value in 
d740: 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
d750: 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 53 65  curs. */.  *ppSe
d760: 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ssion = 0;..  /*
d770: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
d780: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 73  pulate the new s
d790: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e 20 2a  ession object. *
d7a0: 2f 0a 20 20 70 4e 65 77 20 3d 20 28 73 71 6c 69  /.  pNew = (sqli
d7b0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 29 73 71  te3_session *)sq
d7c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
d7d0: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73 65  izeof(sqlite3_se
d7e0: 73 73 69 6f 6e 29 20 2b 20 6e 44 62 20 2b 20 31  ssion) + nDb + 1
d7f0: 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29  );.  if( !pNew )
d800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d810: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
d820: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  New, 0, sizeof(s
d830: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 29 29  qlite3_session))
d840: 3b 0a 20 20 70 4e 65 77 2d 3e 64 62 20 3d 20 64  ;.  pNew->db = d
d850: 62 3b 0a 20 20 70 4e 65 77 2d 3e 7a 44 62 20 3d  b;.  pNew->zDb =
d860: 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31   (char *)&pNew[1
d870: 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 45 6e 61 62  ];.  pNew->bEnab
d880: 6c 65 20 3d 20 31 3b 0a 20 20 6d 65 6d 63 70 79  le = 1;.  memcpy
d890: 28 70 4e 65 77 2d 3e 7a 44 62 2c 20 7a 44 62 2c  (pNew->zDb, zDb,
d8a0: 20 6e 44 62 2b 31 29 3b 0a 20 20 73 65 73 73 69   nDb+1);.  sessi
d8b0: 6f 6e 50 72 65 75 70 64 61 74 65 48 6f 6f 6b 73  onPreupdateHooks
d8c0: 28 70 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 41 64  (pNew);..  /* Ad
d8d0: 64 20 74 68 65 20 6e 65 77 20 73 65 73 73 69 6f  d the new sessio
d8e0: 6e 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  n object to the 
d8f0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73  linked list of s
d900: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 0a  ession objects .
d910: 20 20 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f    ** attached to
d920: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
d930: 20 24 64 62 2e 20 44 6f 20 74 68 69 73 20 75 6e   $db. Do this un
d940: 64 65 72 20 74 68 65 20 63 6f 76 65 72 20 6f 66  der the cover of
d950: 20 74 68 65 20 64 62 0a 20 20 2a 2a 20 68 61 6e   the db.  ** han
d960: 64 6c 65 20 6d 75 74 65 78 2e 20 20 2a 2f 0a 20  dle mutex.  */. 
d970: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d980: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f  nter(sqlite3_db_
d990: 6d 75 74 65 78 28 64 62 29 29 3b 0a 20 20 70 4f  mutex(db));.  pO
d9a0: 6c 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 65  ld = (sqlite3_se
d9b0: 73 73 69 6f 6e 2a 29 73 71 6c 69 74 65 33 5f 70  ssion*)sqlite3_p
d9c0: 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62  reupdate_hook(db
d9d0: 2c 20 78 50 72 65 55 70 64 61 74 65 2c 20 28 76  , xPreUpdate, (v
d9e0: 6f 69 64 2a 29 70 4e 65 77 29 3b 0a 20 20 70 4e  oid*)pNew);.  pN
d9f0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 6c 64  ew->pNext = pOld
da00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
da10: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
da20: 64 62 5f 6d 75 74 65 78 28 64 62 29 29 3b 0a 0a  db_mutex(db));..
da30: 20 20 2a 70 70 53 65 73 73 69 6f 6e 20 3d 20 70    *ppSession = p
da40: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  New;.  return SQ
da50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
da60: 2a 20 46 72 65 65 20 74 68 65 20 6c 69 73 74 20  * Free the list 
da70: 6f 66 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 73  of table objects
da80: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
da90: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
daa0: 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
dab0: 66 20 74 68 65 20 63 68 61 6e 67 65 64 2d 72 6f  f the changed-ro
dac0: 77 73 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ws hash tables a
dad0: 72 65 20 61 6c 73 6f 20 64 65 6c 65 74 65 64 2e  re also deleted.
dae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
daf0: 73 65 73 73 69 6f 6e 44 65 6c 65 74 65 54 61 62  sessionDeleteTab
db00: 6c 65 28 53 65 73 73 69 6f 6e 54 61 62 6c 65 20  le(SessionTable 
db10: 2a 70 4c 69 73 74 29 7b 0a 20 20 53 65 73 73 69  *pList){.  Sessi
db20: 6f 6e 54 61 62 6c 65 20 2a 70 4e 65 78 74 3b 0a  onTable *pNext;.
db30: 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
db40: 70 54 61 62 3b 0a 0a 20 20 66 6f 72 28 70 54 61  pTab;..  for(pTa
db50: 62 3d 70 4c 69 73 74 3b 20 70 54 61 62 3b 20 70  b=pList; pTab; p
db60: 54 61 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Tab=pNext){.    
db70: 69 6e 74 20 69 3b 0a 20 20 20 20 70 4e 65 78 74  int i;.    pNext
db80: 20 3d 20 70 54 61 62 2d 3e 70 4e 65 78 74 3b 0a   = pTab->pNext;.
db90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dba0: 54 61 62 2d 3e 6e 43 68 61 6e 67 65 3b 20 69 2b  Tab->nChange; i+
dbb0: 2b 29 7b 0a 20 20 20 20 20 20 53 65 73 73 69 6f  +){.      Sessio
dbc0: 6e 43 68 61 6e 67 65 20 2a 70 3b 0a 20 20 20 20  nChange *p;.    
dbd0: 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20    SessionChange 
dbe0: 2a 70 4e 65 78 74 43 68 61 6e 67 65 3b 0a 20 20  *pNextChange;.  
dbf0: 20 20 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e      for(p=pTab->
dc00: 61 70 43 68 61 6e 67 65 5b 69 5d 3b 20 70 3b 20  apChange[i]; p; 
dc10: 70 3d 70 4e 65 78 74 43 68 61 6e 67 65 29 7b 0a  p=pNextChange){.
dc20: 20 20 20 20 20 20 20 20 70 4e 65 78 74 43 68 61          pNextCha
dc30: 6e 67 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  nge = p->pNext;.
dc40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dc50: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  free(p);.      }
dc60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
dc70: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
dc80: 54 61 62 2d 3e 61 7a 43 6f 6c 29 3b 20 20 2f 2a  Tab->azCol);  /*
dc90: 20 63 61 73 74 20 77 6f 72 6b 73 20 61 72 6f 75   cast works arou
dca0: 6e 64 20 56 43 2b 2b 20 62 75 67 20 2a 2f 0a 20  nd VC++ bug */. 
dcb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
dcc0: 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 29 3b  pTab->apChange);
dcd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dce0: 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(pTab);.  }.}..
dcf0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 73  /*.** Delete a s
dd00: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 72  ession object pr
dd10: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
dd20: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
dd30: 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 29  session_create()
dd40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
dd50: 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28  3session_delete(
dd60: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
dd70: 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 73 71  *pSession){.  sq
dd80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 65 73  lite3 *db = pSes
dd90: 73 69 6f 6e 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  sion->db;.  sqli
dda0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 48 65  te3_session *pHe
ddb0: 61 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  ad;.  sqlite3_se
ddc0: 73 73 69 6f 6e 20 2a 2a 70 70 3b 0a 0a 20 20 2f  ssion **pp;..  /
ddd0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 73 65 73  * Unlink the ses
dde0: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6c 69  sion from the li
ddf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 65 73  nked list of ses
de00: 73 69 6f 6e 73 20 61 74 74 61 63 68 65 64 20 74  sions attached t
de10: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
de20: 61 73 65 20 68 61 6e 64 6c 65 2e 20 48 6f 6c 64  ase handle. Hold
de30: 20 74 68 65 20 64 62 20 6d 75 74 65 78 20 77 68   the db mutex wh
de40: 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2e 20 20 2a  ile doing so.  *
de50: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
de60: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
de70: 64 62 5f 6d 75 74 65 78 28 64 62 29 29 3b 0a 20  db_mutex(db));. 
de80: 20 70 48 65 61 64 20 3d 20 28 73 71 6c 69 74 65   pHead = (sqlite
de90: 33 5f 73 65 73 73 69 6f 6e 2a 29 73 71 6c 69 74  3_session*)sqlit
dea0: 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  e3_preupdate_hoo
deb0: 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 66  k(db, 0, 0);.  f
dec0: 6f 72 28 70 70 3d 26 70 48 65 61 64 3b 20 41 4c  or(pp=&pHead; AL
ded0: 57 41 59 53 28 28 2a 70 70 29 21 3d 30 29 3b 20  WAYS((*pp)!=0); 
dee0: 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
def0: 74 29 29 7b 0a 20 20 20 20 69 66 28 20 28 2a 70  t)){.    if( (*p
df00: 70 29 3d 3d 70 53 65 73 73 69 6f 6e 20 29 7b 0a  p)==pSession ){.
df10: 20 20 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70        *pp = (*pp
df20: 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  )->pNext;.      
df30: 69 66 28 20 70 48 65 61 64 20 29 20 73 71 6c 69  if( pHead ) sqli
df40: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
df50: 6f 6b 28 64 62 2c 20 78 50 72 65 55 70 64 61 74  ok(db, xPreUpdat
df60: 65 2c 20 28 76 6f 69 64 2a 29 70 48 65 61 64 29  e, (void*)pHead)
df70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
df80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
df90: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
dfa0: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
dfb0: 64 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  db));.  sqlite3V
dfc0: 61 6c 75 65 46 72 65 65 28 70 53 65 73 73 69 6f  alueFree(pSessio
dfd0: 6e 2d 3e 70 5a 65 72 6f 42 6c 6f 62 29 3b 0a 0a  n->pZeroBlob);..
dfe0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
dff0: 61 74 74 61 63 68 65 64 20 74 61 62 6c 65 20 6f  attached table o
e000: 62 6a 65 63 74 73 2e 20 41 6e 64 20 74 68 65 20  bjects. And the 
e010: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 69  contents of thei
e020: 72 20 0a 20 20 2a 2a 20 61 73 73 6f 63 69 61 74  r .  ** associat
e030: 65 64 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 20  ed hash-tables. 
e040: 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 44 65 6c 65  */.  sessionDele
e050: 74 65 54 61 62 6c 65 28 70 53 65 73 73 69 6f 6e  teTable(pSession
e060: 2d 3e 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  ->pTable);..  /*
e070: 20 46 72 65 65 20 74 68 65 20 73 65 73 73 69 6f   Free the sessio
e080: 6e 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  n object itself.
e090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
e0a0: 65 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 7d 0a  ee(pSession);.}.
e0b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 74 61 62  ./*.** Set a tab
e0c0: 6c 65 20 66 69 6c 74 65 72 20 6f 6e 20 61 20 53  le filter on a S
e0d0: 65 73 73 69 6f 6e 20 4f 62 6a 65 63 74 2e 0a 2a  ession Object..*
e0e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 73 65  /.void sqlite3se
e0f0: 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
e100: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  er(.  sqlite3_se
e110: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
e120: 20 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72   .  int(*xFilter
e130: 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63  )(void*, const c
e140: 68 61 72 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  har*),.  void *p
e150: 43 74 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Ctx             
e160: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
e170: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
e180: 64 20 74 6f 20 78 46 69 6c 74 65 72 20 2a 2f 0a  d to xFilter */.
e190: 29 7b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 62  ){.  pSession->b
e1a0: 41 75 74 6f 41 74 74 61 63 68 20 3d 20 31 3b 0a  AutoAttach = 1;.
e1b0: 20 20 70 53 65 73 73 69 6f 6e 2d 3e 70 46 69 6c    pSession->pFil
e1c0: 74 65 72 43 74 78 20 3d 20 70 43 74 78 3b 0a 20  terCtx = pCtx;. 
e1d0: 20 70 53 65 73 73 69 6f 6e 2d 3e 78 54 61 62 6c   pSession->xTabl
e1e0: 65 46 69 6c 74 65 72 20 3d 20 78 46 69 6c 74 65  eFilter = xFilte
e1f0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  r;.}../*.** Atta
e200: 63 68 20 61 20 74 61 62 6c 65 20 74 6f 20 61 20  ch a table to a 
e210: 73 65 73 73 69 6f 6e 2e 20 41 6c 6c 20 73 75 62  session. All sub
e220: 73 65 71 75 65 6e 74 20 63 68 61 6e 67 65 73 20  sequent changes 
e230: 6d 61 64 65 20 74 6f 20 74 68 65 20 74 61 62 6c  made to the tabl
e240: 65 0a 2a 2a 20 77 68 69 6c 65 20 74 68 65 20 73  e.** while the s
e250: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 73  ession object is
e260: 20 65 6e 61 62 6c 65 64 20 77 69 6c 6c 20 62 65   enabled will be
e270: 20 72 65 63 6f 72 64 65 64 2e 0a 2a 2a 0a 2a 2a   recorded..**.**
e280: 20 4f 6e 6c 79 20 74 61 62 6c 65 73 20 74 68 61   Only tables tha
e290: 74 20 68 61 76 65 20 61 20 50 52 49 4d 41 52 59  t have a PRIMARY
e2a0: 20 4b 45 59 20 64 65 66 69 6e 65 64 20 6d 61 79   KEY defined may
e2b0: 20 62 65 20 61 74 74 61 63 68 65 64 2e 20 49 74   be attached. It
e2c0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6d 61 74   does.** not mat
e2d0: 74 65 72 20 69 66 20 74 68 65 20 50 52 49 4d 41  ter if the PRIMA
e2e0: 52 59 20 4b 45 59 20 69 73 20 61 6e 20 22 49 4e  RY KEY is an "IN
e2f0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
e300: 59 22 20 28 72 6f 77 69 64 20 61 6c 69 61 73 29  Y" (rowid alias)
e310: 0a 2a 2a 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 69  .** or not..*/.i
e320: 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
e330: 6e 5f 61 74 74 61 63 68 28 0a 20 20 73 71 6c 69  n_attach(.  sqli
e340: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65  te3_session *pSe
e350: 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 53  ssion,      /* S
e360: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ession object */
e370: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e380: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
e390: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
e3a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
e3b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
e3c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e3d0: 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  er(sqlite3_db_mu
e3e0: 74 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62  tex(pSession->db
e3f0: 29 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4e 61 6d  ));..  if( !zNam
e400: 65 20 29 7b 0a 20 20 20 20 70 53 65 73 73 69 6f  e ){.    pSessio
e410: 6e 2d 3e 62 41 75 74 6f 41 74 74 61 63 68 20 3d  n->bAutoAttach =
e420: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
e430: 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70   SessionTable *p
e440: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tab;           /
e450: 2a 20 4e 65 77 20 74 61 62 6c 65 20 6f 62 6a 65  * New table obje
e460: 63 74 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ct (if required)
e470: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d   */.    int nNam
e480: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e4a0: 6f 66 20 62 79 74 65 73 20 69 6e 20 73 74 72 69  of bytes in stri
e4b0: 6e 67 20 7a 4e 61 6d 65 20 2a 2f 0a 0a 20 20 20  ng zName */..   
e4c0: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
e4d0: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
e4e0: 20 65 6e 74 72 79 2e 20 49 66 20 6f 6e 65 20 69   entry. If one i
e4f0: 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 63 61  s found, this ca
e500: 6c 6c 20 69 73 0a 20 20 20 20 2a 2a 20 61 20 6e  ll is.    ** a n
e510: 6f 2d 6f 70 2e 20 52 65 74 75 72 6e 20 65 61 72  o-op. Return ear
e520: 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65  ly. */.    nName
e530: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e540: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
e550: 6f 72 28 70 54 61 62 3d 70 53 65 73 73 69 6f 6e  or(pTab=pSession
e560: 2d 3e 70 54 61 62 6c 65 3b 20 70 54 61 62 3b 20  ->pTable; pTab; 
e570: 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e 65 78 74  pTab=pTab->pNext
e580: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
e590: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
e5a0: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  (pTab->zName, zN
e5b0: 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 20 29 20  ame, nName+1) ) 
e5c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e5d0: 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a 20    if( !pTab ){. 
e5e0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
e5f0: 20 6e 65 77 20 53 65 73 73 69 6f 6e 54 61 62 6c   new SessionTabl
e600: 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  e object. */.   
e610: 20 20 20 70 54 61 62 20 3d 20 28 53 65 73 73 69     pTab = (Sessi
e620: 6f 6e 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65  onTable *)sqlite
e630: 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
e640: 66 28 53 65 73 73 69 6f 6e 54 61 62 6c 65 29 20  f(SessionTable) 
e650: 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  + nName + 1);.  
e660: 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 7b      if( !pTab ){
e670: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
e680: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e6a0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
e6b0: 20 6e 65 77 20 53 65 73 73 69 6f 6e 54 61 62 6c   new SessionTabl
e6c0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6c 69 6e  e object and lin
e6d0: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
e6e0: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  st..        ** T
e6f0: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 6d 75  he new object mu
e700: 73 74 20 62 65 20 6c 69 6e 6b 65 64 20 6f 6e 74  st be linked ont
e710: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
e720: 20 6c 69 73 74 2c 20 6e 6f 74 20 0a 20 20 20 20   list, not .    
e730: 20 20 20 20 2a 2a 20 73 69 6d 70 6c 79 20 61 64      ** simply ad
e740: 64 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  ded to the start
e750: 20 6f 66 20 69 74 20 69 6e 20 6f 72 64 65 72 20   of it in order 
e760: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
e770: 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ables.        **
e780: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 63   appear in the c
e790: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 77 68 65  orrect order whe
e7a0: 6e 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  n a changeset or
e7b0: 20 70 61 74 63 68 73 65 74 20 69 73 0a 20 20 20   patchset is.   
e7c0: 20 20 20 20 20 2a 2a 20 65 76 65 6e 74 75 61 6c       ** eventual
e7d0: 6c 79 20 67 65 6e 65 72 61 74 65 64 2e 20 2a 2f  ly generated. */
e7e0: 0a 20 20 20 20 20 20 20 20 53 65 73 73 69 6f 6e  .        Session
e7f0: 54 61 62 6c 65 20 2a 2a 70 70 54 61 62 3b 0a 20  Table **ppTab;. 
e800: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
e810: 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ab, 0, sizeof(Se
e820: 73 73 69 6f 6e 54 61 62 6c 65 29 29 3b 0a 20 20  ssionTable));.  
e830: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
e840: 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 54 61  e = (char *)&pTa
e850: 62 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  b[1];.        me
e860: 6d 63 70 79 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  mcpy(pTab->zName
e870: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
e880: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
e890: 70 54 61 62 3d 26 70 53 65 73 73 69 6f 6e 2d 3e  pTab=&pSession->
e8a0: 70 54 61 62 6c 65 3b 20 2a 70 70 54 61 62 3b 20  pTable; *ppTab; 
e8b0: 70 70 54 61 62 3d 26 28 2a 70 70 54 61 62 29 2d  ppTab=&(*ppTab)-
e8c0: 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >pNext);.       
e8d0: 20 2a 70 70 54 61 62 20 3d 20 70 54 61 62 3b 0a   *ppTab = pTab;.
e8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e8f0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
e900: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
e910: 5f 64 62 5f 6d 75 74 65 78 28 70 53 65 73 73 69  _db_mutex(pSessi
e920: 6f 6e 2d 3e 64 62 29 29 3b 0a 20 20 72 65 74 75  on->db));.  retu
e930: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e940: 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 72  Ensure that ther
e950: 65 20 69 73 20 72 6f 6f 6d 20 69 6e 20 74 68 65  e is room in the
e960: 20 62 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e   buffer to appen
e970: 64 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  d nByte bytes of
e980: 20 64 61 74 61 2e 0a 2a 2a 20 49 66 20 6e 6f 74   data..** If not
e990: 2c 20 75 73 65 20 73 71 6c 69 74 65 33 5f 72 65  , use sqlite3_re
e9a0: 61 6c 6c 6f 63 28 29 20 74 6f 20 67 72 6f 77 20  alloc() to grow 
e9b0: 74 68 65 20 62 75 66 66 65 72 20 73 6f 20 74 68  the buffer so th
e9c0: 61 74 20 74 68 65 72 65 20 69 73 2e 0a 2a 2a 0a  at there is..**.
e9d0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
e9e0: 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 4f  , return zero. O
e9f0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
ea00: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
ea10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
ea20: 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c   set *pRc to SQL
ea30: 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 72 65  ITE_NOMEM and re
ea40: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
ea50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
ea60: 73 69 6f 6e 42 75 66 66 65 72 47 72 6f 77 28 53  sionBufferGrow(S
ea70: 65 73 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c  essionBuffer *p,
ea80: 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 2c 20 69   size_t nByte, i
ea90: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28 20  nt *pRc){.  if( 
eaa0: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
eab0: 26 26 20 28 73 69 7a 65 5f 74 29 28 70 2d 3e 6e  && (size_t)(p->n
eac0: 41 6c 6c 6f 63 2d 70 2d 3e 6e 42 75 66 29 3c 6e  Alloc-p->nBuf)<n
ead0: 42 79 74 65 20 29 7b 0a 20 20 20 20 75 38 20 2a  Byte ){.    u8 *
eae0: 61 4e 65 77 3b 0a 20 20 20 20 69 36 34 20 6e 4e  aNew;.    i64 nN
eaf0: 65 77 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3f  ew = p->nAlloc ?
eb00: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3a 20 31 32 38   p->nAlloc : 128
eb10: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
eb20: 20 6e 4e 65 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a   nNew = nNew*2;.
eb30: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 6e 4e 65      }while( (nNe
eb40: 77 2d 70 2d 3e 6e 42 75 66 29 3c 6e 42 79 74 65  w-p->nBuf)<nByte
eb50: 20 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20   );..    aNew = 
eb60: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  (u8 *)sqlite3_re
eb70: 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 42 75 66 2c  alloc64(p->aBuf,
eb80: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   nNew);.    if( 
eb90: 30 3d 3d 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  0==aNew ){.     
eba0: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
ebb0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
ebc0: 0a 20 20 20 20 20 20 70 2d 3e 61 42 75 66 20 3d  .      p->aBuf =
ebd0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e   aNew;.      p->
ebe0: 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  nAlloc = nNew;. 
ebf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ec00: 6e 20 28 2a 70 52 63 21 3d 53 51 4c 49 54 45 5f  n (*pRc!=SQLITE_
ec10: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  OK);.}../*.** Ap
ec20: 70 65 6e 64 20 74 68 65 20 76 61 6c 75 65 20 70  pend the value p
ec30: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ec40: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
ec50: 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
ec60: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
ec70: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
ec80: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
ec90: 70 20 69 66 20 2a 70 52 63 20 69 73 20 6e 6f 6e  p if *pRc is non
eca0: 2d 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 69 73  -zero when it is
ecb0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65   called..** Othe
ecc0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
ecd0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20  or occurs, *pRc 
ece0: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c  is set to an SQL
ecf0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  ite error code.*
ed00: 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
ed10: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
ed20: 69 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64  id sessionAppend
ed30: 56 61 6c 75 65 28 53 65 73 73 69 6f 6e 42 75 66  Value(SessionBuf
ed40: 66 65 72 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  fer *p, sqlite3_
ed50: 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 69 6e 74  value *pVal, int
ed60: 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74 20 72 63   *pRc){.  int rc
ed70: 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66 28 20 72   = *pRc;.  if( r
ed80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ed90: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
eda0: 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20  4 nByte = 0;.   
edb0: 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 53 65 72   rc = sessionSer
edc0: 69 61 6c 69 7a 65 56 61 6c 75 65 28 30 2c 20 70  ializeValue(0, p
edd0: 56 61 6c 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  Val, &nByte);.  
ede0: 20 20 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47    sessionBufferG
edf0: 72 6f 77 28 70 2c 20 6e 42 79 74 65 2c 20 26 72  row(p, nByte, &r
ee00: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  c);.    if( rc==
ee10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ee20: 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 53     rc = sessionS
ee30: 65 72 69 61 6c 69 7a 65 56 61 6c 75 65 28 26 70  erializeValue(&p
ee40: 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66 5d 2c  ->aBuf[p->nBuf],
ee50: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
ee60: 20 70 2d 3e 6e 42 75 66 20 2b 3d 20 6e 42 79 74   p->nBuf += nByt
ee70: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
ee80: 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
ee90: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
eea0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eeb0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70  is a no-op if *p
eec0: 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
eed0: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
eee0: 69 74 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64  it is .** called
eef0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70  . Otherwise, app
ef00: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
ef10: 65 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  e to the buffer.
ef20: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f   .**.** If an OO
ef30: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
ef40: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 73 65 74 20  ncountered, set 
ef50: 2a 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e  *pRc to SQLITE_N
ef60: 4f 4d 45 4d 20 62 65 66 6f 72 65 0a 2a 2a 20 72  OMEM before.** r
ef70: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
ef80: 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
ef90: 41 70 70 65 6e 64 42 79 74 65 28 53 65 73 73 69  AppendByte(Sessi
efa0: 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20 75 38 20  onBuffer *p, u8 
efb0: 76 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  v, int *pRc){.  
efc0: 69 66 28 20 30 3d 3d 73 65 73 73 69 6f 6e 42 75  if( 0==sessionBu
efd0: 66 66 65 72 47 72 6f 77 28 70 2c 20 31 2c 20 70  fferGrow(p, 1, p
efe0: 52 63 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 42  Rc) ){.    p->aB
eff0: 75 66 5b 70 2d 3e 6e 42 75 66 2b 2b 5d 20 3d 20  uf[p->nBuf++] = 
f000: 76 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v;.  }.}../*.** 
f010: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
f020: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63   a no-op if *pRc
f030: 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53   is other than S
f040: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74  QLITE_OK when it
f050: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20   is .** called. 
f060: 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 65 6e  Otherwise, appen
f070: 64 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e  d a single varin
f080: 74 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  t to the buffer.
f090: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f   .**.** If an OO
f0a0: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
f0b0: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 73 65 74 20  ncountered, set 
f0c0: 2a 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e  *pRc to SQLITE_N
f0d0: 4f 4d 45 4d 20 62 65 66 6f 72 65 0a 2a 2a 20 72  OMEM before.** r
f0e0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
f0f0: 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
f100: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 53 65 73  AppendVarint(Ses
f110: 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20 69  sionBuffer *p, i
f120: 6e 74 20 76 2c 20 69 6e 74 20 2a 70 52 63 29 7b  nt v, int *pRc){
f130: 0a 20 20 69 66 28 20 30 3d 3d 73 65 73 73 69 6f  .  if( 0==sessio
f140: 6e 42 75 66 66 65 72 47 72 6f 77 28 70 2c 20 39  nBufferGrow(p, 9
f150: 2c 20 70 52 63 29 20 29 7b 0a 20 20 20 20 70 2d  , pRc) ){.    p-
f160: 3e 6e 42 75 66 20 2b 3d 20 73 65 73 73 69 6f 6e  >nBuf += session
f170: 56 61 72 69 6e 74 50 75 74 28 26 70 2d 3e 61 42  VarintPut(&p->aB
f180: 75 66 5b 70 2d 3e 6e 42 75 66 5d 2c 20 76 29 3b  uf[p->nBuf], v);
f190: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
f1a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
f1b0: 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63 20 69   no-op if *pRc i
f1c0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  s other than SQL
f1d0: 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69  ITE_OK when it i
f1e0: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20 4f 74  s .** called. Ot
f1f0: 68 65 72 77 69 73 65 2c 20 61 70 70 65 6e 64 20  herwise, append 
f200: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  a blob of data t
f210: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 0a 2a  o the buffer. .*
f220: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63  *.** If an OOM c
f230: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
f240: 75 6e 74 65 72 65 64 2c 20 73 65 74 20 2a 70 52  untered, set *pR
f250: 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  c to SQLITE_NOME
f260: 4d 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  M before.** retu
f270: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
f280: 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 41 70 70   void sessionApp
f290: 65 6e 64 42 6c 6f 62 28 0a 20 20 53 65 73 73 69  endBlob(.  Sessi
f2a0: 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20 0a 20 20  onBuffer *p, .  
f2b0: 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 2c  const u8 *aBlob,
f2c0: 20 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 2c 20 0a   .  int nBlob, .
f2d0: 20 20 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20    int *pRc.){.  
f2e0: 69 66 28 20 6e 42 6c 6f 62 3e 30 20 26 26 20 30  if( nBlob>0 && 0
f2f0: 3d 3d 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47  ==sessionBufferG
f300: 72 6f 77 28 70 2c 20 6e 42 6c 6f 62 2c 20 70 52  row(p, nBlob, pR
f310: 63 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  c) ){.    memcpy
f320: 28 26 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75  (&p->aBuf[p->nBu
f330: 66 5d 2c 20 61 42 6c 6f 62 2c 20 6e 42 6c 6f 62  f], aBlob, nBlob
f340: 29 3b 0a 20 20 20 20 70 2d 3e 6e 42 75 66 20 2b  );.    p->nBuf +
f350: 3d 20 6e 42 6c 6f 62 3b 0a 20 20 7d 0a 7d 0a 0a  = nBlob;.  }.}..
f360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f370: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
f380: 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
f390: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
f3a0: 68 65 6e 20 69 74 20 69 73 20 0a 2a 2a 20 63 61  hen it is .** ca
f3b0: 6c 6c 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  lled. Otherwise,
f3c0: 20 61 70 70 65 6e 64 20 61 20 73 74 72 69 6e 67   append a string
f3d0: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
f3e0: 41 6c 6c 20 62 79 74 65 73 20 69 6e 20 74 68 65  All bytes in the
f3f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 75 70 20 74 6f   string.** up to
f400: 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64   (but not includ
f410: 69 6e 67 29 20 74 68 65 20 6e 75 6c 2d 74 65 72  ing) the nul-ter
f420: 6d 69 6e 61 74 6f 72 20 61 72 65 20 77 72 69 74  minator are writ
f430: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
f440: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  r..**.** If an O
f450: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
f460: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 73 65 74  encountered, set
f470: 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f   *pRc to SQLITE_
f480: 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 0a 2a 2a 20  NOMEM before.** 
f490: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
f4a0: 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
f4b0: 6e 41 70 70 65 6e 64 53 74 72 28 0a 20 20 53 65  nAppendStr(.  Se
f4c0: 73 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20  ssionBuffer *p, 
f4d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f4e0: 53 74 72 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  Str, .  int *pRc
f4f0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 72 20 3d  .){.  int nStr =
f500: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f510: 28 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 30 3d  (zStr);.  if( 0=
f520: 3d 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47 72  =sessionBufferGr
f530: 6f 77 28 70 2c 20 6e 53 74 72 2c 20 70 52 63 29  ow(p, nStr, pRc)
f540: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
f550: 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66 5d  p->aBuf[p->nBuf]
f560: 2c 20 7a 53 74 72 2c 20 6e 53 74 72 29 3b 0a 20  , zStr, nStr);. 
f570: 20 20 20 70 2d 3e 6e 42 75 66 20 2b 3d 20 6e 53     p->nBuf += nS
f580: 74 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr;.  }.}../*.**
f590: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
f5a0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52  s a no-op if *pR
f5b0: 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
f5c0: 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69  SQLITE_OK when i
f5d0: 74 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e  t is .** called.
f5e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 65   Otherwise, appe
f5f0: 6e 64 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  nd the string re
f600: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
f610: 69 6e 74 65 67 65 72 20 69 56 61 6c 0a 2a 2a 20  integer iVal.** 
f620: 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 4e  to the buffer. N
f630: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
f640: 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a   is written..**.
f650: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  ** If an OOM con
f660: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
f670: 74 65 72 65 64 2c 20 73 65 74 20 2a 70 52 63 20  tered, set *pRc 
f680: 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
f690: 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
f6a0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
f6b0: 6f 69 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  oid sessionAppen
f6c0: 64 49 6e 74 65 67 65 72 28 0a 20 20 53 65 73 73  dInteger(.  Sess
f6d0: 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20 20 20  ionBuffer *p,   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
f6f0: 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20  uffer to append 
f700: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c  to */.  int iVal
f710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f720: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
f730: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 73 74   to write the st
f740: 72 69 6e 67 20 72 65 70 2e 20 6f 66 20 2a 2f 0a  ring rep. of */.
f750: 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
f780: 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
f790: 63 68 61 72 20 61 42 75 66 5b 32 34 5d 3b 0a 20  char aBuf[24];. 
f7a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f7b0: 66 28 73 69 7a 65 6f 66 28 61 42 75 66 29 2d 31  f(sizeof(aBuf)-1
f7c0: 2c 20 61 42 75 66 2c 20 22 25 64 22 2c 20 69 56  , aBuf, "%d", iV
f7d0: 61 6c 29 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70  al);.  sessionAp
f7e0: 70 65 6e 64 53 74 72 28 70 2c 20 61 42 75 66 2c  pendStr(p, aBuf,
f7f0: 20 70 52 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRc);.}../*.** 
f800: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
f810: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63   a no-op if *pRc
f820: 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53   is other than S
f830: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74  QLITE_OK when it
f840: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20   is .** called. 
f850: 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 65 6e  Otherwise, appen
f860: 64 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74  d the string zSt
f870: 72 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 71 75  r enclosed in qu
f880: 6f 74 65 73 20 28 22 29 20 61 6e 64 0a 2a 2a 20  otes (") and.** 
f890: 77 69 74 68 20 61 6e 79 20 65 6d 62 65 64 64 65  with any embedde
f8a0: 64 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  d quote characte
f8b0: 72 73 20 65 73 63 61 70 65 64 20 74 6f 20 74 68  rs escaped to th
f8c0: 65 20 62 75 66 66 65 72 2e 20 4e 6f 20 0a 2a 2a  e buffer. No .**
f8d0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
f8e0: 62 79 74 65 20 69 73 20 77 72 69 74 74 65 6e 2e  byte is written.
f8f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
f900: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
f910: 63 6f 75 6e 74 65 72 65 64 2c 20 73 65 74 20 2a  countered, set *
f920: 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  pRc to SQLITE_NO
f930: 4d 45 4d 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  MEM before.** re
f940: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
f950: 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 41  ic void sessionA
f960: 70 70 65 6e 64 49 64 65 6e 74 28 0a 20 20 53 65  ppendIdent(.  Se
f970: 73 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20  ssionBuffer *p, 
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f990: 20 42 75 66 66 65 72 20 74 6f 20 61 20 61 70 70   Buffer to a app
f9a0: 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  end to */.  cons
f9b0: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 20 20  t char *zStr,   
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f9d0: 74 72 69 6e 67 20 74 6f 20 71 75 6f 74 65 2c 20  tring to quote, 
f9e0: 65 73 63 61 70 65 20 61 6e 64 20 61 70 70 65 6e  escape and appen
f9f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  d */.  int *pRc 
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
fa20: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
fa30: 29 7b 0a 20 20 69 6e 74 20 6e 53 74 72 20 3d 20  ){.  int nStr = 
fa40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
fa50: 7a 53 74 72 29 2a 32 20 2b 20 32 20 2b 20 31 3b  zStr)*2 + 2 + 1;
fa60: 0a 20 20 69 66 28 20 30 3d 3d 73 65 73 73 69 6f  .  if( 0==sessio
fa70: 6e 42 75 66 66 65 72 47 72 6f 77 28 70 2c 20 6e  nBufferGrow(p, n
fa80: 53 74 72 2c 20 70 52 63 29 20 29 7b 0a 20 20 20  Str, pRc) ){.   
fa90: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63   char *zOut = (c
faa0: 68 61 72 20 2a 29 26 70 2d 3e 61 42 75 66 5b 70  har *)&p->aBuf[p
fab0: 2d 3e 6e 42 75 66 5d 3b 0a 20 20 20 20 63 6f 6e  ->nBuf];.    con
fac0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a  st char *zIn = z
fad0: 53 74 72 3b 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b  Str;.    *zOut++
fae0: 20 3d 20 27 22 27 3b 0a 20 20 20 20 77 68 69 6c   = '"';.    whil
faf0: 65 28 20 2a 7a 49 6e 20 29 7b 0a 20 20 20 20 20  e( *zIn ){.     
fb00: 20 69 66 28 20 2a 7a 49 6e 3d 3d 27 22 27 20 29   if( *zIn=='"' )
fb10: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 27 22 27 3b 0a   *zOut++ = '"';.
fb20: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
fb30: 2a 28 7a 49 6e 2b 2b 29 3b 0a 20 20 20 20 7d 0a  *(zIn++);.    }.
fb40: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 27 22      *zOut++ = '"
fb50: 27 3b 0a 20 20 20 20 70 2d 3e 6e 42 75 66 20 3d  ';.    p->nBuf =
fb60: 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 4f 75   (int)((u8 *)zOu
fb70: 74 20 2d 20 70 2d 3e 61 42 75 66 29 3b 0a 20 20  t - p->aBuf);.  
fb80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
fb90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
fba0: 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20 6f  -op if *pRc is o
fbb0: 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
fbc0: 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  _OK when it is.*
fbd0: 2a 20 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72 77  * called. Otherw
fbe0: 73 65 2c 20 69 74 20 61 70 70 65 6e 64 73 20 74  se, it appends t
fbf0: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 76 65  he serialized ve
fc00: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 6c  rsion of the val
fc10: 75 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ue stored.** in 
fc20: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
fc30: 68 65 20 72 6f 77 20 74 68 61 74 20 53 51 4c 20  he row that SQL 
fc40: 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d 74 20  statement pStmt 
fc50: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
fc60: 0a 2a 2a 20 74 6f 20 74 6f 20 74 68 65 20 62 75  .** to to the bu
fc70: 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
fc80: 76 6f 69 64 20 73 65 73 73 69 6f 6e 41 70 70 65  void sessionAppe
fc90: 6e 64 43 6f 6c 28 0a 20 20 53 65 73 73 69 6f 6e  ndCol(.  Session
fca0: 42 75 66 66 65 72 20 2a 70 2c 20 20 20 20 20 20  Buffer *p,      
fcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
fcc0: 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  er to append to 
fcd0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
fce0: 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20  t *pStmt,       
fcf0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 70       /* Handle p
fd00: 6f 69 6e 74 69 6e 67 20 74 6f 20 72 6f 77 20 63  ointing to row c
fd10: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65 20  ontaining value 
fd20: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd40: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
fd50: 6f 20 72 65 61 64 20 76 61 6c 75 65 20 66 72 6f  o read value fro
fd60: 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  m */.  int *pRc 
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
fd90: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
fda0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
fdb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fdc0: 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69  int eType = sqli
fdd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
fde0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
fdf0: 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
fe00: 79 74 65 28 70 2c 20 28 75 38 29 65 54 79 70 65  yte(p, (u8)eType
fe10: 2c 20 70 52 63 29 3b 0a 20 20 20 20 69 66 28 20  , pRc);.    if( 
fe20: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
fe30: 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d  TEGER || eType==
fe40: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
fe50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
fe60: 74 36 34 20 69 3b 0a 20 20 20 20 20 20 75 38 20  t64 i;.      u8 
fe70: 61 42 75 66 5b 38 5d 3b 0a 20 20 20 20 20 20 69  aBuf[8];.      i
fe80: 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
fe90: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
fea0: 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 5f      i = sqlite3_
feb0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
fec0: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
fed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fee0: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
fef0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
ff00: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
ff10: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 69         memcpy(&i
ff20: 2c 20 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &r, 8);.      
ff30: 7d 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 50  }.      sessionP
ff40: 75 74 49 36 34 28 61 42 75 66 2c 20 69 29 3b 0a  utI64(aBuf, i);.
ff50: 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
ff60: 65 6e 64 42 6c 6f 62 28 70 2c 20 61 42 75 66 2c  endBlob(p, aBuf,
ff70: 20 38 2c 20 70 52 63 29 3b 0a 20 20 20 20 7d 0a   8, pRc);.    }.
ff80: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
ff90: 51 4c 49 54 45 5f 42 4c 4f 42 20 7c 7c 20 65 54  QLITE_BLOB || eT
ffa0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
ffb0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b   ){.      u8 *z;
ffc0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
ffd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
ffe0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
fff0: 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 75  {.        z = (u
10000 38 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  8 *)sqlite3_colu
10010 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  mn_blob(pStmt, i
10020 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
10030 65 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28  e{.        z = (
10040 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  u8 *)sqlite3_col
10050 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
10060 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCol);.      }. 
10070 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71 6c       nByte = sql
10080 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
10090 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  s(pStmt, iCol);.
100a0 20 20 20 20 20 20 69 66 28 20 7a 20 7c 7c 20 28        if( z || (
100b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
100c0 4f 42 20 26 26 20 6e 42 79 74 65 3d 3d 30 29 20  OB && nByte==0) 
100d0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  ){.        sessi
100e0 6f 6e 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  onAppendVarint(p
100f0 2c 20 6e 42 79 74 65 2c 20 70 52 63 29 3b 0a 20  , nByte, pRc);. 
10100 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
10110 70 65 6e 64 42 6c 6f 62 28 70 2c 20 7a 2c 20 6e  pendBlob(p, z, n
10120 42 79 74 65 2c 20 70 52 63 29 3b 0a 20 20 20 20  Byte, pRc);.    
10130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10140 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
10150 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
10160 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10170 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10180 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 75 70 64  n appends an upd
10190 61 74 65 20 63 68 61 6e 67 65 20 74 6f 20 74 68  ate change to th
101a0 65 20 62 75 66 66 65 72 20 28 73 65 65 20 74 68  e buffer (see th
101b0 65 20 63 6f 6d 6d 65 6e 74 73 20 0a 2a 2a 20 75  e comments .** u
101c0 6e 64 65 72 20 22 43 48 41 4e 47 45 53 45 54 20  nder "CHANGESET 
101d0 46 4f 52 4d 41 54 22 20 61 74 20 74 68 65 20 74  FORMAT" at the t
101e0 6f 70 20 6f 66 20 74 68 65 20 66 69 6c 65 29 2e  op of the file).
101f0 20 41 6e 20 75 70 64 61 74 65 20 63 68 61 6e 67   An update chang
10200 65 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f  e .** consists o
10210 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62 79 74  f:.**.**   1 byt
10220 65 3a 20 20 53 51 4c 49 54 45 5f 55 50 44 41 54  e:  SQLITE_UPDAT
10230 45 20 28 30 78 31 37 29 0a 2a 2a 20 20 20 6e 20  E (0x17).**   n 
10240 62 79 74 65 73 3a 20 6f 6c 64 2e 2a 20 72 65 63  bytes: old.* rec
10250 6f 72 64 20 28 73 65 65 20 52 45 43 4f 52 44 20  ord (see RECORD 
10260 46 4f 52 4d 41 54 29 0a 2a 2a 20 20 20 6d 20 62  FORMAT).**   m b
10270 79 74 65 73 3a 20 6e 65 77 2e 2a 20 72 65 63 6f  ytes: new.* reco
10280 72 64 20 28 73 65 65 20 52 45 43 4f 52 44 20 46  rd (see RECORD F
10290 4f 52 4d 41 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65  ORMAT).**.** The
102a0 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 6f   SessionChange o
102b0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
102c0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
102d0 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  nt contains the.
102e0 2a 2a 20 76 61 6c 75 65 73 20 74 68 61 74 20 77  ** values that w
102f0 65 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ere stored in th
10300 65 20 72 6f 77 20 77 68 65 6e 20 74 68 65 20 73  e row when the s
10310 65 73 73 69 6f 6e 20 62 65 67 61 6e 20 28 74 68  ession began (th
10320 65 20 6f 6c 64 2e 2a 0a 2a 2a 20 76 61 6c 75 65  e old.*.** value
10330 73 29 2e 20 54 68 65 20 73 74 61 74 65 6d 65 6e  s). The statemen
10340 74 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  t handle passed 
10350 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
10360 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 0a 2a 2a  gument points.**
10370 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10380 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 72  version of the r
10390 6f 77 20 28 74 68 65 20 6e 65 77 2e 2a 20 76 61  ow (the new.* va
103a0 6c 75 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lues)..**.** If 
103b0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  all of the old.*
103c0 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 61   values are equa
103d0 6c 20 74 6f 20 74 68 65 69 72 20 63 6f 72 72 65  l to their corre
103e0 73 70 6f 6e 64 69 6e 67 20 6e 65 77 2e 2a 20 76  sponding new.* v
103f0 61 6c 75 65 0a 2a 2a 20 28 69 2e 65 2e 20 6e 6f  alue.** (i.e. no
10400 74 68 69 6e 67 20 68 61 73 20 63 68 61 6e 67 65  thing has change
10410 64 29 2c 20 74 68 65 6e 20 6e 6f 20 64 61 74 61  d), then no data
10420 20 61 74 20 61 6c 6c 20 69 73 20 61 70 70 65 6e   at all is appen
10430 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
10440 72 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  r..**.** Otherwi
10450 73 65 2c 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65  se, the old.* re
10460 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 61 6c  cord contains al
10470 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  l primary key va
10480 6c 75 65 73 20 61 6e 64 20 74 68 65 20 0a 2a 2a  lues and the .**
10490 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 73   original values
104a0 20 6f 66 20 61 6e 79 20 66 69 65 6c 64 73 20 74   of any fields t
104b0 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  hat have been mo
104c0 64 69 66 69 65 64 2e 20 54 68 65 20 6e 65 77 2e  dified. The new.
104d0 2a 20 72 65 63 6f 72 64 20 0a 2a 2a 20 63 6f 6e  * record .** con
104e0 74 61 69 6e 73 20 74 68 65 20 6e 65 77 20 76 61  tains the new va
104f0 6c 75 65 73 20 6f 66 20 6f 6e 6c 79 20 74 68 6f  lues of only tho
10500 73 65 20 66 69 65 6c 64 73 20 74 68 61 74 20 68  se fields that h
10510 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
10520 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  d..*/ .static in
10530 74 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 55  t sessionAppendU
10540 70 64 61 74 65 28 0a 20 20 53 65 73 73 69 6f 6e  pdate(.  Session
10550 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
10560 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
10570 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  er to append to 
10580 2a 2f 0a 20 20 69 6e 74 20 62 50 61 74 63 68 73  */.  int bPatchs
10590 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
105a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
105b0 20 22 70 61 74 63 68 73 65 74 22 2c 20 30 20 66   "patchset", 0 f
105c0 6f 72 20 22 63 68 61 6e 67 65 73 65 74 22 20 2a  or "changeset" *
105d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
105e0 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20   *pStmt,        
105f0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
10600 20 68 61 6e 64 6c 65 20 70 6f 69 6e 74 69 6e 67   handle pointing
10610 20 61 74 20 6e 65 77 20 72 6f 77 20 2a 2f 0a 20   at new row */. 
10620 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a   SessionChange *
10630 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10640 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61   /* Object conta
10650 69 6e 69 6e 67 20 6f 6c 64 20 76 61 6c 75 65 73  ining old values
10660 20 2a 2f 0a 20 20 75 38 20 2a 61 62 50 4b 20 20   */.  u8 *abPK  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
10690 20 61 72 72 61 79 20 2d 20 74 72 75 65 20 66 6f   array - true fo
106a0 72 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r PK columns */.
106b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
106c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 65 73 73 69  LITE_OK;.  Sessi
106d0 6f 6e 42 75 66 66 65 72 20 62 75 66 32 20 3d 20  onBuffer buf2 = 
106e0 7b 30 2c 30 2c 30 7d 3b 20 2f 2a 20 42 75 66 66  {0,0,0}; /* Buff
106f0 65 72 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  er to accumulate
10700 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 69 6e   new.* record in
10710 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 6f 70 20   */.  int bNoop 
10720 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
10730 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 7a 65      /* Set to ze
10740 72 6f 20 69 66 20 61 6e 79 20 76 61 6c 75 65 73  ro if any values
10750 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f   are modified */
10760 0a 20 20 69 6e 74 20 6e 52 65 77 69 6e 64 20 3d  .  int nRewind =
10770 20 70 42 75 66 2d 3e 6e 42 75 66 3b 20 20 20 20   pBuf->nBuf;    
10780 20 2f 2a 20 53 65 74 20 74 6f 20 7a 65 72 6f 20   /* Set to zero 
10790 69 66 20 61 6e 79 20 76 61 6c 75 65 73 20 61 72  if any values ar
107a0 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  e modified */.  
107b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107d0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
107e0 20 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73   through columns
107f0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 73 72 20 3d   */.  u8 *pCsr =
10800 20 70 2d 3e 61 52 65 63 6f 72 64 3b 20 20 20 20   p->aRecord;    
10810 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
10820 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6f  terate through o
10830 6c 64 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  ld.* values */..
10840 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
10850 79 74 65 28 70 42 75 66 2c 20 53 51 4c 49 54 45  yte(pBuf, SQLITE
10860 5f 55 50 44 41 54 45 2c 20 26 72 63 29 3b 0a 20  _UPDATE, &rc);. 
10870 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79   sessionAppendBy
10880 74 65 28 70 42 75 66 2c 20 70 2d 3e 62 49 6e 64  te(pBuf, p->bInd
10890 69 72 65 63 74 2c 20 26 72 63 29 3b 0a 20 20 66  irect, &rc);.  f
108a0 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65  or(i=0; i<sqlite
108b0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
108c0 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Stmt); i++){.   
108d0 20 69 6e 74 20 62 43 68 61 6e 67 65 64 20 3d 20   int bChanged = 
108e0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 41 64 76 61  0;.    int nAdva
108f0 6e 63 65 3b 0a 20 20 20 20 69 6e 74 20 65 54 79  nce;.    int eTy
10900 70 65 20 3d 20 2a 70 43 73 72 3b 0a 20 20 20 20  pe = *pCsr;.    
10910 73 77 69 74 63 68 28 20 65 54 79 70 65 20 29 7b  switch( eType ){
10920 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
10930 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  TE_NULL:.       
10940 20 6e 41 64 76 61 6e 63 65 20 3d 20 31 3b 0a 20   nAdvance = 1;. 
10950 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
10960 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
10970 53 74 6d 74 2c 20 69 29 21 3d 53 51 4c 49 54 45  Stmt, i)!=SQLITE
10980 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _NULL ){.       
10990 20 20 20 62 43 68 61 6e 67 65 64 20 3d 20 31 3b     bChanged = 1;
109a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109b0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
109c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
109d0 41 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53  AT:.      case S
109e0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
109f0 0a 20 20 20 20 20 20 20 20 6e 41 64 76 61 6e 63  .        nAdvanc
10a00 65 20 3d 20 39 3b 0a 20 20 20 20 20 20 20 20 69  e = 9;.        i
10a10 66 28 20 65 54 79 70 65 3d 3d 73 71 6c 69 74 65  f( eType==sqlite
10a20 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
10a30 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  tmt, i) ){.     
10a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
10a50 36 34 20 69 56 61 6c 20 3d 20 73 65 73 73 69 6f  64 iVal = sessio
10a60 6e 47 65 74 49 36 34 28 26 70 43 73 72 5b 31 5d  nGetI64(&pCsr[1]
10a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10a80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
10a90 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
10aa0 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d        if( iVal==
10ab0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
10ac0 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 20 29  nt64(pStmt, i) )
10ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10af0 20 20 20 20 20 64 6f 75 62 6c 65 20 64 56 61 6c       double dVal
10b00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  ;.            me
10b10 6d 63 70 79 28 26 64 56 61 6c 2c 20 26 69 56 61  mcpy(&dVal, &iVa
10b20 6c 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 8);.         
10b30 20 20 20 69 66 28 20 64 56 61 6c 3d 3d 73 71 6c     if( dVal==sql
10b40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
10b50 6c 65 28 70 53 74 6d 74 2c 20 69 29 20 29 20 62  le(pStmt, i) ) b
10b60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10b70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10b80 20 20 20 20 62 43 68 61 6e 67 65 64 20 3d 20 31      bChanged = 1
10b90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
10ba0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10bb0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
10bc0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
10bd0 20 20 69 6e 74 20 6e 48 64 72 20 3d 20 31 20 2b    int nHdr = 1 +
10be0 20 73 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65   sessionVarintGe
10bf0 74 28 26 70 43 73 72 5b 31 5d 2c 20 26 6e 29 3b  t(&pCsr[1], &n);
10c00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10c10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   eType==SQLITE_T
10c20 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  EXT || eType==SQ
10c30 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  LITE_BLOB );.   
10c40 20 20 20 20 20 6e 41 64 76 61 6e 63 65 20 3d 20       nAdvance = 
10c50 6e 48 64 72 20 2b 20 6e 3b 0a 20 20 20 20 20 20  nHdr + n;.      
10c60 20 20 69 66 28 20 65 54 79 70 65 3d 3d 73 71 6c    if( eType==sql
10c70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
10c80 28 70 53 74 6d 74 2c 20 69 29 20 0a 20 20 20 20  (pStmt, i) .    
10c90 20 20 20 20 20 26 26 20 6e 3d 3d 73 71 6c 69 74       && n==sqlit
10ca0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
10cb0 70 53 74 6d 74 2c 20 69 29 20 0a 20 20 20 20 20  pStmt, i) .     
10cc0 20 20 20 20 26 26 20 28 6e 3d 3d 30 20 7c 7c 20      && (n==0 || 
10cd0 30 3d 3d 6d 65 6d 63 6d 70 28 26 70 43 73 72 5b  0==memcmp(&pCsr[
10ce0 6e 48 64 72 5d 2c 20 73 71 6c 69 74 65 33 5f 63  nHdr], sqlite3_c
10cf0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
10d00 2c 20 69 29 2c 20 6e 29 29 0a 20 20 20 20 20 20  , i), n)).      
10d10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
10d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10d30 20 20 20 20 20 20 20 20 62 43 68 61 6e 67 65 64          bChanged
10d40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10d50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
10d60 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c  t least one fiel
10d70 64 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  d has been modif
10d80 69 65 64 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  ied, this is not
10d90 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20   a no-op. */.   
10da0 20 69 66 28 20 62 43 68 61 6e 67 65 64 20 29 20   if( bChanged ) 
10db0 62 4e 6f 6f 70 20 3d 20 30 3b 0a 0a 20 20 20 20  bNoop = 0;..    
10dc0 2f 2a 20 41 64 64 20 61 20 66 69 65 6c 64 20 74  /* Add a field t
10dd0 6f 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65 63 6f  o the old.* reco
10de0 72 64 2e 20 54 68 69 73 20 69 73 20 6f 6d 69 74  rd. This is omit
10df0 74 65 64 20 69 66 20 74 68 69 73 20 6d 6f 64 75  ted if this modu
10e00 6c 65 73 20 69 73 0a 20 20 20 20 2a 2a 20 63 75  les is.    ** cu
10e10 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
10e20 6e 67 20 61 20 70 61 74 63 68 73 65 74 2e 20 2a  ng a patchset. *
10e30 2f 0a 20 20 20 20 69 66 28 20 62 50 61 74 63 68  /.    if( bPatch
10e40 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
10e50 69 66 28 20 62 43 68 61 6e 67 65 64 20 7c 7c 20  if( bChanged || 
10e60 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20  abPK[i] ){.     
10e70 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
10e80 42 6c 6f 62 28 70 42 75 66 2c 20 70 43 73 72 2c  Blob(pBuf, pCsr,
10e90 20 6e 41 64 76 61 6e 63 65 2c 20 26 72 63 29 3b   nAdvance, &rc);
10ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10eb0 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
10ec0 65 6e 64 42 79 74 65 28 70 42 75 66 2c 20 30 2c  endByte(pBuf, 0,
10ed0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
10ee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
10ef0 20 61 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20   a field to the 
10f00 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20 4f 72  new.* record. Or
10f10 20 74 68 65 20 6f 6e 6c 79 20 72 65 63 6f 72 64   the only record
10f20 20 69 66 20 63 75 72 72 65 6e 74 6c 79 0a 20 20   if currently.  
10f30 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20    ** generating 
10f40 61 20 70 61 74 63 68 73 65 74 2e 20 20 2a 2f 0a  a patchset.  */.
10f50 20 20 20 20 69 66 28 20 62 43 68 61 6e 67 65 64      if( bChanged
10f60 20 7c 7c 20 28 62 50 61 74 63 68 73 65 74 20 26   || (bPatchset &
10f70 26 20 61 62 50 4b 5b 69 5d 29 20 29 7b 0a 20 20  & abPK[i]) ){.  
10f80 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
10f90 64 43 6f 6c 28 26 62 75 66 32 2c 20 70 53 74 6d  dCol(&buf2, pStm
10fa0 74 2c 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20  t, i, &rc);.    
10fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 73  }else{.      ses
10fc0 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26  sionAppendByte(&
10fd0 62 75 66 32 2c 20 30 2c 20 26 72 63 29 3b 0a 20  buf2, 0, &rc);. 
10fe0 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 20 2b     }..    pCsr +
10ff0 3d 20 6e 41 64 76 61 6e 63 65 3b 0a 20 20 7d 0a  = nAdvance;.  }.
11000 0a 20 20 69 66 28 20 62 4e 6f 6f 70 20 29 7b 0a  .  if( bNoop ){.
11010 20 20 20 20 70 42 75 66 2d 3e 6e 42 75 66 20 3d      pBuf->nBuf =
11020 20 6e 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73   nRewind;.  }els
11030 65 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  e{.    sessionAp
11040 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 62  pendBlob(pBuf, b
11050 75 66 32 2e 61 42 75 66 2c 20 62 75 66 32 2e 6e  uf2.aBuf, buf2.n
11060 42 75 66 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 20  Buf, &rc);.  }. 
11070 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 75   sqlite3_free(bu
11080 66 32 2e 61 42 75 66 29 3b 0a 0a 20 20 72 65 74  f2.aBuf);..  ret
11090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
110a0 20 41 70 70 65 6e 64 20 61 20 44 45 4c 45 54 45   Append a DELETE
110b0 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 62   change to the b
110c0 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
110d0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
110e0 6e 74 2e 20 55 73 65 0a 2a 2a 20 74 68 65 20 63  nt. Use.** the c
110f0 68 61 6e 67 65 73 65 74 20 66 6f 72 6d 61 74 20  hangeset format 
11100 69 66 20 61 72 67 75 6d 65 6e 74 20 62 50 61 74  if argument bPat
11110 63 68 73 65 74 20 69 73 20 7a 65 72 6f 2c 20 6f  chset is zero, o
11120 72 20 74 68 65 20 70 61 74 63 68 73 65 74 0a 2a  r the patchset.*
11130 2a 20 66 6f 72 6d 61 74 20 6f 74 68 65 72 77 69  * format otherwi
11140 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
11150 74 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 44  t sessionAppendD
11160 65 6c 65 74 65 28 0a 20 20 53 65 73 73 69 6f 6e  elete(.  Session
11170 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
11180 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
11190 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  er to append to 
111a0 2a 2f 0a 20 20 69 6e 74 20 62 50 61 74 63 68 73  */.  int bPatchs
111b0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
111c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
111d0 20 22 70 61 74 63 68 73 65 74 22 2c 20 30 20 66   "patchset", 0 f
111e0 6f 72 20 22 63 68 61 6e 67 65 73 65 74 22 20 2a  or "changeset" *
111f0 2f 0a 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67  /.  SessionChang
11200 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
11210 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f      /* Object co
11220 6e 74 61 69 6e 69 6e 67 20 6f 6c 64 20 76 61 6c  ntaining old val
11230 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ues */.  int nCo
11240 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11260 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11270 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a   table */.  u8 *
11280 61 62 50 4b 20 20 20 20 20 20 20 20 20 20 20 20  abPK            
11290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
112a0 6f 6f 6c 65 61 6e 20 61 72 72 61 79 20 2d 20 74  oolean array - t
112b0 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c 75 6d  rue for PK colum
112c0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ns */.){.  int r
112d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
112e0 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
112f0 79 74 65 28 70 42 75 66 2c 20 53 51 4c 49 54 45  yte(pBuf, SQLITE
11300 5f 44 45 4c 45 54 45 2c 20 26 72 63 29 3b 0a 20  _DELETE, &rc);. 
11310 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79   sessionAppendBy
11320 74 65 28 70 42 75 66 2c 20 70 2d 3e 62 49 6e 64  te(pBuf, p->bInd
11330 69 72 65 63 74 2c 20 26 72 63 29 3b 0a 0a 20 20  irect, &rc);..  
11340 69 66 28 20 62 50 61 74 63 68 73 65 74 3d 3d 30  if( bPatchset==0
11350 20 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41   ){.    sessionA
11360 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
11370 70 2d 3e 61 52 65 63 6f 72 64 2c 20 70 2d 3e 6e  p->aRecord, p->n
11380 52 65 63 6f 72 64 2c 20 26 72 63 29 3b 0a 20 20  Record, &rc);.  
11390 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
113a0 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 2d  ;.    u8 *a = p-
113b0 3e 61 52 65 63 6f 72 64 3b 0a 20 20 20 20 66 6f  >aRecord;.    fo
113c0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
113d0 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
113e0 53 74 61 72 74 20 3d 20 61 3b 0a 20 20 20 20 20  Start = a;.     
113f0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a 61 2b   int eType = *a+
11400 2b 3b 0a 0a 20 20 20 20 20 20 73 77 69 74 63 68  +;..      switch
11410 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ( eType ){.     
11420 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20     case 0:.     
11430 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
11440 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20 20 20 61  ULL:.          a
11450 73 73 65 72 74 28 20 61 62 50 4b 5b 69 5d 3d 3d  ssert( abPK[i]==
11460 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
11470 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63  reak;..        c
11480 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
11490 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
114a0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
114b0 20 20 20 20 20 20 20 20 20 61 20 2b 3d 20 38 3b           a += 8;
114c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
114d0 3b 0a 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  ;..        defau
114e0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
114f0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
11500 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 56 61 72   a += sessionVar
11510 69 6e 74 47 65 74 28 61 2c 20 26 6e 29 3b 0a 20  intGet(a, &n);. 
11520 20 20 20 20 20 20 20 20 20 61 20 2b 3d 20 6e 3b           a += n;
11530 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11550 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 62    }.      if( ab
11560 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  PK[i] ){.       
11570 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c   sessionAppendBl
11580 6f 62 28 70 42 75 66 2c 20 70 53 74 61 72 74 2c  ob(pBuf, pStart,
11590 20 28 69 6e 74 29 28 61 2d 70 53 74 61 72 74 29   (int)(a-pStart)
115a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
115b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
115c0 28 20 28 61 20 2d 20 70 2d 3e 61 52 65 63 6f 72  ( (a - p->aRecor
115d0 64 29 3d 3d 70 2d 3e 6e 52 65 63 6f 72 64 20 29  d)==p->nRecord )
115e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
115f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
11600 6d 75 6c 61 74 65 20 61 6e 64 20 70 72 65 70 61  mulate and prepa
11610 72 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  re a SELECT stat
11620 65 6d 65 6e 74 20 74 6f 20 72 65 74 72 69 65 76  ement to retriev
11630 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 61 62  e a row from tab
11640 6c 65 0a 2a 2a 20 7a 54 61 62 20 69 6e 20 64 61  le.** zTab in da
11650 74 61 62 61 73 65 20 7a 44 62 20 62 61 73 65 64  tabase zDb based
11660 20 6f 6e 20 69 74 73 20 70 72 69 6d 61 72 79 20   on its primary 
11670 6b 65 79 2e 20 69 2e 65 2e 0a 2a 2a 0a 2a 2a 20  key. i.e..**.** 
11680 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11690 7a 44 62 2e 7a 54 61 62 20 57 48 45 52 45 20 70  zDb.zTab WHERE p
116a0 6b 31 20 3d 20 3f 20 41 4e 44 20 70 6b 32 20 3d  k1 = ? AND pk2 =
116b0 20 3f 20 41 4e 44 20 2e 2e 2e 0a 2a 2f 0a 73 74   ? AND ....*/.st
116c0 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
116d0 53 65 6c 65 63 74 53 74 6d 74 28 0a 20 20 73 71  SelectStmt(.  sq
116e0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11700 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
11710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11720 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
11730 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11740 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
11750 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20  t char *zTab,   
11760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11770 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  able name */.  i
11780 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt nCol,        
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
117a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
117b0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  mns in table */.
117c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
117d0 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zCol,           
117e0 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 74 61    /* Names of ta
117f0 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ble columns */. 
11800 20 75 38 20 2a 61 62 50 4b 2c 20 20 20 20 20 20   u8 *abPK,      
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
11830 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
11840 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
11850 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
11860 55 54 3a 20 50 72 65 70 61 72 65 64 20 53 45 4c  UT: Prepared SEL
11870 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
11880 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
11890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
118a0 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *zSql = 0;.  in
118b0 74 20 6e 53 71 6c 20 3d 20 2d 31 3b 0a 0a 20 20  t nSql = -1;..  
118c0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
118d0 74 72 69 63 6d 70 28 22 73 71 6c 69 74 65 5f 73  tricmp("sqlite_s
118e0 74 61 74 31 22 2c 20 7a 54 61 62 29 20 29 7b 0a  tat1", zTab) ){.
118f0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
11900 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
11910 20 20 20 20 22 53 45 4c 45 43 54 20 74 62 6c 2c      "SELECT tbl,
11920 20 3f 32 2c 20 73 74 61 74 20 46 52 4f 4d 20 25   ?2, stat FROM %
11930 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57  Q.sqlite_stat1 W
11940 48 45 52 45 20 74 62 6c 20 49 53 20 3f 31 20 41  HERE tbl IS ?1 A
11950 4e 44 20 22 0a 20 20 20 20 20 20 20 20 22 69 64  ND ".        "id
11960 78 20 49 53 20 28 43 41 53 45 20 57 48 45 4e 20  x IS (CASE WHEN 
11970 3f 32 3d 58 27 27 20 54 48 45 4e 20 4e 55 4c 4c  ?2=X'' THEN NULL
11980 20 45 4c 53 45 20 3f 32 20 45 4e 44 29 22 2c 20   ELSE ?2 END)", 
11990 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  zDb.    );.    i
119a0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 63 20  f( zSql==0 ) rc 
119b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
119c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
119d0 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   i;.    const ch
119e0 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20  ar *zSep = "";. 
119f0 20 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72     SessionBuffer
11a00 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   buf = {0, 0, 0}
11a10 3b 0a 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  ;..    sessionAp
11a20 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 53  pendStr(&buf, "S
11a30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20  ELECT * FROM ", 
11a40 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
11a50 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75  nAppendIdent(&bu
11a60 66 2c 20 7a 44 62 2c 20 26 72 63 29 3b 0a 20 20  f, zDb, &rc);.  
11a70 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53    sessionAppendS
11a80 74 72 28 26 62 75 66 2c 20 22 2e 22 2c 20 26 72  tr(&buf, ".", &r
11a90 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41  c);.    sessionA
11aa0 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c  ppendIdent(&buf,
11ab0 20 7a 54 61 62 2c 20 26 72 63 29 3b 0a 20 20 20   zTab, &rc);.   
11ac0 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
11ad0 72 28 26 62 75 66 2c 20 22 20 57 48 45 52 45 20  r(&buf, " WHERE 
11ae0 22 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 6f 72  ", &rc);.    for
11af0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11b00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 62  +){.      if( ab
11b10 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  PK[i] ){.       
11b20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
11b30 72 28 26 62 75 66 2c 20 7a 53 65 70 2c 20 26 72  r(&buf, zSep, &r
11b40 63 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73 73  c);.        sess
11b50 69 6f 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26  ionAppendIdent(&
11b60 62 75 66 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 26  buf, azCol[i], &
11b70 72 63 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73  rc);.        ses
11b80 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62  sionAppendStr(&b
11b90 75 66 2c 20 22 20 49 53 20 3f 22 2c 20 26 72 63  uf, " IS ?", &rc
11ba0 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  );.        sessi
11bb0 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72 28  onAppendInteger(
11bc0 26 62 75 66 2c 20 69 2b 31 2c 20 26 72 63 29 3b  &buf, i+1, &rc);
11bd0 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
11be0 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d  " AND ";.      }
11bf0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
11c00 3d 20 28 63 68 61 72 2a 29 62 75 66 2e 61 42 75  = (char*)buf.aBu
11c10 66 3b 0a 20 20 20 20 6e 53 71 6c 20 3d 20 62 75  f;.    nSql = bu
11c20 66 2e 6e 42 75 66 3b 0a 20 20 7d 0a 0a 20 20 69  f.nBuf;.  }..  i
11c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11c40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11c50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
11c60 64 62 2c 20 7a 53 71 6c 2c 20 6e 53 71 6c 2c 20  db, zSql, nSql, 
11c70 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  ppStmt, 0);.  }.
11c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11c90 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
11ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64  c;.}../*.** Bind
11cb0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
11cc0 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
11cd0 20 63 68 61 6e 67 65 20 70 61 73 73 65 64 20 69   change passed i
11ce0 6e 20 61 72 67 75 6d 65 6e 74 20 70 43 68 61 6e  n argument pChan
11cf0 67 65 0a 2a 2a 20 74 6f 20 74 68 65 20 53 45 4c  ge.** to the SEL
11d00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
11d10 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
11d20 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
11d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11d40 0a 2a 2a 20 69 73 20 61 73 20 70 72 65 70 61 72  .** is as prepar
11d50 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
11d60 65 73 73 69 6f 6e 53 65 6c 65 63 74 53 74 6d 74  essionSelectStmt
11d70 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ()..**.** Return
11d80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
11d90 6c 20 50 4b 20 76 61 6c 75 65 73 20 61 72 65 20  l PK values are 
11da0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 62 6f 75  successfully bou
11db0 6e 64 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  nd, or an SQLite
11dc0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 28  .** error code (
11dd0 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e.g. SQLITE_NOME
11de0 4d 29 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  M) otherwise..*/
11df0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
11e00 69 6f 6e 53 65 6c 65 63 74 42 69 6e 64 28 0a 20  ionSelectBind(. 
11e10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11e20 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20  Select,         
11e30 20 2f 2a 20 53 45 4c 45 43 54 20 66 72 6f 6d 20   /* SELECT from 
11e40 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 53 74 6d  sessionSelectStm
11e50 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  t() */.  int nCo
11e60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
11e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11e80 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11e90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a   table */.  u8 *
11ea0 61 62 50 4b 2c 20 20 20 20 20 20 20 20 20 20 20  abPK,           
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11ec0 52 49 4d 41 52 59 20 4b 45 59 20 61 72 72 61 79  RIMARY KEY array
11ed0 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 43 68 61   */.  SessionCha
11ee0 6e 67 65 20 2a 70 43 68 61 6e 67 65 20 20 20 20  nge *pChange    
11ef0 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
11f00 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
11f10 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
11f20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11f30 20 75 38 20 2a 61 20 3d 20 70 43 68 61 6e 67 65   u8 *a = pChange
11f40 2d 3e 61 52 65 63 6f 72 64 3b 0a 0a 20 20 66 6f  ->aRecord;..  fo
11f50 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 20 26 26  r(i=0; i<nCol &&
11f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
11f70 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65 54  i++){.    int eT
11f80 79 70 65 20 3d 20 2a 61 2b 2b 3b 0a 0a 20 20 20  ype = *a++;..   
11f90 20 73 77 69 74 63 68 28 20 65 54 79 70 65 20 29   switch( eType )
11fa0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 0a  {.      case 0:.
11fb0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
11fc0 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20  E_NULL:.        
11fd0 61 73 73 65 72 74 28 20 61 62 50 4b 5b 69 5d 3d  assert( abPK[i]=
11fe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  =0 );.        br
11ff0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12000 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
12010 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   {.        if( a
12020 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  bPK[i] ){.      
12030 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20 73      i64 iVal = s
12040 65 73 73 69 6f 6e 47 65 74 49 36 34 28 61 29 3b  essionGetI64(a);
12050 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12060 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12070 36 34 28 70 53 65 6c 65 63 74 2c 20 69 2b 31 2c  64(pSelect, i+1,
12080 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   iVal);.        
12090 7d 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20 38  }.        a += 8
120a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
120b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
120c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
120d0 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T: {.        if(
120e0 20 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20   abPK[i] ){.    
120f0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61        double rVa
12100 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  l;.          i64
12110 20 69 56 61 6c 20 3d 20 73 65 73 73 69 6f 6e 47   iVal = sessionG
12120 65 74 49 36 34 28 61 29 3b 0a 20 20 20 20 20 20  etI64(a);.      
12130 20 20 20 20 6d 65 6d 63 70 79 28 26 72 56 61 6c      memcpy(&rVal
12140 2c 20 26 69 56 61 6c 2c 20 38 29 3b 0a 20 20 20  , &iVal, 8);.   
12150 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12160 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
12170 70 53 65 6c 65 63 74 2c 20 69 2b 31 2c 20 72 56  pSelect, i+1, rV
12180 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  al);.        }. 
12190 20 20 20 20 20 20 20 61 20 2b 3d 20 38 3b 0a 20         a += 8;. 
121a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
121b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
121c0 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
121d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
121e0 20 20 20 20 20 20 20 20 61 20 2b 3d 20 73 65 73          a += ses
121f0 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 61 2c  sionVarintGet(a,
12200 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &n);.        if
12210 28 20 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20  ( abPK[i] ){.   
12220 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12230 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
12240 65 6c 65 63 74 2c 20 69 2b 31 2c 20 28 63 68 61  elect, i+1, (cha
12250 72 20 2a 29 61 2c 20 6e 2c 20 53 51 4c 49 54 45  r *)a, n, SQLITE
12260 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
12270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
12280 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62   += n;.        b
12290 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
122a0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
122b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
122c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
122d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
122e0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 61 20 2b  B );.        a +
122f0 3d 20 73 65 73 73 69 6f 6e 56 61 72 69 6e 74 47  = sessionVarintG
12300 65 74 28 61 2c 20 26 6e 29 3b 0a 20 20 20 20 20  et(a, &n);.     
12310 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d 20 29     if( abPK[i] )
12320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
12330 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
12340 6f 62 28 70 53 65 6c 65 63 74 2c 20 69 2b 31 2c  ob(pSelect, i+1,
12350 20 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52   a, n, SQLITE_TR
12360 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
12370 20 20 7d 0a 20 20 20 20 20 20 20 20 61 20 2b 3d    }.        a +=
12380 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   n;.        brea
12390 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
123a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
123b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
123c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
123d0 6f 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20  o-op if *pRc is 
123e0 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74 68 61  set to other tha
123f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
12400 20 69 74 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64   it.** is called
12410 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70  . Otherwise, app
12420 65 6e 64 20 61 20 73 65 72 69 61 6c 69 7a 65 64  end a serialized
12430 20 74 61 62 6c 65 20 68 65 61 64 65 72 20 28 70   table header (p
12440 61 72 74 20 6f 66 20 74 68 65 20 62 69 6e 61 72  art of the binar
12450 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20  y .** changeset 
12460 66 6f 72 6d 61 74 29 20 74 6f 20 62 75 66 66 65  format) to buffe
12470 72 20 2a 70 42 75 66 2e 20 49 66 20 61 6e 20 65  r *pBuf. If an e
12480 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
12490 20 2a 70 52 63 20 74 6f 20 61 6e 0a 2a 2a 20 53   *pRc to an.** S
124a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
124b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
124c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
124d0 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 54  d sessionAppendT
124e0 61 62 6c 65 48 64 72 28 0a 20 20 53 65 73 73 69  ableHdr(.  Sessi
124f0 6f 6e 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  onBuffer *pBuf, 
12500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
12510 70 65 6e 64 20 68 65 61 64 65 72 20 74 6f 20 74  pend header to t
12520 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
12530 69 6e 74 20 62 50 61 74 63 68 73 65 74 2c 20 20  int bPatchset,  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 2f 2a 20 55 73 65 20 74 68 65 20 70 61 74 63 68  /* Use the patch
12560 73 65 74 20 66 6f 72 6d 61 74 20 69 66 20 74 72  set format if tr
12570 75 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54  ue */.  SessionT
12580 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
12590 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
125a0 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
125b0 64 20 68 65 61 64 65 72 20 66 6f 72 20 2a 2f 0a  d header for */.
125c0 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
125f0 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
12600 2f 2a 20 57 72 69 74 65 20 61 20 74 61 62 6c 65  /* Write a table
12610 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 65 73   header */.  ses
12620 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 70  sionAppendByte(p
12630 42 75 66 2c 20 28 62 50 61 74 63 68 73 65 74 20  Buf, (bPatchset 
12640 3f 20 27 50 27 20 3a 20 27 54 27 29 2c 20 70 52  ? 'P' : 'T'), pR
12650 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70  c);.  sessionApp
12660 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
12670 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 52 63 29  pTab->nCol, pRc)
12680 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ;.  sessionAppen
12690 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 54 61 62  dBlob(pBuf, pTab
126a0 2d 3e 61 62 50 4b 2c 20 70 54 61 62 2d 3e 6e 43  ->abPK, pTab->nC
126b0 6f 6c 2c 20 70 52 63 29 3b 0a 20 20 73 65 73 73  ol, pRc);.  sess
126c0 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  ionAppendBlob(pB
126d0 75 66 2c 20 28 75 38 20 2a 29 70 54 61 62 2d 3e  uf, (u8 *)pTab->
126e0 7a 4e 61 6d 65 2c 20 28 69 6e 74 29 73 74 72 6c  zName, (int)strl
126f0 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 2b  en(pTab->zName)+
12700 31 2c 20 70 52 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  1, pRc);.}../*.*
12710 2a 20 47 65 6e 65 72 61 74 65 20 65 69 74 68 65  * Generate eithe
12720 72 20 61 20 63 68 61 6e 67 65 73 65 74 20 28 69  r a changeset (i
12730 66 20 61 72 67 75 6d 65 6e 74 20 62 50 61 74 63  f argument bPatc
12740 68 73 65 74 20 69 73 20 7a 65 72 6f 29 20 6f 72  hset is zero) or
12750 20 61 20 70 61 74 63 68 73 65 74 0a 2a 2a 20 28   a patchset.** (
12760 69 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  if it is non-zer
12770 6f 29 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  o) based on the 
12780 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
12790 20 6f 66 20 74 68 65 20 73 65 73 73 69 6f 6e 20   of the session 
127a0 6f 62 6a 65 63 74 0a 2a 2a 20 70 61 73 73 65 64  object.** passed
127b0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
127c0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
127d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
127e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
127f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
12800 6e 65 77 20 63 68 61 6e 67 65 73 65 74 2f 70 61  new changeset/pa
12810 74 63 68 73 65 74 0a 2a 2a 20 73 74 6f 72 65 64  tchset.** stored
12820 20 69 6e 20 6f 75 74 70 75 74 20 76 61 72 69 61   in output varia
12830 62 6c 65 73 20 2a 70 6e 43 68 61 6e 67 65 73 65  bles *pnChangese
12840 74 20 61 6e 64 20 2a 70 70 43 68 61 6e 67 65 73  t and *ppChanges
12850 65 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  et. Or, if an er
12860 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  ror.** occurs, a
12870 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
12880 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
12890 61 6e 64 20 62 6f 74 68 20 6f 75 74 70 75 74 20  and both output 
128a0 76 61 72 69 61 62 6c 65 73 20 73 65 74 20 0a 2a  variables set .*
128b0 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
128c0 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 47 65 6e  c int sessionGen
128d0 65 72 61 74 65 43 68 61 6e 67 65 73 65 74 28 0a  erateChangeset(.
128e0 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
128f0 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
12900 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
12910 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 50 61  ect */.  int bPa
12920 74 63 68 73 65 74 2c 20 20 20 20 20 20 20 20 20  tchset,         
12930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
12940 20 66 6f 72 20 70 61 74 63 68 73 65 74 2c 20 66   for patchset, f
12950 61 6c 73 65 20 66 6f 72 20 63 68 61 6e 67 65 73  alse for changes
12960 65 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 4f  et */.  int (*xO
12970 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
12980 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
12990 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
129a0 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ,.  void *pOut, 
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
129d0 75 6d 65 6e 74 20 66 6f 72 20 78 4f 75 74 70 75  ument for xOutpu
129e0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68  t */.  int *pnCh
129f0 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
12a00 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
12a10 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 74  ize of buffer at
12a20 20 2a 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f   *ppChangeset */
12a30 0a 20 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e  .  void **ppChan
12a40 67 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  geset           
12a50 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65     /* OUT: Buffe
12a60 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61  r containing cha
12a70 6e 67 65 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 73  ngeset */.){.  s
12a80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 65  qlite3 *db = pSe
12a90 73 73 69 6f 6e 2d 3e 64 62 3b 20 20 20 20 20 2f  ssion->db;     /
12aa0 2a 20 53 6f 75 72 63 65 20 64 61 74 61 62 61 73  * Source databas
12ab0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
12ac0 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62  ssionTable *pTab
12ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12ae0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
12af0 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
12b00 64 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 53 65  d tables */.  Se
12b10 73 73 69 6f 6e 42 75 66 66 65 72 20 62 75 66 20  ssionBuffer buf 
12b20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 2f 2a  = {0,0,0};    /*
12b30 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
12b40 20 74 6f 20 61 63 63 75 6d 6c 61 74 65 20 63 68   to accumlate ch
12b50 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74  angeset */.  int
12b60 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
12b90 20 20 61 73 73 65 72 74 28 20 78 4f 75 74 70 75    assert( xOutpu
12ba0 74 3d 3d 30 20 7c 7c 20 28 70 6e 43 68 61 6e 67  t==0 || (pnChang
12bb0 65 73 65 74 3d 3d 30 20 26 26 20 70 70 43 68 61  eset==0 && ppCha
12bc0 6e 67 65 73 65 74 3d 3d 30 20 29 20 29 3b 0a 0a  ngeset==0 ) );..
12bd0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6f 75    /* Zero the ou
12be0 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 69  tput variables i
12bf0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
12c00 6f 63 63 75 72 73 2e 20 49 66 20 74 68 69 73 20  occurs. If this 
12c10 73 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 6f 62 6a  session.  ** obj
12c20 65 63 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  ect is already i
12c30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
12c40 65 20 28 73 71 6c 69 74 65 33 5f 73 65 73 73 69  e (sqlite3_sessi
12c50 6f 6e 2e 72 63 20 21 3d 20 53 51 4c 49 54 45 5f  on.rc != SQLITE_
12c60 4f 4b 29 2c 0a 20 20 2a 2a 20 74 68 69 73 20 63  OK),.  ** this c
12c70 61 6c 6c 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  all will be a no
12c80 2d 6f 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 78  -op.  */.  if( x
12c90 4f 75 74 70 75 74 3d 3d 30 20 29 7b 0a 20 20 20  Output==0 ){.   
12ca0 20 2a 70 6e 43 68 61 6e 67 65 73 65 74 20 3d 20   *pnChangeset = 
12cb0 30 3b 0a 20 20 20 20 2a 70 70 43 68 61 6e 67 65  0;.    *ppChange
12cc0 73 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  set = 0;.  }..  
12cd0 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 72 63  if( pSession->rc
12ce0 20 29 20 72 65 74 75 72 6e 20 70 53 65 73 73 69   ) return pSessi
12cf0 6f 6e 2d 3e 72 63 3b 0a 20 20 72 63 20 3d 20 73  on->rc;.  rc = s
12d00 71 6c 69 74 65 33 5f 65 78 65 63 28 70 53 65 73  qlite3_exec(pSes
12d10 73 69 6f 6e 2d 3e 64 62 2c 20 22 53 41 56 45 50  sion->db, "SAVEP
12d20 4f 49 4e 54 20 63 68 61 6e 67 65 73 65 74 22 2c  OINT changeset",
12d30 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
12d40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 73   return rc;..  s
12d60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12d70 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  er(sqlite3_db_mu
12d80 74 65 78 28 64 62 29 29 3b 0a 0a 20 20 66 6f 72  tex(db));..  for
12d90 28 70 54 61 62 3d 70 53 65 73 73 69 6f 6e 2d 3e  (pTab=pSession->
12da0 70 54 61 62 6c 65 3b 20 72 63 3d 3d 53 51 4c 49  pTable; rc==SQLI
12db0 54 45 5f 4f 4b 20 26 26 20 70 54 61 62 3b 20 70  TE_OK && pTab; p
12dc0 54 61 62 3d 70 54 61 62 2d 3e 70 4e 65 78 74 29  Tab=pTab->pNext)
12dd0 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  {.    if( pTab->
12de0 6e 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 20  nEntry ){.      
12df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
12e00 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
12e10 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12e40 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
12e50 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 62   */.      u8 *ab
12e60 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  PK;             
12e70 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79        /* Primary
12e80 20 6b 65 79 20 61 72 72 61 79 20 2a 2f 0a 20 20   key array */.  
12e90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12ea0 2a 61 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20  *azCol = 0;     
12eb0 2f 2a 20 54 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  /* Table columns
12ec0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
12ef0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
12f00 20 68 61 73 68 20 62 75 63 6b 65 74 73 20 2a 2f   hash buckets */
12f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12f20 74 6d 74 20 2a 70 53 65 6c 20 3d 20 30 3b 20 20  tmt *pSel = 0;  
12f30 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
12f40 74 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79 20  tement to query 
12f50 74 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20  table pTab */.  
12f60 20 20 20 20 69 6e 74 20 6e 52 65 77 69 6e 64 20      int nRewind 
12f70 3d 20 62 75 66 2e 6e 42 75 66 3b 20 20 20 20 20  = buf.nBuf;     
12f80 2f 2a 20 49 6e 69 74 69 61 6c 20 73 69 7a 65 20  /* Initial size 
12f90 6f 66 20 77 72 69 74 65 20 62 75 66 66 65 72 20  of write buffer 
12fa0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  */.      int nNo
12fb0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
12fc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
12fd0 62 75 66 66 65 72 20 61 66 74 65 72 20 77 72 69  buffer after wri
12fe0 74 69 6e 67 20 74 62 6c 20 68 65 61 64 65 72 20  ting tbl header 
12ff0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
13000 63 6b 20 74 68 65 20 74 61 62 6c 65 20 73 63 68  ck the table sch
13010 65 6d 61 20 69 73 20 73 74 69 6c 6c 20 4f 6b 2e  ema is still Ok.
13020 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
13030 65 73 73 69 6f 6e 54 61 62 6c 65 49 6e 66 6f 28  essionTableInfo(
13040 64 62 2c 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 44  db, pSession->zD
13050 62 2c 20 7a 4e 61 6d 65 2c 20 26 6e 43 6f 6c 2c  b, zName, &nCol,
13060 20 30 2c 20 26 61 7a 43 6f 6c 2c 20 26 61 62 50   0, &azCol, &abP
13070 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  K);.      if( !r
13080 63 20 26 26 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  c && (pTab->nCol
13090 21 3d 6e 43 6f 6c 20 7c 7c 20 6d 65 6d 63 6d 70  !=nCol || memcmp
130a0 28 61 62 50 4b 2c 20 70 54 61 62 2d 3e 61 62 50  (abPK, pTab->abP
130b0 4b 2c 20 6e 43 6f 6c 29 29 20 29 7b 0a 20 20 20  K, nCol)) ){.   
130c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
130d0 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 20 20 7d  _SCHEMA;.      }
130e0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
130f0 20 61 20 74 61 62 6c 65 20 68 65 61 64 65 72 20   a table header 
13100 2a 2f 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e  */.      session
13110 41 70 70 65 6e 64 54 61 62 6c 65 48 64 72 28 26  AppendTableHdr(&
13120 62 75 66 2c 20 62 50 61 74 63 68 73 65 74 2c 20  buf, bPatchset, 
13130 70 54 61 62 2c 20 26 72 63 29 3b 0a 0a 20 20 20  pTab, &rc);..   
13140 20 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 64 20     /* Build and 
13150 63 6f 6d 70 69 6c 65 20 61 20 73 74 61 74 65 6d  compile a statem
13160 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 3a 20  ent to execute: 
13170 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
13180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13190 20 20 20 20 20 20 72 63 20 3d 20 73 65 73 73 69        rc = sessi
131a0 6f 6e 53 65 6c 65 63 74 53 74 6d 74 28 0a 20 20  onSelectStmt(.  
131b0 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70 53            db, pS
131c0 65 73 73 69 6f 6e 2d 3e 7a 44 62 2c 20 7a 4e 61  ession->zDb, zNa
131d0 6d 65 2c 20 6e 43 6f 6c 2c 20 61 7a 43 6f 6c 2c  me, nCol, azCol,
131e0 20 61 62 50 4b 2c 20 26 70 53 65 6c 29 3b 0a 20   abPK, &pSel);. 
131f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 4e       }..      nN
13200 6f 6f 70 20 3d 20 62 75 66 2e 6e 42 75 66 3b 0a  oop = buf.nBuf;.
13210 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13220 3c 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65 20 26  <pTab->nChange &
13230 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
13240 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53   i++){.        S
13250 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 3b  essionChange *p;
13260 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13270 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
13280 75 67 68 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ugh changes */..
13290 20 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 54          for(p=pT
132a0 61 62 2d 3e 61 70 43 68 61 6e 67 65 5b 69 5d 3b  ab->apChange[i];
132b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
132c0 26 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  & p; p=p->pNext)
132d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
132e0 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 42 69   sessionSelectBi
132f0 6e 64 28 70 53 65 6c 2c 20 6e 43 6f 6c 2c 20 61  nd(pSel, nCol, a
13300 62 50 4b 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  bPK, p);.       
13310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13320 45 5f 4f 4b 20 29 20 63 6f 6e 74 69 6e 75 65 3b  E_OK ) continue;
13330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
13340 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
13350 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
13360 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13370 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
13380 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20 20  NSERT ){.       
13390 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
133a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
133b0 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65  essionAppendByte
133c0 28 26 62 75 66 2c 20 53 51 4c 49 54 45 5f 49 4e  (&buf, SQLITE_IN
133d0 53 45 52 54 2c 20 26 72 63 29 3b 0a 20 20 20 20  SERT, &rc);.    
133e0 20 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f            sessio
133f0 6e 41 70 70 65 6e 64 42 79 74 65 28 26 62 75 66  nAppendByte(&buf
13400 2c 20 70 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20  , p->bIndirect, 
13410 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &rc);.          
13420 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
13430 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  iCol<nCol; iCol+
13440 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13450 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
13460 64 43 6f 6c 28 26 62 75 66 2c 20 70 53 65 6c 2c  dCol(&buf, pSel,
13470 20 69 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20   iCol, &rc);.   
13480 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13490 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
134b0 20 3d 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64   = sessionAppend
134c0 55 70 64 61 74 65 28 26 62 75 66 2c 20 62 50 61  Update(&buf, bPa
134d0 74 63 68 73 65 74 2c 20 70 53 65 6c 2c 20 70 2c  tchset, pSel, p,
134e0 20 61 62 50 4b 29 3b 0a 20 20 20 20 20 20 20 20   abPK);.        
134f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13500 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 21  }else if( p->op!
13510 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29  =SQLITE_INSERT )
13520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
13530 20 3d 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64   = sessionAppend
13540 44 65 6c 65 74 65 28 26 62 75 66 2c 20 62 50 61  Delete(&buf, bPa
13550 74 63 68 73 65 74 2c 20 70 2c 20 6e 43 6f 6c 2c  tchset, p, nCol,
13560 20 61 62 50 4b 29 3b 0a 20 20 20 20 20 20 20 20   abPK);.        
13570 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
13580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
135a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
135b0 74 28 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSel);.       
135c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
135d0 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  /* If the buffer
135e0 20 69 73 20 6e 6f 77 20 6c 61 72 67 65 72 20 74   is now larger t
135f0 68 61 6e 20 73 65 73 73 69 6f 6e 73 5f 73 74 72  han sessions_str
13600 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65 2c 20 70 61  m_chunk_size, pa
13610 73 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ss.          ** 
13620 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20  its contents to 
13630 74 68 65 20 78 4f 75 74 70 75 74 28 29 20 63 61  the xOutput() ca
13640 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
13650 20 20 20 20 20 69 66 28 20 78 4f 75 74 70 75 74       if( xOutput
13660 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
13670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
13680 20 20 20 20 20 20 20 20 20 20 26 26 20 62 75 66            && buf
13690 2e 6e 42 75 66 3e 6e 4e 6f 6f 70 20 0a 20 20 20  .nBuf>nNoop .   
136a0 20 20 20 20 20 20 20 20 26 26 20 62 75 66 2e 6e          && buf.n
136b0 42 75 66 3e 73 65 73 73 69 6f 6e 73 5f 73 74 72  Buf>sessions_str
136c0 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65 20 0a 20 20  m_chunk_size .  
136d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
136e0 20 20 20 20 20 20 20 72 63 20 3d 20 78 4f 75 74         rc = xOut
136f0 70 75 74 28 70 4f 75 74 2c 20 28 76 6f 69 64 2a  put(pOut, (void*
13700 29 62 75 66 2e 61 42 75 66 2c 20 62 75 66 2e 6e  )buf.aBuf, buf.n
13710 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
13720 20 20 6e 4e 6f 6f 70 20 3d 20 2d 31 3b 0a 20 20    nNoop = -1;.  
13730 20 20 20 20 20 20 20 20 20 20 62 75 66 2e 6e 42            buf.nB
13740 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  uf = 0;.        
13750 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 7d 0a 20    }..        }. 
13760 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
13770 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13780 53 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sel);.      if( 
13790 62 75 66 2e 6e 42 75 66 3d 3d 6e 4e 6f 6f 70 20  buf.nBuf==nNoop 
137a0 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 2e 6e  ){.        buf.n
137b0 42 75 66 20 3d 20 6e 52 65 77 69 6e 64 3b 0a 20  Buf = nRewind;. 
137c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
137d0 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
137e0 29 61 7a 43 6f 6c 29 3b 20 20 2f 2a 20 63 61 73  )azCol);  /* cas
137f0 74 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 56  t works around V
13800 43 2b 2b 20 62 75 67 20 2a 2f 0a 20 20 20 20 7d  C++ bug */.    }
13810 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
13820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13830 20 69 66 28 20 78 4f 75 74 70 75 74 3d 3d 30 20   if( xOutput==0 
13840 29 7b 0a 20 20 20 20 20 20 2a 70 6e 43 68 61 6e  ){.      *pnChan
13850 67 65 73 65 74 20 3d 20 62 75 66 2e 6e 42 75 66  geset = buf.nBuf
13860 3b 0a 20 20 20 20 20 20 2a 70 70 43 68 61 6e 67  ;.      *ppChang
13870 65 73 65 74 20 3d 20 62 75 66 2e 61 42 75 66 3b  eset = buf.aBuf;
13880 0a 20 20 20 20 20 20 62 75 66 2e 61 42 75 66 20  .      buf.aBuf 
13890 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
138a0 66 28 20 62 75 66 2e 6e 42 75 66 3e 30 20 29 7b  f( buf.nBuf>0 ){
138b0 0a 20 20 20 20 20 20 72 63 20 3d 20 78 4f 75 74  .      rc = xOut
138c0 70 75 74 28 70 4f 75 74 2c 20 28 76 6f 69 64 2a  put(pOut, (void*
138d0 29 62 75 66 2e 61 42 75 66 2c 20 62 75 66 2e 6e  )buf.aBuf, buf.n
138e0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
138f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13900 62 75 66 2e 61 42 75 66 29 3b 0a 20 20 73 71 6c  buf.aBuf);.  sql
13910 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 52  ite3_exec(db, "R
13920 45 4c 45 41 53 45 20 63 68 61 6e 67 65 73 65 74  ELEASE changeset
13930 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  ", 0, 0, 0);.  s
13940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13950 76 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  ve(sqlite3_db_mu
13960 74 65 78 28 64 62 29 29 3b 0a 20 20 72 65 74 75  tex(db));.  retu
13970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13980 4f 62 74 61 69 6e 20 61 20 63 68 61 6e 67 65 73  Obtain a changes
13990 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  et object contai
139a0 6e 69 6e 67 20 61 6c 6c 20 63 68 61 6e 67 65 73  ning all changes
139b0 20 72 65 63 6f 72 64 65 64 20 62 79 20 74 68 65   recorded by the
139c0 20 0a 2a 2a 20 73 65 73 73 69 6f 6e 20 6f 62 6a   .** session obj
139d0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
139e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
139f0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
13a00 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
13a10 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
13a20 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
13a30 65 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  e the buffer .**
13a40 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
13a50 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
13a60 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61  lite3session_cha
13a70 6e 67 65 73 65 74 28 0a 20 20 73 71 6c 69 74 65  ngeset(.  sqlite
13a80 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  3_session *pSess
13a90 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 53 65 73  ion,      /* Ses
13aa0 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  sion object */. 
13ab0 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 73 65   int *pnChangese
13ac0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13ad0 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
13ae0 20 62 75 66 66 65 72 20 61 74 20 2a 70 70 43 68   buffer at *ppCh
13af0 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69  angeset */.  voi
13b00 64 20 2a 2a 70 70 43 68 61 6e 67 65 73 65 74 20  d **ppChangeset 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b20 4f 55 54 3a 20 42 75 66 66 65 72 20 63 6f 6e 74  OUT: Buffer cont
13b30 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74  aining changeset
13b40 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
13b50 73 65 73 73 69 6f 6e 47 65 6e 65 72 61 74 65 43  sessionGenerateC
13b60 68 61 6e 67 65 73 65 74 28 70 53 65 73 73 69 6f  hangeset(pSessio
13b70 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 70 6e 43 68  n, 0, 0, 0, pnCh
13b80 61 6e 67 65 73 65 74 2c 20 70 70 43 68 61 6e 67  angeset, ppChang
13b90 65 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eset);.}../*.** 
13ba0 53 74 72 65 61 6d 69 6e 67 20 76 65 72 73 69 6f  Streaming versio
13bb0 6e 20 6f 66 20 73 71 6c 69 74 65 33 73 65 73 73  n of sqlite3sess
13bc0 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 29 2e  ion_changeset().
13bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .*/.int sqlite3s
13be0 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
13bf0 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
13c00 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
13c10 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  on,.  int (*xOut
13c20 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
13c30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
13c40 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
13c50 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 7b 0a    void *pOut.){.
13c60 20 20 72 65 74 75 72 6e 20 73 65 73 73 69 6f 6e    return session
13c70 47 65 6e 65 72 61 74 65 43 68 61 6e 67 65 73 65  GenerateChangese
13c80 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 78  t(pSession, 0, x
13c90 4f 75 74 70 75 74 2c 20 70 4f 75 74 2c 20 30 2c  Output, pOut, 0,
13ca0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   0);.}../*.** St
13cb0 72 65 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e 20  reaming version 
13cc0 6f 66 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  of sqlite3sessio
13cd0 6e 5f 70 61 74 63 68 73 65 74 28 29 2e 0a 2a 2f  n_patchset()..*/
13ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73  .int sqlite3sess
13cf0 69 6f 6e 5f 70 61 74 63 68 73 65 74 5f 73 74 72  ion_patchset_str
13d00 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  m(.  sqlite3_ses
13d10 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a  sion *pSession,.
13d20 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29    int (*xOutput)
13d30 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e  (void *pOut, con
13d40 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
13d50 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f  int nData),.  vo
13d60 69 64 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 72 65  id *pOut.){.  re
13d70 74 75 72 6e 20 73 65 73 73 69 6f 6e 47 65 6e 65  turn sessionGene
13d80 72 61 74 65 43 68 61 6e 67 65 73 65 74 28 70 53  rateChangeset(pS
13d90 65 73 73 69 6f 6e 2c 20 31 2c 20 78 4f 75 74 70  ession, 1, xOutp
13da0 75 74 2c 20 70 4f 75 74 2c 20 30 2c 20 30 29 3b  ut, pOut, 0, 0);
13db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
13dc0 20 61 20 70 61 74 63 68 73 65 74 20 6f 62 6a 65   a patchset obje
13dd0 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  ct containing al
13de0 6c 20 63 68 61 6e 67 65 73 20 72 65 63 6f 72 64  l changes record
13df0 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20 73 65  ed by the .** se
13e00 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ssion object pas
13e10 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
13e20 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
13e30 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
13e40 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
13e50 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
13e60 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 62  ually free the b
13e70 75 66 66 65 72 20 0a 2a 2a 20 75 73 69 6e 67 20  uffer .** using 
13e80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
13e90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
13ea0 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 0a  ssion_patchset(.
13eb0 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
13ec0 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
13ed0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
13ee0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
13ef0 50 61 74 63 68 73 65 74 2c 20 20 20 20 20 20 20  Patchset,       
13f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13f10 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
13f20 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74 20  at *ppChangeset 
13f30 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 50 61  */.  void **ppPa
13f40 74 63 68 73 65 74 20 20 20 20 20 20 20 20 20 20  tchset          
13f50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66       /* OUT: Buf
13f60 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
13f70 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 7b 0a 20  hangeset */.){. 
13f80 20 72 65 74 75 72 6e 20 73 65 73 73 69 6f 6e 47   return sessionG
13f90 65 6e 65 72 61 74 65 43 68 61 6e 67 65 73 65 74  enerateChangeset
13fa0 28 70 53 65 73 73 69 6f 6e 2c 20 31 2c 20 30 2c  (pSession, 1, 0,
13fb0 20 30 2c 20 70 6e 50 61 74 63 68 73 65 74 2c 20   0, pnPatchset, 
13fc0 70 70 50 61 74 63 68 73 65 74 29 3b 0a 7d 0a 0a  ppPatchset);.}..
13fd0 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
13fe0 64 69 73 61 62 6c 65 20 74 68 65 20 73 65 73 73  disable the sess
13ff0 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ion object passe
14000 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
14010 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
14020 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
14030 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73 65  nable(sqlite3_se
14040 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
14050 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 7b 0a 20   int bEnable){. 
14060 20 69 6e 74 20 72 65 74 3b 0a 20 20 73 71 6c 69   int ret;.  sqli
14070 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14080 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78  sqlite3_db_mutex
14090 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29 3b  (pSession->db));
140a0 0a 20 20 69 66 28 20 62 45 6e 61 62 6c 65 3e 3d  .  if( bEnable>=
140b0 30 20 29 7b 0a 20 20 20 20 70 53 65 73 73 69 6f  0 ){.    pSessio
140c0 6e 2d 3e 62 45 6e 61 62 6c 65 20 3d 20 62 45 6e  n->bEnable = bEn
140d0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 72 65 74 20  able;.  }.  ret 
140e0 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 62 45 6e 61  = pSession->bEna
140f0 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ble;.  sqlite3_m
14100 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
14110 65 33 5f 64 62 5f 6d 75 74 65 78 28 70 53 65 73  e3_db_mutex(pSes
14120 73 69 6f 6e 2d 3e 64 62 29 29 3b 0a 20 20 72 65  sion->db));.  re
14130 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
14140 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
14150 61 62 6c 65 20 74 68 65 20 73 65 73 73 69 6f 6e  able the session
14160 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
14170 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
14180 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
14190 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69  ite3session_indi
141a0 72 65 63 74 28 73 71 6c 69 74 65 33 5f 73 65 73  rect(sqlite3_ses
141b0 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
141c0 69 6e 74 20 62 49 6e 64 69 72 65 63 74 29 7b 0a  int bIndirect){.
141d0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 73 71 6c    int ret;.  sql
141e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
141f0 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  (sqlite3_db_mute
14200 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29  x(pSession->db))
14210 3b 0a 20 20 69 66 28 20 62 49 6e 64 69 72 65 63  ;.  if( bIndirec
14220 74 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 73  t>=0 ){.    pSes
14230 73 69 6f 6e 2d 3e 62 49 6e 64 69 72 65 63 74 20  sion->bIndirect 
14240 3d 20 62 49 6e 64 69 72 65 63 74 3b 0a 20 20 7d  = bIndirect;.  }
14250 0a 20 20 72 65 74 20 3d 20 70 53 65 73 73 69 6f  .  ret = pSessio
14260 6e 2d 3e 62 49 6e 64 69 72 65 63 74 3b 0a 20 20  n->bIndirect;.  
14270 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14280 61 76 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ave(sqlite3_db_m
14290 75 74 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64  utex(pSession->d
142a0 62 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  b));.  return re
142b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
142c0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 72 65  rn true if there
142d0 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
142e0 61 6e 67 65 73 20 74 6f 20 6d 6f 6e 69 74 6f 72  anges to monitor
142f0 65 64 20 74 61 62 6c 65 73 20 72 65 63 6f 72 64  ed tables record
14300 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 73  ed.** by the ses
14310 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73 73  sion object pass
14320 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
14330 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
14340 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69  sqlite3session_i
14350 73 65 6d 70 74 79 28 73 71 6c 69 74 65 33 5f 73  sempty(sqlite3_s
14360 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
14370 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
14380 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65  ;.  SessionTable
14390 20 2a 70 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74   *pTab;..  sqlit
143a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
143b0 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
143c0 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29 3b 0a  pSession->db));.
143d0 20 20 66 6f 72 28 70 54 61 62 3d 70 53 65 73 73    for(pTab=pSess
143e0 69 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20 70 54 61  ion->pTable; pTa
143f0 62 20 26 26 20 72 65 74 3d 3d 30 3b 20 70 54 61  b && ret==0; pTa
14400 62 3d 70 54 61 62 2d 3e 70 4e 65 78 74 29 7b 0a  b=pTab->pNext){.
14410 20 20 20 20 72 65 74 20 3d 20 28 70 54 61 62 2d      ret = (pTab-
14420 3e 6e 45 6e 74 72 79 3e 30 29 3b 0a 20 20 7d 0a  >nEntry>0);.  }.
14430 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14440 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 64 62  leave(sqlite3_db
14450 5f 6d 75 74 65 78 28 70 53 65 73 73 69 6f 6e 2d  _mutex(pSession-
14460 3e 64 62 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  >db));..  return
14470 20 28 72 65 74 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a   (ret==0);.}../*
14480 0a 2a 2a 20 44 6f 20 74 68 65 20 77 6f 72 6b 20  .** Do the work 
14490 66 6f 72 20 65 69 74 68 65 72 20 73 71 6c 69 74  for either sqlit
144a0 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72  e3changeset_star
144b0 74 28 29 20 6f 72 20 73 74 61 72 74 5f 73 74 72  t() or start_str
144c0 6d 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  m()..*/.static i
144d0 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65  nt sessionChange
144e0 73 65 74 53 74 61 72 74 28 0a 20 20 73 71 6c 69  setStart(.  sqli
144f0 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
14500 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f 2a 20 4f  er **pp,    /* O
14510 55 54 3a 20 43 68 61 6e 67 65 73 65 74 20 69 74  UT: Changeset it
14520 65 72 61 74 6f 72 20 68 61 6e 64 6c 65 20 2a 2f  erator handle */
14530 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29  .  int (*xInput)
14540 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
14550 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
14560 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
14570 49 6e 2c 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67  In,.  int nChang
14580 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  eset,           
14590 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
145a0 20 62 75 66 66 65 72 20 70 43 68 61 6e 67 65 73   buffer pChanges
145b0 65 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  et in bytes */. 
145c0 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65   void *pChangese
145d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
145e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
145f0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
14600 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20   changeset */.  
14610 69 6e 74 20 62 49 6e 76 65 72 74 20 20 20 20 20  int bInvert     
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 65 72  /* True to inver
14640 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29  t changeset */.)
14650 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  {.  sqlite3_chan
14660 67 65 73 65 74 5f 69 74 65 72 20 2a 70 52 65 74  geset_iter *pRet
14670 3b 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20  ;   /* Iterator 
14680 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
14690 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
146c0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
146d0 72 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  r iterator */.. 
146e0 20 61 73 73 65 72 74 28 20 78 49 6e 70 75 74 3d   assert( xInput=
146f0 3d 30 20 7c 7c 20 28 70 43 68 61 6e 67 65 73 65  =0 || (pChangese
14700 74 3d 3d 30 20 26 26 20 6e 43 68 61 6e 67 65 73  t==0 && nChanges
14710 65 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  et==0) );..  /* 
14720 5a 65 72 6f 20 74 68 65 20 6f 75 74 70 75 74 20  Zero the output 
14730 76 61 72 69 61 62 6c 65 20 69 6e 20 63 61 73 65  variable in case
14740 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14750 2e 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  . */.  *pp = 0;.
14760 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
14770 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
14780 65 20 69 74 65 72 61 74 6f 72 20 73 74 72 75 63  e iterator struc
14790 74 75 72 65 2e 20 2a 2f 0a 20 20 6e 42 79 74 65  ture. */.  nByte
147a0 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   = sizeof(sqlite
147b0 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
147c0 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 73 71 6c  );.  pRet = (sql
147d0 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
147e0 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ter *)sqlite3_ma
147f0 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
14800 66 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72  f( !pRet ) retur
14810 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14820 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
14830 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
14840 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 29  _changeset_iter)
14850 29 3b 0a 20 20 70 52 65 74 2d 3e 69 6e 2e 61 44  );.  pRet->in.aD
14860 61 74 61 20 3d 20 28 75 38 20 2a 29 70 43 68 61  ata = (u8 *)pCha
14870 6e 67 65 73 65 74 3b 0a 20 20 70 52 65 74 2d 3e  ngeset;.  pRet->
14880 69 6e 2e 6e 44 61 74 61 20 3d 20 6e 43 68 61 6e  in.nData = nChan
14890 67 65 73 65 74 3b 0a 20 20 70 52 65 74 2d 3e 69  geset;.  pRet->i
148a0 6e 2e 78 49 6e 70 75 74 20 3d 20 78 49 6e 70 75  n.xInput = xInpu
148b0 74 3b 0a 20 20 70 52 65 74 2d 3e 69 6e 2e 70 49  t;.  pRet->in.pI
148c0 6e 20 3d 20 70 49 6e 3b 0a 20 20 70 52 65 74 2d  n = pIn;.  pRet-
148d0 3e 69 6e 2e 62 45 6f 66 20 3d 20 28 78 49 6e 70  >in.bEof = (xInp
148e0 75 74 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20 70  ut ? 0 : 1);.  p
148f0 52 65 74 2d 3e 62 49 6e 76 65 72 74 20 3d 20 62  Ret->bInvert = b
14900 49 6e 76 65 72 74 3b 0a 0a 20 20 2f 2a 20 50 6f  Invert;..  /* Po
14910 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  pulate the outpu
14920 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72  t variable and r
14930 65 74 75 72 6e 20 73 75 63 63 65 73 73 2e 20 2a  eturn success. *
14940 2f 0a 20 20 2a 70 70 20 3d 20 70 52 65 74 3b 0a  /.  *pp = pRet;.
14950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14960 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
14970 61 74 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ate an iterator 
14980 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
14990 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
149a0 65 6e 74 73 20 6f 66 20 61 20 63 68 61 6e 67 65  ents of a change
149b0 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
149c0 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61  te3changeset_sta
149d0 72 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  rt(.  sqlite3_ch
149e0 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70  angeset_iter **p
149f0 70 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 68  p,    /* OUT: Ch
14a00 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72  angeset iterator
14a10 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
14a20 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20   nChangeset,    
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a40 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
14a50 43 68 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74  Changeset in byt
14a60 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  es */.  void *pC
14a70 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20 20  hangeset        
14a80 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14a90 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
14aa0 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65 73 65  taining changese
14ab0 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
14ac0 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65   sessionChangese
14ad0 74 53 74 61 72 74 28 70 70 2c 20 30 2c 20 30 2c  tStart(pp, 0, 0,
14ae0 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 70 43 68   nChangeset, pCh
14af0 61 6e 67 65 73 65 74 2c 20 30 29 3b 0a 7d 0a 69  angeset, 0);.}.i
14b00 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
14b10 73 65 74 5f 73 74 61 72 74 5f 76 32 28 0a 20 20  set_start_v2(.  
14b20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
14b30 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20  t_iter **pp,    
14b40 2f 2a 20 4f 55 54 3a 20 43 68 61 6e 67 65 73 65  /* OUT: Changese
14b50 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64 6c  t iterator handl
14b60 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e  e */.  int nChan
14b70 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  geset,          
14b80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14b90 66 20 62 75 66 66 65 72 20 70 43 68 61 6e 67 65  f buffer pChange
14ba0 73 65 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  set in bytes */.
14bb0 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73    void *pChanges
14bc0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
14bd0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14be0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14bf0 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20  g changeset */. 
14c00 20 69 6e 74 20 66 6c 61 67 73 0a 29 7b 0a 20 20   int flags.){.  
14c10 69 6e 74 20 62 49 6e 76 65 72 74 20 3d 20 21 21  int bInvert = !!
14c20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
14c30 43 48 41 4e 47 45 53 45 54 53 54 41 52 54 5f 49  CHANGESETSTART_I
14c40 4e 56 45 52 54 29 3b 0a 20 20 72 65 74 75 72 6e  NVERT);.  return
14c50 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65   sessionChangese
14c60 74 53 74 61 72 74 28 70 70 2c 20 30 2c 20 30 2c  tStart(pp, 0, 0,
14c70 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 70 43 68   nChangeset, pCh
14c80 61 6e 67 65 73 65 74 2c 20 62 49 6e 76 65 72 74  angeset, bInvert
14c90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 65  );.}../*.** Stre
14ca0 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66  aming version of
14cb0 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
14cc0 74 5f 73 74 61 72 74 28 29 2e 0a 2a 2f 0a 69 6e  t_start()..*/.in
14cd0 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  t sqlite3changes
14ce0 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28 0a 20  et_start_strm(. 
14cf0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
14d00 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20  et_iter **pp,   
14d10 20 2f 2a 20 4f 55 54 3a 20 43 68 61 6e 67 65 73   /* OUT: Changes
14d20 65 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64  et iterator hand
14d30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49  le */.  int (*xI
14d40 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
14d50 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
14d60 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
14d70 69 64 20 2a 70 49 6e 0a 29 7b 0a 20 20 72 65 74  id *pIn.){.  ret
14d80 75 72 6e 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  urn sessionChang
14d90 65 73 65 74 53 74 61 72 74 28 70 70 2c 20 78 49  esetStart(pp, xI
14da0 6e 70 75 74 2c 20 70 49 6e 2c 20 30 2c 20 30 2c  nput, pIn, 0, 0,
14db0 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
14dc0 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72  e3changeset_star
14dd0 74 5f 76 32 5f 73 74 72 6d 28 0a 20 20 73 71 6c  t_v2_strm(.  sql
14de0 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
14df0 74 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f 2a 20  ter **pp,    /* 
14e00 4f 55 54 3a 20 43 68 61 6e 67 65 73 65 74 20 69  OUT: Changeset i
14e10 74 65 72 61 74 6f 72 20 68 61 6e 64 6c 65 20 2a  terator handle *
14e20 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  /.  int (*xInput
14e30 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
14e40 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
14e50 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
14e60 70 49 6e 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  pIn,.  int flags
14e70 0a 29 7b 0a 20 20 69 6e 74 20 62 49 6e 76 65 72  .){.  int bInver
14e80 74 20 3d 20 21 21 28 66 6c 61 67 73 20 26 20 53  t = !!(flags & S
14e90 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 53  QLITE_CHANGESETS
14ea0 54 41 52 54 5f 49 4e 56 45 52 54 29 3b 0a 20 20  TART_INVERT);.  
14eb0 72 65 74 75 72 6e 20 73 65 73 73 69 6f 6e 43 68  return sessionCh
14ec0 61 6e 67 65 73 65 74 53 74 61 72 74 28 70 70 2c  angesetStart(pp,
14ed0 20 78 49 6e 70 75 74 2c 20 70 49 6e 2c 20 30 2c   xInput, pIn, 0,
14ee0 20 30 2c 20 62 49 6e 76 65 72 74 29 3b 0a 7d 0a   0, bInvert);.}.
14ef0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 65  ./*.** If the Se
14f00 73 73 69 6f 6e 49 6e 70 75 74 20 6f 62 6a 65 63  ssionInput objec
14f10 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
14f20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
14f30 20 61 20 73 74 72 65 61 6d 69 6e 67 0a 2a 2a 20   a streaming.** 
14f40 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 65 20 62  object and the b
14f50 75 66 66 65 72 20 69 73 20 66 75 6c 6c 2c 20 64  uffer is full, d
14f60 69 73 63 61 72 64 20 73 6f 6d 65 20 64 61 74 61  iscard some data
14f70 20 74 6f 20 66 72 65 65 20 75 70 20 73 70 61 63   to free up spac
14f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
14f90 64 20 73 65 73 73 69 6f 6e 44 69 73 63 61 72 64  d sessionDiscard
14fa0 44 61 74 61 28 53 65 73 73 69 6f 6e 49 6e 70 75  Data(SessionInpu
14fb0 74 20 2a 70 49 6e 29 7b 0a 20 20 69 66 28 20 70  t *pIn){.  if( p
14fc0 49 6e 2d 3e 78 49 6e 70 75 74 20 26 26 20 70 49  In->xInput && pI
14fd0 6e 2d 3e 69 4e 65 78 74 3e 3d 73 65 73 73 69 6f  n->iNext>=sessio
14fe0 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69  ns_strm_chunk_si
14ff0 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d  ze ){.    int nM
15000 6f 76 65 20 3d 20 70 49 6e 2d 3e 62 75 66 2e 6e  ove = pIn->buf.n
15010 42 75 66 20 2d 20 70 49 6e 2d 3e 69 4e 65 78 74  Buf - pIn->iNext
15020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4d  ;.    assert( nM
15030 6f 76 65 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ove>=0 );.    if
15040 28 20 6e 4d 6f 76 65 3e 30 20 29 7b 0a 20 20 20  ( nMove>0 ){.   
15050 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 2d 3e     memmove(pIn->
15060 62 75 66 2e 61 42 75 66 2c 20 26 70 49 6e 2d 3e  buf.aBuf, &pIn->
15070 62 75 66 2e 61 42 75 66 5b 70 49 6e 2d 3e 69 4e  buf.aBuf[pIn->iN
15080 65 78 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  ext], nMove);.  
15090 20 20 7d 0a 20 20 20 20 70 49 6e 2d 3e 62 75 66    }.    pIn->buf
150a0 2e 6e 42 75 66 20 2d 3d 20 70 49 6e 2d 3e 69 4e  .nBuf -= pIn->iN
150b0 65 78 74 3b 0a 20 20 20 20 70 49 6e 2d 3e 69 4e  ext;.    pIn->iN
150c0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  ext = 0;.    pIn
150d0 2d 3e 6e 44 61 74 61 20 3d 20 70 49 6e 2d 3e 62  ->nData = pIn->b
150e0 75 66 2e 6e 42 75 66 3b 0a 20 20 7d 0a 7d 0a 0a  uf.nBuf;.  }.}..
150f0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
15100 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
15110 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73  east nByte bytes
15120 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
15130 65 20 62 75 66 66 65 72 2e 20 4f 72 2c 0a 2a 2a  e buffer. Or,.**
15140 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
15150 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 72 65  t nByte bytes re
15160 6d 61 69 6e 69 6e 67 20 69 6e 20 74 68 65 20 69  maining in the i
15170 6e 70 75 74 2c 20 74 68 61 74 20 61 6c 6c 20 61  nput, that all a
15180 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 64 61 74 61  vailable.** data
15190 20 69 73 20 69 6e 20 74 68 65 20 62 75 66 66 65   is in the buffe
151a0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
151b0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
151c0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
151d0 20 6f 63 63 75 72 73 2c 20 6f 72 20 53 51 4c 49   occurs, or SQLI
151e0 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e  TE_OK otherwise.
151f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
15200 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66 66 65  essionInputBuffe
15210 72 28 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 2a  r(SessionInput *
15220 70 49 6e 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  pIn, int nByte){
15230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15240 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 49 6e  TE_OK;.  if( pIn
15250 2d 3e 78 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  ->xInput ){.    
15260 77 68 69 6c 65 28 20 21 70 49 6e 2d 3e 62 45 6f  while( !pIn->bEo
15270 66 20 26 26 20 28 70 49 6e 2d 3e 69 4e 65 78 74  f && (pIn->iNext
15280 2b 6e 42 79 74 65 29 3e 3d 70 49 6e 2d 3e 6e 44  +nByte)>=pIn->nD
15290 61 74 61 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ata && rc==SQLIT
152a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
152b0 74 20 6e 4e 65 77 20 3d 20 73 65 73 73 69 6f 6e  t nNew = session
152c0 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69 7a  s_strm_chunk_siz
152d0 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  e;..      if( pI
152e0 6e 2d 3e 62 4e 6f 44 69 73 63 61 72 64 3d 3d 30  n->bNoDiscard==0
152f0 20 29 20 73 65 73 73 69 6f 6e 44 69 73 63 61 72   ) sessionDiscar
15300 64 44 61 74 61 28 70 49 6e 29 3b 0a 20 20 20 20  dData(pIn);.    
15310 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
15320 3d 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47 72  =sessionBufferGr
15330 6f 77 28 26 70 49 6e 2d 3e 62 75 66 2c 20 6e 4e  ow(&pIn->buf, nN
15340 65 77 2c 20 26 72 63 29 20 29 7b 0a 20 20 20 20  ew, &rc) ){.    
15350 20 20 20 20 72 63 20 3d 20 70 49 6e 2d 3e 78 49      rc = pIn->xI
15360 6e 70 75 74 28 70 49 6e 2d 3e 70 49 6e 2c 20 26  nput(pIn->pIn, &
15370 70 49 6e 2d 3e 62 75 66 2e 61 42 75 66 5b 70 49  pIn->buf.aBuf[pI
15380 6e 2d 3e 62 75 66 2e 6e 42 75 66 5d 2c 20 26 6e  n->buf.nBuf], &n
15390 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
153a0 28 20 6e 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( nNew==0 ){.   
153b0 20 20 20 20 20 20 20 70 49 6e 2d 3e 62 45 6f 66         pIn->bEof
153c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
153d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
153e0 49 6e 2d 3e 62 75 66 2e 6e 42 75 66 20 2b 3d 20  In->buf.nBuf += 
153f0 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nNew;.        }.
15400 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
15410 49 6e 2d 3e 61 44 61 74 61 20 3d 20 70 49 6e 2d  In->aData = pIn-
15420 3e 62 75 66 2e 61 42 75 66 3b 0a 20 20 20 20 20  >buf.aBuf;.     
15430 20 70 49 6e 2d 3e 6e 44 61 74 61 20 3d 20 70 49   pIn->nData = pI
15440 6e 2d 3e 62 75 66 2e 6e 42 75 66 3b 0a 20 20 20  n->buf.nBuf;.   
15450 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  rc;.}../*.** Whe
15470 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
15480 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 52 65  is called, *ppRe
15490 63 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  c points to the 
154a0 73 74 61 72 74 20 6f 66 20 61 20 72 65 63 6f 72  start of a recor
154b0 64 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  d.** that contai
154c0 6e 73 20 6e 43 6f 6c 20 76 61 6c 75 65 73 2e 20  ns nCol values. 
154d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
154e0 76 61 6e 63 65 73 20 74 68 65 20 70 6f 69 6e 74  vances the point
154f0 65 72 20 2a 70 70 52 65 63 0a 2a 2a 20 75 6e 74  er *ppRec.** unt
15500 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
15510 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
15520 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
15530 68 61 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 73  hat record..*/.s
15540 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
15550 6f 6e 53 6b 69 70 52 65 63 6f 72 64 28 0a 20 20  onSkipRecord(.  
15560 75 38 20 2a 2a 70 70 52 65 63 2c 20 20 20 20 20  u8 **ppRec,     
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 65 63 6f 72  /* IN/OUT: Recor
15590 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  d pointer */.  i
155a0 6e 74 20 6e 43 6f 6c 20 20 20 20 20 20 20 20 20  nt nCol         
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  * Number of valu
155d0 65 73 20 69 6e 20 72 65 63 6f 72 64 20 2a 2f 0a  es in record */.
155e0 29 7b 0a 20 20 75 38 20 2a 61 52 65 63 20 3d 20  ){.  u8 *aRec = 
155f0 2a 70 70 52 65 63 3b 0a 20 20 69 6e 74 20 69 3b  *ppRec;.  int i;
15600 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
15610 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
15620 74 20 65 54 79 70 65 20 3d 20 2a 61 52 65 63 2b  t eType = *aRec+
15630 2b 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  +;.    if( eType
15640 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
15650 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
15660 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  LOB ){.      int
15670 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 61 52   nByte;.      aR
15680 65 63 20 2b 3d 20 73 65 73 73 69 6f 6e 56 61 72  ec += sessionVar
15690 69 6e 74 47 65 74 28 28 75 38 2a 29 61 52 65 63  intGet((u8*)aRec
156a0 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
156b0 20 61 52 65 63 20 2b 3d 20 6e 42 79 74 65 3b 0a   aRec += nByte;.
156c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54      }else if( eT
156d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
156e0 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  GER || eType==SQ
156f0 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
15700 20 20 20 20 61 52 65 63 20 2b 3d 20 38 3b 0a 20      aRec += 8;. 
15710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 52     }.  }..  *ppR
15720 65 63 20 3d 20 61 52 65 63 3b 0a 7d 0a 0a 2f 2a  ec = aRec;.}../*
15730 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15740 6e 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  n sets the value
15750 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
15760 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 70 61 73  value object pas
15770 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
15780 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
15790 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  a copy of the st
157a0 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 68 65 6c  ring or blob hel
157b0 64 20 69 6e 20 74 68 65 20 61 44 61 74 61 5b 5d  d in the aData[]
157c0 20 0a 2a 2a 20 62 75 66 66 65 72 2e 20 53 51 4c   .** buffer. SQL
157d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
157e0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
157f0 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  , or SQLITE_NOME
15800 4d 20 69 66 20 61 6e 20 4f 4f 4d 0a 2a 2a 20 65  M if an OOM.** e
15810 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
15820 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69  static int sessi
15830 6f 6e 56 61 6c 75 65 53 65 74 53 74 72 28 0a 20  onValueSetStr(. 
15840 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15850 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pVal,           
15860 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75   /* Set the valu
15870 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
15880 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 2c   */.  u8 *aData,
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
158b0 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 69 6e  containing strin
158c0 67 20 6f 72 20 62 6c 6f 62 20 64 61 74 61 20 2a  g or blob data *
158d0 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
15900 75 66 66 65 72 20 61 44 61 74 61 5b 5d 20 69 6e  uffer aData[] in
15910 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 65   bytes */.  u8 e
15920 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
15930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15940 74 72 69 6e 67 20 65 6e 63 6f 64 69 6e 67 20 28  tring encoding (
15950 30 20 66 6f 72 20 62 6c 6f 62 73 29 20 2a 2f 0a  0 for blobs) */.
15960 29 7b 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ){.  /* In theor
15970 79 20 74 68 69 73 20 63 6f 64 65 20 63 6f 75 6c  y this code coul
15980 64 20 6a 75 73 74 20 70 61 73 73 20 53 51 4c 49  d just pass SQLI
15990 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 61 73 20  TE_TRANSIENT as 
159a0 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 61  the final.  ** a
159b0 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
159c0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 29 20  e3ValueSetStr() 
159d0 61 6e 64 20 68 61 76 65 20 74 68 65 20 63 6f 70  and have the cop
159e0 79 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  y created .  ** 
159f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 42  automatically. B
15a00 75 74 20 64 6f 69 6e 67 20 73 6f 20 6d 61 6b 65  ut doing so make
15a10 73 20 69 74 20 64 69 66 66 69 63 75 6c 74 20 74  s it difficult t
15a20 6f 20 64 65 74 65 63 74 20 61 6e 79 20 4f 4f 4d  o detect any OOM
15a30 0a 20 20 2a 2a 20 65 72 72 6f 72 2e 20 48 65 6e  .  ** error. Hen
15a40 63 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  ce the code to c
15a50 72 65 61 74 65 20 74 68 65 20 63 6f 70 79 20 65  reate the copy e
15a60 78 74 65 72 6e 61 6c 6c 79 2e 20 2a 2f 0a 20 20  xternally. */.  
15a70 75 38 20 2a 61 43 6f 70 79 20 3d 20 73 71 6c 69  u8 *aCopy = sqli
15a80 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 28 73 71  te3_malloc64((sq
15a90 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 44 61 74  lite3_int64)nDat
15aa0 61 2b 31 29 3b 0a 20 20 69 66 28 20 61 43 6f 70  a+1);.  if( aCop
15ab0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
15ac0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
15ad0 6d 63 70 79 28 61 43 6f 70 79 2c 20 61 44 61 74  mcpy(aCopy, aDat
15ae0 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 73 71 6c  a, nData);.  sql
15af0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
15b00 70 56 61 6c 2c 20 6e 44 61 74 61 2c 20 28 63 68  pVal, nData, (ch
15b10 61 72 2a 29 61 43 6f 70 79 2c 20 65 6e 63 2c 20  ar*)aCopy, enc, 
15b20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
15b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15b40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  K;.}../*.** Dese
15b50 72 69 61 6c 69 7a 65 20 61 20 73 69 6e 67 6c 65  rialize a single
15b60 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 61 20 62   record from a b
15b70 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
15b80 20 53 65 65 20 22 52 45 43 4f 52 44 20 46 4f 52   See "RECORD FOR
15b90 4d 41 54 22 0a 2a 2a 20 66 6f 72 20 64 65 74 61  MAT".** for deta
15ba0 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ils..**.** When 
15bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15bc0 20 63 61 6c 6c 65 64 2c 20 2a 70 61 43 68 61 6e   called, *paChan
15bd0 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ge points to the
15be0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
15bf0 63 6f 72 64 0a 2a 2a 20 74 6f 20 64 65 73 65 72  cord.** to deser
15c00 69 61 6c 69 7a 65 2e 20 41 73 73 75 6d 69 6e 67  ialize. Assuming
15c10 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
15c20 2c 20 2a 70 61 43 68 61 6e 67 65 20 69 73 20 73  , *paChange is s
15c30 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
15c40 2a 20 6f 6e 65 20 62 79 74 65 20 61 66 74 65 72  * one byte after
15c50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15c60 73 61 6d 65 20 72 65 63 6f 72 64 20 62 65 66 6f  same record befo
15c70 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
15c80 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 49 66 20   returns..** If 
15c90 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61 62 50  the argument abP
15ca0 4b 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  K is NULL, then 
15cb0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61  the record conta
15cc0 69 6e 73 20 6e 43 6f 6c 20 76 61 6c 75 65 73 2e  ins nCol values.
15cd0 20 4f 72 2c 0a 2a 2a 20 69 66 20 61 62 50 4b 20   Or,.** if abPK 
15ce0 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55  is other than NU
15cf0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 63  LL, then the rec
15d00 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ord contains onl
15d10 79 20 74 68 65 20 50 4b 20 66 69 65 6c 64 73 0a  y the PK fields.
15d20 2a 2a 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ** (in other wor
15d30 64 73 2c 20 69 74 20 69 73 20 61 20 70 61 74 63  ds, it is a patc
15d40 68 73 65 74 20 44 45 4c 45 54 45 20 72 65 63 6f  hset DELETE reco
15d50 72 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  rd)..**.** If su
15d60 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 65  ccessful, each e
15d70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 70  lement of the ap
15d80 4f 75 74 5b 5d 20 61 72 72 61 79 20 28 61 6c 6c  Out[] array (all
15d90 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 63 61  ocated by the ca
15da0 6c 6c 65 72 29 0a 2a 2a 20 69 73 20 73 65 74 20  ller).** is set 
15db0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 73  to point to an s
15dc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
15dd0 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
15de0 68 65 20 76 61 6c 75 65 20 72 65 61 64 0a 2a 2a  he value read.**
15df0 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 72 65 73   from the corres
15e00 70 6f 6e 64 69 6e 67 20 70 6f 73 69 74 69 6f 6e  ponding position
15e10 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 20   in the record. 
15e20 49 66 20 74 68 61 74 20 76 61 6c 75 65 20 69 73  If that value is
15e30 20 6e 6f 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 64   not.** included
15e40 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 28   in the record (
15e50 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65  i.e. because the
15e60 20 72 65 63 6f 72 64 20 69 73 20 70 61 72 74 20   record is part 
15e70 6f 66 20 61 6e 20 55 50 44 41 54 45 20 63 68 61  of an UPDATE cha
15e80 6e 67 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 66  nge.** and the f
15e90 69 65 6c 64 20 77 61 73 20 6e 6f 74 20 6d 6f 64  ield was not mod
15ea0 69 66 69 65 64 29 2c 20 74 68 65 20 63 6f 72 72  ified), the corr
15eb0 65 73 70 6f 6e 64 69 6e 67 20 65 6c 65 6d 65 6e  esponding elemen
15ec0 74 20 6f 66 20 61 70 4f 75 74 5b 5d 20 69 73 0a  t of apOut[] is.
15ed0 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  ** set to NULL..
15ee0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
15ef0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15f00 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
15f10 66 72 65 65 20 61 6c 6c 20 73 71 6c 69 74 65 5f  free all sqlite_
15f20 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 73  value structures
15f30 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
15f40 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
15f50 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
15f60 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
15f70 72 6f 72 20 63 6f 64 65 20 28 65 2e 67 2e 20 53  ror code (e.g. S
15f80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 73 20  QLITE_NOMEM) is 
15f90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 54 68 65  returned..** The
15fa0 20 61 70 4f 75 74 5b 5d 20 61 72 72 61 79 20 6d   apOut[] array m
15fb0 61 79 20 68 61 76 65 20 62 65 65 6e 20 70 61 72  ay have been par
15fc0 74 69 61 6c 6c 79 20 70 6f 70 75 6c 61 74 65 64  tially populated
15fd0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
15fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
15ff0 73 69 6f 6e 52 65 61 64 52 65 63 6f 72 64 28 0a  sionReadRecord(.
16000 20 20 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 2a    SessionInput *
16010 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pIn,            
16020 20 20 2f 2a 20 49 6e 70 75 74 20 64 61 74 61 20    /* Input data 
16030 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16060 66 20 76 61 6c 75 65 73 20 69 6e 20 72 65 63 6f  f values in reco
16070 72 64 20 2a 2f 0a 20 20 75 38 20 2a 61 62 50 4b  rd */.  u8 *abPK
16080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16090 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
160a0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
160b0 66 6c 61 67 73 2c 20 6f 72 20 4e 55 4c 4c 20 2a  flags, or NULL *
160c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
160d0 65 20 2a 2a 61 70 4f 75 74 20 20 20 20 20 20 20  e **apOut       
160e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 76 61 6c      /* Write val
160f0 75 65 73 20 74 6f 20 74 68 69 73 20 61 72 72 61  ues to this arra
16100 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  y */.){.  int i;
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
16130 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
16140 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ough columns */.
16150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16160 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  E_OK;..  for(i=0
16170 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 72 63 3d 3d  ; i<nCol && rc==
16180 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
16190 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d  .    int eType =
161a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
161b0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 76 61     /* Type of va
161c0 6c 75 65 20 28 53 51 4c 49 54 45 5f 4e 55 4c 4c  lue (SQLITE_NULL
161d0 2c 20 54 45 58 54 20 65 74 63 2e 29 20 2a 2f 0a  , TEXT etc.) */.
161e0 20 20 20 20 69 66 28 20 61 62 50 4b 20 26 26 20      if( abPK && 
161f0 61 62 50 4b 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  abPK[i]==0 ) con
16200 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
16210 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66 66  sessionInputBuff
16220 65 72 28 70 49 6e 2c 20 39 29 3b 0a 20 20 20 20  er(pIn, 9);.    
16230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16240 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
16250 49 6e 2d 3e 69 4e 65 78 74 3e 3d 70 49 6e 2d 3e  In->iNext>=pIn->
16260 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
16270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
16280 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
16290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
162a0 65 54 79 70 65 20 3d 20 70 49 6e 2d 3e 61 44 61  eType = pIn->aDa
162b0 74 61 5b 70 49 6e 2d 3e 69 4e 65 78 74 2b 2b 5d  ta[pIn->iNext++]
162c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
162d0 28 20 61 70 4f 75 74 5b 69 5d 3d 3d 30 20 29 3b  ( apOut[i]==0 );
162e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
162f0 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pe ){.          
16300 61 70 4f 75 74 5b 69 5d 20 3d 20 73 71 6c 69 74  apOut[i] = sqlit
16310 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
16320 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 70           if( !ap
16330 4f 75 74 5b 69 5d 20 29 20 72 63 20 3d 20 53 51  Out[i] ) rc = SQ
16340 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16350 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16360 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
16370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16380 20 20 20 20 75 38 20 2a 61 56 61 6c 20 3d 20 26      u8 *aVal = &
16390 70 49 6e 2d 3e 61 44 61 74 61 5b 70 49 6e 2d 3e  pIn->aData[pIn->
163a0 69 4e 65 78 74 5d 3b 0a 20 20 20 20 20 20 69 66  iNext];.      if
163b0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
163c0 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53  TEXT || eType==S
163d0 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
163e0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
163f0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 4e  .        pIn->iN
16400 65 78 74 20 2b 3d 20 73 65 73 73 69 6f 6e 56 61  ext += sessionVa
16410 72 69 6e 74 47 65 74 28 61 56 61 6c 2c 20 26 6e  rintGet(aVal, &n
16420 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Byte);.        r
16430 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70 75 74  c = sessionInput
16440 42 75 66 66 65 72 28 70 49 6e 2c 20 6e 42 79 74  Buffer(pIn, nByt
16450 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
16460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
16480 42 79 74 65 3c 30 20 7c 7c 20 6e 42 79 74 65 3e  Byte<0 || nByte>
16490 70 49 6e 2d 3e 6e 44 61 74 61 2d 70 49 6e 2d 3e  pIn->nData-pIn->
164a0 69 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  iNext ){.       
164b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
164c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
164d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
164e0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 65              u8 e
164f0 6e 63 20 3d 20 28 65 54 79 70 65 3d 3d 53 51 4c  nc = (eType==SQL
16500 49 54 45 5f 54 45 58 54 20 3f 20 53 51 4c 49 54  ITE_TEXT ? SQLIT
16510 45 5f 55 54 46 38 20 3a 20 30 29 3b 0a 20 20 20  E_UTF8 : 0);.   
16520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65           rc = se
16530 73 73 69 6f 6e 56 61 6c 75 65 53 65 74 53 74 72  ssionValueSetStr
16540 28 61 70 4f 75 74 5b 69 5d 2c 26 70 49 6e 2d 3e  (apOut[i],&pIn->
16550 61 44 61 74 61 5b 70 49 6e 2d 3e 69 4e 65 78 74  aData[pIn->iNext
16560 5d 2c 6e 42 79 74 65 2c 65 6e 63 29 3b 0a 20 20  ],nByte,enc);.  
16570 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
16580 4e 65 78 74 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Next += nByte;. 
16590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
165a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
165b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
165c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20  LITE_INTEGER || 
165d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
165e0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OAT ){.        s
165f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
16600 20 73 65 73 73 69 6f 6e 47 65 74 49 36 34 28 61   sessionGetI64(a
16610 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Val);.        if
16620 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16630 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
16640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16650 4d 65 6d 53 65 74 49 6e 74 36 34 28 61 70 4f 75  MemSetInt64(apOu
16660 74 5b 69 5d 2c 20 76 29 3b 0a 20 20 20 20 20 20  t[i], v);.      
16670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16680 20 20 20 64 6f 75 62 6c 65 20 64 3b 0a 20 20 20     double d;.   
16690 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
166a0 2c 20 26 76 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &v, 8);.      
166b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
166c0 65 6d 53 65 74 44 6f 75 62 6c 65 28 61 70 4f 75  emSetDouble(apOu
166d0 74 5b 69 5d 2c 20 64 29 3b 0a 20 20 20 20 20 20  t[i], d);.      
166e0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 6e 2d    }.        pIn-
166f0 3e 69 4e 65 78 74 20 2b 3d 20 38 3b 0a 20 20 20  >iNext += 8;.   
16700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16720 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
16730 70 6f 69 6e 74 65 72 20 63 75 72 72 65 6e 74 6c  pointer currentl
16740 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
16750 73 65 63 6f 6e 64 20 62 79 74 65 20 6f 66 20 61  second byte of a
16760 20 74 61 62 6c 65 2d 68 65 61 64 65 72 2e 0a 2a   table-header..*
16770 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  * Specifically, 
16780 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
16790 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 6e 75 6d 62  :.**.**   + numb
167a0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
167b0 20 74 61 62 6c 65 20 28 76 61 72 69 6e 74 29 0a   table (varint).
167c0 2a 2a 20 20 20 2b 20 61 72 72 61 79 20 6f 66 20  **   + array of 
167d0 50 4b 20 66 6c 61 67 73 20 28 31 20 62 79 74 65  PK flags (1 byte
167e0 20 70 65 72 20 63 6f 6c 75 6d 6e 29 2c 0a 2a 2a   per column),.**
167f0 20 20 20 2b 20 74 61 62 6c 65 20 6e 61 6d 65 20     + table name 
16800 28 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 29  (nul terminated)
16810 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
16820 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74 68  ction ensures th
16830 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  at all of the ab
16840 6f 76 65 20 69 73 20 70 72 65 73 65 6e 74 20 69  ove is present i
16850 6e 20 74 68 65 20 69 6e 70 75 74 20 0a 2a 2a 20  n the input .** 
16860 62 75 66 66 65 72 20 28 69 2e 65 2e 20 74 68 61  buffer (i.e. tha
16870 74 20 69 74 20 63 61 6e 20 62 65 20 61 63 63 65  t it can be acce
16880 73 73 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  ssed without any
16890 20 63 61 6c 6c 73 20 74 6f 20 78 49 6e 70 75 74   calls to xInput
168a0 28 29 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ())..** If succe
168b0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
168c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
168d0 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
168e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
168f0 2a 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e  * The input poin
16900 74 65 72 20 69 73 20 6e 6f 74 20 6d 6f 76 65 64  ter is not moved
16910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16920 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
16930 42 75 66 66 65 72 54 62 6c 68 64 72 28 53 65 73  BufferTblhdr(Ses
16940 73 69 6f 6e 49 6e 70 75 74 20 2a 70 49 6e 2c 20  sionInput *pIn, 
16950 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20  int *pnByte){.  
16960 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16970 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  OK;.  int nCol =
16980 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
16990 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 65 73  = 0;..  rc = ses
169a0 73 69 6f 6e 49 6e 70 75 74 42 75 66 66 65 72 28  sionInputBuffer(
169b0 70 49 6e 2c 20 39 29 3b 0a 20 20 69 66 28 20 72  pIn, 9);.  if( r
169c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
169d0 20 20 20 20 6e 52 65 61 64 20 2b 3d 20 73 65 73      nRead += ses
169e0 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 26 70  sionVarintGet(&p
169f0 49 6e 2d 3e 61 44 61 74 61 5b 70 49 6e 2d 3e 69  In->aData[pIn->i
16a00 4e 65 78 74 20 2b 20 6e 52 65 61 64 5d 2c 20 26  Next + nRead], &
16a10 6e 43 6f 6c 29 3b 0a 20 20 20 20 2f 2a 20 54 68  nCol);.    /* Th
16a20 65 20 68 61 72 64 20 75 70 70 65 72 20 6c 69 6d  e hard upper lim
16a30 69 74 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  it for the numbe
16a40 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
16a50 61 6e 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  an SQLite.    **
16a60 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
16a70 69 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  is, according to
16a80 20 73 71 6c 69 74 65 4c 69 6d 69 74 2e 68 2c 20   sqliteLimit.h, 
16a90 33 32 36 37 36 2e 20 53 6f 20 0a 20 20 20 20 2a  32676. So .    *
16aa0 2a 20 63 6f 6e 73 69 64 65 72 20 61 6e 79 20 74  * consider any t
16ab0 61 62 6c 65 2d 68 65 61 64 65 72 20 74 68 61 74  able-header that
16ac0 20 70 75 72 70 6f 72 74 73 20 74 6f 20 68 61 76   purports to hav
16ad0 65 20 6d 6f 72 65 20 74 68 61 6e 20 36 35 35 33  e more than 6553
16ae0 36 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  6 .    ** column
16af0 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 2e  s to be corrupt.
16b00 20 54 68 69 73 20 69 73 20 63 6f 6e 76 65 6e 69   This is conveni
16b10 65 6e 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  ent because othe
16b20 72 77 69 73 65 2c 20 0a 20 20 20 20 2a 2a 20 69  rwise, .    ** i
16b30 66 20 74 68 65 20 28 6e 43 6f 6c 3e 36 35 35 33  f the (nCol>6553
16b40 36 29 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 6c  6) condition bel
16b50 6f 77 20 77 65 72 65 20 6f 6d 69 74 74 65 64 2c  ow were omitted,
16b60 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20   a sufficiently 
16b70 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 76 61  .    ** large va
16b80 6c 75 65 20 66 6f 72 20 6e 43 6f 6c 20 6d 61 79  lue for nCol may
16b90 20 63 61 75 73 65 20 6e 52 65 61 64 20 74 6f 20   cause nRead to 
16ba0 77 72 61 70 20 61 72 6f 75 6e 64 20 61 6e 64 20  wrap around and 
16bb0 62 65 63 6f 6d 65 20 0a 20 20 20 20 2a 2a 20 6e  become .    ** n
16bc0 65 67 61 74 69 76 65 2e 20 4c 65 61 64 69 6e 67  egative. Leading
16bd0 20 74 6f 20 61 20 63 72 61 73 68 2e 20 2a 2f 0a   to a crash. */.
16be0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3c 30 20 7c      if( nCol<0 |
16bf0 7c 20 6e 43 6f 6c 3e 36 35 35 33 36 20 29 7b 0a  | nCol>65536 ){.
16c00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16c10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c30 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70   rc = sessionInp
16c40 75 74 42 75 66 66 65 72 28 70 49 6e 2c 20 6e 52  utBuffer(pIn, nR
16c50 65 61 64 2b 6e 43 6f 6c 2b 31 30 30 29 3b 0a 20  ead+nCol+100);. 
16c60 20 20 20 20 20 6e 52 65 61 64 20 2b 3d 20 6e 43       nRead += nC
16c70 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ol;.    }.  }.. 
16c80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
16c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69  TE_OK ){.    whi
16ca0 6c 65 28 20 28 70 49 6e 2d 3e 69 4e 65 78 74 20  le( (pIn->iNext 
16cb0 2b 20 6e 52 65 61 64 29 3c 70 49 6e 2d 3e 6e 44  + nRead)<pIn->nD
16cc0 61 74 61 20 26 26 20 70 49 6e 2d 3e 61 44 61 74  ata && pIn->aDat
16cd0 61 5b 70 49 6e 2d 3e 69 4e 65 78 74 20 2b 20 6e  a[pIn->iNext + n
16ce0 52 65 61 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  Read] ){.      n
16cf0 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
16d00 20 20 69 66 28 20 28 70 49 6e 2d 3e 69 4e 65 78    if( (pIn->iNex
16d10 74 20 2b 20 6e 52 65 61 64 29 3c 70 49 6e 2d 3e  t + nRead)<pIn->
16d20 6e 44 61 74 61 20 29 20 62 72 65 61 6b 3b 0a 20  nData ) break;. 
16d30 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 49     rc = sessionI
16d40 6e 70 75 74 42 75 66 66 65 72 28 70 49 6e 2c 20  nputBuffer(pIn, 
16d50 6e 52 65 61 64 20 2b 20 31 30 30 29 3b 0a 20 20  nRead + 100);.  
16d60 7d 0a 20 20 2a 70 6e 42 79 74 65 20 3d 20 6e 52  }.  *pnByte = nR
16d70 65 61 64 2b 31 3b 0a 20 20 72 65 74 75 72 6e 20  ead+1;.  return 
16d80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
16d90 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 63   input pointer c
16da0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
16db0 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
16dc0 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66  e of the first f
16dd0 69 65 6c 64 0a 2a 2a 20 6f 66 20 61 20 72 65 63  ield.** of a rec
16de0 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ord consisting o
16df0 66 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 20  f nCol columns. 
16e00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e  This function en
16e10 73 75 72 65 73 20 74 68 65 20 65 6e 74 69 72 65  sures the entire
16e20 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 62 75  .** record is bu
16e30 66 66 65 72 65 64 2e 20 49 74 20 64 6f 65 73 20  ffered. It does 
16e40 6e 6f 74 20 6d 6f 76 65 20 74 68 65 20 69 6e 70  not move the inp
16e50 75 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ut pointer..**.*
16e60 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
16e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16e80 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 42 79  turned and *pnBy
16e90 74 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  te is set to the
16ea0 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
16eb0 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 2e  record in bytes.
16ec0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
16ed0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16ee0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
16ef0 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 65  e.** final value
16f00 20 6f 66 20 2a 70 6e 42 79 74 65 20 69 73 20 75   of *pnByte is u
16f10 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
16f20 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
16f30 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e   int sessionChan
16f40 67 65 73 65 74 42 75 66 66 65 72 52 65 63 6f 72  gesetBufferRecor
16f50 64 28 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75  d(.  SessionInpu
16f60 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20  t *pIn,         
16f70 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 64 61       /* Input da
16f80 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ta */.  int nCol
16f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16fb0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
16fc0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
16fd0 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16ff0 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f  UT: Size of reco
17000 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rd in bytes */.)
17010 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17020 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42  ITE_OK;.  int nB
17030 79 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  yte = 0;.  int i
17040 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
17050 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
17060 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
17070 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 72  int eType;.    r
17080 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70 75 74  c = sessionInput
17090 42 75 66 66 65 72 28 70 49 6e 2c 20 6e 42 79 74  Buffer(pIn, nByt
170a0 65 20 2b 20 31 30 29 3b 0a 20 20 20 20 69 66 28  e + 10);.    if(
170b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
170c0 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  {.      eType = 
170d0 70 49 6e 2d 3e 61 44 61 74 61 5b 70 49 6e 2d 3e  pIn->aData[pIn->
170e0 69 4e 65 78 74 20 2b 20 6e 42 79 74 65 2b 2b 5d  iNext + nByte++]
170f0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
17100 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e==SQLITE_TEXT |
17110 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
17120 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
17130 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 6e  int n;.        n
17140 42 79 74 65 20 2b 3d 20 73 65 73 73 69 6f 6e 56  Byte += sessionV
17150 61 72 69 6e 74 47 65 74 28 26 70 49 6e 2d 3e 61  arintGet(&pIn->a
17160 44 61 74 61 5b 70 49 6e 2d 3e 69 4e 65 78 74 2b  Data[pIn->iNext+
17170 6e 42 79 74 65 5d 2c 20 26 6e 29 3b 0a 20 20 20  nByte], &n);.   
17180 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b       nByte += n;
17190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
171a0 73 73 69 6f 6e 49 6e 70 75 74 42 75 66 66 65 72  ssionInputBuffer
171b0 28 70 49 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (pIn, nByte);.  
171c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54      }else if( eT
171d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
171e0 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  GER || eType==SQ
171f0 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
17200 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 38        nByte += 8
17210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17220 20 20 7d 0a 20 20 2a 70 6e 42 79 74 65 20 3d 20    }.  *pnByte = 
17230 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  nByte;.  return 
17240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
17250 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 63   input pointer c
17260 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
17270 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 62 79  to the second by
17280 74 65 20 6f 66 20 61 20 74 61 62 6c 65 2d 68 65  te of a table-he
17290 61 64 65 72 2e 0a 2a 2a 20 53 70 65 63 69 66 69  ader..** Specifi
172a0 63 61 6c 6c 79 2c 20 74 6f 20 74 68 65 20 66 6f  cally, to the fo
172b0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
172c0 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c   + number of col
172d0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 28 76  umns in table (v
172e0 61 72 69 6e 74 29 0a 2a 2a 20 20 20 2b 20 61 72  arint).**   + ar
172f0 72 61 79 20 6f 66 20 50 4b 20 66 6c 61 67 73 20  ray of PK flags 
17300 28 31 20 62 79 74 65 20 70 65 72 20 63 6f 6c 75  (1 byte per colu
17310 6d 6e 29 2c 0a 2a 2a 20 20 20 2b 20 74 61 62 6c  mn),.**   + tabl
17320 65 20 6e 61 6d 65 20 28 6e 75 6c 20 74 65 72 6d  e name (nul term
17330 69 6e 61 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 54  inated)..**.** T
17340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 63  his function dec
17350 6f 64 65 73 20 74 68 65 20 74 61 62 6c 65 2d 68  odes the table-h
17360 65 61 64 65 72 20 61 6e 64 20 70 6f 70 75 6c 61  eader and popula
17370 74 65 73 20 74 68 65 20 70 2d 3e 6e 43 6f 6c 2c  tes the p->nCol,
17380 20 0a 2a 2a 20 70 2d 3e 7a 54 61 62 20 61 6e 64   .** p->zTab and
17390 20 70 2d 3e 61 62 50 4b 5b 5d 20 76 61 72 69 61   p->abPK[] varia
173a0 62 6c 65 73 20 61 63 63 6f 72 64 69 6e 67 6c 79  bles accordingly
173b0 2e 20 54 68 65 20 70 2d 3e 61 70 56 61 6c 75 65  . The p->apValue
173c0 5b 5d 20 61 72 72 61 79 20 69 73 20 0a 2a 2a 20  [] array is .** 
173d0 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 64 20 6f  also allocated o
173e0 72 20 72 65 73 69 7a 65 64 20 61 63 63 6f 72 64  r resized accord
173f0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 76  ing to the new v
17400 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 43 6f 6c 2e  alue of p->nCol.
17410 20 54 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 6f   The.** input po
17420 69 6e 74 65 72 20 69 73 20 6c 65 66 74 20 70 6f  inter is left po
17430 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 62 79  inting to the by
17440 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  te following the
17450 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e 0a 2a   table header..*
17460 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
17470 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
17480 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
17490 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
174a0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
174b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
174c0 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 73 20 6f  e final values o
174d0 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 66 69  f the various fi
174e0 65 6c 64 73 20 65 6e 75 6d 65 72 61 74 65 64 20  elds enumerated 
174f0 61 62 6f 76 65 0a 2a 2a 20 61 72 65 20 75 6e 64  above.** are und
17500 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
17510 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
17520 6e 67 65 73 65 74 52 65 61 64 54 62 6c 68 64 72  ngesetReadTblhdr
17530 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  (sqlite3_changes
17540 65 74 5f 69 74 65 72 20 2a 70 29 7b 0a 20 20 69  et_iter *p){.  i
17550 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 43 6f  nt rc;.  int nCo
17560 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  py;.  assert( p-
17570 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
17580 3b 0a 0a 20 20 72 63 20 3d 20 73 65 73 73 69 6f  ;..  rc = sessio
17590 6e 43 68 61 6e 67 65 73 65 74 42 75 66 66 65 72  nChangesetBuffer
175a0 54 62 6c 68 64 72 28 26 70 2d 3e 69 6e 2c 20 26  Tblhdr(&p->in, &
175b0 6e 43 6f 70 79 29 3b 0a 20 20 69 66 28 20 72 63  nCopy);.  if( rc
175c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
175d0 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
175e0 20 20 69 6e 74 20 6e 56 61 72 69 6e 74 3b 0a 20    int nVarint;. 
175f0 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73 65 73     nVarint = ses
17600 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 26 70  sionVarintGet(&p
17610 2d 3e 69 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e  ->in.aData[p->in
17620 2e 69 4e 65 78 74 5d 2c 20 26 70 2d 3e 6e 43 6f  .iNext], &p->nCo
17630 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  l);.    if( p->n
17640 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e  Col>0 ){.      n
17650 43 6f 70 79 20 2d 3d 20 6e 56 61 72 69 6e 74 3b  Copy -= nVarint;
17660 0a 20 20 20 20 20 20 70 2d 3e 69 6e 2e 69 4e 65  .      p->in.iNe
17670 78 74 20 2b 3d 20 6e 56 61 72 69 6e 74 3b 0a 20  xt += nVarint;. 
17680 20 20 20 20 20 6e 42 79 74 65 20 3d 20 70 2d 3e       nByte = p->
17690 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 73 71  nCol * sizeof(sq
176a0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 20 2a 20  lite3_value*) * 
176b0 32 20 2b 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20  2 + nCopy;.     
176c0 20 70 2d 3e 74 62 6c 68 64 72 2e 6e 42 75 66 20   p->tblhdr.nBuf 
176d0 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 73 73 69  = 0;.      sessi
176e0 6f 6e 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  onBufferGrow(&p-
176f0 3e 74 62 6c 68 64 72 2c 20 6e 42 79 74 65 2c 20  >tblhdr, nByte, 
17700 26 72 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  &rc);.    }else{
17710 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17720 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
17740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17750 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 69 50  ){.    size_t iP
17760 4b 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  K = sizeof(sqlit
17770 65 33 5f 76 61 6c 75 65 2a 29 2a 70 2d 3e 6e 43  e3_value*)*p->nC
17780 6f 6c 2a 32 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ol*2;.    memset
17790 28 70 2d 3e 74 62 6c 68 64 72 2e 61 42 75 66 2c  (p->tblhdr.aBuf,
177a0 20 30 2c 20 69 50 4b 29 3b 0a 20 20 20 20 6d 65   0, iPK);.    me
177b0 6d 63 70 79 28 26 70 2d 3e 74 62 6c 68 64 72 2e  mcpy(&p->tblhdr.
177c0 61 42 75 66 5b 69 50 4b 5d 2c 20 26 70 2d 3e 69  aBuf[iPK], &p->i
177d0 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e  n.aData[p->in.iN
177e0 65 78 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  ext], nCopy);.  
177f0 20 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 20 2b 3d    p->in.iNext +=
17800 20 6e 43 6f 70 79 3b 0a 20 20 7d 0a 0a 20 20 70   nCopy;.  }..  p
17810 2d 3e 61 70 56 61 6c 75 65 20 3d 20 28 73 71 6c  ->apValue = (sql
17820 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 70 2d 3e  ite3_value**)p->
17830 74 62 6c 68 64 72 2e 61 42 75 66 3b 0a 20 20 70  tblhdr.aBuf;.  p
17840 2d 3e 61 62 50 4b 20 3d 20 28 75 38 2a 29 26 70  ->abPK = (u8*)&p
17850 2d 3e 61 70 56 61 6c 75 65 5b 70 2d 3e 6e 43 6f  ->apValue[p->nCo
17860 6c 2a 32 5d 3b 0a 20 20 70 2d 3e 7a 54 61 62 20  l*2];.  p->zTab 
17870 3d 20 28 63 68 61 72 2a 29 26 70 2d 3e 61 62 50  = (char*)&p->abP
17880 4b 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 72 65  K[p->nCol];.  re
17890 74 75 72 6e 20 28 70 2d 3e 72 63 20 3d 20 72 63  turn (p->rc = rc
178a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
178b0 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 65  nce the changese
178c0 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  t iterator to th
178d0 65 20 6e 65 78 74 20 63 68 61 6e 67 65 2e 0a 2a  e next change..*
178e0 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 70 61 52  *.** If both paR
178f0 65 63 20 61 6e 64 20 70 6e 52 65 63 20 61 72 65  ec and pnRec are
17900 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
17910 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
17920 6c 69 6b 65 20 74 68 65 20 70 75 62 6c 69 63 0a  like the public.
17930 2a 2a 20 41 50 49 20 73 71 6c 69 74 65 33 63 68  ** API sqlite3ch
17940 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 2e 20  angeset_next(). 
17950 49 66 20 53 51 4c 49 54 45 5f 52 4f 57 20 69 73  If SQLITE_ROW is
17960 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
17970 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
17980 61 6e 67 65 73 65 74 5f 6e 65 77 28 29 20 61 6e  angeset_new() an
17990 64 20 6f 6c 64 28 29 20 41 50 49 73 20 6d 61 79  d old() APIs may
179a0 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65 72   be used to quer
179b0 79 20 66 6f 72 20 76 61 6c 75 65 73 2e 0a 2a 2a  y for values..**
179c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
179d0 66 20 70 61 52 65 63 20 61 6e 64 20 70 6e 52 65  f paRec and pnRe
179e0 63 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20  c are not NULL, 
179f0 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
17a00 6f 20 74 68 65 20 63 68 61 6e 67 65 0a 2a 2a 20  o the change.** 
17a10 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
17a20 6e 20 74 6f 20 2a 70 61 52 65 63 20 62 65 66 6f  n to *paRec befo
17a30 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 64  re returning and
17a40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17a50 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 72  ytes in.** the r
17a60 65 63 6f 72 64 20 74 6f 20 2a 70 6e 52 65 63 2e  ecord to *pnRec.
17a70 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  .**.** Either wa
17a80 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
17a90 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
17aa0 52 4f 57 20 69 66 20 74 68 65 20 69 74 65 72 61  ROW if the itera
17ab0 74 6f 72 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  tor is .** succe
17ac0 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65 64  ssfully advanced
17ad0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61   to the next cha
17ae0 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67  nge in the chang
17af0 65 73 65 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  eset, an SQLite 
17b00 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
17b10 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
17b20 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 4f 4e  s, or SQLITE_DON
17b30 45 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  E if there are n
17b40 6f 20 66 75 72 74 68 65 72 20 0a 2a 2a 20 63 68  o further .** ch
17b50 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68 61  anges in the cha
17b60 6e 67 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  ngeset..*/.stati
17b70 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
17b80 6e 67 65 73 65 74 4e 65 78 74 28 0a 20 20 73 71  ngesetNext(.  sq
17b90 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
17ba0 69 74 65 72 20 2a 70 2c 20 20 20 20 20 20 2f 2a  iter *p,      /*
17bb0 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
17bc0 74 6f 72 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61  tor */.  u8 **pa
17bd0 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
17be0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
17bf0 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 72  on-NULL, store r
17c00 65 63 6f 72 64 20 70 6f 69 6e 74 65 72 20 68 65  ecord pointer he
17c10 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  re */.  int *pnR
17c20 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
17c30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
17c40 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 73 69  n-NULL, store si
17c50 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 72  ze of record her
17c60 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
17c70 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
17c80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
17c90 2d 4e 55 4c 4c 2c 20 74 72 75 65 20 69 66 20 6e  -NULL, true if n
17ca0 65 77 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  ew table */.){. 
17cb0 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 6f 70 3b   int i;.  u8 op;
17cc0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 52  ..  assert( (paR
17cd0 65 63 3d 3d 30 20 26 26 20 70 6e 52 65 63 3d 3d  ec==0 && pnRec==
17ce0 30 29 20 7c 7c 20 28 70 61 52 65 63 20 26 26 20  0) || (paRec && 
17cf0 70 6e 52 65 63 29 20 29 3b 0a 0a 20 20 2f 2a 20  pnRec) );..  /* 
17d00 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
17d10 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  is in the error-
17d20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 69 6d  state, return im
17d30 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  mediately. */.  
17d40 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
17d50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 2d  E_OK ) return p-
17d60 3e 72 63 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  >rc;..  /* Free 
17d70 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
17d80 65 6e 74 73 20 6f 66 20 70 2d 3e 61 70 56 61 6c  ents of p->apVal
17d90 75 65 5b 5d 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ue[], if any. */
17da0 0a 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c 75  .  if( p->apValu
17db0 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
17dc0 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 2a 32 3b 20 69  ; i<p->nCol*2; i
17dd0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
17de0 65 33 56 61 6c 75 65 46 72 65 65 28 70 2d 3e 61  e3ValueFree(p->a
17df0 70 56 61 6c 75 65 5b 69 5d 29 3b 0a 20 20 20 20  pValue[i]);.    
17e00 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  }.    memset(p->
17e10 61 70 56 61 6c 75 65 2c 20 30 2c 20 73 69 7a 65  apValue, 0, size
17e20 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
17e30 2a 29 2a 70 2d 3e 6e 43 6f 6c 2a 32 29 3b 0a 20  *)*p->nCol*2);. 
17e40 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
17e50 72 65 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  re the buffer co
17e60 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
17e70 31 30 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75  10 bytes of inpu
17e80 74 20 64 61 74 61 2c 20 6f 72 20 61 6c 6c 0a 20  t data, or all. 
17e90 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 64 61   ** remaining da
17ea0 74 61 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ta if there are 
17eb0 6c 65 73 73 20 74 68 61 6e 20 31 30 20 62 79 74  less than 10 byt
17ec0 65 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  es available. Th
17ed0 69 73 20 69 73 0a 20 20 2a 2a 20 73 75 66 66 69  is is.  ** suffi
17ee0 63 69 65 6e 74 20 65 69 74 68 65 72 20 66 6f 72  cient either for
17ef0 20 74 68 65 20 27 54 27 20 6f 72 20 27 50 27 20   the 'T' or 'P' 
17f00 62 79 74 65 20 61 6e 64 20 74 68 65 20 76 61 72  byte and the var
17f10 69 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  int that follows
17f20 0a 20 20 2a 2a 20 69 74 2c 20 6f 72 20 66 6f 72  .  ** it, or for
17f30 20 74 68 65 20 74 77 6f 20 73 69 6e 67 6c 65 20   the two single 
17f40 62 79 74 65 20 76 61 6c 75 65 73 20 6f 74 68 65  byte values othe
17f50 72 77 69 73 65 2e 20 2a 2f 0a 20 20 70 2d 3e 72  rwise. */.  p->r
17f60 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70 75 74  c = sessionInput
17f70 42 75 66 66 65 72 28 26 70 2d 3e 69 6e 2c 20 32  Buffer(&p->in, 2
17f80 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
17f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17fa0 72 6e 20 70 2d 3e 72 63 3b 0a 0a 20 20 2f 2a 20  rn p->rc;..  /* 
17fb0 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
17fc0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 74 68  is already at th
17fd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 68 61  e end of the cha
17fe0 6e 67 65 73 65 74 2c 20 72 65 74 75 72 6e 20 44  ngeset, return D
17ff0 4f 4e 45 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ONE. */.  if( p-
18000 3e 69 6e 2e 69 4e 65 78 74 3e 3d 70 2d 3e 69 6e  >in.iNext>=p->in
18010 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  .nData ){.    re
18020 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
18030 3b 0a 20 20 7d 0a 0a 20 20 73 65 73 73 69 6f 6e  ;.  }..  session
18040 44 69 73 63 61 72 64 44 61 74 61 28 26 70 2d 3e  DiscardData(&p->
18050 69 6e 29 3b 0a 20 20 70 2d 3e 69 6e 2e 69 43 75  in);.  p->in.iCu
18060 72 72 65 6e 74 20 3d 20 70 2d 3e 69 6e 2e 69 4e  rrent = p->in.iN
18070 65 78 74 3b 0a 0a 20 20 6f 70 20 3d 20 70 2d 3e  ext;..  op = p->
18080 69 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69  in.aData[p->in.i
18090 4e 65 78 74 2b 2b 5d 3b 0a 20 20 77 68 69 6c 65  Next++];.  while
180a0 28 20 6f 70 3d 3d 27 54 27 20 7c 7c 20 6f 70 3d  ( op=='T' || op=
180b0 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='P' ){.    if( 
180c0 70 62 4e 65 77 20 29 20 2a 70 62 4e 65 77 20 3d  pbNew ) *pbNew =
180d0 20 31 3b 0a 20 20 20 20 70 2d 3e 62 50 61 74 63   1;.    p->bPatc
180e0 68 73 65 74 20 3d 20 28 6f 70 3d 3d 27 50 27 29  hset = (op=='P')
180f0 3b 0a 20 20 20 20 69 66 28 20 73 65 73 73 69 6f  ;.    if( sessio
18100 6e 43 68 61 6e 67 65 73 65 74 52 65 61 64 54 62  nChangesetReadTb
18110 6c 68 64 72 28 70 29 20 29 20 72 65 74 75 72 6e  lhdr(p) ) return
18120 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20   p->rc;.    if( 
18130 28 70 2d 3e 72 63 20 3d 20 73 65 73 73 69 6f 6e  (p->rc = session
18140 49 6e 70 75 74 42 75 66 66 65 72 28 26 70 2d 3e  InputBuffer(&p->
18150 69 6e 2c 20 32 29 29 20 29 20 72 65 74 75 72 6e  in, 2)) ) return
18160 20 70 2d 3e 72 63 3b 0a 20 20 20 20 70 2d 3e 69   p->rc;.    p->i
18170 6e 2e 69 43 75 72 72 65 6e 74 20 3d 20 70 2d 3e  n.iCurrent = p->
18180 69 6e 2e 69 4e 65 78 74 3b 0a 20 20 20 20 69 66  in.iNext;.    if
18190 28 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 3e 3d 70  ( p->in.iNext>=p
181a0 2d 3e 69 6e 2e 6e 44 61 74 61 20 29 20 72 65 74  ->in.nData ) ret
181b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
181c0 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 69 6e 2e  .    op = p->in.
181d0 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e 65 78  aData[p->in.iNex
181e0 74 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  t++];.  }..  if(
181f0 20 70 2d 3e 7a 54 61 62 3d 3d 30 20 7c 7c 20 28   p->zTab==0 || (
18200 70 2d 3e 62 50 61 74 63 68 73 65 74 20 26 26 20  p->bPatchset && 
18210 70 2d 3e 62 49 6e 76 65 72 74 29 20 29 7b 0a 20  p->bInvert) ){. 
18220 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
18230 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 68  record in the ch
18240 61 6e 67 65 73 65 74 20 69 73 20 6e 6f 74 20 61  angeset is not a
18250 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20 4d   table header. M
18260 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20  ust be a.    ** 
18270 63 6f 72 72 75 70 74 20 63 68 61 6e 67 65 73 65  corrupt changese
18280 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
18290 28 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 3d 3d 31  ( p->in.iNext==1
182a0 20 7c 7c 20 70 2d 3e 7a 54 61 62 20 29 3b 0a 20   || p->zTab );. 
182b0 20 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63     return (p->rc
182c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
182d0 54 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 0a 20 20  T_BKPT);.  }..  
182e0 70 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 2d  p->op = op;.  p-
182f0 3e 62 49 6e 64 69 72 65 63 74 20 3d 20 70 2d 3e  >bIndirect = p->
18300 69 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69  in.aData[p->in.i
18310 4e 65 78 74 2b 2b 5d 3b 0a 20 20 69 66 28 20 70  Next++];.  if( p
18320 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 55 50 44  ->op!=SQLITE_UPD
18330 41 54 45 20 26 26 20 70 2d 3e 6f 70 21 3d 53 51  ATE && p->op!=SQ
18340 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 70  LITE_DELETE && p
18350 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53  ->op!=SQLITE_INS
18360 45 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ERT ){.    retur
18370 6e 20 28 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  n (p->rc = SQLIT
18380 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 29 3b  E_CORRUPT_BKPT);
18390 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 52 65  .  }..  if( paRe
183a0 63 20 29 7b 20 0a 20 20 20 20 69 6e 74 20 6e 56  c ){ .    int nV
183b0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
183c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
183d0 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62  r of values to b
183e0 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  uffer */.    if(
183f0 20 70 2d 3e 62 50 61 74 63 68 73 65 74 3d 3d 30   p->bPatchset==0
18400 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   && op==SQLITE_U
18410 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  PDATE ){.      n
18420 56 61 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 20 2a 20  Val = p->nCol * 
18430 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
18440 20 70 2d 3e 62 50 61 74 63 68 73 65 74 20 26 26   p->bPatchset &&
18450 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
18460 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 56 61 6c  TE ){.      nVal
18470 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
18480 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
18490 69 2b 2b 29 20 69 66 28 20 70 2d 3e 61 62 50 4b  i++) if( p->abPK
184a0 5b 69 5d 20 29 20 6e 56 61 6c 2b 2b 3b 0a 20 20  [i] ) nVal++;.  
184b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
184c0 56 61 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20  Val = p->nCol;. 
184d0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
184e0 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65   sessionChangese
184f0 74 42 75 66 66 65 72 52 65 63 6f 72 64 28 26 70  tBufferRecord(&p
18500 2d 3e 69 6e 2c 20 6e 56 61 6c 2c 20 70 6e 52 65  ->in, nVal, pnRe
18510 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  c);.    if( p->r
18520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18530 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20  eturn p->rc;.   
18540 20 2a 70 61 52 65 63 20 3d 20 26 70 2d 3e 69 6e   *paRec = &p->in
18550 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e 65  .aData[p->in.iNe
18560 78 74 5d 3b 0a 20 20 20 20 70 2d 3e 69 6e 2e 69  xt];.    p->in.i
18570 4e 65 78 74 20 2b 3d 20 2a 70 6e 52 65 63 3b 0a  Next += *pnRec;.
18580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
18590 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 4f  ite3_value **apO
185a0 6c 64 20 3d 20 28 70 2d 3e 62 49 6e 76 65 72 74  ld = (p->bInvert
185b0 20 3f 20 26 70 2d 3e 61 70 56 61 6c 75 65 5b 70   ? &p->apValue[p
185c0 2d 3e 6e 43 6f 6c 5d 20 3a 20 70 2d 3e 61 70 56  ->nCol] : p->apV
185d0 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
185e0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 4e 65 77  e3_value **apNew
185f0 20 3d 20 28 70 2d 3e 62 49 6e 76 65 72 74 20 3f   = (p->bInvert ?
18600 20 70 2d 3e 61 70 56 61 6c 75 65 20 3a 20 26 70   p->apValue : &p
18610 2d 3e 61 70 56 61 6c 75 65 5b 70 2d 3e 6e 43 6f  ->apValue[p->nCo
18620 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
18630 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
18640 45 20 6f 72 20 44 45 4c 45 54 45 2c 20 72 65 61  E or DELETE, rea
18650 64 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65 63 6f  d the old.* reco
18660 72 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rd. */.    if( p
18670 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53  ->op!=SQLITE_INS
18680 45 52 54 20 26 26 20 28 70 2d 3e 62 50 61 74 63  ERT && (p->bPatc
18690 68 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  hset==0 || p->op
186a0 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 29  ==SQLITE_DELETE)
186b0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 62   ){.      u8 *ab
186c0 50 4b 20 3d 20 70 2d 3e 62 50 61 74 63 68 73 65  PK = p->bPatchse
186d0 74 20 3f 20 70 2d 3e 61 62 50 4b 20 3a 20 30 3b  t ? p->abPK : 0;
186e0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
186f0 65 73 73 69 6f 6e 52 65 61 64 52 65 63 6f 72 64  essionReadRecord
18700 28 26 70 2d 3e 69 6e 2c 20 70 2d 3e 6e 43 6f 6c  (&p->in, p->nCol
18710 2c 20 61 62 50 4b 2c 20 61 70 4f 6c 64 29 3b 0a  , abPK, apOld);.
18720 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
18730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18740 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 7d  urn p->rc;.    }
18750 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
18760 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   is an INSERT or
18770 20 55 50 44 41 54 45 2c 20 72 65 61 64 20 74 68   UPDATE, read th
18780 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  e new.* record. 
18790 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  */.    if( p->op
187a0 21 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  !=SQLITE_DELETE 
187b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
187c0 20 73 65 73 73 69 6f 6e 52 65 61 64 52 65 63 6f   sessionReadReco
187d0 72 64 28 26 70 2d 3e 69 6e 2c 20 70 2d 3e 6e 43  rd(&p->in, p->nC
187e0 6f 6c 2c 20 30 2c 20 61 70 4e 65 77 29 3b 0a 20  ol, 0, apNew);. 
187f0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
18800 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18810 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 7d 0a  rn p->rc;.    }.
18820 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 62 50 61  .    if( (p->bPa
18830 74 63 68 73 65 74 20 7c 7c 20 70 2d 3e 62 49 6e  tchset || p->bIn
18840 76 65 72 74 29 20 26 26 20 70 2d 3e 6f 70 3d 3d  vert) && p->op==
18850 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
18860 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
18870 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 74  s is an UPDATE t
18880 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
18890 20 70 61 74 63 68 73 65 74 2c 20 74 68 65 6e 20   patchset, then 
188a0 61 6c 6c 20 50 4b 20 61 6e 64 0a 20 20 20 20 20  all PK and.     
188b0 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 66 69 65   ** modified fie
188c0 6c 64 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  lds are present 
188d0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 72 65 63  in the new.* rec
188e0 6f 72 64 2e 20 54 68 65 20 6f 6c 64 2e 2a 20 72  ord. The old.* r
188f0 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 69  ecord.      ** i
18900 73 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6d 70  s currently comp
18910 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 54 68  letely empty. Th
18920 69 73 20 62 6c 6f 63 6b 20 73 68 69 66 74 73 20  is block shifts 
18930 74 68 65 20 50 4b 20 66 69 65 6c 64 73 20 66 72  the PK fields fr
18940 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  om.      ** new.
18950 2a 20 74 6f 20 6f 6c 64 2e 2a 2c 20 74 6f 20 61  * to old.*, to a
18960 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 63  ccommodate the c
18970 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20 74  ode that reads t
18980 68 65 73 65 20 61 72 72 61 79 73 2e 20 20 2a 2f  hese arrays.  */
18990 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
189a0 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
189b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
189c0 20 70 2d 3e 62 50 61 74 63 68 73 65 74 3d 3d 30   p->bPatchset==0
189d0 20 7c 7c 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69   || p->apValue[i
189e0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]==0 );.        
189f0 69 66 28 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29  if( p->abPK[i] )
18a00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
18a10 72 74 28 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69  rt( p->apValue[i
18a20 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]==0 );.        
18a30 20 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69 5d 20    p->apValue[i] 
18a40 3d 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69 2b 70  = p->apValue[i+p
18a50 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  ->nCol];.       
18a60 20 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c 75     if( p->apValu
18a70 65 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  e[i]==0 ) return
18a80 20 28 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45   (p->rc = SQLITE
18a90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 29 3b 0a  _CORRUPT_BKPT);.
18aa0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 56            p->apV
18ab0 61 6c 75 65 5b 69 2b 70 2d 3e 6e 43 6f 6c 5d 20  alue[i+p->nCol] 
18ac0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
18ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
18ae0 20 69 66 28 20 70 2d 3e 62 49 6e 76 65 72 74 20   if( p->bInvert 
18af0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
18b00 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
18b10 54 20 29 20 70 2d 3e 6f 70 20 3d 20 53 51 4c 49  T ) p->op = SQLI
18b20 54 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  TE_DELETE;.     
18b30 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d   else if( p->op=
18b40 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
18b50 20 70 2d 3e 6f 70 20 3d 20 53 51 4c 49 54 45 5f   p->op = SQLITE_
18b60 49 4e 53 45 52 54 3b 0a 20 20 20 20 7d 0a 20 20  INSERT;.    }.  
18b70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
18b80 54 45 5f 52 4f 57 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_ROW;.}../*.**
18b90 20 41 64 76 61 6e 63 65 20 61 6e 20 69 74 65 72   Advance an iter
18ba0 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20  ator created by 
18bb0 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
18bc0 5f 73 74 61 72 74 28 29 20 74 6f 20 74 68 65 20  _start() to the 
18bd0 6e 65 78 74 0a 2a 2a 20 63 68 61 6e 67 65 20 69  next.** change i
18be0 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
18bf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
18c00 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
18c10 5f 52 4f 57 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  _ROW, SQLITE_DON
18c20 45 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  E.** or SQLITE_C
18c30 4f 52 52 55 50 54 2e 0a 2a 2a 0a 2a 2a 20 54 68  ORRUPT..**.** Th
18c40 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
18c50 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  not be called on
18c60 20 69 74 65 72 61 74 6f 72 73 20 70 61 73 73 65   iterators passe
18c70 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 20  d to a conflict 
18c80 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62  handler.** callb
18c90 61 63 6b 20 62 79 20 63 68 61 6e 67 65 73 65 74  ack by changeset
18ca0 5f 61 70 70 6c 79 28 29 2e 0a 2a 2f 0a 69 6e 74  _apply()..*/.int
18cb0 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
18cc0 74 5f 6e 65 78 74 28 73 71 6c 69 74 65 33 5f 63  t_next(sqlite3_c
18cd0 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
18ce0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 73 73  ){.  return sess
18cf0 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e 65 78 74  ionChangesetNext
18d00 28 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  (p, 0, 0, 0);.}.
18d10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
18d20 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 65 78  wing function ex
18d30 74 72 61 63 74 73 20 69 6e 66 6f 72 6d 61 74 69  tracts informati
18d40 6f 6e 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  on on the curren
18d50 74 20 63 68 61 6e 67 65 0a 2a 2a 20 66 72 6f 6d  t change.** from
18d60 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
18d70 72 61 74 6f 72 2e 20 49 74 20 6d 61 79 20 6f 6e  rator. It may on
18d80 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
18d90 65 72 20 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  er changeset_nex
18da0 74 28 29 0a 2a 2a 20 68 61 73 20 72 65 74 75 72  t().** has retur
18db0 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a  ned SQLITE_ROW..
18dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
18dd0 61 6e 67 65 73 65 74 5f 6f 70 28 0a 20 20 73 71  angeset_op(.  sq
18de0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
18df0 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
18e00 20 49 74 65 72 61 74 6f 72 20 68 61 6e 64 6c 65   Iterator handle
18e10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18e20 20 2a 2a 70 7a 54 61 62 2c 20 20 20 20 20 20 20   **pzTab,       
18e30 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
18e40 69 6e 74 65 72 20 74 6f 20 74 61 62 6c 65 20 6e  inter to table n
18e50 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ame */.  int *pn
18e60 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
18e70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
18e80 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
18e90 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ns in table */. 
18ea0 20 69 6e 74 20 2a 70 4f 70 2c 20 20 20 20 20 20   int *pOp,      
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 49 54 45 5f   /* OUT: SQLITE_
18ed0 49 4e 53 45 52 54 2c 20 44 45 4c 45 54 45 20 6f  INSERT, DELETE o
18ee0 72 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 69 6e  r UPDATE */.  in
18ef0 74 20 2a 70 62 49 6e 64 69 72 65 63 74 20 20 20  t *pbIndirect   
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f10 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 63 68   OUT: True if ch
18f20 61 6e 67 65 20 69 73 20 69 6e 64 69 72 65 63 74  ange is indirect
18f30 20 2a 2f 0a 29 7b 0a 20 20 2a 70 4f 70 20 3d 20   */.){.  *pOp = 
18f40 70 49 74 65 72 2d 3e 6f 70 3b 0a 20 20 2a 70 6e  pIter->op;.  *pn
18f50 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 43 6f  Col = pIter->nCo
18f60 6c 3b 0a 20 20 2a 70 7a 54 61 62 20 3d 20 70 49  l;.  *pzTab = pI
18f70 74 65 72 2d 3e 7a 54 61 62 3b 0a 20 20 69 66 28  ter->zTab;.  if(
18f80 20 70 62 49 6e 64 69 72 65 63 74 20 29 20 2a 70   pbIndirect ) *p
18f90 62 49 6e 64 69 72 65 63 74 20 3d 20 70 49 74 65  bIndirect = pIte
18fa0 72 2d 3e 62 49 6e 64 69 72 65 63 74 3b 0a 20 20  r->bIndirect;.  
18fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18fd0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  n information re
18fe0 67 61 72 64 69 6e 67 20 74 68 65 20 50 52 49 4d  garding the PRIM
18ff0 41 52 59 20 4b 45 59 20 61 6e 64 20 6e 75 6d 62  ARY KEY and numb
19000 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
19010 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19020 20 74 61 62 6c 65 20 61 66 66 65 63 74 65 64 20   table affected 
19030 62 79 20 74 68 65 20 63 68 61 6e 67 65 20 74 68  by the change th
19040 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  at pIter current
19050 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e  ly points.** to.
19060 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
19070 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
19080 64 20 61 66 74 65 72 20 63 68 61 6e 67 65 73 65  d after changese
19090 74 5f 6e 65 78 74 28 29 20 72 65 74 75 72 6e 73  t_next() returns
190a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a  .** SQLITE_ROW..
190b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
190c0 61 6e 67 65 73 65 74 5f 70 6b 28 0a 20 20 73 71  angeset_pk(.  sq
190d0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
190e0 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
190f0 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   Iterator object
19100 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19110 68 61 72 20 2a 2a 70 61 62 50 4b 2c 20 20 20 20  har **pabPK,    
19120 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72        /* OUT: Ar
19130 72 61 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 20 2d  ray of boolean -
19140 20 74 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c   true for PK col
19150 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  s */.  int *pnCo
19160 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
19170 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
19180 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
19190 20 69 6e 20 6f 75 74 70 75 74 20 61 72 72 61 79   in output array
191a0 20 2a 2f 0a 29 7b 0a 20 20 2a 70 61 62 50 4b 20   */.){.  *pabPK 
191b0 3d 20 70 49 74 65 72 2d 3e 61 62 50 4b 3b 0a 20  = pIter->abPK;. 
191c0 20 69 66 28 20 70 6e 43 6f 6c 20 29 20 2a 70 6e   if( pnCol ) *pn
191d0 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 43 6f  Col = pIter->nCo
191e0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  l;.  return SQLI
191f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19200 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
19210 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19220 20 77 68 69 6c 65 20 74 68 65 20 69 74 65 72 61   while the itera
19230 74 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  tor is pointing 
19240 74 6f 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  to an.** SQLITE_
19250 55 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45  UPDATE or SQLITE
19260 5f 44 45 4c 45 54 45 20 63 68 61 6e 67 65 20 28  _DELETE change (
19270 73 65 65 20 73 71 6c 69 74 65 33 63 68 61 6e 67  see sqlite3chang
19280 65 73 65 74 5f 6f 70 28 29 29 2e 0a 2a 2a 20 4f  eset_op())..** O
19290 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
192a0 5f 4d 49 53 55 53 45 20 69 73 20 72 65 74 75 72  _MISUSE is retur
192b0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 73 65  ned..**.** It se
192c0 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70  ts *ppValue to p
192d0 6f 69 6e 74 20 74 6f 20 61 6e 20 73 71 6c 69 74  oint to an sqlit
192e0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
192f0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
19300 65 0a 2a 2a 20 69 56 61 6c 27 74 68 20 76 61 6c  e.** iVal'th val
19310 75 65 20 69 6e 20 74 68 65 20 6f 6c 64 2e 2a 20  ue in the old.* 
19320 72 65 63 6f 72 64 2e 20 4f 72 2c 20 69 66 20 74  record. Or, if t
19330 68 61 74 20 70 61 72 74 69 63 75 6c 61 72 20 76  hat particular v
19340 61 6c 75 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 69  alue is not.** i
19350 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
19360 65 63 6f 72 64 20 28 62 65 63 61 75 73 65 20 74  ecord (because t
19370 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6e 20  he change is an 
19380 55 50 44 41 54 45 20 61 6e 64 20 74 68 65 20 66  UPDATE and the f
19390 69 65 6c 64 0a 2a 2a 20 77 61 73 20 6e 6f 74 20  ield.** was not 
193a0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 69 73 20  modified and is 
193b0 6e 6f 74 20 61 20 50 4b 20 63 6f 6c 75 6d 6e 29  not a PK column)
193c0 2c 20 73 65 74 20 2a 70 70 56 61 6c 75 65 20 74  , set *ppValue t
193d0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  o NULL..**.** If
193e0 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20 6f   value iVal is o
193f0 75 74 2d 6f 66 2d 72 61 6e 67 65 2c 20 53 51 4c  ut-of-range, SQL
19400 49 54 45 5f 52 41 4e 47 45 20 69 73 20 72 65 74  ITE_RANGE is ret
19410 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
19420 75 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 6d 6f 64  ue is.** not mod
19430 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73 65  ified. Otherwise
19440 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
19450 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
19460 65 73 65 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69  eset_old(.  sqli
19470 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
19480 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43  er *pIter,  /* C
19490 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f  hangeset iterato
194a0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c  r */.  int iVal,
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
194d0 6f 66 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 20 74  of old.* value t
194e0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
194f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
19500 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
19510 2f 2a 20 4f 55 54 3a 20 4f 6c 64 20 76 61 6c 75  /* OUT: Old valu
19520 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74  e (or NULL point
19530 65 72 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  er) */.){.  if( 
19540 70 49 74 65 72 2d 3e 6f 70 21 3d 53 51 4c 49 54  pIter->op!=SQLIT
19550 45 5f 55 50 44 41 54 45 20 26 26 20 70 49 74 65  E_UPDATE && pIte
19560 72 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 44 45  r->op!=SQLITE_DE
19570 4c 45 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  LETE ){.    retu
19580 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
19590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 56 61 6c  ;.  }.  if( iVal
195a0 3c 30 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74 65  <0 || iVal>=pIte
195b0 72 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72  r->nCol ){.    r
195c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e  eturn SQLITE_RAN
195d0 47 45 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c  GE;.  }.  *ppVal
195e0 75 65 20 3d 20 70 49 74 65 72 2d 3e 61 70 56 61  ue = pIter->apVa
195f0 6c 75 65 5b 69 56 61 6c 5d 3b 0a 20 20 72 65 74  lue[iVal];.  ret
19600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19610 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19620 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
19630 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 74  e called while t
19640 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 70  he iterator is p
19650 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 0a 2a 2a  ointing to an.**
19660 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f   SQLITE_UPDATE o
19670 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  r SQLITE_INSERT 
19680 63 68 61 6e 67 65 20 28 73 65 65 20 73 71 6c 69  change (see sqli
19690 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28  te3changeset_op(
196a0 29 29 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ))..** Otherwise
196b0 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  , SQLITE_MISUSE 
196c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
196d0 2a 2a 20 49 74 20 73 65 74 73 20 2a 70 70 56 61  ** It sets *ppVa
196e0 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
196f0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
19700 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
19710 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 69 56 61  ining the.** iVa
19720 6c 27 74 68 20 76 61 6c 75 65 20 69 6e 20 74 68  l'th value in th
19730 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  e new.* record. 
19740 4f 72 2c 20 69 66 20 74 68 61 74 20 70 61 72 74  Or, if that part
19750 69 63 75 6c 61 72 20 76 61 6c 75 65 20 69 73 20  icular value is 
19760 6e 6f 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20  not.** included 
19770 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 28 62  in the record (b
19780 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67  ecause the chang
19790 65 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 61  e is an UPDATE a
197a0 6e 64 20 74 68 65 20 66 69 65 6c 64 0a 2a 2a 20  nd the field.** 
197b0 77 61 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64  was not modified
197c0 29 2c 20 73 65 74 20 2a 70 70 56 61 6c 75 65 20  ), set *ppValue 
197d0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
197e0 66 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20  f value iVal is 
197f0 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 2c 20 53 51  out-of-range, SQ
19800 4c 49 54 45 5f 52 41 4e 47 45 20 69 73 20 72 65  LITE_RANGE is re
19810 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61  turned and *ppVa
19820 6c 75 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 6d 6f  lue is.** not mo
19830 64 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73  dified. Otherwis
19840 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
19850 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
19860 67 65 73 65 74 5f 6e 65 77 28 0a 20 20 73 71 6c  geset_new(.  sql
19870 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
19880 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20  ter *pIter,  /* 
19890 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74  Changeset iterat
198a0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c  or */.  int iVal
198b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
198c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
198d0 20 6f 66 20 6e 65 77 2e 2a 20 76 61 6c 75 65 20   of new.* value 
198e0 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
198f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
19900 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20  *ppValue        
19910 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c   /* OUT: New val
19920 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e  ue (or NULL poin
19930 74 65 72 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ter) */.){.  if(
19940 20 70 49 74 65 72 2d 3e 6f 70 21 3d 53 51 4c 49   pIter->op!=SQLI
19950 54 45 5f 55 50 44 41 54 45 20 26 26 20 70 49 74  TE_UPDATE && pIt
19960 65 72 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49  er->op!=SQLITE_I
19970 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 72 65 74  NSERT ){.    ret
19980 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
19990 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 56 61  E;.  }.  if( iVa
199a0 6c 3c 30 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74  l<0 || iVal>=pIt
199b0 65 72 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  er->nCol ){.    
199c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41  return SQLITE_RA
199d0 4e 47 45 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61  NGE;.  }.  *ppVa
199e0 6c 75 65 20 3d 20 70 49 74 65 72 2d 3e 61 70 56  lue = pIter->apV
199f0 61 6c 75 65 5b 70 49 74 65 72 2d 3e 6e 43 6f 6c  alue[pIter->nCol
19a00 2b 69 56 61 6c 5d 3b 0a 20 20 72 65 74 75 72 6e  +iVal];.  return
19a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19a20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19a30 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72  ng two macros ar
19a40 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
19a50 79 2e 20 54 68 65 79 20 61 72 65 20 73 69 6d 69  y. They are simi
19a60 6c 61 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 71  lar to the.** sq
19a70 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
19a80 65 77 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ew() and sqlite3
19a90 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29 20  changeset_old() 
19aa0 66 75 6e 63 74 69 6f 6e 73 2c 20 65 78 63 65 70  functions, excep
19ab0 74 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6f  t that.** they o
19ac0 6d 69 74 20 61 6c 6c 20 65 72 72 6f 72 20 63 68  mit all error ch
19ad0 65 63 6b 69 6e 67 20 61 6e 64 20 72 65 74 75 72  ecking and retur
19ae0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19af0 68 65 20 72 65 71 75 65 73 74 65 64 20 76 61 6c  he requested val
19b00 75 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  ue..*/.#define s
19b10 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e  essionChangesetN
19b20 65 77 28 70 49 74 65 72 2c 20 69 56 61 6c 29 20  ew(pIter, iVal) 
19b30 28 70 49 74 65 72 29 2d 3e 61 70 56 61 6c 75 65  (pIter)->apValue
19b40 5b 28 70 49 74 65 72 29 2d 3e 6e 43 6f 6c 2b 28  [(pIter)->nCol+(
19b50 69 56 61 6c 29 5d 0a 23 64 65 66 69 6e 65 20 73  iVal)].#define s
19b60 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4f  essionChangesetO
19b70 6c 64 28 70 49 74 65 72 2c 20 69 56 61 6c 29 20  ld(pIter, iVal) 
19b80 28 70 49 74 65 72 29 2d 3e 61 70 56 61 6c 75 65  (pIter)->apValue
19b90 5b 28 69 56 61 6c 29 5d 0a 0a 2f 2a 0a 2a 2a 20  [(iVal)]../*.** 
19ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
19bb0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19bc0 20 77 69 74 68 20 61 20 63 68 61 6e 67 65 73 65   with a changese
19bd0 74 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  t iterator that 
19be0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 73 73  has been.** pass
19bf0 65 64 20 74 6f 20 61 6e 20 53 51 4c 49 54 45 5f  ed to an SQLITE_
19c00 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 6f  CHANGESET_DATA o
19c10 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  r SQLITE_CHANGES
19c20 45 54 5f 43 4f 4e 46 4c 49 43 54 20 0a 2a 2a 20  ET_CONFLICT .** 
19c30 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
19c40 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
19c50 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4d 49 53  wise, SQLITE_MIS
19c60 55 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USE is returned.
19c70 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
19c80 73 66 75 6c 2c 20 2a 70 70 56 61 6c 75 65 20 69  sful, *ppValue i
19c90 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
19ca0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
19cb0 75 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ue structure.** 
19cc0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
19cd0 56 61 6c 27 74 68 20 76 61 6c 75 65 20 6f 66 20  Val'th value of 
19ce0 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  the conflicting 
19cf0 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
19d00 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20 6f   value iVal is o
19d10 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 72 20 73  ut-of-range or s
19d20 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
19d30 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
19d40 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
19d50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19d60 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
19d70 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
19d80 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c  3changeset_confl
19d90 69 63 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ict(.  sqlite3_c
19da0 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
19db0 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65  Iter,  /* Change
19dc0 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  set iterator */.
19dd0 20 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20    int iVal,     
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
19e00 6e 66 6c 69 63 74 20 72 65 63 6f 72 64 20 76 61  nflict record va
19e10 6c 75 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  lue to fetch */.
19e20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
19e30 2a 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20 20  **ppValue       
19e40 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
19e50 66 72 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67  from conflicting
19e60 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   row */.){.  if(
19e70 20 21 70 49 74 65 72 2d 3e 70 43 6f 6e 66 6c 69   !pIter->pConfli
19e80 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
19e90 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
19ea0 20 20 7d 0a 20 20 69 66 28 20 69 56 61 6c 3c 30    }.  if( iVal<0
19eb0 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74 65 72 2d   || iVal>=pIter-
19ec0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  >nCol ){.    ret
19ed0 75 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  urn SQLITE_RANGE
19ee0 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c 75 65  ;.  }.  *ppValue
19ef0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
19f00 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
19f10 43 6f 6e 66 6c 69 63 74 2c 20 69 56 61 6c 29 3b  Conflict, iVal);
19f20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19f30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
19f50 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
19f60 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ith an iterator 
19f70 70 61 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a 20  passed to an.** 
19f80 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
19f90 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f 6e  _FOREIGN_KEY con
19fa0 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61  flict handler ca
19fb0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
19fc0 63 61 73 65 0a 2a 2a 20 69 74 20 73 65 74 73 20  case.** it sets 
19fd0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
19fe0 62 6c 65 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ble to the total
19ff0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77 6e   number of known
1a000 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
1a010 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74 68  violations in th
1a020 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61  e destination da
1a030 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75 72  tabase and retur
1a040 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1a050 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
1a060 20 63 61 73 65 73 20 74 68 69 73 20 66 75 6e 63   cases this func
1a070 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1a080 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69  ITE_MISUSE..*/.i
1a090 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
1a0a0 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73  set_fk_conflicts
1a0b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
1a0c0 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
1a0d0 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74  r,  /* Changeset
1a0e0 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
1a0f0 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20  nt *pnOut       
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a110 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1a120 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 2a   FK violations *
1a130 2f 0a 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  /.){.  if( pIter
1a140 2d 3e 70 43 6f 6e 66 6c 69 63 74 20 7c 7c 20 70  ->pConflict || p
1a150 49 74 65 72 2d 3e 61 70 56 61 6c 75 65 20 29 7b  Iter->apValue ){
1a160 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a170 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
1a180 20 2a 70 6e 4f 75 74 20 3d 20 70 49 74 65 72 2d   *pnOut = pIter-
1a190 3e 6e 43 6f 6c 3b 0a 20 20 72 65 74 75 72 6e 20  >nCol;.  return 
1a1a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1a1b0 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e  *.** Finalize an
1a1c0 20 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61   iterator alloca
1a1d0 74 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  ted with sqlite3
1a1e0 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
1a1f0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
1a200 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  nction may not b
1a210 65 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  e called on iter
1a220 61 74 6f 72 73 20 70 61 73 73 65 64 20 74 6f 20  ators passed to 
1a230 61 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  a conflict handl
1a240 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 62  er.** callback b
1a250 79 20 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  y changeset_appl
1a260 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y()..*/.int sqli
1a270 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e  te3changeset_fin
1a280 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 68  alize(sqlite3_ch
1a290 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 29  angeset_iter *p)
1a2a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a2b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1a2c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1a2f0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a300 70 2d 3e 61 70 56 61 6c 75 65 5b 5d 20 2a 2f 0a  p->apValue[] */.
1a310 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
1a320 20 20 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c      if( p->apVal
1a330 75 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ue ){.      for(
1a340 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 2a 32  i=0; i<p->nCol*2
1a350 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65 33 56 61  ; i++) sqlite3Va
1a360 6c 75 65 46 72 65 65 28 70 2d 3e 61 70 56 61 6c  lueFree(p->apVal
1a370 75 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ue[i]);.    }.  
1a380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a390 2d 3e 74 62 6c 68 64 72 2e 61 42 75 66 29 3b 0a  ->tblhdr.aBuf);.
1a3a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a3b0 28 70 2d 3e 69 6e 2e 62 75 66 2e 61 42 75 66 29  (p->in.buf.aBuf)
1a3c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a3d0 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ee(p);.  }.  ret
1a3e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
1a3f0 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
1a400 6e 67 65 73 65 74 49 6e 76 65 72 74 28 0a 20 20  ngesetInvert(.  
1a410 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 2a 70 49  SessionInput *pI
1a420 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nput,           
1a430 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67 65 73  /* Input changes
1a440 65 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 4f  et */.  int (*xO
1a450 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
1a460 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1a470 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
1a480 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 2c 0a  ,.  void *pOut,.
1a490 20 20 69 6e 74 20 2a 70 6e 49 6e 76 65 72 74 65    int *pnInverte
1a4a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a4b0 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1a4c0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6f 75 74   of bytes in out
1a4d0 70 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  put changeset */
1a4e0 0a 20 20 76 6f 69 64 20 2a 2a 70 70 49 6e 76 65  .  void **ppInve
1a4f0 72 74 65 64 20 20 20 20 20 20 20 20 20 20 20 20  rted            
1a500 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 76 65 72     /* OUT: Inver
1a510 73 65 20 6f 66 20 70 43 68 61 6e 67 65 73 65 74  se of pChangeset
1a520 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1a540 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a550 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 65  rn value */.  Se
1a560 73 73 69 6f 6e 42 75 66 66 65 72 20 73 4f 75 74  ssionBuffer sOut
1a570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a580 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
1a590 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  /.  int nCol = 0
1a5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a5b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a5c0 20 63 6f 6c 73 20 69 6e 20 63 75 72 72 65 6e 74   cols in current
1a5d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a   table */.  u8 *
1a5e0 61 62 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20  abPK = 0;       
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1a600 4b 20 61 72 72 61 79 20 66 6f 72 20 63 75 72 72  K array for curr
1a610 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ent table */.  s
1a620 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1a630 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  pVal = 0;      /
1a640 2a 20 53 70 61 63 65 20 66 6f 72 20 76 61 6c 75  * Space for valu
1a650 65 73 20 66 6f 72 20 55 50 44 41 54 45 20 69 6e  es for UPDATE in
1a660 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 73  version */.  Ses
1a670 73 69 6f 6e 42 75 66 66 65 72 20 73 50 4b 20 3d  sionBuffer sPK =
1a680 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 2f 2a 20   {0, 0, 0};  /* 
1a690 50 4b 20 61 72 72 61 79 20 66 6f 72 20 63 75 72  PK array for cur
1a6a0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rent table */.. 
1a6b0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a6c0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1a6d0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4f   */.  memset(&sO
1a6e0 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ut, 0, sizeof(Se
1a6f0 73 73 69 6f 6e 42 75 66 66 65 72 29 29 3b 0a 0a  ssionBuffer));..
1a700 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6f 75    /* Zero the ou
1a710 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 69  tput variables i
1a720 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
1a730 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
1a740 20 70 70 49 6e 76 65 72 74 65 64 20 29 7b 0a 20   ppInverted ){. 
1a750 20 20 20 2a 70 70 49 6e 76 65 72 74 65 64 20 3d     *ppInverted =
1a760 20 30 3b 0a 20 20 20 20 2a 70 6e 49 6e 76 65 72   0;.    *pnInver
1a770 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ted = 0;.  }..  
1a780 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1a790 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 2f  u8 eType;..    /
1a7a0 2a 20 54 65 73 74 20 66 6f 72 20 45 4f 46 2e 20  * Test for EOF. 
1a7b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  */.    if( (rc =
1a7c0 20 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66   sessionInputBuf
1a7d0 66 65 72 28 70 49 6e 70 75 74 2c 20 32 29 29 20  fer(pInput, 2)) 
1a7e0 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f  ) goto finished_
1a7f0 69 6e 76 65 72 74 3b 0a 20 20 20 20 69 66 28 20  invert;.    if( 
1a800 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 3e 3d 70  pInput->iNext>=p
1a810 49 6e 70 75 74 2d 3e 6e 44 61 74 61 20 29 20 62  Input->nData ) b
1a820 72 65 61 6b 3b 0a 20 20 20 20 65 54 79 70 65 20  reak;.    eType 
1a830 3d 20 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b  = pInput->aData[
1a840 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 5d 3b 0a  pInput->iNext];.
1a850 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 54 79  .    switch( eTy
1a860 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
1a870 20 27 54 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'T': {.        
1a880 2f 2a 20 41 20 27 74 61 62 6c 65 27 20 72 65 63  /* A 'table' rec
1a890 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 3a  ord consists of:
1a8a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1a8b0 20 20 20 20 2a 2a 20 20 20 2a 20 41 20 63 6f 6e      **   * A con
1a8c0 73 74 61 6e 74 20 27 54 27 20 63 68 61 72 61 63  stant 'T' charac
1a8d0 74 65 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ter,.        ** 
1a8e0 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f    * Number of co
1a8f0 6c 75 6d 6e 73 20 69 6e 20 73 61 69 64 20 74 61  lumns in said ta
1a900 62 6c 65 20 28 61 20 76 61 72 69 6e 74 29 2c 0a  ble (a varint),.
1a910 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2a 20 41          **   * A
1a920 6e 20 61 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20  n array of nCol 
1a930 62 79 74 65 73 20 28 73 50 4b 29 2c 0a 20 20 20  bytes (sPK),.   
1a940 20 20 20 20 20 2a 2a 20 20 20 2a 20 41 20 6e 75       **   * A nu
1a950 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 61 62  l-terminated tab
1a960 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 20 20 20  le name..       
1a970 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1a980 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
1a990 6e 74 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 20  nt nVar;.       
1a9a0 20 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 2b 2b   pInput->iNext++
1a9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 72  ;.        if( (r
1a9c0 63 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  c = sessionChang
1a9d0 65 73 65 74 42 75 66 66 65 72 54 62 6c 68 64 72  esetBufferTblhdr
1a9e0 28 70 49 6e 70 75 74 2c 20 26 6e 42 79 74 65 29  (pInput, &nByte)
1a9f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
1aa00 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f 69 6e 76  oto finished_inv
1aa10 65 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ert;.        }. 
1aa20 20 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 65         nVar = se
1aa30 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 26  ssionVarintGet(&
1aa40 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70 49  pInput->aData[pI
1aa50 6e 70 75 74 2d 3e 69 4e 65 78 74 5d 2c 20 26 6e  nput->iNext], &n
1aa60 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 50  Col);.        sP
1aa70 4b 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  K.nBuf = 0;.    
1aa80 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1aa90 64 42 6c 6f 62 28 26 73 50 4b 2c 20 26 70 49 6e  dBlob(&sPK, &pIn
1aaa0 70 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e 70 75  put->aData[pInpu
1aab0 74 2d 3e 69 4e 65 78 74 2b 6e 56 61 72 5d 2c 20  t->iNext+nVar], 
1aac0 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  nCol, &rc);.    
1aad0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1aae0 64 42 79 74 65 28 26 73 4f 75 74 2c 20 65 54 79  dByte(&sOut, eTy
1aaf0 70 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  pe, &rc);.      
1ab00 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
1ab10 6c 6f 62 28 26 73 4f 75 74 2c 20 26 70 49 6e 70  lob(&sOut, &pInp
1ab20 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e 70 75 74  ut->aData[pInput
1ab30 2d 3e 69 4e 65 78 74 5d 2c 20 6e 42 79 74 65 2c  ->iNext], nByte,
1ab40 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
1ab50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 69 6e  f( rc ) goto fin
1ab60 69 73 68 65 64 5f 69 6e 76 65 72 74 3b 0a 0a 20  ished_invert;.. 
1ab70 20 20 20 20 20 20 20 70 49 6e 70 75 74 2d 3e 69         pInput->i
1ab80 4e 65 78 74 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Next += nByte;. 
1ab90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1aba0 72 65 65 28 61 70 56 61 6c 29 3b 0a 20 20 20 20  ree(apVal);.    
1abb0 20 20 20 20 61 70 56 61 6c 20 3d 20 30 3b 0a 20      apVal = 0;. 
1abc0 20 20 20 20 20 20 20 61 62 50 4b 20 3d 20 73 50         abPK = sP
1abd0 4b 2e 61 42 75 66 3b 0a 20 20 20 20 20 20 20 20  K.aBuf;.        
1abe0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1abf0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1ac00 45 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 20 20  E_INSERT:.      
1ac10 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
1ac20 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE: {.        in
1ac30 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  t nByte;.       
1ac40 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74 20 3d   int bIndirect =
1ac50 20 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70   pInput->aData[p
1ac60 49 6e 70 75 74 2d 3e 69 4e 65 78 74 2b 31 5d 3b  Input->iNext+1];
1ac70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79  .        int eTy
1ac80 70 65 32 20 3d 20 28 65 54 79 70 65 3d 3d 53 51  pe2 = (eType==SQ
1ac90 4c 49 54 45 5f 44 45 4c 45 54 45 20 3f 20 53 51  LITE_DELETE ? SQ
1aca0 4c 49 54 45 5f 49 4e 53 45 52 54 20 3a 20 53 51  LITE_INSERT : SQ
1acb0 4c 49 54 45 5f 44 45 4c 45 54 45 29 3b 0a 20 20  LITE_DELETE);.  
1acc0 20 20 20 20 20 20 70 49 6e 70 75 74 2d 3e 69 4e        pInput->iN
1acd0 65 78 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ext += 2;.      
1ace0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1acf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
1ad00 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
1ad10 68 61 6e 67 65 73 65 74 42 75 66 66 65 72 52 65  hangesetBufferRe
1ad20 63 6f 72 64 28 70 49 6e 70 75 74 2c 20 6e 43 6f  cord(pInput, nCo
1ad30 6c 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  l, &nByte);.    
1ad40 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1ad50 64 42 79 74 65 28 26 73 4f 75 74 2c 20 65 54 79  dByte(&sOut, eTy
1ad60 70 65 32 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  pe2, &rc);.     
1ad70 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1ad80 42 79 74 65 28 26 73 4f 75 74 2c 20 62 49 6e 64  Byte(&sOut, bInd
1ad90 69 72 65 63 74 2c 20 26 72 63 29 3b 0a 20 20 20  irect, &rc);.   
1ada0 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1adb0 6e 64 42 6c 6f 62 28 26 73 4f 75 74 2c 20 26 70  ndBlob(&sOut, &p
1adc0 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e  Input->aData[pIn
1add0 70 75 74 2d 3e 69 4e 65 78 74 5d 2c 20 6e 42 79  put->iNext], nBy
1ade0 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  te, &rc);.      
1adf0 20 20 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 20    pInput->iNext 
1ae00 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
1ae10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1ae20 66 69 6e 69 73 68 65 64 5f 69 6e 76 65 72 74 3b  finished_invert;
1ae30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ae40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
1ae50 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
1ae60 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E: {.        int
1ae70 20 69 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20   iCol;..        
1ae80 69 66 28 20 30 3d 3d 61 70 56 61 6c 20 29 7b 0a  if( 0==apVal ){.
1ae90 20 20 20 20 20 20 20 20 20 20 61 70 56 61 6c 20            apVal 
1aea0 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  = (sqlite3_value
1aeb0 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   **)sqlite3_mall
1aec0 6f 63 36 34 28 73 69 7a 65 6f 66 28 61 70 56 61  oc64(sizeof(apVa
1aed0 6c 5b 30 5d 29 2a 6e 43 6f 6c 2a 32 29 3b 0a 20  l[0])*nCol*2);. 
1aee0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
1aef0 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  apVal ){.       
1af00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1af10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1af20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65      goto finishe
1af30 64 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20 20 20  d_invert;.      
1af40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1af50 6d 65 6d 73 65 74 28 61 70 56 61 6c 2c 20 30 2c  memset(apVal, 0,
1af60 20 73 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d   sizeof(apVal[0]
1af70 29 2a 6e 43 6f 6c 2a 32 29 3b 0a 20 20 20 20 20  )*nCol*2);.     
1af80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1af90 20 57 72 69 74 65 20 74 68 65 20 68 65 61 64 65   Write the heade
1afa0 72 20 66 6f 72 20 74 68 65 20 6e 65 77 20 55 50  r for the new UP
1afb0 44 41 54 45 20 63 68 61 6e 67 65 2e 20 53 61 6d  DATE change. Sam
1afc0 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
1afd0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 65  l. */.        se
1afe0 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28  ssionAppendByte(
1aff0 26 73 4f 75 74 2c 20 65 54 79 70 65 2c 20 26 72  &sOut, eType, &r
1b000 63 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73 73  c);.        sess
1b010 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26 73  ionAppendByte(&s
1b020 4f 75 74 2c 20 70 49 6e 70 75 74 2d 3e 61 44 61  Out, pInput->aDa
1b030 74 61 5b 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74  ta[pInput->iNext
1b040 2b 31 5d 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  +1], &rc);..    
1b050 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b060 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a 20  old.* and new.* 
1b070 72 65 63 6f 72 64 73 20 66 6f 72 20 74 68 65 20  records for the 
1b080 75 70 64 61 74 65 20 63 68 61 6e 67 65 2e 20 2a  update change. *
1b090 2f 0a 20 20 20 20 20 20 20 20 70 49 6e 70 75 74  /.        pInput
1b0a0 2d 3e 69 4e 65 78 74 20 2b 3d 20 32 3b 0a 20 20  ->iNext += 2;.  
1b0b0 20 20 20 20 20 20 72 63 20 3d 20 73 65 73 73 69        rc = sessi
1b0c0 6f 6e 52 65 61 64 52 65 63 6f 72 64 28 70 49 6e  onReadRecord(pIn
1b0d0 70 75 74 2c 20 6e 43 6f 6c 2c 20 30 2c 20 26 61  put, nCol, 0, &a
1b0e0 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20  pVal[0]);.      
1b0f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b110 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 61   rc = sessionRea
1b120 64 52 65 63 6f 72 64 28 70 49 6e 70 75 74 2c 20  dRecord(pInput, 
1b130 6e 43 6f 6c 2c 20 30 2c 20 26 61 70 56 61 6c 5b  nCol, 0, &apVal[
1b140 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  nCol]);.        
1b150 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1b160 69 74 65 20 74 68 65 20 6e 65 77 20 6f 6c 64 2e  ite the new old.
1b170 2a 20 72 65 63 6f 72 64 2e 20 43 6f 6e 73 69 73  * record. Consis
1b180 74 73 20 6f 66 20 74 68 65 20 50 4b 20 63 6f 6c  ts of the PK col
1b190 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  umns from the.  
1b1a0 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61        ** origina
1b1b0 6c 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2c 20  l old.* record, 
1b1c0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 76 61  and the other va
1b1d0 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 6f 72  lues from the or
1b1e0 69 67 69 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  iginal.        *
1b1f0 2a 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  * new.* record. 
1b200 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
1b210 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c  Col=0; iCol<nCol
1b220 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1b230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
1b240 75 65 20 2a 70 56 61 6c 20 3d 20 61 70 56 61 6c  ue *pVal = apVal
1b250 5b 69 43 6f 6c 20 2b 20 28 61 62 50 4b 5b 69 43  [iCol + (abPK[iC
1b260 6f 6c 5d 20 3f 20 30 20 3a 20 6e 43 6f 6c 29 5d  ol] ? 0 : nCol)]
1b270 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 73 73  ;.          sess
1b280 69 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26  ionAppendValue(&
1b290 73 4f 75 74 2c 20 70 56 61 6c 2c 20 26 72 63 29  sOut, pVal, &rc)
1b2a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b2b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1b2c0 65 20 6e 65 77 20 6e 65 77 2e 2a 20 72 65 63 6f  e new new.* reco
1b2d0 72 64 2e 20 43 6f 6e 73 69 73 74 73 20 6f 66 20  rd. Consists of 
1b2e0 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 76 61  a copy of all va
1b2f0 6c 75 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  lues.        ** 
1b300 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
1b310 6c 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2c 20  l old.* record, 
1b320 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 50  except for the P
1b330 4b 20 63 6f 6c 75 6d 6e 73 2c 20 77 68 69 63 68  K columns, which
1b340 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
1b350 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69 6e 65  set to "undefine
1b360 64 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  d". */.        f
1b370 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1b380 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1b390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b3a0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 28  _value *pVal = (
1b3b0 61 62 50 4b 5b 69 43 6f 6c 5d 20 3f 20 30 20 3a  abPK[iCol] ? 0 :
1b3c0 20 61 70 56 61 6c 5b 69 43 6f 6c 5d 29 3b 0a 20   apVal[iCol]);. 
1b3d0 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e           session
1b3e0 41 70 70 65 6e 64 56 61 6c 75 65 28 26 73 4f 75  AppendValue(&sOu
1b3f0 74 2c 20 70 56 61 6c 2c 20 26 72 63 29 3b 0a 20  t, pVal, &rc);. 
1b400 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b410 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
1b420 6f 6c 3c 6e 43 6f 6c 2a 32 3b 20 69 43 6f 6c 2b  ol<nCol*2; iCol+
1b430 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1b440 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 61  lite3ValueFree(a
1b450 70 56 61 6c 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  pVal[iCol]);.   
1b460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
1b470 65 6d 73 65 74 28 61 70 56 61 6c 2c 20 30 2c 20  emset(apVal, 0, 
1b480 73 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d 29  sizeof(apVal[0])
1b490 2a 6e 43 6f 6c 2a 32 29 3b 0a 20 20 20 20 20 20  *nCol*2);.      
1b4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b4c0 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f 69   goto finished_i
1b4d0 6e 76 65 72 74 3b 0a 20 20 20 20 20 20 20 20 7d  nvert;.        }
1b4e0 0a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
1b4f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b500 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1b510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1b520 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b530 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64     goto finished
1b540 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20 7d 0a 0a  _invert;.    }..
1b550 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1b560 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1b570 20 69 66 28 20 78 4f 75 74 70 75 74 20 26 26 20   if( xOutput && 
1b580 73 4f 75 74 2e 6e 42 75 66 3e 3d 73 65 73 73 69  sOut.nBuf>=sessi
1b590 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73  ons_strm_chunk_s
1b5a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
1b5b0 3d 20 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20  = xOutput(pOut, 
1b5c0 73 4f 75 74 2e 61 42 75 66 2c 20 73 4f 75 74 2e  sOut.aBuf, sOut.
1b5d0 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 73 4f 75  nBuf);.      sOu
1b5e0 74 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  t.nBuf = 0;.    
1b5f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b600 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1b610 68 65 64 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20  hed_invert;.    
1b620 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1b630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b640 3b 0a 20 20 69 66 28 20 70 6e 49 6e 76 65 72 74  ;.  if( pnInvert
1b650 65 64 20 29 7b 0a 20 20 20 20 2a 70 6e 49 6e 76  ed ){.    *pnInv
1b660 65 72 74 65 64 20 3d 20 73 4f 75 74 2e 6e 42 75  erted = sOut.nBu
1b670 66 3b 0a 20 20 20 20 2a 70 70 49 6e 76 65 72 74  f;.    *ppInvert
1b680 65 64 20 3d 20 73 4f 75 74 2e 61 42 75 66 3b 0a  ed = sOut.aBuf;.
1b690 20 20 20 20 73 4f 75 74 2e 61 42 75 66 20 3d 20      sOut.aBuf = 
1b6a0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
1b6b0 4f 75 74 2e 6e 42 75 66 3e 30 20 29 7b 0a 20 20  Out.nBuf>0 ){.  
1b6c0 20 20 72 63 20 3d 20 78 4f 75 74 70 75 74 28 70    rc = xOutput(p
1b6d0 4f 75 74 2c 20 73 4f 75 74 2e 61 42 75 66 2c 20  Out, sOut.aBuf, 
1b6e0 73 4f 75 74 2e 6e 42 75 66 29 3b 0a 20 20 7d 0a  sOut.nBuf);.  }.
1b6f0 0a 20 66 69 6e 69 73 68 65 64 5f 69 6e 76 65 72  . finished_inver
1b700 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
1b710 65 28 73 4f 75 74 2e 61 42 75 66 29 3b 0a 20 20  e(sOut.aBuf);.  
1b720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 56  sqlite3_free(apV
1b730 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  al);.  sqlite3_f
1b740 72 65 65 28 73 50 4b 2e 61 42 75 66 29 3b 0a 20  ree(sPK.aBuf);. 
1b750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1b760 2f 2a 0a 2a 2a 20 49 6e 76 65 72 74 20 61 20 63  /*.** Invert a c
1b770 68 61 6e 67 65 73 65 74 20 6f 62 6a 65 63 74 2e  hangeset object.
1b780 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
1b790 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28  hangeset_invert(
1b7a0 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65  .  int nChangese
1b7b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1b7c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b7d0 62 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a  bytes in input *
1b7e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1b7f0 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  pChangeset,     
1b800 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
1b810 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ngeset */.  int 
1b820 2a 70 6e 49 6e 76 65 72 74 65 64 2c 20 20 20 20  *pnInverted,    
1b830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b840 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  UT: Number of by
1b850 74 65 73 20 69 6e 20 6f 75 74 70 75 74 20 63 68  tes in output ch
1b860 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69  angeset */.  voi
1b870 64 20 2a 2a 70 70 49 6e 76 65 72 74 65 64 20 20  d **ppInverted  
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b890 4f 55 54 3a 20 49 6e 76 65 72 73 65 20 6f 66 20  OUT: Inverse of 
1b8a0 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 7b  pChangeset */.){
1b8b0 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75 74 20  .  SessionInput 
1b8c0 73 49 6e 70 75 74 3b 0a 0a 20 20 2f 2a 20 53 65  sInput;..  /* Se
1b8d0 74 20 75 70 20 74 68 65 20 69 6e 70 75 74 20 73  t up the input s
1b8e0 74 72 65 61 6d 20 2a 2f 0a 20 20 6d 65 6d 73 65  tream */.  memse
1b8f0 74 28 26 73 49 6e 70 75 74 2c 20 30 2c 20 73 69  t(&sInput, 0, si
1b900 7a 65 6f 66 28 53 65 73 73 69 6f 6e 49 6e 70 75  zeof(SessionInpu
1b910 74 29 29 3b 0a 20 20 73 49 6e 70 75 74 2e 6e 44  t));.  sInput.nD
1b920 61 74 61 20 3d 20 6e 43 68 61 6e 67 65 73 65 74  ata = nChangeset
1b930 3b 0a 20 20 73 49 6e 70 75 74 2e 61 44 61 74 61  ;.  sInput.aData
1b940 20 3d 20 28 75 38 2a 29 70 43 68 61 6e 67 65 73   = (u8*)pChanges
1b950 65 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 65  et;..  return se
1b960 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 49 6e  ssionChangesetIn
1b970 76 65 72 74 28 26 73 49 6e 70 75 74 2c 20 30 2c  vert(&sInput, 0,
1b980 20 30 2c 20 70 6e 49 6e 76 65 72 74 65 64 2c 20   0, pnInverted, 
1b990 70 70 49 6e 76 65 72 74 65 64 29 3b 0a 7d 0a 0a  ppInverted);.}..
1b9a0 2f 2a 0a 2a 2a 20 53 74 72 65 61 6d 69 6e 67 20  /*.** Streaming 
1b9b0 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1b9c0 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  e3changeset_inve
1b9d0 72 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rt()..*/.int sql
1b9e0 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e  ite3changeset_in
1b9f0 76 65 72 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74  vert_strm(.  int
1ba00 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20   (*xInput)(void 
1ba10 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74  *pIn, void *pDat
1ba20 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c  a, int *pnData),
1ba30 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 20 20  .  void *pIn,.  
1ba40 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76  int (*xOutput)(v
1ba50 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74  oid *pOut, const
1ba60 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
1ba70 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  t nData),.  void
1ba80 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 53 65 73 73   *pOut.){.  Sess
1ba90 69 6f 6e 49 6e 70 75 74 20 73 49 6e 70 75 74 3b  ionInput sInput;
1baa0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1bab0 20 53 65 74 20 75 70 20 74 68 65 20 69 6e 70 75   Set up the inpu
1bac0 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 6d 65  t stream */.  me
1bad0 6d 73 65 74 28 26 73 49 6e 70 75 74 2c 20 30 2c  mset(&sInput, 0,
1bae0 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 49   sizeof(SessionI
1baf0 6e 70 75 74 29 29 3b 0a 20 20 73 49 6e 70 75 74  nput));.  sInput
1bb00 2e 78 49 6e 70 75 74 20 3d 20 78 49 6e 70 75 74  .xInput = xInput
1bb10 3b 0a 20 20 73 49 6e 70 75 74 2e 70 49 6e 20 3d  ;.  sInput.pIn =
1bb20 20 70 49 6e 3b 0a 0a 20 20 72 63 20 3d 20 73 65   pIn;..  rc = se
1bb30 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 49 6e  ssionChangesetIn
1bb40 76 65 72 74 28 26 73 49 6e 70 75 74 2c 20 78 4f  vert(&sInput, xO
1bb50 75 74 70 75 74 2c 20 70 4f 75 74 2c 20 30 2c 20  utput, pOut, 0, 
1bb60 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
1bb70 65 65 28 73 49 6e 70 75 74 2e 62 75 66 2e 61 42  ee(sInput.buf.aB
1bb80 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  uf);.  return rc
1bb90 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1bba0 75 63 74 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  uct SessionApply
1bbb0 43 74 78 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  Ctx SessionApply
1bbc0 43 74 78 3b 0a 73 74 72 75 63 74 20 53 65 73 73  Ctx;.struct Sess
1bbd0 69 6f 6e 41 70 70 6c 79 43 74 78 20 7b 0a 20 20  ionApplyCtx {.  
1bbe0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
1bbf0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
1bc00 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  lete;          /
1bc10 2a 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  * DELETE stateme
1bc20 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
1bc30 73 74 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20  stmt *pUpdate;  
1bc40 20 20 20 20 20 20 20 20 2f 2a 20 55 50 44 41 54          /* UPDAT
1bc50 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
1bc60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bc70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20 20  Insert;         
1bc80 20 2f 2a 20 49 4e 53 45 52 54 20 73 74 61 74 65   /* INSERT state
1bc90 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
1bca0 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b  3_stmt *pSelect;
1bcb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
1bcc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1bcd0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a     /* Size of az
1bd00 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 50 4b 5b 5d  Col[] and abPK[]
1bd10 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 63 6f 6e   arrays */.  con
1bd20 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b  st char **azCol;
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd40 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
1bd50 6e 61 6d 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61  names */.  u8 *a
1bd60 62 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bPK;            
1bd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
1bd80 6f 6c 65 61 6e 20 61 72 72 61 79 20 2d 20 74 72  olean array - tr
1bd90 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1bda0 69 6e 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 62  in PK */.  int b
1bdb0 53 74 61 74 31 3b 20 20 20 20 20 20 20 20 20 20  Stat1;          
1bdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1bdd0 75 65 20 69 66 20 74 61 62 6c 65 20 69 73 20 73  ue if table is s
1bde0 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20  qlite_stat1 */. 
1bdf0 20 69 6e 74 20 62 44 65 66 65 72 43 6f 6e 73 74   int bDeferConst
1be00 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 20 20  raints;         
1be10 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 66 65   /* True to defe
1be20 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
1be30 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72  .  SessionBuffer
1be40 20 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20   constraints;   
1be50 20 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 63     /* Deferred c
1be60 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 73  onstraints are s
1be70 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
1be80 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20 72 65  SessionBuffer re
1be90 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
1bea0 2f 2a 20 52 65 62 61 73 65 20 69 6e 66 6f 72 6d  /* Rebase inform
1beb0 61 74 69 6f 6e 20 28 69 66 20 61 6e 79 29 20 68  ation (if any) h
1bec0 65 72 65 20 2a 2f 0a 20 20 75 38 20 62 52 65 62  ere */.  u8 bReb
1bed0 61 73 65 53 74 61 72 74 65 64 3b 20 20 20 20 20  aseStarted;     
1bee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1bef0 61 62 6c 65 20 68 65 61 64 65 72 20 69 73 20 61  able header is a
1bf00 6c 72 65 61 64 79 20 69 6e 20 72 65 62 61 73 65  lready in rebase
1bf10 20 2a 2f 0a 20 20 75 38 20 62 52 65 62 61 73 65   */.  u8 bRebase
1bf20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bf30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1bf40 20 63 6f 6c 6c 65 63 74 20 72 65 62 61 73 65 20   collect rebase 
1bf50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 7d  information */.}
1bf60 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 75 6c 61  ;../*.** Formula
1bf70 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  te a statement t
1bf80 6f 20 44 45 4c 45 54 45 20 61 20 72 6f 77 20 66  o DELETE a row f
1bf90 72 6f 6d 20 64 61 74 61 62 61 73 65 20 64 62 2e  rom database db.
1bfa0 20 41 73 73 75 6d 69 6e 67 20 61 20 74 61 62 6c   Assuming a tabl
1bfb0 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  e.** structure l
1bfc0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1bfd0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1bfe0 20 78 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 50   x(a, b, c, d, P
1bff0 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 63 29  RIMARY KEY(a, c)
1c000 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c  );.**.** The DEL
1c010 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f  ETE statement lo
1c020 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
1c030 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
1c040 46 52 4f 4d 20 78 20 57 48 45 52 45 20 61 20 3d  FROM x WHERE a =
1c050 20 3a 31 20 41 4e 44 20 63 20 3d 20 3a 33 20 41   :1 AND c = :3 A
1c060 4e 44 20 28 3a 35 20 4f 52 20 62 20 49 53 20 3a  ND (:5 OR b IS :
1c070 32 20 41 4e 44 20 64 20 49 53 20 3a 34 29 0a 2a  2 AND d IS :4).*
1c080 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 3a 35  *.** Variable :5
1c090 20 28 6e 43 6f 6c 2b 31 29 20 69 73 20 61 20 62   (nCol+1) is a b
1c0a0 6f 6f 6c 65 61 6e 2e 20 49 74 20 73 68 6f 75 6c  oolean. It shoul
1c0b0 64 20 62 65 20 73 65 74 20 74 6f 20 30 20 69 66  d be set to 0 if
1c0c0 20 77 65 20 72 65 71 75 69 72 65 0a 2a 2a 20 6d   we require.** m
1c0d0 61 74 63 68 69 6e 67 20 62 20 61 6e 64 20 64 20  atching b and d 
1c0e0 76 61 6c 75 65 73 2c 20 6f 72 20 31 20 6f 74 68  values, or 1 oth
1c0f0 65 72 77 69 73 65 2e 20 54 68 65 20 73 65 63 6f  erwise. The seco
1c100 6e 64 20 63 61 73 65 20 63 6f 6d 65 73 20 75 70  nd case comes up
1c110 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c   if the.** confl
1c120 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69  ict handler is i
1c130 6e 76 6f 6b 65 64 20 77 69 74 68 20 4e 4f 54 46  nvoked with NOTF
1c140 4f 55 4e 44 20 61 6e 64 20 72 65 74 75 72 6e 73  OUND and returns
1c150 20 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41   CHANGESET_REPLA
1c160 43 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  CE..**.** If suc
1c170 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
1c180 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1c190 6e 64 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43  nd SessionApplyC
1c1a0 74 78 2e 70 44 65 6c 65 74 65 20 69 73 20 6c 65  tx.pDelete is le
1c1b0 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ft.** pointing t
1c1c0 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 76  o the prepared v
1c1d0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ersion of the SQ
1c1e0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
1c1f0 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69  static int sessi
1c200 6f 6e 44 65 6c 65 74 65 52 6f 77 28 0a 20 20 73  onDeleteRow(.  s
1c210 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c230 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1c240 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1c250 72 20 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20  r *zTab,        
1c260 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1c270 6e 61 6d 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f  name */.  Sessio
1c280 6e 41 70 70 6c 79 43 74 78 20 2a 70 20 20 20 20  nApplyCtx *p    
1c290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73            /* Ses
1c2a0 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 2d 61  sion changeset-a
1c2b0 70 70 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  pply context */.
1c2c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
1c2d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
1c2e0 20 22 22 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   "";.  int rc = 
1c2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 65 73  SQLITE_OK;.  Ses
1c300 73 69 6f 6e 42 75 66 66 65 72 20 62 75 66 20 3d  sionBuffer buf =
1c310 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 69 6e   {0, 0, 0};.  in
1c320 74 20 6e 50 6b 20 3d 20 30 3b 0a 0a 20 20 73 65  t nPk = 0;..  se
1c330 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26  ssionAppendStr(&
1c340 62 75 66 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  buf, "DELETE FRO
1c350 4d 20 22 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  M ", &rc);.  ses
1c360 73 69 6f 6e 41 70 70 65 6e 64 49 64 65 6e 74 28  sionAppendIdent(
1c370 26 62 75 66 2c 20 7a 54 61 62 2c 20 26 72 63 29  &buf, zTab, &rc)
1c380 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ;.  sessionAppen
1c390 64 53 74 72 28 26 62 75 66 2c 20 22 20 57 48 45  dStr(&buf, " WHE
1c3a0 52 45 20 22 2c 20 26 72 63 29 3b 0a 0a 20 20 66  RE ", &rc);..  f
1c3b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
1c3c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1c3d0 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a 20   p->abPK[i] ){. 
1c3e0 20 20 20 20 20 6e 50 6b 2b 2b 3b 0a 20 20 20 20       nPk++;.    
1c3f0 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53    sessionAppendS
1c400 74 72 28 26 62 75 66 2c 20 7a 53 65 70 2c 20 26  tr(&buf, zSep, &
1c410 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69  rc);.      sessi
1c420 6f 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26 62  onAppendIdent(&b
1c430 75 66 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c  uf, p->azCol[i],
1c440 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73   &rc);.      ses
1c450 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62  sionAppendStr(&b
1c460 75 66 2c 20 22 20 3d 20 3f 22 2c 20 26 72 63 29  uf, " = ?", &rc)
1c470 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1c480 70 70 65 6e 64 49 6e 74 65 67 65 72 28 26 62 75  ppendInteger(&bu
1c490 66 2c 20 69 2b 31 2c 20 26 72 63 29 3b 0a 20 20  f, i+1, &rc);.  
1c4a0 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
1c4b0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ";.    }.  }.. 
1c4c0 20 69 66 28 20 6e 50 6b 3c 70 2d 3e 6e 43 6f 6c   if( nPk<p->nCol
1c4d0 20 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41   ){.    sessionA
1c4e0 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1c4f0 20 41 4e 44 20 28 3f 22 2c 20 26 72 63 29 3b 0a   AND (?", &rc);.
1c500 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c510 64 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 70  dInteger(&buf, p
1c520 2d 3e 6e 43 6f 6c 2b 31 2c 20 26 72 63 29 3b 0a  ->nCol+1, &rc);.
1c530 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c540 64 53 74 72 28 26 62 75 66 2c 20 22 20 4f 52 20  dStr(&buf, " OR 
1c550 22 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 7a 53  ", &rc);..    zS
1c560 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  ep = "";.    for
1c570 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
1c580 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1c590 20 21 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a   !p->abPK[i] ){.
1c5a0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
1c5b0 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 7a  ppendStr(&buf, z
1c5c0 53 65 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  Sep, &rc);.     
1c5d0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1c5e0 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d 3e 61  Ident(&buf, p->a
1c5f0 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zCol[i], &rc);. 
1c600 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
1c610 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1c620 49 53 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20  IS ?", &rc);.   
1c630 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1c640 6e 64 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20  ndInteger(&buf, 
1c650 69 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  i+1, &rc);.     
1c660 20 20 20 7a 53 65 70 20 3d 20 22 41 4e 44 20 22     zSep = "AND "
1c670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c680 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c690 64 53 74 72 28 26 62 75 66 2c 20 22 29 22 2c 20  dStr(&buf, ")", 
1c6a0 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  &rc);.  }..  if(
1c6b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c6c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c6d0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1c6e0 2c 20 28 63 68 61 72 20 2a 29 62 75 66 2e 61 42  , (char *)buf.aB
1c6f0 75 66 2c 20 62 75 66 2e 6e 42 75 66 2c 20 26 70  uf, buf.nBuf, &p
1c700 2d 3e 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20  ->pDelete, 0);. 
1c710 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1c720 65 28 62 75 66 2e 61 42 75 66 29 3b 0a 0a 20 20  e(buf.aBuf);..  
1c730 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c740 0a 2a 2a 20 46 6f 72 6d 75 6c 61 74 65 20 61 6e  .** Formulate an
1c750 64 20 70 72 65 70 61 72 65 20 61 20 73 74 61 74  d prepare a stat
1c760 65 6d 65 6e 74 20 74 6f 20 55 50 44 41 54 45 20  ement to UPDATE 
1c770 61 20 72 6f 77 20 66 72 6f 6d 20 64 61 74 61 62  a row from datab
1c780 61 73 65 20 64 62 2e 20 0a 2a 2a 20 41 73 73 75  ase db. .** Assu
1c790 6d 69 6e 67 20 61 20 74 61 62 6c 65 20 73 74 72  ming a table str
1c7a0 75 63 74 75 72 65 20 6c 69 6b 65 20 74 68 69 73  ucture like this
1c7b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
1c7c0 54 45 20 54 41 42 4c 45 20 78 28 61 2c 20 62 2c  TE TABLE x(a, b,
1c7d0 20 63 2c 20 64 2c 20 50 52 49 4d 41 52 59 20 4b   c, d, PRIMARY K
1c7e0 45 59 28 61 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(a, c));.**.**
1c7f0 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74   The UPDATE stat
1c800 65 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ement looks like
1c810 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1c820 20 55 50 44 41 54 45 20 78 20 53 45 54 0a 2a 2a   UPDATE x SET.**
1c830 20 20 20 20 20 61 20 3d 20 43 41 53 45 20 57 48       a = CASE WH
1c840 45 4e 20 3f 32 20 20 54 48 45 4e 20 3f 33 20 20  EN ?2  THEN ?3  
1c850 45 4c 53 45 20 61 20 45 4e 44 2c 0a 2a 2a 20 20  ELSE a END,.**  
1c860 20 20 20 62 20 3d 20 43 41 53 45 20 57 48 45 4e     b = CASE WHEN
1c870 20 3f 35 20 20 54 48 45 4e 20 3f 36 20 20 45 4c   ?5  THEN ?6  EL
1c880 53 45 20 62 20 45 4e 44 2c 0a 2a 2a 20 20 20 20  SE b END,.**    
1c890 20 63 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f   c = CASE WHEN ?
1c8a0 38 20 20 54 48 45 4e 20 3f 39 20 20 45 4c 53 45  8  THEN ?9  ELSE
1c8b0 20 63 20 45 4e 44 2c 0a 2a 2a 20 20 20 20 20 64   c END,.**     d
1c8c0 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f 31 31   = CASE WHEN ?11
1c8d0 20 54 48 45 4e 20 3f 31 32 20 45 4c 53 45 20 64   THEN ?12 ELSE d
1c8e0 20 45 4e 44 0a 2a 2a 20 20 20 20 20 57 48 45 52   END.**     WHER
1c8f0 45 20 61 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d  E a = ?1 AND c =
1c900 20 3f 37 20 41 4e 44 20 28 3f 31 33 20 4f 52 20   ?7 AND (?13 OR 
1c910 0a 2a 2a 20 20 20 20 20 20 20 28 3f 35 3d 3d 30  .**       (?5==0
1c920 20 4f 52 20 62 20 49 53 20 3f 34 29 20 41 4e 44   OR b IS ?4) AND
1c930 20 28 3f 31 31 3d 3d 30 20 4f 52 20 64 20 49 53   (?11==0 OR d IS
1c940 20 3f 31 30 29 20 41 4e 44 0a 2a 2a 20 20 20 20   ?10) AND.**    
1c950 20 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63   ).**.** For eac
1c960 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
1c970 74 61 62 6c 65 2c 20 74 68 65 72 65 20 61 72 65  table, there are
1c980 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
1c990 20 74 6f 20 62 69 6e 64 3a 0a 2a 2a 0a 2a 2a 20   to bind:.**.** 
1c9a0 20 20 20 20 3f 28 69 2a 33 2b 31 29 20 20 20 20      ?(i*3+1)    
1c9b0 54 68 65 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 20  The old.* value 
1c9c0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69  of the column, i
1c9d0 66 20 61 6e 79 2e 0a 2a 2a 20 20 20 20 20 3f 28  f any..**     ?(
1c9e0 69 2a 33 2b 32 29 20 20 20 20 41 20 62 6f 6f 6c  i*3+2)    A bool
1c9f0 65 61 6e 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ean flag indicat
1ca00 69 6e 67 20 74 68 61 74 20 74 68 65 20 76 61 6c  ing that the val
1ca10 75 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 64 69  ue is being modi
1ca20 66 69 65 64 2e 0a 2a 2a 20 20 20 20 20 3f 28 69  fied..**     ?(i
1ca30 2a 33 2b 33 29 20 20 20 20 54 68 65 20 6e 65 77  *3+3)    The new
1ca40 2e 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  .* value of the 
1ca50 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a  column, if any..
1ca60 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 61 20 62 6f  **.** Also, a bo
1ca70 6f 6c 65 61 6e 20 66 6c 61 67 20 74 68 61 74 2c  olean flag that,
1ca80 20 69 66 20 73 65 74 20 74 6f 20 74 72 75 65 2c   if set to true,
1ca90 20 63 61 75 73 65 73 20 74 68 65 20 73 74 61 74   causes the stat
1caa0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 0a  ement to update.
1cab0 2a 2a 20 61 20 72 6f 77 20 65 76 65 6e 20 69 66  ** a row even if
1cac0 20 74 68 65 20 6e 6f 6e 2d 50 4b 20 76 61 6c 75   the non-PK valu
1cad0 65 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  es do not match.
1cae0 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1caf0 64 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66  d if the.** conf
1cb00 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 69 73 20  lict-handler is 
1cb10 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41  invoked with CHA
1cb20 4e 47 45 53 45 54 5f 44 41 54 41 20 61 6e 64 20  NGESET_DATA and 
1cb30 72 65 74 75 72 6e 73 0a 2a 2a 20 43 48 41 4e 47  returns.** CHANG
1cb40 45 53 45 54 5f 52 45 50 4c 41 43 45 2e 20 54 68  ESET_REPLACE. Th
1cb50 69 73 20 69 73 20 76 61 72 69 61 62 6c 65 20 22  is is variable "
1cb60 3f 28 6e 43 6f 6c 2a 33 2b 31 29 22 2e 0a 2a 2a  ?(nCol*3+1)"..**
1cb70 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1cb80 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1cb90 72 65 74 75 72 6e 65 64 20 61 6e 64 20 53 65 73  returned and Ses
1cba0 73 69 6f 6e 41 70 70 6c 79 43 74 78 2e 70 55 70  sionApplyCtx.pUp
1cbb0 64 61 74 65 20 69 73 20 6c 65 66 74 0a 2a 2a 20  date is left.** 
1cbc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1cbd0 70 72 65 70 61 72 65 64 20 76 65 72 73 69 6f 6e  prepared version
1cbe0 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
1cbf0 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
1cc00 20 69 6e 74 20 73 65 73 73 69 6f 6e 55 70 64 61   int sessionUpda
1cc10 74 65 52 6f 77 28 0a 20 20 73 71 6c 69 74 65 33  teRow(.  sqlite3
1cc20 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1cc30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1cc40 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1cc50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1cc60 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1cc70 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1cc80 2f 0a 20 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  /.  SessionApply
1cc90 43 74 78 20 2a 70 20 20 20 20 20 20 20 20 20 20  Ctx *p          
1cca0 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 63      /* Session c
1ccb0 68 61 6e 67 65 73 65 74 2d 61 70 70 6c 79 20 63  hangeset-apply c
1ccc0 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 69  ontext */.){.  i
1ccd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cce0 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  K;.  int i;.  co
1ccf0 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
1cd00 20 22 22 3b 0a 20 20 53 65 73 73 69 6f 6e 42 75   "";.  SessionBu
1cd10 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30  ffer buf = {0, 0
1cd20 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  , 0};..  /* Appe
1cd30 6e 64 20 22 55 50 44 41 54 45 20 74 62 6c 20 53  nd "UPDATE tbl S
1cd40 45 54 20 22 20 2a 2f 0a 20 20 73 65 73 73 69 6f  ET " */.  sessio
1cd50 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
1cd60 20 22 55 50 44 41 54 45 20 22 2c 20 26 72 63 29   "UPDATE ", &rc)
1cd70 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ;.  sessionAppen
1cd80 64 49 64 65 6e 74 28 26 62 75 66 2c 20 7a 54 61  dIdent(&buf, zTa
1cd90 62 2c 20 26 72 63 29 3b 0a 20 20 73 65 73 73 69  b, &rc);.  sessi
1cda0 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66  onAppendStr(&buf
1cdb0 2c 20 22 20 53 45 54 20 22 2c 20 26 72 63 29 3b  , " SET ", &rc);
1cdc0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1cdd0 65 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 2a 2f  e assignments */
1cde0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1cdf0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1ce00 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1ce10 72 28 26 62 75 66 2c 20 7a 53 65 70 2c 20 26 72  r(&buf, zSep, &r
1ce20 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41  c);.    sessionA
1ce30 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c  ppendIdent(&buf,
1ce40 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72   p->azCol[i], &r
1ce50 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41  c);.    sessionA
1ce60 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1ce70 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f 22 2c   = CASE WHEN ?",
1ce80 20 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69   &rc);.    sessi
1ce90 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72 28  onAppendInteger(
1cea0 26 62 75 66 2c 20 69 2a 33 2b 32 2c 20 26 72 63  &buf, i*3+2, &rc
1ceb0 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  );.    sessionAp
1cec0 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1ced0 54 48 45 4e 20 3f 22 2c 20 26 72 63 29 3b 0a 20  THEN ?", &rc);. 
1cee0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1cef0 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1cf00 33 2b 33 2c 20 26 72 63 29 3b 0a 20 20 20 20 73  3+3, &rc);.    s
1cf10 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1cf20 26 62 75 66 2c 20 22 20 45 4c 53 45 20 22 2c 20  &buf, " ELSE ", 
1cf30 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
1cf40 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75  nAppendIdent(&bu
1cf50 66 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20  f, p->azCol[i], 
1cf60 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
1cf70 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
1cf80 20 22 20 45 4e 44 22 2c 20 26 72 63 29 3b 0a 20   " END", &rc);. 
1cf90 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
1cfa0 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
1cfb0 20 74 68 65 20 50 4b 20 70 61 72 74 20 6f 66 20   the PK part of 
1cfc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1cfd0 20 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 41 70 70   */.  sessionApp
1cfe0 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20 57  endStr(&buf, " W
1cff0 48 45 52 45 20 22 2c 20 26 72 63 29 3b 0a 20 20  HERE ", &rc);.  
1d000 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1d010 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1d020 28 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a  ( p->abPK[i] ){.
1d030 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
1d040 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c 20 70  endIdent(&buf, p
1d050 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29  ->azCol[i], &rc)
1d060 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1d070 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1d080 20 3d 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20   = ?", &rc);.   
1d090 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d0a0 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1d0b0 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  3+1, &rc);.     
1d0c0 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1d0d0 72 28 26 62 75 66 2c 20 22 20 41 4e 44 20 22 2c  r(&buf, " AND ",
1d0e0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d0f0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1d100 65 20 6e 6f 6e 2d 50 4b 20 70 61 72 74 20 6f 66  e non-PK part of
1d110 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d120 65 20 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 41 70  e */.  sessionAp
1d130 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1d140 28 3f 22 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  (?", &rc);.  ses
1d150 73 69 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65  sionAppendIntege
1d160 72 28 26 62 75 66 2c 20 70 2d 3e 6e 43 6f 6c 2a  r(&buf, p->nCol*
1d170 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  3+1, &rc);.  ses
1d180 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62  sionAppendStr(&b
1d190 75 66 2c 20 22 20 4f 52 20 31 22 2c 20 26 72 63  uf, " OR 1", &rc
1d1a0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1d1b0 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
1d1c0 20 20 20 69 66 28 20 21 70 2d 3e 61 62 50 4b 5b     if( !p->abPK[
1d1d0 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 65 73 73  i] ){.      sess
1d1e0 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75  ionAppendStr(&bu
1d1f0 66 2c 20 22 20 41 4e 44 20 28 3f 22 2c 20 26 72  f, " AND (?", &r
1d200 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f  c);.      sessio
1d210 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72 28 26  nAppendInteger(&
1d220 62 75 66 2c 20 69 2a 33 2b 32 2c 20 26 72 63 29  buf, i*3+2, &rc)
1d230 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1d240 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1d250 3d 30 20 4f 52 20 22 2c 20 26 72 63 29 3b 0a 20  =0 OR ", &rc);. 
1d260 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1d270 6e 64 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d  ndIdent(&buf, p-
1d280 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b  >azCol[i], &rc);
1d290 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70  .      sessionAp
1d2a0 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1d2b0 49 53 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20  IS ?", &rc);.   
1d2c0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d2d0 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1d2e0 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  3+1, &rc);.     
1d2f0 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1d300 72 28 26 62 75 66 2c 20 22 29 22 2c 20 26 72 63  r(&buf, ")", &rc
1d310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1d320 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1d330 26 62 75 66 2c 20 22 29 22 2c 20 26 72 63 29 3b  &buf, ")", &rc);
1d340 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1d360 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1d370 65 5f 76 32 28 64 62 2c 20 28 63 68 61 72 20 2a  e_v2(db, (char *
1d380 29 62 75 66 2e 61 42 75 66 2c 20 62 75 66 2e 6e  )buf.aBuf, buf.n
1d390 42 75 66 2c 20 26 70 2d 3e 70 55 70 64 61 74 65  Buf, &p->pUpdate
1d3a0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1d3b0 74 65 33 5f 66 72 65 65 28 62 75 66 2e 61 42 75  te3_free(buf.aBu
1d3c0 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  f);..  return rc
1d3d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d  ;.}.../*.** Form
1d3e0 75 6c 61 74 65 20 61 6e 64 20 70 72 65 70 61 72  ulate and prepar
1d3f0 65 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  e an SQL stateme
1d400 6e 74 20 74 6f 20 71 75 65 72 79 20 74 61 62 6c  nt to query tabl
1d410 65 20 7a 54 61 62 20 62 79 20 70 72 69 6d 61 72  e zTab by primar
1d420 79 0a 2a 2a 20 6b 65 79 2e 20 41 73 73 75 6d 69  y.** key. Assumi
1d430 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1d440 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1d450 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
1d460 54 45 20 54 41 42 4c 45 20 78 28 61 2c 20 62 2c  TE TABLE x(a, b,
1d470 20 63 2c 20 64 2c 20 50 52 49 4d 41 52 59 20 4b   c, d, PRIMARY K
1d480 45 59 28 61 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(a, c));.**.**
1d490 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1d4a0 65 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ement looks like
1d4b0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1d4c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
1d4d0 20 57 48 45 52 45 20 61 20 3d 20 3f 31 20 41 4e   WHERE a = ?1 AN
1d4e0 44 20 63 20 3d 20 3f 33 0a 2a 2a 0a 2a 2a 20 49  D c = ?3.**.** I
1d4f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
1d500 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d510 6e 65 64 20 61 6e 64 20 53 65 73 73 69 6f 6e 41  ned and SessionA
1d520 70 70 6c 79 43 74 78 2e 70 53 65 6c 65 63 74 20  pplyCtx.pSelect 
1d530 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
1d540 69 6e 67 20 74 6f 20 74 68 65 20 70 72 65 70 61  ing to the prepa
1d550 72 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  red version of t
1d560 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1d570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d580 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 52 6f 77  sessionSelectRow
1d590 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d5c0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
1d5d0 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20  t char *zTab,   
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d5f0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 53  able name */.  S
1d600 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a  essionApplyCtx *
1d610 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1d620 2a 20 53 65 73 73 69 6f 6e 20 63 68 61 6e 67 65  * Session change
1d630 73 65 74 2d 61 70 70 6c 79 20 63 6f 6e 74 65 78  set-apply contex
1d640 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
1d650 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 53 74   sessionSelectSt
1d660 6d 74 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d  mt(.      db, "m
1d670 61 69 6e 22 2c 20 7a 54 61 62 2c 20 70 2d 3e 6e  ain", zTab, p->n
1d680 43 6f 6c 2c 20 70 2d 3e 61 7a 43 6f 6c 2c 20 70  Col, p->azCol, p
1d690 2d 3e 61 62 50 4b 2c 20 26 70 2d 3e 70 53 65 6c  ->abPK, &p->pSel
1d6a0 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ect);.}../*.** F
1d6b0 6f 72 6d 75 6c 61 74 65 20 61 6e 64 20 70 72 65  ormulate and pre
1d6c0 70 61 72 65 20 61 6e 20 49 4e 53 45 52 54 20 73  pare an INSERT s
1d6d0 74 61 74 65 6d 65 6e 74 20 74 6f 20 61 64 64 20  tatement to add 
1d6e0 61 20 72 65 63 6f 72 64 20 74 6f 20 74 61 62 6c  a record to tabl
1d6f0 65 20 7a 54 61 62 2e 0a 2a 2a 20 46 6f 72 20 65  e zTab..** For e
1d700 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
1d710 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
1d720 69 6e 2e 22 7a 54 61 62 22 20 56 41 4c 55 45 53  in."zTab" VALUES
1d730 28 3f 31 2c 20 3f 32 2c 20 3f 33 20 2e 2e 2e 29  (?1, ?2, ?3 ...)
1d740 3b 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ;.**.** If succe
1d750 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1d760 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d770 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78   SessionApplyCtx
1d780 2e 70 49 6e 73 65 72 74 20 69 73 20 6c 65 66 74  .pInsert is left
1d790 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
1d7a0 74 68 65 20 70 72 65 70 61 72 65 64 20 76 65 72  the prepared ver
1d7b0 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 20  sion of the SQL 
1d7c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
1d7d0 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
1d7e0 49 6e 73 65 72 74 52 6f 77 28 0a 20 20 73 71 6c  InsertRow(.  sql
1d7f0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d810 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1d820 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1d830 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *zTab,          
1d840 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1d850 6d 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 41  me */.  SessionA
1d860 70 70 6c 79 43 74 78 20 2a 70 20 20 20 20 20 20  pplyCtx *p      
1d870 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69          /* Sessi
1d880 6f 6e 20 63 68 61 6e 67 65 73 65 74 2d 61 70 70  on changeset-app
1d890 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ly context */.){
1d8a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d8b0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
1d8c0 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20    SessionBuffer 
1d8d0 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
1d8e0 0a 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ..  sessionAppen
1d8f0 64 53 74 72 28 26 62 75 66 2c 20 22 49 4e 53 45  dStr(&buf, "INSE
1d900 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 22 2c 20  RT INTO main.", 
1d910 26 72 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e 41  &rc);.  sessionA
1d920 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c  ppendIdent(&buf,
1d930 20 7a 54 61 62 2c 20 26 72 63 29 3b 0a 20 20 73   zTab, &rc);.  s
1d940 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1d950 26 62 75 66 2c 20 22 28 22 2c 20 26 72 63 29 3b  &buf, "(", &rc);
1d960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1d970 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1d980 20 69 66 28 20 69 21 3d 30 20 29 20 73 65 73 73   if( i!=0 ) sess
1d990 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75  ionAppendStr(&bu
1d9a0 66 2c 20 22 2c 20 22 2c 20 26 72 63 29 3b 0a 20  f, ", ", &rc);. 
1d9b0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d9c0 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d 3e 61  Ident(&buf, p->a
1d9d0 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zCol[i], &rc);. 
1d9e0 20 7d 0a 0a 20 20 73 65 73 73 69 6f 6e 41 70 70   }..  sessionApp
1d9f0 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 29 20  endStr(&buf, ") 
1da00 56 41 4c 55 45 53 28 3f 22 2c 20 26 72 63 29 3b  VALUES(?", &rc);
1da10 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
1da20 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1da30 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1da40 72 28 26 62 75 66 2c 20 22 2c 20 3f 22 2c 20 26  r(&buf, ", ?", &
1da50 72 63 29 3b 0a 20 20 7d 0a 20 20 73 65 73 73 69  rc);.  }.  sessi
1da60 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66  onAppendStr(&buf
1da70 2c 20 22 29 22 2c 20 26 72 63 29 3b 0a 0a 20 20  , ")", &rc);..  
1da80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1da90 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1daa0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1dab0 28 64 62 2c 20 28 63 68 61 72 20 2a 29 62 75 66  (db, (char *)buf
1dac0 2e 61 42 75 66 2c 20 62 75 66 2e 6e 42 75 66 2c  .aBuf, buf.nBuf,
1dad0 20 26 70 2d 3e 70 49 6e 73 65 72 74 2c 20 30 29   &p->pInsert, 0)
1dae0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1daf0 66 72 65 65 28 62 75 66 2e 61 42 75 66 29 3b 0a  free(buf.aBuf);.
1db00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1db10 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69  static int sessi
1db20 6f 6e 50 72 65 70 61 72 65 28 73 71 6c 69 74 65  onPrepare(sqlite
1db30 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 73  3 *db, sqlite3_s
1db40 74 6d 74 20 2a 2a 70 70 2c 20 63 6f 6e 73 74 20  tmt **pp, const 
1db50 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 72  char *zSql){.  r
1db60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
1db70 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
1db80 6c 2c 20 2d 31 2c 20 70 70 2c 20 30 29 3b 0a 7d  l, -1, pp, 0);.}
1db90 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
1dba0 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 61  statements for a
1dbb0 70 70 6c 79 69 6e 67 20 63 68 61 6e 67 65 73 20  pplying changes 
1dbc0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  to the sqlite_st
1dbd0 61 74 31 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  at1 table..** Th
1dbe0 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ese are similar 
1dbf0 74 6f 20 74 68 6f 73 65 20 63 72 65 61 74 65 64  to those created
1dc00 20 62 79 20 73 65 73 73 69 6f 6e 53 65 6c 65 63   by sessionSelec
1dc10 74 52 6f 77 28 29 2c 0a 2a 2a 20 73 65 73 73 69  tRow(),.** sessi
1dc20 6f 6e 49 6e 73 65 72 74 52 6f 77 28 29 2c 20 73  onInsertRow(), s
1dc30 65 73 73 69 6f 6e 55 70 64 61 74 65 52 6f 77 28  essionUpdateRow(
1dc40 29 20 61 6e 64 20 73 65 73 73 69 6f 6e 44 65 6c  ) and sessionDel
1dc50 65 74 65 52 6f 77 28 29 20 66 6f 72 20 0a 2a 2a  eteRow() for .**
1dc60 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2e 0a 2a   other tables..*
1dc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
1dc80 73 69 6f 6e 53 74 61 74 31 53 71 6c 28 73 71 6c  sionStat1Sql(sql
1dc90 69 74 65 33 20 2a 64 62 2c 20 53 65 73 73 69 6f  ite3 *db, Sessio
1dca0 6e 41 70 70 6c 79 43 74 78 20 2a 70 29 7b 0a 20  nApplyCtx *p){. 
1dcb0 20 69 6e 74 20 72 63 20 3d 20 73 65 73 73 69 6f   int rc = sessio
1dcc0 6e 53 65 6c 65 63 74 52 6f 77 28 64 62 2c 20 22  nSelectRow(db, "
1dcd0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 70  sqlite_stat1", p
1dce0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1dcf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1dd00 20 3d 20 73 65 73 73 69 6f 6e 50 72 65 70 61 72   = sessionPrepar
1dd10 65 28 64 62 2c 20 26 70 2d 3e 70 49 6e 73 65 72  e(db, &p->pInser
1dd20 74 2c 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  t,.        "INSE
1dd30 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 73 71 6c  RT INTO main.sql
1dd40 69 74 65 5f 73 74 61 74 31 20 56 41 4c 55 45 53  ite_stat1 VALUES
1dd50 28 3f 31 2c 20 22 0a 20 20 20 20 20 20 20 20 22  (?1, ".        "
1dd60 43 41 53 45 20 57 48 45 4e 20 6c 65 6e 67 74 68  CASE WHEN length
1dd70 28 3f 32 29 3d 30 20 41 4e 44 20 74 79 70 65 6f  (?2)=0 AND typeo
1dd80 66 28 3f 32 29 3d 27 62 6c 6f 62 27 20 54 48 45  f(?2)='blob' THE
1dd90 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 3f 32 20 45  N NULL ELSE ?2 E
1dda0 4e 44 2c 20 22 0a 20 20 20 20 20 20 20 20 22 3f  ND, ".        "?
1ddb0 33 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  3)".    );.  }. 
1ddc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ddd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1dde0 65 73 73 69 6f 6e 50 72 65 70 61 72 65 28 64 62  essionPrepare(db
1ddf0 2c 20 26 70 2d 3e 70 55 70 64 61 74 65 2c 0a 20  , &p->pUpdate,. 
1de00 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20 6d         "UPDATE m
1de10 61 69 6e 2e 73 71 6c 69 74 65 5f 73 74 61 74 31  ain.sqlite_stat1
1de20 20 53 45 54 20 22 0a 20 20 20 20 20 20 20 20 22   SET ".        "
1de30 74 62 6c 20 3d 20 43 41 53 45 20 57 48 45 4e 20  tbl = CASE WHEN 
1de40 3f 32 20 54 48 45 4e 20 3f 33 20 45 4c 53 45 20  ?2 THEN ?3 ELSE 
1de50 74 62 6c 20 45 4e 44 2c 20 22 0a 20 20 20 20 20  tbl END, ".     
1de60 20 20 20 22 69 64 78 20 3d 20 43 41 53 45 20 57     "idx = CASE W
1de70 48 45 4e 20 3f 35 20 54 48 45 4e 20 3f 36 20 45  HEN ?5 THEN ?6 E
1de80 4c 53 45 20 69 64 78 20 45 4e 44 2c 20 22 0a 20  LSE idx END, ". 
1de90 20 20 20 20 20 20 20 22 73 74 61 74 20 3d 20 43         "stat = C
1dea0 41 53 45 20 57 48 45 4e 20 3f 38 20 54 48 45 4e  ASE WHEN ?8 THEN
1deb0 20 3f 39 20 45 4c 53 45 20 73 74 61 74 20 45 4e   ?9 ELSE stat EN
1dec0 44 20 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  D  ".        "WH
1ded0 45 52 45 20 74 62 6c 3d 3f 31 20 41 4e 44 20 69  ERE tbl=?1 AND i
1dee0 64 78 20 49 53 20 22 0a 20 20 20 20 20 20 20 20  dx IS ".        
1def0 22 43 41 53 45 20 57 48 45 4e 20 6c 65 6e 67 74  "CASE WHEN lengt
1df00 68 28 3f 34 29 3d 30 20 41 4e 44 20 74 79 70 65  h(?4)=0 AND type
1df10 6f 66 28 3f 34 29 3d 27 62 6c 6f 62 27 20 54 48  of(?4)='blob' TH
1df20 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 3f 34 20  EN NULL ELSE ?4 
1df30 45 4e 44 20 22 0a 20 20 20 20 20 20 20 20 22 41  END ".        "A
1df40 4e 44 20 28 3f 31 30 20 4f 52 20 3f 38 3d 30 20  ND (?10 OR ?8=0 
1df50 4f 52 20 73 74 61 74 20 49 53 20 3f 37 29 22 0a  OR stat IS ?7)".
1df60 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
1df70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1df80 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69  {.    rc = sessi
1df90 6f 6e 50 72 65 70 61 72 65 28 64 62 2c 20 26 70  onPrepare(db, &p
1dfa0 2d 3e 70 44 65 6c 65 74 65 2c 0a 20 20 20 20 20  ->pDelete,.     
1dfb0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1dfc0 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 73 74 61 74  main.sqlite_stat
1dfd0 31 20 57 48 45 52 45 20 74 62 6c 3d 3f 31 20 41  1 WHERE tbl=?1 A
1dfe0 4e 44 20 69 64 78 20 49 53 20 22 0a 20 20 20 20  ND idx IS ".    
1dff0 20 20 20 20 22 43 41 53 45 20 57 48 45 4e 20 6c      "CASE WHEN l
1e000 65 6e 67 74 68 28 3f 32 29 3d 30 20 41 4e 44 20  ength(?2)=0 AND 
1e010 74 79 70 65 6f 66 28 3f 32 29 3d 27 62 6c 6f 62  typeof(?2)='blob
1e020 27 20 54 48 45 4e 20 4e 55 4c 4c 20 45 4c 53 45  ' THEN NULL ELSE
1e030 20 3f 32 20 45 4e 44 20 22 0a 20 20 20 20 20 20   ?2 END ".      
1e040 20 20 22 41 4e 44 20 28 3f 34 20 4f 52 20 73 74    "AND (?4 OR st
1e050 61 74 20 49 53 20 3f 33 29 22 0a 20 20 20 20 29  at IS ?3)".    )
1e060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  c;.}../*.** A wr
1e080 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1e090 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
1e0a0 29 20 74 68 61 74 20 64 65 74 65 63 74 73 20 61  ) that detects a
1e0b0 6e 20 65 78 74 72 61 20 70 72 6f 62 6c 65 6d 2e  n extra problem.
1e0c0 20 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74   .** See comment
1e0d0 73 20 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  s in the body of
1e0e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1e0f0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73  or details..*/.s
1e100 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1e110 6e 42 69 6e 64 56 61 6c 75 65 28 0a 20 20 73 71  nBindValue(.  sq
1e120 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e130 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
1e140 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 69   Statement to bi
1e150 6e 64 20 76 61 6c 75 65 20 74 6f 20 2a 2f 0a 20  nd value to */. 
1e160 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 75   /* Parameter nu
1e190 6d 62 65 72 20 74 6f 20 62 69 6e 64 20 74 6f 20  mber to bind to 
1e1a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1e1b0 75 65 20 2a 70 56 61 6c 20 20 20 20 20 20 20 20  ue *pVal        
1e1c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1e1d0 20 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e   bind */.){.  in
1e1e0 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65  t eType = sqlite
1e1f0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
1e200 6c 29 3b 0a 20 20 2f 2a 20 43 4f 56 45 52 41 47  l);.  /* COVERAG
1e210 45 3a 20 54 68 65 20 28 70 56 61 6c 2d 3e 7a 3d  E: The (pVal->z=
1e220 3d 30 29 20 62 72 61 6e 63 68 20 69 73 20 6e 65  =0) branch is ne
1e230 76 65 72 20 74 72 75 65 20 75 73 69 6e 67 20 63  ver true using c
1e240 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 73 0a  urrent versions.
1e250 20 20 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 20    ** of SQLite. 
1e260 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
1e270 73 20 69 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f  s in an sqlite3_
1e280 76 61 6c 75 65 5f 78 78 78 28 29 20 66 75 6e 63  value_xxx() func
1e290 74 69 6f 6e 2c 20 65 69 74 68 65 72 0a 20 20 2a  tion, either.  *
1e2a0 2a 20 74 68 65 20 28 70 56 61 6c 2d 3e 7a 29 20  * the (pVal->z) 
1e2b0 76 61 72 69 61 62 6c 65 20 72 65 6d 61 69 6e 73  variable remains
1e2c0 20 61 73 20 69 74 20 77 61 73 20 6f 72 20 74 68   as it was or th
1e2d0 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 76 61  e type of the va
1e2e0 6c 75 65 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  lue is.  ** set 
1e2f0 74 6f 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 2e 20  to SQLITE_NULL. 
1e300 20 2a 2f 0a 20 20 69 66 28 20 28 65 54 79 70 65   */.  if( (eType
1e310 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
1e320 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
1e330 4c 4f 42 29 20 26 26 20 70 56 61 6c 2d 3e 7a 3d  LOB) && pVal->z=
1e340 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1e350 73 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  s condition occu
1e360 72 73 20 77 68 65 6e 20 61 6e 20 65 61 72 6c 69  rs when an earli
1e370 65 72 20 4f 4f 4d 20 69 6e 20 61 20 63 61 6c 6c  er OOM in a call
1e380 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
1e390 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20  e3_value_text() 
1e3a0 6f 72 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  or sqlite3_value
1e3b0 5f 62 6c 6f 62 28 29 20 28 70 65 72 68 61 70 73  _blob() (perhaps
1e3c0 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 20 20 20   from within.   
1e3d0 20 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   ** a conflict-h
1e3e0 61 6e 64 6c 65 72 29 20 68 61 73 20 7a 65 72 6f  andler) has zero
1e3f0 65 64 20 74 68 65 20 70 56 61 6c 2d 3e 7a 20 70  ed the pVal->z p
1e400 6f 69 6e 74 65 72 2e 20 52 65 74 75 72 6e 20 4e  ointer. Return N
1e410 4f 4d 45 4d 2e 20 2a 2f 0a 20 20 20 20 72 65 74  OMEM. */.    ret
1e420 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1e440 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1e450 65 28 70 53 74 6d 74 2c 20 69 2c 20 70 56 61 6c  e(pStmt, i, pVal
1e460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
1e470 61 74 6f 72 20 70 49 74 65 72 20 6d 75 73 74 20  ator pIter must 
1e480 70 6f 69 6e 74 20 74 6f 20 61 6e 20 53 51 4c 49  point to an SQLI
1e490 54 45 5f 49 4e 53 45 52 54 20 65 6e 74 72 79 2e  TE_INSERT entry.
1e4a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1e4b0 2a 2a 20 74 72 61 6e 73 66 65 72 73 20 6e 65 77  ** transfers new
1e4c0 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  .* values from t
1e4d0 68 65 20 63 75 72 72 65 6e 74 20 69 74 65 72 61  he current itera
1e4e0 74 6f 72 20 65 6e 74 72 79 20 74 6f 20 73 74 61  tor entry to sta
1e4f0 74 65 6d 65 6e 74 0a 2a 2a 20 70 53 74 6d 74 2e  tement.** pStmt.
1e500 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
1e510 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 68   inserted into h
1e520 61 73 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e  as nCol columns.
1e530 0a 2a 2a 0a 2a 2a 20 4e 65 77 2e 2a 20 76 61 6c  .**.** New.* val
1e540 75 65 20 24 69 20 66 72 6f 6d 20 74 68 65 20 69  ue $i from the i
1e550 74 65 72 61 74 6f 72 20 69 73 20 62 6f 75 6e 64  terator is bound
1e560 20 74 6f 20 76 61 72 69 61 62 6c 65 20 28 24 69   to variable ($i
1e570 2b 31 29 20 6f 66 20 0a 2a 2a 20 73 74 61 74 65  +1) of .** state
1e580 6d 65 6e 74 20 70 53 74 6d 74 2e 20 49 66 20 70  ment pStmt. If p
1e590 61 72 61 6d 65 74 65 72 20 61 62 50 4b 20 69 73  arameter abPK is
1e5a0 20 4e 55 4c 4c 2c 20 61 6c 6c 20 76 61 6c 75 65   NULL, all value
1e5b0 73 20 66 72 6f 6d 20 30 20 74 6f 20 28 6e 43 6f  s from 0 to (nCo
1e5c0 6c 2d 31 29 0a 2a 2a 20 61 72 65 20 74 72 61 6e  l-1).** are tran
1e5d0 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 73 74  sfered to the st
1e5e0 61 74 65 6d 65 6e 74 2e 20 4f 74 68 65 72 77 69  atement. Otherwi
1e5f0 73 65 2c 20 69 66 20 61 62 50 4b 20 69 73 20 6e  se, if abPK is n
1e600 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
1e610 74 73 0a 2a 2a 20 74 6f 20 61 6e 20 61 72 72 61  ts.** to an arra
1e620 79 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20  y nCol elements 
1e630 69 6e 20 73 69 7a 65 2e 20 49 6e 20 74 68 69 73  in size. In this
1e640 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 6f 73 65   case only those
1e650 20 76 61 6c 75 65 73 20 66 6f 72 20 0a 2a 2a 20   values for .** 
1e660 77 68 69 63 68 20 61 62 50 4b 5b 24 69 5d 20 69  which abPK[$i] i
1e670 73 20 74 72 75 65 20 61 72 65 20 72 65 61 64 20  s true are read 
1e680 66 72 6f 6d 20 74 68 65 20 69 74 65 72 61 74 6f  from the iterato
1e690 72 20 61 6e 64 20 62 6f 75 6e 64 20 74 6f 20 74  r and bound to t
1e6a0 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
1e6b0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 53 51 4c 69 74  ..**.** An SQLit
1e6c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1e6d0 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20 65  returned if an e
1e6e0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 4f 74 68  rror occurs. Oth
1e6f0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1e700 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1e710 20 73 65 73 73 69 6f 6e 42 69 6e 64 52 6f 77 28   sessionBindRow(
1e720 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
1e730 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
1e740 2c 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74  ,  /* Iterator t
1e750 6f 20 72 65 61 64 20 76 61 6c 75 65 73 20 66 72  o read values fr
1e760 6f 6d 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 56 61  om */.  int(*xVa
1e770 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 68 61  lue)(sqlite3_cha
1e780 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2c 20 69  ngeset_iter *, i
1e790 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  nt, sqlite3_valu
1e7a0 65 20 2a 2a 29 2c 0a 20 20 69 6e 74 20 6e 43 6f  e **),.  int nCo
1e7b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e7d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
1e7e0 0a 20 20 75 38 20 2a 61 62 50 4b 2c 20 20 20 20  .  u8 *abPK,    
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
1e810 4c 2c 20 62 69 6e 64 20 6f 6e 6c 79 20 69 66 20  L, bind only if 
1e820 74 72 75 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  true */.  sqlite
1e830 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20  3_stmt *pStmt   
1e840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
1e850 64 20 76 61 6c 75 65 73 20 74 6f 20 74 68 69 73  d values to this
1e860 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
1e870 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1e880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e890 0a 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 71  .  /* Neither sq
1e8a0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
1e8b0 6c 64 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61  ld or sqlite3cha
1e8c0 6e 67 65 73 65 74 5f 6e 65 77 20 63 61 6e 20 66  ngeset_new can f
1e8d0 61 69 6c 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  ail if the.  ** 
1e8e0 61 72 67 75 6d 65 6e 74 20 69 74 65 72 61 74 6f  argument iterato
1e8f0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 75  r points to a su
1e900 69 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 4d 61  itable entry. Ma
1e910 6b 65 20 73 75 72 65 20 74 68 61 74 20 78 56 61  ke sure that xVa
1e920 6c 75 65 20 0a 20 20 2a 2a 20 69 73 20 6f 6e 65  lue .  ** is one
1e930 20 6f 66 20 74 68 65 73 65 20 74 6f 20 67 75 61   of these to gua
1e940 72 61 6e 74 65 65 20 74 68 61 74 20 69 74 20 69  rantee that it i
1e950 73 20 73 61 66 65 20 74 6f 20 69 67 6e 6f 72 65  s safe to ignore
1e960 20 74 68 65 20 72 65 74 75 72 6e 20 0a 20 20 2a   the return .  *
1e970 2a 20 69 6e 20 74 68 65 20 63 6f 64 65 20 62 65  * in the code be
1e980 6c 6f 77 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  low. */.  assert
1e990 28 20 78 56 61 6c 75 65 3d 3d 73 71 6c 69 74 65  ( xValue==sqlite
1e9a0 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 20 7c  3changeset_old |
1e9b0 7c 20 78 56 61 6c 75 65 3d 3d 73 71 6c 69 74 65  | xValue==sqlite
1e9c0 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 20 29  3changeset_new )
1e9d0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  ;..  for(i=0; rc
1e9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1e9f0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1ea00 20 69 66 28 20 21 61 62 50 4b 20 7c 7c 20 61 62   if( !abPK || ab
1ea10 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  PK[i] ){.      s
1ea20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1ea30 61 6c 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29  al;.      (void)
1ea40 78 56 61 6c 75 65 28 70 49 74 65 72 2c 20 69 2c  xValue(pIter, i,
1ea50 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
1ea60 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( pVal==0 ){.  
1ea70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
1ea80 75 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ue in the change
1ea90 73 65 74 20 77 61 73 20 22 75 6e 64 65 66 69 6e  set was "undefin
1eaa0 65 64 22 2e 20 54 68 69 73 20 69 6e 64 69 63 61  ed". This indica
1eab0 74 65 73 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  tes a.        **
1eac0 20 63 6f 72 72 75 70 74 20 63 68 61 6e 67 65 73   corrupt changes
1ead0 65 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20  et blob.  */.   
1eae0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1eaf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1eb00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1eb10 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
1eb20 42 69 6e 64 56 61 6c 75 65 28 70 53 74 6d 74 2c  BindValue(pStmt,
1eb30 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20   i+1, pVal);.   
1eb40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1eb50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eb60 2a 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  *.** SQL stateme
1eb70 6e 74 20 70 53 65 6c 65 63 74 20 69 73 20 61 73  nt pSelect is as
1eb80 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
1eb90 65 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 52  e sessionSelectR
1eba0 6f 77 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ow() function..*
1ebb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ebc0 62 69 6e 64 73 20 74 68 65 20 70 72 69 6d 61 72  binds the primar
1ebd0 79 20 6b 65 79 20 76 61 6c 75 65 73 20 66 72 6f  y key values fro
1ebe0 6d 20 74 68 65 20 63 68 61 6e 67 65 20 74 68 61  m the change tha
1ebf0 74 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 69  t changeset.** i
1ec00 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 70 6f  terator pIter po
1ec10 69 6e 74 73 20 74 6f 20 74 6f 20 74 68 65 20 53  ints to to the S
1ec20 45 4c 45 43 54 20 61 6e 64 20 61 74 74 65 6d 70  ELECT and attemp
1ec30 74 73 20 74 6f 20 73 65 65 6b 20 74 6f 20 74 68  ts to seek to th
1ec40 65 20 74 61 62 6c 65 0a 2a 2a 20 65 6e 74 72 79  e table.** entry
1ec50 2e 20 49 66 20 61 20 72 6f 77 20 69 73 20 66 6f  . If a row is fo
1ec60 75 6e 64 2c 20 74 68 65 20 53 45 4c 45 43 54 20  und, the SELECT 
1ec70 73 74 61 74 65 6d 65 6e 74 20 6c 65 66 74 20 70  statement left p
1ec80 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 72  ointing at the r
1ec90 6f 77 20 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ow .** and SQLIT
1eca0 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e 65  E_ROW is returne
1ecb0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1ecc0 20 6e 6f 20 72 6f 77 20 69 73 20 66 6f 75 6e 64   no row is found
1ecd0 20 61 6e 64 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a   and no error.**
1ece0 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 74 68   has occured, th
1ecf0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
1ed00 65 73 65 74 20 61 6e 64 20 53 51 4c 49 54 45 5f  eset and SQLITE_
1ed10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1ed20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  If an.** error o
1ed30 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
1ed40 6d 65 6e 74 20 69 73 20 72 65 73 65 74 20 61 6e  ment is reset an
1ed50 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
1ed60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1ed70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
1ed80 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1ed90 6e 73 20 53 51 4c 49 54 45 5f 52 4f 57 2c 20 74  ns SQLITE_ROW, t
1eda0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1edb0 76 65 6e 74 75 61 6c 6c 79 20 72 65 73 65 74 28  ventually reset(
1edc0 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
1edd0 70 53 65 6c 65 63 74 2e 20 49 66 20 61 6e 79 20  pSelect. If any 
1ede0 6f 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 72  other value is r
1edf0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 73 74 61  eturned, the sta
1ee00 74 65 6d 65 6e 74 20 64 6f 65 73 0a 2a 2a 20 6e  tement does.** n
1ee10 6f 74 20 72 65 71 75 69 72 65 20 61 20 72 65 73  ot require a res
1ee20 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  et()..**.** If t
1ee30 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1ee40 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1ee50 61 6e 20 49 4e 53 45 52 54 20 72 65 63 6f 72 64  an INSERT record
1ee60 2c 20 62 69 6e 64 20 76 61 6c 75 65 73 20 66 72  , bind values fr
1ee70 6f 6d 20 74 68 65 0a 2a 2a 20 6e 65 77 2e 2a 20  om the.** new.* 
1ee80 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 53 45  record to the SE
1ee90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1eea0 4f 72 2c 20 69 66 20 69 74 20 70 6f 69 6e 74 73  Or, if it points
1eeb0 20 74 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 0a   to a DELETE or.
1eec0 2a 2a 20 55 50 44 41 54 45 2c 20 62 69 6e 64 20  ** UPDATE, bind 
1eed0 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
1eee0 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2e 20 0a 2a  old.* record. .*
1eef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
1ef00 73 69 6f 6e 53 65 65 6b 54 6f 52 6f 77 28 0a 20  sionSeekToRow(. 
1ef10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
1ef40 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
1ef50 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
1ef60 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e  *pIter,  /* Chan
1ef70 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a  geset iterator *
1ef80 2f 0a 20 20 75 38 20 2a 61 62 50 4b 2c 20 20 20  /.  u8 *abPK,   
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b      /* Primary k
1efb0 65 79 20 66 6c 61 67 73 20 61 72 72 61 79 20 2a  ey flags array *
1efc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1efd0 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
1efe0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1eff0 61 74 65 6d 65 6e 74 20 66 72 6f 6d 20 73 65 73  atement from ses
1f000 73 69 6f 6e 53 65 6c 65 63 74 52 6f 77 28 29 20  sionSelectRow() 
1f010 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f040 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1f050 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
1f060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f070 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1f080 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
1f090 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f0b0 2a 20 43 68 61 6e 67 73 65 74 20 6f 70 65 72 61  * Changset opera
1f0c0 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 55 50 44  tion (SQLITE_UPD
1f0d0 41 54 45 20 65 74 63 2e 29 20 2a 2f 0a 20 20 63  ATE etc.) */.  c
1f0e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 75 6d 6d  onst char *zDumm
1f0f0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
1f100 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 0a 20 20 73  * Unused */..  s
1f110 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1f120 6f 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d 6d  op(pIter, &zDumm
1f130 79 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20 30  y, &nCol, &op, 0
1f140 29 3b 0a 20 20 72 63 20 3d 20 73 65 73 73 69 6f  );.  rc = sessio
1f150 6e 42 69 6e 64 52 6f 77 28 70 49 74 65 72 2c 20  nBindRow(pIter, 
1f160 0a 20 20 20 20 20 20 6f 70 3d 3d 53 51 4c 49 54  .      op==SQLIT
1f170 45 5f 49 4e 53 45 52 54 20 3f 20 73 71 6c 69 74  E_INSERT ? sqlit
1f180 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 20  e3changeset_new 
1f190 3a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  : sqlite3changes
1f1a0 65 74 5f 6f 6c 64 2c 0a 20 20 20 20 20 20 6e 43  et_old,.      nC
1f1b0 6f 6c 2c 20 61 62 50 4b 2c 20 70 53 65 6c 65 63  ol, abPK, pSelec
1f1c0 74 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  t.  );..  if( rc
1f1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f1e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f1f0 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
1f200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f210 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 73 71 6c  E_ROW ) rc = sql
1f220 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
1f230 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ct);.  }..  retu
1f240 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f250 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f260 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
1f270 68 69 6e 20 73 71 6c 69 74 65 33 63 68 61 6e 67  hin sqlite3chang
1f280 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28 29 20  eset_apply_v2() 
1f290 77 68 65 6e 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69  when.** a confli
1f2a0 63 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ct is encountere
1f2b0 64 20 61 6e 64 20 72 65 73 6f 6c 76 65 64 20 75  d and resolved u
1f2c0 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 72 65  sing conflict re
1f2d0 73 6f 6c 75 74 69 6f 6e 0a 2a 2a 20 6d 6f 64 65  solution.** mode
1f2e0 20 65 54 79 70 65 20 28 65 69 74 68 65 72 20 53   eType (either S
1f2f0 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
1f300 4f 4d 49 54 20 6f 72 20 53 51 4c 49 54 45 5f 43  OMIT or SQLITE_C
1f310 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
1f320 29 2e 2e 0a 2a 2a 20 49 74 20 61 64 64 73 20 61  )...** It adds a
1f330 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
1f340 74 69 6f 6e 20 72 65 63 6f 72 64 20 74 6f 20 74  tion record to t
1f350 68 65 20 62 75 66 66 65 72 20 69 6e 20 0a 2a 2a  he buffer in .**
1f360 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78   SessionApplyCtx
1f370 2e 72 65 62 61 73 65 2c 20 77 68 69 63 68 20 77  .rebase, which w
1f380 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  ill eventually b
1f390 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
1f3a0 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 6f 66 20 61  e caller.** of a
1f3b0 70 70 6c 79 5f 76 32 28 29 20 61 73 20 74 68 65  pply_v2() as the
1f3c0 20 22 72 65 62 61 73 65 22 20 62 75 66 66 65 72   "rebase" buffer
1f3d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1f3e0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1f3f0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1f400 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1f410 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1f420 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
1f430 52 65 62 61 73 65 41 64 64 28 0a 20 20 53 65 73  RebaseAdd(.  Ses
1f440 73 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a 70 2c  sionApplyCtx *p,
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f460 41 70 70 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f  Apply context */
1f470 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
1f4a0 65 73 6f 6c 75 74 69 6f 6e 20 28 4f 4d 49 54 20  esolution (OMIT 
1f4b0 6f 72 20 52 45 50 4c 41 43 45 29 20 2a 2f 0a 20  or REPLACE) */. 
1f4c0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1f4d0 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 20 20  et_iter *pIter  
1f4e0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 70 6f 69   /* Iterator poi
1f4f0 6e 74 69 6e 67 20 61 74 20 63 75 72 72 65 6e 74  nting at current
1f500 20 63 68 61 6e 67 65 20 2a 2f 0a 29 7b 0a 20 20   change */.){.  
1f510 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f520 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 62 52 65  OK;.  if( p->bRe
1f530 62 61 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  base ){.    int 
1f540 69 3b 0a 20 20 20 20 69 6e 74 20 65 4f 70 20 3d  i;.    int eOp =
1f550 20 70 49 74 65 72 2d 3e 6f 70 3b 0a 20 20 20 20   pIter->op;.    
1f560 69 66 28 20 70 2d 3e 62 52 65 62 61 73 65 53 74  if( p->bRebaseSt
1f570 61 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  arted==0 ){.    
1f580 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 74 61    /* Append a ta
1f590 62 6c 65 2d 68 65 61 64 65 72 20 74 6f 20 74 68  ble-header to th
1f5a0 65 20 72 65 62 61 73 65 20 62 75 66 66 65 72 20  e rebase buffer 
1f5b0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1f5c0 68 61 72 20 2a 7a 54 61 62 20 3d 20 70 49 74 65  har *zTab = pIte
1f5d0 72 2d 3e 7a 54 61 62 3b 0a 20 20 20 20 20 20 73  r->zTab;.      s
1f5e0 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65  essionAppendByte
1f5f0 28 26 70 2d 3e 72 65 62 61 73 65 2c 20 27 54 27  (&p->rebase, 'T'
1f600 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65  , &rc);.      se
1f610 73 73 69 6f 6e 41 70 70 65 6e 64 56 61 72 69 6e  ssionAppendVarin
1f620 74 28 26 70 2d 3e 72 65 62 61 73 65 2c 20 70 2d  t(&p->rebase, p-
1f630 3e 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20  >nCol, &rc);.   
1f640 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1f650 42 6c 6f 62 28 26 70 2d 3e 72 65 62 61 73 65 2c  Blob(&p->rebase,
1f660 20 70 2d 3e 61 62 50 4b 2c 20 70 2d 3e 6e 43 6f   p->abPK, p->nCo
1f670 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73  l, &rc);.      s
1f680 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62  essionAppendBlob
1f690 28 26 70 2d 3e 72 65 62 61 73 65 2c 20 28 75 38  (&p->rebase, (u8
1f6a0 2a 29 7a 54 61 62 2c 20 28 69 6e 74 29 73 74 72  *)zTab, (int)str
1f6b0 6c 65 6e 28 7a 54 61 62 29 2b 31 2c 20 26 72 63  len(zTab)+1, &rc
1f6c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 52 65 62  );.      p->bReb
1f6d0 61 73 65 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  aseStarted = 1;.
1f6e0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1f6f0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
1f700 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41  _CHANGESET_REPLA
1f710 43 45 7c 7c 65 54 79 70 65 3d 3d 53 51 4c 49 54  CE||eType==SQLIT
1f720 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54  E_CHANGESET_OMIT
1f730 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f740 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45  eOp==SQLITE_DELE
1f750 54 45 20 7c 7c 20 65 4f 70 3d 3d 53 51 4c 49 54  TE || eOp==SQLIT
1f760 45 5f 49 4e 53 45 52 54 20 7c 7c 20 65 4f 70 3d  E_INSERT || eOp=
1f770 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
1f780 3b 0a 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  ;..    sessionAp
1f790 70 65 6e 64 42 79 74 65 28 26 70 2d 3e 72 65 62  pendByte(&p->reb
1f7a0 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20 28 65  ase, .        (e
1f7b0 4f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  Op==SQLITE_DELET
1f7c0 45 20 3f 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  E ? SQLITE_DELET
1f7d0 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  E : SQLITE_INSER
1f7e0 54 29 2c 20 26 72 63 0a 20 20 20 20 20 20 20 20  T), &rc.        
1f7f0 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  );.    sessionAp
1f800 70 65 6e 64 42 79 74 65 28 26 70 2d 3e 72 65 62  pendByte(&p->reb
1f810 61 73 65 2c 20 28 65 54 79 70 65 3d 3d 53 51 4c  ase, (eType==SQL
1f820 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45  ITE_CHANGESET_RE
1f830 50 4c 41 43 45 29 2c 20 26 72 63 29 3b 0a 20 20  PLACE), &rc);.  
1f840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1f850 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1f860 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1f870 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pVal = 0;.     
1f880 20 69 66 28 20 65 4f 70 3d 3d 53 51 4c 49 54 45   if( eOp==SQLITE
1f890 5f 44 45 4c 45 54 45 20 7c 7c 20 28 65 4f 70 3d  _DELETE || (eOp=
1f8a0 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 26  =SQLITE_UPDATE &
1f8b0 26 20 70 2d 3e 61 62 50 4b 5b 69 5d 29 20 29 7b  & p->abPK[i]) ){
1f8c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f8d0 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 70 49  changeset_old(pI
1f8e0 74 65 72 2c 20 69 2c 20 26 70 56 61 6c 29 3b 0a  ter, i, &pVal);.
1f8f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f900 20 20 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e       sqlite3chan
1f910 67 65 73 65 74 5f 6e 65 77 28 70 49 74 65 72 2c  geset_new(pIter,
1f920 20 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20   i, &pVal);.    
1f930 20 20 7d 0a 20 20 20 20 20 20 73 65 73 73 69 6f    }.      sessio
1f940 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26 70 2d  nAppendValue(&p-
1f950 3e 72 65 62 61 73 65 2c 20 70 56 61 6c 2c 20 26  >rebase, pVal, &
1f960 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1f970 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f980 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1f990 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
1f9a0 20 66 6f 72 20 74 68 65 20 63 68 61 6e 67 65 20   for the change 
1f9b0 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73  that the changes
1f9c0 65 74 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63  et iterator.** c
1f9d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1f9e0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  to..**.** Argume
1f9f0 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20 62 65  nt eType must be
1fa00 20 65 69 74 68 65 72 20 43 48 41 4e 47 45 53 45   either CHANGESE
1fa10 54 5f 44 41 54 41 20 6f 72 20 43 48 41 4e 47 45  T_DATA or CHANGE
1fa20 53 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 0a 2a 2a  SET_CONFLICT..**
1fa30 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 62 52   If argument pbR
1fa40 65 70 6c 61 63 65 20 69 73 20 4e 55 4c 4c 2c 20  eplace is NULL, 
1fa50 74 68 65 6e 20 74 68 65 20 74 79 70 65 20 6f 66  then the type of
1fa60 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
1fa70 72 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 64 65 70  r invoked.** dep
1fa80 65 6e 64 73 20 73 6f 6c 65 6c 79 20 6f 6e 20 65  ends solely on e
1fa90 54 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  Type, as follows
1faa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 65 54 79 70 65  :.**.**    eType
1fab0 20 76 61 6c 75 65 20 20 20 20 20 20 20 20 20 20   value          
1fac0 20 20 20 20 20 20 20 56 61 6c 75 65 20 70 61 73         Value pas
1fad0 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74  sed to xConflict
1fae0 0a 2a 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**    ---------
1faf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb10 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 43  --------.**    C
1fb20 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 20 20  HANGESET_DATA   
1fb30 20 20 20 20 20 20 20 20 20 20 20 43 48 41 4e 47             CHANG
1fb40 45 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 0a 2a 2a  ESET_NOTFOUND.**
1fb50 20 20 20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f      CHANGESET_CO
1fb60 4e 46 4c 49 43 54 20 20 20 20 20 20 20 20 20 20  NFLICT          
1fb70 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
1fb80 41 49 4e 54 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  AINT.**.** Or, i
1fb90 66 20 70 62 52 65 70 6c 61 63 65 20 69 73 20 6e  f pbReplace is n
1fba0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6e  ot NULL, then an
1fbb0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1fbc0 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73   to find an exis
1fbd0 74 69 6e 67 0a 2a 2a 20 72 65 63 6f 72 64 20 77  ting.** record w
1fbe0 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69  ith the same pri
1fbf0 6d 61 72 79 20 6b 65 79 20 61 73 20 74 68 65 20  mary key as the 
1fc00 72 65 63 6f 72 64 20 61 62 6f 75 74 20 74 6f 20  record about to 
1fc10 62 65 20 64 65 6c 65 74 65 64 2c 20 75 70 64 61  be deleted, upda
1fc20 74 65 64 0a 2a 2a 20 6f 72 20 69 6e 73 65 72 74  ted.** or insert
1fc30 65 64 2e 20 49 66 20 73 75 63 68 20 61 20 72 65  ed. If such a re
1fc40 63 6f 72 64 20 63 61 6e 20 62 65 20 66 6f 75 6e  cord can be foun
1fc50 64 2c 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  d, it is availab
1fc60 6c 65 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69  le to the confli
1fc70 63 74 0a 2a 2a 20 68 61 6e 64 6c 65 72 20 61 73  ct.** handler as
1fc80 20 74 68 65 20 22 63 6f 6e 66 6c 69 63 74 69 6e   the "conflictin
1fc90 67 22 20 72 65 63 6f 72 64 2e 20 49 6e 20 74 68  g" record. In th
1fca0 69 73 20 63 61 73 65 20 74 68 65 20 74 79 70 65  is case the type
1fcb0 20 6f 66 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20   of conflict.** 
1fcc0 68 61 6e 64 6c 65 72 20 69 6e 76 6f 6b 65 64 20  handler invoked 
1fcd0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1fce0 2a 0a 2a 2a 20 20 20 20 65 54 79 70 65 20 76 61  *.**    eType va
1fcf0 6c 75 65 20 20 20 20 20 20 20 20 20 50 4b 20 52  lue         PK R
1fd00 65 63 6f 72 64 20 66 6f 75 6e 64 3f 20 20 20 56  ecord found?   V
1fd10 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 78  alue passed to x
1fd20 43 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 20 2d  Conflict.**    -
1fd30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1fd70 2a 2a 20 20 20 20 43 48 41 4e 47 45 53 45 54 5f  **    CHANGESET_
1fd80 44 41 54 41 20 20 20 20 20 20 59 65 73 20 20 20  DATA      Yes   
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 43 48 41               CHA
1fda0 4e 47 45 53 45 54 5f 44 41 54 41 0a 2a 2a 20 20  NGESET_DATA.**  
1fdb0 20 20 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41    CHANGESET_DATA
1fdc0 20 20 20 20 20 20 4e 6f 20 20 20 20 20 20 20 20        No        
1fdd0 20 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53           CHANGES
1fde0 45 54 5f 4e 4f 54 46 4f 55 4e 44 0a 2a 2a 20 20  ET_NOTFOUND.**  
1fdf0 20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46    CHANGESET_CONF
1fe00 4c 49 43 54 20 20 59 65 73 20 20 20 20 20 20 20  LICT  Yes       
1fe10 20 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53           CHANGES
1fe20 45 54 5f 43 4f 4e 46 4c 49 43 54 0a 2a 2a 20 20  ET_CONFLICT.**  
1fe30 20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46    CHANGESET_CONF
1fe40 4c 49 43 54 20 20 4e 6f 20 20 20 20 20 20 20 20  LICT  No        
1fe50 20 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53           CHANGES
1fe60 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a  ET_CONSTRAINT.**
1fe70 0a 2a 2a 20 49 66 20 70 62 52 65 70 6c 61 63 65  .** If pbReplace
1fe80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1fe90 64 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20  d a record with 
1fea0 61 20 6d 61 74 63 68 69 6e 67 20 50 4b 20 69 73  a matching PK is
1feb0 20 66 6f 75 6e 64 2c 20 61 6e 64 0a 2a 2a 20 74   found, and.** t
1fec0 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
1fed0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ler function ret
1fee0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e  urns SQLITE_CHAN
1fef0 47 45 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 2a  GESET_REPLACE, *
1ff00 70 62 52 65 70 6c 61 63 65 0a 2a 2a 20 69 73 20  pbReplace.** is 
1ff10 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20  set to non-zero 
1ff20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1ff30 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1ff40 2a 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  * If the conflic
1ff50 74 20 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e  t handler return
1ff60 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  s SQLITE_CHANGES
1ff70 45 54 5f 41 42 4f 52 54 2c 20 53 51 4c 49 54 45  ET_ABORT, SQLITE
1ff80 5f 41 42 4f 52 54 20 69 73 0a 2a 2a 20 72 65 74  _ABORT is.** ret
1ff90 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1ffa0 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
1ffb0 65 72 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  er returns an in
1ffc0 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 0a 2a 2a  valid value, .**
1ffd0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20   SQLITE_MISUSE. 
1ffe0 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  If the conflict 
1fff0 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20  handler returns 
20000 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
20010 5f 4f 4d 49 54 2c 0a 2a 2a 20 74 68 69 73 20 66  _OMIT,.** this f
20020 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20030 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
20040 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
20050 43 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28  ConflictHandler(
20060 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 2f 2a 20 45 69 74 68 65 72 20 43 48 41     /* Either CHA
20090 4e 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 43  NGESET_DATA or C
200a0 4f 4e 46 4c 49 43 54 20 2a 2f 0a 20 20 53 65 73  ONFLICT */.  Ses
200b0 73 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a 70 2c  sionApplyCtx *p,
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200d0 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
200e0 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  ) context */.  s
200f0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
20100 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f  _iter *pIter,  /
20110 2a 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72  * Changeset iter
20120 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ator */.  int(*x
20130 43 6f 6e 66 6c 69 63 74 29 28 76 6f 69 64 20 2a  Conflict)(void *
20140 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 63  , int, sqlite3_c
20150 68 61 6e 67 65 73 65 74 5f 69 74 65 72 2a 29 2c  hangeset_iter*),
20160 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
20190 6d 65 6e 74 20 66 6f 72 20 63 6f 6e 66 6c 69 63  ment for conflic
201a0 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  t handler */.  i
201b0 6e 74 20 2a 70 62 52 65 70 6c 61 63 65 20 20 20  nt *pbReplace   
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
201d0 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72  * OUT: Set to tr
201e0 75 65 20 69 66 20 50 4b 20 72 6f 77 20 69 73 20  ue if PK row is 
201f0 66 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  found */.){.  in
20200 74 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20  t res = 0;      
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20220 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
20230 62 79 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  by conflict hand
20240 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ler */.  int rc;
20250 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69  .  int nCol;.  i
20260 6e 74 20 6f 70 3b 0a 20 20 63 6f 6e 73 74 20 63  nt op;.  const c
20270 68 61 72 20 2a 7a 44 75 6d 6d 79 3b 0a 0a 20 20  har *zDummy;..  
20280 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
20290 5f 6f 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d  _op(pIter, &zDum
202a0 6d 79 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20  my, &nCol, &op, 
202b0 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  0);..  assert( e
202c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 43 48 41  Type==SQLITE_CHA
202d0 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20  NGESET_CONFLICT 
202e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
202f0 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
20300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
20310 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f  ITE_CHANGESET_CO
20320 4e 46 4c 49 43 54 2b 31 3d 3d 53 51 4c 49 54 45  NFLICT+1==SQLITE
20330 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54  _CHANGESET_CONST
20340 52 41 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72  RAINT );.  asser
20350 74 28 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  t( SQLITE_CHANGE
20360 53 45 54 5f 44 41 54 41 2b 31 3d 3d 53 51 4c 49  SET_DATA+1==SQLI
20370 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54  TE_CHANGESET_NOT
20380 46 4f 55 4e 44 20 29 3b 0a 0a 20 20 2f 2a 20 42  FOUND );..  /* B
20390 69 6e 64 20 74 68 65 20 6e 65 77 2e 2a 20 50 52  ind the new.* PR
203a0 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73  IMARY KEY values
203b0 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73   to the SELECT s
203c0 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  tatement. */.  i
203d0 66 28 20 70 62 52 65 70 6c 61 63 65 20 29 7b 0a  f( pbReplace ){.
203e0 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
203f0 53 65 65 6b 54 6f 52 6f 77 28 70 2d 3e 64 62 2c  SeekToRow(p->db,
20400 20 70 49 74 65 72 2c 20 70 2d 3e 61 62 50 4b 2c   pIter, p->abPK,
20410 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
20420 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
20430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
20440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20450 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 54  _ROW ){.    /* T
20460 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 6f 74  here exists anot
20470 68 65 72 20 72 6f 77 20 77 69 74 68 20 74 68 65  her row with the
20480 20 6e 65 77 2e 2a 20 70 72 69 6d 61 72 79 20 6b   new.* primary k
20490 65 79 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72  ey. */.    pIter
204a0 2d 3e 70 43 6f 6e 66 6c 69 63 74 20 3d 20 70 2d  ->pConflict = p-
204b0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 72 65  >pSelect;.    re
204c0 73 20 3d 20 78 43 6f 6e 66 6c 69 63 74 28 70 43  s = xConflict(pC
204d0 74 78 2c 20 65 54 79 70 65 2c 20 70 49 74 65 72  tx, eType, pIter
204e0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 43  );.    pIter->pC
204f0 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 20  onflict = 0;.   
20500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
20510 73 65 74 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  set(p->pSelect);
20520 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
20530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20540 20 20 69 66 28 20 70 2d 3e 62 44 65 66 65 72 43    if( p->bDeferC
20550 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 65 54  onstraints && eT
20560 79 70 65 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e  ype==SQLITE_CHAN
20570 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 29  GESET_CONFLICT )
20580 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 65  {.      /* Inste
20590 61 64 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74  ad of invoking t
205a0 68 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64  he conflict hand
205b0 6c 65 72 2c 20 61 70 70 65 6e 64 20 74 68 65 20  ler, append the 
205c0 63 68 61 6e 67 65 20 62 6c 6f 62 0a 20 20 20 20  change blob.    
205d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 53 65 73 73    ** to the Sess
205e0 69 6f 6e 41 70 70 6c 79 43 74 78 2e 63 6f 6e 73  ionApplyCtx.cons
205f0 74 72 61 69 6e 74 73 20 62 75 66 66 65 72 2e 20  traints buffer. 
20600 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 42 6c  */.      u8 *aBl
20610 6f 62 20 3d 20 26 70 49 74 65 72 2d 3e 69 6e 2e  ob = &pIter->in.
20620 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 6e 2e  aData[pIter->in.
20630 69 43 75 72 72 65 6e 74 5d 3b 0a 20 20 20 20 20  iCurrent];.     
20640 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 70 49 74   int nBlob = pIt
20650 65 72 2d 3e 69 6e 2e 69 4e 65 78 74 20 2d 20 70  er->in.iNext - p
20660 49 74 65 72 2d 3e 69 6e 2e 69 43 75 72 72 65 6e  Iter->in.iCurren
20670 74 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e  t;.      session
20680 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 63  AppendBlob(&p->c
20690 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 42 6c 6f  onstraints, aBlo
206a0 62 2c 20 6e 42 6c 6f 62 2c 20 26 72 63 29 3b 0a  b, nBlob, &rc);.
206b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
206c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
206d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f  e{.      /* No o
206e0 74 68 65 72 20 72 6f 77 20 77 69 74 68 20 74 68  ther row with th
206f0 65 20 6e 65 77 2e 2a 20 70 72 69 6d 61 72 79 20  e new.* primary 
20700 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  key. */.      re
20710 73 20 3d 20 78 43 6f 6e 66 6c 69 63 74 28 70 43  s = xConflict(pC
20720 74 78 2c 20 65 54 79 70 65 2b 31 2c 20 70 49 74  tx, eType+1, pIt
20730 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
20740 65 73 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e 47  es==SQLITE_CHANG
20750 45 53 45 54 5f 52 45 50 4c 41 43 45 20 29 20 72  ESET_REPLACE ) r
20760 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
20770 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
20780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20790 4b 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  K ){.    switch(
207a0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 63 61   res ){.      ca
207b0 73 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  se SQLITE_CHANGE
207c0 53 45 54 5f 52 45 50 4c 41 43 45 3a 0a 20 20 20  SET_REPLACE:.   
207d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 62 52       assert( pbR
207e0 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20  eplace );.      
207f0 20 20 2a 70 62 52 65 70 6c 61 63 65 20 3d 20 31    *pbReplace = 1
20800 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20810 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ..      case SQL
20820 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d  ITE_CHANGESET_OM
20830 49 54 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  IT:.        brea
20840 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53  k;..      case S
20850 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
20860 41 42 4f 52 54 3a 0a 20 20 20 20 20 20 20 20 72  ABORT:.        r
20870 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
20880 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20890 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
208a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
208b0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
208c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
208d0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
208e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
208f0 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 62   rc = sessionReb
20900 61 73 65 41 64 64 28 70 2c 20 72 65 73 2c 20 70  aseAdd(p, res, p
20910 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
20920 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20930 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
20940 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 68 61  to apply the cha
20950 6e 67 65 20 74 68 61 74 20 74 68 65 20 69 74 65  nge that the ite
20960 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
20970 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
20980 6e 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  nt.** currently 
20990 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 74 68 65  points to to the
209a0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
209b0 63 6f 6e 66 6c 69 63 74 20 69 73 20 65 6e 63 6f  conflict is enco
209c0 75 6e 74 65 72 65 64 2c 20 69 6e 76 6f 6b 65 0a  untered, invoke.
209d0 2a 2a 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ** the conflict 
209e0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
209f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
20a00 65 6e 74 20 70 62 52 65 74 72 79 20 69 73 20 4e  ent pbRetry is N
20a10 55 4c 4c 2c 20 74 68 65 6e 20 69 67 6e 6f 72 65  ULL, then ignore
20a20 20 61 6e 79 20 43 48 41 4e 47 45 53 45 54 5f 44   any CHANGESET_D
20a30 41 54 41 20 63 6f 6e 66 6c 69 63 74 2e 20 49 66  ATA conflict. If
20a40 0a 2a 2a 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75  .** one is encou
20a50 6e 74 65 72 65 64 2c 20 75 70 64 61 74 65 20 6f  ntered, update o
20a60 72 20 64 65 6c 65 74 65 20 74 68 65 20 72 6f 77  r delete the row
20a70 20 77 69 74 68 20 74 68 65 20 6d 61 74 63 68 69   with the matchi
20a80 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a  ng primary key.*
20a90 2a 20 69 6e 73 74 65 61 64 2e 20 4f 72 2c 20 69  * instead. Or, i
20aa0 66 20 70 62 52 65 74 72 79 20 69 73 20 6e 6f 74  f pbRetry is not
20ab0 20 4e 55 4c 4c 20 61 6e 64 20 61 20 43 48 41 4e   NULL and a CHAN
20ac0 47 45 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c  GESET_DATA confl
20ad0 69 63 74 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ict occurs,.** i
20ae0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6e 66 6c 69  nvoke the confli
20af0 63 74 20 68 61 6e 64 6c 65 72 2e 20 49 66 20 69  ct handler. If i
20b00 74 20 72 65 74 75 72 6e 73 20 43 48 41 4e 47 45  t returns CHANGE
20b10 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 73 65 74  SET_REPLACE, set
20b20 20 2a 70 62 52 65 74 72 79 0a 2a 2a 20 74 6f 20   *pbRetry.** to 
20b30 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  true before retu
20b40 72 6e 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63  rning. In this c
20b50 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ase the caller w
20b60 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
20b70 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 67 61 69  function.** agai
20b80 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74  n, this time wit
20b90 68 20 70 62 52 65 74 72 79 20 73 65 74 20 74 6f  h pbRetry set to
20ba0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
20bb0 61 72 67 75 6d 65 6e 74 20 70 62 52 65 70 6c 61  argument pbRepla
20bc0 63 65 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 61  ce is NULL and a
20bd0 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c   CHANGESET_CONFL
20be0 49 43 54 20 63 6f 6e 66 6c 69 63 74 20 69 73 20  ICT conflict is 
20bf0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  .** encountered 
20c00 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6e 66 6c  invoke the confl
20c10 69 63 74 20 68 61 6e 64 6c 65 72 20 77 69 74 68  ict handler with
20c20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54   CHANGESET_CONST
20c30 52 41 49 4e 54 20 69 6e 73 74 65 61 64 2e 0a 2a  RAINT instead..*
20c40 2a 20 4f 72 2c 20 69 66 20 70 62 52 65 70 6c 61  * Or, if pbRepla
20c50 63 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ce is not NULL, 
20c60 69 6e 76 6f 6b 65 20 69 74 20 77 69 74 68 20 43  invoke it with C
20c70 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43  HANGESET_CONFLIC
20c80 54 2e 20 49 66 20 73 75 63 68 0a 2a 2a 20 61 6e  T. If such.** an
20c90 20 69 6e 76 6f 63 61 74 69 6f 6e 20 72 65 74 75   invocation retu
20ca0 72 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  rns SQLITE_CHANG
20cb0 45 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 73 65  ESET_REPLACE, se
20cc0 74 20 2a 70 62 52 65 70 6c 61 63 65 20 74 6f 20  t *pbReplace to 
20cd0 74 72 75 65 0a 2a 2a 20 62 65 66 6f 72 65 20 72  true.** before r
20ce0 65 74 72 79 69 6e 67 2e 20 49 6e 20 74 68 69 73  etrying. In this
20cf0 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
20d00 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 6d   attempts to rem
20d10 6f 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  ove the conflict
20d20 69 6e 67 0a 2a 2a 20 72 6f 77 20 62 65 66 6f 72  ing.** row befor
20d30 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  e invoking this 
20d40 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2c 20  function again, 
20d50 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 70  this time with p
20d60 62 52 65 70 6c 61 63 65 20 73 65 74 20 0a 2a 2a  bReplace set .**
20d70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
20d80 49 66 20 61 6e 79 20 63 6f 6e 66 6c 69 63 74 20  If any conflict 
20d90 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20  handler returns 
20da0 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
20db0 5f 41 42 4f 52 54 2c 20 74 68 69 73 20 66 75 6e  _ABORT, this fun
20dc0 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
20dd0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 20 4f   SQLITE_ABORT. O
20de0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
20df0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
20e00 4c 49 54 45 5f 4f 4b 20 69 73 20 0a 2a 2a 20 72  LITE_OK is .** r
20e10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
20e20 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 41 70  ic int sessionAp
20e30 70 6c 79 4f 6e 65 4f 70 28 0a 20 20 73 71 6c 69  plyOneOp(.  sqli
20e40 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
20e50 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43  er *pIter,  /* C
20e60 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f  hangeset iterato
20e70 72 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 41 70  r */.  SessionAp
20e80 70 6c 79 43 74 78 20 2a 70 2c 20 20 20 20 20 20  plyCtx *p,      
20e90 20 20 20 20 20 20 20 2f 2a 20 63 68 61 6e 67 65         /* change
20ea0 73 65 74 5f 61 70 70 6c 79 28 29 20 63 6f 6e 74  set_apply() cont
20eb0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  ext */.  int(*xC
20ec0 6f 6e 66 6c 69 63 74 29 28 76 6f 69 64 20 2a 2c  onflict)(void *,
20ed0 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 63 68   int, sqlite3_ch
20ee0 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 29 2c  angeset_iter *),
20ef0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
20f20 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 63 6f 6e  ment for the con
20f30 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 2a 2f  flict handler */
20f40 0a 20 20 69 6e 74 20 2a 70 62 52 65 70 6c 61 63  .  int *pbReplac
20f50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20f60 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
20f70 74 6f 20 72 65 6d 6f 76 65 20 50 4b 20 72 6f 77  to remove PK row
20f80 20 61 6e 64 20 72 65 74 72 79 20 2a 2f 0a 20 20   and retry */.  
20f90 69 6e 74 20 2a 70 62 52 65 74 72 79 20 20 20 20  int *pbRetry    
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 74 6f 20  /* OUT: True to 
20fc0 72 65 74 72 79 2e 20 2a 2f 0a 29 7b 0a 20 20 63  retry. */.){.  c
20fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 75 6d 6d  onst char *zDumm
20fe0 79 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  y;.  int op;.  i
20ff0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72  nt nCol;.  int r
21000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21010 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 44 65    assert( p->pDe
21020 6c 65 74 65 20 26 26 20 70 2d 3e 70 55 70 64 61  lete && p->pUpda
21030 74 65 20 26 26 20 70 2d 3e 70 49 6e 73 65 72 74  te && p->pInsert
21040 20 26 26 20 70 2d 3e 70 53 65 6c 65 63 74 20 29   && p->pSelect )
21050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
21060 7a 43 6f 6c 20 26 26 20 70 2d 3e 61 62 50 4b 20  zCol && p->abPK 
21070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 62  );.  assert( !pb
21080 52 65 70 6c 61 63 65 20 7c 7c 20 2a 70 62 52 65  Replace || *pbRe
21090 70 6c 61 63 65 3d 3d 30 20 29 3b 0a 0a 20 20 73  place==0 );..  s
210a0 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
210b0 6f 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d 6d  op(pIter, &zDumm
210c0 79 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20 30  y, &nCol, &op, 0
210d0 29 3b 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51  );..  if( op==SQ
210e0 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a 0a  LITE_DELETE ){..
210f0 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75      /* Bind valu
21100 65 73 20 74 6f 20 74 68 65 20 44 45 4c 45 54 45  es to the DELETE
21110 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 63   statement. If c
21120 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 69 6e 67  onflict handling
21130 20 69 73 20 72 65 71 75 69 72 65 64 2c 0a 20 20   is required,.  
21140 20 20 2a 2a 20 62 69 6e 64 20 76 61 6c 75 65 73    ** bind values
21150 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
21160 20 61 6e 64 20 73 65 74 20 62 6f 75 6e 64 20 76   and set bound v
21170 61 72 69 61 62 6c 65 20 28 6e 43 6f 6c 2b 31 29  ariable (nCol+1)
21180 20 74 6f 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a   to true..    **
21190 20 4f 72 2c 20 69 66 20 63 6f 6e 66 6c 69 63 74   Or, if conflict
211a0 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 6e 6f 74   handling is not
211b0 20 72 65 71 75 69 72 65 64 2c 20 62 69 6e 64 20   required, bind 
211c0 6a 75 73 74 20 74 68 65 20 50 4b 20 63 6f 6c 75  just the PK colu
211d0 6d 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  mn.    ** values
211e0 20 61 6e 64 2c 20 69 66 20 69 74 20 65 78 69 73   and, if it exis
211f0 74 73 2c 20 73 65 74 20 28 6e 43 6f 6c 2b 31 29  ts, set (nCol+1)
21200 20 74 6f 20 66 61 6c 73 65 2e 20 43 6f 6e 66 6c   to false. Confl
21210 69 63 74 20 68 61 6e 64 6c 69 6e 67 0a 20 20 20  ict handling.   
21220 20 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69   ** is not requi
21230 72 65 64 20 69 66 3a 0a 20 20 20 20 2a 2a 0a 20  red if:.    **. 
21240 20 20 20 2a 2a 20 20 20 2a 20 74 68 69 73 20 69     **   * this i
21250 73 20 61 20 70 61 74 63 68 73 65 74 2c 20 6f 72  s a patchset, or
21260 0a 20 20 20 20 2a 2a 20 20 20 2a 20 28 70 62 52  .    **   * (pbR
21270 65 74 72 79 3d 3d 30 29 2c 20 6f 72 0a 20 20 20  etry==0), or.   
21280 20 2a 2a 20 20 20 2a 20 61 6c 6c 20 63 6f 6c 75   **   * all colu
21290 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
212a0 20 61 72 65 20 50 4b 20 63 6f 6c 75 6d 6e 73 20   are PK columns 
212b0 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68  (in this case th
212c0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 20 20  ere is.    **   
212d0 20 20 6e 6f 20 28 6e 43 6f 6c 2b 31 29 20 76 61    no (nCol+1) va
212e0 72 69 61 62 6c 65 20 74 6f 20 62 69 6e 64 20 74  riable to bind t
212f0 6f 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  o)..    */.    u
21300 38 20 2a 61 62 50 4b 20 3d 20 28 70 49 74 65 72  8 *abPK = (pIter
21310 2d 3e 62 50 61 74 63 68 73 65 74 20 3f 20 70 2d  ->bPatchset ? p-
21320 3e 61 62 50 4b 20 3a 20 30 29 3b 0a 20 20 20 20  >abPK : 0);.    
21330 72 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64  rc = sessionBind
21340 52 6f 77 28 70 49 74 65 72 2c 20 73 71 6c 69 74  Row(pIter, sqlit
21350 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 2c  e3changeset_old,
21360 20 6e 43 6f 6c 2c 20 61 62 50 4b 2c 20 70 2d 3e   nCol, abPK, p->
21370 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 69 66  pDelete);.    if
21380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21390 26 26 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  && sqlite3_bind_
213a0 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
213b0 70 2d 3e 70 44 65 6c 65 74 65 29 3e 6e 43 6f 6c  p->pDelete)>nCol
213c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
213d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
213e0 70 2d 3e 70 44 65 6c 65 74 65 2c 20 6e 43 6f 6c  p->pDelete, nCol
213f0 2b 31 2c 20 28 70 62 52 65 74 72 79 3d 3d 30 20  +1, (pbRetry==0 
21400 7c 7c 20 61 62 50 4b 29 29 3b 0a 20 20 20 20 7d  || abPK));.    }
21410 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21420 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21430 72 63 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rc;..    sqlite3
21440 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65  _step(p->pDelete
21450 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
21460 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
21470 6c 65 74 65 29 3b 0a 20 20 20 20 69 66 28 20 72  lete);.    if( r
21480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21490 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
214a0 70 2d 3e 64 62 29 3d 3d 30 20 29 7b 0a 20 20 20  p->db)==0 ){.   
214b0 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
214c0 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a  onflictHandler(.
214d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
214e0 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 2c  _CHANGESET_DATA,
214f0 20 70 2c 20 70 49 74 65 72 2c 20 78 43 6f 6e 66   p, pIter, xConf
21500 6c 69 63 74 2c 20 70 43 74 78 2c 20 70 62 52 65  lict, pCtx, pbRe
21510 74 72 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  try.      );.   
21520 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 26 30   }else if( (rc&0
21530 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
21540 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
21550 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 6f 6e   rc = sessionCon
21560 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a 20 20  flictHandler(.  
21570 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43          SQLITE_C
21580 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43  HANGESET_CONFLIC
21590 54 2c 20 70 2c 20 70 49 74 65 72 2c 20 78 43 6f  T, p, pIter, xCo
215a0 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c 20 30 0a  nflict, pCtx, 0.
215b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
215c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
215d0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
215e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
215f0 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
21600 74 6f 20 74 68 65 20 55 50 44 41 54 45 20 73 74  to the UPDATE st
21610 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  atement. */.    
21620 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
21630 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f 6c  ITE_OK && i<nCol
21640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
21650 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4f 6c  lite3_value *pOl
21660 64 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  d = sessionChang
21670 65 73 65 74 4f 6c 64 28 70 49 74 65 72 2c 20 69  esetOld(pIter, i
21680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21690 5f 76 61 6c 75 65 20 2a 70 4e 65 77 20 3d 20 73  _value *pNew = s
216a0 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e  essionChangesetN
216b0 65 77 28 70 49 74 65 72 2c 20 69 29 3b 0a 0a 20  ew(pIter, i);.. 
216c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
216d0 64 5f 69 6e 74 28 70 2d 3e 70 55 70 64 61 74 65  d_int(p->pUpdate
216e0 2c 20 69 2a 33 2b 32 2c 20 21 21 70 4e 65 77 29  , i*3+2, !!pNew)
216f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64  ;.      if( pOld
21700 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21710 20 73 65 73 73 69 6f 6e 42 69 6e 64 56 61 6c 75   sessionBindValu
21720 65 28 70 2d 3e 70 55 70 64 61 74 65 2c 20 69 2a  e(p->pUpdate, i*
21730 33 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  3+1, pOld);.    
21740 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
21750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21760 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
21770 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64 56  c = sessionBindV
21780 61 6c 75 65 28 70 2d 3e 70 55 70 64 61 74 65 2c  alue(p->pUpdate,
21790 20 69 2a 33 2b 33 2c 20 70 4e 65 77 29 3b 0a 20   i*3+3, pNew);. 
217a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
217b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
217c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
217d0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
217e0 70 55 70 64 61 74 65 2c 20 6e 43 6f 6c 2a 33 2b  pUpdate, nCol*3+
217f0 31 2c 20 70 62 52 65 74 72 79 3d 3d 30 20 7c 7c  1, pbRetry==0 ||
21800 20 70 49 74 65 72 2d 3e 62 50 61 74 63 68 73 65   pIter->bPatchse
21810 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
21820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
21840 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 68 65    /* Attempt the
21850 20 55 50 44 41 54 45 2e 20 49 6e 20 74 68 65 20   UPDATE. In the 
21860 63 61 73 65 20 6f 66 20 61 20 4e 4f 54 46 4f 55  case of a NOTFOU
21870 4e 44 20 6f 72 20 44 41 54 41 20 63 6f 6e 66 6c  ND or DATA confl
21880 69 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ict,.    ** the 
21890 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 53  result will be S
218a0 51 4c 49 54 45 5f 4f 4b 20 77 69 74 68 20 30 20  QLITE_OK with 0 
218b0 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 2a  rows modified. *
218c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
218d0 65 70 28 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  ep(p->pUpdate);.
218e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
218f0 5f 72 65 73 65 74 28 70 2d 3e 70 55 70 64 61 74  _reset(p->pUpdat
21900 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  e);..    if( rc=
21910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
21920 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 2d  lite3_changes(p-
21930 3e 64 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >db)==0 ){.     
21940 20 2f 2a 20 41 20 4e 4f 54 46 4f 55 4e 44 20 6f   /* A NOTFOUND o
21950 72 20 44 41 54 41 20 65 72 72 6f 72 2e 20 53 65  r DATA error. Se
21960 61 72 63 68 20 74 68 65 20 74 61 62 6c 65 20 74  arch the table t
21970 6f 20 73 65 65 20 69 66 20 69 74 20 63 6f 6e 74  o see if it cont
21980 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ains.      ** a 
21990 72 6f 77 20 77 69 74 68 20 61 20 6d 61 74 63 68  row with a match
219a0 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  ing primary key.
219b0 20 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20   If so, this is 
219c0 61 20 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 2e  a DATA conflict.
219d0 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
219e0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
219f0 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79 20   no primary key 
21a00 6d 61 74 63 68 2c 20 69 74 20 69 73 20 61 20 4e  match, it is a N
21a10 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 0a 20 20 20  OTFOUND. */..   
21a20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
21a30 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a  onflictHandler(.
21a40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21a50 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 2c  _CHANGESET_DATA,
21a60 20 70 2c 20 70 49 74 65 72 2c 20 78 43 6f 6e 66   p, pIter, xConf
21a70 6c 69 63 74 2c 20 70 43 74 78 2c 20 70 62 52 65  lict, pCtx, pbRe
21a80 74 72 79 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  try.      );..  
21a90 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 26    }else if( (rc&
21aa0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
21ab0 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
21ac0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6c 77    /* This is alw
21ad0 61 79 73 20 61 20 43 4f 4e 53 54 52 41 49 4e 54  ays a CONSTRAINT
21ae0 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20   conflict. */.  
21af0 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
21b00 43 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28  ConflictHandler(
21b10 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
21b20 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46  E_CHANGESET_CONF
21b30 4c 49 43 54 2c 20 70 2c 20 70 49 74 65 72 2c 20  LICT, p, pIter, 
21b40 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c  xConflict, pCtx,
21b50 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
21b60 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
21b70 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
21b80 54 45 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20  TE_INSERT );.   
21b90 20 69 66 28 20 70 2d 3e 62 53 74 61 74 31 20 29   if( p->bStat1 )
21ba0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  {.      /* Check
21bb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
21bc0 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 2e 20  onflicting row. 
21bd0 46 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 31  For sqlite_stat1
21be0 2c 20 74 68 69 73 20 6e 65 65 64 73 0a 20 20 20  , this needs.   
21bf0 20 20 20 2a 2a 20 74 6f 20 62 65 20 64 6f 6e 65     ** to be done
21c00 20 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54 2c   using a SELECT,
21c10 20 61 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20   as there is no 
21c20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 20 74  PRIMARY KEY in t
21c30 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  he .      ** dat
21c40 61 62 61 73 65 20 73 63 68 65 6d 61 20 74 6f 20  abase schema to 
21c50 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70 74 69  throw an excepti
21c60 6f 6e 20 69 66 20 61 20 64 75 70 6c 69 63 61 74  on if a duplicat
21c70 65 20 69 73 20 69 6e 73 65 72 74 65 64 2e 20 20  e is inserted.  
21c80 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  */.      rc = se
21c90 73 73 69 6f 6e 53 65 65 6b 54 6f 52 6f 77 28 70  ssionSeekToRow(p
21ca0 2d 3e 64 62 2c 20 70 49 74 65 72 2c 20 70 2d 3e  ->db, pIter, p->
21cb0 61 62 50 4b 2c 20 70 2d 3e 70 53 65 6c 65 63 74  abPK, p->pSelect
21cc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21cd0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
21ce0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21cf0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
21d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
21d10 65 73 65 74 28 70 2d 3e 70 53 65 6c 65 63 74 29  eset(p->pSelect)
21d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21d30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21d40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21d50 72 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64  rc = sessionBind
21d60 52 6f 77 28 70 49 74 65 72 2c 20 73 71 6c 69 74  Row(pIter, sqlit
21d70 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 2c  e3changeset_new,
21d80 20 6e 43 6f 6c 2c 20 30 2c 20 70 2d 3e 70 49 6e   nCol, 0, p->pIn
21d90 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28  sert);.      if(
21da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
21dc0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
21dd0 70 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  p->pInsert);.   
21de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
21df0 72 65 73 65 74 28 70 2d 3e 70 49 6e 73 65 72 74  reset(p->pInsert
21e00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
21e10 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
21e20 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
21e30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 73  {.      rc = ses
21e40 73 69 6f 6e 43 6f 6e 66 6c 69 63 74 48 61 6e 64  sionConflictHand
21e50 6c 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 53  ler(.          S
21e60 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
21e70 43 4f 4e 46 4c 49 43 54 2c 20 70 2c 20 70 49 74  CONFLICT, p, pIt
21e80 65 72 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70  er, xConflict, p
21e90 43 74 78 2c 20 70 62 52 65 70 6c 61 63 65 0a 20  Ctx, pbReplace. 
21ea0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
21eb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
21ed0 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 68   to apply the ch
21ee0 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 69 74  ange that the it
21ef0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
21f00 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
21f10 65 6e 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ent.** currently
21f20 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 74 68   points to to th
21f30 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
21f40 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 65 6e 63   conflict is enc
21f50 6f 75 6e 74 65 72 65 64 2c 20 69 6e 76 6f 6b 65  ountered, invoke
21f60 0a 2a 2a 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  .** the conflict
21f70 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
21f80 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  k..**.** The dif
21f90 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
21fb0 64 20 73 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e  d sessionApplyOn
21fc0 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
21fd0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e  .** function han
21fe0 64 6c 65 73 20 74 68 65 20 63 61 73 65 20 77 68  dles the case wh
21ff0 65 72 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  ere the conflict
22000 2d 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f  -handler is invo
22010 6b 65 64 20 61 6e 64 20 0a 2a 2a 20 72 65 74 75  ked and .** retu
22020 72 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  rns SQLITE_CHANG
22030 45 53 45 54 5f 52 45 50 4c 41 43 45 20 2d 20 69  ESET_REPLACE - i
22040 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
22050 68 65 20 63 68 61 6e 67 65 20 73 68 6f 75 6c 64  he change should
22060 20 62 65 0a 2a 2a 20 72 65 74 72 69 65 64 20 69   be.** retried i
22070 6e 20 73 6f 6d 65 20 6d 61 6e 6e 65 72 2e 0a 2a  n some manner..*
22080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
22090 73 69 6f 6e 41 70 70 6c 79 4f 6e 65 57 69 74 68  sionApplyOneWith
220a0 52 65 74 72 79 28 0a 20 20 73 71 6c 69 74 65 33  Retry(.  sqlite3
220b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
220c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c           /* Appl
220d0 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69  y change to "mai
220e0 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61  n" db of this ha
220f0 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
22100 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
22110 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61   *pIter,  /* Cha
22120 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20  ngeset iterator 
22130 74 6f 20 72 65 61 64 20 63 68 61 6e 67 65 20 66  to read change f
22140 72 6f 6d 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e  rom */.  Session
22150 41 70 70 6c 79 43 74 78 20 2a 70 41 70 70 6c 79  ApplyCtx *pApply
22160 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c  ,        /* Appl
22170 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  y context */.  i
22180 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 76  nt(*xConflict)(v
22190 6f 69 64 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74  oid*, int, sqlit
221a0 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
221b0 72 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74  r*),.  void *pCt
221c0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
221d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
221e0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
221f0 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a  to xConflict */.
22200 29 7b 0a 20 20 69 6e 74 20 62 52 65 70 6c 61 63  ){.  int bReplac
22210 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 52 65  e = 0;.  int bRe
22220 74 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  try = 0;.  int r
22230 63 3b 0a 0a 20 20 72 63 20 3d 20 73 65 73 73 69  c;..  rc = sessi
22240 6f 6e 41 70 70 6c 79 4f 6e 65 4f 70 28 70 49 74  onApplyOneOp(pIt
22250 65 72 2c 20 70 41 70 70 6c 79 2c 20 78 43 6f 6e  er, pApply, xCon
22260 66 6c 69 63 74 2c 20 70 43 74 78 2c 20 26 62 52  flict, pCtx, &bR
22270 65 70 6c 61 63 65 2c 20 26 62 52 65 74 72 79 29  eplace, &bRetry)
22280 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
222a0 49 66 20 74 68 65 20 62 52 65 74 72 79 20 66 6c  If the bRetry fl
222b0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  ag is set, the c
222c0 68 61 6e 67 65 20 68 61 73 20 6e 6f 74 20 62 65  hange has not be
222d0 65 6e 20 61 70 70 6c 69 65 64 20 64 75 65 20 74  en applied due t
222e0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  o an.    ** SQLI
222f0 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54  TE_CHANGESET_DAT
22300 41 20 70 72 6f 62 6c 65 6d 20 28 69 2e 65 2e 20  A problem (i.e. 
22310 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
22320 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 0a  E or DELETE and.
22330 20 20 20 20 2a 2a 20 61 20 72 6f 77 20 77 69 74      ** a row wit
22340 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 50 4b  h the correct PK
22350 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
22360 68 65 20 64 62 2c 20 62 75 74 20 6f 6e 65 20 6f  he db, but one o
22370 72 20 6d 6f 72 65 20 6f 74 68 65 72 0a 20 20 20  r more other.   
22380 20 2a 2a 20 66 69 65 6c 64 73 20 64 6f 20 6e 6f   ** fields do no
22390 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 65 78  t contain the ex
223a0 70 65 63 74 65 64 20 76 61 6c 75 65 73 29 20 61  pected values) a
223b0 6e 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  nd the conflict 
223c0 68 61 6e 64 6c 65 72 20 0a 20 20 20 20 2a 2a 20  handler .    ** 
223d0 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
223e0 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43  CHANGESET_REPLAC
223f0 45 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  E. In this case 
22400 72 65 74 72 79 20 74 68 65 20 6f 70 65 72 61 74  retry the operat
22410 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ion,.    ** but 
22420 70 61 73 73 20 4e 55 4c 4c 20 61 73 20 74 68 65  pass NULL as the
22430 20 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20   final argument 
22440 73 6f 20 74 68 61 74 20 73 65 73 73 69 6f 6e 41  so that sessionA
22450 70 70 6c 79 4f 6e 65 4f 70 28 29 20 69 67 6e 6f  pplyOneOp() igno
22460 72 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  res.    ** the S
22470 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
22480 44 41 54 41 20 70 72 6f 62 6c 65 6d 2e 20 20 2a  DATA problem.  *
22490 2f 0a 20 20 20 20 69 66 28 20 62 52 65 74 72 79  /.    if( bRetry
224a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
224b0 28 20 70 49 74 65 72 2d 3e 6f 70 3d 3d 53 51 4c  ( pIter->op==SQL
224c0 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 70 49  ITE_UPDATE || pI
224d0 74 65 72 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  ter->op==SQLITE_
224e0 44 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 20 20  DELETE );.      
224f0 72 63 20 3d 20 73 65 73 73 69 6f 6e 41 70 70 6c  rc = sessionAppl
22500 79 4f 6e 65 4f 70 28 70 49 74 65 72 2c 20 70 41  yOneOp(pIter, pA
22510 70 70 6c 79 2c 20 78 43 6f 6e 66 6c 69 63 74 2c  pply, xConflict,
22520 20 70 43 74 78 2c 20 30 2c 20 30 29 3b 0a 20 20   pCtx, 0, 0);.  
22530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
22540 68 65 20 62 52 65 70 6c 61 63 65 20 66 6c 61 67  he bReplace flag
22550 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 68 61   is set, the cha
22560 6e 67 65 20 69 73 20 61 6e 20 49 4e 53 45 52 54  nge is an INSERT
22570 20 74 68 61 74 20 68 61 73 20 6e 6f 74 0a 20 20   that has not.  
22580 20 20 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72    ** been perfor
22590 6d 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20  med because the 
225a0 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
225b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20   contains a row 
225c0 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
225d0 73 70 65 63 69 66 69 65 64 20 70 72 69 6d 61 72  specified primar
225e0 79 20 6b 65 79 20 61 6e 64 20 74 68 65 20 63 6f  y key and the co
225f0 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 72  nflict handler r
22600 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 53  eturned.    ** S
22610 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
22620 52 45 50 4c 41 43 45 2e 20 49 6e 20 74 68 69 73  REPLACE. In this
22630 20 63 61 73 65 20 72 65 6d 6f 76 65 20 74 68 65   case remove the
22640 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
22650 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72  .    ** before r
22660 65 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20  eattempting the 
22670 49 4e 53 45 52 54 2e 20 20 2a 2f 0a 20 20 20 20  INSERT.  */.    
22680 65 6c 73 65 20 69 66 28 20 62 52 65 70 6c 61 63  else if( bReplac
22690 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
226a0 74 28 20 70 49 74 65 72 2d 3e 6f 70 3d 3d 53 51  t( pIter->op==SQ
226b0 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 3b 0a 20  LITE_INSERT );. 
226c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
226d0 33 5f 65 78 65 63 28 64 62 2c 20 22 53 41 56 45  3_exec(db, "SAVE
226e0 50 4f 49 4e 54 20 72 65 70 6c 61 63 65 5f 6f 70  POINT replace_op
226f0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
22700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22720 72 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64  rc = sessionBind
22730 52 6f 77 28 70 49 74 65 72 2c 20 0a 20 20 20 20  Row(pIter, .    
22740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63          sqlite3c
22750 68 61 6e 67 65 73 65 74 5f 6e 65 77 2c 20 70 41  hangeset_new, pA
22760 70 70 6c 79 2d 3e 6e 43 6f 6c 2c 20 70 41 70 70  pply->nCol, pApp
22770 6c 79 2d 3e 61 62 50 4b 2c 20 70 41 70 70 6c 79  ly->abPK, pApply
22780 2d 3e 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  ->pDelete);.    
22790 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
227a0 5f 69 6e 74 28 70 41 70 70 6c 79 2d 3e 70 44 65  _int(pApply->pDe
227b0 6c 65 74 65 2c 20 70 41 70 70 6c 79 2d 3e 6e 43  lete, pApply->nC
227c0 6f 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  ol+1, 1);.      
227d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
227e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
227f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
22800 70 28 70 41 70 70 6c 79 2d 3e 70 44 65 6c 65 74  p(pApply->pDelet
22810 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
22820 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
22830 41 70 70 6c 79 2d 3e 70 44 65 6c 65 74 65 29 3b  Apply->pDelete);
22840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22870 20 73 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e 65   sessionApplyOne
22880 4f 70 28 70 49 74 65 72 2c 20 70 41 70 70 6c 79  Op(pIter, pApply
22890 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74  , xConflict, pCt
228a0 78 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  x, 0, 0);.      
228b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
228c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
228d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
228e0 33 5f 65 78 65 63 28 64 62 2c 20 22 52 45 4c 45  3_exec(db, "RELE
228f0 41 53 45 20 72 65 70 6c 61 63 65 5f 6f 70 22 2c  ASE replace_op",
22900 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
22910 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22930 0a 2a 2a 20 52 65 74 72 79 20 74 68 65 20 63 68  .** Retry the ch
22940 61 6e 67 65 73 20 61 63 63 75 6d 75 6c 61 74 65  anges accumulate
22950 64 20 69 6e 20 74 68 65 20 70 41 70 70 6c 79 2d  d in the pApply-
22960 3e 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 66  >constraints buf
22970 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
22980 6e 74 20 73 65 73 73 69 6f 6e 52 65 74 72 79 43  nt sessionRetryC
22990 6f 6e 73 74 72 61 69 6e 74 73 28 0a 20 20 73 71  onstraints(.  sq
229a0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
229b0 74 20 62 50 61 74 63 68 73 65 74 2c 0a 20 20 63  t bPatchset,.  c
229c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
229d0 0a 20 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43  .  SessionApplyC
229e0 74 78 20 2a 70 41 70 70 6c 79 2c 0a 20 20 69 6e  tx *pApply,.  in
229f0 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 76 6f  t(*xConflict)(vo
22a00 69 64 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65  id*, int, sqlite
22a10 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
22a20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  *),.  void *pCtx
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
22a50 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
22a60 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29  o xConflict */.)
22a70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22a80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 77 68 69 6c 65  ITE_OK;..  while
22a90 28 20 70 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72  ( pApply->constr
22aa0 61 69 6e 74 73 2e 6e 42 75 66 20 29 7b 0a 20 20  aints.nBuf ){.  
22ab0 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
22ac0 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 32  set_iter *pIter2
22ad0 20 3d 20 30 3b 0a 20 20 20 20 53 65 73 73 69 6f   = 0;.    Sessio
22ae0 6e 42 75 66 66 65 72 20 63 6f 6e 73 20 3d 20 70  nBuffer cons = p
22af0 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69 6e  Apply->constrain
22b00 74 73 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ts;.    memset(&
22b10 70 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69  pApply->constrai
22b20 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nts, 0, sizeof(S
22b30 65 73 73 69 6f 6e 42 75 66 66 65 72 29 29 3b 0a  essionBuffer));.
22b40 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f  .    rc = sessio
22b50 6e 43 68 61 6e 67 65 73 65 74 53 74 61 72 74 28  nChangesetStart(
22b60 26 70 49 74 65 72 32 2c 20 30 2c 20 30 2c 20 63  &pIter2, 0, 0, c
22b70 6f 6e 73 2e 6e 42 75 66 2c 20 63 6f 6e 73 2e 61  ons.nBuf, cons.a
22b80 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Buf, 0);.    if(
22b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22ba0 7b 0a 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6e  {.      size_t n
22bb0 42 79 74 65 20 3d 20 32 2a 70 41 70 70 6c 79 2d  Byte = 2*pApply-
22bc0 3e 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 73 71 6c  >nCol*sizeof(sql
22bd0 69 74 65 33 5f 76 61 6c 75 65 2a 29 3b 0a 20 20  ite3_value*);.  
22be0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
22bf0 20 20 20 70 49 74 65 72 32 2d 3e 62 50 61 74 63     pIter2->bPatc
22c00 68 73 65 74 20 3d 20 62 50 61 74 63 68 73 65 74  hset = bPatchset
22c10 3b 0a 20 20 20 20 20 20 70 49 74 65 72 32 2d 3e  ;.      pIter2->
22c20 7a 54 61 62 20 3d 20 28 63 68 61 72 2a 29 7a 54  zTab = (char*)zT
22c30 61 62 3b 0a 20 20 20 20 20 20 70 49 74 65 72 32  ab;.      pIter2
22c40 2d 3e 6e 43 6f 6c 20 3d 20 70 41 70 70 6c 79 2d  ->nCol = pApply-
22c50 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 74  >nCol;.      pIt
22c60 65 72 32 2d 3e 61 62 50 4b 20 3d 20 70 41 70 70  er2->abPK = pApp
22c70 6c 79 2d 3e 61 62 50 4b 3b 0a 20 20 20 20 20 20  ly->abPK;.      
22c80 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47 72 6f  sessionBufferGro
22c90 77 28 26 70 49 74 65 72 32 2d 3e 74 62 6c 68 64  w(&pIter2->tblhd
22ca0 72 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  r, nByte, &rc);.
22cb0 20 20 20 20 20 20 70 49 74 65 72 32 2d 3e 61 70        pIter2->ap
22cc0 56 61 6c 75 65 20 3d 20 28 73 71 6c 69 74 65 33  Value = (sqlite3
22cd0 5f 76 61 6c 75 65 2a 2a 29 70 49 74 65 72 32 2d  _value**)pIter2-
22ce0 3e 74 62 6c 68 64 72 2e 61 42 75 66 3b 0a 20 20  >tblhdr.aBuf;.  
22cf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22d00 54 45 5f 4f 4b 20 29 20 6d 65 6d 73 65 74 28 70  TE_OK ) memset(p
22d10 49 74 65 72 32 2d 3e 61 70 56 61 6c 75 65 2c 20  Iter2->apValue, 
22d20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  0, nByte);..    
22d30 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
22d40 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
22d50 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 63 68 61  _ROW==sqlite3cha
22d60 6e 67 65 73 65 74 5f 6e 65 78 74 28 70 49 74 65  ngeset_next(pIte
22d70 72 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  r2) ){.        r
22d80 63 20 3d 20 73 65 73 73 69 6f 6e 41 70 70 6c 79  c = sessionApply
22d90 4f 6e 65 57 69 74 68 52 65 74 72 79 28 64 62 2c  OneWithRetry(db,
22da0 20 70 49 74 65 72 32 2c 20 70 41 70 70 6c 79 2c   pIter2, pApply,
22db0 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78   xConflict, pCtx
22dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
22dd0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 63    rc2 = sqlite3c
22de0 68 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a  hangeset_finaliz
22df0 65 28 70 49 74 65 72 32 29 3b 0a 20 20 20 20 20  e(pIter2);.     
22e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22e10 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
22e20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22e30 20 70 41 70 70 6c 79 2d 3e 62 44 65 66 65 72 43   pApply->bDeferC
22e40 6f 6e 73 74 72 61 69 6e 74 73 20 7c 7c 20 70 41  onstraints || pA
22e50 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  pply->constraint
22e60 73 2e 6e 42 75 66 3d 3d 30 20 29 3b 0a 0a 20 20  s.nBuf==0 );..  
22e70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
22e80 6f 6e 73 2e 61 42 75 66 29 3b 0a 20 20 20 20 69  ons.aBuf);.    i
22e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22ea0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
22eb0 28 20 70 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72  ( pApply->constr
22ec0 61 69 6e 74 73 2e 6e 42 75 66 3e 3d 63 6f 6e 73  aints.nBuf>=cons
22ed0 2e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 2f  .nBuf ){.      /
22ee0 2a 20 4e 6f 20 70 72 6f 67 72 65 73 73 20 77 61  * No progress wa
22ef0 73 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 6c 61  s made on the la
22f00 73 74 20 72 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  st round. */.   
22f10 20 20 20 70 41 70 70 6c 79 2d 3e 62 44 65 66 65     pApply->bDefe
22f20 72 43 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 30  rConstraints = 0
22f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
22f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22f50 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 74 65  ** Argument pIte
22f60 72 20 69 73 20 61 20 63 68 61 6e 67 65 73 65 74  r is a changeset
22f70 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 68   iterator that h
22f80 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
22f90 7a 65 64 2c 20 62 75 74 0a 2a 2a 20 6e 6f 74 20  zed, but.** not 
22fa0 79 65 74 20 70 61 73 73 65 64 20 74 6f 20 73 71  yet passed to sq
22fb0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
22fc0 65 78 74 28 29 2e 20 54 68 69 73 20 66 75 6e 63  ext(). This func
22fd0 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 68 65  tion applies the
22fe0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 20 74   .** changeset t
22ff0 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
23000 61 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  ase attached to 
23010 68 61 6e 64 6c 65 20 22 64 62 22 2e 20 54 68 65  handle "db". The
23020 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 63 6f 6e   supplied.** con
23030 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61  flict handler ca
23040 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
23050 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 61 6e 79  d to resolve any
23060 20 63 6f 6e 66 6c 69 63 74 73 20 65 6e 63 6f 75   conflicts encou
23070 6e 74 65 72 65 64 0a 2a 2a 20 77 68 69 6c 65 20  ntered.** while 
23080 61 70 70 6c 79 69 6e 67 20 74 68 65 20 63 68 61  applying the cha
23090 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
230a0 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65  nt sessionChange
230b0 73 65 74 41 70 70 6c 79 28 0a 20 20 73 71 6c 69  setApply(.  sqli
230c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
230e0 70 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22  pply change to "
230f0 6d 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73  main" db of this
23100 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
23110 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
23120 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20  ter *pIter,  /* 
23130 43 68 61 6e 67 65 73 65 74 20 74 6f 20 61 70 70  Changeset to app
23140 6c 79 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69  ly */.  int(*xFi
23150 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20  lter)(.    void 
23160 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
23170 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
23180 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f   of sixth arg to
23190 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20   _apply() */.   
231a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
231b0 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b              /
231c0 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
231d0 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e    ),.  int(*xCon
231e0 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64  flict)(.    void
231f0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
23200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
23210 79 20 6f 66 20 66 69 66 74 68 20 61 72 67 20 74  y of fifth arg t
23220 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
23230 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c    int eConflict,
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47  /* DATA, MISSING
23260 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53  , CONFLICT, CONS
23270 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71  TRAINT */.    sq
23280 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
23290 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48  iter *p     /* H
232a0 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67  andle describing
232b0 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66   change and conf
232c0 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76  lict */.  ),.  v
232d0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
232f0 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
23300 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66   passed to xConf
23310 6c 69 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  lict */.  void *
23320 2a 70 70 52 65 62 61 73 65 2c 20 69 6e 74 20 2a  *ppRebase, int *
23330 70 6e 52 65 62 61 73 65 2c 20 2f 2a 20 4f 55 54  pnRebase, /* OUT
23340 3a 20 52 65 62 61 73 65 20 69 6e 66 6f 72 6d 61  : Rebase informa
23350 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  tion */.  int fl
23360 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
23370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 53            /* SES
23380 53 49 4f 4e 5f 41 50 50 4c 59 5f 58 58 58 20 66  SION_APPLY_XXX f
23390 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
233a0 20 73 63 68 65 6d 61 4d 69 73 6d 61 74 63 68 20   schemaMismatch 
233b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
233c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
233d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
233e0 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
233f0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
23400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23410 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74 61  me of current ta
23420 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  ble */.  int nTa
23430 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
23440 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
23450 6c 74 20 6f 66 20 73 71 6c 69 74 65 33 53 74 72  lt of sqlite3Str
23460 6c 65 6e 33 30 28 7a 54 61 62 29 20 2a 2f 0a 20  len30(zTab) */. 
23470 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78   SessionApplyCtx
23480 20 73 41 70 70 6c 79 3b 20 20 20 20 20 20 20 20   sApply;        
23490 20 2f 2a 20 63 68 61 6e 67 65 73 65 74 5f 61 70   /* changeset_ap
234a0 70 6c 79 28 29 20 63 6f 6e 74 65 78 74 20 6f 62  ply() context ob
234b0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 50  ject */.  int bP
234c0 61 74 63 68 73 65 74 3b 0a 0a 20 20 61 73 73 65  atchset;..  asse
234d0 72 74 28 20 78 43 6f 6e 66 6c 69 63 74 21 3d 30  rt( xConflict!=0
234e0 20 29 3b 0a 0a 20 20 70 49 74 65 72 2d 3e 69 6e   );..  pIter->in
234f0 2e 62 4e 6f 44 69 73 63 61 72 64 20 3d 20 31 3b  .bNoDiscard = 1;
23500 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 70 70 6c  .  memset(&sAppl
23510 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 70  y, 0, sizeof(sAp
23520 70 6c 79 29 29 3b 0a 20 20 73 41 70 70 6c 79 2e  ply));.  sApply.
23530 62 52 65 62 61 73 65 20 3d 20 28 70 70 52 65 62  bRebase = (ppReb
23540 61 73 65 20 26 26 20 70 6e 52 65 62 61 73 65 29  ase && pnRebase)
23550 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
23560 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
23570 64 62 5f 6d 75 74 65 78 28 64 62 29 29 3b 0a 20  db_mutex(db));. 
23580 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
23590 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41 50  LITE_CHANGESETAP
235a0 50 4c 59 5f 4e 4f 53 41 56 45 50 4f 49 4e 54 29  PLY_NOSAVEPOINT)
235b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
235c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
235d0 20 22 53 41 56 45 50 4f 49 4e 54 20 63 68 61 6e   "SAVEPOINT chan
235e0 67 65 73 65 74 5f 61 70 70 6c 79 22 2c 20 30 2c  geset_apply", 0,
235f0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
23600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23610 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23620 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52  te3_exec(db, "PR
23630 41 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69  AGMA defer_forei
23640 67 6e 5f 6b 65 79 73 20 3d 20 31 22 2c 20 30 2c  gn_keys = 1", 0,
23650 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 77 68   0, 0);.  }.  wh
23660 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
23670 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
23680 3d 3d 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  ==sqlite3changes
23690 65 74 5f 6e 65 78 74 28 70 49 74 65 72 29 20 29  et_next(pIter) )
236a0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  {.    int nCol;.
236b0 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
236c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
236d0 3b 0a 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74  ;.    .    sqlit
236e0 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28 70  e3changeset_op(p
236f0 49 74 65 72 2c 20 26 7a 4e 65 77 2c 20 26 6e 43  Iter, &zNew, &nC
23700 6f 6c 2c 20 26 6f 70 2c 20 30 29 3b 0a 0a 20 20  ol, &op, 0);..  
23710 20 20 69 66 28 20 7a 54 61 62 3d 3d 30 20 7c 7c    if( zTab==0 ||
23720 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
23730 70 28 7a 4e 65 77 2c 20 7a 54 61 62 2c 20 6e 54  p(zNew, zTab, nT
23740 61 62 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 75  ab+1) ){.      u
23750 38 20 2a 61 62 50 4b 3b 0a 0a 20 20 20 20 20 20  8 *abPK;..      
23760 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 74 72  rc = sessionRetr
23770 79 43 6f 6e 73 74 72 61 69 6e 74 73 28 0a 20 20  yConstraints(.  
23780 20 20 20 20 20 20 20 20 64 62 2c 20 70 49 74 65          db, pIte
23790 72 2d 3e 62 50 61 74 63 68 73 65 74 2c 20 7a 54  r->bPatchset, zT
237a0 61 62 2c 20 26 73 41 70 70 6c 79 2c 20 78 43 6f  ab, &sApply, xCo
237b0 6e 66 6c 69 63 74 2c 20 70 43 74 78 0a 20 20 20  nflict, pCtx.   
237c0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
237d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
237e0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 73 71  break;..      sq
237f0 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
23800 2a 29 73 41 70 70 6c 79 2e 61 7a 43 6f 6c 29 3b  *)sApply.azCol);
23810 20 20 2f 2a 20 63 61 73 74 20 77 6f 72 6b 73 20    /* cast works 
23820 61 72 6f 75 6e 64 20 56 43 2b 2b 20 62 75 67 20  around VC++ bug 
23830 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
23840 5f 66 69 6e 61 6c 69 7a 65 28 73 41 70 70 6c 79  _finalize(sApply
23850 2e 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  .pDelete);.     
23860 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
23870 65 28 73 41 70 70 6c 79 2e 70 55 70 64 61 74 65  e(sApply.pUpdate
23880 29 3b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ); .      sqlite
23890 33 5f 66 69 6e 61 6c 69 7a 65 28 73 41 70 70 6c  3_finalize(sAppl
238a0 79 2e 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  y.pInsert);.    
238b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
238c0 7a 65 28 73 41 70 70 6c 79 2e 70 53 65 6c 65 63  ze(sApply.pSelec
238d0 74 29 3b 0a 20 20 20 20 20 20 73 41 70 70 6c 79  t);.      sApply
238e0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
238f0 73 41 70 70 6c 79 2e 70 44 65 6c 65 74 65 20 3d  sApply.pDelete =
23900 20 30 3b 0a 20 20 20 20 20 20 73 41 70 70 6c 79   0;.      sApply
23910 2e 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  .pUpdate = 0;.  
23920 20 20 20 20 73 41 70 70 6c 79 2e 70 49 6e 73 65      sApply.pInse
23930 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 41  rt = 0;.      sA
23940 70 70 6c 79 2e 70 53 65 6c 65 63 74 20 3d 20 30  pply.pSelect = 0
23950 3b 0a 20 20 20 20 20 20 73 41 70 70 6c 79 2e 6e  ;.      sApply.n
23960 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
23970 41 70 70 6c 79 2e 61 7a 43 6f 6c 20 3d 20 30 3b  Apply.azCol = 0;
23980 0a 20 20 20 20 20 20 73 41 70 70 6c 79 2e 61 62  .      sApply.ab
23990 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 41  PK = 0;.      sA
239a0 70 70 6c 79 2e 62 53 74 61 74 31 20 3d 20 30 3b  pply.bStat1 = 0;
239b0 0a 20 20 20 20 20 20 73 41 70 70 6c 79 2e 62 44  .      sApply.bD
239c0 65 66 65 72 43 6f 6e 73 74 72 61 69 6e 74 73 20  eferConstraints 
239d0 3d 20 31 3b 0a 20 20 20 20 20 20 73 41 70 70 6c  = 1;.      sAppl
239e0 79 2e 62 52 65 62 61 73 65 53 74 61 72 74 65 64  y.bRebaseStarted
239f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73   = 0;.      mems
23a00 65 74 28 26 73 41 70 70 6c 79 2e 63 6f 6e 73 74  et(&sApply.const
23a10 72 61 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f  raints, 0, sizeo
23a20 66 28 53 65 73 73 69 6f 6e 42 75 66 66 65 72 29  f(SessionBuffer)
23a30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
23a40 61 6e 20 78 46 69 6c 74 65 72 28 29 20 63 61 6c  an xFilter() cal
23a50 6c 62 61 63 6b 20 77 61 73 20 73 70 65 63 69 66  lback was specif
23a60 69 65 64 2c 20 69 6e 76 6f 6b 65 20 69 74 20 6e  ied, invoke it n
23a70 6f 77 2e 20 49 66 20 74 68 65 20 0a 20 20 20 20  ow. If the .    
23a80 20 20 2a 2a 20 78 46 69 6c 74 65 72 20 63 61 6c    ** xFilter cal
23a90 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 7a 65  lback returns ze
23aa0 72 6f 2c 20 73 6b 69 70 20 74 68 69 73 20 74 61  ro, skip this ta
23ab0 62 6c 65 2e 20 49 66 20 69 74 20 72 65 74 75 72  ble. If it retur
23ac0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d  ns.      ** non-
23ad0 7a 65 72 6f 2c 20 70 72 6f 63 65 65 64 2e 20 2a  zero, proceed. *
23ae0 2f 0a 20 20 20 20 20 20 73 63 68 65 6d 61 4d 69  /.      schemaMi
23af0 73 6d 61 74 63 68 20 3d 20 28 78 46 69 6c 74 65  smatch = (xFilte
23b00 72 20 26 26 20 28 30 3d 3d 78 46 69 6c 74 65 72  r && (0==xFilter
23b10 28 70 43 74 78 2c 20 7a 4e 65 77 29 29 29 3b 0a  (pCtx, zNew)));.
23b20 20 20 20 20 20 20 69 66 28 20 73 63 68 65 6d 61        if( schema
23b30 4d 69 73 6d 61 74 63 68 20 29 7b 0a 20 20 20 20  Mismatch ){.    
23b40 20 20 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74      zTab = sqlit
23b50 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
23b60 20 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   zNew);.        
23b70 69 66 28 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20  if( zTab==0 ){. 
23b80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23b90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
23bc0 54 61 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Tab = (int)strle
23bd0 6e 28 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 20  n(zTab);.       
23be0 20 73 41 70 70 6c 79 2e 61 7a 43 6f 6c 20 3d 20   sApply.azCol = 
23bf0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 7a  (const char **)z
23c00 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
23c10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d  {.        int nM
23c20 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  inCol = 0;.     
23c30 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
23c40 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65     sqlite3change
23c50 73 65 74 5f 70 6b 28 70 49 74 65 72 2c 20 26 61  set_pk(pIter, &a
23c60 62 50 4b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  bPK, 0);.       
23c70 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 54 61 62   rc = sessionTab
23c80 6c 65 49 6e 66 6f 28 0a 20 20 20 20 20 20 20 20  leInfo(.        
23c90 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
23ca0 7a 4e 65 77 2c 20 26 73 41 70 70 6c 79 2e 6e 43  zNew, &sApply.nC
23cb0 6f 6c 2c 20 26 7a 54 61 62 2c 20 26 73 41 70 70  ol, &zTab, &sApp
23cc0 6c 79 2e 61 7a 43 6f 6c 2c 20 26 73 41 70 70 6c  ly.azCol, &sAppl
23cd0 79 2e 61 62 50 4b 0a 20 20 20 20 20 20 20 20 29  y.abPK.        )
23ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
23d00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  eak;.        for
23d10 28 69 3d 30 3b 20 69 3c 73 41 70 70 6c 79 2e 6e  (i=0; i<sApply.n
23d20 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
23d30 20 20 20 20 20 69 66 28 20 73 41 70 70 6c 79 2e       if( sApply.
23d40 61 62 50 4b 5b 69 5d 20 29 20 6e 4d 69 6e 43 6f  abPK[i] ) nMinCo
23d50 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  l = i+1;.       
23d60 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66   }.  .        if
23d70 28 20 73 41 70 70 6c 79 2e 6e 43 6f 6c 3d 3d 30  ( sApply.nCol==0
23d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 63   ){.          sc
23d90 68 65 6d 61 4d 69 73 6d 61 74 63 68 20 3d 20 31  hemaMismatch = 1
23da0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
23db0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 53  te3_log(SQLITE_S
23dc0 43 48 45 4d 41 2c 20 0a 20 20 20 20 20 20 20 20  CHEMA, .        
23dd0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 63 68        "sqlite3ch
23de0 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29 3a  angeset_apply():
23df0 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
23e00 25 73 22 2c 20 7a 54 61 62 0a 20 20 20 20 20 20  %s", zTab.      
23e10 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
23e20 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
23e30 28 20 73 41 70 70 6c 79 2e 6e 43 6f 6c 3c 6e 43  ( sApply.nCol<nC
23e40 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
23e50 73 63 68 65 6d 61 4d 69 73 6d 61 74 63 68 20 3d  schemaMismatch =
23e60 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
23e70 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
23e80 5f 53 43 48 45 4d 41 2c 20 0a 20 20 20 20 20 20  _SCHEMA, .      
23e90 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
23ea0 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
23eb0 29 3a 20 74 61 62 6c 65 20 25 73 20 68 61 73 20  ): table %s has 
23ec0 25 64 20 63 6f 6c 75 6d 6e 73 2c 20 22 0a 20 20  %d columns, ".  
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 70              "exp
23ee0 65 63 74 65 64 20 25 64 20 6f 72 20 6d 6f 72 65  ected %d or more
23ef0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
23f00 20 20 7a 54 61 62 2c 20 73 41 70 70 6c 79 2e 6e    zTab, sApply.n
23f10 43 6f 6c 2c 20 6e 43 6f 6c 0a 20 20 20 20 20 20  Col, nCol.      
23f20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
23f30 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
23f40 28 20 6e 43 6f 6c 3c 6e 4d 69 6e 43 6f 6c 20 7c  ( nCol<nMinCol |
23f50 7c 20 6d 65 6d 63 6d 70 28 73 41 70 70 6c 79 2e  | memcmp(sApply.
23f60 61 62 50 4b 2c 20 61 62 50 4b 2c 20 6e 43 6f 6c  abPK, abPK, nCol
23f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23f80 20 20 73 63 68 65 6d 61 4d 69 73 6d 61 74 63 68    schemaMismatch
23f90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23fa0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
23fb0 54 45 5f 53 43 48 45 4d 41 2c 20 22 73 71 6c 69  TE_SCHEMA, "sqli
23fc0 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
23fd0 6c 79 28 29 3a 20 22 0a 20 20 20 20 20 20 20 20  ly(): ".        
23fe0 20 20 20 20 20 20 22 70 72 69 6d 61 72 79 20 6b        "primary k
23ff0 65 79 20 6d 69 73 6d 61 74 63 68 20 66 6f 72 20  ey mismatch for 
24000 74 61 62 6c 65 20 25 73 22 2c 20 7a 54 61 62 0a  table %s", zTab.
24010 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
24020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
24030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
24040 41 70 70 6c 79 2e 6e 43 6f 6c 20 3d 20 6e 43 6f  Apply.nCol = nCo
24050 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
24060 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
24070 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
24080 65 5f 73 74 61 74 31 22 29 20 29 7b 0a 20 20 20  e_stat1") ){.   
24090 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63           if( (rc
240a0 20 3d 20 73 65 73 73 69 6f 6e 53 74 61 74 31 53   = sessionStat1S
240b0 71 6c 28 64 62 2c 20 26 73 41 70 70 6c 79 29 20  ql(db, &sApply) 
240c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
240d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
240e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
240f0 20 20 20 20 73 41 70 70 6c 79 2e 62 53 74 61 74      sApply.bStat
24100 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  1 = 1;.         
24110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24120 20 20 20 20 69 66 28 28 72 63 20 3d 20 73 65 73      if((rc = ses
24130 73 69 6f 6e 53 65 6c 65 63 74 52 6f 77 28 64 62  sionSelectRow(db
24140 2c 20 7a 54 61 62 2c 20 26 73 41 70 70 6c 79 29  , zTab, &sApply)
24150 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
24160 20 20 7c 7c 20 28 72 63 20 3d 20 73 65 73 73 69    || (rc = sessi
24170 6f 6e 55 70 64 61 74 65 52 6f 77 28 64 62 2c 20  onUpdateRow(db, 
24180 7a 54 61 62 2c 20 26 73 41 70 70 6c 79 29 29 0a  zTab, &sApply)).
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 7c 7c 20 28 72 63 20 3d 20 73 65 73 73 69 6f 6e  || (rc = session
241b0 44 65 6c 65 74 65 52 6f 77 28 64 62 2c 20 7a 54  DeleteRow(db, zT
241c0 61 62 2c 20 26 73 41 70 70 6c 79 29 29 0a 20 20  ab, &sApply)).  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
241e0 20 28 72 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e   (rc = sessionIn
241f0 73 65 72 74 52 6f 77 28 64 62 2c 20 7a 54 61 62  sertRow(db, zTab
24200 2c 20 26 73 41 70 70 6c 79 29 29 0a 20 20 20 20  , &sApply)).    
24210 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24220 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
24230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24240 20 20 20 20 20 20 20 20 20 20 20 20 73 41 70 70              sApp
24250 6c 79 2e 62 53 74 61 74 31 20 3d 20 30 3b 0a 20  ly.bStat1 = 0;. 
24260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 54 61     }.        nTa
24280 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
24290 6e 33 30 28 7a 54 61 62 29 3b 0a 20 20 20 20 20  n30(zTab);.     
242a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
242b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
242c0 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68 20 6f  chema mismatch o
242d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
242e0 62 6c 65 2c 20 70 72 6f 63 65 65 64 20 74 6f 20  ble, proceed to 
242f0 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
24300 63 68 61 6e 67 65 2e 20 41 20 6c 6f 67 20 6d 65  change. A log me
24310 73 73 61 67 65 20 68 61 73 20 61 6c 72 65 61 64  ssage has alread
24320 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e 20 2a  y been issued. *
24330 2f 0a 20 20 20 20 69 66 28 20 73 63 68 65 6d 61  /.    if( schema
24340 4d 69 73 6d 61 74 63 68 20 29 20 63 6f 6e 74 69  Mismatch ) conti
24350 6e 75 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  nue;..    rc = s
24360 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e 65 57 69  essionApplyOneWi
24370 74 68 52 65 74 72 79 28 64 62 2c 20 70 49 74 65  thRetry(db, pIte
24380 72 2c 20 26 73 41 70 70 6c 79 2c 20 78 43 6f 6e  r, &sApply, xCon
24390 66 6c 69 63 74 2c 20 70 43 74 78 29 3b 0a 20 20  flict, pCtx);.  
243a0 7d 0a 0a 20 20 62 50 61 74 63 68 73 65 74 20 3d  }..  bPatchset =
243b0 20 70 49 74 65 72 2d 3e 62 50 61 74 63 68 73 65   pIter->bPatchse
243c0 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t;.  if( rc==SQL
243d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
243e0 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
243f0 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  set_finalize(pIt
24400 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
24410 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
24420 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65  et_finalize(pIte
24430 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
24440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24450 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
24460 52 65 74 72 79 43 6f 6e 73 74 72 61 69 6e 74 73  RetryConstraints
24470 28 64 62 2c 20 62 50 61 74 63 68 73 65 74 2c 20  (db, bPatchset, 
24480 7a 54 61 62 2c 20 26 73 41 70 70 6c 79 2c 20 78  zTab, &sApply, x
24490 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 29 3b  Conflict, pCtx);
244a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
244b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
244c0 20 69 6e 74 20 6e 46 6b 2c 20 6e 6f 74 55 73 65   int nFk, notUse
244d0 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  d;.    sqlite3_d
244e0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
244f0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 44 45 46  ITE_DBSTATUS_DEF
24500 45 52 52 45 44 5f 46 4b 53 2c 20 26 6e 46 6b 2c  ERRED_FKS, &nFk,
24510 20 26 6e 6f 74 55 73 65 64 2c 20 30 29 3b 0a 20   &notUsed, 0);. 
24520 20 20 20 69 66 28 20 6e 46 6b 21 3d 30 20 29 7b     if( nFk!=0 ){
24530 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
24540 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
24550 54 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 73  T_ABORT;.      s
24560 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
24570 5f 69 74 65 72 20 73 49 74 65 72 3b 0a 20 20 20  _iter sIter;.   
24580 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
24590 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
245a0 72 29 29 3b 0a 20 20 20 20 20 20 73 49 74 65 72  r));.      sIter
245b0 2e 6e 43 6f 6c 20 3d 20 6e 46 6b 3b 0a 20 20 20  .nCol = nFk;.   
245c0 20 20 20 72 65 73 20 3d 20 78 43 6f 6e 66 6c 69     res = xConfli
245d0 63 74 28 70 43 74 78 2c 20 53 51 4c 49 54 45 5f  ct(pCtx, SQLITE_
245e0 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47  CHANGESET_FOREIG
245f0 4e 5f 4b 45 59 2c 20 26 73 49 74 65 72 29 3b 0a  N_KEY, &sIter);.
24600 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
24610 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
24620 4f 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OMIT ){.        
24630 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
24640 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a  TRAINT;.      }.
24650 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
24660 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52  te3_exec(db, "PR
24670 41 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69  AGMA defer_forei
24680 67 6e 5f 6b 65 79 73 20 3d 20 30 22 2c 20 30 2c  gn_keys = 0", 0,
24690 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 28   0, 0);..  if( (
246a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
246b0 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f 4e 4f  HANGESETAPPLY_NO
246c0 53 41 56 45 50 4f 49 4e 54 29 3d 3d 30 20 29 7b  SAVEPOINT)==0 ){
246d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
246e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
246f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
24700 63 28 64 62 2c 20 22 52 45 4c 45 41 53 45 20 63  c(db, "RELEASE c
24710 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 22 2c  hangeset_apply",
24720 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
24730 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
24740 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 52 4f  te3_exec(db, "RO
24750 4c 4c 42 41 43 4b 20 54 4f 20 63 68 61 6e 67 65  LLBACK TO change
24760 73 65 74 5f 61 70 70 6c 79 22 2c 20 30 2c 20 30  set_apply", 0, 0
24770 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
24780 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 52 45  te3_exec(db, "RE
24790 4c 45 41 53 45 20 63 68 61 6e 67 65 73 65 74 5f  LEASE changeset_
247a0 61 70 70 6c 79 22 2c 20 30 2c 20 30 2c 20 30 29  apply", 0, 0, 0)
247b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
247c0 73 73 65 72 74 28 20 73 41 70 70 6c 79 2e 62 52  ssert( sApply.bR
247d0 65 62 61 73 65 20 7c 7c 20 73 41 70 70 6c 79 2e  ebase || sApply.
247e0 72 65 62 61 73 65 2e 6e 42 75 66 3d 3d 30 20 29  rebase.nBuf==0 )
247f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24800 54 45 5f 4f 4b 20 26 26 20 62 50 61 74 63 68 73  TE_OK && bPatchs
24810 65 74 3d 3d 30 20 26 26 20 73 41 70 70 6c 79 2e  et==0 && sApply.
24820 62 52 65 62 61 73 65 20 29 7b 0a 20 20 20 20 2a  bRebase ){.    *
24830 70 70 52 65 62 61 73 65 20 3d 20 28 76 6f 69 64  ppRebase = (void
24840 2a 29 73 41 70 70 6c 79 2e 72 65 62 61 73 65 2e  *)sApply.rebase.
24850 61 42 75 66 3b 0a 20 20 20 20 2a 70 6e 52 65 62  aBuf;.    *pnReb
24860 61 73 65 20 3d 20 73 41 70 70 6c 79 2e 72 65 62  ase = sApply.reb
24870 61 73 65 2e 6e 42 75 66 3b 0a 20 20 20 20 73 41  ase.nBuf;.    sA
24880 70 70 6c 79 2e 72 65 62 61 73 65 2e 61 42 75 66  pply.rebase.aBuf
24890 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
248a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 41 70  te3_finalize(sAp
248b0 70 6c 79 2e 70 49 6e 73 65 72 74 29 3b 0a 20 20  ply.pInsert);.  
248c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
248d0 28 73 41 70 70 6c 79 2e 70 44 65 6c 65 74 65 29  (sApply.pDelete)
248e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
248f0 6c 69 7a 65 28 73 41 70 70 6c 79 2e 70 55 70 64  lize(sApply.pUpd
24900 61 74 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ate);.  sqlite3_
24910 66 69 6e 61 6c 69 7a 65 28 73 41 70 70 6c 79 2e  finalize(sApply.
24920 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
24930 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
24940 73 41 70 70 6c 79 2e 61 7a 43 6f 6c 29 3b 20 20  sApply.azCol);  
24950 2f 2a 20 63 61 73 74 20 77 6f 72 6b 73 20 61 72  /* cast works ar
24960 6f 75 6e 64 20 56 43 2b 2b 20 62 75 67 20 2a 2f  ound VC++ bug */
24970 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24980 28 63 68 61 72 2a 29 73 41 70 70 6c 79 2e 63 6f  (char*)sApply.co
24990 6e 73 74 72 61 69 6e 74 73 2e 61 42 75 66 29 3b  nstraints.aBuf);
249a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
249b0 28 63 68 61 72 2a 29 73 41 70 70 6c 79 2e 72 65  (char*)sApply.re
249c0 62 61 73 65 2e 61 42 75 66 29 3b 0a 20 20 73 71  base.aBuf);.  sq
249d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
249e0 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74  e(sqlite3_db_mut
249f0 65 78 28 64 62 29 29 3b 0a 20 20 72 65 74 75 72  ex(db));.  retur
24a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
24a10 70 70 6c 79 20 74 68 65 20 63 68 61 6e 67 65 73  pply the changes
24a20 65 74 20 70 61 73 73 65 64 20 76 69 61 20 70 43  et passed via pC
24a30 68 61 6e 67 65 73 65 74 2f 6e 43 68 61 6e 67 65  hangeset/nChange
24a40 73 65 74 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  set to the main 
24a50 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 74 74  .** database att
24a60 61 63 68 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  ached to handle 
24a70 22 64 62 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  "db"..*/.int sql
24a80 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
24a90 70 6c 79 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ply_v2(.  sqlite
24aa0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
24ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
24ac0 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61  ly change to "ma
24ad0 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20 68  in" db of this h
24ae0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
24af0 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20  Changeset,      
24b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24b10 7a 65 20 6f 66 20 63 68 61 6e 67 65 73 65 74 20  ze of changeset 
24b20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f  in bytes */.  vo
24b30 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 2c 20  id *pChangeset, 
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b50 20 43 68 61 6e 67 65 73 65 74 20 62 6c 6f 62 20   Changeset blob 
24b60 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65  */.  int(*xFilte
24b70 72 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  r)(.    void *pC
24b80 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
24b90 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
24ba0 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
24bb0 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f  pply() */.    co
24bc0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20  nst char *zTab  
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24be0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29  able name */.  )
24bf0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69  ,.  int(*xConfli
24c00 63 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70  ct)(.    void *p
24c10 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
24c20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
24c30 66 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f  f sixth arg to _
24c40 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69  apply() */.    i
24c50 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20  nt eConflict,   
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c70 44 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43  DATA, MISSING, C
24c80 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41  ONFLICT, CONSTRA
24c90 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  INT */.    sqlit
24ca0 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
24cb0 72 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64  r *p     /* Hand
24cc0 6c 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68  le describing ch
24cd0 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63  ange and conflic
24ce0 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64  t */.  ),.  void
24cf0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
24d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24d10 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
24d20 73 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63  ssed to xConflic
24d30 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
24d40 52 65 62 61 73 65 2c 20 69 6e 74 20 2a 70 6e 52  Rebase, int *pnR
24d50 65 62 61 73 65 2c 0a 20 20 69 6e 74 20 66 6c 61  ebase,.  int fla
24d60 67 73 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gs.){.  sqlite3_
24d70 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
24d80 70 49 74 65 72 3b 20 20 2f 2a 20 49 74 65 72 61  pIter;  /* Itera
24d90 74 6f 72 20 74 6f 20 73 6b 69 70 20 74 68 72 6f  tor to skip thro
24da0 75 67 68 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  ugh changeset */
24db0 20 20 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73    .  int bInvers
24dc0 65 20 3d 20 21 21 28 66 6c 61 67 73 20 26 20 53  e = !!(flags & S
24dd0 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 41  QLITE_CHANGESETA
24de0 50 50 4c 59 5f 49 4e 56 45 52 54 29 3b 0a 20 20  PPLY_INVERT);.  
24df0 69 6e 74 20 72 63 20 3d 20 73 65 73 73 69 6f 6e  int rc = session
24e00 43 68 61 6e 67 65 73 65 74 53 74 61 72 74 28 26  ChangesetStart(&
24e10 70 49 74 65 72 2c 20 30 2c 20 30 2c 20 6e 43 68  pIter, 0, 0, nCh
24e20 61 6e 67 65 73 65 74 2c 20 70 43 68 61 6e 67 65  angeset, pChange
24e30 73 65 74 2c 62 49 6e 76 65 72 73 65 29 3b 0a 20  set,bInverse);. 
24e40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24e50 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
24e60 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 41  essionChangesetA
24e70 70 70 6c 79 28 0a 20 20 20 20 20 20 20 20 64 62  pply(.        db
24e80 2c 20 70 49 74 65 72 2c 20 78 46 69 6c 74 65 72  , pIter, xFilter
24e90 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74  , xConflict, pCt
24ea0 78 2c 20 70 70 52 65 62 61 73 65 2c 20 70 6e 52  x, ppRebase, pnR
24eb0 65 62 61 73 65 2c 20 66 6c 61 67 73 0a 20 20 20  ebase, flags.   
24ec0 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
24ed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
24ee0 70 6c 79 20 74 68 65 20 63 68 61 6e 67 65 73 65  ply the changese
24ef0 74 20 70 61 73 73 65 64 20 76 69 61 20 70 43 68  t passed via pCh
24f00 61 6e 67 65 73 65 74 2f 6e 43 68 61 6e 67 65 73  angeset/nChanges
24f10 65 74 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 64  et to the main d
24f20 61 74 61 62 61 73 65 0a 2a 2a 20 61 74 74 61 63  atabase.** attac
24f30 68 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 22 64  hed to handle "d
24f40 62 22 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  b". Invoke the s
24f50 75 70 70 6c 69 65 64 20 63 6f 6e 66 6c 69 63 74  upplied conflict
24f60 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
24f70 6b 0a 2a 2a 20 74 6f 20 72 65 73 6f 6c 76 65 20  k.** to resolve 
24f80 61 6e 79 20 63 6f 6e 66 6c 69 63 74 73 20 65 6e  any conflicts en
24f90 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
24fa0 61 70 70 6c 79 69 6e 67 20 74 68 65 20 63 68 61  applying the cha
24fb0 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
24fc0 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
24fd0 6c 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ly(.  sqlite3 *d
24fe0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
24ff0 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63        /* Apply c
25000 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20  hange to "main" 
25010 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c  db of this handl
25020 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e  e */.  int nChan
25030 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  geset,          
25040 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25050 66 20 63 68 61 6e 67 65 73 65 74 20 69 6e 20 62  f changeset in b
25060 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ytes */.  void *
25070 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  pChangeset,     
25080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
25090 6e 67 65 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20  ngeset blob */. 
250a0 20 69 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a   int(*xFilter)(.
250b0 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20      void *pCtx, 
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78    /* Copy of six
250e0 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79  th arg to _apply
250f0 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  () */.    const 
25100 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20  char *zTab      
25110 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
25120 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20   name */.  ),.  
25130 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28  int(*xConflict)(
25140 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  .    void *pCtx,
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 66 69     /* Copy of fi
25170 66 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c  fth arg to _appl
25180 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  y() */.    int e
25190 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20  Conflict,       
251a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41           /* DATA
251b0 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c  , MISSING, CONFL
251c0 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20  ICT, CONSTRAINT 
251d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
251e0 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
251f0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64       /* Handle d
25200 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65  escribing change
25210 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f   and conflict */
25220 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  .  ),.  void *pC
25230 74 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  tx              
25240 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25250 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
25260 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f   to xConflict */
25270 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
25280 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
25290 70 6c 79 5f 76 32 28 0a 20 20 20 20 20 20 64 62  ply_v2(.      db
252a0 2c 20 6e 43 68 61 6e 67 65 73 65 74 2c 20 70 43  , nChangeset, pC
252b0 68 61 6e 67 65 73 65 74 2c 20 78 46 69 6c 74 65  hangeset, xFilte
252c0 72 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43  r, xConflict, pC
252d0 74 78 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b  tx, 0, 0, 0.  );
252e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  .}../*.** Apply 
252f0 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 70 61  the changeset pa
25300 73 73 65 64 20 76 69 61 20 78 49 6e 70 75 74 2f  ssed via xInput/
25310 70 49 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  pIn to the main 
25320 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 74 74 61  database.** atta
25330 63 68 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 22  ched to handle "
25340 64 62 22 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20  db". Invoke the 
25350 73 75 70 70 6c 69 65 64 20 63 6f 6e 66 6c 69 63  supplied conflic
25360 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  t handler callba
25370 63 6b 0a 2a 2a 20 74 6f 20 72 65 73 6f 6c 76 65  ck.** to resolve
25380 20 61 6e 79 20 63 6f 6e 66 6c 69 63 74 73 20 65   any conflicts e
25390 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
253a0 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 63 68   applying the ch
253b0 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
253c0 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70  ite3changeset_ap
253d0 70 6c 79 5f 76 32 5f 73 74 72 6d 28 0a 20 20 73  ply_v2_strm(.  s
253e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25400 2a 20 41 70 70 6c 79 20 63 68 61 6e 67 65 20 74  * Apply change t
25410 6f 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 74  o "main" db of t
25420 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  his handle */.  
25430 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f  int (*xInput)(vo
25440 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70  id *pIn, void *p
25450 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74  Data, int *pnDat
25460 61 29 2c 20 2f 2a 20 49 6e 70 75 74 20 66 75 6e  a), /* Input fun
25470 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
25480 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pIn,           
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254b0 2a 20 46 69 72 73 74 20 61 72 67 20 66 6f 72 20  * First arg for 
254c0 78 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 28  xInput */.  int(
254d0 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20 76  *xFilter)(.    v
254e0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25500 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61 72  Copy of sixth ar
25510 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f  g to _apply() */
25520 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
25530 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20  *zTab           
25540 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
25550 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74 28 2a   */.  ),.  int(*
25560 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20 20  xConflict)(.    
25570 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25590 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61   Copy of sixth a
255a0 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a  rg to _apply() *
255b0 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c  /.    int eConfl
255c0 69 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ict,            
255d0 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53      /* DATA, MIS
255e0 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20  SING, CONFLICT, 
255f0 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20  CONSTRAINT */.  
25600 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
25610 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20 20  set_iter *p     
25620 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72 69  /* Handle descri
25630 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20  bing change and 
25640 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c  conflict */.  ),
25650 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
25680 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
25690 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 76 6f  Conflict */.  vo
256a0 69 64 20 2a 2a 70 70 52 65 62 61 73 65 2c 20 69  id **ppRebase, i
256b0 6e 74 20 2a 70 6e 52 65 62 61 73 65 2c 0a 20 20  nt *pnRebase,.  
256c0 69 6e 74 20 66 6c 61 67 73 0a 29 7b 0a 20 20 73  int flags.){.  s
256d0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
256e0 5f 69 74 65 72 20 2a 70 49 74 65 72 3b 20 20 2f  _iter *pIter;  /
256f0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 6b  * Iterator to sk
25700 69 70 20 74 68 72 6f 75 67 68 20 63 68 61 6e 67  ip through chang
25710 65 73 65 74 20 2a 2f 20 20 0a 20 20 69 6e 74 20  eset */  .  int 
25720 62 49 6e 76 65 72 73 65 20 3d 20 21 21 28 66 6c  bInverse = !!(fl
25730 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 48 41  ags & SQLITE_CHA
25740 4e 47 45 53 45 54 41 50 50 4c 59 5f 49 4e 56 45  NGESETAPPLY_INVE
25750 52 54 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  RT);.  int rc = 
25760 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
25770 53 74 61 72 74 28 26 70 49 74 65 72 2c 20 78 49  Start(&pIter, xI
25780 6e 70 75 74 2c 20 70 49 6e 2c 20 30 2c 20 30 2c  nput, pIn, 0, 0,
25790 20 62 49 6e 76 65 72 73 65 29 3b 0a 20 20 69 66   bInverse);.  if
257a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
257b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73  ){.    rc = sess
257c0 69 6f 6e 43 68 61 6e 67 65 73 65 74 41 70 70 6c  ionChangesetAppl
257d0 79 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 70  y(.        db, p
257e0 49 74 65 72 2c 20 78 46 69 6c 74 65 72 2c 20 78  Iter, xFilter, x
257f0 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c 20  Conflict, pCtx, 
25800 70 70 52 65 62 61 73 65 2c 20 70 6e 52 65 62 61  ppRebase, pnReba
25810 73 65 2c 20 66 6c 61 67 73 0a 20 20 20 20 29 3b  se, flags.    );
25820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25830 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  ;.}.int sqlite3c
25840 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 73  hangeset_apply_s
25850 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  trm(.  sqlite3 *
25860 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
25870 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79 20         /* Apply 
25880 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22  change to "main"
25890 20 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e 64   db of this hand
258a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49  le */.  int (*xI
258b0 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
258c0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
258d0 74 20 2a 70 6e 44 61 74 61 29 2c 20 2f 2a 20 49  t *pnData), /* I
258e0 6e 70 75 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  nput function */
258f0 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 20 20 20  .  void *pIn,   
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25930 61 72 67 20 66 6f 72 20 78 49 6e 70 75 74 20 2a  arg for xInput *
25940 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72  /.  int(*xFilter
25950 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
25960 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
25970 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
25980 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
25990 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e  ply() */.    con
259a0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20  st char *zTab   
259b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
259c0 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c  ble name */.  ),
259d0 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63  .  int(*xConflic
259e0 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  t)(.    void *pC
259f0 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
25a00 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
25a10 20 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61   sixth arg to _a
25a20 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e  pply() */.    in
25a30 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20  t eConflict,    
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25a50 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f  ATA, MISSING, CO
25a60 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49  NFLICT, CONSTRAI
25a70 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NT */.    sqlite
25a80 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
25a90 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c   *p     /* Handl
25aa0 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61  e describing cha
25ab0 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74  nge and conflict
25ac0 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20   */.  ),.  void 
25ad0 2a 70 43 74 78 20 20 20 20 20 20 20 20 20 20 20  *pCtx           
25ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25af0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
25b00 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74  sed to xConflict
25b10 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
25b20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
25b30 5f 61 70 70 6c 79 5f 76 32 5f 73 74 72 6d 28 0a  _apply_v2_strm(.
25b40 20 20 20 20 20 20 64 62 2c 20 78 49 6e 70 75 74        db, xInput
25b50 2c 20 70 49 6e 2c 20 78 46 69 6c 74 65 72 2c 20  , pIn, xFilter, 
25b60 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c  xConflict, pCtx,
25b70 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 7d 0a   0, 0, 0.  );.}.
25b80 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  ./*.** sqlite3_c
25b90 68 61 6e 67 65 67 72 6f 75 70 20 68 61 6e 64 6c  hangegroup handl
25ba0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c  e..*/.struct sql
25bb0 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
25bc0 20 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20   {.  int rc;    
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
25bf0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 50 61 74  de */.  int bPat
25c00 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
25c10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25c20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 70 61  to accumulate pa
25c30 74 63 68 73 65 74 73 20 2a 2f 0a 20 20 53 65 73  tchsets */.  Ses
25c40 73 69 6f 6e 54 61 62 6c 65 20 2a 70 4c 69 73 74  sionTable *pList
25c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25c60 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
25c70 6e 20 63 75 72 72 65 6e 74 20 70 61 74 63 68 20  n current patch 
25c80 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
25c90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25ca0 6c 6c 65 64 20 74 6f 20 6d 65 72 67 65 20 74 77  lled to merge tw
25cb0 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
25cc0 20 73 61 6d 65 20 72 6f 77 20 74 6f 67 65 74 68   same row togeth
25cd0 65 72 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  er as.** part of
25ce0 20 61 6e 20 73 71 6c 69 74 65 33 63 68 61 6e 67   an sqlite3chang
25cf0 65 73 65 74 5f 63 6f 6e 63 61 74 28 29 20 6f 70  eset_concat() op
25d00 65 72 61 74 69 6f 6e 2e 20 41 20 6e 65 77 20 63  eration. A new c
25d10 68 61 6e 67 65 20 6f 62 6a 65 63 74 20 69 73 0a  hange object is.
25d20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
25d30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
25d40 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 70 4e 65   stored in *ppNe
25d50 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
25d60 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 4d 65   sessionChangeMe
25d70 72 67 65 28 0a 20 20 53 65 73 73 69 6f 6e 54 61  rge(.  SessionTa
25d80 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
25d90 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
25da0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
25db0 6e 74 20 62 52 65 62 61 73 65 2c 20 20 20 20 20  nt bRebase,     
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25dd0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 62  * True for a reb
25de0 61 73 65 20 68 61 73 68 2d 74 61 62 6c 65 20 2a  ase hash-table *
25df0 2f 0a 20 20 69 6e 74 20 62 50 61 74 63 68 73 65  /.  int bPatchse
25e00 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
25e10 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
25e20 70 61 74 63 68 73 65 74 73 20 2a 2f 0a 20 20 53  patchsets */.  S
25e30 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 45  essionChange *pE
25e40 78 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f  xist,          /
25e50 2a 20 45 78 69 73 74 69 6e 67 20 63 68 61 6e 67  * Existing chang
25e60 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 32 2c 20  e */.  int op2, 
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
25e90 20 63 68 61 6e 67 65 20 6f 70 65 72 61 74 69 6f   change operatio
25ea0 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 64 69  n */.  int bIndi
25eb0 72 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  rect,           
25ec0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25ed0 66 20 73 65 63 6f 6e 64 20 63 68 61 6e 67 65 20  f second change 
25ee0 69 73 20 69 6e 64 69 72 65 63 74 20 2a 2f 0a 20  is indirect */. 
25ef0 20 75 38 20 2a 61 52 65 63 2c 20 20 20 20 20 20   u8 *aRec,      
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 2f 2a 20 53 65 63 6f 6e 64 20 63 68 61 6e 67   /* Second chang
25f20 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
25f30 74 20 6e 52 65 63 2c 20 20 20 20 20 20 20 20 20  t nRec,         
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f50 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
25f60 20 69 6e 20 61 52 65 63 20 2a 2f 0a 20 20 53 65   in aRec */.  Se
25f70 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 2a 70 70  ssionChange **pp
25f80 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
25f90 20 4f 55 54 3a 20 4d 65 72 67 65 64 20 63 68 61   OUT: Merged cha
25fa0 6e 67 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 73 73  nge */.){.  Sess
25fb0 69 6f 6e 43 68 61 6e 67 65 20 2a 70 4e 65 77 20  ionChange *pNew 
25fc0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
25fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
25fe0 28 20 21 70 45 78 69 73 74 20 29 7b 0a 20 20 20  ( !pExist ){.   
25ff0 20 70 4e 65 77 20 3d 20 28 53 65 73 73 69 6f 6e   pNew = (Session
26000 43 68 61 6e 67 65 20 2a 29 73 71 6c 69 74 65 33  Change *)sqlite3
26010 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66  _malloc64(sizeof
26020 28 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 29 20  (SessionChange) 
26030 2b 20 6e 52 65 63 29 3b 0a 20 20 20 20 69 66 28  + nRec);.    if(
26040 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
26050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26060 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
26070 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
26080 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 43 68 61  izeof(SessionCha
26090 6e 67 65 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nge));.    pNew-
260a0 3e 6f 70 20 3d 20 6f 70 32 3b 0a 20 20 20 20 70  >op = op2;.    p
260b0 4e 65 77 2d 3e 62 49 6e 64 69 72 65 63 74 20 3d  New->bIndirect =
260c0 20 62 49 6e 64 69 72 65 63 74 3b 0a 20 20 20 20   bIndirect;.    
260d0 70 4e 65 77 2d 3e 61 52 65 63 6f 72 64 20 3d 20  pNew->aRecord = 
260e0 28 75 38 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  (u8*)&pNew[1];. 
260f0 20 20 20 69 66 28 20 62 49 6e 64 69 72 65 63 74     if( bIndirect
26100 3d 3d 30 20 7c 7c 20 62 52 65 62 61 73 65 3d 3d  ==0 || bRebase==
26110 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
26120 3e 6e 52 65 63 6f 72 64 20 3d 20 6e 52 65 63 3b  >nRecord = nRec;
26130 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e  .      memcpy(pN
26140 65 77 2d 3e 61 52 65 63 6f 72 64 2c 20 61 52 65  ew->aRecord, aRe
26150 63 2c 20 6e 52 65 63 29 3b 0a 20 20 20 20 7d 65  c, nRec);.    }e
26160 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
26170 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 49 6e 20  ;.      u8 *pIn 
26180 3d 20 61 52 65 63 3b 0a 20 20 20 20 20 20 75 38  = aRec;.      u8
26190 20 2a 70 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 61   *pOut = pNew->a
261a0 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 66 6f  Record;.      fo
261b0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
261c0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
261d0 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 65 73     int nIn = ses
261e0 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 70 49  sionSerialLen(pI
261f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
26200 2a 70 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  *pIn==0 ){.     
26210 20 20 20 20 20 2a 70 4f 75 74 2b 2b 20 3d 20 30       *pOut++ = 0
26220 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
26230 69 66 28 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69  if( pTab->abPK[i
26240 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
26250 20 20 2a 70 4f 75 74 2b 2b 20 3d 20 30 78 46 46    *pOut++ = 0xFF
26260 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26270 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26280 79 28 70 4f 75 74 2c 20 70 49 6e 2c 20 6e 49 6e  y(pOut, pIn, nIn
26290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 75  );.          pOu
262a0 74 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t += nIn;.      
262b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 6e 20    }.        pIn 
262c0 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 0a  += nIn;.      }.
262d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 63        pNew->nRec
262e0 6f 72 64 20 3d 20 70 4f 75 74 20 2d 20 70 4e 65  ord = pOut - pNe
262f0 77 2d 3e 61 52 65 63 6f 72 64 3b 0a 20 20 20 20  w->aRecord;.    
26300 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52  }.  }else if( bR
26310 65 62 61 73 65 20 29 7b 0a 20 20 20 20 69 66 28  ebase ){.    if(
26320 20 70 45 78 69 73 74 2d 3e 6f 70 3d 3d 53 51 4c   pExist->op==SQL
26330 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 70 45  ITE_DELETE && pE
26340 78 69 73 74 2d 3e 62 49 6e 64 69 72 65 63 74 20  xist->bIndirect 
26350 29 7b 0a 20 20 20 20 20 20 2a 70 70 4e 65 77 20  ){.      *ppNew 
26360 3d 20 70 45 78 69 73 74 3b 0a 20 20 20 20 7d 65  = pExist;.    }e
26370 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26380 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d  e3_int64 nByte =
26390 20 6e 52 65 63 20 2b 20 70 45 78 69 73 74 2d 3e   nRec + pExist->
263a0 6e 52 65 63 6f 72 64 20 2b 20 73 69 7a 65 6f 66  nRecord + sizeof
263b0 28 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 29 3b  (SessionChange);
263c0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 53  .      pNew = (S
263d0 65 73 73 69 6f 6e 43 68 61 6e 67 65 2a 29 73 71  essionChange*)sq
263e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
263f0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
26400 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
26410 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26420 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
26430 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
26440 69 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  i;.        u8 *a
26450 31 20 3d 20 70 45 78 69 73 74 2d 3e 61 52 65 63  1 = pExist->aRec
26460 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20  ord;.        u8 
26470 2a 61 32 20 3d 20 61 52 65 63 3b 0a 20 20 20 20  *a2 = aRec;.    
26480 20 20 20 20 75 38 20 2a 70 4f 75 74 3b 0a 0a 20      u8 *pOut;.. 
26490 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e         memset(pN
264a0 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  ew, 0, nByte);. 
264b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 49 6e         pNew->bIn
264c0 64 69 72 65 63 74 20 3d 20 62 49 6e 64 69 72 65  direct = bIndire
264d0 63 74 20 7c 7c 20 70 45 78 69 73 74 2d 3e 62 49  ct || pExist->bI
264e0 6e 64 69 72 65 63 74 3b 0a 20 20 20 20 20 20 20  ndirect;.       
264f0 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 32 3b   pNew->op = op2;
26500 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20  .        pOut = 
26510 70 4e 65 77 2d 3e 61 52 65 63 6f 72 64 20 3d 20  pNew->aRecord = 
26520 28 75 38 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a  (u8*)&pNew[1];..
26530 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
26540 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
26550 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
26560 6e 74 20 6e 31 20 3d 20 73 65 73 73 69 6f 6e 53  nt n1 = sessionS
26570 65 72 69 61 6c 4c 65 6e 28 61 31 29 3b 0a 20 20  erialLen(a1);.  
26580 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20 3d          int n2 =
26590 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65   sessionSerialLe
265a0 6e 28 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20  n(a2);.         
265b0 20 69 66 28 20 2a 61 31 3d 3d 30 78 46 46 20 7c   if( *a1==0xFF |
265c0 7c 20 28 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d  | (pTab->abPK[i]
265d0 3d 3d 30 20 26 26 20 62 49 6e 64 69 72 65 63 74  ==0 && bIndirect
265e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
265f0 20 2a 70 4f 75 74 2b 2b 20 3d 20 30 78 46 46 3b   *pOut++ = 0xFF;
26600 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26610 20 69 66 28 20 2a 61 32 3d 3d 30 20 29 7b 0a 20   if( *a2==0 ){. 
26620 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
26630 79 28 70 4f 75 74 2c 20 61 31 2c 20 6e 31 29 3b  y(pOut, a1, n1);
26640 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 75  .            pOu
26650 74 20 2b 3d 20 6e 31 3b 0a 20 20 20 20 20 20 20  t += n1;.       
26660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26670 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
26680 74 2c 20 61 32 2c 20 6e 32 29 3b 0a 20 20 20 20  t, a2, n2);.    
26690 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d 20          pOut += 
266a0 6e 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  n2;.          }.
266b0 20 20 20 20 20 20 20 20 20 20 61 31 20 2b 3d 20            a1 += 
266c0 6e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 61 32  n1;.          a2
266d0 20 2b 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20   += n2;.        
266e0 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  }.        pNew->
266f0 6e 52 65 63 6f 72 64 20 3d 20 70 4f 75 74 20 2d  nRecord = pOut -
26700 20 70 4e 65 77 2d 3e 61 52 65 63 6f 72 64 3b 0a   pNew->aRecord;.
26710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
26720 6c 69 74 65 33 5f 66 72 65 65 28 70 45 78 69 73  lite3_free(pExis
26730 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
26740 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 31 20 3d  e{.    int op1 =
26750 20 70 45 78 69 73 74 2d 3e 6f 70 3b 0a 0a 20 20   pExist->op;..  
26760 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 20 20 6f    /* .    **   o
26770 70 31 3d 49 4e 53 45 52 54 2c 20 6f 70 32 3d 49  p1=INSERT, op2=I
26780 4e 53 45 52 54 20 20 20 20 20 20 2d 3e 20 20 20  NSERT      ->   
26790 20 20 20 55 6e 73 75 70 70 6f 72 74 65 64 2e 20     Unsupported. 
267a0 44 69 73 63 61 72 64 20 6f 70 32 2e 0a 20 20 20  Discard op2..   
267b0 20 2a 2a 20 20 20 6f 70 31 3d 49 4e 53 45 52 54   **   op1=INSERT
267c0 2c 20 6f 70 32 3d 55 50 44 41 54 45 20 20 20 20  , op2=UPDATE    
267d0 20 20 2d 3e 20 20 20 20 20 20 49 4e 53 45 52 54    ->      INSERT
267e0 2e 0a 20 20 20 20 2a 2a 20 20 20 6f 70 31 3d 49  ..    **   op1=I
267f0 4e 53 45 52 54 2c 20 6f 70 32 3d 44 45 4c 45 54  NSERT, op2=DELET
26800 45 20 20 20 20 20 20 2d 3e 20 20 20 20 20 20 28  E      ->      (
26810 6e 6f 6e 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  none).    **.   
26820 20 2a 2a 20 20 20 6f 70 31 3d 55 50 44 41 54 45   **   op1=UPDATE
26830 2c 20 6f 70 32 3d 49 4e 53 45 52 54 20 20 20 20  , op2=INSERT    
26840 20 20 2d 3e 20 20 20 20 20 20 55 6e 73 75 70 70    ->      Unsupp
26850 6f 72 74 65 64 2e 20 44 69 73 63 61 72 64 20 6f  orted. Discard o
26860 70 32 2e 0a 20 20 20 20 2a 2a 20 20 20 6f 70 31  p2..    **   op1
26870 3d 55 50 44 41 54 45 2c 20 6f 70 32 3d 55 50 44  =UPDATE, op2=UPD
26880 41 54 45 20 20 20 20 20 20 2d 3e 20 20 20 20 20  ATE      ->     
26890 20 55 50 44 41 54 45 2e 0a 20 20 20 20 2a 2a 20   UPDATE..    ** 
268a0 20 20 6f 70 31 3d 55 50 44 41 54 45 2c 20 6f 70    op1=UPDATE, op
268b0 32 3d 44 45 4c 45 54 45 20 20 20 20 20 20 2d 3e  2=DELETE      ->
268c0 20 20 20 20 20 20 44 45 4c 45 54 45 2e 0a 20 20        DELETE..  
268d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 6f 70    **.    **   op
268e0 31 3d 44 45 4c 45 54 45 2c 20 6f 70 32 3d 49 4e  1=DELETE, op2=IN
268f0 53 45 52 54 20 20 20 20 20 20 2d 3e 20 20 20 20  SERT      ->    
26900 20 20 55 50 44 41 54 45 2e 0a 20 20 20 20 2a 2a    UPDATE..    **
26910 20 20 20 6f 70 31 3d 44 45 4c 45 54 45 2c 20 6f     op1=DELETE, o
26920 70 32 3d 55 50 44 41 54 45 20 20 20 20 20 20 2d  p2=UPDATE      -
26930 3e 20 20 20 20 20 20 55 6e 73 75 70 70 6f 72 74  >      Unsupport
26940 65 64 2e 20 44 69 73 63 61 72 64 20 6f 70 32 2e  ed. Discard op2.
26950 0a 20 20 20 20 2a 2a 20 20 20 6f 70 31 3d 44 45  .    **   op1=DE
26960 4c 45 54 45 2c 20 6f 70 32 3d 44 45 4c 45 54 45  LETE, op2=DELETE
26970 20 20 20 20 20 20 2d 3e 20 20 20 20 20 20 55 6e        ->      Un
26980 73 75 70 70 6f 72 74 65 64 2e 20 44 69 73 63 61  supported. Disca
26990 72 64 20 6f 70 32 2e 0a 20 20 20 20 2a 2f 20 20  rd op2..    */  
269a0 20 0a 20 20 20 20 69 66 28 20 28 6f 70 31 3d 3d   .    if( (op1==
269b0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 26 26  SQLITE_INSERT &&
269c0 20 6f 70 32 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   op2==SQLITE_INS
269d0 45 52 54 29 0a 20 20 20 20 20 7c 7c 20 28 6f 70  ERT).     || (op
269e0 31 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  1==SQLITE_UPDATE
269f0 20 26 26 20 6f 70 32 3d 3d 53 51 4c 49 54 45 5f   && op2==SQLITE_
26a00 49 4e 53 45 52 54 29 0a 20 20 20 20 20 7c 7c 20  INSERT).     || 
26a10 28 6f 70 31 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  (op1==SQLITE_DEL
26a20 45 54 45 20 26 26 20 6f 70 32 3d 3d 53 51 4c 49  ETE && op2==SQLI
26a30 54 45 5f 55 50 44 41 54 45 29 0a 20 20 20 20 20  TE_UPDATE).     
26a40 7c 7c 20 28 6f 70 31 3d 3d 53 51 4c 49 54 45 5f  || (op1==SQLITE_
26a50 44 45 4c 45 54 45 20 26 26 20 6f 70 32 3d 3d 53  DELETE && op2==S
26a60 51 4c 49 54 45 5f 44 45 4c 45 54 45 29 0a 20 20  QLITE_DELETE).  
26a70 20 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20    ){.      pNew 
26a80 3d 20 70 45 78 69 73 74 3b 0a 20 20 20 20 7d 65  = pExist;.    }e
26a90 6c 73 65 20 69 66 28 20 6f 70 31 3d 3d 53 51 4c  lse if( op1==SQL
26aa0 49 54 45 5f 49 4e 53 45 52 54 20 26 26 20 6f 70  ITE_INSERT && op
26ab0 32 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  2==SQLITE_DELETE
26ac0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26ad0 33 5f 66 72 65 65 28 70 45 78 69 73 74 29 3b 0a  3_free(pExist);.
26ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
26af0 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ew==0 );.    }el
26b00 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 45  se{.      u8 *aE
26b10 78 69 73 74 20 3d 20 70 45 78 69 73 74 2d 3e 61  xist = pExist->a
26b20 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 73 71  Record;.      sq
26b30 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
26b40 65 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 43 73  e;.      u8 *aCs
26b50 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c  r;..      /* All
26b60 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 73 73  ocate a new Sess
26b70 69 6f 6e 43 68 61 6e 67 65 20 6f 62 6a 65 63 74  ionChange object
26b80 2e 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  . Ensure that th
26b90 65 20 61 52 65 63 6f 72 64 5b 5d 0a 20 20 20 20  e aRecord[].    
26ba0 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 66 20 74    ** buffer of t
26bb0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
26bc0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
26bd0 20 68 6f 6c 64 20 61 6e 79 20 72 65 63 6f 72 64   hold any record
26be0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d   that.      ** m
26bf0 61 79 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ay be generated 
26c00 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65  by combining the
26c10 20 69 6e 70 75 74 20 72 65 63 6f 72 64 73 2e 20   input records. 
26c20 20 2a 2f 0a 20 20 20 20 20 20 6e 42 79 74 65 20   */.      nByte 
26c30 3d 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e  = sizeof(Session
26c40 43 68 61 6e 67 65 29 20 2b 20 70 45 78 69 73 74  Change) + pExist
26c50 2d 3e 6e 52 65 63 6f 72 64 20 2b 20 6e 52 65 63  ->nRecord + nRec
26c60 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  ;.      pNew = (
26c70 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 29  SessionChange *)
26c80 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
26c90 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69  (nByte);.      i
26ca0 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
26cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26cc0 28 70 45 78 69 73 74 29 3b 0a 20 20 20 20 20 20  (pExist);.      
26cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26ce0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
26cf0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77       memset(pNew
26d00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 73 73  , 0, sizeof(Sess
26d10 69 6f 6e 43 68 61 6e 67 65 29 29 3b 0a 20 20 20  ionChange));.   
26d20 20 20 20 70 4e 65 77 2d 3e 62 49 6e 64 69 72 65     pNew->bIndire
26d30 63 74 20 3d 20 28 62 49 6e 64 69 72 65 63 74 20  ct = (bIndirect 
26d40 26 26 20 70 45 78 69 73 74 2d 3e 62 49 6e 64 69  && pExist->bIndi
26d50 72 65 63 74 29 3b 0a 20 20 20 20 20 20 61 43 73  rect);.      aCs
26d60 72 20 3d 20 70 4e 65 77 2d 3e 61 52 65 63 6f 72  r = pNew->aRecor
26d70 64 20 3d 20 28 75 38 20 2a 29 26 70 4e 65 77 5b  d = (u8 *)&pNew[
26d80 31 5d 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  1];..      if( o
26d90 70 31 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  p1==SQLITE_INSER
26da0 54 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  T ){            
26db0 20 2f 2a 20 49 4e 53 45 52 54 20 2b 20 55 50 44   /* INSERT + UPD
26dc0 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ATE */.        u
26dd0 38 20 2a 61 31 20 3d 20 61 52 65 63 3b 0a 20 20  8 *a1 = aRec;.  
26de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
26df0 32 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  2==SQLITE_UPDATE
26e00 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
26e10 2d 3e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->op = SQLITE_IN
26e20 53 45 52 54 3b 0a 20 20 20 20 20 20 20 20 69 66  SERT;.        if
26e30 28 20 62 50 61 74 63 68 73 65 74 3d 3d 30 20 29  ( bPatchset==0 )
26e40 20 73 65 73 73 69 6f 6e 53 6b 69 70 52 65 63 6f   sessionSkipReco
26e50 72 64 28 26 61 31 2c 20 70 54 61 62 2d 3e 6e 43  rd(&a1, pTab->nC
26e60 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73  ol);.        ses
26e70 73 69 6f 6e 4d 65 72 67 65 52 65 63 6f 72 64 28  sionMergeRecord(
26e80 26 61 43 73 72 2c 20 70 54 61 62 2d 3e 6e 43 6f  &aCsr, pTab->nCo
26e90 6c 2c 20 61 45 78 69 73 74 2c 20 61 31 29 3b 0a  l, aExist, a1);.
26ea0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26eb0 6f 70 31 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45  op1==SQLITE_DELE
26ec0 54 45 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 44  TE ){       /* D
26ed0 45 4c 45 54 45 20 2b 20 49 4e 53 45 52 54 20 2a  ELETE + INSERT *
26ee0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26ef0 28 20 6f 70 32 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( op2==SQLITE_IN
26f00 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20 20 20  SERT );.        
26f10 70 4e 65 77 2d 3e 6f 70 20 3d 20 53 51 4c 49 54  pNew->op = SQLIT
26f20 45 5f 55 50 44 41 54 45 3b 0a 20 20 20 20 20 20  E_UPDATE;.      
26f30 20 20 69 66 28 20 62 50 61 74 63 68 73 65 74 20    if( bPatchset 
26f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
26f50 63 70 79 28 61 43 73 72 2c 20 61 52 65 63 2c 20  cpy(aCsr, aRec, 
26f60 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 20  nRec);.         
26f70 20 61 43 73 72 20 2b 3d 20 6e 52 65 63 3b 0a 20   aCsr += nRec;. 
26f80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26f90 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
26fa0 65 73 73 69 6f 6e 4d 65 72 67 65 55 70 64 61 74  essionMergeUpdat
26fb0 65 28 26 61 43 73 72 2c 20 70 54 61 62 2c 20 62  e(&aCsr, pTab, b
26fc0 50 61 74 63 68 73 65 74 2c 20 61 45 78 69 73 74  Patchset, aExist
26fd0 2c 20 30 2c 61 52 65 63 2c 30 29 20 29 7b 0a 20  , 0,aRec,0) ){. 
26fe0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26ff0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
27000 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
27010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
27020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27030 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 32 3d 3d   }else if( op2==
27040 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
27050 20 20 20 20 20 20 20 2f 2a 20 55 50 44 41 54 45         /* UPDATE
27060 20 2b 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20   + UPDATE */.   
27070 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20 61 45       u8 *a1 = aE
27080 78 69 73 74 3b 0a 20 20 20 20 20 20 20 20 75 38  xist;.        u8
27090 20 2a 61 32 20 3d 20 61 52 65 63 3b 0a 20 20 20   *a2 = aRec;.   
270a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 31       assert( op1
270b0 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
270c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
270d0 50 61 74 63 68 73 65 74 3d 3d 30 20 29 7b 0a 20  Patchset==0 ){. 
270e0 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e           session
270f0 53 6b 69 70 52 65 63 6f 72 64 28 26 61 31 2c 20  SkipRecord(&a1, 
27100 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20  pTab->nCol);.   
27110 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 53 6b         sessionSk
27120 69 70 52 65 63 6f 72 64 28 26 61 32 2c 20 70 54  ipRecord(&a2, pT
27130 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->nCol);.     
27140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
27150 77 2d 3e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 55  w->op = SQLITE_U
27160 50 44 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69  PDATE;.        i
27170 66 28 20 30 3d 3d 73 65 73 73 69 6f 6e 4d 65 72  f( 0==sessionMer
27180 67 65 55 70 64 61 74 65 28 26 61 43 73 72 2c 20  geUpdate(&aCsr, 
27190 70 54 61 62 2c 20 62 50 61 74 63 68 73 65 74 2c  pTab, bPatchset,
271a0 20 61 52 65 63 2c 20 61 45 78 69 73 74 2c 61 31   aRec, aExist,a1
271b0 2c 61 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ,a2) ){.        
271c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
271d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
271e0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  pNew = 0;.      
271f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 2f 2a 20 55 50 44 41 54 45 20 2b 20 44 45 4c 45  /* UPDATE + DELE
27230 54 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  TE */.        as
27240 73 65 72 74 28 20 6f 70 31 3d 3d 53 51 4c 49 54  sert( op1==SQLIT
27250 45 5f 55 50 44 41 54 45 20 26 26 20 6f 70 32 3d  E_UPDATE && op2=
27260 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
27270 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27280 6f 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 4c 45  op = SQLITE_DELE
27290 54 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  TE;.        if( 
272a0 62 50 61 74 63 68 73 65 74 20 29 7b 0a 20 20 20  bPatchset ){.   
272b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 43         memcpy(aC
272c0 73 72 2c 20 61 52 65 63 2c 20 6e 52 65 63 29 3b  sr, aRec, nRec);
272d0 0a 20 20 20 20 20 20 20 20 20 20 61 43 73 72 20  .          aCsr 
272e0 2b 3d 20 6e 52 65 63 3b 0a 20 20 20 20 20 20 20  += nRec;.       
272f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27300 20 20 73 65 73 73 69 6f 6e 4d 65 72 67 65 52 65    sessionMergeRe
27310 63 6f 72 64 28 26 61 43 73 72 2c 20 70 54 61 62  cord(&aCsr, pTab
27320 2d 3e 6e 43 6f 6c 2c 20 61 52 65 63 2c 20 61 45  ->nCol, aRec, aE
27330 78 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  xist);.        }
27340 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27350 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
27360 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 63 6f 72      pNew->nRecor
27370 64 20 3d 20 28 69 6e 74 29 28 61 43 73 72 20 2d  d = (int)(aCsr -
27380 20 70 4e 65 77 2d 3e 61 52 65 63 6f 72 64 29 3b   pNew->aRecord);
27390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
273a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 45 78 69  qlite3_free(pExi
273b0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  st);.    }.  }..
273c0 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 3b    *ppNew = pNew;
273d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
273e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 63  ./*.** Add all c
273f0 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68  hanges in the ch
27400 61 6e 67 65 73 65 74 20 74 72 61 76 65 72 73 65  angeset traverse
27410 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
27420 72 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  r passed as.** t
27430 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
27440 74 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 67  t to the changeg
27450 72 6f 75 70 20 68 61 73 68 20 74 61 62 6c 65 73  roup hash tables
27460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27470 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
27480 54 6f 48 61 73 68 28 0a 20 20 73 71 6c 69 74 65  ToHash(.  sqlite
27490 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
274a0 20 2a 70 49 74 65 72 2c 20 20 20 2f 2a 20 49 74   *pIter,   /* It
274b0 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 66  erator to read f
274c0 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rom */.  sqlite3
274d0 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 70 47  _changegroup *pG
274e0 72 70 2c 20 20 20 20 20 20 20 2f 2a 20 43 68 61  rp,       /* Cha
274f0 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20  ngegroup object 
27500 74 6f 20 61 64 64 20 63 68 61 6e 67 65 73 65 74  to add changeset
27510 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65   to */.  int bRe
27520 62 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20  base            
27530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27540 65 20 69 66 20 68 61 73 68 20 74 61 62 6c 65 20  e if hash table 
27550 69 73 20 66 6f 72 20 72 65 62 61 73 69 6e 67 20  is for rebasing 
27560 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65 63  */.){.  u8 *aRec
27570 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20 20  ;.  int nRec;.  
27580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27590 4f 4b 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61 62  OK;.  SessionTab
275a0 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 0a 20  le *pTab = 0;.. 
275b0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
275c0 4f 57 3d 3d 73 65 73 73 69 6f 6e 43 68 61 6e 67  OW==sessionChang
275d0 65 73 65 74 4e 65 78 74 28 70 49 74 65 72 2c 20  esetNext(pIter, 
275e0 26 61 52 65 63 2c 20 26 6e 52 65 63 2c 20 30 29  &aRec, &nRec, 0)
275f0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
27600 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 69 6e  ar *zNew;.    in
27610 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  t nCol;.    int 
27620 6f 70 3b 0a 20 20 20 20 69 6e 74 20 69 48 61 73  op;.    int iHas
27630 68 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 64 69  h;.    int bIndi
27640 72 65 63 74 3b 0a 20 20 20 20 53 65 73 73 69 6f  rect;.    Sessio
27650 6e 43 68 61 6e 67 65 20 2a 70 43 68 61 6e 67 65  nChange *pChange
27660 3b 0a 20 20 20 20 53 65 73 73 69 6f 6e 43 68 61  ;.    SessionCha
27670 6e 67 65 20 2a 70 45 78 69 73 74 20 3d 20 30 3b  nge *pExist = 0;
27680 0a 20 20 20 20 53 65 73 73 69 6f 6e 43 68 61 6e  .    SessionChan
27690 67 65 20 2a 2a 70 70 3b 0a 0a 20 20 20 20 69 66  ge **pp;..    if
276a0 28 20 70 47 72 70 2d 3e 70 4c 69 73 74 3d 3d 30  ( pGrp->pList==0
276b0 20 29 7b 0a 20 20 20 20 20 20 70 47 72 70 2d 3e   ){.      pGrp->
276c0 62 50 61 74 63 68 20 3d 20 70 49 74 65 72 2d 3e  bPatch = pIter->
276d0 62 50 61 74 63 68 73 65 74 3b 0a 20 20 20 20 7d  bPatchset;.    }
276e0 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
276f0 62 50 61 74 63 68 73 65 74 21 3d 70 47 72 70 2d  bPatchset!=pGrp-
27700 3e 62 50 61 74 63 68 20 29 7b 0a 20 20 20 20 20  >bPatch ){.     
27710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
27720 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
27730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
27740 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28  te3changeset_op(
27750 70 49 74 65 72 2c 20 26 7a 4e 65 77 2c 20 26 6e  pIter, &zNew, &n
27760 43 6f 6c 2c 20 26 6f 70 2c 20 26 62 49 6e 64 69  Col, &op, &bIndi
27770 72 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 21  rect);.    if( !
27780 70 54 61 62 20 7c 7c 20 73 71 6c 69 74 65 33 5f  pTab || sqlite3_
27790 73 74 72 69 63 6d 70 28 7a 4e 65 77 2c 20 70 54  stricmp(zNew, pT
277a0 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  ab->zName) ){.  
277b0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
277c0 65 20 6c 69 73 74 20 66 6f 72 20 61 20 6d 61 74  e list for a mat
277d0 63 68 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  ching table */. 
277e0 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
277f0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 65 77  (int)strlen(zNew
27800 29 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 62 50  );.      u8 *abP
27810 4b 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  K;..      sqlite
27820 33 63 68 61 6e 67 65 73 65 74 5f 70 6b 28 70 49  3changeset_pk(pI
27830 74 65 72 2c 20 26 61 62 50 4b 2c 20 30 29 3b 0a  ter, &abPK, 0);.
27840 20 20 20 20 20 20 66 6f 72 28 70 54 61 62 20 3d        for(pTab =
27850 20 70 47 72 70 2d 3e 70 4c 69 73 74 3b 20 70 54   pGrp->pList; pT
27860 61 62 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e 70  ab; pTab=pTab->p
27870 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
27880 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
27890 72 6e 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rnicmp(pTab->zNa
278a0 6d 65 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 2b 31  me, zNew, nNew+1
278b0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
278c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 54   }.      if( !pT
278d0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ab ){.        Se
278e0 73 73 69 6f 6e 54 61 62 6c 65 20 2a 2a 70 70 54  ssionTable **ppT
278f0 61 62 3b 0a 0a 20 20 20 20 20 20 20 20 70 54 61  ab;..        pTa
27900 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  b = sqlite3_mall
27910 6f 63 36 34 28 73 69 7a 65 6f 66 28 53 65 73 73  oc64(sizeof(Sess
27920 69 6f 6e 54 61 62 6c 65 29 20 2b 20 6e 43 6f 6c  ionTable) + nCol
27930 20 2b 20 6e 4e 65 77 2b 31 29 3b 0a 20 20 20 20   + nNew+1);.    
27940 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 7b      if( !pTab ){
27950 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27970 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27990 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c   memset(pTab, 0,
279a0 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 54   sizeof(SessionT
279b0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
279c0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
279d0 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  l;.        pTab-
279e0 3e 61 62 50 4b 20 3d 20 28 75 38 2a 29 26 70 54  >abPK = (u8*)&pT
279f0 61 62 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ab[1];.        m
27a00 65 6d 63 70 79 28 70 54 61 62 2d 3e 61 62 50 4b  emcpy(pTab->abPK
27a10 2c 20 61 62 50 4b 2c 20 6e 43 6f 6c 29 3b 0a 20  , abPK, nCol);. 
27a20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
27a30 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 54 61  me = (char*)&pTa
27a40 62 2d 3e 61 62 50 4b 5b 6e 43 6f 6c 5d 3b 0a 20  b->abPK[nCol];. 
27a50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
27a60 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 2c  ab->zName, zNew,
27a70 20 6e 4e 65 77 2b 31 29 3b 0a 0a 20 20 20 20 20   nNew+1);..     
27a80 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 62     /* The new ob
27a90 6a 65 63 74 20 6d 75 73 74 20 62 65 20 6c 69 6e  ject must be lin
27aa0 6b 65 64 20 6f 6e 20 74 6f 20 74 68 65 20 65 6e  ked on to the en
27ab0 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2c 20 6e  d of the list, n
27ac0 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ot.        ** si
27ad0 6d 70 6c 79 20 61 64 64 65 64 20 74 6f 20 74 68  mply added to th
27ae0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 54  e start of it. T
27af0 68 69 73 20 69 73 20 74 6f 20 65 6e 73 75 72 65  his is to ensure
27b00 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
27b10 20 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 74 68    ** tables with
27b20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  in the output of
27b30 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
27b40 6f 75 70 5f 6f 75 74 70 75 74 28 29 20 61 72 65  oup_output() are
27b50 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   in .        ** 
27b60 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 2e  the right order.
27b70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
27b80 28 70 70 54 61 62 3d 26 70 47 72 70 2d 3e 70 4c  (ppTab=&pGrp->pL
27b90 69 73 74 3b 20 2a 70 70 54 61 62 3b 20 70 70 54  ist; *ppTab; ppT
27ba0 61 62 3d 26 28 2a 70 70 54 61 62 29 2d 3e 70 4e  ab=&(*ppTab)->pN
27bb0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ext);.        *p
27bc0 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
27bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
27be0 62 2d 3e 6e 43 6f 6c 21 3d 6e 43 6f 6c 20 7c 7c  b->nCol!=nCol ||
27bf0 20 6d 65 6d 63 6d 70 28 70 54 61 62 2d 3e 61 62   memcmp(pTab->ab
27c00 50 4b 2c 20 61 62 50 4b 2c 20 6e 43 6f 6c 29 20  PK, abPK, nCol) 
27c10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27c20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20  SQLITE_SCHEMA;. 
27c30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
27c50 20 69 66 28 20 73 65 73 73 69 6f 6e 47 72 6f 77   if( sessionGrow
27c60 48 61 73 68 28 70 49 74 65 72 2d 3e 62 50 61 74  Hash(pIter->bPat
27c70 63 68 73 65 74 2c 20 70 54 61 62 29 20 29 7b 0a  chset, pTab) ){.
27c80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27c90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62  E_NOMEM;.      b
27ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27cb0 69 48 61 73 68 20 3d 20 73 65 73 73 69 6f 6e 43  iHash = sessionC
27cc0 68 61 6e 67 65 48 61 73 68 28 0a 20 20 20 20 20  hangeHash(.     
27cd0 20 20 20 70 54 61 62 2c 20 28 70 49 74 65 72 2d     pTab, (pIter-
27ce0 3e 62 50 61 74 63 68 73 65 74 20 26 26 20 6f 70  >bPatchset && op
27cf0 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 29  ==SQLITE_DELETE)
27d00 2c 20 61 52 65 63 2c 20 70 54 61 62 2d 3e 6e 43  , aRec, pTab->nC
27d10 68 61 6e 67 65 0a 20 20 20 20 29 3b 0a 0a 20 20  hange.    );..  
27d20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
27d30 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 20  existing entry. 
27d40 49 66 20 66 6f 75 6e 64 2c 20 72 65 6d 6f 76 65  If found, remove
27d50 20 69 74 20 66 72 6f 6d 20 74 68 65 20 68 61 73   it from the has
27d60 68 20 74 61 62 6c 65 2e 20 0a 20 20 20 20 2a 2a  h table. .    **
27d70 20 43 6f 64 65 20 62 65 6c 6f 77 20 6d 61 79 20   Code below may 
27d80 6c 69 6e 6b 20 69 74 20 62 61 63 6b 20 69 6e 2e  link it back in.
27d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
27da0 70 70 3d 26 70 54 61 62 2d 3e 61 70 43 68 61 6e  pp=&pTab->apChan
27db0 67 65 5b 69 48 61 73 68 5d 3b 20 2a 70 70 3b 20  ge[iHash]; *pp; 
27dc0 70 70 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74  pp=&(*pp)->pNext
27dd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50 6b  ){.      int bPk
27de0 4f 6e 6c 79 31 20 3d 20 30 3b 0a 20 20 20 20 20  Only1 = 0;.     
27df0 20 69 6e 74 20 62 50 6b 4f 6e 6c 79 32 20 3d 20   int bPkOnly2 = 
27e00 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  0;.      if( pIt
27e10 65 72 2d 3e 62 50 61 74 63 68 73 65 74 20 29 7b  er->bPatchset ){
27e20 0a 20 20 20 20 20 20 20 20 62 50 6b 4f 6e 6c 79  .        bPkOnly
27e30 31 20 3d 20 28 2a 70 70 29 2d 3e 6f 70 3d 3d 53  1 = (*pp)->op==S
27e40 51 4c 49 54 45 5f 44 45 4c 45 54 45 3b 0a 20 20  QLITE_DELETE;.  
27e50 20 20 20 20 20 20 62 50 6b 4f 6e 6c 79 32 20 3d        bPkOnly2 =
27e60 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
27e70 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
27e80 20 20 69 66 28 20 73 65 73 73 69 6f 6e 43 68 61    if( sessionCha
27e90 6e 67 65 45 71 75 61 6c 28 70 54 61 62 2c 20 62  ngeEqual(pTab, b
27ea0 50 6b 4f 6e 6c 79 31 2c 20 28 2a 70 70 29 2d 3e  PkOnly1, (*pp)->
27eb0 61 52 65 63 6f 72 64 2c 20 62 50 6b 4f 6e 6c 79  aRecord, bPkOnly
27ec0 32 2c 20 61 52 65 63 29 20 29 7b 0a 20 20 20 20  2, aRec) ){.    
27ed0 20 20 20 20 70 45 78 69 73 74 20 3d 20 2a 70 70      pExist = *pp
27ee0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  ;.        *pp = 
27ef0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20  (*pp)->pNext;.  
27f00 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 45 6e 74        pTab->nEnt
27f10 72 79 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 72  ry--;.        br
27f20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
27f30 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 65 73   }..    rc = ses
27f40 73 69 6f 6e 43 68 61 6e 67 65 4d 65 72 67 65 28  sionChangeMerge(
27f50 70 54 61 62 2c 20 62 52 65 62 61 73 65 2c 20 0a  pTab, bRebase, .
27f60 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
27f70 50 61 74 63 68 73 65 74 2c 20 70 45 78 69 73 74  Patchset, pExist
27f80 2c 20 6f 70 2c 20 62 49 6e 64 69 72 65 63 74 2c  , op, bIndirect,
27f90 20 61 52 65 63 2c 20 6e 52 65 63 2c 20 26 70 43   aRec, nRec, &pC
27fa0 68 61 6e 67 65 0a 20 20 20 20 29 3b 0a 20 20 20  hange.    );.   
27fb0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
27fc0 0a 20 20 20 20 69 66 28 20 70 43 68 61 6e 67 65  .    if( pChange
27fd0 20 29 7b 0a 20 20 20 20 20 20 70 43 68 61 6e 67   ){.      pChang
27fe0 65 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  e->pNext = pTab-
27ff0 3e 61 70 43 68 61 6e 67 65 5b 69 48 61 73 68 5d  >apChange[iHash]
28000 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 70  ;.      pTab->ap
28010 43 68 61 6e 67 65 5b 69 48 61 73 68 5d 20 3d 20  Change[iHash] = 
28020 70 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 70  pChange;.      p
28030 54 61 62 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 20  Tab->nEntry++;. 
28040 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
28050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
28060 72 63 20 3d 20 70 49 74 65 72 2d 3e 72 63 3b 0a  rc = pIter->rc;.
28070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28080 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20  /*.** Serialize 
28090 61 20 63 68 61 6e 67 65 73 65 74 20 28 6f 72 20  a changeset (or 
280a0 70 61 74 63 68 73 65 74 29 20 62 61 73 65 64 20  patchset) based 
280b0 6f 6e 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  on all changeset
280c0 73 20 28 6f 72 20 70 61 74 63 68 73 65 74 73 29  s (or patchsets)
280d0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
280e0 20 63 68 61 6e 67 65 67 72 6f 75 70 20 6f 62 6a   changegroup obj
280f0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
28100 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
28110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 78 4f 75 74 70  ..**.** If xOutp
28120 75 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ut is not NULL, 
28130 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 73  then the changes
28140 65 74 2f 70 61 74 63 68 73 65 74 20 69 73 20 72  et/patchset is r
28150 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 0a 2a  eturned to the.*
28160 2a 20 75 73 65 72 20 76 69 61 20 6f 6e 65 20 6f  * user via one o
28170 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
28180 78 4f 75 74 70 75 74 2c 20 61 73 20 77 69 74 68  xOutput, as with
28190 20 74 68 65 20 6f 74 68 65 72 20 73 74 72 65 61   the other strea
281a0 6d 69 6e 67 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ming.** interfac
281b0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  es. .**.** Or, i
281c0 66 20 78 4f 75 74 70 75 74 20 69 73 20 4e 55 4c  f xOutput is NUL
281d0 4c 2c 20 74 68 65 6e 20 28 2a 70 70 4f 75 74 29  L, then (*ppOut)
281e0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
281f0 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
28200 61 0a 2a 2a 20 62 75 66 66 65 72 20 63 6f 6e 74  a.** buffer cont
28210 61 69 6e 69 6e 67 20 74 68 65 20 6f 75 74 70 75  aining the outpu
28220 74 20 63 68 61 6e 67 65 73 65 74 20 62 65 66 6f  t changeset befo
28230 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
28240 20 72 65 74 75 72 6e 73 2e 20 49 6e 0a 2a 2a 20   returns. In.** 
28250 74 68 69 73 20 63 61 73 65 20 28 2a 70 6e 4f 75  this case (*pnOu
28260 74 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  t) is set to the
28270 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74   size of the out
28280 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
28290 74 65 73 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68  tes. It.** is th
282a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
282b0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
282c0 6f 20 66 72 65 65 20 74 68 65 20 6f 75 74 70 75  o free the outpu
282d0 74 20 62 75 66 66 65 72 20 75 73 69 6e 67 0a 2a  t buffer using.*
282e0 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
282f0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 6f 20 6c   when it is no l
28300 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
28310 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
28320 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
28330 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
28340 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
28350 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  rs, an SQLite.**
28360 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
28370 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28380 61 6e 64 20 78 4f 75 74 70 75 74 20 69 73 20 4e  and xOutput is N
28390 55 4c 4c 2c 20 28 2a 70 70 4f 75 74 29 20 61 6e  ULL, (*ppOut) an
283a0 64 20 28 2a 70 6e 4f 75 74 29 0a 2a 2a 20 61 72  d (*pnOut).** ar
283b0 65 20 62 6f 74 68 20 73 65 74 20 74 6f 20 30 20  e both set to 0 
283c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
283d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
283e0 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 67 72 6f  sessionChangegro
283f0 75 70 4f 75 74 70 75 74 28 0a 20 20 73 71 6c 69  upOutput(.  sqli
28400 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20  te3_changegroup 
28410 2a 70 47 72 70 2c 0a 20 20 69 6e 74 20 28 2a 78  *pGrp,.  int (*x
28420 4f 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f  Output)(void *pO
28430 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
28440 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
28450 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 2c  ),.  void *pOut,
28460 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 0a 20  .  int *pnOut,. 
28470 20 76 6f 69 64 20 2a 2a 70 70 4f 75 74 0a 29 7b   void **ppOut.){
28480 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28490 54 45 5f 4f 4b 3b 0a 20 20 53 65 73 73 69 6f 6e  TE_OK;.  Session
284a0 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c  Buffer buf = {0,
284b0 20 30 2c 20 30 7d 3b 0a 20 20 53 65 73 73 69 6f   0, 0};.  Sessio
284c0 6e 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20  nTable *pTab;.  
284d0 61 73 73 65 72 74 28 20 78 4f 75 74 70 75 74 3d  assert( xOutput=
284e0 3d 30 20 7c 7c 20 28 70 70 4f 75 74 3d 3d 30 20  =0 || (ppOut==0 
284f0 26 26 20 70 6e 4f 75 74 3d 3d 30 29 20 29 3b 0a  && pnOut==0) );.
28500 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
28510 20 73 65 72 69 61 6c 69 7a 65 64 20 6f 75 74 70   serialized outp
28520 75 74 20 63 68 61 6e 67 65 73 65 74 20 62 61 73  ut changeset bas
28530 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
28540 74 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 68  ts of the.  ** h
28550 61 73 68 20 74 61 62 6c 65 73 20 61 74 74 61 63  ash tables attac
28560 68 65 64 20 74 6f 20 74 68 65 20 53 65 73 73 69  hed to the Sessi
28570 6f 6e 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  onTable objects 
28580 69 6e 20 6c 69 73 74 20 70 2d 3e 70 4c 69 73 74  in list p->pList
28590 2e 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  . .  */.  for(pT
285a0 61 62 3d 70 47 72 70 2d 3e 70 4c 69 73 74 3b 20  ab=pGrp->pList; 
285b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
285c0 20 70 54 61 62 3b 20 70 54 61 62 3d 70 54 61 62   pTab; pTab=pTab
285d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
285e0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 70 54 61  t i;.    if( pTa
285f0 62 2d 3e 6e 45 6e 74 72 79 3d 3d 30 20 29 20 63  b->nEntry==0 ) c
28600 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 73 65  ontinue;..    se
28610 73 73 69 6f 6e 41 70 70 65 6e 64 54 61 62 6c 65  ssionAppendTable
28620 48 64 72 28 26 62 75 66 2c 20 70 47 72 70 2d 3e  Hdr(&buf, pGrp->
28630 62 50 61 74 63 68 2c 20 70 54 61 62 2c 20 26 72  bPatch, pTab, &r
28640 63 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  c);.    for(i=0;
28650 20 69 3c 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65   i<pTab->nChange
28660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53 65  ; i++){.      Se
28670 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 3b 0a  ssionChange *p;.
28680 20 20 20 20 20 20 66 6f 72 28 70 3d 70 54 61 62        for(p=pTab
28690 2d 3e 61 70 43 68 61 6e 67 65 5b 69 5d 3b 20 70  ->apChange[i]; p
286a0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
286b0 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
286c0 70 65 6e 64 42 79 74 65 28 26 62 75 66 2c 20 70  pendByte(&buf, p
286d0 2d 3e 6f 70 2c 20 26 72 63 29 3b 0a 20 20 20 20  ->op, &rc);.    
286e0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
286f0 64 42 79 74 65 28 26 62 75 66 2c 20 70 2d 3e 62  dByte(&buf, p->b
28700 49 6e 64 69 72 65 63 74 2c 20 26 72 63 29 3b 0a  Indirect, &rc);.
28710 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
28720 70 70 65 6e 64 42 6c 6f 62 28 26 62 75 66 2c 20  ppendBlob(&buf, 
28730 70 2d 3e 61 52 65 63 6f 72 64 2c 20 70 2d 3e 6e  p->aRecord, p->n
28740 52 65 63 6f 72 64 2c 20 26 72 63 29 3b 0a 20 20  Record, &rc);.  
28750 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28760 4c 49 54 45 5f 4f 4b 20 26 26 20 78 4f 75 74 70  LITE_OK && xOutp
28770 75 74 20 26 26 20 62 75 66 2e 6e 42 75 66 3e 3d  ut && buf.nBuf>=
28780 73 65 73 73 69 6f 6e 73 5f 73 74 72 6d 5f 63 68  sessions_strm_ch
28790 75 6e 6b 5f 73 69 7a 65 20 29 7b 0a 20 20 20 20  unk_size ){.    
287a0 20 20 20 20 20 20 72 63 20 3d 20 78 4f 75 74 70        rc = xOutp
287b0 75 74 28 70 4f 75 74 2c 20 62 75 66 2e 61 42 75  ut(pOut, buf.aBu
287c0 66 2c 20 62 75 66 2e 6e 42 75 66 29 3b 0a 20 20  f, buf.nBuf);.  
287d0 20 20 20 20 20 20 20 20 62 75 66 2e 6e 42 75 66          buf.nBuf
287e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
287f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28800 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28820 28 20 78 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  ( xOutput ){.   
28830 20 20 20 69 66 28 20 62 75 66 2e 6e 42 75 66 3e     if( buf.nBuf>
28840 30 20 29 20 72 63 20 3d 20 78 4f 75 74 70 75 74  0 ) rc = xOutput
28850 28 70 4f 75 74 2c 20 62 75 66 2e 61 42 75 66 2c  (pOut, buf.aBuf,
28860 20 62 75 66 2e 6e 42 75 66 29 3b 0a 20 20 20 20   buf.nBuf);.    
28870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
28880 4f 75 74 20 3d 20 62 75 66 2e 61 42 75 66 3b 0a  Out = buf.aBuf;.
28890 20 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 62        *pnOut = b
288a0 75 66 2e 6e 42 75 66 3b 0a 20 20 20 20 20 20 62  uf.nBuf;.      b
288b0 75 66 2e 61 42 75 66 20 3d 20 30 3b 0a 20 20 20  uf.aBuf = 0;.   
288c0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
288d0 5f 66 72 65 65 28 62 75 66 2e 61 42 75 66 29 3b  _free(buf.aBuf);
288e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
288f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
28900 20 61 20 6e 65 77 2c 20 65 6d 70 74 79 2c 20 73   a new, empty, s
28910 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
28920 75 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  up..*/.int sqlit
28930 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65  e3changegroup_ne
28940 77 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  w(sqlite3_change
28950 67 72 6f 75 70 20 2a 2a 70 70 29 7b 0a 20 20 69  group **pp){.  i
28960 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28970 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
28980 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28990 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
289a0 65 67 72 6f 75 70 20 2a 70 3b 20 20 20 20 20 20  egroup *p;      
289b0 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
289c0 20 2a 2f 0a 20 20 70 20 3d 20 28 73 71 6c 69 74   */.  p = (sqlit
289d0 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 2a 29  e3_changegroup*)
289e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
289f0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 63 68  izeof(sqlite3_ch
28a00 61 6e 67 65 67 72 6f 75 70 29 29 3b 0a 20 20 69  angegroup));.  i
28a10 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( p==0 ){.    r
28a20 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
28a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
28a40 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
28a50 6f 66 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  of(sqlite3_chang
28a60 65 67 72 6f 75 70 29 29 3b 0a 20 20 7d 0a 20 20  egroup));.  }.  
28a70 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72  *pp = p;.  retur
28a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
28a90 64 64 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  dd the changeset
28aa0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
28ab0 64 20 69 6e 20 62 75 66 66 65 72 20 70 44 61 74  d in buffer pDat
28ac0 61 2c 20 73 69 7a 65 20 6e 44 61 74 61 20 62 79  a, size nData by
28ad0 74 65 73 2c 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  tes,.** to chang
28ae0 65 73 65 74 2d 67 72 6f 75 70 20 70 2e 0a 2a 2f  eset-group p..*/
28af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
28b00 67 65 67 72 6f 75 70 5f 61 64 64 28 73 71 6c 69  gegroup_add(sqli
28b10 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20  te3_changegroup 
28b20 2a 70 47 72 70 2c 20 69 6e 74 20 6e 44 61 74 61  *pGrp, int nData
28b30 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
28b40 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65    sqlite3_change
28b50 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 3b  set_iter *pIter;
28b60 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 70    /* Iterator op
28b70 65 6e 65 64 20 6f 6e 20 70 44 61 74 61 2f 6e 44  ened on pData/nD
28b80 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ata */.  int rc;
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28bb0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
28bc0 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
28bd0 73 65 74 5f 73 74 61 72 74 28 26 70 49 74 65 72  set_start(&pIter
28be0 2c 20 6e 44 61 74 61 2c 20 70 44 61 74 61 29 3b  , nData, pData);
28bf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
28c10 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65   sessionChangese
28c20 74 54 6f 48 61 73 68 28 70 49 74 65 72 2c 20 70  tToHash(pIter, p
28c30 47 72 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  Grp, 0);.  }.  s
28c40 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
28c50 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b  finalize(pIter);
28c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28c70 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
28c80 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
28c90 67 20 61 20 63 68 61 6e 67 65 73 65 74 20 72 65  g a changeset re
28ca0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 63  presenting the c
28cb0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 2a 2a 20  oncatenation.** 
28cc0 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  of all changeset
28cd0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  s added to the g
28ce0 72 6f 75 70 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a  roup so far..*/.
28cf0 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
28d00 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 0a 20  egroup_output(. 
28d10 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67     sqlite3_chang
28d20 65 67 72 6f 75 70 20 2a 70 47 72 70 2c 0a 20 20  egroup *pGrp,.  
28d30 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 2c 0a 20    int *pnData,. 
28d40 20 20 20 76 6f 69 64 20 2a 2a 70 70 44 61 74 61     void **ppData
28d50 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 73  .){.  return ses
28d60 73 69 6f 6e 43 68 61 6e 67 65 67 72 6f 75 70 4f  sionChangegroupO
28d70 75 74 70 75 74 28 70 47 72 70 2c 20 30 2c 20 30  utput(pGrp, 0, 0
28d80 2c 20 70 6e 44 61 74 61 2c 20 70 70 44 61 74 61  , pnData, ppData
28d90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 65  );.}../*.** Stre
28da0 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f  aming versions o
28db0 66 20 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  f changegroup_ad
28dc0 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
28dd0 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61  te3changegroup_a
28de0 64 64 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74  dd_strm(.  sqlit
28df0 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a  e3_changegroup *
28e00 70 47 72 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49  pGrp,.  int (*xI
28e10 6e 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c  nput)(void *pIn,
28e20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
28e30 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
28e40 69 64 20 2a 70 49 6e 0a 29 7b 0a 20 20 73 71 6c  id *pIn.){.  sql
28e50 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
28e60 74 65 72 20 2a 70 49 74 65 72 3b 20 20 2f 2a 20  ter *pIter;  /* 
28e70 49 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  Iterator opened 
28e80 6f 6e 20 70 44 61 74 61 2f 6e 44 61 74 61 20 2a  on pData/nData *
28e90 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28ec0 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71  de */..  rc = sq
28ed0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
28ee0 74 61 72 74 5f 73 74 72 6d 28 26 70 49 74 65 72  tart_strm(&pIter
28ef0 2c 20 78 49 6e 70 75 74 2c 20 70 49 6e 29 3b 0a  , xInput, pIn);.
28f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
28f20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
28f30 54 6f 48 61 73 68 28 70 49 74 65 72 2c 20 70 47  ToHash(pIter, pG
28f40 72 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  rp, 0);.  }.  sq
28f50 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66  lite3changeset_f
28f60 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a  inalize(pIter);.
28f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28f80 2f 2a 0a 2a 2a 20 53 74 72 65 61 6d 69 6e 67 20  /*.** Streaming 
28f90 76 65 72 73 69 6f 6e 73 20 6f 66 20 63 68 61 6e  versions of chan
28fa0 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 29  gegroup_output()
28fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28fc0 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70  changegroup_outp
28fd0 75 74 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74  ut_strm(.  sqlit
28fe0 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a  e3_changegroup *
28ff0 70 47 72 70 2c 0a 20 20 69 6e 74 20 28 2a 78 4f  pGrp,.  int (*xO
29000 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
29010 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
29020 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
29030 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a  , .  void *pOut.
29040 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 73 73  ){.  return sess
29050 69 6f 6e 43 68 61 6e 67 65 67 72 6f 75 70 4f 75  ionChangegroupOu
29060 74 70 75 74 28 70 47 72 70 2c 20 78 4f 75 74 70  tput(pGrp, xOutp
29070 75 74 2c 20 70 4f 75 74 2c 20 30 2c 20 30 29 3b  ut, pOut, 0, 0);
29080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
29090 20 61 20 63 68 61 6e 67 65 67 72 6f 75 70 20 6f   a changegroup o
290a0 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
290b0 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
290c0 70 5f 64 65 6c 65 74 65 28 73 71 6c 69 74 65 33  p_delete(sqlite3
290d0 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 70 47  _changegroup *pG
290e0 72 70 29 7b 0a 20 20 69 66 28 20 70 47 72 70 20  rp){.  if( pGrp 
290f0 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 44 65  ){.    sessionDe
29100 6c 65 74 65 54 61 62 6c 65 28 70 47 72 70 2d 3e  leteTable(pGrp->
29110 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  pList);.    sqli
29120 74 65 33 5f 66 72 65 65 28 70 47 72 70 29 3b 0a  te3_free(pGrp);.
29130 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f    }.}../* .** Co
29140 6d 62 69 6e 65 20 74 77 6f 20 63 68 61 6e 67 65  mbine two change
29150 73 65 74 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  sets together..*
29160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
29170 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 28 0a 20  ngeset_concat(. 
29180 20 69 6e 74 20 6e 4c 65 66 74 2c 20 20 20 20 20   int nLeft,     
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
291b0 74 65 73 20 69 6e 20 6c 68 73 20 69 6e 70 75 74  tes in lhs input
291c0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4c 65 66   */.  void *pLef
291d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
291e0 20 20 20 20 20 20 2f 2a 20 4c 68 73 20 69 6e 70        /* Lhs inp
291f0 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ut changeset */.
29200 20 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20    int nRight    
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
29230 79 74 65 73 20 69 6e 20 72 68 73 20 69 6e 70 75  ytes in rhs inpu
29240 74 20 2a 2f 2c 0a 20 20 76 6f 69 64 20 2a 70 52  t */,.  void *pR
29250 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
29260 20 20 20 20 20 20 20 20 2f 2a 20 52 68 73 20 69          /* Rhs i
29270 6e 70 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a  nput changeset *
29280 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20  /.  int *pnOut, 
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
292b0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6f  er of bytes in o
292c0 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74 20  utput changeset 
292d0 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4f 75  */.  void **ppOu
292e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
292f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 63 68 61       /* OUT: cha
29300 6e 67 65 73 65 74 20 28 6c 65 66 74 20 3c 63 6f  ngeset (left <co
29310 6e 63 61 74 3e 20 72 69 67 68 74 29 20 2a 2f 0a  ncat> right) */.
29320 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  ){.  sqlite3_cha
29330 6e 67 65 67 72 6f 75 70 20 2a 70 47 72 70 3b 0a  ngegroup *pGrp;.
29340 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
29350 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  = sqlite3changeg
29360 72 6f 75 70 5f 6e 65 77 28 26 70 47 72 70 29 3b  roup_new(&pGrp);
29370 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
29390 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
293a0 6f 75 70 5f 61 64 64 28 70 47 72 70 2c 20 6e 4c  oup_add(pGrp, nL
293b0 65 66 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  eft, pLeft);.  }
293c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
293d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
293e0 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
293f0 6f 75 70 5f 61 64 64 28 70 47 72 70 2c 20 6e 52  oup_add(pGrp, nR
29400 69 67 68 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  ight, pRight);. 
29410 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
29420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
29430 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
29440 67 72 6f 75 70 5f 6f 75 74 70 75 74 28 70 47 72  group_output(pGr
29450 70 2c 20 70 6e 4f 75 74 2c 20 70 70 4f 75 74 29  p, pnOut, ppOut)
29460 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 63  ;.  }.  sqlite3c
29470 68 61 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65 74  hangegroup_delet
29480 65 28 70 47 72 70 29 3b 0a 0a 20 20 72 65 74 75  e(pGrp);..  retu
29490 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
294a0 53 74 72 65 61 6d 69 6e 67 20 76 65 72 73 69 6f  Streaming versio
294b0 6e 20 6f 66 20 73 71 6c 69 74 65 33 63 68 61 6e  n of sqlite3chan
294c0 67 65 73 65 74 5f 63 6f 6e 63 61 74 28 29 2e 0a  geset_concat()..
294d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
294e0 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 5f 73  angeset_concat_s
294f0 74 72 6d 28 0a 20 20 69 6e 74 20 28 2a 78 49 6e  trm(.  int (*xIn
29500 70 75 74 41 29 28 76 6f 69 64 20 2a 70 49 6e 2c  putA)(void *pIn,
29510 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
29520 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f  t *pnData),.  vo
29530 69 64 20 2a 70 49 6e 41 2c 0a 20 20 69 6e 74 20  id *pInA,.  int 
29540 28 2a 78 49 6e 70 75 74 42 29 28 76 6f 69 64 20  (*xInputB)(void 
29550 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74  *pIn, void *pDat
29560 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c  a, int *pnData),
29570 0a 20 20 76 6f 69 64 20 2a 70 49 6e 42 2c 0a 20  .  void *pInB,. 
29580 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28   int (*xOutput)(
29590 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73  void *pOut, cons
295a0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
295b0 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69  nt nData),.  voi
295c0 64 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 73 71 6c  d *pOut.){.  sql
295d0 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70  ite3_changegroup
295e0 20 2a 70 47 72 70 3b 0a 20 20 69 6e 74 20 72 63   *pGrp;.  int rc
295f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
29600 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77  3changegroup_new
29610 28 26 70 47 72 70 29 3b 0a 20 20 69 66 28 20 72  (&pGrp);.  if( r
29620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29640 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 5f  changegroup_add_
29650 73 74 72 6d 28 70 47 72 70 2c 20 78 49 6e 70 75  strm(pGrp, xInpu
29660 74 41 2c 20 70 49 6e 41 29 3b 0a 20 20 7d 0a 20  tA, pInA);.  }. 
29670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29680 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
29690 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
296a0 70 5f 61 64 64 5f 73 74 72 6d 28 70 47 72 70 2c  p_add_strm(pGrp,
296b0 20 78 49 6e 70 75 74 42 2c 20 70 49 6e 42 29 3b   xInputB, pInB);
296c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
296d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
296e0 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
296f0 67 65 67 72 6f 75 70 5f 6f 75 74 70 75 74 5f 73  gegroup_output_s
29700 74 72 6d 28 70 47 72 70 2c 20 78 4f 75 74 70 75  trm(pGrp, xOutpu
29710 74 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  t, pOut);.  }.  
29720 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
29730 75 70 5f 64 65 6c 65 74 65 28 70 47 72 70 29 3b  up_delete(pGrp);
29740 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29750 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 65  ../*.** Changese
29760 74 20 72 65 62 61 73 65 72 20 68 61 6e 64 6c 65  t rebaser handle
29770 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69  ..*/.struct sqli
29780 74 65 33 5f 72 65 62 61 73 65 72 20 7b 0a 20 20  te3_rebaser {.  
29790 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72  sqlite3_changegr
297a0 6f 75 70 20 67 72 70 3b 20 20 20 20 20 20 20 20  oup grp;        
297b0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 2a 2f  /* Hash table */
297c0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
297d0 72 73 20 61 31 20 61 6e 64 20 61 32 20 6d 75 73  rs a1 and a2 mus
297e0 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 61  t both contain a
297f0 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65   sessions module
29800 20 72 65 63 6f 72 64 20 6e 43 6f 6c 0a 2a 2a 20   record nCol.** 
29810 66 69 65 6c 64 73 20 69 6e 20 73 69 7a 65 2e 20  fields in size. 
29820 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
29830 70 65 6e 64 73 20 61 6e 20 6e 43 6f 6c 20 73 65  pends an nCol se
29840 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 20 0a 2a  ssions module .*
29850 2a 20 72 65 63 6f 72 64 20 74 6f 20 62 75 66 66  * record to buff
29860 65 72 20 70 42 75 66 20 74 68 61 74 20 69 73 20  er pBuf that is 
29870 61 20 63 6f 70 79 20 6f 66 20 61 31 2c 20 65 78  a copy of a1, ex
29880 63 65 70 74 20 74 68 61 74 20 66 6f 72 0a 2a 2a  cept that for.**
29890 20 65 61 63 68 20 66 69 65 6c 64 20 74 68 61 74   each field that
298a0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
298b0 20 61 31 5b 5d 2c 20 73 77 61 70 20 69 6e 20 74   a1[], swap in t
298c0 68 65 20 66 69 65 6c 64 20 66 72 6f 6d 20 61 32  he field from a2
298d0 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  []..*/.static vo
298e0 69 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64  id sessionAppend
298f0 52 65 63 6f 72 64 4d 65 72 67 65 28 0a 20 20 53  RecordMerge(.  S
29900 65 73 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 42  essionBuffer *pB
29910 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  uf,            /
29920 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70 70 65  * Buffer to appe
29930 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  nd to */.  int n
29940 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
29950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29960 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
29970 69 6e 20 65 61 63 68 20 72 65 63 6f 72 64 20 2a  in each record *
29980 2f 0a 20 20 75 38 20 2a 61 31 2c 20 69 6e 74 20  /.  u8 *a1, int 
29990 6e 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n1,             
299a0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 31 20      /* Record 1 
299b0 2a 2f 0a 20 20 75 38 20 2a 61 32 2c 20 69 6e 74  */.  u8 *a2, int
299c0 20 6e 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   n2,            
299d0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 32       /* Record 2
299e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
29a10 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   error code */.)
29a20 7b 0a 20 20 73 65 73 73 69 6f 6e 42 75 66 66 65  {.  sessionBuffe
29a30 72 47 72 6f 77 28 70 42 75 66 2c 20 6e 31 2b 6e  rGrow(pBuf, n1+n
29a40 32 2c 20 70 52 63 29 3b 0a 20 20 69 66 28 20 2a  2, pRc);.  if( *
29a50 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
29a60 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
29a70 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 42 75   u8 *pOut = &pBu
29a80 66 2d 3e 61 42 75 66 5b 70 42 75 66 2d 3e 6e 42  f->aBuf[pBuf->nB
29a90 75 66 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  uf];.    for(i=0
29aa0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
29ab0 20 20 20 20 20 20 69 6e 74 20 6e 6e 31 20 3d 20        int nn1 = 
29ac0 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
29ad0 28 61 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (a1);.      int 
29ae0 6e 6e 32 20 3d 20 73 65 73 73 69 6f 6e 53 65 72  nn2 = sessionSer
29af0 69 61 6c 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20  ialLen(a2);.    
29b00 20 20 69 66 28 20 2a 61 31 3d 3d 30 20 7c 7c 20    if( *a1==0 || 
29b10 2a 61 31 3d 3d 30 78 46 46 20 29 7b 0a 20 20 20  *a1==0xFF ){.   
29b20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74       memcpy(pOut
29b30 2c 20 61 32 2c 20 6e 6e 32 29 3b 0a 20 20 20 20  , a2, nn2);.    
29b40 20 20 20 20 70 4f 75 74 20 2b 3d 20 6e 6e 32 3b      pOut += nn2;
29b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29b60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
29b70 74 2c 20 61 31 2c 20 6e 6e 31 29 3b 0a 20 20 20  t, a1, nn1);.   
29b80 20 20 20 20 20 70 4f 75 74 20 2b 3d 20 6e 6e 31       pOut += nn1
29b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29ba0 61 31 20 2b 3d 20 6e 6e 31 3b 0a 20 20 20 20 20  a1 += nn1;.     
29bb0 20 61 32 20 2b 3d 20 6e 6e 32 3b 0a 20 20 20 20   a2 += nn2;.    
29bc0 7d 0a 0a 20 20 20 20 70 42 75 66 2d 3e 6e 42 75  }..    pBuf->nBu
29bd0 66 20 3d 20 70 4f 75 74 2d 70 42 75 66 2d 3e 61  f = pOut-pBuf->a
29be0 42 75 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Buf;.    assert(
29bf0 20 70 42 75 66 2d 3e 6e 42 75 66 3c 3d 70 42 75   pBuf->nBuf<=pBu
29c00 66 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 7d  f->nAlloc );.  }
29c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
29c20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29c30 64 20 77 68 65 6e 20 72 65 62 61 73 69 6e 67 20  d when rebasing 
29c40 61 20 6c 6f 63 61 6c 20 55 50 44 41 54 45 20 63  a local UPDATE c
29c50 68 61 6e 67 65 20 61 67 61 69 6e 73 74 20 6f 6e  hange against on
29c60 65 20 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 72 65  e .** or more re
29c70 6d 6f 74 65 20 55 50 44 41 54 45 20 63 68 61 6e  mote UPDATE chan
29c80 67 65 73 2e 20 54 68 65 20 61 52 65 63 2f 6e 52  ges. The aRec/nR
29c90 65 63 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ec buffer contai
29ca0 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ns the current.*
29cb0 2a 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77 2e  * old.* and new.
29cc0 2a 20 72 65 63 6f 72 64 73 20 66 6f 72 20 74 68  * records for th
29cd0 65 20 63 68 61 6e 67 65 2e 20 54 68 65 20 72 65  e change. The re
29ce0 62 61 73 65 20 62 75 66 66 65 72 20 28 61 20 73  base buffer (a s
29cf0 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 29  ingle.** record)
29d00 20 69 73 20 69 6e 20 61 43 68 61 6e 67 65 2f 6e   is in aChange/n
29d10 43 68 61 6e 67 65 2e 20 54 68 65 20 72 65 62 61  Change. The reba
29d20 73 65 64 20 63 68 61 6e 67 65 20 69 73 20 61 70  sed change is ap
29d30 70 65 6e 64 65 64 20 74 6f 20 62 75 66 66 65 72  pended to buffer
29d40 0a 2a 2a 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  .** pBuf..**.** 
29d50 52 65 62 61 73 69 6e 67 20 74 68 65 20 55 50 44  Rebasing the UPD
29d60 41 54 45 20 69 6e 76 6f 6c 76 65 73 3a 20 0a 2a  ATE involves: .*
29d70 2a 0a 2a 2a 20 20 20 2a 20 52 65 6d 6f 76 69 6e  *.**   * Removin
29d80 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  g any changes to
29d90 20 66 69 65 6c 64 73 20 66 6f 72 20 77 68 69 63   fields for whic
29da0 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  h the correspond
29db0 69 6e 67 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  ing field.**    
29dc0 20 69 6e 20 74 68 65 20 72 65 62 61 73 65 20 62   in the rebase b
29dd0 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
29de0 22 72 65 70 6c 61 63 65 64 22 20 28 74 79 70 65  "replaced" (type
29df0 20 30 78 46 46 29 2e 20 49 66 20 74 68 69 73 0a   0xFF). If this.
29e00 2a 2a 20 20 20 20 20 6d 65 61 6e 73 20 74 68 65  **     means the
29e10 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 20 75   UPDATE change u
29e20 70 64 61 74 65 73 20 6e 6f 20 66 69 65 6c 64 73  pdates no fields
29e30 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70  , nothing is app
29e40 65 6e 64 65 64 0a 2a 2a 20 20 20 20 20 74 6f 20  ended.**     to 
29e50 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
29e60 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 46 6f 72  r..**.**   * For
29e70 20 65 61 63 68 20 66 69 65 6c 64 20 6d 6f 64 69   each field modi
29e80 66 69 65 64 20 62 79 20 74 68 65 20 6c 6f 63 61  fied by the loca
29e90 6c 20 63 68 61 6e 67 65 20 66 6f 72 20 77 68 69  l change for whi
29ea0 63 68 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 63  ch the .**     c
29eb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69 65  orresponding fie
29ec0 6c 64 20 69 6e 20 74 68 65 20 72 65 62 61 73 65  ld in the rebase
29ed0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 22   buffer is not "
29ee0 75 6e 64 65 66 69 6e 65 64 22 20 28 30 78 30 30  undefined" (0x00
29ef0 29 0a 2a 2a 20 20 20 20 20 6f 72 20 22 72 65 70  ).**     or "rep
29f00 6c 61 63 65 64 22 20 28 30 78 46 46 29 2c 20 74  laced" (0xFF), t
29f10 68 65 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 20 69  he old.* value i
29f20 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
29f30 65 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 69  e value.**     i
29f40 6e 20 74 68 65 20 72 65 62 61 73 65 20 62 75 66  n the rebase buf
29f50 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fer..*/.static v
29f60 6f 69 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  oid sessionAppen
29f70 64 50 61 72 74 69 61 6c 55 70 64 61 74 65 28 0a  dPartialUpdate(.
29f80 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20    SessionBuffer 
29f90 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
29fa0 20 20 2f 2a 20 41 70 70 65 6e 64 20 72 65 63 6f    /* Append reco
29fb0 72 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 71 6c  rd here */.  sql
29fc0 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
29fd0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20  ter *pIter,  /* 
29fe0 49 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 64  Iterator pointed
29ff0 20 61 74 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65   at local change
2a000 20 2a 2f 0a 20 20 75 38 20 2a 61 52 65 63 2c 20   */.  u8 *aRec, 
2a010 69 6e 74 20 6e 52 65 63 2c 20 20 20 20 20 20 20  int nRec,       
2a020 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
2a030 68 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20 2a 61  hange */.  u8 *a
2a040 43 68 61 6e 67 65 2c 20 69 6e 74 20 6e 43 68 61  Change, int nCha
2a050 6e 67 65 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  nge,       /* Re
2a060 63 6f 72 64 20 74 6f 20 72 65 62 61 73 65 20 61  cord to rebase a
2a070 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
2a080 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
2a090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a0a0 4e 2f 4f 55 54 3a 20 52 65 74 75 72 6e 20 43 6f  N/OUT: Return Co
2a0b0 64 65 20 2a 2f 0a 29 7b 0a 20 20 73 65 73 73 69  de */.){.  sessi
2a0c0 6f 6e 42 75 66 66 65 72 47 72 6f 77 28 70 42 75  onBufferGrow(pBu
2a0d0 66 2c 20 32 2b 6e 52 65 63 2b 6e 43 68 61 6e 67  f, 2+nRec+nChang
2a0e0 65 2c 20 70 52 63 29 3b 0a 20 20 69 66 28 20 2a  e, pRc);.  if( *
2a0f0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2a100 7b 0a 20 20 20 20 69 6e 74 20 62 44 61 74 61 20  {.    int bData 
2a110 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 4f 75  = 0;.    u8 *pOu
2a120 74 20 3d 20 26 70 42 75 66 2d 3e 61 42 75 66 5b  t = &pBuf->aBuf[
2a130 70 42 75 66 2d 3e 6e 42 75 66 5d 3b 0a 20 20 20  pBuf->nBuf];.   
2a140 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 38 20 2a   int i;.    u8 *
2a150 61 31 20 3d 20 61 52 65 63 3b 0a 20 20 20 20 75  a1 = aRec;.    u
2a160 38 20 2a 61 32 20 3d 20 61 43 68 61 6e 67 65 3b  8 *a2 = aChange;
2a170 0a 0a 20 20 20 20 2a 70 4f 75 74 2b 2b 20 3d 20  ..    *pOut++ = 
2a180 53 51 4c 49 54 45 5f 55 50 44 41 54 45 3b 0a 20  SQLITE_UPDATE;. 
2a190 20 20 20 2a 70 4f 75 74 2b 2b 20 3d 20 70 49 74     *pOut++ = pIt
2a1a0 65 72 2d 3e 62 49 6e 64 69 72 65 63 74 3b 0a 20  er->bIndirect;. 
2a1b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
2a1c0 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ter->nCol; i++){
2a1d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 31 20 3d 20  .      int n1 = 
2a1e0 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
2a1f0 28 61 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (a1);.      int 
2a200 6e 32 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69  n2 = sessionSeri
2a210 61 6c 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20 20  alLen(a2);.     
2a220 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 50 4b   if( pIter->abPK
2a230 5b 69 5d 20 7c 7c 20 61 32 5b 30 5d 3d 3d 30 20  [i] || a2[0]==0 
2a240 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
2a250 70 49 74 65 72 2d 3e 61 62 50 4b 5b 69 5d 20 29  pIter->abPK[i] )
2a260 20 62 44 61 74 61 20 3d 20 31 3b 0a 20 20 20 20   bData = 1;.    
2a270 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c      memcpy(pOut,
2a280 20 61 31 2c 20 6e 31 29 3b 0a 20 20 20 20 20 20   a1, n1);.      
2a290 20 20 70 4f 75 74 20 2b 3d 20 6e 31 3b 0a 20 20    pOut += n1;.  
2a2a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 32      }else if( a2
2a2b0 5b 30 5d 21 3d 30 78 46 46 20 29 7b 0a 20 20 20  [0]!=0xFF ){.   
2a2c0 20 20 20 20 20 62 44 61 74 61 20 3d 20 31 3b 0a       bData = 1;.
2a2d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
2a2e0 4f 75 74 2c 20 61 32 2c 20 6e 32 29 3b 0a 20 20  Out, a2, n2);.  
2a2f0 20 20 20 20 20 20 70 4f 75 74 20 2b 3d 20 6e 32        pOut += n2
2a300 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a310 20 20 20 20 20 20 20 2a 70 4f 75 74 2b 2b 20 3d         *pOut++ =
2a320 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20   '\0';.      }. 
2a330 20 20 20 20 20 61 31 20 2b 3d 20 6e 31 3b 0a 20       a1 += n1;. 
2a340 20 20 20 20 20 61 32 20 2b 3d 20 6e 32 3b 0a 20       a2 += n2;. 
2a350 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 44 61     }.    if( bDa
2a360 74 61 20 29 7b 0a 20 20 20 20 20 20 61 32 20 3d  ta ){.      a2 =
2a370 20 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20   aChange;.      
2a380 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
2a390 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
2a3a0 20 20 20 20 20 20 69 6e 74 20 6e 31 20 3d 20 73        int n1 = s
2a3b0 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28  essionSerialLen(
2a3c0 61 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  a1);.        int
2a3d0 20 6e 32 20 3d 20 73 65 73 73 69 6f 6e 53 65 72   n2 = sessionSer
2a3e0 69 61 6c 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20  ialLen(a2);.    
2a3f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
2a400 62 50 4b 5b 69 5d 20 7c 7c 20 61 32 5b 30 5d 21  bPK[i] || a2[0]!
2a410 3d 30 78 46 46 20 29 7b 0a 20 20 20 20 20 20 20  =0xFF ){.       
2a420 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20     memcpy(pOut, 
2a430 61 31 2c 20 6e 31 29 3b 0a 20 20 20 20 20 20 20  a1, n1);.       
2a440 20 20 20 70 4f 75 74 20 2b 3d 20 6e 31 3b 0a 20     pOut += n1;. 
2a450 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a460 20 20 20 20 20 20 20 20 2a 70 4f 75 74 2b 2b 20          *pOut++ 
2a470 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
2a480 7d 0a 20 20 20 20 20 20 20 20 61 31 20 2b 3d 20  }.        a1 += 
2a490 6e 31 3b 0a 20 20 20 20 20 20 20 20 61 32 20 2b  n1;.        a2 +
2a4a0 3d 20 6e 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = n2;.      }.  
2a4b0 20 20 20 20 70 42 75 66 2d 3e 6e 42 75 66 20 3d      pBuf->nBuf =
2a4c0 20 28 70 4f 75 74 20 2d 20 70 42 75 66 2d 3e 61   (pOut - pBuf->a
2a4d0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
2a4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 74 65 72 20 69  }../*.** pIter i
2a4f0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2a500 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2a510 61 20 63 68 61 6e 67 65 73 65 74 2e 20 54 68 69  a changeset. Thi
2a520 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 62 61 73  s function rebas
2a530 65 73 20 0a 2a 2a 20 74 68 61 74 20 63 68 61 6e  es .** that chan
2a540 67 65 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20  geset according 
2a550 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  to the current c
2a560 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 20  onfiguration of 
2a570 74 68 65 20 72 65 62 61 73 65 72 20 0a 2a 2a 20  the rebaser .** 
2a580 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2a590 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
2a5a0 65 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ent. If no error
2a5b0 20 6f 63 63 75 72 73 20 61 6e 64 20 61 72 67 75   occurs and argu
2a5c0 6d 65 6e 74 20 78 4f 75 74 70 75 74 0a 2a 2a 20  ment xOutput.** 
2a5d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2a5e0 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  n the changeset 
2a5f0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
2a600 68 65 20 63 61 6c 6c 65 72 20 62 79 20 69 6e 76  he caller by inv
2a610 6f 6b 69 6e 67 0a 2a 2a 20 78 4f 75 74 70 75 74  oking.** xOutput
2a620 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 69   zero or more ti
2a630 6d 65 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  mes and SQLITE_O
2a640 4b 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  K returned. Or, 
2a650 69 66 20 78 4f 75 74 70 75 74 20 69 73 20 4e 55  if xOutput is NU
2a660 4c 4c 2c 0a 2a 2a 20 74 68 65 6e 20 28 2a 70 70  LL,.** then (*pp
2a670 4f 75 74 29 20 69 73 20 73 65 74 20 74 6f 20 70  Out) is set to p
2a680 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
2a690 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2a6a0 72 65 62 61 73 65 64 20 63 68 61 6e 67 65 73 65  rebased changese
2a6b0 74 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 69 73  t.** before this
2a6c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a6d0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
2a6e0 28 2a 70 6e 4f 75 74 29 20 69 73 20 73 65 74 20  (*pnOut) is set 
2a6f0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  to the size of.*
2a700 2a 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  * the buffer in 
2a710 62 79 74 65 73 2e 20 20 49 74 20 69 73 20 74 68  bytes.  It is th
2a720 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2a730 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
2a740 6f 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  o eventually.** 
2a750 66 72 65 65 20 74 68 65 20 28 2a 70 70 4f 75 74  free the (*ppOut
2a760 29 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  ) buffer using s
2a770 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a  qlite3_free(). .
2a780 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2a790 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
2a7a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2a7b0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 70  s returned. If p
2a7c0 70 4f 75 74 20 61 6e 64 0a 2a 2a 20 70 6e 4f 75  pOut and.** pnOu
2a7d0 74 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20  t are not NULL, 
2a7e0 74 68 65 6e 20 74 68 65 20 74 77 6f 20 6f 75 74  then the two out
2a7f0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 61  put parameters a
2a800 72 65 20 73 65 74 20 74 6f 20 30 20 62 65 66 6f  re set to 0 befo
2a810 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
2a820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a830 65 73 73 69 6f 6e 52 65 62 61 73 65 28 0a 20 20  essionRebase(.  
2a840 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20  sqlite3_rebaser 
2a850 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2a860 2f 2a 20 52 65 62 61 73 65 72 20 68 61 73 68 20  /* Rebaser hash 
2a870 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
2a880 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
2a890 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 49 6e  r *pIter,  /* In
2a8a0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
2a8b0 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69  t (*xOutput)(voi
2a8c0 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76  d *pOut, const v
2a8d0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
2a8e0 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a  nData),.  void *
2a8f0 70 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  pOut,           
2a900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2a910 74 65 78 74 20 66 6f 72 20 78 4f 75 74 70 75 74  text for xOutput
2a920 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
2a930 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20 20  nt *pnOut,      
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a950 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
2a960 20 62 79 74 65 73 20 69 6e 20 6f 75 74 70 75 74   bytes in output
2a970 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20   changeset */.  
2a980 76 6f 69 64 20 2a 2a 70 70 4f 75 74 20 20 20 20  void **ppOut    
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 2f 2a 20 4f 55 54 3a 20 49 6e 76 65 72 73 65 20  /* OUT: Inverse 
2a9b0 6f 66 20 70 43 68 61 6e 67 65 73 65 74 20 2a 2f  of pChangeset */
2a9c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2a9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 2a  QLITE_OK;.  u8 *
2a9e0 61 52 65 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  aRec = 0;.  int 
2a9f0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRec = 0;.  int 
2aa00 62 4e 65 77 20 3d 20 30 3b 0a 20 20 53 65 73 73  bNew = 0;.  Sess
2aa10 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ionTable *pTab =
2aa20 20 30 3b 0a 20 20 53 65 73 73 69 6f 6e 42 75 66   0;.  SessionBuf
2aa30 66 65 72 20 73 4f 75 74 20 3d 20 7b 30 2c 30 2c  fer sOut = {0,0,
2aa40 30 7d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51  0};..  while( SQ
2aa50 4c 49 54 45 5f 52 4f 57 3d 3d 73 65 73 73 69 6f  LITE_ROW==sessio
2aa60 6e 43 68 61 6e 67 65 73 65 74 4e 65 78 74 28 70  nChangesetNext(p
2aa70 49 74 65 72 2c 20 26 61 52 65 63 2c 20 26 6e 52  Iter, &aRec, &nR
2aa80 65 63 2c 20 26 62 4e 65 77 29 20 29 7b 0a 20 20  ec, &bNew) ){.  
2aa90 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20    SessionChange 
2aaa0 2a 70 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  *pChange = 0;.  
2aab0 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
2aac0 0a 0a 20 20 20 20 69 66 28 20 62 4e 65 77 20 29  ..    if( bNew )
2aad0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2aae0 61 72 20 2a 7a 54 61 62 20 3d 20 70 49 74 65 72  ar *zTab = pIter
2aaf0 2d 3e 7a 54 61 62 3b 0a 20 20 20 20 20 20 66 6f  ->zTab;.      fo
2ab00 72 28 70 54 61 62 3d 70 2d 3e 67 72 70 2e 70 4c  r(pTab=p->grp.pL
2ab10 69 73 74 3b 20 70 54 61 62 3b 20 70 54 61 62 3d  ist; pTab; pTab=
2ab20 70 54 61 62 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pTab->pNext){.  
2ab30 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
2ab40 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 54 61  ite3_stricmp(pTa
2ab50 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62 29 20  b->zName, zTab) 
2ab60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2ab70 0a 20 20 20 20 20 20 62 4e 65 77 20 3d 20 30 3b  .      bNew = 0;
2ab80 0a 0a 20 20 20 20 20 20 2f 2a 20 41 20 70 61 74  ..      /* A pat
2ab90 63 68 73 65 74 20 6d 61 79 20 6e 6f 74 20 62 65  chset may not be
2aba0 20 72 65 62 61 73 65 64 20 2a 2f 0a 20 20 20 20   rebased */.    
2abb0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 50 61    if( pIter->bPa
2abc0 74 63 68 73 65 74 20 29 7b 0a 20 20 20 20 20 20  tchset ){.      
2abd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2abe0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ROR;.      }..  
2abf0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20      /* Append a 
2ac00 74 61 62 6c 65 20 68 65 61 64 65 72 20 74 6f 20  table header to 
2ac10 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 74  the output for t
2ac20 68 69 73 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  his new table */
2ac30 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70  .      sessionAp
2ac40 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74 2c 20  pendByte(&sOut, 
2ac50 70 49 74 65 72 2d 3e 62 50 61 74 63 68 73 65 74  pIter->bPatchset
2ac60 20 3f 20 27 50 27 20 3a 20 27 54 27 2c 20 26 72   ? 'P' : 'T', &r
2ac70 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f  c);.      sessio
2ac80 6e 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 73  nAppendVarint(&s
2ac90 4f 75 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  Out, pIter->nCol
2aca0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65  , &rc);.      se
2acb0 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
2acc0 26 73 4f 75 74 2c 20 70 49 74 65 72 2d 3e 61 62  &sOut, pIter->ab
2acd0 50 4b 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2c  PK, pIter->nCol,
2ace0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73   &rc);.      ses
2acf0 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28 26  sionAppendBlob(&
2ad00 73 4f 75 74 2c 28 75 38 2a 29 70 49 74 65 72 2d  sOut,(u8*)pIter-
2ad10 3e 7a 54 61 62 2c 28 69 6e 74 29 73 74 72 6c 65  >zTab,(int)strle
2ad20 6e 28 70 49 74 65 72 2d 3e 7a 54 61 62 29 2b 31  n(pIter->zTab)+1
2ad30 2c 26 72 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,&rc);.    }..  
2ad40 20 20 69 66 28 20 70 54 61 62 20 26 26 20 72 63    if( pTab && rc
2ad50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ad60 20 20 20 20 20 69 6e 74 20 69 48 61 73 68 20 3d       int iHash =
2ad70 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 48 61   sessionChangeHa
2ad80 73 68 28 70 54 61 62 2c 20 30 2c 20 61 52 65 63  sh(pTab, 0, aRec
2ad90 2c 20 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65 29  , pTab->nChange)
2ada0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 43 68  ;..      for(pCh
2adb0 61 6e 67 65 3d 70 54 61 62 2d 3e 61 70 43 68 61  ange=pTab->apCha
2adc0 6e 67 65 5b 69 48 61 73 68 5d 3b 20 70 43 68 61  nge[iHash]; pCha
2add0 6e 67 65 3b 20 70 43 68 61 6e 67 65 3d 70 43 68  nge; pChange=pCh
2ade0 61 6e 67 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ange->pNext){.  
2adf0 20 20 20 20 20 20 69 66 28 20 73 65 73 73 69 6f        if( sessio
2ae00 6e 43 68 61 6e 67 65 45 71 75 61 6c 28 70 54 61  nChangeEqual(pTa
2ae10 62 2c 20 30 2c 20 61 52 65 63 2c 20 30 2c 20 70  b, 0, aRec, 0, p
2ae20 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64 29  Change->aRecord)
2ae30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
2ae40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2ae50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2ae60 20 20 69 66 28 20 70 43 68 61 6e 67 65 20 29 7b    if( pChange ){
2ae70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ae80 43 68 61 6e 67 65 2d 3e 6f 70 3d 3d 53 51 4c 49  Change->op==SQLI
2ae90 54 45 5f 44 45 4c 45 54 45 20 7c 7c 20 70 43 68  TE_DELETE || pCh
2aea0 61 6e 67 65 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  ange->op==SQLITE
2aeb0 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20  _INSERT );.     
2aec0 20 73 77 69 74 63 68 28 20 70 49 74 65 72 2d 3e   switch( pIter->
2aed0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  op ){.        ca
2aee0 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  se SQLITE_INSERT
2aef0 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
2af00 70 43 68 61 6e 67 65 2d 3e 6f 70 3d 3d 53 51 4c  pChange->op==SQL
2af10 49 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20  ITE_INSERT ){.  
2af20 20 20 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20            bDone 
2af30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2af40 20 69 66 28 20 70 43 68 61 6e 67 65 2d 3e 62 49   if( pChange->bI
2af50 6e 64 69 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20  ndirect==0 ){.  
2af60 20 20 20 20 20 20 20 20 20 20 20 20 73 65 73 73              sess
2af70 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26 73  ionAppendByte(&s
2af80 4f 75 74 2c 20 53 51 4c 49 54 45 5f 55 50 44 41  Out, SQLITE_UPDA
2af90 54 45 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  TE, &rc);.      
2afa0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
2afb0 70 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74 2c  ppendByte(&sOut,
2afc0 20 70 49 74 65 72 2d 3e 62 49 6e 64 69 72 65 63   pIter->bIndirec
2afd0 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  t, &rc);.       
2afe0 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
2aff0 70 65 6e 64 42 6c 6f 62 28 26 73 4f 75 74 2c 20  pendBlob(&sOut, 
2b000 70 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64  pChange->aRecord
2b010 2c 20 70 43 68 61 6e 67 65 2d 3e 6e 52 65 63 6f  , pChange->nReco
2b020 72 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  rd, &rc);.      
2b030 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
2b040 70 70 65 6e 64 42 6c 6f 62 28 26 73 4f 75 74 2c  ppendBlob(&sOut,
2b050 20 61 52 65 63 2c 20 6e 52 65 63 2c 20 26 72 63   aRec, nRec, &rc
2b060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2b070 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b080 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2b090 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
2b0a0 54 45 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 20  TE_UPDATE:.     
2b0b0 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a       bDone = 1;.
2b0c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b0d0 68 61 6e 67 65 2d 3e 6f 70 3d 3d 53 51 4c 49 54  hange->op==SQLIT
2b0e0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
2b0f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 61          if( pCha
2b100 6e 67 65 2d 3e 62 49 6e 64 69 72 65 63 74 3d 3d  nge->bIndirect==
2b110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b120 20 20 20 75 38 20 2a 70 43 73 72 20 3d 20 61 52     u8 *pCsr = aR
2b130 65 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ec;.            
2b140 20 20 73 65 73 73 69 6f 6e 53 6b 69 70 52 65 63    sessionSkipRec
2b150 6f 72 64 28 26 70 43 73 72 2c 20 70 49 74 65 72  ord(&pCsr, pIter
2b160 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ->nCol);.       
2b170 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
2b180 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74 2c 20  pendByte(&sOut, 
2b190 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 26  SQLITE_INSERT, &
2b1a0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rc);.           
2b1b0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
2b1c0 42 79 74 65 28 26 73 4f 75 74 2c 20 70 49 74 65  Byte(&sOut, pIte
2b1d0 72 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20 26 72  r->bIndirect, &r
2b1e0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2b1f0 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 52    sessionAppendR
2b200 65 63 6f 72 64 4d 65 72 67 65 28 26 73 4f 75 74  ecordMerge(&sOut
2b210 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2c 0a 20  , pIter->nCol,. 
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 70 43 73 72 2c 20 6e 52 65 63 2d 28 70 43 73   pCsr, nRec-(pCs
2b240 72 2d 61 52 65 63 29 2c 20 0a 20 20 20 20 20 20  r-aRec), .      
2b250 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 61              pCha
2b260 6e 67 65 2d 3e 61 52 65 63 6f 72 64 2c 20 70 43  nge->aRecord, pC
2b270 68 61 6e 67 65 2d 3e 6e 52 65 63 6f 72 64 2c 20  hange->nRecord, 
2b280 26 72 63 0a 20 20 20 20 20 20 20 20 20 20 20 20  &rc.            
2b290 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
2b2a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2b2b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b2c0 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 50 61 72  sessionAppendPar
2b2d0 74 69 61 6c 55 70 64 61 74 65 28 26 73 4f 75 74  tialUpdate(&sOut
2b2e0 2c 20 70 49 74 65 72 2c 0a 20 20 20 20 20 20 20  , pIter,.       
2b2f0 20 20 20 20 20 20 20 20 20 61 52 65 63 2c 20 6e           aRec, n
2b300 52 65 63 2c 20 70 43 68 61 6e 67 65 2d 3e 61 52  Rec, pChange->aR
2b310 65 63 6f 72 64 2c 20 70 43 68 61 6e 67 65 2d 3e  ecord, pChange->
2b320 6e 52 65 63 6f 72 64 2c 20 26 72 63 0a 20 20 20  nRecord, &rc.   
2b330 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2b340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b350 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2b360 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2b370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
2b380 65 72 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 44  er->op==SQLITE_D
2b390 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 20 20 20  ELETE );.       
2b3a0 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
2b3b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 61          if( pCha
2b3c0 6e 67 65 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  nge->op==SQLITE_
2b3d0 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20  INSERT ){.      
2b3e0 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
2b3f0 65 6e 64 42 79 74 65 28 26 73 4f 75 74 2c 20 53  endByte(&sOut, S
2b400 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 26 72  QLITE_DELETE, &r
2b410 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2b420 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74  sessionAppendByt
2b430 65 28 26 73 4f 75 74 2c 20 70 49 74 65 72 2d 3e  e(&sOut, pIter->
2b440 62 49 6e 64 69 72 65 63 74 2c 20 26 72 63 29 3b  bIndirect, &rc);
2b450 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 73  .            ses
2b460 73 69 6f 6e 41 70 70 65 6e 64 52 65 63 6f 72 64  sionAppendRecord
2b470 4d 65 72 67 65 28 26 73 4f 75 74 2c 20 70 49 74  Merge(&sOut, pIt
2b480 65 72 2d 3e 6e 43 6f 6c 2c 0a 20 20 20 20 20 20  er->nCol,.      
2b490 20 20 20 20 20 20 20 20 20 20 70 43 68 61 6e 67            pChang
2b4a0 65 2d 3e 61 52 65 63 6f 72 64 2c 20 70 43 68 61  e->aRecord, pCha
2b4b0 6e 67 65 2d 3e 6e 52 65 63 6f 72 64 2c 20 61 52  nge->nRecord, aR
2b4c0 65 63 2c 20 6e 52 65 63 2c 20 26 72 63 0a 20 20  ec, nRec, &rc.  
2b4d0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2b4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b4f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b500 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
2b510 20 62 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20   bDone==0 ){.   
2b520 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
2b530 42 79 74 65 28 26 73 4f 75 74 2c 20 70 49 74 65  Byte(&sOut, pIte
2b540 72 2d 3e 6f 70 2c 20 26 72 63 29 3b 0a 20 20 20  r->op, &rc);.   
2b550 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
2b560 42 79 74 65 28 26 73 4f 75 74 2c 20 70 49 74 65  Byte(&sOut, pIte
2b570 72 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20 26 72  r->bIndirect, &r
2b580 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f  c);.      sessio
2b590 6e 41 70 70 65 6e 64 42 6c 6f 62 28 26 73 4f 75  nAppendBlob(&sOu
2b5a0 74 2c 20 61 52 65 63 2c 20 6e 52 65 63 2c 20 26  t, aRec, nRec, &
2b5b0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rc);.    }.    i
2b5c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b5d0 20 26 26 20 78 4f 75 74 70 75 74 20 26 26 20 73   && xOutput && s
2b5e0 4f 75 74 2e 6e 42 75 66 3e 73 65 73 73 69 6f 6e  Out.nBuf>session
2b5f0 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69 7a  s_strm_chunk_siz
2b600 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
2b610 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20 73 4f  xOutput(pOut, sO
2b620 75 74 2e 61 42 75 66 2c 20 73 4f 75 74 2e 6e 42  ut.aBuf, sOut.nB
2b630 75 66 29 3b 0a 20 20 20 20 20 20 73 4f 75 74 2e  uf);.      sOut.
2b640 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nBuf = 0;.    }.
2b650 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2b660 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  ak;.  }..  if( r
2b670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b690 28 73 4f 75 74 2e 61 42 75 66 29 3b 0a 20 20 20  (sOut.aBuf);.   
2b6a0 20 6d 65 6d 73 65 74 28 26 73 4f 75 74 2c 20 30   memset(&sOut, 0
2b6b0 2c 20 73 69 7a 65 6f 66 28 73 4f 75 74 29 29 3b  , sizeof(sOut));
2b6c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2b6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b6e0 20 69 66 28 20 78 4f 75 74 70 75 74 20 29 7b 0a   if( xOutput ){.
2b6f0 20 20 20 20 20 20 69 66 28 20 73 4f 75 74 2e 6e        if( sOut.n
2b700 42 75 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Buf>0 ){.       
2b710 20 72 63 20 3d 20 78 4f 75 74 70 75 74 28 70 4f   rc = xOutput(pO
2b720 75 74 2c 20 73 4f 75 74 2e 61 42 75 66 2c 20 73  ut, sOut.aBuf, s
2b730 4f 75 74 2e 6e 42 75 66 29 3b 0a 20 20 20 20 20  Out.nBuf);.     
2b740 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2b750 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 28 76 6f      *ppOut = (vo
2b760 69 64 2a 29 73 4f 75 74 2e 61 42 75 66 3b 0a 20  id*)sOut.aBuf;. 
2b770 20 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 73 4f       *pnOut = sO
2b780 75 74 2e 6e 42 75 66 3b 0a 20 20 20 20 20 20 73  ut.nBuf;.      s
2b790 4f 75 74 2e 61 42 75 66 20 3d 20 30 3b 0a 20 20  Out.aBuf = 0;.  
2b7a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2b7b0 33 5f 66 72 65 65 28 73 4f 75 74 2e 61 42 75 66  3_free(sOut.aBuf
2b7c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b7d0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 72 65 61 74 65  }../* .** Create
2b7e0 20 61 20 6e 65 77 20 72 65 62 61 73 65 72 20 6f   a new rebaser o
2b7f0 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  bject..*/.int sq
2b800 6c 69 74 65 33 72 65 62 61 73 65 72 5f 63 72 65  lite3rebaser_cre
2b810 61 74 65 28 73 71 6c 69 74 65 33 5f 72 65 62 61  ate(sqlite3_reba
2b820 73 65 72 20 2a 2a 70 70 4e 65 77 29 7b 0a 20 20  ser **ppNew){.  
2b830 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b840 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  OK;.  sqlite3_re
2b850 62 61 73 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  baser *pNew;..  
2b860 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
2b870 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 71 6c  alloc(sizeof(sql
2b880 69 74 65 33 5f 72 65 62 61 73 65 72 29 29 3b 0a  ite3_rebaser));.
2b890 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
2b8a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b8b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
2b8c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
2b8d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
2b8e0 74 65 33 5f 72 65 62 61 73 65 72 29 29 3b 0a 20  te3_rebaser));. 
2b8f0 20 7d 0a 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e   }.  *ppNew = pN
2b900 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ew;.  return rc;
2b910 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 20  .}../* .** Call 
2b920 74 68 69 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  this one or more
2b930 20 74 69 6d 65 73 20 74 6f 20 63 6f 6e 66 69 67   times to config
2b940 75 72 65 20 61 20 72 65 62 61 73 65 72 2e 0a 2a  ure a rebaser..*
2b950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 65 62  /.int sqlite3reb
2b960 61 73 65 72 5f 63 6f 6e 66 69 67 75 72 65 28 0a  aser_configure(.
2b970 20 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65    sqlite3_rebase
2b980 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 52 65  r *p, .  int nRe
2b990 62 61 73 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64  base, const void
2b9a0 20 2a 70 52 65 62 61 73 65 0a 29 7b 0a 20 20 73   *pRebase.){.  s
2b9b0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
2b9c0 5f 69 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  _iter *pIter = 0
2b9d0 3b 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20  ;   /* Iterator 
2b9e0 6f 70 65 6e 65 64 20 6f 6e 20 70 44 61 74 61 2f  opened on pData/
2b9f0 6e 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72  nData */.  int r
2ba00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ba30 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2ba40 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
2ba50 26 70 49 74 65 72 2c 20 6e 52 65 62 61 73 65 2c  &pIter, nRebase,
2ba60 20 28 76 6f 69 64 2a 29 70 52 65 62 61 73 65 29   (void*)pRebase)
2ba70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ba80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2ba90 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73  = sessionChanges
2baa0 65 74 54 6f 48 61 73 68 28 70 49 74 65 72 2c 20  etToHash(pIter, 
2bab0 26 70 2d 3e 67 72 70 2c 20 31 29 3b 0a 20 20 7d  &p->grp, 1);.  }
2bac0 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  .  sqlite3change
2bad0 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  set_finalize(pIt
2bae0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
2baf0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 62 61  ;.}../* .** Reba
2bb00 73 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 61  se a changeset a
2bb10 63 63 6f 72 64 69 6e 67 20 74 6f 20 63 75 72 72  ccording to curr
2bb20 65 6e 74 20 72 65 62 61 73 65 72 20 63 6f 6e 66  ent rebaser conf
2bb30 69 67 75 72 61 74 69 6f 6e 20 0a 2a 2f 0a 69 6e  iguration .*/.in
2bb40 74 20 73 71 6c 69 74 65 33 72 65 62 61 73 65 72  t sqlite3rebaser
2bb50 5f 72 65 62 61 73 65 28 0a 20 20 73 71 6c 69 74  _rebase(.  sqlit
2bb60 65 33 5f 72 65 62 61 73 65 72 20 2a 70 2c 0a 20  e3_rebaser *p,. 
2bb70 20 69 6e 74 20 6e 49 6e 2c 20 63 6f 6e 73 74 20   int nIn, const 
2bb80 76 6f 69 64 20 2a 70 49 6e 2c 20 0a 20 20 69 6e  void *pIn, .  in
2bb90 74 20 2a 70 6e 4f 75 74 2c 20 76 6f 69 64 20 2a  t *pnOut, void *
2bba0 2a 70 70 4f 75 74 20 0a 29 7b 0a 20 20 73 71 6c  *ppOut .){.  sql
2bbb0 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
2bbc0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
2bbd0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
2bbe0 20 73 6b 69 70 20 74 68 72 6f 75 67 68 20 69 6e   skip through in
2bbf0 70 75 74 20 2a 2f 20 20 0a 20 20 69 6e 74 20 72  put */  .  int r
2bc00 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67  c = sqlite3chang
2bc10 65 73 65 74 5f 73 74 61 72 74 28 26 70 49 74 65  eset_start(&pIte
2bc20 72 2c 20 6e 49 6e 2c 20 28 76 6f 69 64 2a 29 70  r, nIn, (void*)p
2bc30 49 6e 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  In);..  if( rc==
2bc40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bc50 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 62   rc = sessionReb
2bc60 61 73 65 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ase(p, pIter, 0,
2bc70 20 30 2c 20 70 6e 4f 75 74 2c 20 70 70 4f 75 74   0, pnOut, ppOut
2bc80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 63 68  );.    sqlite3ch
2bc90 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65  angeset_finalize
2bca0 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  (pIter);.  }..  
2bcb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bcc0 20 0a 2a 2a 20 52 65 62 61 73 65 20 61 20 63 68   .** Rebase a ch
2bcd0 61 6e 67 65 73 65 74 20 61 63 63 6f 72 64 69 6e  angeset accordin
2bce0 67 20 74 6f 20 63 75 72 72 65 6e 74 20 72 65 62  g to current reb
2bcf0 61 73 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  aser configurati
2bd00 6f 6e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on .*/.int sqlit
2bd10 65 33 72 65 62 61 73 65 72 5f 72 65 62 61 73 65  e3rebaser_rebase
2bd20 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
2bd30 5f 72 65 62 61 73 65 72 20 2a 70 2c 0a 20 20 69  _rebaser *p,.  i
2bd40 6e 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69  nt (*xInput)(voi
2bd50 64 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44  d *pIn, void *pD
2bd60 61 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61  ata, int *pnData
2bd70 29 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a  ),.  void *pIn,.
2bd80 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29    int (*xOutput)
2bd90 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e  (void *pOut, con
2bda0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
2bdb0 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f  int nData),.  vo
2bdc0 69 64 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 73 71  id *pOut.){.  sq
2bdd0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
2bde0 69 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  iter *pIter = 0;
2bdf0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
2be00 6f 20 73 6b 69 70 20 74 68 72 6f 75 67 68 20 69  o skip through i
2be10 6e 70 75 74 20 2a 2f 20 20 0a 20 20 69 6e 74 20  nput */  .  int 
2be20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
2be30 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d  geset_start_strm
2be40 28 26 70 49 74 65 72 2c 20 78 49 6e 70 75 74 2c  (&pIter, xInput,
2be50 20 70 49 6e 29 3b 0a 0a 20 20 69 66 28 20 72 63   pIn);..  if( rc
2be60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2be70 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 52     rc = sessionR
2be80 65 62 61 73 65 28 70 2c 20 70 49 74 65 72 2c 20  ebase(p, pIter, 
2be90 78 4f 75 74 70 75 74 2c 20 70 4f 75 74 2c 20 30  xOutput, pOut, 0
2bea0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2beb0 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c  3changeset_final
2bec0 69 7a 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ize(pIter);.  }.
2bed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bee0 0a 2f 2a 20 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ./* .** Destroy 
2bef0 61 20 72 65 62 61 73 65 72 20 6f 62 6a 65 63 74  a rebaser object
2bf00 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
2bf10 33 72 65 62 61 73 65 72 5f 64 65 6c 65 74 65 28  3rebaser_delete(
2bf20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20  sqlite3_rebaser 
2bf30 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
2bf40 20 20 20 20 73 65 73 73 69 6f 6e 44 65 6c 65 74      sessionDelet
2bf50 65 54 61 62 6c 65 28 70 2d 3e 67 72 70 2e 70 4c  eTable(p->grp.pL
2bf60 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2bf70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
2bf80 0a 0a 2f 2a 20 0a 2a 2a 20 47 6c 6f 62 61 6c 20  ../* .** Global 
2bf90 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f  configuration.*/
2bfa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73  .int sqlite3sess
2bfb0 69 6f 6e 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f  ion_config(int o
2bfc0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
2bfd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bfe0 45 5f 4f 4b 3b 0a 20 20 73 77 69 74 63 68 28 20  E_OK;.  switch( 
2bff0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
2c000 51 4c 49 54 45 5f 53 45 53 53 49 4f 4e 5f 43 4f  QLITE_SESSION_CO
2c010 4e 46 49 47 5f 53 54 52 4d 53 49 5a 45 3a 20 7b  NFIG_STRMSIZE: {
2c020 0a 20 20 20 20 20 20 69 6e 74 20 2a 70 49 6e 74  .      int *pInt
2c030 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
2c040 20 20 20 20 20 69 66 28 20 2a 70 49 6e 74 3e 30       if( *pInt>0
2c050 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73   ){.        sess
2c060 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f  ions_strm_chunk_
2c070 73 69 7a 65 20 3d 20 2a 70 49 6e 74 3b 0a 20 20  size = *pInt;.  
2c080 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 49 6e      }.      *pIn
2c090 74 20 3d 20 73 65 73 73 69 6f 6e 73 5f 73 74 72  t = sessions_str
2c0a0 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65 3b 0a 20 20  m_chunk_size;.  
2c0b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c0c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2c0d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c0e0 4d 49 53 55 53 45 3b 0a 20 20 20 20 20 20 62 72  MISUSE;.      br
2c0f0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2c100 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
2c110 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
2c120 5f 53 45 53 53 49 4f 4e 20 26 26 20 53 51 4c 49  _SESSION && SQLI
2c130 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
2c140 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a              ATE_HOOK */.