/ Hex Artifact Content
Login

Artifact 5b8750c4e1d90fd64a0ce670705251ef82b0de033fc5557d3f3d967ea67120e9:


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 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
0280: 65 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  e different type
0290: 73 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 20  s of changesets 
02a0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 23 64  generated..*/.#d
02b0: 65 66 69 6e 65 20 53 45 53 53 49 4f 4e 53 5f 50  efine SESSIONS_P
02c0: 41 54 43 48 53 45 54 20 20 20 20 20 20 30 0a 23  ATCHSET      0.#
02d0: 64 65 66 69 6e 65 20 53 45 53 53 49 4f 4e 53 5f  define SESSIONS_
02e0: 43 48 41 4e 47 45 53 45 54 20 20 20 20 20 31 0a  CHANGESET     1.
02f0: 23 64 65 66 69 6e 65 20 53 45 53 53 49 4f 4e 53  #define SESSIONS
0300: 5f 46 55 4c 4c 43 48 41 4e 47 45 53 45 54 20 32  _FULLCHANGESET 2
0310: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ..static int ses
0320: 73 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b  sions_strm_chunk
0330: 5f 73 69 7a 65 20 3d 20 53 45 53 53 49 4f 4e 53  _size = SESSIONS
0340: 5f 53 54 52 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45  _STRM_CHUNK_SIZE
0350: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
0360: 74 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 53 65  t SessionHook Se
0370: 73 73 69 6f 6e 48 6f 6f 6b 3b 0a 73 74 72 75 63  ssionHook;.struc
0380: 74 20 53 65 73 73 69 6f 6e 48 6f 6f 6b 20 7b 0a  t SessionHook {.
0390: 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20    void *pCtx;.  
03a0: 69 6e 74 20 28 2a 78 4f 6c 64 29 28 76 6f 69 64  int (*xOld)(void
03b0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
03c0: 6c 75 65 2a 2a 29 3b 0a 20 20 69 6e 74 20 28 2a  lue**);.  int (*
03d0: 78 4e 65 77 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xNew)(void*,int,
03e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
03f0: 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 75 6e 74  ;.  int (*xCount
0400: 29 28 76 6f 69 64 2a 29 3b 0a 20 20 69 6e 74 20  )(void*);.  int 
0410: 28 2a 78 44 65 70 74 68 29 28 76 6f 69 64 2a 29  (*xDepth)(void*)
0420: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 73 73  ;.};../*.** Sess
0430: 69 6f 6e 20 68 61 6e 64 6c 65 20 73 74 72 75 63  ion handle struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
0450: 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20  sqlite3_session 
0460: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0490: 68 61 6e 64 6c 65 20 73 65 73 73 69 6f 6e 20 69  handle session i
04a0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
04b0: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
04e0: 74 61 62 61 73 65 20 73 65 73 73 69 6f 6e 20 69  tabase session i
04f0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f  s attached to */
0500: 0a 20 20 69 6e 74 20 62 45 6e 61 62 6c 65 3b 20  .  int bEnable; 
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0520: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75     /* True if cu
0530: 72 72 65 6e 74 6c 79 20 72 65 63 6f 72 64 69 6e  rrently recordin
0540: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 64 69  g */.  int bIndi
0550: 72 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  rect;           
0560: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0570: 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 61 72  f all changes ar
0580: 65 20 69 6e 64 69 72 65 63 74 20 2a 2f 0a 20 20  e indirect */.  
0590: 69 6e 74 20 62 41 75 74 6f 41 74 74 61 63 68 3b  int bAutoAttach;
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05b0: 2f 2a 20 54 72 75 65 20 74 6f 20 61 75 74 6f 2d  /* True to auto-
05c0: 61 74 74 61 63 68 20 74 61 62 6c 65 73 20 2a 2f  attach tables */
05d0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
0600: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
0610: 63 63 75 72 72 65 64 20 2a 2f 0a 20 20 76 6f 69  ccurred */.  voi
0620: 64 20 2a 70 46 69 6c 74 65 72 43 74 78 3b 20 20  d *pFilterCtx;  
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0640: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
0650: 6f 20 70 61 73 73 20 74 6f 20 78 54 61 62 6c 65  o pass to xTable
0660: 46 69 6c 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  Filter */.  int 
0670: 28 2a 78 54 61 62 6c 65 46 69 6c 74 65 72 29 28  (*xTableFilter)(
0680: 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73  void *pCtx, cons
0690: 74 20 63 68 61 72 20 2a 7a 54 61 62 29 3b 0a 20  t char *zTab);. 
06a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
06b0: 70 5a 65 72 6f 42 6c 6f 62 3b 20 20 20 20 20 20  pZeroBlob;      
06c0: 20 2f 2a 20 56 61 6c 75 65 20 63 6f 6e 74 61 69   /* Value contai
06d0: 6e 69 6e 67 20 58 27 27 20 2a 2f 0a 20 20 73 71  ning X'' */.  sq
06e0: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
06f0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
0700: 20 4e 65 78 74 20 73 65 73 73 69 6f 6e 20 6f 62   Next session ob
0710: 6a 65 63 74 20 6f 6e 20 73 61 6d 65 20 64 62 2e  ject on same db.
0720: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54 61 62   */.  SessionTab
0730: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
0740: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0750: 20 61 74 74 61 63 68 65 64 20 74 61 62 6c 65 73   attached tables
0760: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 48 6f 6f   */.  SessionHoo
0770: 6b 20 68 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20  k hook;         
0780: 20 20 20 20 20 20 2f 2a 20 41 50 49 73 20 74 6f        /* APIs to
0790: 20 67 72 61 62 20 6e 65 77 20 61 6e 64 20 6f 6c   grab new and ol
07a0: 64 20 64 61 74 61 20 77 69 74 68 20 2a 2f 0a 7d  d data with */.}
07b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6e 63  ;../*.** Instanc
07c0: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
07d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
07e0: 20 62 75 69 6c 64 20 73 74 72 69 6e 67 73 20 6f   build strings o
07f0: 72 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 73  r binary records
0800: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 73 73  ..*/.struct Sess
0810: 69 6f 6e 42 75 66 66 65 72 20 7b 0a 20 20 75 38  ionBuffer {.  u8
0820: 20 2a 61 42 75 66 3b 20 20 20 20 20 20 20 20 20   *aBuf;         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0840: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 61 6e   Pointer to chan
0850: 67 65 73 65 74 20 62 75 66 66 65 72 20 2a 2f 0a  geset buffer */.
0860: 20 20 69 6e 74 20 6e 42 75 66 3b 20 20 20 20 20    int nBuf;     
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
0890: 66 65 72 20 61 42 75 66 20 2a 2f 0a 20 20 69 6e  fer aBuf */.  in
08a0: 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
08c0: 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74   Size of allocat
08d0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ion containing a
08e0: 42 75 66 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Buf */.};../*.**
08f0: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   An object of th
0900: 69 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20  is type is used 
0910: 69 6e 74 65 72 6e 61 6c 6c 79 20 61 73 20 61 6e  internally as an
0920: 20 61 62 73 74 72 61 63 74 69 6f 6e 20 66 6f 72   abstraction for
0930: 20 0a 2a 2a 20 69 6e 70 75 74 20 64 61 74 61 2e   .** input data.
0940: 20 49 6e 70 75 74 20 64 61 74 61 20 6d 61 79 20   Input data may 
0950: 62 65 20 73 75 70 70 6c 69 65 64 20 65 69 74 68  be supplied eith
0960: 65 72 20 61 73 20 61 20 73 69 6e 67 6c 65 20 6c  er as a single l
0970: 61 72 67 65 20 62 75 66 66 65 72 0a 2a 2a 20 28  arge buffer.** (
0980: 65 2e 67 2e 20 73 71 6c 69 74 65 33 63 68 61 6e  e.g. sqlite3chan
0990: 67 65 73 65 74 5f 73 74 61 72 74 28 29 29 20 6f  geset_start()) o
09a0: 72 20 75 73 69 6e 67 20 61 20 73 74 72 65 61 6d  r using a stream
09b0: 20 66 75 6e 63 74 69 6f 6e 20 28 65 2e 67 2e 0a   function (e.g..
09c0: 2a 2a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  **  sqlite3chang
09d0: 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28  eset_start_strm(
09e0: 29 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65  ))..*/.struct Se
09f0: 73 73 69 6f 6e 49 6e 70 75 74 20 7b 0a 20 20 69  ssionInput {.  i
0a00: 6e 74 20 62 4e 6f 44 69 73 63 61 72 64 3b 20 20  nt bNoDiscard;  
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a20: 2a 20 49 66 20 74 72 75 65 2c 20 64 6f 20 6e 6f  * If true, do no
0a30: 74 20 64 69 73 63 61 72 64 20 69 6e 20 49 6e 70  t discard in Inp
0a40: 75 74 42 75 66 66 65 72 28 29 20 2a 2f 0a 20 20  utBuffer() */.  
0a50: 69 6e 74 20 69 43 75 72 72 65 6e 74 3b 20 20 20  int iCurrent;   
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 44 61  /* Offset in aDa
0a80: 74 61 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74 20  ta[] of current 
0a90: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
0aa0: 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  iNext;          
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0ac0: 66 66 73 65 74 20 69 6e 20 61 44 61 74 61 5b 5d  ffset in aData[]
0ad0: 20 6f 66 20 6e 65 78 74 20 63 68 61 6e 67 65 20   of next change 
0ae0: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20  */.  u8 *aData; 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0b10: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
0b20: 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
0b30: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20  /.  int nData;  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b60: 20 62 79 74 65 73 20 69 6e 20 61 44 61 74 61 20   bytes in aData 
0b70: 2a 2f 0a 0a 20 20 53 65 73 73 69 6f 6e 42 75 66  */..  SessionBuf
0b80: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
0b90: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
0ba0: 20 72 65 61 64 20 62 75 66 66 65 72 20 2a 2f 0a   read buffer */.
0bb0: 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 29 28    int (*xInput)(
0bc0: 76 6f 69 64 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e  void*, void*, in
0bd0: 74 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 49  t*);        /* I
0be0: 6e 70 75 74 20 73 74 72 65 61 6d 20 63 61 6c 6c  nput stream call
0bf0: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
0c00: 76 6f 69 64 20 2a 70 49 6e 3b 20 20 20 20 20 20  void *pIn;      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
0c30: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
0c40: 49 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 62  Input */.  int b
0c50: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
0c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
0c70: 74 20 74 6f 20 74 72 75 65 20 61 66 74 65 72 20  t to true after 
0c80: 78 49 6e 70 75 74 20 66 69 6e 69 73 68 65 64 20  xInput finished 
0c90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  */.};../*.** Str
0ca0: 75 63 74 75 72 65 20 66 6f 72 20 63 68 61 6e 67  ucture for chang
0cb0: 65 73 65 74 20 69 74 65 72 61 74 6f 72 73 2e 0a  eset iterators..
0cc0: 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  */.struct sqlite
0cd0: 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
0ce0: 20 7b 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75   {.  SessionInpu
0cf0: 74 20 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t in;           
0d00: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 62 75       /* Input bu
0d10: 66 66 65 72 20 6f 72 20 73 74 72 65 61 6d 20 2a  ffer or stream *
0d20: 2f 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65  /.  SessionBuffe
0d30: 72 20 74 62 6c 68 64 72 3b 20 20 20 20 20 20 20  r tblhdr;       
0d40: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
0d50: 20 68 6f 6c 64 20 61 70 56 61 6c 75 65 2f 7a 54   hold apValue/zT
0d60: 61 62 2f 61 62 50 4b 2f 20 2a 2f 0a 20 20 69 6e  ab/abPK/ */.  in
0d70: 74 20 62 50 61 74 63 68 73 65 74 3b 20 20 20 20  t bPatchset;    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d90: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
0da0: 20 61 20 70 61 74 63 68 73 65 74 20 2a 2f 0a 20   a patchset */. 
0db0: 20 69 6e 74 20 62 49 6e 76 65 72 74 3b 20 20 20   int bInvert;   
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 65   /* True to inve
0de0: 72 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  rt changeset */.
0df0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 65 72    /* Iterator er
0e20: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  ror code */.  sq
0e30: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e  lite3_stmt *pCon
0e40: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  flict;        /*
0e50: 20 50 6f 69 6e 74 73 20 74 6f 20 63 6f 6e 66 6c   Points to confl
0e60: 69 63 74 69 6e 67 20 72 6f 77 2c 20 69 66 20 61  icting row, if a
0e70: 6e 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  ny */.  char *zT
0e80: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
0e90: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0ea0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
0eb0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0ed0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
0ee0: 6e 73 20 69 6e 20 7a 54 61 62 20 2a 2f 0a 20 20  ns in zTab */.  
0ef0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61  /* Current opera
0f20: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 49  tion */.  int bI
0f30: 6e 64 69 72 65 63 74 3b 20 20 20 20 20 20 20 20  ndirect;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0f50: 65 20 69 66 20 63 75 72 72 65 6e 74 20 63 68 61  e if current cha
0f60: 6e 67 65 20 77 61 73 20 69 6e 64 69 72 65 63 74  nge was indirect
0f70: 20 2a 2f 0a 20 20 75 38 20 2a 61 62 50 4b 3b 20   */.  u8 *abPK; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79        /* Primary
0fa0: 20 6b 65 79 20 61 72 72 61 79 20 2a 2f 0a 20 20   key array */.  
0fb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0fc0: 61 70 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20  apValue;        
0fd0: 2f 2a 20 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77  /* old.* and new
0fe0: 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 7d 3b 0a  .* values */.};.
0ff0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 65 73 73  ./*.** Each sess
1000: 69 6f 6e 20 6f 62 6a 65 63 74 20 6d 61 69 6e 74  ion object maint
1010: 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 68  ains a set of th
1020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1030: 63 74 75 72 65 73 2c 20 6f 6e 65 0a 2a 2a 20 66  ctures, one.** f
1040: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 74 68  or each table th
1050: 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  e session object
1060: 20 69 73 20 6d 6f 6e 69 74 6f 72 69 6e 67 2e 20   is monitoring. 
1070: 54 68 65 20 73 74 72 75 63 74 75 72 65 73 20 61  The structures a
1080: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
1090: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  a linked list st
10a0: 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74 65  arting at sqlite
10b0: 33 5f 73 65 73 73 69 6f 6e 2e 70 54 61 62 6c 65  3_session.pTable
10c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6b 65 79 73  ..**.** The keys
10d0: 20 6f 66 20 74 68 65 20 53 65 73 73 69 6f 6e 54   of the SessionT
10e0: 61 62 6c 65 2e 61 43 68 61 6e 67 65 5b 5d 20 68  able.aChange[] h
10f0: 61 73 68 20 74 61 62 6c 65 20 61 72 65 20 61 6c  ash table are al
1100: 6c 20 72 6f 77 73 20 74 68 61 74 20 68 61 76 65  l rows that have
1110: 0a 2a 2a 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  .** been modifie
1120: 64 20 69 6e 20 61 6e 79 20 77 61 79 20 73 69 6e  d in any way sin
1130: 63 65 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f  ce the session o
1140: 62 6a 65 63 74 20 77 61 73 20 61 74 74 61 63 68  bject was attach
1150: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62  ed to the.** tab
1160: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  le..**.** The da
1170: 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1180: 74 68 20 65 61 63 68 20 68 61 73 68 2d 74 61 62  th each hash-tab
1190: 6c 65 20 65 6e 74 72 79 20 69 73 20 61 20 73 74  le entry is a st
11a0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
11b0: 6e 67 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  ng.** a subset o
11c0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  f the initial va
11d0: 6c 75 65 73 20 74 68 61 74 20 74 68 65 20 6d 6f  lues that the mo
11e0: 64 69 66 69 65 64 20 72 6f 77 20 63 6f 6e 74 61  dified row conta
11f0: 69 6e 65 64 20 61 74 20 74 68 65 0a 2a 2a 20 73  ined at the.** s
1200: 74 61 72 74 20 6f 66 20 74 68 65 20 73 65 73 73  tart of the sess
1210: 69 6f 6e 2e 20 4f 72 20 6e 6f 20 69 6e 69 74 69  ion. Or no initi
1220: 61 6c 20 76 61 6c 75 65 73 20 69 66 20 74 68 65  al values if the
1230: 20 72 6f 77 20 77 61 73 20 69 6e 73 65 72 74 65   row was inserte
1240: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 73  d..*/.struct Ses
1250: 73 69 6f 6e 54 61 62 6c 65 20 7b 0a 20 20 53 65  sionTable {.  Se
1260: 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 4e 65 78  ssionTable *pNex
1270: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  t;.  char *zName
1280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1290: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61       /* Local na
12a0: 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  me of table */. 
12b0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
12e0: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a  lumns in table z
12f0: 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 62 53  Name */.  int bS
1300: 74 61 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  tat1;           
1310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1320: 65 20 69 66 20 74 68 69 73 20 69 73 20 73 71 6c  e if this is sql
1330: 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 63  ite_stat1 */.  c
1340: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
1350: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1360: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  * Column names *
1370: 2f 0a 20 20 75 38 20 2a 61 62 50 4b 3b 20 20 20  /.  u8 *abPK;   
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
13a0: 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6c 61 67  primary key flag
13b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 72  s */.  int nEntr
13c0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
13d0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
13e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
13f0: 73 20 69 6e 20 68 61 73 68 20 74 61 62 6c 65 20  s in hash table 
1400: 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65  */.  int nChange
1410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1420: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1430: 61 70 43 68 61 6e 67 65 5b 5d 20 61 72 72 61 79  apChange[] array
1440: 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 43 68 61   */.  SessionCha
1450: 6e 67 65 20 2a 2a 61 70 43 68 61 6e 67 65 3b 20  nge **apChange; 
1460: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
1470: 62 6c 65 20 62 75 63 6b 65 74 73 20 2a 2f 0a 7d  ble buckets */.}
1480: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 52 45 43 4f 52 44  ;../* .** RECORD
1490: 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 54   FORMAT:.**.** T
14a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  he following rec
14b0: 6f 72 64 20 66 6f 72 6d 61 74 20 69 73 20 73 69  ord format is si
14c0: 6d 69 6c 61 72 20 74 6f 20 28 62 75 74 20 6e 6f  milar to (but no
14d0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
14e0: 68 29 20 74 68 61 74 20 0a 2a 2a 20 75 73 65 64  h) that .** used
14f0: 20 69 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   in SQLite datab
1500: 61 73 65 20 66 69 6c 65 73 2e 20 54 68 69 73 20  ase files. This 
1510: 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64 20 61  format is used a
1520: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 2a  s part of the .*
1530: 2a 20 63 68 61 6e 67 65 2d 73 65 74 20 62 69 6e  * change-set bin
1540: 61 72 79 20 66 6f 72 6d 61 74 2c 20 61 6e 64 20  ary format, and 
1550: 73 6f 20 6d 75 73 74 20 62 65 20 61 72 63 68 69  so must be archi
1560: 74 65 63 74 75 72 65 20 69 6e 64 65 70 65 6e 64  tecture independ
1570: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b  ent..**.** Unlik
1580: 65 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74  e the SQLite dat
1590: 61 62 61 73 65 20 72 65 63 6f 72 64 20 66 6f 72  abase record for
15a0: 6d 61 74 2c 20 65 61 63 68 20 66 69 65 6c 64 20  mat, each field 
15b0: 69 73 20 73 65 6c 66 2d 63 6f 6e 74 61 69 6e 65  is self-containe
15c0: 64 20 2d 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  d -.** there is 
15d0: 6e 6f 20 73 65 70 61 72 61 74 69 6f 6e 20 6f 66  no separation of
15e0: 20 68 65 61 64 65 72 20 61 6e 64 20 64 61 74 61   header and data
15f0: 2e 20 45 61 63 68 20 66 69 65 6c 64 20 62 65 67  . Each field beg
1600: 69 6e 73 20 77 69 74 68 20 61 0a 2a 2a 20 73 69  ins with a.** si
1610: 6e 67 6c 65 20 62 79 74 65 20 64 65 73 63 72 69  ngle byte descri
1620: 62 69 6e 67 20 69 74 73 20 74 79 70 65 2c 20 61  bing its type, a
1630: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1640: 20 20 20 20 20 20 20 30 78 30 30 3a 20 55 6e 64         0x00: Und
1650: 65 66 69 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2a  efined value..**
1660: 20 20 20 20 20 20 20 30 78 30 31 3a 20 49 6e 74         0x01: Int
1670: 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 20  eger value..**  
1680: 20 20 20 20 20 30 78 30 32 3a 20 52 65 61 6c 20       0x02: Real 
1690: 76 61 6c 75 65 2e 0a 2a 2a 20 20 20 20 20 20 20  value..**       
16a0: 30 78 30 33 3a 20 54 65 78 74 20 76 61 6c 75 65  0x03: Text value
16b0: 2e 0a 2a 2a 20 20 20 20 20 20 20 30 78 30 34 3a  ..**       0x04:
16c0: 20 42 6c 6f 62 20 76 61 6c 75 65 2e 0a 2a 2a 20   Blob value..** 
16d0: 20 20 20 20 20 20 30 78 30 35 3a 20 53 51 4c 20        0x05: SQL 
16e0: 4e 55 4c 4c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  NULL value..**.*
16f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1700: 61 62 6f 76 65 20 6d 61 74 63 68 20 74 68 65 20  above match the 
1710: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 53  definitions of S
1720: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 2c 20 53  QLITE_INTEGER, S
1730: 51 4c 49 54 45 5f 54 45 58 54 0a 2a 2a 20 61 6e  QLITE_TEXT.** an
1740: 64 20 73 6f 20 6f 6e 20 69 6e 20 73 71 6c 69 74  d so on in sqlit
1750: 65 33 2e 68 2e 20 46 6f 72 20 75 6e 64 65 66 69  e3.h. For undefi
1760: 6e 65 64 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ned and NULL val
1770: 75 65 73 2c 20 74 68 65 20 66 69 65 6c 64 20 63  ues, the field c
1780: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 6e 6c 79 20  onsists.** only 
1790: 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 20 74 79  of the single ty
17a0: 70 65 20 62 79 74 65 2e 20 46 6f 72 20 6f 74 68  pe byte. For oth
17b0: 65 72 20 74 79 70 65 73 20 6f 66 20 76 61 6c 75  er types of valu
17c0: 65 73 2c 20 74 68 65 20 74 79 70 65 20 62 79 74  es, the type byt
17d0: 65 0a 2a 2a 20 69 73 20 66 6f 6c 6c 6f 77 65 64  e.** is followed
17e0: 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 65 78   by:.**.**   Tex
17f0: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 20 20 20 20  t values:.**    
1800: 20 41 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69   A varint contai
1810: 6e 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ning the number 
1820: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1830: 76 61 6c 75 65 20 28 65 6e 63 6f 64 65 64 20 75  value (encoded u
1840: 73 69 6e 67 0a 2a 2a 20 20 20 20 20 55 54 46 2d  sing.**     UTF-
1850: 38 29 2e 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  8). Followed by 
1860: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1870: 69 6e 67 20 74 68 65 20 55 54 46 2d 38 20 72 65  ing the UTF-8 re
1880: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
1890: 20 20 20 20 6f 66 20 74 68 65 20 74 65 78 74 20      of the text 
18a0: 76 61 6c 75 65 2e 20 54 68 65 72 65 20 69 73 20  value. There is 
18b0: 6e 6f 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 6f  no nul terminato
18c0: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 6c 6f 62 20  r..**.**   Blob 
18d0: 76 61 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41  values:.**     A
18e0: 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69   varint containi
18f0: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
1900: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 76 61   bytes in the va
1910: 6c 75 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lue, followed by
1920: 0a 2a 2a 20 20 20 20 20 61 20 62 75 66 66 65 72  .**     a buffer
1930: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1940: 76 61 6c 75 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  value itself..**
1950: 0a 2a 2a 20 20 20 49 6e 74 65 67 65 72 20 76 61  .**   Integer va
1960: 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41 6e 20  lues:.**     An 
1970: 38 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  8-byte big-endia
1980: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  n integer value.
1990: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 61 6c 20 76 61  .**.**   Real va
19a0: 6c 75 65 73 3a 0a 2a 2a 20 20 20 20 20 41 6e 20  lues:.**     An 
19b0: 38 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  8-byte big-endia
19c0: 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
19d0: 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  real value..**.*
19e0: 2a 20 56 61 72 69 6e 74 20 76 61 6c 75 65 73 20  * Varint values 
19f0: 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 74  are encoded in t
1a00: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 76  he same way as v
1a10: 61 72 69 6e 74 73 20 69 6e 20 74 68 65 20 53 51  arints in the SQ
1a20: 4c 69 74 65 20 0a 2a 2a 20 72 65 63 6f 72 64 20  Lite .** record 
1a30: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 43 48  format..**.** CH
1a40: 41 4e 47 45 53 45 54 20 46 4f 52 4d 41 54 3a 0a  ANGESET FORMAT:.
1a50: 2a 2a 0a 2a 2a 20 41 20 63 68 61 6e 67 65 73 65  **.** A changese
1a60: 74 20 69 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f  t is a collectio
1a70: 6e 20 6f 66 20 44 45 4c 45 54 45 2c 20 55 50 44  n of DELETE, UPD
1a80: 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 6f  ATE and INSERT o
1a90: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20  perations on.** 
1aa0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  one or more tabl
1ab0: 65 73 2e 20 4f 70 65 72 61 74 69 6f 6e 73 20 6f  es. Operations o
1ac0: 6e 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  n a single table
1ad0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1ae0: 65 74 68 65 72 2c 0a 2a 2a 20 62 75 74 20 6d 61  ether,.** but ma
1af0: 79 20 6f 63 63 75 72 20 69 6e 20 61 6e 79 20 6f  y occur in any o
1b00: 72 64 65 72 20 28 69 2e 65 2e 20 64 65 6c 65 74  rder (i.e. delet
1b10: 65 73 2c 20 75 70 64 61 74 65 73 20 61 6e 64 20  es, updates and 
1b20: 69 6e 73 65 72 74 73 20 61 72 65 20 61 6c 6c 0a  inserts are all.
1b30: 2a 2a 20 6d 69 78 65 64 20 74 6f 67 65 74 68 65  ** mixed togethe
1b40: 72 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 67  r)..**.** Each g
1b50: 72 6f 75 70 20 6f 66 20 63 68 61 6e 67 65 73 20  roup of changes 
1b60: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 74 61  begins with a ta
1b70: 62 6c 65 20 68 65 61 64 65 72 3a 0a 2a 2a 0a 2a  ble header:.**.*
1b80: 2a 20 20 20 31 20 62 79 74 65 3a 20 43 6f 6e 73  *   1 byte: Cons
1b90: 74 61 6e 74 20 30 78 35 34 20 28 63 61 70 69 74  tant 0x54 (capit
1ba0: 61 6c 20 27 54 27 29 0a 2a 2a 20 20 20 56 61 72  al 'T').**   Var
1bb0: 69 6e 74 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  int: Number of c
1bc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
1bd0: 62 6c 65 2e 0a 2a 2a 20 20 20 6e 43 6f 6c 20 62  ble..**   nCol b
1be0: 79 74 65 73 3a 20 30 78 30 31 20 66 6f 72 20 50  ytes: 0x01 for P
1bf0: 4b 20 63 6f 6c 75 6d 6e 73 2c 20 30 78 30 30 20  K columns, 0x00 
1c00: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 20 20  otherwise..**   
1c10: 4e 20 62 79 74 65 73 3a 20 55 6e 71 75 61 6c 69  N bytes: Unquali
1c20: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  fied table name 
1c30: 28 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 55  (encoded using U
1c40: 54 46 2d 38 29 2e 20 4e 75 6c 2d 74 65 72 6d 69  TF-8). Nul-termi
1c50: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 6c  nated..**.** Fol
1c60: 6c 6f 77 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  lowed by one or 
1c70: 6d 6f 72 65 20 63 68 61 6e 67 65 73 20 74 6f 20  more changes to 
1c80: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1c90: 20 20 20 31 20 62 79 74 65 3a 20 45 69 74 68 65     1 byte: Eithe
1ca0: 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  r SQLITE_INSERT 
1cb0: 28 30 78 31 32 29 2c 20 55 50 44 41 54 45 20 28  (0x12), UPDATE (
1cc0: 30 78 31 37 29 20 6f 72 20 44 45 4c 45 54 45 20  0x17) or DELETE 
1cd0: 28 30 78 30 39 29 2e 0a 2a 2a 20 20 20 31 20 62  (0x09)..**   1 b
1ce0: 79 74 65 3a 20 54 68 65 20 22 69 6e 64 69 72 65  yte: The "indire
1cf0: 63 74 2d 63 68 61 6e 67 65 22 20 66 6c 61 67 2e  ct-change" flag.
1d00: 0a 2a 2a 20 20 20 6f 6c 64 2e 2a 20 72 65 63 6f  .**   old.* reco
1d10: 72 64 3a 20 28 64 65 6c 65 74 65 20 61 6e 64 20  rd: (delete and 
1d20: 75 70 64 61 74 65 20 6f 6e 6c 79 29 0a 2a 2a 20  update only).** 
1d30: 20 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 3a 20    new.* record: 
1d40: 28 69 6e 73 65 72 74 20 61 6e 64 20 75 70 64 61  (insert and upda
1d50: 74 65 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 54  te only).**.** T
1d60: 68 65 20 22 6f 6c 64 2e 2a 22 20 61 6e 64 20 22  he "old.*" and "
1d70: 6e 65 77 2e 2a 22 20 72 65 63 6f 72 64 73 2c 20  new.*" records, 
1d80: 69 66 20 70 72 65 73 65 6e 74 2c 20 61 72 65 20  if present, are 
1d90: 4e 20 66 69 65 6c 64 20 72 65 63 6f 72 64 73 20  N field records 
1da0: 69 6e 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74  in the.** format
1db0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1dc0: 20 75 6e 64 65 72 20 22 52 45 43 4f 52 44 20 46   under "RECORD F
1dd0: 4f 52 4d 41 54 22 2c 20 77 68 65 72 65 20 4e 20  ORMAT", where N 
1de0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1df0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  .** columns in t
1e00: 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20 69 27  he table. The i'
1e10: 74 68 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  th field of each
1e20: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 6f 63   record is assoc
1e30: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
1e40: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
1e50: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 6f 75 6e   the table, coun
1e60: 74 69 6e 67 20 66 72 6f 6d 20 6c 65 66 74 20 74  ting from left t
1e70: 6f 20 72 69 67 68 74 20 69 6e 20 74 68 65 20 6f  o right in the o
1e80: 72 64 65 72 0a 2a 2a 20 69 6e 20 77 68 69 63 68  rder.** in which
1e90: 20 63 6f 6c 75 6d 6e 73 20 77 65 72 65 20 64 65   columns were de
1ea0: 63 6c 61 72 65 64 20 69 6e 20 74 68 65 20 43 52  clared in the CR
1eb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1ec0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
1ed0: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 74 68 61  new.* record tha
1ee0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 61 63  t is part of eac
1ef0: 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67 65 20  h INSERT change 
1f00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
1f10: 75 65 73 0a 2a 2a 20 74 68 61 74 20 6d 61 6b 65  ues.** that make
1f20: 20 75 70 20 74 68 65 20 6e 65 77 20 72 6f 77 2e   up the new row.
1f30: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
1f40: 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20 74 68 61  old.* record tha
1f50: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 61 63  t is part of eac
1f60: 68 0a 2a 2a 20 44 45 4c 45 54 45 20 63 68 61 6e  h.** DELETE chan
1f70: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ge contains the 
1f80: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 64 65  values that made
1f90: 20 75 70 20 74 68 65 20 72 6f 77 20 74 68 61 74   up the row that
1fa0: 20 77 61 73 20 64 65 6c 65 74 65 64 20 0a 2a 2a   was deleted .**
1fb0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1fc0: 73 65 2e 20 49 6e 20 74 68 65 20 63 68 61 6e 67  se. In the chang
1fd0: 65 73 65 74 20 66 6f 72 6d 61 74 2c 20 74 68 65  eset format, the
1fe0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 61 72   records that ar
1ff0: 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 49 4e 53  e part.** of INS
2000: 45 52 54 20 6f 72 20 44 45 4c 45 54 45 20 63 68  ERT or DELETE ch
2010: 61 6e 67 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  anges never cont
2020: 61 69 6e 20 61 6e 79 20 75 6e 64 65 66 69 6e 65  ain any undefine
2030: 64 20 28 74 79 70 65 20 62 79 74 65 20 30 78 30  d (type byte 0x0
2040: 30 29 0a 2a 2a 20 66 69 65 6c 64 73 2e 0a 2a 2a  0).** fields..**
2050: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 65 20 6f  .** Within the o
2060: 6c 64 2e 2a 20 72 65 63 6f 72 64 20 61 73 73 6f  ld.* record asso
2070: 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 55  ciated with an U
2080: 50 44 41 54 45 20 63 68 61 6e 67 65 2c 20 61 6c  PDATE change, al
2090: 6c 20 66 69 65 6c 64 73 0a 2a 2a 20 61 73 73 6f  l fields.** asso
20a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 61 62 6c  ciated with tabl
20b0: 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  e columns that a
20c0: 72 65 20 6e 6f 74 20 50 52 49 4d 41 52 59 20 4b  re not PRIMARY K
20d0: 45 59 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 61  EY columns and a
20e0: 72 65 0a 2a 2a 20 6e 6f 74 20 6d 6f 64 69 66 69  re.** not modifi
20f0: 65 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45  ed by the UPDATE
2100: 20 63 68 61 6e 67 65 20 61 72 65 20 73 65 74 20   change are set 
2110: 74 6f 20 22 75 6e 64 65 66 69 6e 65 64 22 2e 20  to "undefined". 
2120: 4f 74 68 65 72 20 66 69 65 6c 64 73 0a 2a 2a 20  Other fields.** 
2130: 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20 76  are set to the v
2140: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 64 65 20  alues that made 
2150: 75 70 20 74 68 65 20 72 6f 77 20 62 65 66 6f 72  up the row befor
2160: 65 20 74 68 65 20 55 50 44 41 54 45 20 74 68 61  e the UPDATE tha
2170: 74 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 65 20  t the.** change 
2180: 72 65 63 6f 72 64 73 20 74 6f 6f 6b 20 70 6c 61  records took pla
2190: 63 65 2e 20 57 69 74 68 69 6e 20 74 68 65 20 6e  ce. Within the n
21a0: 65 77 2e 2a 20 72 65 63 6f 72 64 2c 20 66 69 65  ew.* record, fie
21b0: 6c 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  lds associated .
21c0: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 63 6f  ** with table co
21d0: 6c 75 6d 6e 73 20 6d 6f 64 69 66 69 65 64 20 62  lumns modified b
21e0: 79 20 74 68 65 20 55 50 44 41 54 45 20 63 68 61  y the UPDATE cha
21f0: 6e 67 65 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  nge contain the 
2200: 6e 65 77 20 0a 2a 2a 20 76 61 6c 75 65 73 2e 20  new .** values. 
2210: 46 69 65 6c 64 73 20 61 73 73 6f 63 69 61 74 65  Fields associate
2220: 64 20 77 69 74 68 20 74 61 62 6c 65 20 63 6f 6c  d with table col
2230: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f  umns that are no
2240: 74 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 61 72  t modified.** ar
2250: 65 20 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69  e set to "undefi
2260: 6e 65 64 22 2e 0a 2a 2a 0a 2a 2a 20 50 41 54 43  ned"..**.** PATC
2270: 48 53 45 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a  HSET FORMAT:.**.
2280: 2a 2a 20 41 20 70 61 74 63 68 73 65 74 20 69 73  ** A patchset is
2290: 20 61 6c 73 6f 20 61 20 63 6f 6c 6c 65 63 74 69   also a collecti
22a0: 6f 6e 20 6f 66 20 63 68 61 6e 67 65 73 2e 20 49  on of changes. I
22b0: 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  t is similar to 
22c0: 61 20 63 68 61 6e 67 65 73 65 74 2c 0a 2a 2a 20  a changeset,.** 
22d0: 62 75 74 20 6c 65 61 76 65 73 20 75 6e 64 65 66  but leaves undef
22e0: 69 6e 65 64 20 74 68 6f 73 65 20 66 69 65 6c 64  ined those field
22f0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 75  s that are not u
2300: 73 65 66 75 6c 20 69 66 20 6e 6f 20 63 6f 6e 66  seful if no conf
2310: 6c 69 63 74 0a 2a 2a 20 72 65 73 6f 6c 75 74 69  lict.** resoluti
2320: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 77  on is required w
2330: 68 65 6e 20 61 70 70 6c 79 69 6e 67 20 74 68 65  hen applying the
2340: 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2a 0a 2a   changeset..**.*
2350: 2a 20 45 61 63 68 20 67 72 6f 75 70 20 6f 66 20  * Each group of 
2360: 63 68 61 6e 67 65 73 20 62 65 67 69 6e 73 20 77  changes begins w
2370: 69 74 68 20 61 20 74 61 62 6c 65 20 68 65 61 64  ith a table head
2380: 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62 79  er:.**.**   1 by
2390: 74 65 3a 20 43 6f 6e 73 74 61 6e 74 20 30 78 35  te: Constant 0x5
23a0: 30 20 28 63 61 70 69 74 61 6c 20 27 50 27 29 0a  0 (capital 'P').
23b0: 2a 2a 20 20 20 56 61 72 69 6e 74 3a 20 4e 75 6d  **   Varint: Num
23c0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
23d0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
23e0: 20 20 6e 43 6f 6c 20 62 79 74 65 73 3a 20 30 78    nCol bytes: 0x
23f0: 30 31 20 66 6f 72 20 50 4b 20 63 6f 6c 75 6d 6e  01 for PK column
2400: 73 2c 20 30 78 30 30 20 6f 74 68 65 72 77 69 73  s, 0x00 otherwis
2410: 65 2e 0a 2a 2a 20 20 20 4e 20 62 79 74 65 73 3a  e..**   N bytes:
2420: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   Unqualified tab
2430: 6c 65 20 6e 61 6d 65 20 28 65 6e 63 6f 64 65 64  le name (encoded
2440: 20 75 73 69 6e 67 20 55 54 46 2d 38 29 2e 20 4e   using UTF-8). N
2450: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ul-terminated..*
2460: 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79  *.** Followed by
2470: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 68 61   one or more cha
2480: 6e 67 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c  nges to the tabl
2490: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62 79 74  e..**.**   1 byt
24a0: 65 3a 20 45 69 74 68 65 72 20 53 51 4c 49 54 45  e: Either SQLITE
24b0: 5f 49 4e 53 45 52 54 20 28 30 78 31 32 29 2c 20  _INSERT (0x12), 
24c0: 55 50 44 41 54 45 20 28 30 78 31 37 29 20 6f 72  UPDATE (0x17) or
24d0: 20 44 45 4c 45 54 45 20 28 30 78 30 39 29 2e 0a   DELETE (0x09)..
24e0: 2a 2a 20 20 20 31 20 62 79 74 65 3a 20 54 68 65  **   1 byte: The
24f0: 20 22 69 6e 64 69 72 65 63 74 2d 63 68 61 6e 67   "indirect-chang
2500: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 73 69  e" flag..**   si
2510: 6e 67 6c 65 20 72 65 63 6f 72 64 3a 20 28 50 4b  ngle record: (PK
2520: 20 66 69 65 6c 64 73 20 66 6f 72 20 44 45 4c 45   fields for DELE
2530: 54 45 2c 20 50 4b 20 61 6e 64 20 6d 6f 64 69 66  TE, PK and modif
2540: 69 65 64 20 66 69 65 6c 64 73 20 66 6f 72 20 55  ied fields for U
2550: 50 44 41 54 45 2c 0a 2a 2a 20 20 20 20 20 20 20  PDATE,.**       
2560: 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c 6c              full
2570: 20 72 65 63 6f 72 64 20 66 6f 72 20 49 4e 53 45   record for INSE
2580: 52 54 29 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 69 6e  RT)..**.** As in
2590: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 66   the changeset f
25a0: 6f 72 6d 61 74 2c 20 65 61 63 68 20 66 69 65 6c  ormat, each fiel
25b0: 64 20 6f 66 20 74 68 65 20 73 69 6e 67 6c 65 20  d of the single 
25c0: 72 65 63 6f 72 64 20 74 68 61 74 20 69 73 20 70  record that is p
25d0: 61 72 74 0a 2a 2a 20 6f 66 20 61 20 70 61 74 63  art.** of a patc
25e0: 68 73 65 74 20 63 68 61 6e 67 65 20 69 73 20 61  hset change is a
25f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2600: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2610: 6c 79 20 70 6f 73 69 74 69 6f 6e 65 64 0a 2a 2a  ly positioned.**
2620: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 63   table column, c
2630: 6f 75 6e 74 69 6e 67 20 66 72 6f 6d 20 6c 65 66  ounting from lef
2640: 74 20 74 6f 20 72 69 67 68 74 20 77 69 74 68 69  t to right withi
2650: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
2660: 4c 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  LE .** statement
2670: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 44 45  ..**.** For a DE
2680: 4c 45 54 45 20 63 68 61 6e 67 65 2c 20 61 6c 6c  LETE change, all
2690: 20 66 69 65 6c 64 73 20 77 69 74 68 69 6e 20 74   fields within t
26a0: 68 65 20 72 65 63 6f 72 64 20 65 78 63 65 70 74  he record except
26b0: 20 74 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65   those associate
26c0: 64 0a 2a 2a 20 77 69 74 68 20 50 52 49 4d 41 52  d.** with PRIMAR
26d0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72  Y KEY columns ar
26e0: 65 20 6f 6d 69 74 74 65 64 2e 20 54 68 65 20 50  e omitted. The P
26f0: 52 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64  RIMARY KEY field
2700: 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a 2a 2a  s contain the.**
2710: 20 76 61 6c 75 65 73 20 69 64 65 6e 74 69 66 79   values identify
2720: 69 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20 64  ing the row to d
2730: 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elete..**.** For
2740: 20 61 6e 20 55 50 44 41 54 45 20 63 68 61 6e 67   an UPDATE chang
2750: 65 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  e, all fields ex
2760: 63 65 70 74 20 74 68 6f 73 65 20 61 73 73 6f 63  cept those assoc
2770: 69 61 74 65 64 20 77 69 74 68 20 50 52 49 4d 41  iated with PRIMA
2780: 52 59 20 4b 45 59 0a 2a 2a 20 63 6f 6c 75 6d 6e  RY KEY.** column
2790: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 74 68  s and columns th
27a0: 61 74 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  at are modified 
27b0: 62 79 20 74 68 65 20 55 50 44 41 54 45 20 61 72  by the UPDATE ar
27c0: 65 20 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69  e set to "undefi
27d0: 6e 65 64 22 2e 0a 2a 2a 20 50 52 49 4d 41 52 59  ned"..** PRIMARY
27e0: 20 4b 45 59 20 66 69 65 6c 64 73 20 63 6f 6e 74   KEY fields cont
27f0: 61 69 6e 20 74 68 65 20 76 61 6c 75 65 73 20 69  ain the values i
2800: 64 65 6e 74 69 66 79 69 6e 67 20 74 68 65 20 74  dentifying the t
2810: 61 62 6c 65 20 72 6f 77 20 74 6f 20 75 70 64 61  able row to upda
2820: 74 65 2c 0a 2a 2a 20 61 6e 64 20 66 69 65 6c 64  te,.** and field
2830: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2840: 68 20 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d  h modified colum
2850: 6e 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ns contain the n
2860: 65 77 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ew column values
2870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 63 6f  ..**.** The reco
2880: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
2890: 69 74 68 20 49 4e 53 45 52 54 20 63 68 61 6e 67  ith INSERT chang
28a0: 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  es are in the sa
28b0: 6d 65 20 66 6f 72 6d 61 74 20 61 73 20 66 6f 72  me format as for
28c0: 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 73 2e 20  .** changesets. 
28d0: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
28e0: 6c 65 20 66 6f 72 20 61 20 72 65 63 6f 72 64 20  le for a record 
28f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2900: 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 63 68 61  an INSERT.** cha
2910: 6e 67 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  nge to contain a
2920: 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 22 75   field set to "u
2930: 6e 64 65 66 69 6e 65 64 22 2e 0a 2a 2a 0a 2a 2a  ndefined"..**.**
2940: 20 52 45 42 41 53 45 20 42 4c 4f 42 20 46 4f 52   REBASE BLOB FOR
2950: 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 41 20 72 65 62  MAT:.**.** A reb
2960: 61 73 65 20 62 6c 6f 62 20 6d 61 79 20 62 65 20  ase blob may be 
2970: 6f 75 74 70 75 74 20 62 79 20 73 71 6c 69 74 65  output by sqlite
2980: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
2990: 5f 76 32 28 29 20 61 6e 64 20 69 74 73 20 0a 2a  _v2() and its .*
29a0: 2a 20 73 74 72 65 61 6d 69 6e 67 20 65 71 75 69  * streaming equi
29b0: 76 61 6c 65 6e 74 20 66 6f 72 20 75 73 65 20 77  valent for use w
29c0: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
29d0: 72 65 62 61 73 65 72 20 41 50 49 73 20 74 6f 20  rebaser APIs to 
29e0: 72 65 62 61 73 65 0a 2a 2a 20 65 78 69 73 74 69  rebase.** existi
29f0: 6e 67 20 63 68 61 6e 67 65 73 65 74 73 2e 20 41  ng changesets. A
2a00: 20 72 65 62 61 73 65 20 62 6c 6f 62 20 63 6f 6e   rebase blob con
2a10: 74 61 69 6e 73 20 6f 6e 65 20 65 6e 74 72 79 20  tains one entry 
2a20: 66 6f 72 20 65 61 63 68 20 63 6f 6e 66 6c 69 63  for each conflic
2a30: 74 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 75 73  t.** resolved us
2a40: 69 6e 67 20 65 69 74 68 65 72 20 74 68 65 20 4f  ing either the O
2a50: 4d 49 54 20 6f 72 20 52 45 50 4c 41 43 45 20 73  MIT or REPLACE s
2a60: 74 72 61 74 65 67 69 65 73 20 77 69 74 68 69 6e  trategies within
2a70: 20 74 68 65 20 61 70 70 6c 79 5f 76 32 28 29 0a   the apply_v2().
2a80: 2a 2a 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ** call..**.** T
2a90: 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 66  he format used f
2aa0: 6f 72 20 61 20 72 65 62 61 73 65 20 62 6c 6f 62  or a rebase blob
2ab0: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
2ac0: 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 66 6f   to that used fo
2ad0: 72 0a 2a 2a 20 63 68 61 6e 67 65 73 65 74 73 2e  r.** changesets.
2ae0: 20 41 6c 6c 20 65 6e 74 72 69 65 73 20 72 65 6c   All entries rel
2af0: 61 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  ated to a single
2b00: 20 74 61 62 6c 65 20 61 72 65 20 67 72 6f 75 70   table are group
2b10: 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a  ed together..**.
2b20: 2a 2a 20 45 61 63 68 20 67 72 6f 75 70 20 6f 66  ** Each group of
2b30: 20 65 6e 74 72 69 65 73 20 62 65 67 69 6e 73 20   entries begins 
2b40: 77 69 74 68 20 61 20 74 61 62 6c 65 20 68 65 61  with a table hea
2b50: 64 65 72 20 69 6e 20 63 68 61 6e 67 65 73 65 74  der in changeset
2b60: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
2b70: 20 31 20 62 79 74 65 3a 20 43 6f 6e 73 74 61 6e   1 byte: Constan
2b80: 74 20 30 78 35 34 20 28 63 61 70 69 74 61 6c 20  t 0x54 (capital 
2b90: 27 54 27 29 0a 2a 2a 20 20 20 56 61 72 69 6e 74  'T').**   Varint
2ba0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
2bb0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
2bc0: 2e 0a 2a 2a 20 20 20 6e 43 6f 6c 20 62 79 74 65  ..**   nCol byte
2bd0: 73 3a 20 30 78 30 31 20 66 6f 72 20 50 4b 20 63  s: 0x01 for PK c
2be0: 6f 6c 75 6d 6e 73 2c 20 30 78 30 30 20 6f 74 68  olumns, 0x00 oth
2bf0: 65 72 77 69 73 65 2e 0a 2a 2a 20 20 20 4e 20 62  erwise..**   N b
2c00: 79 74 65 73 3a 20 55 6e 71 75 61 6c 69 66 69 65  ytes: Unqualifie
2c10: 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 65 6e  d table name (en
2c20: 63 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d  coded using UTF-
2c30: 38 29 2e 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74  8). Nul-terminat
2c40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 6c 6c 6f 77  ed..**.** Follow
2c50: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
2c60: 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
2c70: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
2c80: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 20 62  ble..**.**   1 b
2c90: 79 74 65 3a 20 45 69 74 68 65 72 20 53 51 4c 49  yte: Either SQLI
2ca0: 54 45 5f 49 4e 53 45 52 54 20 28 30 78 31 32 29  TE_INSERT (0x12)
2cb0: 2c 20 44 45 4c 45 54 45 20 28 30 78 30 39 29 2e  , DELETE (0x09).
2cc0: 0a 2a 2a 20 20 20 31 20 62 79 74 65 3a 20 46 6c  .**   1 byte: Fl
2cd0: 61 67 2e 20 30 78 30 31 20 66 6f 72 20 52 45 50  ag. 0x01 for REP
2ce0: 4c 41 43 45 2c 20 30 78 30 30 20 66 6f 72 20 4f  LACE, 0x00 for O
2cf0: 4d 49 54 2e 0a 2a 2a 20 20 20 72 65 63 6f 72 64  MIT..**   record
2d00: 3a 20 28 69 6e 20 74 68 65 20 72 65 63 6f 72 64  : (in the record
2d10: 20 66 6f 72 6d 61 74 20 64 65 66 69 6e 65 64 20   format defined 
2d20: 61 62 6f 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  above)..**.** In
2d30: 20 61 20 72 65 62 61 73 65 20 62 6c 6f 62 2c 20   a rebase blob, 
2d40: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
2d50: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
2d60: 5f 49 4e 53 45 52 54 20 69 66 20 74 68 65 20 63  _INSERT if the c
2d70: 68 61 6e 67 65 0a 2a 2a 20 74 68 61 74 20 63 61  hange.** that ca
2d80: 75 73 65 64 20 74 68 65 20 63 6f 6e 66 6c 69 63  used the conflic
2d90: 74 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 20  t was an INSERT 
2da0: 6f 72 20 55 50 44 41 54 45 2c 20 6f 72 20 74 6f  or UPDATE, or to
2db0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 69   SQLITE_DELETE i
2dc0: 66 0a 2a 2a 20 69 74 20 77 61 73 20 61 20 44 45  f.** it was a DE
2dd0: 4c 45 54 45 2e 20 54 68 65 20 73 65 63 6f 6e 64  LETE. The second
2de0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2df0: 20 30 78 30 31 20 69 66 20 74 68 65 20 63 6f 6e   0x01 if the con
2e00: 66 6c 69 63 74 20 0a 2a 2a 20 72 65 73 6f 6c 75  flict .** resolu
2e10: 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20 77 61  tion strategy wa
2e20: 73 20 52 45 50 4c 41 43 45 2c 20 6f 72 20 30 78  s REPLACE, or 0x
2e30: 30 30 20 69 66 20 69 74 20 77 61 73 20 4f 4d 49  00 if it was OMI
2e40: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  T..**.** If the 
2e50: 63 68 61 6e 67 65 20 74 68 61 74 20 63 61 75 73  change that caus
2e60: 65 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ed the conflict 
2e70: 77 61 73 20 61 20 44 45 4c 45 54 45 2c 20 74 68  was a DELETE, th
2e80: 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
2e90: 20 72 65 63 6f 72 64 20 69 73 20 61 20 63 6f 70   record is a cop
2ea0: 79 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 72  y of the old.* r
2eb0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 6f  ecord from the o
2ec0: 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65  riginal changese
2ed0: 74 2e 20 49 66 20 69 74 0a 2a 2a 20 77 61 73 20  t. If it.** was 
2ee0: 61 6e 20 49 4e 53 45 52 54 2c 20 74 68 65 6e 20  an INSERT, then 
2ef0: 74 68 65 20 73 69 6e 67 6c 65 20 72 65 63 6f 72  the single recor
2f00: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
2f10: 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e  he new.* record.
2f20: 20 49 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 66 6c   If.** the confl
2f30: 69 63 74 69 6e 67 20 63 68 61 6e 67 65 20 77 61  icting change wa
2f40: 73 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68 65  s an UPDATE, the
2f50: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 72 65 63  n the single rec
2f60: 6f 72 64 20 69 73 20 61 20 63 6f 70 79 0a 2a 2a  ord is a copy.**
2f70: 20 6f 66 20 74 68 65 20 6e 65 77 2e 2a 20 72 65   of the new.* re
2f80: 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 50 4b  cord with the PK
2f90: 20 66 69 65 6c 64 73 20 66 69 6c 6c 65 64 20 69   fields filled i
2fa0: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6f  n based on the o
2fb0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 6c 64 2e 2a  riginal.** old.*
2fc0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 0a 2f 2a 0a   record..*/../*.
2fd0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  ** For each row 
2fe0: 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20  modified during 
2ff0: 61 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 72 65  a session, there
3000: 20 65 78 69 73 74 73 20 61 20 73 69 6e 67 6c 65   exists a single
3010: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
3020: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 73  this structure s
3030: 74 6f 72 65 64 20 69 6e 20 61 20 53 65 73 73 69  tored in a Sessi
3040: 6f 6e 54 61 62 6c 65 2e 61 43 68 61 6e 67 65 5b  onTable.aChange[
3050: 5d 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f  ] hash table..*/
3060: 0a 73 74 72 75 63 74 20 53 65 73 73 69 6f 6e 43  .struct SessionC
3070: 68 61 6e 67 65 20 7b 0a 20 20 69 6e 74 20 6f 70  hange {.  int op
3080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
30a0: 20 6f 66 20 55 50 44 41 54 45 2c 20 44 45 4c 45   of UPDATE, DELE
30b0: 54 45 2c 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20  TE, INSERT */.  
30c0: 69 6e 74 20 62 49 6e 64 69 72 65 63 74 3b 20 20  int bIndirect;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
30f0: 63 68 61 6e 67 65 20 69 73 20 22 69 6e 64 69 72  change is "indir
3100: 65 63 74 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ect" */.  int nR
3110: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
3120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3130: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
3140: 62 75 66 66 65 72 20 61 52 65 63 6f 72 64 5b 5d  buffer aRecord[]
3150: 20 2a 2f 0a 20 20 75 38 20 2a 61 52 65 63 6f 72   */.  u8 *aRecor
3160: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3170: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
3180: 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6c 64 2e 2a  containing old.*
3190: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 53 65 73   record */.  Ses
31a0: 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 4e 65 78  sionChange *pNex
31b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
31c0: 46 6f 72 20 68 61 73 68 2d 74 61 62 6c 65 20 63  For hash-table c
31d0: 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a  ollisions */.};.
31e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 76  ./*.** Write a v
31f0: 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
3200: 20 69 56 61 6c 20 69 6e 74 6f 20 74 68 65 20 62   iVal into the b
3210: 75 66 66 65 72 20 61 74 20 61 42 75 66 2e 20 52  uffer at aBuf. R
3220: 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 6e 75  eturn the .** nu
3230: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
3240: 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  itten..*/.static
3250: 20 69 6e 74 20 73 65 73 73 69 6f 6e 56 61 72 69   int sessionVari
3260: 6e 74 50 75 74 28 75 38 20 2a 61 42 75 66 2c 20  ntPut(u8 *aBuf, 
3270: 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 72 65 74  int iVal){.  ret
3280: 75 72 6e 20 70 75 74 56 61 72 69 6e 74 33 32 28  urn putVarint32(
3290: 61 42 75 66 2c 20 69 56 61 6c 29 3b 0a 7d 0a 0a  aBuf, iVal);.}..
32a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
32b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
32d0: 72 65 20 76 61 6c 75 65 20 69 56 61 6c 20 61 73  re value iVal as
32e0: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2f 0a 73 74   a varint..*/.st
32f0: 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
3300: 56 61 72 69 6e 74 4c 65 6e 28 69 6e 74 20 69 56  VarintLen(int iV
3310: 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  al){.  return sq
3320: 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 69  lite3VarintLen(i
3330: 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Val);.}../*.** R
3340: 65 61 64 20 61 20 76 61 72 69 6e 74 20 76 61 6c  ead a varint val
3350: 75 65 20 66 72 6f 6d 20 61 42 75 66 5b 5d 20 69  ue from aBuf[] i
3360: 6e 74 6f 20 2a 70 69 56 61 6c 2e 20 52 65 74 75  nto *piVal. Retu
3370: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3380: 20 0a 2a 2a 20 62 79 74 65 73 20 72 65 61 64 2e   .** bytes read.
3390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
33a0: 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28  essionVarintGet(
33b0: 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  u8 *aBuf, int *p
33c0: 69 56 61 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  iVal){.  return 
33d0: 67 65 74 56 61 72 69 6e 74 33 32 28 61 42 75 66  getVarint32(aBuf
33e0: 2c 20 2a 70 69 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a  , *piVal);.}../*
33f0: 20 4c 6f 61 64 20 61 6e 20 75 6e 61 6c 69 67 6e   Load an unalign
3400: 65 64 20 61 6e 64 20 75 6e 73 69 67 6e 65 64 20  ed and unsigned 
3410: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 2a  32-bit integer *
3420: 2f 0a 23 64 65 66 69 6e 65 20 53 45 53 53 49 4f  /.#define SESSIO
3430: 4e 5f 55 49 4e 54 33 32 28 78 29 20 28 28 28 75  N_UINT32(x) (((u
3440: 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
3450: 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
3460: 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
3470: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 36 34  ./*.** Read a 64
3480: 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
3490: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 72  integer value fr
34a0: 6f 6d 20 62 75 66 66 65 72 20 61 52 65 63 5b 5d  om buffer aRec[]
34b0: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  . Return.** the 
34c0: 76 61 6c 75 65 20 72 65 61 64 2e 0a 2a 2f 0a 73  value read..*/.s
34d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
34e0: 74 36 34 20 73 65 73 73 69 6f 6e 47 65 74 49 36  t64 sessionGetI6
34f0: 34 28 75 38 20 2a 61 52 65 63 29 7b 0a 20 20 75  4(u8 *aRec){.  u
3500: 36 34 20 78 20 3d 20 53 45 53 53 49 4f 4e 5f 55  64 x = SESSION_U
3510: 49 4e 54 33 32 28 61 52 65 63 29 3b 0a 20 20 75  INT32(aRec);.  u
3520: 33 32 20 79 20 3d 20 53 45 53 53 49 4f 4e 5f 55  32 y = SESSION_U
3530: 49 4e 54 33 32 28 61 52 65 63 2b 34 29 3b 0a 20  INT32(aRec+4);. 
3540: 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
3550: 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
3560: 74 65 33 5f 69 6e 74 36 34 29 78 3b 0a 7d 0a 0a  te3_int64)x;.}..
3570: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36 34  /*.** Write a 64
3580: 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
3590: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 6f  integer value to
35a0: 20 74 68 65 20 62 75 66 66 65 72 20 61 42 75 66   the buffer aBuf
35b0: 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  []..*/.static vo
35c0: 69 64 20 73 65 73 73 69 6f 6e 50 75 74 49 36 34  id sessionPutI64
35d0: 28 75 38 20 2a 61 42 75 66 2c 20 73 71 6c 69 74  (u8 *aBuf, sqlit
35e0: 65 33 5f 69 6e 74 36 34 20 69 29 7b 0a 20 20 61  e3_int64 i){.  a
35f0: 42 75 66 5b 30 5d 20 3d 20 28 69 3e 3e 35 36 29  Buf[0] = (i>>56)
3600: 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
3610: 31 5d 20 3d 20 28 69 3e 3e 34 38 29 20 26 20 30  1] = (i>>48) & 0
3620: 78 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d  xFF;.  aBuf[2] =
3630: 20 28 69 3e 3e 34 30 29 20 26 20 30 78 46 46 3b   (i>>40) & 0xFF;
3640: 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 3e  .  aBuf[3] = (i>
3650: 3e 33 32 29 20 26 20 30 78 46 46 3b 0a 20 20 61  >32) & 0xFF;.  a
3660: 42 75 66 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29  Buf[4] = (i>>24)
3670: 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
3680: 35 5d 20 3d 20 28 69 3e 3e 31 36 29 20 26 20 30  5] = (i>>16) & 0
3690: 78 46 46 3b 0a 20 20 61 42 75 66 5b 36 5d 20 3d  xFF;.  aBuf[6] =
36a0: 20 28 69 3e 3e 20 38 29 20 26 20 30 78 46 46 3b   (i>> 8) & 0xFF;
36b0: 0a 20 20 61 42 75 66 5b 37 5d 20 3d 20 28 69 3e  .  aBuf[7] = (i>
36c0: 3e 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a  > 0) & 0xFF;.}..
36d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36e0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
36f0: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  erialize the con
3700: 74 65 6e 74 73 20 6f 66 20 76 61 6c 75 65 20 70  tents of value p
3710: 56 61 6c 75 65 20 28 73 65 65 0a 2a 2a 20 63 6f  Value (see.** co
3720: 6d 6d 65 6e 74 20 74 69 74 6c 65 64 20 22 52 45  mment titled "RE
3730: 43 4f 52 44 20 46 4f 52 4d 41 54 22 20 61 62 6f  CORD FORMAT" abo
3740: 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ve)..**.** If it
3750: 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
3760: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 66 6f 72  e serialized for
3770: 6d 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69  m of the value i
3780: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 0a 2a 2a  s written to .**
3790: 20 62 75 66 66 65 72 20 61 42 75 66 2e 20 2a 70   buffer aBuf. *p
37a0: 6e 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  nWrite is set to
37b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
37c0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 65 66  ytes written bef
37d0: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
37e0: 2e 20 4f 72 2c 20 69 66 20 61 42 75 66 20 69 73  . Or, if aBuf is
37f0: 20 4e 55 4c 4c 2c 20 74 68 65 20 6f 6e 6c 79 20   NULL, the only 
3800: 74 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  thing this funct
3810: 69 6f 6e 20 64 6f 65 73 20 69 73 0a 2a 2a 20 73  ion does is.** s
3820: 65 74 20 2a 70 6e 57 72 69 74 65 2e 0a 2a 2a 0a  et *pnWrite..**.
3830: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
3840: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
3850: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
3860: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
3870: 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 69 74 68  r occurs.** with
3880: 69 6e 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  in a call to sql
3890: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
38a0: 29 20 28 6d 61 79 20 66 61 69 6c 20 69 66 20 74  ) (may fail if t
38b0: 68 65 20 64 62 20 69 73 20 75 74 66 2d 31 36 29  he db is utf-16)
38c0: 29 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  ) .** SQLITE_NOM
38d0: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
38e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
38f0: 73 73 69 6f 6e 53 65 72 69 61 6c 69 7a 65 56 61  ssionSerializeVa
3900: 6c 75 65 28 0a 20 20 75 38 20 2a 61 42 75 66 2c  lue(.  u8 *aBuf,
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
3930: 2d 4e 55 4c 4c 2c 20 77 72 69 74 65 20 73 65 72  -NULL, write ser
3940: 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 68 65  ialized value he
3950: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
3960: 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 2c 20 20  value *pValue,  
3970: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3980: 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 2a 2f   to serialize */
3990: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
39a0: 20 2a 70 6e 57 72 69 74 65 20 20 20 20 20 20 20   *pnWrite       
39b0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e     /* IN/OUT: In
39c0: 63 72 65 6d 65 6e 74 20 62 79 20 62 79 74 65 73  crement by bytes
39d0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
39e0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 72 69   /* Size of seri
3a10: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 69 6e 20  alized value in 
3a20: 62 79 74 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  bytes */..  if( 
3a30: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  pValue ){.    in
3a40: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
3a60: 61 6c 75 65 20 74 79 70 65 20 28 53 51 4c 49 54  alue type (SQLIT
3a70: 45 5f 4e 55 4c 4c 2c 20 54 45 58 54 20 65 74 63  E_NULL, TEXT etc
3a80: 2e 29 20 2a 2f 0a 20 20 0a 20 20 20 20 65 54 79  .) */.  .    eTy
3a90: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
3aa0: 75 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29 3b  ue_type(pValue);
3ab0: 0a 20 20 20 20 69 66 28 20 61 42 75 66 20 29 20  .    if( aBuf ) 
3ac0: 61 42 75 66 5b 30 5d 20 3d 20 65 54 79 70 65 3b  aBuf[0] = eType;
3ad0: 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68 28 20  .  .    switch( 
3ae0: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
3af0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
3b00: 20 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20   .        nByte 
3b10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3b20: 61 6b 3b 0a 20 20 0a 20 20 20 20 20 20 63 61 73  ak;.  .      cas
3b30: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
3b40: 3a 20 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  : .      case SQ
3b50: 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
3b60: 20 20 20 20 69 66 28 20 61 42 75 66 20 29 7b 0a      if( aBuf ){.
3b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44            /* TOD
3b80: 4f 3a 20 53 51 4c 69 74 65 20 64 6f 65 73 20 73  O: SQLite does s
3b90: 6f 6d 65 74 68 69 6e 67 20 73 70 65 63 69 61 6c  omething special
3ba0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6d 69   to deal with mi
3bb0: 78 65 64 2d 65 6e 64 69 61 6e 0a 20 20 20 20 20  xed-endian.     
3bc0: 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
3bd0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 28 65   point values (e
3be0: 2e 67 2e 20 41 52 4d 37 29 2e 20 54 68 69 73 20  .g. ARM7). This 
3bf0: 63 6f 64 65 20 70 72 6f 62 61 62 6c 79 20 73 68  code probably sh
3c00: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
3c10: 2a 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20  * too.  */.     
3c20: 20 20 20 20 20 75 36 34 20 69 3b 0a 20 20 20 20       u64 i;.    
3c30: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
3c40: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
3c50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
3c60: 20 3d 20 28 75 36 34 29 73 71 6c 69 74 65 33 5f   = (u64)sqlite3_
3c70: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
3c80: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ue);.          }
3c90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3ca0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
3cb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3cc0: 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 3d 3d  sizeof(double)==
3cd0: 38 20 26 26 20 73 69 7a 65 6f 66 28 75 36 34 29  8 && sizeof(u64)
3ce0: 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==8 );.         
3cf0: 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76     r = sqlite3_v
3d00: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
3d10: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
3d20: 20 6d 65 6d 63 70 79 28 26 69 2c 20 26 72 2c 20   memcpy(&i, &r, 
3d30: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  8);.          }.
3d40: 20 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f            sessio
3d50: 6e 50 75 74 49 36 34 28 26 61 42 75 66 5b 31 5d  nPutI64(&aBuf[1]
3d60: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , i);.        }.
3d70: 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
3d80: 39 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61  9; .        brea
3d90: 6b 3b 0a 20 20 0a 20 20 20 20 20 20 64 65 66 61  k;.  .      defa
3da0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 75  ult: {.        u
3db0: 38 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  8 *z;.        in
3dc0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t n;.        int
3dd0: 20 6e 56 61 72 69 6e 74 3b 0a 20 20 0a 20 20 20   nVarint;.  .   
3de0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
3df0: 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
3e00: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
3e10: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20  _BLOB );.       
3e20: 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
3e30: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
3e40: 20 20 20 20 20 7a 20 3d 20 28 75 38 20 2a 29 73       z = (u8 *)s
3e50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3e60: 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  t(pValue);.     
3e70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3e80: 20 20 20 20 7a 20 3d 20 28 75 38 20 2a 29 73 71      z = (u8 *)sq
3e90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3ea0: 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (pValue);.      
3eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
3ec0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
3ed0: 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  tes(pValue);.   
3ee0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26       if( z==0 &&
3ef0: 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
3f00: 42 4c 4f 42 20 7c 7c 20 6e 3e 30 29 20 29 20 72  BLOB || n>0) ) r
3f10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3f20: 45 4d 3b 0a 20 20 20 20 20 20 20 20 6e 56 61 72  EM;.        nVar
3f30: 69 6e 74 20 3d 20 73 65 73 73 69 6f 6e 56 61 72  int = sessionVar
3f40: 69 6e 74 4c 65 6e 28 6e 29 3b 0a 20 20 0a 20 20  intLen(n);.  .  
3f50: 20 20 20 20 20 20 69 66 28 20 61 42 75 66 20 29        if( aBuf )
3f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 73 73  {.          sess
3f70: 69 6f 6e 56 61 72 69 6e 74 50 75 74 28 26 61 42  ionVarintPut(&aB
3f80: 75 66 5b 31 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  uf[1], n);.     
3f90: 20 20 20 20 20 69 66 28 20 6e 20 29 20 6d 65 6d       if( n ) mem
3fa0: 63 70 79 28 26 61 42 75 66 5b 6e 56 61 72 69 6e  cpy(&aBuf[nVarin
3fb0: 74 20 2b 20 31 5d 2c 20 7a 2c 20 6e 29 3b 0a 20  t + 1], z, n);. 
3fc0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
3fd0: 20 20 20 20 6e 42 79 74 65 20 3d 20 31 20 2b 20      nByte = 1 + 
3fe0: 6e 56 61 72 69 6e 74 20 2b 20 6e 3b 0a 20 20 20  nVarint + n;.   
3ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4000: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
4010: 65 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 31  e{.    nByte = 1
4020: 3b 0a 20 20 20 20 69 66 28 20 61 42 75 66 20 29  ;.    if( aBuf )
4030: 20 61 42 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b   aBuf[0] = '\0';
4040: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 6e 57 72  .  }..  if( pnWr
4050: 69 74 65 20 29 20 2a 70 6e 57 72 69 74 65 20 2b  ite ) *pnWrite +
4060: 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75 72  = nByte;.  retur
4070: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
4090: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 6c  o is used to cal
40a0: 63 75 6c 61 74 65 20 68 61 73 68 20 6b 65 79 20  culate hash key 
40b0: 76 61 6c 75 65 73 20 66 6f 72 20 64 61 74 61 20  values for data 
40c0: 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 0a 2a  structures. In.*
40d0: 2a 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20 74  * order to use t
40e0: 68 69 73 20 6d 61 63 72 6f 2c 20 74 68 65 20 65  his macro, the e
40f0: 6e 74 69 72 65 20 64 61 74 61 20 73 74 72 75 63  ntire data struc
4100: 74 75 72 65 20 6d 75 73 74 20 62 65 20 72 65 70  ture must be rep
4110: 72 65 73 65 6e 74 65 64 0a 2a 2a 20 61 73 20 61  resented.** as a
4120: 20 73 65 72 69 65 73 20 6f 66 20 75 6e 73 69 67   series of unsig
4130: 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 20 49 6e  ned integers. In
4140: 20 6f 72 64 65 72 20 74 6f 20 63 61 6c 63 75 6c   order to calcul
4150: 61 74 65 20 61 20 68 61 73 68 2d 6b 65 79 20 76  ate a hash-key v
4160: 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 61 20 64 61  alue.** for a da
4170: 74 61 20 73 74 72 75 63 74 75 72 65 20 72 65 70  ta structure rep
4180: 72 65 73 65 6e 74 65 64 20 61 73 20 74 68 72 65  resented as thre
4190: 65 20 73 75 63 68 20 69 6e 74 65 67 65 72 73 2c  e such integers,
41a0: 20 74 68 65 20 6d 61 63 72 6f 20 6d 61 79 0a 2a   the macro may.*
41b0: 2a 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  * then be used a
41c0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
41d0: 20 20 20 20 69 6e 74 20 68 61 73 68 5f 6b 65 79      int hash_key
41e0: 5f 76 61 6c 75 65 3b 0a 2a 2a 20 20 20 20 68 61  _value;.**    ha
41f0: 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d 20 48  sh_key_value = H
4200: 41 53 48 5f 41 50 50 45 4e 44 28 30 2c 20 3c 76  ASH_APPEND(0, <v
4210: 61 6c 75 65 20 31 3e 29 3b 0a 2a 2a 20 20 20 20  alue 1>);.**    
4220: 68 61 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d  hash_key_value =
4230: 20 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73   HASH_APPEND(has
4240: 68 5f 6b 65 79 5f 76 61 6c 75 65 2c 20 3c 76 61  h_key_value, <va
4250: 6c 75 65 20 32 3e 29 3b 0a 2a 2a 20 20 20 20 68  lue 2>);.**    h
4260: 61 73 68 5f 6b 65 79 5f 76 61 6c 75 65 20 3d 20  ash_key_value = 
4270: 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73 68  HASH_APPEND(hash
4280: 5f 6b 65 79 5f 76 61 6c 75 65 2c 20 3c 76 61 6c  _key_value, <val
4290: 75 65 20 33 3e 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  ue 3>);.**.** In
42a0: 20 70 72 61 63 74 69 63 65 2c 20 74 68 65 20 64   practice, the d
42b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
42c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
42d0: 64 20 66 6f 72 20 61 72 65 20 74 68 65 20 70 72  d for are the pr
42e0: 69 6d 61 72 79 0a 2a 2a 20 6b 65 79 20 76 61 6c  imary.** key val
42f0: 75 65 73 20 6f 66 20 6d 6f 64 69 66 69 65 64 20  ues of modified 
4300: 72 6f 77 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rows..*/.#define
4310: 20 48 41 53 48 5f 41 50 50 45 4e 44 28 68 61 73   HASH_APPEND(has
4320: 68 2c 20 61 64 64 29 20 28 28 68 61 73 68 29 20  h, add) ((hash) 
4330: 3c 3c 20 33 29 20 5e 20 28 68 61 73 68 29 20 5e  << 3) ^ (hash) ^
4340: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 28   (unsigned int)(
4350: 61 64 64 29 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  add)../*.** Appe
4360: 6e 64 20 74 68 65 20 68 61 73 68 20 6f 66 20 74  nd the hash of t
4370: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
4380: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
4390: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
43a0: 74 6f 20 74 68 65 0a 2a 2a 20 68 61 73 68 2d 6b  to the.** hash-k
43b0: 65 79 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ey value passed 
43c0: 61 73 20 74 68 65 20 66 69 72 73 74 2e 20 52 65  as the first. Re
43d0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 68 61 73  turn the new has
43e0: 68 2d 6b 65 79 20 76 61 6c 75 65 2e 0a 2a 2f 0a  h-key value..*/.
43f0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
4400: 69 6e 74 20 73 65 73 73 69 6f 6e 48 61 73 68 41  int sessionHashA
4410: 70 70 65 6e 64 49 36 34 28 75 6e 73 69 67 6e 65  ppendI64(unsigne
4420: 64 20 69 6e 74 20 68 2c 20 69 36 34 20 69 29 7b  d int h, i64 i){
4430: 0a 20 20 68 20 3d 20 48 41 53 48 5f 41 50 50 45  .  h = HASH_APPE
4440: 4e 44 28 68 2c 20 69 20 26 20 30 78 46 46 46 46  ND(h, i & 0xFFFF
4450: 46 46 46 46 29 3b 0a 20 20 72 65 74 75 72 6e 20  FFFF);.  return 
4460: 48 41 53 48 5f 41 50 50 45 4e 44 28 68 2c 20 28  HASH_APPEND(h, (
4470: 69 3e 3e 33 32 29 26 30 78 46 46 46 46 46 46 46  i>>32)&0xFFFFFFF
4480: 46 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  F);.}../*.** App
4490: 65 6e 64 20 74 68 65 20 68 61 73 68 20 6f 66 20  end the hash of 
44a0: 74 68 65 20 62 6c 6f 62 20 70 61 73 73 65 64 20  the blob passed 
44b0: 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
44c0: 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
44d0: 74 73 20 74 6f 20 0a 2a 2a 20 74 68 65 20 68 61  ts to .** the ha
44e0: 73 68 2d 6b 65 79 20 76 61 6c 75 65 20 70 61 73  sh-key value pas
44f0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
4500: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77  . Return the new
4510: 20 68 61 73 68 2d 6b 65 79 20 76 61 6c 75 65 2e   hash-key value.
4520: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
4530: 6e 65 64 20 69 6e 74 20 73 65 73 73 69 6f 6e 48  ned int sessionH
4540: 61 73 68 41 70 70 65 6e 64 42 6c 6f 62 28 75 6e  ashAppendBlob(un
4550: 73 69 67 6e 65 64 20 69 6e 74 20 68 2c 20 69 6e  signed int h, in
4560: 74 20 6e 2c 20 63 6f 6e 73 74 20 75 38 20 2a 7a  t n, const u8 *z
4570: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4580: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
4590: 20 68 20 3d 20 48 41 53 48 5f 41 50 50 45 4e 44   h = HASH_APPEND
45a0: 28 68 2c 20 7a 5b 69 5d 29 3b 0a 20 20 72 65 74  (h, z[i]);.  ret
45b0: 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn h;.}../*.** 
45c0: 41 70 70 65 6e 64 20 74 68 65 20 68 61 73 68 20  Append the hash 
45d0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 79 70 65  of the data type
45e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
45f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
4600: 6f 20 74 68 65 0a 2a 2a 20 68 61 73 68 2d 6b 65  o the.** hash-ke
4610: 79 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  y value passed a
4620: 73 20 74 68 65 20 66 69 72 73 74 2e 20 52 65 74  s the first. Ret
4630: 75 72 6e 20 74 68 65 20 6e 65 77 20 68 61 73 68  urn the new hash
4640: 2d 6b 65 79 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  -key value..*/.s
4650: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
4660: 6e 74 20 73 65 73 73 69 6f 6e 48 61 73 68 41 70  nt sessionHashAp
4670: 70 65 6e 64 54 79 70 65 28 75 6e 73 69 67 6e 65  pendType(unsigne
4680: 64 20 69 6e 74 20 68 2c 20 69 6e 74 20 65 54 79  d int h, int eTy
4690: 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 48 41  pe){.  return HA
46a0: 53 48 5f 41 50 50 45 4e 44 28 68 2c 20 65 54 79  SH_APPEND(h, eTy
46b0: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
46c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
46d0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
46e0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 70 72 65  rom within a pre
46f0: 2d 75 70 64 61 74 65 20 63 61 6c 6c 62 61 63 6b  -update callback
4700: 2e 0a 2a 2a 20 49 74 20 63 61 6c 63 75 6c 61 74  ..** It calculat
4710: 65 73 20 61 20 68 61 73 68 20 62 61 73 65 64 20  es a hash based 
4720: 6f 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  on the primary k
4730: 65 79 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ey values of the
4740: 20 6f 6c 64 2e 2a 20 6f 72 20 0a 2a 2a 20 6e 65   old.* or .** ne
4750: 77 2e 2a 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  w.* row currentl
4760: 79 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 2c  y available and,
4770: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
4780: 6f 72 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65  or occurs, write
4790: 73 20 69 74 20 74 6f 0a 2a 2a 20 2a 70 69 48 61  s it to.** *piHa
47a0: 73 68 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  sh before return
47b0: 69 6e 67 2e 20 49 66 20 74 68 65 20 70 72 69 6d  ing. If the prim
47c0: 61 72 79 20 6b 65 79 20 63 6f 6e 74 61 69 6e 73  ary key contains
47d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
47e0: 4c 0a 2a 2a 20 76 61 6c 75 65 73 2c 20 2a 70 62  L.** values, *pb
47f0: 4e 75 6c 6c 50 4b 20 69 73 20 73 65 74 20 74 6f  NullPK is set to
4800: 20 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74   true before ret
4810: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
4820: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4830: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
4840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
4850: 65 64 20 61 6e 64 20 74 68 65 20 66 69 6e 61 6c  ed and the final
4860: 20 76 61 6c 75 65 73 0a 2a 2a 20 6f 66 20 2a 70   values.** of *p
4870: 69 48 61 73 68 20 61 73 6e 20 2a 70 62 4e 75 6c  iHash asn *pbNul
4880: 6c 50 4b 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lPK are undefine
4890: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
48a0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
48b0: 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6f  ned.** and the o
48c0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
48d0: 61 72 65 20 73 65 74 20 61 73 20 64 65 73 63 72  are set as descr
48e0: 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
48f0: 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
4900: 6e 50 72 65 75 70 64 61 74 65 48 61 73 68 28 0a  nPreupdateHash(.
4910: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
4920: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20  n *pSession,    
4930: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a    /* Session obj
4940: 65 63 74 20 74 68 61 74 20 6f 77 6e 73 20 70 54  ect that owns pT
4950: 61 62 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54  ab */.  SessionT
4960: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
4970: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69          /* Sessi
4980: 6f 6e 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  on table handle 
4990: 2a 2f 0a 20 20 69 6e 74 20 62 4e 65 77 2c 20 20  */.  int bNew,  
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
49c0: 68 61 73 68 20 74 68 65 20 6e 65 77 2e 2a 20 50  hash the new.* P
49d0: 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 61  K */.  int *piHa
49e0: 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sh,             
49f0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48         /* OUT: H
4a00: 61 73 68 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ash value */.  i
4a10: 6e 74 20 2a 70 62 4e 75 6c 6c 50 4b 20 20 20 20  nt *pbNullPK    
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a30: 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 74  * OUT: True if t
4a40: 68 65 72 65 20 61 72 65 20 4e 55 4c 4c 20 76 61  here are NULL va
4a50: 6c 75 65 73 20 69 6e 20 50 4b 20 2a 2f 0a 29 7b  lues in PK */.){
4a60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4a70: 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  h = 0;          
4a80: 20 20 20 2f 2a 20 48 61 73 68 20 76 61 6c 75 65     /* Hash value
4a90: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
4aa0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
4ad0: 74 65 20 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d  te through colum
4ae0: 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
4af0: 20 2a 70 62 4e 75 6c 6c 50 4b 3d 3d 30 20 29 3b   *pbNullPK==0 );
4b00: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
4b10: 3e 6e 43 6f 6c 3d 3d 70 53 65 73 73 69 6f 6e 2d  >nCol==pSession-
4b20: 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74 28 70 53 65  >hook.xCount(pSe
4b30: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78  ssion->hook.pCtx
4b40: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
4b50: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
4b60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
4b70: 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20  ->abPK[i] ){.   
4b80: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
4b90: 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
4ba0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4bb0: 2a 70 56 61 6c 3b 0a 0a 20 20 20 20 20 20 69 66  *pVal;..      if
4bc0: 28 20 62 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( bNew ){.      
4bd0: 20 20 72 63 20 3d 20 70 53 65 73 73 69 6f 6e 2d    rc = pSession-
4be0: 3e 68 6f 6f 6b 2e 78 4e 65 77 28 70 53 65 73 73  >hook.xNew(pSess
4bf0: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20  ion->hook.pCtx, 
4c00: 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  i, &pVal);.     
4c10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c20: 72 63 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 68  rc = pSession->h
4c30: 6f 6f 6b 2e 78 4f 6c 64 28 70 53 65 73 73 69 6f  ook.xOld(pSessio
4c40: 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 2c  n->hook.pCtx, i,
4c50: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d   &pVal);.      }
4c60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
4c70: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4c80: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 65 54 79  n rc;..      eTy
4c90: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
4ca0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ue_type(pVal);. 
4cb0: 20 20 20 20 20 68 20 3d 20 73 65 73 73 69 6f 6e       h = session
4cc0: 48 61 73 68 41 70 70 65 6e 64 54 79 70 65 28 68  HashAppendType(h
4cd0: 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , eType);.      
4ce0: 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
4cf0: 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54 79  E_INTEGER || eTy
4d00: 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
4d10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
4d20: 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  iVal;.        if
4d30: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
4d40: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
4d50: 20 20 20 20 20 69 56 61 6c 20 3d 20 73 71 6c 69       iVal = sqli
4d60: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
4d70: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pVal);.        }
4d80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4d90: 64 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71  double rVal = sq
4da0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
4db0: 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  le(pVal);.      
4dc0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
4dd0: 6f 66 28 69 56 61 6c 29 3d 3d 38 20 26 26 20 73  of(iVal)==8 && s
4de0: 69 7a 65 6f 66 28 72 56 61 6c 29 3d 3d 38 20 29  izeof(rVal)==8 )
4df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
4e00: 70 79 28 26 69 56 61 6c 2c 20 26 72 56 61 6c 2c  py(&iVal, &rVal,
4e10: 20 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   8);.        }. 
4e20: 20 20 20 20 20 20 20 68 20 3d 20 73 65 73 73 69         h = sessi
4e30: 6f 6e 48 61 73 68 41 70 70 65 6e 64 49 36 34 28  onHashAppendI64(
4e40: 68 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  h, iVal);.      
4e50: 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
4e60: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
4e70: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
4e80: 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  OB ){.        co
4e90: 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
4ea0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
4eb0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
4ec0: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
4ed0: 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
4ee0: 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
4ef0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
4f00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4f10: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f           z = (co
4f20: 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
4f30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
4f40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4f50: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
4f60: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
4f70: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
4f80: 21 7a 20 26 26 20 28 65 54 79 70 65 21 3d 53 51  !z && (eType!=SQ
4f90: 4c 49 54 45 5f 42 4c 4f 42 20 7c 7c 20 6e 3e 30  LITE_BLOB || n>0
4fa0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
4fb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
4fc0: 20 68 20 3d 20 73 65 73 73 69 6f 6e 48 61 73 68   h = sessionHash
4fd0: 41 70 70 65 6e 64 42 6c 6f 62 28 68 2c 20 6e 2c  AppendBlob(h, n,
4fe0: 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
4ff0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5000: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
5010: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
5020: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 62 53  assert( pTab->bS
5030: 74 61 74 31 3d 3d 30 20 7c 7c 20 69 21 3d 31 20  tat1==0 || i!=1 
5040: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 75  );.        *pbNu
5050: 6c 6c 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20  llPK = 1;.      
5060: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
5070: 70 69 48 61 73 68 20 3d 20 28 68 20 25 20 70 54  piHash = (h % pT
5080: 61 62 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20  ab->nChange);.  
5090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62  ;.}../*.** The b
50b0: 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20 61  uffer that the a
50c0: 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74  rgument points t
50d0: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 72  o contains a ser
50e0: 69 61 6c 69 7a 65 64 20 53 51 4c 20 76 61 6c 75  ialized SQL valu
50f0: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
5100: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5110: 20 6f 66 20 73 70 61 63 65 20 6f 63 63 75 70 69   of space occupi
5120: 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  ed by the value 
5130: 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68  (including.** th
5140: 65 20 74 79 70 65 20 62 79 74 65 29 2e 0a 2a 2f  e type byte)..*/
5150: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
5160: 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 75 38 20  ionSerialLen(u8 
5170: 2a 61 29 7b 0a 20 20 69 6e 74 20 65 20 3d 20 2a  *a){.  int e = *
5180: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66  a;.  int n;.  if
5190: 28 20 65 3d 3d 30 20 7c 7c 20 65 3d 3d 30 78 46  ( e==0 || e==0xF
51a0: 46 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  F ) return 1;.  
51b0: 69 66 28 20 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  if( e==SQLITE_NU
51c0: 4c 4c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  LL ) return 1;. 
51d0: 20 69 66 28 20 65 3d 3d 53 51 4c 49 54 45 5f 49   if( e==SQLITE_I
51e0: 4e 54 45 47 45 52 20 7c 7c 20 65 3d 3d 53 51 4c  NTEGER || e==SQL
51f0: 49 54 45 5f 46 4c 4f 41 54 20 29 20 72 65 74 75  ITE_FLOAT ) retu
5200: 72 6e 20 39 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 9;.  return s
5210: 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28  essionVarintGet(
5220: 26 61 5b 31 5d 2c 20 26 6e 29 20 2b 20 31 20 2b  &a[1], &n) + 1 +
5230: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 73   n;.}../*.** Bas
5240: 65 64 20 6f 6e 20 74 68 65 20 70 72 69 6d 61 72  ed on the primar
5250: 79 20 6b 65 79 20 76 61 6c 75 65 73 20 73 74 6f  y key values sto
5260: 72 65 64 20 69 6e 20 63 68 61 6e 67 65 20 61 52  red in change aR
5270: 65 63 6f 72 64 2c 20 63 61 6c 63 75 6c 61 74 65  ecord, calculate
5280: 20 61 0a 2a 2a 20 68 61 73 68 20 6b 65 79 2e 20   a.** hash key. 
5290: 41 73 73 75 6d 65 20 74 68 65 20 68 61 73 20 74  Assume the has t
52a0: 61 62 6c 65 20 68 61 73 20 6e 42 75 63 6b 65 74  able has nBucket
52b0: 20 62 75 63 6b 65 74 73 2e 20 54 68 65 20 68 61   buckets. The ha
52c0: 73 68 20 6b 65 79 73 0a 2a 2a 20 63 61 6c 63 75  sh keys.** calcu
52d0: 6c 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  lated by this fu
52e0: 6e 63 74 69 6f 6e 20 61 72 65 20 63 6f 6d 70 61  nction are compa
52f0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 6f 73 65  tible with those
5300: 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 0a 2a   calculated by.*
5310: 2a 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61  * sessionPreupda
5320: 74 65 48 61 73 68 28 29 2e 0a 2a 2a 0a 2a 2a 20  teHash()..**.** 
5330: 54 68 65 20 62 50 6b 4f 6e 6c 79 20 61 72 67 75  The bPkOnly argu
5340: 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
5350: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 61   if the record a
5360: 74 20 61 52 65 63 6f 72 64 5b 5d 20 69 73 20 66  t aRecord[] is f
5370: 72 6f 6d 0a 2a 2a 20 61 20 70 61 74 63 68 73 65  rom.** a patchse
5380: 74 20 44 45 4c 45 54 45 2e 20 49 6e 20 74 68 69  t DELETE. In thi
5390: 73 20 63 61 73 65 20 74 68 65 20 6e 6f 6e 2d 50  s case the non-P
53a0: 4b 20 66 69 65 6c 64 73 20 61 72 65 20 6f 6d 69  K fields are omi
53b0: 74 74 65 64 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  tted entirely..*
53c0: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
53d0: 64 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  d int sessionCha
53e0: 6e 67 65 48 61 73 68 28 0a 20 20 53 65 73 73 69  ngeHash(.  Sessi
53f0: 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20  onTable *pTab,  
5400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
5410: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
5420: 69 6e 74 20 62 50 6b 4f 6e 6c 79 2c 20 20 20 20  int bPkOnly,    
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 2f 2a 20 52 65 63 6f 72 64 20 63 6f 6e 73 69 73  /* Record consis
5450: 74 73 20 6f 66 20 50 4b 20 66 69 65 6c 64 73 20  ts of PK fields 
5460: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 2a 61 52  only */.  u8 *aR
5470: 65 63 6f 72 64 2c 20 20 20 20 20 20 20 20 20 20  ecord,          
5480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
5490: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  nge record */.  
54a0: 69 6e 74 20 6e 42 75 63 6b 65 74 20 20 20 20 20  int nBucket     
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 2f 2a 20 41 73 73 75 6d 65 20 74 68 69 73 20 6d  /* Assume this m
54d0: 61 6e 79 20 62 75 63 6b 65 74 73 20 69 6e 20 68  any buckets in h
54e0: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ash table */.){.
54f0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 68    unsigned int h
5500: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5510: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
5520: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  turn */.  int i;
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
5550: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
5560: 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ough columns */.
5570: 20 20 75 38 20 2a 61 20 3d 20 61 52 65 63 6f 72    u8 *a = aRecor
5580: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5590: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
55a0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68 61  rate through cha
55b0: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  nge record */.. 
55c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
55d0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
55e0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a 61    int eType = *a
55f0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 50 4b 20 3d  ;.    int isPK =
5600: 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 3b 0a   pTab->abPK[i];.
5610: 20 20 20 20 69 66 28 20 62 50 6b 4f 6e 6c 79 20      if( bPkOnly 
5620: 26 26 20 69 73 50 4b 3d 3d 30 20 29 20 63 6f 6e  && isPK==0 ) con
5630: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
5640: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
5650: 65 20 66 6f 72 20 65 54 79 70 65 20 74 6f 20 62  e for eType to b
5660: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 68 65  e SQLITE_NULL he
5670: 72 65 2e 20 54 68 65 20 73 65 73 73 69 6f 6e 20  re. The session 
5680: 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 64  .    ** module d
5690: 6f 65 73 20 6e 6f 74 20 72 65 63 6f 72 64 20 63  oes not record c
56a0: 68 61 6e 67 65 73 20 66 6f 72 20 72 6f 77 73 20  hanges for rows 
56b0: 77 69 74 68 20 4e 55 4c 4c 20 76 61 6c 75 65 73  with NULL values
56c0: 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 2a   stored in.    *
56d0: 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  * primary key co
56e0: 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 61 73  lumns. */.    as
56f0: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
5700: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65  ITE_INTEGER || e
5710: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
5720: 41 54 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  AT .         || 
5730: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
5740: 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  XT || eType==SQL
5750: 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  ITE_BLOB .      
5760: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
5770: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 54 79 70  ITE_NULL || eTyp
5780: 65 3d 3d 30 20 0a 20 20 20 20 29 3b 0a 20 20 20  e==0 .    );.   
5790: 20 61 73 73 65 72 74 28 20 21 69 73 50 4b 20 7c   assert( !isPK |
57a0: 7c 20 28 65 54 79 70 65 21 3d 30 20 26 26 20 65  | (eType!=0 && e
57b0: 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type!=SQLITE_NUL
57c0: 4c 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  L) );..    if( i
57d0: 73 50 4b 20 29 7b 0a 20 20 20 20 20 20 61 2b 2b  sPK ){.      a++
57e0: 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 65 73 73  ;.      h = sess
57f0: 69 6f 6e 48 61 73 68 41 70 70 65 6e 64 54 79 70  ionHashAppendTyp
5800: 65 28 68 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  e(h, eType);.   
5810: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
5820: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20  LITE_INTEGER || 
5830: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
5840: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 68  OAT ){.        h
5850: 20 3d 20 73 65 73 73 69 6f 6e 48 61 73 68 41 70   = sessionHashAp
5860: 70 65 6e 64 49 36 34 28 68 2c 20 73 65 73 73 69  pendI64(h, sessi
5870: 6f 6e 47 65 74 49 36 34 28 61 29 29 3b 0a 20 20  onGetI64(a));.  
5880: 20 20 20 20 20 20 61 20 2b 3d 20 38 3b 0a 20 20        a += 8;.  
5890: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
58a0: 20 20 20 69 6e 74 20 6e 3b 20 0a 20 20 20 20 20     int n; .     
58b0: 20 20 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 56     a += sessionV
58c0: 61 72 69 6e 74 47 65 74 28 61 2c 20 26 6e 29 3b  arintGet(a, &n);
58d0: 0a 20 20 20 20 20 20 20 20 68 20 3d 20 73 65 73  .        h = ses
58e0: 73 69 6f 6e 48 61 73 68 41 70 70 65 6e 64 42 6c  sionHashAppendBl
58f0: 6f 62 28 68 2c 20 6e 2c 20 61 29 3b 0a 20 20 20  ob(h, n, a);.   
5900: 20 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20       a += n;.   
5910: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5920: 20 20 20 20 20 20 61 20 2b 3d 20 73 65 73 73 69        a += sessi
5930: 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 29 3b 0a  onSerialLen(a);.
5940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5950: 72 6e 20 28 68 20 25 20 6e 42 75 63 6b 65 74 29  rn (h % nBucket)
5960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
5970: 65 6e 74 73 20 61 4c 65 66 74 20 61 6e 64 20 61  ents aLeft and a
5980: 52 69 67 68 74 20 61 72 65 20 70 6f 69 6e 74 65  Right are pointe
5990: 72 73 20 74 6f 20 63 68 61 6e 67 65 20 72 65 63  rs to change rec
59a0: 6f 72 64 73 20 66 6f 72 20 74 61 62 6c 65 20 70  ords for table p
59b0: 54 61 62 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  Tab..** This fun
59c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
59d0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 72 65  ue if the two re
59e0: 63 6f 72 64 73 20 61 70 70 6c 79 20 74 6f 20 74  cords apply to t
59f0: 68 65 20 73 61 6d 65 20 72 6f 77 20 28 69 2e 65  he same row (i.e
5a00: 2e 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  ..** have the sa
5a10: 6d 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  me values stored
5a20: 20 69 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20   in the primary 
5a30: 6b 65 79 20 63 6f 6c 75 6d 6e 73 29 2c 20 6f 72  key columns), or
5a40: 20 66 61 6c 73 65 20 0a 2a 2a 20 6f 74 68 65 72   false .** other
5a50: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
5a60: 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  int sessionChang
5a70: 65 45 71 75 61 6c 28 0a 20 20 53 65 73 73 69 6f  eEqual(.  Sessio
5a80: 6e 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  nTable *pTab,   
5a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
5aa0: 6c 65 20 75 73 65 64 20 66 6f 72 20 50 4b 20 64  le used for PK d
5ab0: 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  efinition */.  i
5ac0: 6e 74 20 62 4c 65 66 74 50 6b 4f 6e 6c 79 2c 20  nt bLeftPkOnly, 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ae0: 2a 20 54 72 75 65 20 69 66 20 61 4c 65 66 74 5b  * True if aLeft[
5af0: 5d 20 63 6f 6e 74 61 69 6e 73 20 50 4b 20 66 69  ] contains PK fi
5b00: 65 6c 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 75  elds only */.  u
5b10: 38 20 2a 61 4c 65 66 74 2c 20 20 20 20 20 20 20  8 *aLeft,       
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b30: 2a 20 43 68 61 6e 67 65 20 72 65 63 6f 72 64 20  * Change record 
5b40: 2a 2f 0a 20 20 69 6e 74 20 62 52 69 67 68 74 50  */.  int bRightP
5b50: 6b 4f 6e 6c 79 2c 20 20 20 20 20 20 20 20 20 20  kOnly,          
5b60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5b70: 61 52 69 67 68 74 5b 5d 20 63 6f 6e 74 61 69 6e  aRight[] contain
5b80: 73 20 50 4b 20 66 69 65 6c 64 73 20 6f 6e 6c 79  s PK fields only
5b90: 20 2a 2f 0a 20 20 75 38 20 2a 61 52 69 67 68 74   */.  u8 *aRight
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
5bc0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 75  record */.){.  u
5bd0: 38 20 2a 61 31 20 3d 20 61 4c 65 66 74 3b 20 20  8 *a1 = aLeft;  
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5bf0: 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72  * Cursor to iter
5c00: 61 74 65 20 74 68 72 6f 75 67 68 20 61 4c 65 66  ate through aLef
5c10: 74 20 2a 2f 0a 20 20 75 38 20 2a 61 32 20 3d 20  t */.  u8 *a2 = 
5c20: 61 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  aRight;         
5c30: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
5c40: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
5c50: 75 67 68 20 61 52 69 67 68 74 20 2a 2f 0a 20 20  ugh aRight */.  
5c60: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
5c90: 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
5ca0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 66   columns */..  f
5cb0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
5cc0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
5cd0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
5ce0: 62 2d 3e 61 62 50 4b 5b 69 43 6f 6c 5d 20 29 7b  b->abPK[iCol] ){
5cf0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 31 20 3d 20  .      int n1 = 
5d00: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
5d10: 28 61 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (a1);.      int 
5d20: 6e 32 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69  n2 = sessionSeri
5d30: 61 6c 4c 65 6e 28 61 32 29 3b 0a 0a 20 20 20 20  alLen(a2);..    
5d40: 20 20 69 66 28 20 6e 31 21 3d 6e 32 20 7c 7c 20    if( n1!=n2 || 
5d50: 6d 65 6d 63 6d 70 28 61 31 2c 20 61 32 2c 20 6e  memcmp(a1, a2, n
5d60: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  1) ){.        re
5d70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
5d80: 20 20 20 20 20 20 61 31 20 2b 3d 20 6e 31 3b 0a        a1 += n1;.
5d90: 20 20 20 20 20 20 61 32 20 2b 3d 20 6e 32 3b 0a        a2 += n2;.
5da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5db0: 20 69 66 28 20 62 4c 65 66 74 50 6b 4f 6e 6c 79   if( bLeftPkOnly
5dc0: 3d 3d 30 20 29 20 61 31 20 2b 3d 20 73 65 73 73  ==0 ) a1 += sess
5dd0: 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 31 29  ionSerialLen(a1)
5de0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 69 67  ;.      if( bRig
5df0: 68 74 50 6b 4f 6e 6c 79 3d 3d 30 20 29 20 61 32  htPkOnly==0 ) a2
5e00: 20 2b 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61   += sessionSeria
5e10: 6c 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20 7d 0a  lLen(a2);.    }.
5e20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
5e40: 6e 74 73 20 61 4c 65 66 74 20 61 6e 64 20 61 52  nts aLeft and aR
5e50: 69 67 68 74 20 62 6f 74 68 20 70 6f 69 6e 74 20  ight both point 
5e60: 74 6f 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61  to buffers conta
5e70: 69 6e 69 6e 67 20 63 68 61 6e 67 65 0a 2a 2a 20  ining change.** 
5e80: 72 65 63 6f 72 64 73 20 77 69 74 68 20 6e 43 6f  records with nCo
5e90: 6c 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  l columns. This 
5ea0: 66 75 6e 63 74 69 6f 6e 20 22 6d 65 72 67 65 73  function "merges
5eb0: 22 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64  " the two record
5ec0: 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  s into.** a sing
5ed0: 6c 65 20 72 65 63 6f 72 64 73 20 77 68 69 63 68  le records which
5ee0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
5ef0: 68 65 20 62 75 66 66 65 72 20 61 74 20 2a 70 61  he buffer at *pa
5f00: 4f 75 74 2e 20 2a 70 61 4f 75 74 20 69 73 0a 2a  Out. *paOut is.*
5f10: 2a 20 74 68 65 6e 20 73 65 74 20 74 6f 20 70 6f  * then set to po
5f20: 69 6e 74 20 74 6f 20 6f 6e 65 20 62 79 74 65 20  int to one byte 
5f30: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
5f40: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
5f50: 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  re .** returning
5f60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 72 67  ..**.** The merg
5f70: 69 6e 67 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ing of records i
5f80: 73 20 64 6f 6e 65 20 61 73 20 66 6f 6c 6c 6f 77  s done as follow
5f90: 73 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75  s: For each colu
5fa0: 6d 6e 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  mn, if the .** a
5fb0: 52 69 67 68 74 20 72 65 63 6f 72 64 20 63 6f 6e  Right record con
5fc0: 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 66 6f  tains a value fo
5fd0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 63 6f  r the column, co
5fe0: 70 79 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  py the value fro
5ff0: 6d 0a 2a 2a 20 74 68 65 69 72 2e 20 4f 74 68 65  m.** their. Othe
6000: 72 77 69 73 65 2c 20 69 66 20 61 4c 65 66 74 20  rwise, if aLeft 
6010: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
6020: 2c 20 63 6f 70 79 20 69 74 2e 20 49 66 20 6e 65  , copy it. If ne
6030: 69 74 68 65 72 0a 2a 2a 20 72 65 63 6f 72 64 20  ither.** record 
6040: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
6050: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 63 6f 6c   for a given col
6060: 75 6d 6e 2c 20 74 68 65 6e 20 6e 65 69 74 68 65  umn, then neithe
6070: 72 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 6f 75  r does the.** ou
6080: 74 70 75 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  tput record..*/.
6090: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
60a0: 69 6f 6e 4d 65 72 67 65 52 65 63 6f 72 64 28 0a  ionMergeRecord(.
60b0: 20 20 75 38 20 2a 2a 70 61 4f 75 74 2c 20 0a 20    u8 **paOut, . 
60c0: 20 69 6e 74 20 6e 43 6f 6c 2c 0a 20 20 75 38 20   int nCol,.  u8 
60d0: 2a 61 4c 65 66 74 2c 0a 20 20 75 38 20 2a 61 52  *aLeft,.  u8 *aR
60e0: 69 67 68 74 0a 29 7b 0a 20 20 75 38 20 2a 61 31  ight.){.  u8 *a1
60f0: 20 3d 20 61 4c 65 66 74 3b 20 20 20 20 20 20 20   = aLeft;       
6100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
6110: 73 6f 72 20 75 73 65 64 20 74 6f 20 69 74 65 72  sor used to iter
6120: 61 74 65 20 74 68 72 6f 75 67 68 20 61 4c 65 66  ate through aLef
6130: 74 20 2a 2f 0a 20 20 75 38 20 2a 61 32 20 3d 20  t */.  u8 *a2 = 
6140: 61 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  aRight;         
6150: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
6160: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
6170: 20 74 68 72 6f 75 67 68 20 61 52 69 67 68 74 20   through aRight 
6180: 2a 2f 0a 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  */.  u8 *aOut = 
6190: 2a 70 61 4f 75 74 3b 20 20 20 20 20 20 20 20 20  *paOut;         
61a0: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
61b0: 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  ursor */.  int i
61c0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
61d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
61e0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 66 72  ed to iterate fr
61f0: 6f 6d 20 30 20 74 6f 20 6e 43 6f 6c 20 2a 2f 0a  om 0 to nCol */.
6200: 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69  .  for(iCol=0; i
6210: 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  Col<nCol; iCol++
6220: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 31 20 3d 20  ){.    int n1 = 
6230: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
6240: 28 61 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 32  (a1);.    int n2
6250: 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c   = sessionSerial
6260: 4c 65 6e 28 61 32 29 3b 0a 20 20 20 20 69 66 28  Len(a2);.    if(
6270: 20 2a 61 32 20 29 7b 0a 20 20 20 20 20 20 6d 65   *a2 ){.      me
6280: 6d 63 70 79 28 61 4f 75 74 2c 20 61 32 2c 20 6e  mcpy(aOut, a2, n
6290: 32 29 3b 0a 20 20 20 20 20 20 61 4f 75 74 20 2b  2);.      aOut +
62a0: 3d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = n2;.    }else{
62b0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 4f  .      memcpy(aO
62c0: 75 74 2c 20 61 31 2c 20 6e 31 29 3b 0a 20 20 20  ut, a1, n1);.   
62d0: 20 20 20 61 4f 75 74 20 2b 3d 20 6e 31 3b 0a 20     aOut += n1;. 
62e0: 20 20 20 7d 0a 20 20 20 20 61 31 20 2b 3d 20 6e     }.    a1 += n
62f0: 31 3b 0a 20 20 20 20 61 32 20 2b 3d 20 6e 32 3b  1;.    a2 += n2;
6300: 0a 20 20 7d 0a 0a 20 20 2a 70 61 4f 75 74 20 3d  .  }..  *paOut =
6310: 20 61 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOut;.}../*.** 
6320: 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65 72  This is a helper
6330: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
6340: 79 20 73 65 73 73 69 6f 6e 4d 65 72 67 65 55 70  y sessionMergeUp
6350: 64 61 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  date()..**.** Wh
6360: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
6370: 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 6f 74 68   is called, both
6380: 20 2a 70 61 4f 6e 65 20 61 6e 64 20 2a 70 61 54   *paOne and *paT
6390: 77 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  wo point to a va
63a0: 6c 75 65 20 0a 2a 2a 20 77 69 74 68 69 6e 20 61  lue .** within a
63b0: 20 63 68 61 6e 67 65 20 72 65 63 6f 72 64 2e 20   change record. 
63c0: 42 65 66 6f 72 65 20 69 74 20 72 65 74 75 72 6e  Before it return
63d0: 73 2c 20 62 6f 74 68 20 68 61 76 65 20 62 65 65  s, both have bee
63e0: 6e 20 61 64 76 61 6e 63 65 64 20 73 6f 20 0a 2a  n advanced so .*
63f0: 2a 20 61 73 20 74 6f 20 70 6f 69 6e 74 20 74 6f  * as to point to
6400: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
6410: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 2a  in the record..*
6420: 2a 0a 2a 2a 20 49 66 2c 20 77 68 65 6e 20 74 68  *.** If, when th
6430: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6440: 61 6c 6c 65 64 2c 20 2a 70 61 54 77 6f 20 70 6f  alled, *paTwo po
6450: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
6460: 76 61 6c 75 65 20 28 69 2e 65 2e 0a 2a 2a 20 2a  value (i.e..** *
6470: 70 61 54 77 6f 5b 30 5d 20 69 73 20 6e 6f 74 20  paTwo[0] is not 
6480: 30 78 30 30 20 2d 20 74 68 65 20 22 6e 6f 20 76  0x00 - the "no v
6490: 61 6c 75 65 22 20 70 6c 61 63 65 68 6f 6c 64 65  alue" placeholde
64a0: 72 29 2c 20 61 20 63 6f 70 79 20 6f 66 20 74 68  r), a copy of th
64b0: 65 20 2a 70 61 54 77 6f 0a 2a 2a 20 70 6f 69 6e  e *paTwo.** poin
64c0: 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ter is returned 
64d0: 61 6e 64 20 2a 70 6e 56 61 6c 20 69 73 20 73 65  and *pnVal is se
64e0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
64f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
6500: 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 76  .** serialized v
6510: 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
6520: 20 61 20 63 6f 70 79 20 6f 66 20 2a 70 61 4f 6e   a copy of *paOn
6530: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
6540: 64 20 2a 70 6e 56 61 6c 0a 2a 2a 20 73 65 74 20  d *pnVal.** set 
6550: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6560: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 76 61   bytes in the va
6570: 6c 75 65 20 61 74 20 2a 70 61 4f 6e 65 2e 20 49  lue at *paOne. I
6580: 66 20 2a 70 61 4f 6e 65 20 70 6f 69 6e 74 73 0a  f *paOne points.
6590: 2a 2a 20 74 6f 20 74 68 65 20 22 6e 6f 20 76 61  ** to the "no va
65a0: 6c 75 65 22 20 70 6c 61 63 65 68 6f 6c 64 65 72  lue" placeholder
65b0: 2c 20 2a 70 6e 56 61 6c 20 69 73 20 73 65 74 20  , *pnVal is set 
65c0: 74 6f 20 31 2e 20 49 6e 20 6f 74 68 65 72 20 77  to 1. In other w
65d0: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ords:.**.**   if
65e0: 28 20 2a 70 61 54 77 6f 20 69 73 20 76 61 6c 69  ( *paTwo is vali
65f0: 64 20 29 20 72 65 74 75 72 6e 20 2a 70 61 54 77  d ) return *paTw
6600: 6f 3b 0a 2a 2a 20 20 20 72 65 74 75 72 6e 20 2a  o;.**   return *
6610: 70 61 4f 6e 65 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61  paOne;.**.*/.sta
6620: 74 69 63 20 75 38 20 2a 73 65 73 73 69 6f 6e 4d  tic u8 *sessionM
6630: 65 72 67 65 56 61 6c 75 65 28 0a 20 20 75 38 20  ergeValue(.  u8 
6640: 2a 2a 70 61 4f 6e 65 2c 20 20 20 20 20 20 20 20  **paOne,        
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6660: 49 4e 2f 4f 55 54 3a 20 4c 65 66 74 2d 68 61 6e  IN/OUT: Left-han
6670: 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 72  d buffer pointer
6680: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61 54 77 6f   */.  u8 **paTwo
6690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66a0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
66b0: 20 52 69 67 68 74 2d 68 61 6e 64 20 62 75 66 66   Right-hand buff
66c0: 65 72 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  er pointer */.  
66d0: 69 6e 74 20 2a 70 6e 56 61 6c 20 20 20 20 20 20  int *pnVal      
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 2f 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 69 6e  /* OUT: Bytes in
6700: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
6710: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 31 20 3d  */.){.  u8 *a1 =
6720: 20 2a 70 61 4f 6e 65 3b 0a 20 20 75 38 20 2a 61   *paOne;.  u8 *a
6730: 32 20 3d 20 2a 70 61 54 77 6f 3b 0a 20 20 75 38  2 = *paTwo;.  u8
6740: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
6750: 74 20 6e 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  t n1;..  assert(
6760: 20 61 31 20 29 3b 0a 20 20 69 66 28 20 61 32 20   a1 );.  if( a2 
6770: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ){.    int n2 = 
6780: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e  sessionSerialLen
6790: 28 61 32 29 3b 0a 20 20 20 20 69 66 28 20 2a 61  (a2);.    if( *a
67a0: 32 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 56 61  2 ){.      *pnVa
67b0: 6c 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 70 52  l = n2;.      pR
67c0: 65 74 20 3d 20 61 32 3b 0a 20 20 20 20 7d 0a 20  et = a2;.    }. 
67d0: 20 20 20 2a 70 61 54 77 6f 20 3d 20 26 61 32 5b     *paTwo = &a2[
67e0: 6e 32 5d 3b 0a 20 20 7d 0a 0a 20 20 6e 31 20 3d  n2];.  }..  n1 =
67f0: 20 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 4c 65   sessionSerialLe
6800: 6e 28 61 31 29 3b 0a 20 20 69 66 28 20 70 52 65  n(a1);.  if( pRe
6810: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 6e 56  t==0 ){.    *pnV
6820: 61 6c 20 3d 20 6e 31 3b 0a 20 20 20 20 70 52 65  al = n1;.    pRe
6830: 74 20 3d 20 61 31 3b 0a 20 20 7d 0a 20 20 2a 70  t = a1;.  }.  *p
6840: 61 4f 6e 65 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a  aOne = &a1[n1];.
6850: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6870: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
6880: 79 20 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63  y changeset_conc
6890: 61 74 28 29 20 74 6f 20 6d 65 72 67 65 20 74 77  at() to merge tw
68a0: 6f 20 55 50 44 41 54 45 20 63 68 61 6e 67 65 73  o UPDATE changes
68b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  .** on the same 
68c0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
68d0: 6e 74 20 73 65 73 73 69 6f 6e 4d 65 72 67 65 55  nt sessionMergeU
68e0: 70 64 61 74 65 28 0a 20 20 75 38 20 2a 2a 70 61  pdate(.  u8 **pa
68f0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
6900: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
6910: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f  UT: Pointer to o
6920: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
6930: 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
6940: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
6950: 20 20 2f 2a 20 54 61 62 6c 65 20 63 68 61 6e 67    /* Table chang
6960: 65 20 70 65 72 74 61 69 6e 73 20 74 6f 20 2a 2f  e pertains to */
6970: 0a 20 20 69 6e 74 20 62 50 61 74 63 68 73 65 74  .  int bPatchset
6980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6990: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
69a0: 63 6f 72 64 73 20 61 72 65 20 70 61 74 63 68 73  cords are patchs
69b0: 65 74 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  et records */.  
69c0: 75 38 20 2a 61 4f 6c 64 52 65 63 6f 72 64 31 2c  u8 *aOldRecord1,
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 2f 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20  /* old.* record 
69f0: 66 6f 72 20 66 69 72 73 74 20 63 68 61 6e 67 65  for first change
6a00: 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 6c 64 52 65   */.  u8 *aOldRe
6a10: 63 6f 72 64 32 2c 20 20 20 20 20 20 20 20 20 20  cord2,          
6a20: 20 20 20 20 20 20 2f 2a 20 6f 6c 64 2e 2a 20 72        /* old.* r
6a30: 65 63 6f 72 64 20 66 6f 72 20 73 65 63 6f 6e 64  ecord for second
6a40: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20   change */.  u8 
6a50: 2a 61 4e 65 77 52 65 63 6f 72 64 31 2c 20 20 20  *aNewRecord1,   
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a70: 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 66 6f 72  new.* record for
6a80: 20 66 69 72 73 74 20 63 68 61 6e 67 65 20 2a 2f   first change */
6a90: 0a 20 20 75 38 20 2a 61 4e 65 77 52 65 63 6f 72  .  u8 *aNewRecor
6aa0: 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d2              
6ab0: 20 20 20 2f 2a 20 6e 65 77 2e 2a 20 72 65 63 6f     /* new.* reco
6ac0: 72 64 20 66 6f 72 20 73 65 63 6f 6e 64 20 63 68  rd for second ch
6ad0: 61 6e 67 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ange */.){.  u8 
6ae0: 2a 61 4f 6c 64 31 20 3d 20 61 4f 6c 64 52 65 63  *aOld1 = aOldRec
6af0: 6f 72 64 31 3b 0a 20 20 75 38 20 2a 61 4f 6c 64  ord1;.  u8 *aOld
6b00: 32 20 3d 20 61 4f 6c 64 52 65 63 6f 72 64 32 3b  2 = aOldRecord2;
6b10: 0a 20 20 75 38 20 2a 61 4e 65 77 31 20 3d 20 61  .  u8 *aNew1 = a
6b20: 4e 65 77 52 65 63 6f 72 64 31 3b 0a 20 20 75 38  NewRecord1;.  u8
6b30: 20 2a 61 4e 65 77 32 20 3d 20 61 4e 65 77 52 65   *aNew2 = aNewRe
6b40: 63 6f 72 64 32 3b 0a 0a 20 20 75 38 20 2a 61 4f  cord2;..  u8 *aO
6b50: 75 74 20 3d 20 2a 70 61 4f 75 74 3b 0a 20 20 69  ut = *paOut;.  i
6b60: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 62 50 61  nt i;..  if( bPa
6b70: 74 63 68 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  tchset==0 ){.   
6b80: 20 69 6e 74 20 62 52 65 71 75 69 72 65 64 20 3d   int bRequired =
6b90: 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   0;..    assert(
6ba0: 20 61 4f 6c 64 52 65 63 6f 72 64 31 20 26 26 20   aOldRecord1 && 
6bb0: 61 4e 65 77 52 65 63 6f 72 64 31 20 29 3b 0a 0a  aNewRecord1 );..
6bc0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6bd0: 20 6f 6c 64 2e 2a 20 76 65 63 74 6f 72 20 66 69   old.* vector fi
6be0: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rst. */.    for(
6bf0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
6c00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
6c10: 6e 74 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 75  nt nOld;.      u
6c20: 38 20 2a 61 4f 6c 64 3b 0a 20 20 20 20 20 20 69  8 *aOld;.      i
6c30: 6e 74 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 75  nt nNew;.      u
6c40: 38 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20 20 20  8 *aNew;..      
6c50: 61 4f 6c 64 20 3d 20 73 65 73 73 69 6f 6e 4d 65  aOld = sessionMe
6c60: 72 67 65 56 61 6c 75 65 28 26 61 4f 6c 64 31 2c  rgeValue(&aOld1,
6c70: 20 26 61 4f 6c 64 32 2c 20 26 6e 4f 6c 64 29 3b   &aOld2, &nOld);
6c80: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 65  .      aNew = se
6c90: 73 73 69 6f 6e 4d 65 72 67 65 56 61 6c 75 65 28  ssionMergeValue(
6ca0: 26 61 4e 65 77 31 2c 20 26 61 4e 65 77 32 2c 20  &aNew1, &aNew2, 
6cb0: 26 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66  &nNew);.      if
6cc0: 28 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 20  ( pTab->abPK[i] 
6cd0: 7c 7c 20 6e 4f 6c 64 21 3d 6e 4e 65 77 20 7c 7c  || nOld!=nNew ||
6ce0: 20 6d 65 6d 63 6d 70 28 61 4f 6c 64 2c 20 61 4e   memcmp(aOld, aN
6cf0: 65 77 2c 20 6e 4e 65 77 29 20 29 7b 0a 20 20 20  ew, nNew) ){.   
6d00: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61       if( pTab->a
6d10: 62 50 4b 5b 69 5d 3d 3d 30 20 29 20 62 52 65 71  bPK[i]==0 ) bReq
6d20: 75 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  uired = 1;.     
6d30: 20 20 20 6d 65 6d 63 70 79 28 61 4f 75 74 2c 20     memcpy(aOut, 
6d40: 61 4f 6c 64 2c 20 6e 4f 6c 64 29 3b 0a 20 20 20  aOld, nOld);.   
6d50: 20 20 20 20 20 61 4f 75 74 20 2b 3d 20 6e 4f 6c       aOut += nOl
6d60: 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
6d70: 20 20 20 20 20 20 20 20 2a 28 61 4f 75 74 2b 2b          *(aOut++
6d80: 29 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ) = '\0';.      
6d90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
6da0: 20 21 62 52 65 71 75 69 72 65 64 20 29 20 72 65   !bRequired ) re
6db0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
6dc0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 2e  * Write the new.
6dd0: 2a 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 61 4f  * vector */.  aO
6de0: 6c 64 31 20 3d 20 61 4f 6c 64 52 65 63 6f 72 64  ld1 = aOldRecord
6df0: 31 3b 0a 20 20 61 4f 6c 64 32 20 3d 20 61 4f 6c  1;.  aOld2 = aOl
6e00: 64 52 65 63 6f 72 64 32 3b 0a 20 20 61 4e 65 77  dRecord2;.  aNew
6e10: 31 20 3d 20 61 4e 65 77 52 65 63 6f 72 64 31 3b  1 = aNewRecord1;
6e20: 0a 20 20 61 4e 65 77 32 20 3d 20 61 4e 65 77 52  .  aNew2 = aNewR
6e30: 65 63 6f 72 64 32 3b 0a 20 20 66 6f 72 28 69 3d  ecord2;.  for(i=
6e40: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
6e50: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
6e60: 4f 6c 64 3b 0a 20 20 20 20 75 38 20 2a 61 4f 6c  Old;.    u8 *aOl
6e70: 64 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  d;.    int nNew;
6e80: 0a 20 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 0a  .    u8 *aNew;..
6e90: 20 20 20 20 61 4f 6c 64 20 3d 20 73 65 73 73 69      aOld = sessi
6ea0: 6f 6e 4d 65 72 67 65 56 61 6c 75 65 28 26 61 4f  onMergeValue(&aO
6eb0: 6c 64 31 2c 20 26 61 4f 6c 64 32 2c 20 26 6e 4f  ld1, &aOld2, &nO
6ec0: 6c 64 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  ld);.    aNew = 
6ed0: 73 65 73 73 69 6f 6e 4d 65 72 67 65 56 61 6c 75  sessionMergeValu
6ee0: 65 28 26 61 4e 65 77 31 2c 20 26 61 4e 65 77 32  e(&aNew1, &aNew2
6ef0: 2c 20 26 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  , &nNew);.    if
6f00: 28 20 62 50 61 74 63 68 73 65 74 3d 3d 30 20 0a  ( bPatchset==0 .
6f10: 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61       && (pTab->a
6f20: 62 50 4b 5b 69 5d 20 7c 7c 20 28 6e 4f 6c 64 3d  bPK[i] || (nOld=
6f30: 3d 6e 4e 65 77 20 26 26 20 30 3d 3d 6d 65 6d 63  =nNew && 0==memc
6f40: 6d 70 28 61 4f 6c 64 2c 20 61 4e 65 77 2c 20 6e  mp(aOld, aNew, n
6f50: 4e 65 77 29 29 29 20 0a 20 20 20 20 29 7b 0a 20  New))) .    ){. 
6f60: 20 20 20 20 20 2a 28 61 4f 75 74 2b 2b 29 20 3d       *(aOut++) =
6f70: 20 27 5c 30 27 3b 0a 20 20 20 20 7d 65 6c 73 65   '\0';.    }else
6f80: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  {.      memcpy(a
6f90: 4f 75 74 2c 20 61 4e 65 77 2c 20 6e 4e 65 77 29  Out, aNew, nNew)
6fa0: 3b 0a 20 20 20 20 20 20 61 4f 75 74 20 2b 3d 20  ;.      aOut += 
6fb0: 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nNew;.    }.  }.
6fc0: 0a 20 20 2a 70 61 4f 75 74 20 3d 20 61 4f 75 74  .  *paOut = aOut
6fd0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
6fe0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6ff0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
7000: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
7010: 61 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f  a pre-update-hoo
7020: 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 49  k callback..** I
7030: 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
7040: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 65 2d  the current pre-
7050: 75 70 64 61 74 65 2d 68 6f 6f 6b 20 63 68 61 6e  update-hook chan
7060: 67 65 20 61 66 66 65 63 74 73 20 74 68 65 20 73  ge affects the s
7070: 61 6d 65 20 72 6f 77 0a 2a 2a 20 61 73 20 74 68  ame row.** as th
7080: 65 20 63 68 61 6e 67 65 20 73 74 6f 72 65 64 20  e change stored 
7090: 69 6e 20 61 72 67 75 6d 65 6e 74 20 70 43 68 61  in argument pCha
70a0: 6e 67 65 2e 20 49 66 20 73 6f 2c 20 69 74 20 72  nge. If so, it r
70b0: 65 74 75 72 6e 73 20 74 72 75 65 2e 20 4f 74 68  eturns true. Oth
70c0: 65 72 77 69 73 65 0a 2a 2a 20 69 66 20 74 68 65  erwise.** if the
70d0: 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b   pre-update-hook
70e0: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
70f0: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73   the same row as
7100: 20 70 43 68 61 6e 67 65 2c 20 69 74 20 72 65 74   pChange, it ret
7110: 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a  urns.** false..*
7120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
7130: 73 69 6f 6e 50 72 65 75 70 64 61 74 65 45 71 75  sionPreupdateEqu
7140: 61 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  al(.  sqlite3_se
7150: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
7160: 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e        /* Session
7170: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 6f 77 6e   object that own
7180: 73 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a  s SessionTable *
7190: 2f 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65  /.  SessionTable
71a0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
71b0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
71c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 68 61  ociated with cha
71d0: 6e 67 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e  nge */.  Session
71e0: 43 68 61 6e 67 65 20 2a 70 43 68 61 6e 67 65 2c  Change *pChange,
71f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
7200: 67 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f  ge to compare to
7210: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 20 20 20 20   */.  int op    
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7240: 20 70 72 65 2d 75 70 64 61 74 65 20 6f 70 65 72   pre-update oper
7250: 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ation */.){.  in
7260: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7280: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
7290: 20 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73   through columns
72a0: 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 70 43   */.  u8 *a = pC
72b0: 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64 3b 20  hange->aRecord; 
72c0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
72d0: 75 73 65 64 20 74 6f 20 73 63 61 6e 20 63 68 61  used to scan cha
72e0: 6e 67 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  nge record */.. 
72f0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
7300: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
7310: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
7320: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
7330: 4c 45 54 45 20 29 3b 0a 20 20 66 6f 72 28 69 43  LETE );.  for(iC
7340: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
7350: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
7360: 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 61      if( !pTab->a
7370: 62 50 4b 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20  bPK[iCol] ){.   
7380: 20 20 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 53     a += sessionS
7390: 65 72 69 61 6c 4c 65 6e 28 61 29 3b 0a 20 20 20  erialLen(a);.   
73a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
73b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
73c0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l;        /* Val
73d0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ue returned by p
73e0: 72 65 75 70 64 61 74 65 5f 6e 65 77 2f 6f 6c 64  reupdate_new/old
73f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63   */.      int rc
7400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7410: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
7420: 6f 64 65 20 66 72 6f 6d 20 70 72 65 75 70 64 61  ode from preupda
7430: 74 65 5f 6e 65 77 2f 6f 6c 64 20 2a 2f 0a 20 20  te_new/old */.  
7440: 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
7450: 2a 61 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  *a++;           
7460: 2f 2a 20 54 79 70 65 20 6f 66 20 76 61 6c 75 65  /* Type of value
7470: 20 66 72 6f 6d 20 63 68 61 6e 67 65 20 72 65 63   from change rec
7480: 6f 72 64 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ord */..      /*
7490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
74a0: 61 6c 6c 73 20 74 6f 20 70 72 65 75 70 64 61 74  alls to preupdat
74b0: 65 5f 6e 65 77 28 29 20 61 6e 64 20 70 72 65 75  e_new() and preu
74c0: 70 64 61 74 65 5f 6f 6c 64 28 29 20 63 61 6e 20  pdate_old() can 
74d0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 66 61 69  not.      ** fai
74e0: 6c 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  l. This is becau
74f0: 73 65 20 74 68 65 79 20 63 61 63 68 65 20 74 68  se they cache th
7500: 65 69 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  eir return value
7510: 73 2c 20 61 6e 64 20 62 79 20 74 68 65 0a 20 20  s, and by the.  
7520: 20 20 20 20 2a 2a 20 74 69 6d 65 20 63 6f 6e 74      ** time cont
7530: 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72  rol flows to her
7540: 65 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  e they have alre
7550: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
7560: 6f 6e 63 65 20 66 72 6f 6d 0a 20 20 20 20 20 20  once from.      
7570: 2a 2a 20 77 69 74 68 69 6e 20 73 65 73 73 69 6f  ** within sessio
7580: 6e 50 72 65 75 70 64 61 74 65 48 61 73 68 28 29  nPreupdateHash()
7590: 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
75a0: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 76 65  asserts below ve
75b0: 72 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  rify.      ** th
75c0: 69 73 20 28 74 68 61 74 20 74 68 65 20 6d 65 74  is (that the met
75d0: 68 6f 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  hod has already 
75e0: 62 65 65 6e 20 63 61 6c 6c 65 64 29 2e 20 2a 2f  been called). */
75f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  .      if( op==S
7600: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a  QLITE_INSERT ){.
7610: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72          /* asser
7620: 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
7630: 65 2d 3e 70 4e 65 77 55 6e 70 61 63 6b 65 64 20  e->pNewUnpacked 
7640: 7c 7c 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  || db->pPreUpdat
7650: 65 2d 3e 61 4e 65 77 20 29 3b 20 2a 2f 0a 20 20  e->aNew ); */.  
7660: 20 20 20 20 20 20 72 63 20 3d 20 70 53 65 73 73        rc = pSess
7670: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e 65 77 28 70  ion->hook.xNew(p
7680: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43  Session->hook.pC
7690: 74 78 2c 20 69 43 6f 6c 2c 20 26 70 56 61 6c 29  tx, iCol, &pVal)
76a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
76b0: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74         /* assert
76c0: 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
76d0: 2d 3e 70 55 6e 70 61 63 6b 65 64 20 29 3b 20 2a  ->pUnpacked ); *
76e0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
76f0: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f  Session->hook.xO
7700: 6c 64 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  ld(pSession->hoo
7710: 6b 2e 70 43 74 78 2c 20 69 43 6f 6c 2c 20 26 70  k.pCtx, iCol, &p
7720: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Val);.      }.  
7730: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
7740: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
7750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
7760: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 21  alue_type(pVal)!
7770: 3d 65 54 79 70 65 20 29 20 72 65 74 75 72 6e 20  =eType ) return 
7780: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 20 53  0;..      /* A S
7790: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 6f 62 6a  essionChange obj
77a0: 65 63 74 20 6e 65 76 65 72 20 68 61 73 20 61 20  ect never has a 
77b0: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 61 20  NULL value in a 
77c0: 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  PK column */.   
77d0: 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
77e0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
77f0: 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
7800: 45 5f 46 4c 4f 41 54 0a 20 20 20 20 20 20 20 20  E_FLOAT.        
7810: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
7820: 49 54 45 5f 42 4c 4f 42 20 20 20 20 7c 7c 20 65  ITE_BLOB    || e
7830: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
7840: 54 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  T.      );..    
7850: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
7860: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65  ITE_INTEGER || e
7870: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
7880: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  AT ){.        i6
7890: 34 20 69 56 61 6c 20 3d 20 73 65 73 73 69 6f 6e  4 iVal = session
78a0: 47 65 74 49 36 34 28 61 29 3b 0a 20 20 20 20 20  GetI64(a);.     
78b0: 20 20 20 61 20 2b 3d 20 38 3b 0a 20 20 20 20 20     a += 8;.     
78c0: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
78d0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
78e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
78f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
7900: 34 28 70 56 61 6c 29 21 3d 69 56 61 6c 20 29 20  4(pVal)!=iVal ) 
7910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
7920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7930: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a     double rVal;.
7940: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
7950: 28 20 73 69 7a 65 6f 66 28 69 56 61 6c 29 3d 3d  ( sizeof(iVal)==
7960: 38 20 26 26 20 73 69 7a 65 6f 66 28 72 56 61 6c  8 && sizeof(rVal
7970: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
7980: 20 20 6d 65 6d 63 70 79 28 26 72 56 61 6c 2c 20    memcpy(&rVal, 
7990: 26 69 56 61 6c 2c 20 38 29 3b 0a 20 20 20 20 20  &iVal, 8);.     
79a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
79b0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56  _value_double(pV
79c0: 61 6c 29 21 3d 72 56 61 6c 20 29 20 72 65 74 75  al)!=rVal ) retu
79d0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
79e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
79f0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
7a00: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
7a10: 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20 73 65  .        a += se
7a20: 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 61  ssionVarintGet(a
7a30: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  , &n);.        i
7a40: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
7a50: 5f 62 79 74 65 73 28 70 56 61 6c 29 21 3d 6e 20  _bytes(pVal)!=n 
7a60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7a70: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
7a80: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
7a90: 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69          z = sqli
7aa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
7ab0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Val);.        }e
7ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
7ad0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7ae0: 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
7af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7b00: 66 28 20 6e 3e 30 20 26 26 20 6d 65 6d 63 6d 70  f( n>0 && memcmp
7b10: 28 61 2c 20 7a 2c 20 6e 29 20 29 20 72 65 74 75  (a, z, n) ) retu
7b20: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 61 20  rn 0;.        a 
7b30: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
7b40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
7b50: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
7b60: 20 72 65 71 75 69 72 65 64 2c 20 67 72 6f 77 20   required, grow 
7b70: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
7b80: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 68 61  sed to store cha
7b90: 6e 67 65 73 20 6f 6e 20 74 61 62 6c 65 20 70 54  nges on table pT
7ba0: 61 62 20 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ab .** (part of 
7bb0: 74 68 65 20 73 65 73 73 69 6f 6e 20 70 53 65 73  the session pSes
7bc0: 73 69 6f 6e 29 2e 20 49 66 20 61 20 66 61 74 61  sion). If a fata
7bd0: 6c 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  l OOM error occu
7be0: 72 73 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 73  rs, set the.** s
7bf0: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f  ession object to
7c00: 20 66 61 69 6c 65 64 20 61 6e 64 20 72 65 74 75   failed and retu
7c10: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
7c20: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
7c30: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
7c40: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 70 6f 73  .**.** It is pos
7c50: 73 69 62 6c 65 20 74 68 61 74 20 61 20 6e 6f 6e  sible that a non
7c60: 2d 66 61 74 61 6c 20 4f 4f 4d 20 65 72 72 6f 72  -fatal OOM error
7c70: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 69 73 20   occurs in this 
7c80: 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 0a 2a 2a 20  function. In.** 
7c90: 74 68 61 74 20 63 61 73 65 20 74 68 65 20 68 61  that case the ha
7ca0: 73 68 2d 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  sh-table does no
7cb0: 74 20 67 72 6f 77 2c 20 62 75 74 20 53 51 4c 49  t grow, but SQLI
7cc0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7cd0: 64 20 61 6e 79 77 61 79 2e 0a 2a 2a 20 47 72 6f  d anyway..** Gro
7ce0: 77 69 6e 67 20 74 68 65 20 68 61 73 68 20 74 61  wing the hash ta
7cf0: 62 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ble in this case
7d00: 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   is a performanc
7d10: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  e optimization o
7d20: 6e 6c 79 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  nly,.** it is no
7d30: 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  t required for c
7d40: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
7d50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7d60: 73 65 73 73 69 6f 6e 47 72 6f 77 48 61 73 68 28  sessionGrowHash(
7d70: 69 6e 74 20 62 50 61 74 63 68 73 65 74 2c 20 53  int bPatchset, S
7d80: 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61  essionTable *pTa
7d90: 62 29 7b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  b){.  if( pTab->
7da0: 6e 43 68 61 6e 67 65 3d 3d 30 20 7c 7c 20 70 54  nChange==0 || pT
7db0: 61 62 2d 3e 6e 45 6e 74 72 79 3e 3d 28 70 54 61  ab->nEntry>=(pTa
7dc0: 62 2d 3e 6e 43 68 61 6e 67 65 2f 32 29 20 29 7b  b->nChange/2) ){
7dd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7de0: 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 2a  SessionChange **
7df0: 61 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  apNew;.    int n
7e00: 4e 65 77 20 3d 20 28 70 54 61 62 2d 3e 6e 43 68  New = (pTab->nCh
7e10: 61 6e 67 65 20 3f 20 70 54 61 62 2d 3e 6e 43 68  ange ? pTab->nCh
7e20: 61 6e 67 65 20 3a 20 31 32 38 29 20 2a 20 32 3b  ange : 128) * 2;
7e30: 0a 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 53  ..    apNew = (S
7e40: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 2a 29  essionChange **)
7e50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7e60: 28 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 43  (sizeof(SessionC
7e70: 68 61 6e 67 65 20 2a 29 20 2a 20 6e 4e 65 77 29  hange *) * nNew)
7e80: 3b 0a 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d  ;.    if( apNew=
7e90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7ea0: 70 54 61 62 2d 3e 6e 43 68 61 6e 67 65 3d 3d 30  pTab->nChange==0
7eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7ec0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
7ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
7ee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7ef0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
7f00: 74 28 61 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  t(apNew, 0, size
7f10: 6f 66 28 53 65 73 73 69 6f 6e 43 68 61 6e 67 65  of(SessionChange
7f20: 20 2a 29 20 2a 20 6e 4e 65 77 29 3b 0a 0a 20 20   *) * nNew);..  
7f30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
7f40: 62 2d 3e 6e 43 68 61 6e 67 65 3b 20 69 2b 2b 29  b->nChange; i++)
7f50: 7b 0a 20 20 20 20 20 20 53 65 73 73 69 6f 6e 43  {.      SessionC
7f60: 68 61 6e 67 65 20 2a 70 3b 0a 20 20 20 20 20 20  hange *p;.      
7f70: 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70  SessionChange *p
7f80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Next;.      for(
7f90: 70 3d 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65  p=pTab->apChange
7fa0: 5b 69 5d 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  [i]; p; p=pNext)
7fb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 50  {.        int bP
7fc0: 6b 4f 6e 6c 79 20 3d 20 28 70 2d 3e 6f 70 3d 3d  kOnly = (p->op==
7fd0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26  SQLITE_DELETE &&
7fe0: 20 62 50 61 74 63 68 73 65 74 29 3b 0a 20 20 20   bPatchset);.   
7ff0: 20 20 20 20 20 69 6e 74 20 69 48 61 73 68 20 3d       int iHash =
8000: 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 48 61   sessionChangeHa
8010: 73 68 28 70 54 61 62 2c 20 62 50 6b 4f 6e 6c 79  sh(pTab, bPkOnly
8020: 2c 20 70 2d 3e 61 52 65 63 6f 72 64 2c 20 6e 4e  , p->aRecord, nN
8030: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
8040: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
8050: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
8060: 3d 20 61 70 4e 65 77 5b 69 48 61 73 68 5d 3b 0a  = apNew[iHash];.
8070: 20 20 20 20 20 20 20 20 61 70 4e 65 77 5b 69 48          apNew[iH
8080: 61 73 68 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  ash] = p;.      
8090: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
80a0: 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
80b0: 61 70 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 70  apChange);.    p
80c0: 54 61 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e  Tab->nChange = n
80d0: 4e 65 77 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  New;.    pTab->a
80e0: 70 43 68 61 6e 67 65 20 3d 20 61 70 4e 65 77 3b  pChange = apNew;
80f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
8100: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8110: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8120: 20 71 75 65 72 69 65 73 20 74 68 65 20 64 61 74   queries the dat
8130: 61 62 61 73 65 20 66 6f 72 20 74 68 65 20 6e 61  abase for the na
8140: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
8150: 6e 73 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 7a  ns of table.** z
8160: 54 68 69 73 2c 20 69 6e 20 73 63 68 65 6d 61 20  This, in schema 
8170: 7a 44 62 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  zDb..**.** Other
8180: 77 69 73 65 2c 20 69 66 20 74 68 65 79 20 61 72  wise, if they ar
8190: 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 76 61 72 69  e not NULL, vari
81a0: 61 62 6c 65 20 2a 70 6e 43 6f 6c 20 69 73 20 73  able *pnCol is s
81b0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
81c0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  .** of columns i
81d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
81e0: 61 62 6c 65 20 61 6e 64 20 76 61 72 69 61 62 6c  able and variabl
81f0: 65 20 2a 70 7a 54 61 62 20 69 73 20 73 65 74 20  e *pzTab is set 
8200: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 0a 2a 2a  to point to a.**
8210: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
8220: 63 6f 70 79 20 6f 66 20 74 68 65 20 74 61 62 6c  copy of the tabl
8230: 65 20 6e 61 6d 65 2e 20 2a 70 61 7a 43 6f 6c 20  e name. *pazCol 
8240: 28 69 66 20 6e 6f 74 20 4e 55 4c 4c 29 20 69 73  (if not NULL) is
8250: 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
8260: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
8270: 70 6f 69 6e 74 65 72 73 20 74 6f 20 63 6f 6c 75  pointers to colu
8280: 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e 64 20 2a 70  mn names. And *p
8290: 61 62 50 4b 20 28 61 67 61 69 6e 2c 20 69 66 20  abPK (again, if 
82a0: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 29 20 69 73 20  not.** NULL) is 
82b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
82c0: 61 6e 20 61 72 72 61 79 20 6f 66 20 62 6f 6f 6c  an array of bool
82d0: 65 61 6e 73 20 2d 20 74 72 75 65 20 69 66 20 74  eans - true if t
82e0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
82f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61  .** column is pa
8300: 72 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  rt of the primar
8310: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  y key..**.** For
8320: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
8330: 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72   table is declar
8340: 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed as:.**.**    
8350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
8360: 6c 31 28 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 50  l1(w, x, y, z, P
8370: 52 49 4d 41 52 59 20 4b 45 59 28 77 2c 20 7a 29  RIMARY KEY(w, z)
8380: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  );.**.** Then th
8390: 65 20 66 6f 75 72 20 6f 75 74 70 75 74 20 76 61  e four output va
83a0: 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75  riables are popu
83b0: 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
83c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 6e 43  :.**.**     *pnC
83d0: 6f 6c 20 20 3d 20 34 0a 2a 2a 20 20 20 20 20 2a  ol  = 4.**     *
83e0: 70 7a 54 61 62 20 20 3d 20 22 74 62 6c 31 22 0a  pzTab  = "tbl1".
83f0: 2a 2a 20 20 20 20 20 2a 70 61 7a 43 6f 6c 20 3d  **     *pazCol =
8400: 20 7b 22 77 22 2c 20 22 78 22 2c 20 22 79 22 2c   {"w", "x", "y",
8410: 20 22 7a 22 7d 0a 2a 2a 20 20 20 20 20 2a 70 61   "z"}.**     *pa
8420: 62 50 4b 20 20 3d 20 7b 31 2c 20 30 2c 20 30 2c  bPK  = {1, 0, 0,
8430: 20 31 7d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65   1}.**.** All re
8440: 74 75 72 6e 65 64 20 62 75 66 66 65 72 73 20 61  turned buffers a
8450: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  re part of the s
8460: 61 6d 65 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  ame single alloc
8470: 61 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d 75 73  ation, which mus
8480: 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 75 73  t.** be freed us
8490: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
84a0: 28 29 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  () by the caller
84b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
84c0: 65 73 73 69 6f 6e 54 61 62 6c 65 49 6e 66 6f 28  essionTableInfo(
84d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
8500: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
8510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8530: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
8540: 65 64 20 64 61 74 61 62 61 73 65 20 28 65 2e 67  ed database (e.g
8550: 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20 63  . "main") */.  c
8560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 68 69 73  onst char *zThis
8570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8580: 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
8590: 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20    int *pnCol,   
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 2f 2a 20 4f 55 54 3a 20 6e 75 6d 62 65 72    /* OUT: number
85c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
85d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
85e0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
85f0: 20 2f 2a 20 4f 55 54 3a 20 43 6f 70 79 20 6f 66   /* OUT: Copy of
8600: 20 7a 54 68 69 73 20 2a 2f 0a 20 20 63 6f 6e 73   zThis */.  cons
8610: 74 20 63 68 61 72 20 2a 2a 2a 70 61 7a 43 6f 6c  t char ***pazCol
8620: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
8630: 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c  UT: Array of col
8640: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 61  umn names for ta
8650: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61  ble */.  u8 **pa
8660: 62 50 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  bPK             
8670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8680: 20 41 72 72 61 79 20 6f 66 20 62 6f 6f 6c 65 61   Array of boolea
8690: 6e 73 20 2d 20 74 72 75 65 20 66 6f 72 20 50 4b  ns - true for PK
86a0: 20 63 6f 6c 20 2a 2f 0a 29 7b 0a 20 20 63 68 61   col */.){.  cha
86b0: 72 20 2a 7a 50 72 61 67 6d 61 3b 0a 20 20 73 71  r *zPragma;.  sq
86c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
86d0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  t;.  int rc;.  s
86e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
86f0: 74 65 3b 0a 20 20 69 6e 74 20 6e 44 62 43 6f 6c  te;.  int nDbCol
8700: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 54 68 69   = 0;.  int nThi
8710: 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  s;.  int i;.  u8
8720: 20 2a 70 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20   *pAlloc = 0;.  
8730: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
8740: 3b 0a 20 20 75 38 20 2a 61 62 50 4b 20 3d 20 30  ;.  u8 *abPK = 0
8750: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 7a  ;..  assert( paz
8760: 43 6f 6c 20 26 26 20 70 61 62 50 4b 20 29 3b 0a  Col && pabPK );.
8770: 0a 20 20 6e 54 68 69 73 20 3d 20 73 71 6c 69 74  .  nThis = sqlit
8780: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 68 69 73  e3Strlen30(zThis
8790: 29 3b 0a 20 20 69 66 28 20 6e 54 68 69 73 3d 3d  );.  if( nThis==
87a0: 31 32 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  12 && 0==sqlite3
87b0: 5f 73 74 72 69 63 6d 70 28 22 73 71 6c 69 74 65  _stricmp("sqlite
87c0: 5f 73 74 61 74 31 22 2c 20 7a 54 68 69 73 29 20  _stat1", zThis) 
87d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
87e0: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
87f0: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
8800: 62 2c 20 7a 54 68 69 73 2c 20 30 2c 20 30 2c 20  b, zThis, 0, 0, 
8810: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
8820: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8830: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  OK ){.      /* F
8840: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2c  or sqlite_stat1,
8850: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 28 74   pretend that (t
8860: 62 6c 2c 69 64 78 29 20 69 73 20 74 68 65 20 50  bl,idx) is the P
8870: 52 49 4d 41 52 59 20 4b 45 59 2e 20 2a 2f 0a 20  RIMARY KEY. */. 
8880: 20 20 20 20 20 7a 50 72 61 67 6d 61 20 3d 20 73       zPragma = s
8890: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
88a0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
88b0: 54 20 30 2c 20 27 74 62 6c 27 2c 20 20 27 27 2c  T 0, 'tbl',  '',
88c0: 20 30 2c 20 27 27 2c 20 31 20 20 20 20 20 55 4e   0, '', 1     UN
88d0: 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20  ION ALL ".      
88e0: 20 20 20 20 22 53 45 4c 45 43 54 20 31 2c 20 27      "SELECT 1, '
88f0: 69 64 78 27 2c 20 20 27 27 2c 20 30 2c 20 27 27  idx',  '', 0, ''
8900: 2c 20 32 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c  , 2     UNION AL
8910: 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 53  L ".          "S
8920: 45 4c 45 43 54 20 32 2c 20 27 73 74 61 74 27 2c  ELECT 2, 'stat',
8930: 20 27 27 2c 20 30 2c 20 27 27 2c 20 30 22 0a 20   '', 0, '', 0". 
8940: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
8950: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
8960: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
8970: 7a 50 72 61 67 6d 61 20 3d 20 73 71 6c 69 74 65  zPragma = sqlite
8980: 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20  3_mprintf("");. 
8990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
89b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
89c0: 72 61 67 6d 61 20 3d 20 73 71 6c 69 74 65 33 5f  ragma = sqlite3_
89d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
89e0: 27 25 71 27 2e 74 61 62 6c 65 5f 69 6e 66 6f 28  '%q'.table_info(
89f0: 27 25 71 27 29 22 2c 20 7a 44 62 2c 20 7a 54 68  '%q')", zDb, zTh
8a00: 69 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  is);.  }.  if( !
8a10: 7a 50 72 61 67 6d 61 20 29 20 72 65 74 75 72 6e  zPragma ) return
8a20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
8a30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
8a40: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 50  repare_v2(db, zP
8a50: 72 61 67 6d 61 2c 20 2d 31 2c 20 26 70 53 74 6d  ragma, -1, &pStm
8a60: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
8a70: 5f 66 72 65 65 28 7a 50 72 61 67 6d 61 29 3b 0a  _free(zPragma);.
8a80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8a90: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8aa0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6e 54 68 69  ..  nByte = nThi
8ab0: 73 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  s + 1;.  while( 
8ac0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
8ad0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
8ae0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
8af0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
8b00: 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a  ytes(pStmt, 1);.
8b10: 20 20 20 20 6e 44 62 43 6f 6c 2b 2b 3b 0a 20 20      nDbCol++;.  
8b20: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8b30: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a  _reset(pStmt);..
8b40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8b50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  _OK ){.    nByte
8b60: 20 2b 3d 20 6e 44 62 43 6f 6c 20 2a 20 28 73 69   += nDbCol * (si
8b70: 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 20  zeof(const char 
8b80: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 75 38 29 20  *) + sizeof(u8) 
8b90: 2b 20 31 29 3b 0a 20 20 20 20 70 41 6c 6c 6f 63  + 1);.    pAlloc
8ba0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
8bb0: 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  c64(nByte);.    
8bc0: 69 66 28 20 70 41 6c 6c 6f 63 3d 3d 30 20 29 7b  if( pAlloc==0 ){
8bd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
8be0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
8bf0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
8c00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
8c10: 7a 43 6f 6c 20 3d 20 28 63 68 61 72 20 2a 2a 29  zCol = (char **)
8c20: 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 41 6c 6c  pAlloc;.    pAll
8c30: 6f 63 20 3d 20 28 75 38 20 2a 29 26 61 7a 43 6f  oc = (u8 *)&azCo
8c40: 6c 5b 6e 44 62 43 6f 6c 5d 3b 0a 20 20 20 20 61  l[nDbCol];.    a
8c50: 62 50 4b 20 3d 20 28 75 38 20 2a 29 70 41 6c 6c  bPK = (u8 *)pAll
8c60: 6f 63 3b 0a 20 20 20 20 70 41 6c 6c 6f 63 20 3d  oc;.    pAlloc =
8c70: 20 26 61 62 50 4b 5b 6e 44 62 43 6f 6c 5d 3b 0a   &abPK[nDbCol];.
8c80: 20 20 20 20 69 66 28 20 70 7a 54 61 62 20 29 7b      if( pzTab ){
8c90: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 41  .      memcpy(pA
8ca0: 6c 6c 6f 63 2c 20 7a 54 68 69 73 2c 20 6e 54 68  lloc, zThis, nTh
8cb0: 69 73 2b 31 29 3b 0a 20 20 20 20 20 20 2a 70 7a  is+1);.      *pz
8cc0: 54 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 41  Tab = (char *)pA
8cd0: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 41 6c 6c  lloc;.      pAll
8ce0: 6f 63 20 2b 3d 20 6e 54 68 69 73 2b 31 3b 0a 20  oc += nThis+1;. 
8cf0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 20 3d 20     }.  .    i = 
8d00: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  0;.    while( SQ
8d10: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
8d20: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
8d30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
8d40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
8d50: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31  n_bytes(pStmt, 1
8d60: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  );.      const u
8d70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e  nsigned char *zN
8d80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
8d90: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
8da0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
8db0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
8dc0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 41  .      memcpy(pA
8dd0: 6c 6c 6f 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lloc, zName, nNa
8de0: 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 61 7a 43  me+1);.      azC
8df0: 6f 6c 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ol[i] = (char *)
8e00: 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 41  pAlloc;.      pA
8e10: 6c 6c 6f 63 20 2b 3d 20 6e 4e 61 6d 65 2b 31 3b  lloc += nName+1;
8e20: 0a 20 20 20 20 20 20 61 62 50 4b 5b 69 5d 20 3d  .      abPK[i] =
8e30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8e40: 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20  int(pStmt, 5);. 
8e50: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
8e60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8e70: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
8e80: 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73   .  }..  /* If s
8e90: 75 63 63 65 73 73 66 75 6c 2c 20 70 6f 70 75 6c  uccessful, popul
8ea0: 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ate the output v
8eb0: 61 72 69 61 62 6c 65 73 2e 20 4f 74 68 65 72 77  ariables. Otherw
8ec0: 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 6d 20 61  ise, zero them a
8ed0: 6e 64 0a 20 20 2a 2a 20 66 72 65 65 20 61 6e 79  nd.  ** free any
8ee0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6d 61 64 65   allocation made
8ef0: 2e 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  . An error code 
8f00: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
8f10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
8f20: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
8f30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
8f40: 70 61 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20  pazCol = (const 
8f50: 63 68 61 72 20 2a 2a 29 61 7a 43 6f 6c 3b 0a 20  char **)azCol;. 
8f60: 20 20 20 2a 70 61 62 50 4b 20 3d 20 61 62 50 4b     *pabPK = abPK
8f70: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e  ;.    *pnCol = n
8f80: 44 62 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DbCol;.  }else{.
8f90: 20 20 20 20 2a 70 61 7a 43 6f 6c 20 3d 20 30 3b      *pazCol = 0;
8fa0: 0a 20 20 20 20 2a 70 61 62 50 4b 20 3d 20 30 3b  .    *pabPK = 0;
8fb0: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
8fc0: 0a 20 20 20 20 69 66 28 20 70 7a 54 61 62 20 29  .    if( pzTab )
8fd0: 20 2a 70 7a 54 61 62 20 3d 20 30 3b 0a 20 20 20   *pzTab = 0;.   
8fe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
8ff0: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Col);.  }.  sqli
9000: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
9010: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  mt);.  return rc
9020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9030: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
9040: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
9050: 68 69 6e 20 61 20 70 72 65 2d 75 70 64 61 74 65  hin a pre-update
9060: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 0a 2a   handler for a.*
9070: 2a 20 77 72 69 74 65 20 74 6f 20 74 61 62 6c 65  * write to table
9080: 20 70 54 61 62 2c 20 70 61 72 74 20 6f 66 20 73   pTab, part of s
9090: 65 73 73 69 6f 6e 20 70 53 65 73 73 69 6f 6e 2e  ession pSession.
90a0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
90b0: 66 69 72 73 74 0a 2a 2a 20 77 72 69 74 65 20 74  first.** write t
90c0: 6f 20 74 68 69 73 20 74 61 62 6c 65 2c 20 69 6e  o this table, in
90d0: 69 74 61 6c 69 7a 65 20 74 68 65 20 53 65 73 73  italize the Sess
90e0: 69 6f 6e 54 61 62 6c 65 2e 6e 43 6f 6c 2c 20 61  ionTable.nCol, a
90f0: 7a 43 6f 6c 5b 5d 20 61 6e 64 0a 2a 2a 20 61 62  zCol[] and.** ab
9100: 50 4b 5b 5d 20 61 72 72 61 79 73 20 61 63 63 6f  PK[] arrays acco
9110: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rdingly..**.** I
9120: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9130: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
9140: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73 71   is stored in sq
9150: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 2e 72 63  lite3_session.rc
9160: 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f   and.** non-zero
9170: 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
9180: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
9190: 73 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  s but the table 
91a0: 68 61 73 20 6e 6f 20 70 72 69 6d 61 72 79 0a 2a  has no primary.*
91b0: 2a 20 6b 65 79 2c 20 73 71 6c 69 74 65 33 5f 73  * key, sqlite3_s
91c0: 65 73 73 69 6f 6e 2e 72 63 20 69 73 20 6c 65 66  ession.rc is lef
91d0: 74 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  t set to SQLITE_
91e0: 4f 4b 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  OK and non-zero 
91f0: 72 65 74 75 72 6e 65 64 20 74 6f 0a 2a 2a 20 69  returned to.** i
9200: 6e 64 69 63 61 74 65 20 74 68 61 74 20 75 70 64  ndicate that upd
9210: 61 74 65 73 20 6f 6e 20 74 68 69 73 20 74 61 62  ates on this tab
9220: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 69 67 6e  le should be ign
9230: 6f 72 65 64 2e 20 53 65 73 73 69 6f 6e 54 61 62  ored. SessionTab
9240: 6c 65 2e 61 62 50 4b 20 0a 2a 2a 20 69 73 20 73  le.abPK .** is s
9250: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
9260: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
9270: 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 49 6e  ic int sessionIn
9280: 69 74 54 61 62 6c 65 28 73 71 6c 69 74 65 33 5f  itTable(sqlite3_
9290: 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
92a0: 6e 2c 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20  n, SessionTable 
92b0: 2a 70 54 61 62 29 7b 0a 20 20 69 66 28 20 70 54  *pTab){.  if( pT
92c0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20  ab->nCol==0 ){. 
92d0: 20 20 20 75 38 20 2a 61 62 50 4b 3b 0a 20 20 20     u8 *abPK;.   
92e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
92f0: 7a 43 6f 6c 3d 3d 30 20 7c 7c 20 70 54 61 62 2d  zCol==0 || pTab-
9300: 3e 61 62 50 4b 3d 3d 30 20 29 3b 0a 20 20 20 20  >abPK==0 );.    
9310: 70 53 65 73 73 69 6f 6e 2d 3e 72 63 20 3d 20 73  pSession->rc = s
9320: 65 73 73 69 6f 6e 54 61 62 6c 65 49 6e 66 6f 28  essionTableInfo(
9330: 70 53 65 73 73 69 6f 6e 2d 3e 64 62 2c 20 70 53  pSession->db, pS
9340: 65 73 73 69 6f 6e 2d 3e 7a 44 62 2c 20 0a 20 20  ession->zDb, .  
9350: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
9360: 65 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  e, &pTab->nCol, 
9370: 30 2c 20 26 70 54 61 62 2d 3e 61 7a 43 6f 6c 2c  0, &pTab->azCol,
9380: 20 26 61 62 50 4b 0a 20 20 20 20 29 3b 0a 20 20   &abPK.    );.  
9390: 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
93a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
93b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
93c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
93d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
93e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 62 50  .        if( abP
93f0: 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  K[i] ){.        
9400: 20 20 70 54 61 62 2d 3e 61 62 50 4b 20 3d 20 61    pTab->abPK = a
9410: 62 50 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  bPK;.          b
9420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9440: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
9450: 69 63 6d 70 28 22 73 71 6c 69 74 65 5f 73 74 61  icmp("sqlite_sta
9460: 74 31 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  t1", pTab->zName
9470: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  ) ){.        pTa
9480: 62 2d 3e 62 53 74 61 74 31 20 3d 20 31 3b 0a 20  b->bStat1 = 1;. 
9490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
94a0: 0a 20 20 72 65 74 75 72 6e 20 28 70 53 65 73 73  .  return (pSess
94b0: 69 6f 6e 2d 3e 72 63 20 7c 7c 20 70 54 61 62 2d  ion->rc || pTab-
94c0: 3e 61 62 50 4b 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  >abPK==0);.}../*
94d0: 0a 2a 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20  .** Versions of 
94e0: 74 68 65 20 66 6f 75 72 20 6d 65 74 68 6f 64 73  the four methods
94f0: 20 69 6e 20 6f 62 6a 65 63 74 20 53 65 73 73 69   in object Sessi
9500: 6f 6e 48 6f 6f 6b 20 66 6f 72 20 75 73 65 20 77  onHook for use w
9510: 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
9520: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20 54  e_stat1 table. T
9530: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
9540: 69 73 20 69 73 20 74 6f 20 73 75 62 73 74 69 74  is is to substit
9550: 75 74 65 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ute a zero-lengt
9560: 68 0a 2a 2a 20 62 6c 6f 62 20 65 61 63 68 20 74  h.** blob each t
9570: 69 6d 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ime a NULL value
9580: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
9590: 65 20 22 69 64 78 22 20 63 6f 6c 75 6d 6e 20 6f  e "idx" column o
95a0: 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  f the.** sqlite_
95b0: 73 74 61 74 31 20 74 61 62 6c 65 2e 0a 2a 2f 0a  stat1 table..*/.
95c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
95d0: 65 73 73 69 6f 6e 53 74 61 74 31 43 74 78 20 53  essionStat1Ctx S
95e0: 65 73 73 69 6f 6e 53 74 61 74 31 43 74 78 3b 0a  essionStat1Ctx;.
95f0: 73 74 72 75 63 74 20 53 65 73 73 69 6f 6e 53 74  struct SessionSt
9600: 61 74 31 43 74 78 20 7b 0a 20 20 53 65 73 73 69  at1Ctx {.  Sessi
9610: 6f 6e 48 6f 6f 6b 20 68 6f 6f 6b 3b 0a 20 20 73  onHook hook;.  s
9620: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
9630: 70 53 65 73 73 69 6f 6e 3b 0a 7d 3b 0a 73 74 61  pSession;.};.sta
9640: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 53  tic int sessionS
9650: 74 61 74 31 4f 6c 64 28 76 6f 69 64 20 2a 70 43  tat1Old(void *pC
9660: 74 78 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71  tx, int iCol, sq
9670: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
9680: 56 61 6c 29 7b 0a 20 20 53 65 73 73 69 6f 6e 53  Val){.  SessionS
9690: 74 61 74 31 43 74 78 20 2a 70 20 3d 20 28 53 65  tat1Ctx *p = (Se
96a0: 73 73 69 6f 6e 53 74 61 74 31 43 74 78 2a 29 70  ssionStat1Ctx*)p
96b0: 43 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Ctx;.  sqlite3_v
96c0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
96d0: 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 68 6f    int rc = p->ho
96e0: 6f 6b 2e 78 4f 6c 64 28 70 2d 3e 68 6f 6f 6b 2e  ok.xOld(p->hook.
96f0: 70 43 74 78 2c 20 69 43 6f 6c 2c 20 26 70 56 61  pCtx, iCol, &pVa
9700: 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  l);.  if( rc==SQ
9710: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3d  LITE_OK && iCol=
9720: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  =1 && sqlite3_va
9730: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
9740: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
9750: 20 20 20 70 56 61 6c 20 3d 20 70 2d 3e 70 53 65     pVal = p->pSe
9760: 73 73 69 6f 6e 2d 3e 70 5a 65 72 6f 42 6c 6f 62  ssion->pZeroBlob
9770: 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c 20 3d  ;.  }.  *ppVal =
9780: 20 70 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20   pVal;.  return 
9790: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
97a0: 20 73 65 73 73 69 6f 6e 53 74 61 74 31 4e 65 77   sessionStat1New
97b0: 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74  (void *pCtx, int
97c0: 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 33 5f 76   iCol, sqlite3_v
97d0: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 29 7b 0a 20  alue **ppVal){. 
97e0: 20 53 65 73 73 69 6f 6e 53 74 61 74 31 43 74 78   SessionStat1Ctx
97f0: 20 2a 70 20 3d 20 28 53 65 73 73 69 6f 6e 53 74   *p = (SessionSt
9800: 61 74 31 43 74 78 2a 29 70 43 74 78 3b 0a 20 20  at1Ctx*)pCtx;.  
9810: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
9820: 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Val = 0;.  int r
9830: 63 20 3d 20 70 2d 3e 68 6f 6f 6b 2e 78 4e 65 77  c = p->hook.xNew
9840: 28 70 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69  (p->hook.pCtx, i
9850: 43 6f 6c 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69  Col, &pVal);.  i
9860: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9870: 20 26 26 20 69 43 6f 6c 3d 3d 31 20 26 26 20 73   && iCol==1 && s
9880: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
9890: 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f  e(pVal)==SQLITE_
98a0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 56 61 6c  NULL ){.    pVal
98b0: 20 3d 20 70 2d 3e 70 53 65 73 73 69 6f 6e 2d 3e   = p->pSession->
98c0: 70 5a 65 72 6f 42 6c 6f 62 3b 0a 20 20 7d 0a 20  pZeroBlob;.  }. 
98d0: 20 2a 70 70 56 61 6c 20 3d 20 70 56 61 6c 3b 0a   *ppVal = pVal;.
98e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
98f0: 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
9900: 6e 53 74 61 74 31 43 6f 75 6e 74 28 76 6f 69 64  nStat1Count(void
9910: 20 2a 70 43 74 78 29 7b 0a 20 20 53 65 73 73 69   *pCtx){.  Sessi
9920: 6f 6e 53 74 61 74 31 43 74 78 20 2a 70 20 3d 20  onStat1Ctx *p = 
9930: 28 53 65 73 73 69 6f 6e 53 74 61 74 31 43 74 78  (SessionStat1Ctx
9940: 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e  *)pCtx;.  return
9950: 20 70 2d 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74 28   p->hook.xCount(
9960: 70 2d 3e 68 6f 6f 6b 2e 70 43 74 78 29 3b 0a 7d  p->hook.pCtx);.}
9970: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
9980: 69 6f 6e 53 74 61 74 31 44 65 70 74 68 28 76 6f  ionStat1Depth(vo
9990: 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 53 65 73  id *pCtx){.  Ses
99a0: 73 69 6f 6e 53 74 61 74 31 43 74 78 20 2a 70 20  sionStat1Ctx *p 
99b0: 3d 20 28 53 65 73 73 69 6f 6e 53 74 61 74 31 43  = (SessionStat1C
99c0: 74 78 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75  tx*)pCtx;.  retu
99d0: 72 6e 20 70 2d 3e 68 6f 6f 6b 2e 78 44 65 70 74  rn p->hook.xDept
99e0: 68 28 70 2d 3e 68 6f 6f 6b 2e 70 43 74 78 29 3b  h(p->hook.pCtx);
99f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
9a00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
9a10: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
9a20: 68 20 61 20 70 72 65 2d 75 70 64 61 74 65 2d 68  h a pre-update-h
9a30: 6f 6f 6b 20 72 65 70 6f 72 74 69 6e 67 20 61 20  ook reporting a 
9a40: 0a 2a 2a 20 63 68 61 6e 67 65 20 6f 6e 20 74 61  .** change on ta
9a50: 62 6c 65 20 70 54 61 62 20 28 61 74 74 61 63 68  ble pTab (attach
9a60: 65 64 20 74 6f 20 73 65 73 73 69 6f 6e 20 70 53  ed to session pS
9a70: 65 73 73 69 6f 6e 29 2e 20 54 68 65 20 74 79 70  ession). The typ
9a80: 65 20 6f 66 20 63 68 61 6e 67 65 0a 2a 2a 20 28  e of change.** (
9a90: 55 50 44 41 54 45 2c 20 49 4e 53 45 52 54 2c 20  UPDATE, INSERT, 
9aa0: 44 45 4c 45 54 45 29 20 69 73 20 73 70 65 63 69  DELETE) is speci
9ab0: 66 69 65 64 20 62 79 20 74 68 65 20 66 69 72 73  fied by the firs
9ac0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
9ad0: 2a 20 55 6e 6c 65 73 73 20 6f 6e 65 20 69 73 20  * Unless one is 
9ae0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
9af0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  or an error occu
9b00: 72 73 2c 20 61 6e 20 65 6e 74 72 79 20 69 73 20  rs, an entry is 
9b10: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
9b20: 63 68 61 6e 67 65 64 2d 72 6f 77 73 20 68 61 73  changed-rows has
9b30: 68 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  h table associat
9b40: 65 64 20 77 69 74 68 20 74 61 62 6c 65 20 70 54  ed with table pT
9b50: 61 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ab..*/.static vo
9b60: 69 64 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64  id sessionPreupd
9b70: 61 74 65 4f 6e 65 43 68 61 6e 67 65 28 0a 20 20  ateOneChange(.  
9b80: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c 49 54 45  /* One of SQLITE
9bb0: 5f 55 50 44 41 54 45 2c 20 49 4e 53 45 52 54 2c  _UPDATE, INSERT,
9bc0: 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 73 71 6c   DELETE */.  sql
9bd0: 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
9be0: 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20  ession,      /* 
9bf0: 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  Session object p
9c00: 54 61 62 20 69 73 20 61 74 74 61 63 68 65 64 20  Tab is attached 
9c10: 74 6f 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 54  to */.  SessionT
9c20: 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
9c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9c40: 20 74 68 61 74 20 63 68 61 6e 67 65 20 61 70 70   that change app
9c50: 6c 69 65 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  lies to */.){.  
9c60: 69 6e 74 20 69 48 61 73 68 3b 20 0a 20 20 69 6e  int iHash; .  in
9c70: 74 20 62 4e 75 6c 6c 20 3d 20 30 3b 20 0a 20 20  t bNull = 0; .  
9c80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9c90: 4f 4b 3b 0a 20 20 53 65 73 73 69 6f 6e 53 74 61  OK;.  SessionSta
9ca0: 74 31 43 74 78 20 73 74 61 74 31 20 3d 20 7b 7b  t1Ctx stat1 = {{
9cb0: 30 2c 30 2c 30 2c 30 2c 30 7d 2c 30 7d 3b 0a 0a  0,0,0,0,0},0};..
9cc0: 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
9cd0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
9ce0: 2f 2a 20 4c 6f 61 64 20 74 61 62 6c 65 20 64 65  /* Load table de
9cf0: 74 61 69 6c 73 20 69 66 20 72 65 71 75 69 72 65  tails if require
9d00: 64 20 2a 2f 0a 20 20 69 66 28 20 73 65 73 73 69  d */.  if( sessi
9d10: 6f 6e 49 6e 69 74 54 61 62 6c 65 28 70 53 65 73  onInitTable(pSes
9d20: 73 69 6f 6e 2c 20 70 54 61 62 29 20 29 20 72 65  sion, pTab) ) re
9d30: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  turn;..  /* Chec
9d40: 6b 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  k the number of 
9d50: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  columns in this 
9d60: 78 50 72 65 55 70 64 61 74 65 20 63 61 6c 6c 20  xPreUpdate call 
9d70: 6d 61 74 63 68 65 73 20 74 68 65 20 0a 20 20 2a  matches the .  *
9d80: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * number of colu
9d90: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
9da0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
9db0: 2d 3e 6e 43 6f 6c 21 3d 70 53 65 73 73 69 6f 6e  ->nCol!=pSession
9dc0: 2d 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74 28 70 53  ->hook.xCount(pS
9dd0: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74  ession->hook.pCt
9de0: 78 29 20 29 7b 0a 20 20 20 20 70 53 65 73 73 69  x) ){.    pSessi
9df0: 6f 6e 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  on->rc = SQLITE_
9e00: 53 43 48 45 4d 41 3b 0a 20 20 20 20 72 65 74 75  SCHEMA;.    retu
9e10: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 72  rn;.  }..  /* Gr
9e20: 6f 77 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ow the hash tabl
9e30: 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
9e40: 0a 20 20 69 66 28 20 73 65 73 73 69 6f 6e 47 72  .  if( sessionGr
9e50: 6f 77 48 61 73 68 28 30 2c 20 70 54 61 62 29 20  owHash(0, pTab) 
9e60: 29 7b 0a 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  ){.    pSession-
9e70: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
9e80: 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
9e90: 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 2d    }..  if( pTab-
9ea0: 3e 62 53 74 61 74 31 20 29 7b 0a 20 20 20 20 73  >bStat1 ){.    s
9eb0: 74 61 74 31 2e 68 6f 6f 6b 20 3d 20 70 53 65 73  tat1.hook = pSes
9ec0: 73 69 6f 6e 2d 3e 68 6f 6f 6b 3b 0a 20 20 20 20  sion->hook;.    
9ed0: 73 74 61 74 31 2e 70 53 65 73 73 69 6f 6e 20 3d  stat1.pSession =
9ee0: 20 70 53 65 73 73 69 6f 6e 3b 0a 20 20 20 20 70   pSession;.    p
9ef0: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43  Session->hook.pC
9f00: 74 78 20 3d 20 28 76 6f 69 64 2a 29 26 73 74 61  tx = (void*)&sta
9f10: 74 31 3b 0a 20 20 20 20 70 53 65 73 73 69 6f 6e  t1;.    pSession
9f20: 2d 3e 68 6f 6f 6b 2e 78 4e 65 77 20 3d 20 73 65  ->hook.xNew = se
9f30: 73 73 69 6f 6e 53 74 61 74 31 4e 65 77 3b 0a 20  ssionStat1New;. 
9f40: 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f     pSession->hoo
9f50: 6b 2e 78 4f 6c 64 20 3d 20 73 65 73 73 69 6f 6e  k.xOld = session
9f60: 53 74 61 74 31 4f 6c 64 3b 0a 20 20 20 20 70 53  Stat1Old;.    pS
9f70: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 43 6f  ession->hook.xCo
9f80: 75 6e 74 20 3d 20 73 65 73 73 69 6f 6e 53 74 61  unt = sessionSta
9f90: 74 31 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 65  t1Count;.    pSe
9fa0: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 44 65 70  ssion->hook.xDep
9fb0: 74 68 20 3d 20 73 65 73 73 69 6f 6e 53 74 61 74  th = sessionStat
9fc0: 31 44 65 70 74 68 3b 0a 20 20 20 20 69 66 28 20  1Depth;.    if( 
9fd0: 70 53 65 73 73 69 6f 6e 2d 3e 70 5a 65 72 6f 42  pSession->pZeroB
9fe0: 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lob==0 ){.      
9ff0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
a000: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
a010: 65 77 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ew(0);.      if(
a020: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   p==0 ){.       
a030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a040: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
a050: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
a060: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a070: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 2c 20  3ValueSetStr(p, 
a080: 30 2c 20 22 22 2c 20 30 2c 20 53 51 4c 49 54 45  0, "", 0, SQLITE
a090: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a0a0: 70 53 65 73 73 69 6f 6e 2d 3e 70 5a 65 72 6f 42  pSession->pZeroB
a0b0: 6c 6f 62 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  lob = p;.    }. 
a0c0: 20 7d 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61   }..  /* Calcula
a0d0: 74 65 20 74 68 65 20 68 61 73 68 2d 6b 65 79 20  te the hash-key 
a0e0: 66 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 2e  for this change.
a0f0: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
a100: 6b 65 79 20 6f 66 20 74 68 65 20 72 6f 77 0a 20  key of the row. 
a110: 20 2a 2a 20 69 6e 63 6c 75 64 65 73 20 61 20 4e   ** includes a N
a120: 55 4c 4c 20 76 61 6c 75 65 2c 20 65 78 69 74 20  ULL value, exit 
a130: 65 61 72 6c 79 2e 20 53 75 63 68 20 63 68 61 6e  early. Such chan
a140: 67 65 73 20 61 72 65 20 69 67 6e 6f 72 65 64 20  ges are ignored 
a150: 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 65 73 73  by the.  ** sess
a160: 69 6f 6e 20 6d 6f 64 75 6c 65 2e 20 2a 2f 0a 20  ion module. */. 
a170: 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 50 72 65   rc = sessionPre
a180: 75 70 64 61 74 65 48 61 73 68 28 70 53 65 73 73  updateHash(pSess
a190: 69 6f 6e 2c 20 70 54 61 62 2c 20 6f 70 3d 3d 53  ion, pTab, op==S
a1a0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 26 69  QLITE_INSERT, &i
a1b0: 48 61 73 68 2c 20 26 62 4e 75 6c 6c 29 3b 0a 20  Hash, &bNull);. 
a1c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a1d0: 4f 4b 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  OK ) goto error_
a1e0: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 62 4e 75 6c  out;..  if( bNul
a1f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  l==0 ){.    /* S
a200: 65 61 72 63 68 20 74 68 65 20 68 61 73 68 20 74  earch the hash t
a210: 61 62 6c 65 20 66 6f 72 20 61 6e 20 65 78 69 73  able for an exis
a220: 74 69 6e 67 20 72 65 63 6f 72 64 20 66 6f 72 20  ting record for 
a230: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
a240: 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a   SessionChange *
a250: 70 43 3b 0a 20 20 20 20 66 6f 72 28 70 43 3d 70  pC;.    for(pC=p
a260: 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 5b 69 48  Tab->apChange[iH
a270: 61 73 68 5d 3b 20 70 43 3b 20 70 43 3d 70 43 2d  ash]; pC; pC=pC-
a280: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
a290: 66 28 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64  f( sessionPreupd
a2a0: 61 74 65 45 71 75 61 6c 28 70 53 65 73 73 69 6f  ateEqual(pSessio
a2b0: 6e 2c 20 70 54 61 62 2c 20 70 43 2c 20 6f 70 29  n, pTab, pC, op)
a2c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
a2d0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
a2e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
a2f0: 65 20 61 20 6e 65 77 20 63 68 61 6e 67 65 20 6f  e a new change o
a300: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
a310: 20 61 6c 6c 20 74 68 65 20 6f 6c 64 20 76 61 6c   all the old val
a320: 75 65 73 20 28 69 66 0a 20 20 20 20 20 20 2a 2a  ues (if.      **
a330: 20 74 68 69 73 20 69 73 20 61 6e 20 53 51 4c 49   this is an SQLI
a340: 54 45 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c  TE_UPDATE or SQL
a350: 49 54 45 5f 44 45 4c 45 54 45 29 2c 20 6f 72 20  ITE_DELETE), or 
a360: 6a 75 73 74 20 74 68 65 20 50 4b 0a 20 20 20 20  just the PK.    
a370: 20 20 2a 2a 20 76 61 6c 75 65 73 20 28 69 66 20    ** values (if 
a380: 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
a390: 54 29 2e 20 2a 2f 0a 20 20 20 20 20 20 53 65 73  T). */.      Ses
a3a0: 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 43 68 61  sionChange *pCha
a3b0: 6e 67 65 3b 20 2f 2a 20 4e 65 77 20 63 68 61 6e  nge; /* New chan
a3c0: 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ge object */.   
a3d0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
a3e0: 20 6e 42 79 74 65 3b 20 20 20 20 2f 2a 20 4e 75   nByte;    /* Nu
a3f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
a400: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20   allocate */.   
a410: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
a430: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
a440: 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f  rough columns */
a450: 0a 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74  .  .      assert
a460: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a470: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  );.      pTab->n
a480: 45 6e 74 72 79 2b 2b 3b 0a 20 20 0a 20 20 20 20  Entry++;.  .    
a490: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
a4a0: 68 6f 77 20 6c 61 72 67 65 20 61 6e 20 61 6c 6c  how large an all
a4b0: 6f 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  ocation is requi
a4c0: 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 42 79  red */.      nBy
a4d0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 65 73 73  te = sizeof(Sess
a4e0: 69 6f 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ionChange);.    
a4f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
a500: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
a510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
a520: 61 6c 75 65 20 2a 70 20 3d 20 30 3b 0a 20 20 20  alue *p = 0;.   
a530: 20 20 20 20 20 69 66 28 20 6f 70 21 3d 53 51 4c       if( op!=SQL
a540: 49 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20  ITE_INSERT ){.  
a550: 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
a560: 28 69 6e 74 20 74 72 63 20 3d 20 29 20 70 53 65  (int trc = ) pSe
a570: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f 6c 64  ssion->hook.xOld
a580: 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e  (pSession->hook.
a590: 70 43 74 78 2c 20 69 2c 20 26 70 29 3b 0a 20 20  pCtx, i, &p);.  
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 74 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  trc==SQLITE_OK )
a5c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
a5d0: 69 66 28 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69  if( pTab->abPK[i
a5e0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ] ){.          T
a5f0: 45 53 54 4f 4e 4c 59 28 69 6e 74 20 74 72 63 20  ESTONLY(int trc 
a600: 3d 20 29 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f  = ) pSession->ho
a610: 6f 6b 2e 78 4e 65 77 28 70 53 65 73 73 69 6f 6e  ok.xNew(pSession
a620: 2d 3e 68 6f 6f 6b 2e 70 43 74 78 2c 20 69 2c 20  ->hook.pCtx, i, 
a630: 26 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  &p);.          a
a640: 73 73 65 72 74 28 20 74 72 63 3d 3d 53 51 4c 49  ssert( trc==SQLI
a650: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
a660: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   }..        /* T
a670: 68 69 73 20 6d 61 79 20 66 61 69 6c 20 69 66 20  his may fail if 
a680: 53 51 4c 69 74 65 20 76 61 6c 75 65 20 70 20 63  SQLite value p c
a690: 6f 6e 74 61 69 6e 73 20 61 20 75 74 66 2d 31 36  ontains a utf-16
a6a0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 6d 75 73   string that mus
a6b0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20  t.        ** be 
a6c0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 75 74 66  converted to utf
a6d0: 2d 38 20 61 6e 64 20 61 6e 20 4f 4f 4d 20 65 72  -8 and an OOM er
a6e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
a6f0: 20 64 6f 69 6e 67 20 73 6f 2e 20 2a 2f 0a 20 20   doing so. */.  
a700: 20 20 20 20 20 20 72 63 20 3d 20 73 65 73 73 69        rc = sessi
a710: 6f 6e 53 65 72 69 61 6c 69 7a 65 56 61 6c 75 65  onSerializeValue
a720: 28 30 2c 20 70 2c 20 26 6e 42 79 74 65 29 3b 0a  (0, p, &nByte);.
a730: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a740: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a750: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
a760: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
a770: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 63 68 61  Allocate the cha
a780: 6e 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  nge object */.  
a790: 20 20 20 20 70 43 68 61 6e 67 65 20 3d 20 28 53      pChange = (S
a7a0: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 29 73  essionChange *)s
a7b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
a7c0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
a7d0: 28 20 21 70 43 68 61 6e 67 65 20 29 7b 0a 20 20  ( !pChange ){.  
a7e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a7f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
a800: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
a810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a820: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
a830: 61 6e 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ange, 0, sizeof(
a840: 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 29 29 3b  SessionChange));
a850: 0a 20 20 20 20 20 20 20 20 70 43 68 61 6e 67 65  .        pChange
a860: 2d 3e 61 52 65 63 6f 72 64 20 3d 20 28 75 38 20  ->aRecord = (u8 
a870: 2a 29 26 70 43 68 61 6e 67 65 5b 31 5d 3b 0a 20  *)&pChange[1];. 
a880: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
a890: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
a8a0: 63 68 61 6e 67 65 20 6f 62 6a 65 63 74 2e 20 4e  change object. N
a8b0: 6f 6e 65 20 6f 66 20 74 68 65 20 70 72 65 75 70  one of the preup
a8c0: 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 20 20 20 20  date_old(),.    
a8d0: 20 20 2a 2a 20 70 72 65 75 70 64 61 74 65 5f 6e    ** preupdate_n
a8e0: 65 77 28 29 20 6f 72 20 53 65 72 69 61 6c 69 7a  ew() or Serializ
a8f0: 65 56 61 6c 75 65 28 29 20 63 61 6c 6c 73 20 62  eValue() calls b
a900: 65 6c 6f 77 20 6d 61 79 20 66 61 69 6c 20 61 73  elow may fail as
a910: 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 72 65   all.      ** re
a920: 71 75 69 72 65 64 20 76 61 6c 75 65 73 20 61 6e  quired values an
a930: 64 20 65 6e 63 6f 64 69 6e 67 73 20 68 61 76 65  d encodings have
a940: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
a950: 63 68 65 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  ched in memory..
a960: 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e        ** It is n
a970: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
a980: 61 6e 20 4f 4f 4d 20 74 6f 20 6f 63 63 75 72 20  an OOM to occur 
a990: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 2e 20 2a  in this block. *
a9a0: 2f 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  /.      nByte = 
a9b0: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
a9c0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
a9d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
a9e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 20 3d  lite3_value *p =
a9f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
aa00: 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op!=SQLITE_INSER
aa10: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
aa20: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4f  Session->hook.xO
aa30: 6c 64 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  ld(pSession->hoo
aa40: 6b 2e 70 43 74 78 2c 20 69 2c 20 26 70 29 3b 0a  k.pCtx, i, &p);.
aa50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
aa60: 28 20 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 20  ( pTab->abPK[i] 
aa70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  ){.          pSe
aa80: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e 65 77  ssion->hook.xNew
aa90: 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e  (pSession->hook.
aaa0: 70 43 74 78 2c 20 69 2c 20 26 70 29 3b 0a 20 20  pCtx, i, &p);.  
aab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aac0: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 69 7a 65  sessionSerialize
aad0: 56 61 6c 75 65 28 26 70 43 68 61 6e 67 65 2d 3e  Value(&pChange->
aae0: 61 52 65 63 6f 72 64 5b 6e 42 79 74 65 5d 2c 20  aRecord[nByte], 
aaf0: 70 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  p, &nByte);.    
ab00: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64    }..      /* Ad
ab10: 64 20 74 68 65 20 63 68 61 6e 67 65 20 74 6f 20  d the change to 
ab20: 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 2a  the hash-table *
ab30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73  /.      if( pSes
ab40: 73 69 6f 6e 2d 3e 62 49 6e 64 69 72 65 63 74 20  sion->bIndirect 
ab50: 7c 7c 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  || pSession->hoo
ab60: 6b 2e 78 44 65 70 74 68 28 70 53 65 73 73 69 6f  k.xDepth(pSessio
ab70: 6e 2d 3e 68 6f 6f 6b 2e 70 43 74 78 29 20 29 7b  n->hook.pCtx) ){
ab80: 0a 20 20 20 20 20 20 20 20 70 43 68 61 6e 67 65  .        pChange
ab90: 2d 3e 62 49 6e 64 69 72 65 63 74 20 3d 20 31 3b  ->bIndirect = 1;
aba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
abb0: 43 68 61 6e 67 65 2d 3e 6e 52 65 63 6f 72 64 20  Change->nRecord 
abc0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70  = nByte;.      p
abd0: 43 68 61 6e 67 65 2d 3e 6f 70 20 3d 20 6f 70 3b  Change->op = op;
abe0: 0a 20 20 20 20 20 20 70 43 68 61 6e 67 65 2d 3e  .      pChange->
abf0: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 61 70  pNext = pTab->ap
ac00: 43 68 61 6e 67 65 5b 69 48 61 73 68 5d 3b 0a 20  Change[iHash];. 
ac10: 20 20 20 20 20 70 54 61 62 2d 3e 61 70 43 68 61       pTab->apCha
ac20: 6e 67 65 5b 69 48 61 73 68 5d 20 3d 20 70 43 68  nge[iHash] = pCh
ac30: 61 6e 67 65 3b 0a 0a 20 20 20 20 7d 65 6c 73 65  ange;..    }else
ac40: 20 69 66 28 20 70 43 2d 3e 62 49 6e 64 69 72 65   if( pC->bIndire
ac50: 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ct ){.      /* I
ac60: 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  f the existing c
ac70: 68 61 6e 67 65 20 69 73 20 63 6f 6e 73 69 64 65  hange is conside
ac80: 72 65 64 20 22 69 6e 64 69 72 65 63 74 22 2c 20  red "indirect", 
ac90: 62 75 74 20 74 68 69 73 20 63 75 72 72 65 6e 74  but this current
aca0: 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  .      ** change
acb0: 20 69 73 20 22 64 69 72 65 63 74 22 2c 20 6d 61   is "direct", ma
acc0: 72 6b 20 74 68 65 20 63 68 61 6e 67 65 20 6f 62  rk the change ob
acd0: 6a 65 63 74 20 61 73 20 64 69 72 65 63 74 2e 20  ject as direct. 
ace0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  */.      if( pSe
acf0: 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 44 65 70  ssion->hook.xDep
ad00: 74 68 28 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  th(pSession->hoo
ad10: 6b 2e 70 43 74 78 29 3d 3d 30 20 0a 20 20 20 20  k.pCtx)==0 .    
ad20: 20 20 20 26 26 20 70 53 65 73 73 69 6f 6e 2d 3e     && pSession->
ad30: 62 49 6e 64 69 72 65 63 74 3d 3d 30 20 0a 20 20  bIndirect==0 .  
ad40: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
ad50: 43 2d 3e 62 49 6e 64 69 72 65 63 74 20 3d 20 30  C->bIndirect = 0
ad60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ad70: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
ad80: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
ad90: 65 64 2c 20 6d 61 72 6b 20 74 68 65 20 73 65 73  ed, mark the ses
ada0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 73 20 66  sion object as f
adb0: 61 69 6c 65 64 2e 20 2a 2f 0a 20 65 72 72 6f 72  ailed. */. error
adc0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 54 61 62  _out:.  if( pTab
add0: 2d 3e 62 53 74 61 74 31 20 29 7b 0a 20 20 20 20  ->bStat1 ){.    
ade0: 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 20 3d  pSession->hook =
adf0: 20 73 74 61 74 31 2e 68 6f 6f 6b 3b 0a 20 20 7d   stat1.hook;.  }
ae00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ae10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53 65 73  E_OK ){.    pSes
ae20: 73 69 6f 6e 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  sion->rc = rc;. 
ae30: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
ae40: 20 73 65 73 73 69 6f 6e 46 69 6e 64 54 61 62 6c   sessionFindTabl
ae50: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  e(.  sqlite3_ses
ae60: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
ae70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ae80: 4e 61 6d 65 2c 0a 20 20 53 65 73 73 69 6f 6e 54  Name,.  SessionT
ae90: 61 62 6c 65 20 2a 2a 70 70 54 61 62 0a 29 7b 0a  able **ppTab.){.
aea0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
aeb0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  E_OK;.  int nNam
aec0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
aed0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 53 65  n30(zName);.  Se
aee0: 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 52 65 74  ssionTable *pRet
aef0: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
af00: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  or an existing t
af10: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 70 52  able */.  for(pR
af20: 65 74 3d 70 53 65 73 73 69 6f 6e 2d 3e 70 54 61  et=pSession->pTa
af30: 62 6c 65 3b 20 70 52 65 74 3b 20 70 52 65 74 3d  ble; pRet; pRet=
af40: 70 52 65 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pRet->pNext){.  
af50: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
af60: 5f 73 74 72 6e 69 63 6d 70 28 70 52 65 74 2d 3e  _strnicmp(pRet->
af70: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
af80: 61 6d 65 2b 31 29 20 29 20 62 72 65 61 6b 3b 0a  ame+1) ) break;.
af90: 20 20 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d    }..  if( pRet=
afa0: 3d 30 20 26 26 20 70 53 65 73 73 69 6f 6e 2d 3e  =0 && pSession->
afb0: 62 41 75 74 6f 41 74 74 61 63 68 20 29 7b 0a 20  bAutoAttach ){. 
afc0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
afd0: 73 20 61 20 74 61 62 6c 65 2d 66 69 6c 74 65 72  s a table-filter
afe0: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
aff0: 6f 6b 65 20 69 74 2e 20 49 66 20 69 74 20 72 65  oke it. If it re
b000: 74 75 72 6e 73 20 30 2c 0a 20 20 20 20 2a 2a 20  turns 0,.    ** 
b010: 64 6f 20 6e 6f 74 20 61 75 74 6f 6d 61 74 69 63  do not automatic
b020: 61 6c 6c 79 20 61 64 64 20 74 68 65 20 6e 65 77  ally add the new
b030: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
b040: 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 78 54 61  f( pSession->xTa
b050: 62 6c 65 46 69 6c 74 65 72 3d 3d 30 0a 20 20 20  bleFilter==0.   
b060: 20 20 7c 7c 20 70 53 65 73 73 69 6f 6e 2d 3e 78    || pSession->x
b070: 54 61 62 6c 65 46 69 6c 74 65 72 28 70 53 65 73  TableFilter(pSes
b080: 73 69 6f 6e 2d 3e 70 46 69 6c 74 65 72 43 74 78  sion->pFilterCtx
b090: 2c 20 7a 4e 61 6d 65 29 20 0a 20 20 20 20 29 7b  , zName) .    ){
b0a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b0b0: 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
b0c0: 68 28 70 53 65 73 73 69 6f 6e 2c 20 7a 4e 61 6d  h(pSession, zNam
b0d0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
b0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b0f0: 20 20 20 20 20 20 20 66 6f 72 28 70 52 65 74 3d         for(pRet=
b100: 70 53 65 73 73 69 6f 6e 2d 3e 70 54 61 62 6c 65  pSession->pTable
b110: 3b 20 70 52 65 74 2d 3e 70 4e 65 78 74 3b 20 70  ; pRet->pNext; p
b120: 52 65 74 3d 70 52 65 74 2d 3e 70 4e 65 78 74 29  Ret=pRet->pNext)
b130: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b140: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
b150: 6e 69 63 6d 70 28 70 52 65 74 2d 3e 7a 4e 61 6d  nicmp(pRet->zNam
b160: 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
b170: 31 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  1) );.      }.  
b180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
b190: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
b1a0: 20 7c 7c 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20   || pRet==0 );. 
b1b0: 20 2a 70 70 54 61 62 20 3d 20 70 52 65 74 3b 0a   *ppTab = pRet;.
b1c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b1d0: 2f 2a 0a 2a 2a 20 54 68 65 20 27 70 72 65 2d 75  /*.** The 'pre-u
b1e0: 70 64 61 74 65 27 20 68 6f 6f 6b 20 72 65 67 69  pdate' hook regi
b1f0: 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 6d  stered by this m
b200: 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69 74  odule with SQLit
b210: 65 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a  e databases..*/.
b220: 73 74 61 74 69 63 20 76 6f 69 64 20 78 50 72 65  static void xPre
b230: 55 70 64 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  Update(.  void *
b240: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
b250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
b260: 79 20 6f 66 20 74 68 69 72 64 20 61 72 67 20 74  y of third arg t
b270: 6f 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  o preupdate_hook
b280: 28 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  () */.  sqlite3 
b290: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
b2a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b2b0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
b2c0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 2f 2a 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  /* SQLITE_UPDATE
b2f0: 2c 20 44 45 4c 45 54 45 20 6f 72 20 49 4e 53 45  , DELETE or INSE
b300: 52 54 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  RT */.  char con
b310: 73 74 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  st *zDb,        
b320: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b330: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  ase name */.  ch
b340: 61 72 20 63 6f 6e 73 74 20 2a 7a 4e 61 6d 65 2c  ar const *zName,
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b360: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
b370: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
b380: 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
b390: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 72 6f 77   /* Rowid of row
b3a0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
b3b0: 65 74 65 64 2f 75 70 64 61 74 65 64 20 2a 2f 0a  eted/updated */.
b3c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
b3d0: 69 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 20  iKey2           
b3e0: 20 20 2f 2a 20 4e 65 77 20 72 6f 77 69 64 20 76    /* New rowid v
b3f0: 61 6c 75 65 20 28 66 6f 72 20 61 20 72 6f 77 69  alue (for a rowi
b400: 64 20 55 50 44 41 54 45 29 20 2a 2f 0a 29 7b 0a  d UPDATE) */.){.
b410: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
b420: 6e 20 2a 70 53 65 73 73 69 6f 6e 3b 0a 20 20 69  n *pSession;.  i
b430: 6e 74 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33  nt nDb = sqlite3
b440: 53 74 72 6c 65 6e 33 30 28 7a 44 62 29 3b 0a 0a  Strlen30(zDb);..
b450: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b460: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
b470: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 66 6f  >mutex) );..  fo
b480: 72 28 70 53 65 73 73 69 6f 6e 3d 28 73 71 6c 69  r(pSession=(sqli
b490: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 29 70 43  te3_session *)pC
b4a0: 74 78 3b 20 70 53 65 73 73 69 6f 6e 3b 20 70 53  tx; pSession; pS
b4b0: 65 73 73 69 6f 6e 3d 70 53 65 73 73 69 6f 6e 2d  ession=pSession-
b4c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 53 65 73  >pNext){.    Ses
b4d0: 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62 3b  sionTable *pTab;
b4e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
b4f0: 20 73 65 73 73 69 6f 6e 20 69 73 20 61 74 74 61   session is atta
b500: 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
b510: 65 6e 74 20 64 61 74 61 62 61 73 65 20 28 22 6d  ent database ("m
b520: 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 0a 20 20  ain", "temp" .  
b530: 20 20 2a 2a 20 65 74 63 2e 29 2c 20 6f 72 20 69    ** etc.), or i
b540: 66 20 69 74 20 69 73 20 6e 6f 74 20 63 75 72 72  f it is not curr
b550: 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2c 20 74  ently enabled, t
b560: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
b570: 74 6f 20 64 6f 2e 20 53 6b 69 70 20 0a 20 20 20  to do. Skip .   
b580: 20 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20   ** to the next 
b590: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  session object a
b5a0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
b5b0: 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20  database. */.   
b5c0: 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 62   if( pSession->b
b5d0: 45 6e 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  Enable==0 ) cont
b5e0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 53  inue;.    if( pS
b5f0: 65 73 73 69 6f 6e 2d 3e 72 63 20 29 20 63 6f 6e  ession->rc ) con
b600: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
b610: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
b620: 7a 44 62 2c 20 70 53 65 73 73 69 6f 6e 2d 3e 7a  zDb, pSession->z
b630: 44 62 2c 20 6e 44 62 2b 31 29 20 29 20 63 6f 6e  Db, nDb+1) ) con
b640: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 53 65 73  tinue;..    pSes
b650: 73 69 6f 6e 2d 3e 72 63 20 3d 20 73 65 73 73 69  sion->rc = sessi
b660: 6f 6e 46 69 6e 64 54 61 62 6c 65 28 70 53 65 73  onFindTable(pSes
b670: 73 69 6f 6e 2c 20 7a 4e 61 6d 65 2c 20 26 70 54  sion, zName, &pT
b680: 61 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ab);.    if( pTa
b690: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
b6a0: 74 28 20 70 53 65 73 73 69 6f 6e 2d 3e 72 63 3d  t( pSession->rc=
b6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
b6c0: 20 20 20 20 73 65 73 73 69 6f 6e 50 72 65 75 70      sessionPreup
b6d0: 64 61 74 65 4f 6e 65 43 68 61 6e 67 65 28 6f 70  dateOneChange(op
b6e0: 2c 20 70 53 65 73 73 69 6f 6e 2c 20 70 54 61 62  , pSession, pTab
b6f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
b700: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
b710: 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
b720: 6e 50 72 65 75 70 64 61 74 65 4f 6e 65 43 68 61  nPreupdateOneCha
b730: 6e 67 65 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  nge(SQLITE_INSER
b740: 54 2c 20 70 53 65 73 73 69 6f 6e 2c 20 70 54 61  T, pSession, pTa
b750: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b760: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
b770: 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
b780: 6f 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ok implementatio
b790: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
b7a0: 74 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61  t sessionPreupda
b7b0: 74 65 4f 6c 64 28 76 6f 69 64 20 2a 70 43 74 78  teOld(void *pCtx
b7c0: 2c 20 69 6e 74 20 69 56 61 6c 2c 20 73 71 6c 69  , int iVal, sqli
b7d0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61  te3_value **ppVa
b7e0: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l){.  return sql
b7f0: 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
b800: 6c 64 28 28 73 71 6c 69 74 65 33 2a 29 70 43 74  ld((sqlite3*)pCt
b810: 78 2c 20 69 56 61 6c 2c 20 70 70 56 61 6c 29 3b  x, iVal, ppVal);
b820: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
b830: 73 73 69 6f 6e 50 72 65 75 70 64 61 74 65 4e 65  ssionPreupdateNe
b840: 77 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e  w(void *pCtx, in
b850: 74 20 69 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f  t iVal, sqlite3_
b860: 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 29 7b 0a  value **ppVal){.
b870: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b880: 5f 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28 28  _preupdate_new((
b890: 73 71 6c 69 74 65 33 2a 29 70 43 74 78 2c 20 69  sqlite3*)pCtx, i
b8a0: 56 61 6c 2c 20 70 70 56 61 6c 29 3b 0a 7d 0a 73  Val, ppVal);.}.s
b8b0: 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
b8c0: 6e 50 72 65 75 70 64 61 74 65 43 6f 75 6e 74 28  nPreupdateCount(
b8d0: 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 72  void *pCtx){.  r
b8e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
b8f0: 65 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 28 73  eupdate_count((s
b900: 71 6c 69 74 65 33 2a 29 70 43 74 78 29 3b 0a 7d  qlite3*)pCtx);.}
b910: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
b920: 69 6f 6e 50 72 65 75 70 64 61 74 65 44 65 70 74  ionPreupdateDept
b930: 68 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20  h(void *pCtx){. 
b940: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
b950: 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28  preupdate_depth(
b960: 28 73 71 6c 69 74 65 33 2a 29 70 43 74 78 29 3b  (sqlite3*)pCtx);
b970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6c  .}../*.** Instal
b980: 6c 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  l the pre-update
b990: 20 68 6f 6f 6b 73 20 6f 6e 20 74 68 65 20 73 65   hooks on the se
b9a0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ssion object pas
b9b0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
b9c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
b9d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
b9e0: 69 6f 6e 50 72 65 75 70 64 61 74 65 48 6f 6f 6b  ionPreupdateHook
b9f0: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  s(.  sqlite3_ses
ba00: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 0a 29  sion *pSession.)
ba10: 7b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f  {.  pSession->ho
ba20: 6f 6b 2e 70 43 74 78 20 3d 20 28 76 6f 69 64 2a  ok.pCtx = (void*
ba30: 29 70 53 65 73 73 69 6f 6e 2d 3e 64 62 3b 0a 20  )pSession->db;. 
ba40: 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e   pSession->hook.
ba50: 78 4f 6c 64 20 3d 20 73 65 73 73 69 6f 6e 50 72  xOld = sessionPr
ba60: 65 75 70 64 61 74 65 4f 6c 64 3b 0a 20 20 70 53  eupdateOld;.  pS
ba70: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e 65  ession->hook.xNe
ba80: 77 20 3d 20 73 65 73 73 69 6f 6e 50 72 65 75 70  w = sessionPreup
ba90: 64 61 74 65 4e 65 77 3b 0a 20 20 70 53 65 73 73  dateNew;.  pSess
baa0: 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74  ion->hook.xCount
bab0: 20 3d 20 73 65 73 73 69 6f 6e 50 72 65 75 70 64   = sessionPreupd
bac0: 61 74 65 43 6f 75 6e 74 3b 0a 20 20 70 53 65 73  ateCount;.  pSes
bad0: 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 44 65 70 74  sion->hook.xDept
bae0: 68 20 3d 20 73 65 73 73 69 6f 6e 50 72 65 75 70  h = sessionPreup
baf0: 64 61 74 65 44 65 70 74 68 3b 0a 7d 0a 0a 74 79  dateDepth;.}..ty
bb00: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 65 73  pedef struct Ses
bb10: 73 69 6f 6e 44 69 66 66 43 74 78 20 53 65 73 73  sionDiffCtx Sess
bb20: 69 6f 6e 44 69 66 66 43 74 78 3b 0a 73 74 72 75  ionDiffCtx;.stru
bb30: 63 74 20 53 65 73 73 69 6f 6e 44 69 66 66 43 74  ct SessionDiffCt
bb40: 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  x {.  sqlite3_st
bb50: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
bb60: 20 6e 4f 6c 64 4f 66 66 3b 0a 7d 3b 0a 0a 2f 2a   nOldOff;.};../*
bb70: 0a 2a 2a 20 54 68 65 20 64 69 66 66 20 68 6f 6f  .** The diff hoo
bb80: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
bb90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
bba0: 20 73 65 73 73 69 6f 6e 44 69 66 66 4f 6c 64 28   sessionDiffOld(
bbb0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20  void *pCtx, int 
bbc0: 69 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61  iVal, sqlite3_va
bbd0: 6c 75 65 20 2a 2a 70 70 56 61 6c 29 7b 0a 20 20  lue **ppVal){.  
bbe0: 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78 20 2a  SessionDiffCtx *
bbf0: 70 20 3d 20 28 53 65 73 73 69 6f 6e 44 69 66 66  p = (SessionDiff
bc00: 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 2a 70 70  Ctx*)pCtx;.  *pp
bc10: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
bc20: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 2d 3e 70 53  lumn_value(p->pS
bc30: 74 6d 74 2c 20 69 56 61 6c 2b 70 2d 3e 6e 4f 6c  tmt, iVal+p->nOl
bc40: 64 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  dOff);.  return 
bc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
bc60: 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 44  tic int sessionD
bc70: 69 66 66 4e 65 77 28 76 6f 69 64 20 2a 70 43 74  iffNew(void *pCt
bc80: 78 2c 20 69 6e 74 20 69 56 61 6c 2c 20 73 71 6c  x, int iVal, sql
bc90: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56  ite3_value **ppV
bca0: 61 6c 29 7b 0a 20 20 53 65 73 73 69 6f 6e 44 69  al){.  SessionDi
bcb0: 66 66 43 74 78 20 2a 70 20 3d 20 28 53 65 73 73  ffCtx *p = (Sess
bcc0: 69 6f 6e 44 69 66 66 43 74 78 2a 29 70 43 74 78  ionDiffCtx*)pCtx
bcd0: 3b 0a 20 20 2a 70 70 56 61 6c 20 3d 20 73 71 6c  ;.  *ppVal = sql
bce0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
bcf0: 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 56 61 6c  e(p->pStmt, iVal
bd00: 29 3b 0a 20 20 20 72 65 74 75 72 6e 20 53 51 4c  );.   return SQL
bd10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
bd20: 20 69 6e 74 20 73 65 73 73 69 6f 6e 44 69 66 66   int sessionDiff
bd30: 43 6f 75 6e 74 28 76 6f 69 64 20 2a 70 43 74 78  Count(void *pCtx
bd40: 29 7b 0a 20 20 53 65 73 73 69 6f 6e 44 69 66 66  ){.  SessionDiff
bd50: 43 74 78 20 2a 70 20 3d 20 28 53 65 73 73 69 6f  Ctx *p = (Sessio
bd60: 6e 44 69 66 66 43 74 78 2a 29 70 43 74 78 3b 0a  nDiffCtx*)pCtx;.
bd70: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 6c 64    return p->nOld
bd80: 4f 66 66 20 3f 20 70 2d 3e 6e 4f 6c 64 4f 66 66  Off ? p->nOldOff
bd90: 20 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   : sqlite3_colum
bda0: 6e 5f 63 6f 75 6e 74 28 70 2d 3e 70 53 74 6d 74  n_count(p->pStmt
bdb0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
bdc0: 73 65 73 73 69 6f 6e 44 69 66 66 44 65 70 74 68  sessionDiffDepth
bdd0: 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
bde0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
bdf0: 2a 2a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 64  ** Install the d
be00: 69 66 66 20 68 6f 6f 6b 73 20 6f 6e 20 74 68 65  iff hooks on the
be10: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   session object 
be20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
be30: 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  ly.** argument..
be40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
be50: 65 73 73 69 6f 6e 44 69 66 66 48 6f 6f 6b 73 28  essionDiffHooks(
be60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
be70: 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20 20  on *pSession,.  
be80: 53 65 73 73 69 6f 6e 44 69 66 66 43 74 78 20 2a  SessionDiffCtx *
be90: 70 44 69 66 66 43 74 78 0a 29 7b 0a 20 20 70 53  pDiffCtx.){.  pS
bea0: 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 70 43 74  ession->hook.pCt
beb0: 78 20 3d 20 28 76 6f 69 64 2a 29 70 44 69 66 66  x = (void*)pDiff
bec0: 43 74 78 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d  Ctx;.  pSession-
bed0: 3e 68 6f 6f 6b 2e 78 4f 6c 64 20 3d 20 73 65 73  >hook.xOld = ses
bee0: 73 69 6f 6e 44 69 66 66 4f 6c 64 3b 0a 20 20 70  sionDiffOld;.  p
bef0: 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f 6b 2e 78 4e  Session->hook.xN
bf00: 65 77 20 3d 20 73 65 73 73 69 6f 6e 44 69 66 66  ew = sessionDiff
bf10: 4e 65 77 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d  New;.  pSession-
bf20: 3e 68 6f 6f 6b 2e 78 43 6f 75 6e 74 20 3d 20 73  >hook.xCount = s
bf30: 65 73 73 69 6f 6e 44 69 66 66 43 6f 75 6e 74 3b  essionDiffCount;
bf40: 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e 68 6f 6f  .  pSession->hoo
bf50: 6b 2e 78 44 65 70 74 68 20 3d 20 73 65 73 73 69  k.xDepth = sessi
bf60: 6f 6e 44 69 66 66 44 65 70 74 68 3b 0a 7d 0a 0a  onDiffDepth;.}..
bf70: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 65 73  static char *ses
bf80: 73 69 6f 6e 45 78 70 72 43 6f 6d 70 61 72 65 50  sionExprCompareP
bf90: 4b 28 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 0a 20  K(.  int nCol,. 
bfa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
bfb0: 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
bfc0: 44 62 32 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Db2, .  const ch
bfd0: 61 72 20 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73  ar *zTab,.  cons
bfe0: 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20  t char **azCol, 
bff0: 75 38 20 2a 61 62 50 4b 0a 29 7b 0a 20 20 69 6e  u8 *abPK.){.  in
c000: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
c010: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
c020: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
c030: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
c040: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
c050: 28 20 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20  ( abPK[i] ){.   
c060: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
c070: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c080: 22 25 77 5c 22 2e 5c 22 25 77 5c 22 2e 5c 22 25  "%w\".\"%w\".\"%
c090: 77 5c 22 3d 5c 22 25 77 5c 22 2e 5c 22 25 77 5c  w\"=\"%w\".\"%w\
c0a0: 22 2e 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20 20  ".\"%w\"",.     
c0b0: 20 20 20 20 20 7a 52 65 74 2c 20 7a 53 65 70 2c       zRet, zSep,
c0c0: 20 7a 44 62 31 2c 20 7a 54 61 62 2c 20 61 7a 43   zDb1, zTab, azC
c0d0: 6f 6c 5b 69 5d 2c 20 7a 44 62 32 2c 20 7a 54 61  ol[i], zDb2, zTa
c0e0: 62 2c 20 61 7a 43 6f 6c 5b 69 5d 0a 20 20 20 20  b, azCol[i].    
c0f0: 20 20 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20    );.      zSep 
c100: 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20  = " AND ";.     
c110: 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 62   if( zRet==0 ) b
c120: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c130: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
c140: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
c150: 73 65 73 73 69 6f 6e 45 78 70 72 43 6f 6d 70 61  sessionExprCompa
c160: 72 65 4f 74 68 65 72 28 0a 20 20 69 6e 74 20 6e  reOther(.  int n
c170: 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col,.  const cha
c180: 72 20 2a 7a 44 62 31 2c 20 63 6f 6e 73 74 20 63  r *zDb1, const c
c190: 68 61 72 20 2a 7a 44 62 32 2c 20 0a 20 20 63 6f  har *zDb2, .  co
c1a0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a  nst char *zTab,.
c1b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
c1c0: 7a 43 6f 6c 2c 20 75 38 20 2a 61 62 50 4b 0a 29  zCol, u8 *abPK.)
c1d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
c1e0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
c1f0: 22 22 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  "";.  char *zRet
c200: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 48 61 76   = 0;.  int bHav
c210: 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
c220: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
c230: 0a 20 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d  .    if( abPK[i]
c240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 48 61  ==0 ){.      bHa
c250: 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 52  ve = 1;.      zR
c260: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
c270: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
c280: 22 25 7a 25 73 5c 22 25 77 5c 22 2e 5c 22 25 77  "%z%s\"%w\".\"%w
c290: 5c 22 2e 5c 22 25 77 5c 22 20 49 53 20 4e 4f 54  \".\"%w\" IS NOT
c2a0: 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 2e 5c   \"%w\".\"%w\".\
c2b0: 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%w\"",.        
c2c0: 20 20 7a 52 65 74 2c 20 7a 53 65 70 2c 20 7a 44    zRet, zSep, zD
c2d0: 62 31 2c 20 7a 54 61 62 2c 20 61 7a 43 6f 6c 5b  b1, zTab, azCol[
c2e0: 69 5d 2c 20 7a 44 62 32 2c 20 7a 54 61 62 2c 20  i], zDb2, zTab, 
c2f0: 61 7a 43 6f 6c 5b 69 5d 0a 20 20 20 20 20 20 29  azCol[i].      )
c300: 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
c310: 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 69 66 28   OR ";.      if(
c320: 20 7a 52 65 74 3d 3d 30 20 29 20 62 72 65 61 6b   zRet==0 ) break
c330: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
c340: 66 28 20 62 48 61 76 65 3d 3d 30 20 29 7b 0a 20  f( bHave==0 ){. 
c350: 20 20 20 61 73 73 65 72 74 28 20 7a 52 65 74 3d     assert( zRet=
c360: 3d 30 20 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d  =0 );.    zRet =
c370: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
c380: 28 22 30 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ("0");.  }..  re
c390: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74  turn zRet;.}..st
c3a0: 61 74 69 63 20 63 68 61 72 20 2a 73 65 73 73 69  atic char *sessi
c3b0: 6f 6e 53 65 6c 65 63 74 46 69 6e 64 4e 65 77 28  onSelectFindNew(
c3c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 0a 20 20 63  .  int nCol,.  c
c3d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 31 2c  onst char *zDb1,
c3e0: 20 20 20 20 20 20 2f 2a 20 50 69 63 6b 20 72 6f        /* Pick ro
c3f0: 77 73 20 69 6e 20 74 68 69 73 20 64 62 20 6f 6e  ws in this db on
c400: 6c 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ly */.  const ch
c410: 61 72 20 2a 7a 44 62 32 2c 20 20 20 20 20 20 2f  ar *zDb2,      /
c420: 2a 20 42 75 74 20 6e 6f 74 20 69 6e 20 74 68 69  * But not in thi
c430: 73 20 6f 6e 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  s one */.  const
c440: 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 20 20 20   char *zTbl,    
c450: 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
c460: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
c470: 2a 7a 45 78 70 72 0a 29 7b 0a 20 20 63 68 61 72  *zExpr.){.  char
c480: 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *zRet = sqlite3
c490: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
c4a0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
c4b0: 22 25 77 5c 22 2e 5c 22 25 77 5c 22 20 57 48 45  "%w\".\"%w\" WHE
c4c0: 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20 28 22  RE NOT EXISTS ("
c4d0: 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
c4e0: 20 31 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c   1 FROM \"%w\".\
c4f0: 22 25 77 5c 22 20 57 48 45 52 45 20 25 73 22 0a  "%w\" WHERE %s".
c500: 20 20 20 20 20 20 22 29 22 2c 0a 20 20 20 20 20        ")",.     
c510: 20 7a 44 62 31 2c 20 7a 54 62 6c 2c 20 7a 44 62   zDb1, zTbl, zDb
c520: 32 2c 20 7a 54 62 6c 2c 20 7a 45 78 70 72 0a 20  2, zTbl, zExpr. 
c530: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65   );.  return zRe
c540: 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
c550: 20 73 65 73 73 69 6f 6e 44 69 66 66 46 69 6e 64   sessionDiffFind
c560: 4e 65 77 28 0a 20 20 69 6e 74 20 6f 70 2c 0a 20  New(.  int op,. 
c570: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
c580: 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20 20 53 65   *pSession,.  Se
c590: 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 54 61 62  ssionTable *pTab
c5a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c5b0: 7a 44 62 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  zDb1,.  const ch
c5c0: 61 72 20 2a 7a 44 62 32 2c 0a 20 20 63 68 61 72  ar *zDb2,.  char
c5d0: 20 2a 7a 45 78 70 72 0a 29 7b 0a 20 20 69 6e 74   *zExpr.){.  int
c5e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c5f0: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 20 3d  .  char *zStmt =
c600: 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 46 69   sessionSelectFi
c610: 6e 64 4e 65 77 28 70 54 61 62 2d 3e 6e 43 6f 6c  ndNew(pTab->nCol
c620: 2c 20 7a 44 62 31 2c 20 7a 44 62 32 2c 20 70 54  , zDb1, zDb2, pT
c630: 61 62 2d 3e 7a 4e 61 6d 65 2c 7a 45 78 70 72 29  ab->zName,zExpr)
c640: 3b 0a 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  ;..  if( zStmt==
c650: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
c660: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
c670: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
c680: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
c690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
c6a0: 72 65 70 61 72 65 28 70 53 65 73 73 69 6f 6e 2d  repare(pSession-
c6b0: 3e 64 62 2c 20 7a 53 74 6d 74 2c 20 2d 31 2c 20  >db, zStmt, -1, 
c6c0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
c6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c6e0: 4b 20 29 7b 0a 20 20 20 20 20 20 53 65 73 73 69  K ){.      Sessi
c6f0: 6f 6e 44 69 66 66 43 74 78 20 2a 70 44 69 66 66  onDiffCtx *pDiff
c700: 43 74 78 20 3d 20 28 53 65 73 73 69 6f 6e 44 69  Ctx = (SessionDi
c710: 66 66 43 74 78 2a 29 70 53 65 73 73 69 6f 6e 2d  ffCtx*)pSession-
c720: 3e 68 6f 6f 6b 2e 70 43 74 78 3b 0a 20 20 20 20  >hook.pCtx;.    
c730: 20 20 70 44 69 66 66 43 74 78 2d 3e 70 53 74 6d    pDiffCtx->pStm
c740: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
c750: 20 70 44 69 66 66 43 74 78 2d 3e 6e 4f 6c 64 4f   pDiffCtx->nOldO
c760: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  ff = 0;.      wh
c770: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
c780: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
c790: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
c7a0: 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61 74 65  sessionPreupdate
c7b0: 4f 6e 65 43 68 61 6e 67 65 28 6f 70 2c 20 70 53  OneChange(op, pS
c7c0: 65 73 73 69 6f 6e 2c 20 70 54 61 62 29 3b 0a 20  ession, pTab);. 
c7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
c7e0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
c7f0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
c800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c810: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  e(zStmt);.  }.. 
c820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
c830: 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
c840: 6e 44 69 66 66 46 69 6e 64 4d 6f 64 69 66 69 65  nDiffFindModifie
c850: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  d(.  sqlite3_ses
c860: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20  sion *pSession, 
c870: 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20  .  SessionTable 
c880: 2a 70 54 61 62 2c 20 0a 20 20 63 6f 6e 73 74 20  *pTab, .  const 
c890: 63 68 61 72 20 2a 7a 46 72 6f 6d 2c 20 0a 20 20  char *zFrom, .  
c8a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
c8b0: 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
c8c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 63 68  SQLITE_OK;..  ch
c8d0: 61 72 20 2a 7a 45 78 70 72 32 20 3d 20 73 65 73  ar *zExpr2 = ses
c8e0: 73 69 6f 6e 45 78 70 72 43 6f 6d 70 61 72 65 4f  sionExprCompareO
c8f0: 74 68 65 72 28 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ther(pTab->nCol,
c900: 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  .      pSession-
c910: 3e 7a 44 62 2c 20 7a 46 72 6f 6d 2c 20 70 54 61  >zDb, zFrom, pTa
c920: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
c930: 61 7a 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 62 50  azCol, pTab->abP
c940: 4b 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 45 78  K.  );.  if( zEx
c950: 70 72 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  pr2==0 ){.    rc
c960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c970: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
c980: 61 72 20 2a 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ar *zStmt = sqli
c990: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c9a0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46       "SELECT * F
c9b0: 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c  ROM \"%w\".\"%w\
c9c0: 22 2c 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22  ", \"%w\".\"%w\"
c9d0: 20 57 48 45 52 45 20 25 73 20 41 4e 44 20 28 25   WHERE %s AND (%
c9e0: 7a 29 22 2c 0a 20 20 20 20 20 20 20 20 70 53 65  z)",.        pSe
c9f0: 73 73 69 6f 6e 2d 3e 7a 44 62 2c 20 70 54 61 62  ssion->zDb, pTab
ca00: 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 72 6f 6d 2c 20  ->zName, zFrom, 
ca10: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 45 78  pTab->zName, zEx
ca20: 70 72 2c 20 7a 45 78 70 72 32 0a 20 20 20 20 29  pr, zExpr2.    )
ca30: 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 6d 74 3d  ;.    if( zStmt=
ca40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
ca50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ca60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ca80: 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
ca90: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
caa0: 70 53 65 73 73 69 6f 6e 2d 3e 64 62 2c 20 7a 53  pSession->db, zS
cab0: 74 6d 74 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  tmt, -1, &pStmt,
cac0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   0);..      if( 
cad0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cae0: 0a 20 20 20 20 20 20 20 20 53 65 73 73 69 6f 6e  .        Session
caf0: 44 69 66 66 43 74 78 20 2a 70 44 69 66 66 43 74  DiffCtx *pDiffCt
cb00: 78 20 3d 20 28 53 65 73 73 69 6f 6e 44 69 66 66  x = (SessionDiff
cb10: 43 74 78 2a 29 70 53 65 73 73 69 6f 6e 2d 3e 68  Ctx*)pSession->h
cb20: 6f 6f 6b 2e 70 43 74 78 3b 0a 20 20 20 20 20 20  ook.pCtx;.      
cb30: 20 20 70 44 69 66 66 43 74 78 2d 3e 70 53 74 6d    pDiffCtx->pStm
cb40: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
cb50: 20 20 20 70 44 69 66 66 43 74 78 2d 3e 6e 4f 6c     pDiffCtx->nOl
cb60: 64 4f 66 66 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  dOff = pTab->nCo
cb70: 6c 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  l;.        while
cb80: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
cb90: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
cba0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
cbb0: 65 73 73 69 6f 6e 50 72 65 75 70 64 61 74 65 4f  essionPreupdateO
cbc0: 6e 65 43 68 61 6e 67 65 28 53 51 4c 49 54 45 5f  neChange(SQLITE_
cbd0: 55 50 44 41 54 45 2c 20 70 53 65 73 73 69 6f 6e  UPDATE, pSession
cbe0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  , pTab);.       
cbf0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
cc00: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
cc10: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
cc20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
cc30: 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20  ree(zStmt);.    
cc40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
cc50: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
cc60: 65 33 73 65 73 73 69 6f 6e 5f 64 69 66 66 28 0a  e3session_diff(.
cc70: 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f    sqlite3_sessio
cc80: 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a 20 20 63  n *pSession,.  c
cc90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d  onst char *zFrom
cca0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
ccb0: 7a 54 62 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  zTbl,.  char **p
ccc0: 7a 45 72 72 4d 73 67 0a 29 7b 0a 20 20 63 6f 6e  zErrMsg.){.  con
ccd0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
cce0: 53 65 73 73 69 6f 6e 2d 3e 7a 44 62 3b 0a 20 20  Session->zDb;.  
ccf0: 69 6e 74 20 72 63 20 3d 20 70 53 65 73 73 69 6f  int rc = pSessio
cd00: 6e 2d 3e 72 63 3b 0a 20 20 53 65 73 73 69 6f 6e  n->rc;.  Session
cd10: 44 69 66 66 43 74 78 20 64 3b 0a 0a 20 20 6d 65  DiffCtx d;..  me
cd20: 6d 73 65 74 28 26 64 2c 20 30 2c 20 73 69 7a 65  mset(&d, 0, size
cd30: 6f 66 28 64 29 29 3b 0a 20 20 73 65 73 73 69 6f  of(d));.  sessio
cd40: 6e 44 69 66 66 48 6f 6f 6b 73 28 70 53 65 73 73  nDiffHooks(pSess
cd50: 69 6f 6e 2c 20 26 64 29 3b 0a 0a 20 20 73 71 6c  ion, &d);..  sql
cd60: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
cd70: 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  (sqlite3_db_mute
cd80: 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29  x(pSession->db))
cd90: 3b 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67  ;.  if( pzErrMsg
cda0: 20 29 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30   ) *pzErrMsg = 0
cdb0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
cdc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61  TE_OK ){.    cha
cdd0: 72 20 2a 7a 45 78 70 72 20 3d 20 30 3b 0a 20 20  r *zExpr = 0;.  
cde0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cdf0: 70 53 65 73 73 69 6f 6e 2d 3e 64 62 3b 0a 20 20  pSession->db;.  
ce00: 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
ce10: 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  pTo;            
ce20: 2f 2a 20 54 61 62 6c 65 20 7a 54 62 6c 20 2a 2f  /* Table zTbl */
ce30: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
ce40: 61 6e 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  and if necessary
ce50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
ce60: 74 61 72 67 65 74 20 74 61 62 6c 65 20 6f 62 6a  target table obj
ce70: 65 63 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ect */.    rc = 
ce80: 73 65 73 73 69 6f 6e 46 69 6e 64 54 61 62 6c 65  sessionFindTable
ce90: 28 70 53 65 73 73 69 6f 6e 2c 20 7a 54 62 6c 2c  (pSession, zTbl,
cea0: 20 26 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20   &pTo);.    if( 
ceb0: 70 54 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64 69  pTo==0 ) goto di
cec0: 66 66 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28 20  ff_out;.    if( 
ced0: 73 65 73 73 69 6f 6e 49 6e 69 74 54 61 62 6c 65  sessionInitTable
cee0: 28 70 53 65 73 73 69 6f 6e 2c 20 70 54 6f 29 20  (pSession, pTo) 
cef0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 53  ){.      rc = pS
cf00: 65 73 73 69 6f 6e 2d 3e 72 63 3b 0a 20 20 20 20  ession->rc;.    
cf10: 20 20 67 6f 74 6f 20 64 69 66 66 5f 6f 75 74 3b    goto diff_out;
cf20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
cf30: 68 65 63 6b 20 74 68 65 20 74 61 62 6c 65 20 73  heck the table s
cf40: 63 68 65 6d 61 73 20 6d 61 74 63 68 20 2a 2f 0a  chemas match */.
cf50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cf60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
cf70: 6e 74 20 62 48 61 73 50 6b 20 3d 20 30 3b 0a 20  nt bHasPk = 0;. 
cf80: 20 20 20 20 20 69 6e 74 20 62 4d 69 73 6d 61 74       int bMismat
cf90: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ch = 0;.      in
cfa0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
cfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
cfc0: 75 6d 6e 73 20 69 6e 20 7a 46 72 6f 6d 2e 7a 54  umns in zFrom.zT
cfd0: 62 6c 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  bl */.      u8 *
cfe0: 61 62 50 4b 3b 0a 20 20 20 20 20 20 63 6f 6e 73  abPK;.      cons
cff0: 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d  t char **azCol =
d000: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
d010: 65 73 73 69 6f 6e 54 61 62 6c 65 49 6e 66 6f 28  essionTableInfo(
d020: 64 62 2c 20 7a 46 72 6f 6d 2c 20 7a 54 62 6c 2c  db, zFrom, zTbl,
d030: 20 26 6e 43 6f 6c 2c 20 30 2c 20 26 61 7a 43 6f   &nCol, 0, &azCo
d040: 6c 2c 20 26 61 62 50 4b 29 3b 0a 20 20 20 20 20  l, &abPK);.     
d050: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d060: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
d070: 28 20 70 54 6f 2d 3e 6e 43 6f 6c 21 3d 6e 43 6f  ( pTo->nCol!=nCo
d080: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  l ){.          b
d090: 4d 69 73 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20  Mismatch = 1;.  
d0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0b0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
d0c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d0d0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
d0e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
d0f0: 54 6f 2d 3e 61 62 50 4b 5b 69 5d 21 3d 61 62 50  To->abPK[i]!=abP
d100: 4b 5b 69 5d 20 29 20 62 4d 69 73 6d 61 74 63 68  K[i] ) bMismatch
d110: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d120: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
d130: 72 69 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20  ricmp(azCol[i], 
d140: 70 54 6f 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 20 29  pTo->azCol[i]) )
d150: 20 62 4d 69 73 6d 61 74 63 68 20 3d 20 31 3b 0a   bMismatch = 1;.
d160: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d170: 61 62 50 4b 5b 69 5d 20 29 20 62 48 61 73 50 6b  abPK[i] ) bHasPk
d180: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d190: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d1a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d1b0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 61 7a  3_free((char*)az
d1c0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
d1d0: 62 4d 69 73 6d 61 74 63 68 20 29 7b 0a 20 20 20  bMismatch ){.   
d1e0: 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
d1f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
d200: 28 22 74 61 62 6c 65 20 73 63 68 65 6d 61 73 20  ("table schemas 
d210: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 22 29 3b 0a  do not match");.
d220: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d230: 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20  ITE_SCHEMA;.    
d240: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 48    }.      if( bH
d250: 61 73 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  asPk==0 ){.     
d260: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 61 62     /* Ignore tab
d270: 6c 65 73 20 77 69 74 68 20 6e 6f 20 70 72 69 6d  les with no prim
d280: 61 72 79 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20  ary keys */.    
d290: 20 20 20 20 67 6f 74 6f 20 64 69 66 66 5f 6f 75      goto diff_ou
d2a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
d2b0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
d2c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d2d0: 20 7a 45 78 70 72 20 3d 20 73 65 73 73 69 6f 6e   zExpr = session
d2e0: 45 78 70 72 43 6f 6d 70 61 72 65 50 4b 28 70 54  ExprComparePK(pT
d2f0: 6f 2d 3e 6e 43 6f 6c 2c 20 0a 20 20 20 20 20 20  o->nCol, .      
d300: 20 20 20 20 7a 44 62 2c 20 7a 46 72 6f 6d 2c 20      zDb, zFrom, 
d310: 70 54 6f 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 2d  pTo->zName, pTo-
d320: 3e 61 7a 43 6f 6c 2c 20 70 54 6f 2d 3e 61 62 50  >azCol, pTo->abP
d330: 4b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  K.      );.    }
d340: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6e 65  ..    /* Find ne
d350: 77 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 69 66  w rows */.    if
d360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d370: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
d380: 73 73 69 6f 6e 44 69 66 66 46 69 6e 64 4e 65 77  ssionDiffFindNew
d390: 28 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20  (SQLITE_INSERT, 
d3a0: 70 53 65 73 73 69 6f 6e 2c 20 70 54 6f 2c 20 7a  pSession, pTo, z
d3b0: 44 62 2c 20 7a 46 72 6f 6d 2c 20 7a 45 78 70 72  Db, zFrom, zExpr
d3c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d3d0: 20 46 69 6e 64 20 6f 6c 64 20 72 6f 77 73 20 2a   Find old rows *
d3e0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
d3f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d400: 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 44 69 66   rc = sessionDif
d410: 66 46 69 6e 64 4e 65 77 28 53 51 4c 49 54 45 5f  fFindNew(SQLITE_
d420: 44 45 4c 45 54 45 2c 20 70 53 65 73 73 69 6f 6e  DELETE, pSession
d430: 2c 20 70 54 6f 2c 20 7a 46 72 6f 6d 2c 20 7a 44  , pTo, zFrom, zD
d440: 62 2c 20 7a 45 78 70 72 29 3b 0a 20 20 20 20 7d  b, zExpr);.    }
d450: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6d 6f  ..    /* Find mo
d460: 64 69 66 69 65 64 20 72 6f 77 73 20 2a 2f 0a 20  dified rows */. 
d470: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d480: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
d490: 20 3d 20 73 65 73 73 69 6f 6e 44 69 66 66 46 69   = sessionDiffFi
d4a0: 6e 64 4d 6f 64 69 66 69 65 64 28 70 53 65 73 73  ndModified(pSess
d4b0: 69 6f 6e 2c 20 70 54 6f 2c 20 7a 46 72 6f 6d 2c  ion, pTo, zFrom,
d4c0: 20 7a 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a   zExpr);.    }..
d4d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d4e0: 28 7a 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 64  (zExpr);.  }.. d
d4f0: 69 66 66 5f 6f 75 74 3a 0a 20 20 73 65 73 73 69  iff_out:.  sessi
d500: 6f 6e 50 72 65 75 70 64 61 74 65 48 6f 6f 6b 73  onPreupdateHooks
d510: 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 73 71  (pSession);.  sq
d520: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d530: 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74  e(sqlite3_db_mut
d540: 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29  ex(pSession->db)
d550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d560: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d570: 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  a session object
d580: 2e 20 54 68 69 73 20 73 65 73 73 69 6f 6e 20 6f  . This session o
d590: 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 63 6f 72  bject will recor
d5a0: 64 20 63 68 61 6e 67 65 73 20 74 6f 0a 2a 2a 20  d changes to.** 
d5b0: 64 61 74 61 62 61 73 65 20 7a 44 62 20 61 74 74  database zDb att
d5c0: 61 63 68 65 64 20 74 6f 20 63 6f 6e 6e 65 63 74  ached to connect
d5d0: 69 6f 6e 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  ion db..*/.int s
d5e0: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72  qlite3session_cr
d5f0: 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  eate(.  sqlite3 
d600: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
d610: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
d620: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 62 20 28 65  /* Name of db (e
d660: 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20  .g. "main") */. 
d670: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
d680: 20 2a 2a 70 70 53 65 73 73 69 6f 6e 20 20 20 20   **ppSession    
d690: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 65 73   /* OUT: New ses
d6a0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  sion object */.)
d6b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  {.  sqlite3_sess
d6c0: 69 6f 6e 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  ion *pNew;      
d6d0: 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
d6e0: 6f 63 61 74 65 64 20 73 65 73 73 69 6f 6e 20 6f  ocated session o
d6f0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
d700: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 4f 6c 64  e3_session *pOld
d710: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
d720: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6c 72  ssion object alr
d730: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
d740: 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62   db */.  int nDb
d750: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d760: 33 30 28 7a 44 62 29 3b 20 2f 2a 20 4c 65 6e 67  30(zDb); /* Leng
d770: 74 68 20 6f 66 20 7a 44 62 20 69 6e 20 62 79 74  th of zDb in byt
d780: 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 5a 65 72 6f  es */..  /* Zero
d790: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 6c 75   the output valu
d7a0: 65 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  e in case an err
d7b0: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
d7c0: 2a 70 70 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  *ppSession = 0;.
d7d0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
d7e0: 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
d7f0: 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  new session obje
d800: 63 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ct. */.  pNew = 
d810: 28 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e  (sqlite3_session
d820: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
d830: 63 36 34 28 73 69 7a 65 6f 66 28 73 71 6c 69 74  c64(sizeof(sqlit
d840: 65 33 5f 73 65 73 73 69 6f 6e 29 20 2b 20 6e 44  e3_session) + nD
d850: 62 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 70  b + 1);.  if( !p
d860: 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c  New ) return SQL
d870: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
d880: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
d890: 65 6f 66 28 73 71 6c 69 74 65 33 5f 73 65 73 73  eof(sqlite3_sess
d8a0: 69 6f 6e 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 64  ion));.  pNew->d
d8b0: 62 20 3d 20 64 62 3b 0a 20 20 70 4e 65 77 2d 3e  b = db;.  pNew->
d8c0: 7a 44 62 20 3d 20 28 63 68 61 72 20 2a 29 26 70  zDb = (char *)&p
d8d0: 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e  New[1];.  pNew->
d8e0: 62 45 6e 61 62 6c 65 20 3d 20 31 3b 0a 20 20 6d  bEnable = 1;.  m
d8f0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 44 62 2c  emcpy(pNew->zDb,
d900: 20 7a 44 62 2c 20 6e 44 62 2b 31 29 3b 0a 20 20   zDb, nDb+1);.  
d910: 73 65 73 73 69 6f 6e 50 72 65 75 70 64 61 74 65  sessionPreupdate
d920: 48 6f 6f 6b 73 28 70 4e 65 77 29 3b 0a 0a 20 20  Hooks(pNew);..  
d930: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73  /* Add the new s
d940: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f  ession object to
d950: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
d960: 20 6f 66 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65   of session obje
d970: 63 74 73 20 0a 20 20 2a 2a 20 61 74 74 61 63 68  cts .  ** attach
d980: 65 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 68  ed to database h
d990: 61 6e 64 6c 65 20 24 64 62 2e 20 44 6f 20 74 68  andle $db. Do th
d9a0: 69 73 20 75 6e 64 65 72 20 74 68 65 20 63 6f 76  is under the cov
d9b0: 65 72 20 6f 66 20 74 68 65 20 64 62 0a 20 20 2a  er of the db.  *
d9c0: 2a 20 68 61 6e 64 6c 65 20 6d 75 74 65 78 2e 20  * handle mutex. 
d9d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
d9e0: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
d9f0: 33 5f 64 62 5f 6d 75 74 65 78 28 64 62 29 29 3b  3_db_mutex(db));
da00: 0a 20 20 70 4f 6c 64 20 3d 20 28 73 71 6c 69 74  .  pOld = (sqlit
da10: 65 33 5f 73 65 73 73 69 6f 6e 2a 29 73 71 6c 69  e3_session*)sqli
da20: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
da30: 6f 6b 28 64 62 2c 20 78 50 72 65 55 70 64 61 74  ok(db, xPreUpdat
da40: 65 2c 20 28 76 6f 69 64 2a 29 70 4e 65 77 29 3b  e, (void*)pNew);
da50: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
da60: 20 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33   pOld;.  sqlite3
da70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
da80: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 64 62  ite3_db_mutex(db
da90: 29 29 3b 0a 0a 20 20 2a 70 70 53 65 73 73 69 6f  ));..  *ppSessio
daa0: 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  n = pNew;.  retu
dab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dac0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
dad0: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 20 6f 62  list of table ob
dae0: 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
daf0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
db00: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
db10: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 68 61 6e 67  .** of the chang
db20: 65 64 2d 72 6f 77 73 20 68 61 73 68 20 74 61 62  ed-rows hash tab
db30: 6c 65 73 20 61 72 65 20 61 6c 73 6f 20 64 65 6c  les are also del
db40: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
db50: 76 6f 69 64 20 73 65 73 73 69 6f 6e 44 65 6c 65  void sessionDele
db60: 74 65 54 61 62 6c 65 28 53 65 73 73 69 6f 6e 54  teTable(SessionT
db70: 61 62 6c 65 20 2a 70 4c 69 73 74 29 7b 0a 20 20  able *pList){.  
db80: 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70 4e  SessionTable *pN
db90: 65 78 74 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61  ext;.  SessionTa
dba0: 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 66 6f  ble *pTab;..  fo
dbb0: 72 28 70 54 61 62 3d 70 4c 69 73 74 3b 20 70 54  r(pTab=pList; pT
dbc0: 61 62 3b 20 70 54 61 62 3d 70 4e 65 78 74 29 7b  ab; pTab=pNext){
dbd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
dbe0: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 4e  pNext = pTab->pN
dbf0: 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ext;.    for(i=0
dc00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 68 61 6e 67  ; i<pTab->nChang
dc10: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53  e; i++){.      S
dc20: 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 3b  essionChange *p;
dc30: 0a 20 20 20 20 20 20 53 65 73 73 69 6f 6e 43 68  .      SessionCh
dc40: 61 6e 67 65 20 2a 70 4e 65 78 74 43 68 61 6e 67  ange *pNextChang
dc50: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  e;.      for(p=p
dc60: 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 5b 69 5d  Tab->apChange[i]
dc70: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 43 68 61 6e  ; p; p=pNextChan
dc80: 67 65 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ge){.        pNe
dc90: 78 74 43 68 61 6e 67 65 20 3d 20 70 2d 3e 70 4e  xtChange = p->pN
dca0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
dcb0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
dcc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dcd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68  sqlite3_free((ch
dce0: 61 72 2a 29 70 54 61 62 2d 3e 61 7a 43 6f 6c 29  ar*)pTab->azCol)
dcf0: 3b 20 20 2f 2a 20 63 61 73 74 20 77 6f 72 6b 73  ;  /* cast works
dd00: 20 61 72 6f 75 6e 64 20 56 43 2b 2b 20 62 75 67   around VC++ bug
dd10: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
dd20: 66 72 65 65 28 70 54 61 62 2d 3e 61 70 43 68 61  free(pTab->apCha
dd30: 6e 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nge);.    sqlite
dd40: 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20  3_free(pTab);.  
dd50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
dd60: 65 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  e a session obje
dd70: 63 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  ct previously al
dd80: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
dd90: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
dda0: 61 74 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ate()..*/.void s
ddb0: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65  qlite3session_de
ddc0: 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 73 65 73  lete(sqlite3_ses
ddd0: 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b  sion *pSession){
dde0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ddf0: 20 70 53 65 73 73 69 6f 6e 2d 3e 64 62 3b 0a 20   pSession->db;. 
de00: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
de10: 20 2a 70 48 65 61 64 3b 0a 20 20 73 71 6c 69 74   *pHead;.  sqlit
de20: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 2a 70 70 3b  e3_session **pp;
de30: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
de40: 65 20 73 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  e session from t
de50: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
de60: 66 20 73 65 73 73 69 6f 6e 73 20 61 74 74 61 63  f sessions attac
de70: 68 65 64 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  hed to the.  ** 
de80: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
de90: 20 48 6f 6c 64 20 74 68 65 20 64 62 20 6d 75 74   Hold the db mut
dea0: 65 78 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  ex while doing s
deb0: 6f 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  o.  */.  sqlite3
dec0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
ded0: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 64 62  ite3_db_mutex(db
dee0: 29 29 3b 0a 20 20 70 48 65 61 64 20 3d 20 28 73  ));.  pHead = (s
def0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 2a 29  qlite3_session*)
df00: 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
df10: 65 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  e_hook(db, 0, 0)
df20: 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 48 65 61  ;.  for(pp=&pHea
df30: 64 3b 20 41 4c 57 41 59 53 28 28 2a 70 70 29 21  d; ALWAYS((*pp)!
df40: 3d 30 29 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  =0); pp=&((*pp)-
df50: 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20 20 69 66  >pNext)){.    if
df60: 28 20 28 2a 70 70 29 3d 3d 70 53 65 73 73 69 6f  ( (*pp)==pSessio
df70: 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  n ){.      *pp =
df80: 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20   (*pp)->pNext;. 
df90: 20 20 20 20 20 69 66 28 20 70 48 65 61 64 20 29       if( pHead )
dfa0: 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
dfb0: 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 78 50 72 65  te_hook(db, xPre
dfc0: 55 70 64 61 74 65 2c 20 28 76 6f 69 64 2a 29 70  Update, (void*)p
dfd0: 48 65 61 64 29 3b 0a 20 20 20 20 20 20 62 72 65  Head);.      bre
dfe0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
dff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e000: 61 76 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ave(sqlite3_db_m
e010: 75 74 65 78 28 64 62 29 29 3b 0a 20 20 73 71 6c  utex(db));.  sql
e020: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 53  ite3ValueFree(pS
e030: 65 73 73 69 6f 6e 2d 3e 70 5a 65 72 6f 42 6c 6f  ession->pZeroBlo
e040: 62 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  b);..  /* Delete
e050: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 74 61   all attached ta
e060: 62 6c 65 20 6f 62 6a 65 63 74 73 2e 20 41 6e 64  ble objects. And
e070: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
e080: 20 74 68 65 69 72 20 0a 20 20 2a 2a 20 61 73 73   their .  ** ass
e090: 6f 63 69 61 74 65 64 20 68 61 73 68 2d 74 61 62  ociated hash-tab
e0a0: 6c 65 73 2e 20 2a 2f 0a 20 20 73 65 73 73 69 6f  les. */.  sessio
e0b0: 6e 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65  nDeleteTable(pSe
e0c0: 73 73 69 6f 6e 2d 3e 70 54 61 62 6c 65 29 3b 0a  ssion->pTable);.
e0d0: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 73  .  /* Free the s
e0e0: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 74  ession object it
e0f0: 73 65 6c 66 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  self. */.  sqlit
e100: 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
e110: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
e120: 61 20 74 61 62 6c 65 20 66 69 6c 74 65 72 20 6f  a table filter o
e130: 6e 20 61 20 53 65 73 73 69 6f 6e 20 4f 62 6a 65  n a Session Obje
e140: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
e150: 74 65 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65  te3session_table
e160: 5f 66 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  _filter(.  sqlit
e170: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73  e3_session *pSes
e180: 73 69 6f 6e 2c 20 0a 20 20 69 6e 74 28 2a 78 46  sion, .  int(*xF
e190: 69 6c 74 65 72 29 28 76 6f 69 64 2a 2c 20 63 6f  ilter)(void*, co
e1a0: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 76 6f  nst char*),.  vo
e1b0: 69 64 20 2a 70 43 74 78 20 20 20 20 20 20 20 20  id *pCtx        
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1d0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
e1e0: 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
e1f0: 72 20 2a 2f 0a 29 7b 0a 20 20 70 53 65 73 73 69  r */.){.  pSessi
e200: 6f 6e 2d 3e 62 41 75 74 6f 41 74 74 61 63 68 20  on->bAutoAttach 
e210: 3d 20 31 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d  = 1;.  pSession-
e220: 3e 70 46 69 6c 74 65 72 43 74 78 20 3d 20 70 43  >pFilterCtx = pC
e230: 74 78 3b 0a 20 20 70 53 65 73 73 69 6f 6e 2d 3e  tx;.  pSession->
e240: 78 54 61 62 6c 65 46 69 6c 74 65 72 20 3d 20 78  xTableFilter = x
e250: 46 69 6c 74 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Filter;.}../*.**
e260: 20 41 74 74 61 63 68 20 61 20 74 61 62 6c 65 20   Attach a table 
e270: 74 6f 20 61 20 73 65 73 73 69 6f 6e 2e 20 41 6c  to a session. Al
e280: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 68 61  l subsequent cha
e290: 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
e2a0: 20 74 61 62 6c 65 0a 2a 2a 20 77 68 69 6c 65 20   table.** while 
e2b0: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
e2c0: 63 74 20 69 73 20 65 6e 61 62 6c 65 64 20 77 69  ct is enabled wi
e2d0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 2e 0a  ll be recorded..
e2e0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 61 62 6c 65  **.** Only table
e2f0: 73 20 74 68 61 74 20 68 61 76 65 20 61 20 50 52  s that have a PR
e300: 49 4d 41 52 59 20 4b 45 59 20 64 65 66 69 6e 65  IMARY KEY define
e310: 64 20 6d 61 79 20 62 65 20 61 74 74 61 63 68 65  d may be attache
e320: 64 2e 20 49 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f  d. It does.** no
e330: 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
e340: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
e350: 6e 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41  n "INTEGER PRIMA
e360: 52 59 20 4b 45 59 22 20 28 72 6f 77 69 64 20 61  RY KEY" (rowid a
e370: 6c 69 61 73 29 0a 2a 2a 20 6f 72 20 6e 6f 74 2e  lias).** or not.
e380: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73  .*/.int sqlite3s
e390: 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 0a 20  ession_attach(. 
e3a0: 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e   sqlite3_session
e3b0: 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20 20 20   *pSession,     
e3c0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65   /* Session obje
e3d0: 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
e3e0: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
e3f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e400: 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   name */.){.  in
e410: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e420: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e430: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
e440: 64 62 5f 6d 75 74 65 78 28 70 53 65 73 73 69 6f  db_mutex(pSessio
e450: 6e 2d 3e 64 62 29 29 3b 0a 0a 20 20 69 66 28 20  n->db));..  if( 
e460: 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 70 53  !zName ){.    pS
e470: 65 73 73 69 6f 6e 2d 3e 62 41 75 74 6f 41 74 74  ession->bAutoAtt
e480: 61 63 68 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ach = 1;.  }else
e490: 7b 0a 20 20 20 20 53 65 73 73 69 6f 6e 54 61 62  {.    SessionTab
e4a0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
e4b0: 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
e4c0: 20 6f 62 6a 65 63 74 20 28 69 66 20 72 65 71 75   object (if requ
e4d0: 69 72 65 64 29 20 2a 2f 0a 20 20 20 20 69 6e 74  ired) */.    int
e4e0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
e4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e500: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
e510: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 2a 2f   string zName */
e520: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20 73  ..    /* First s
e530: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
e540: 73 74 69 6e 67 20 65 6e 74 72 79 2e 20 49 66 20  sting entry. If 
e550: 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  one is found, th
e560: 69 73 20 63 61 6c 6c 20 69 73 0a 20 20 20 20 2a  is call is.    *
e570: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 52 65 74 75 72  * a no-op. Retur
e580: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
e590: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
e5a0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
e5b0: 20 20 20 20 66 6f 72 28 70 54 61 62 3d 70 53 65      for(pTab=pSe
e5c0: 73 73 69 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20 70  ssion->pTable; p
e5d0: 54 61 62 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e  Tab; pTab=pTab->
e5e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
e5f0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
e600: 6e 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  nicmp(pTab->zNam
e610: 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
e620: 31 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1) ) break;.    
e630: 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  }..    if( !pTab
e640: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
e650: 6f 63 61 74 65 20 6e 65 77 20 53 65 73 73 69 6f  ocate new Sessio
e660: 6e 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 20 2a  nTable object. *
e670: 2f 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  /.      pTab = (
e680: 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 29 73  SessionTable *)s
e690: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
e6a0: 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 54 61  sizeof(SessionTa
e6b0: 62 6c 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ble) + nName + 1
e6c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 54  );.      if( !pT
e6d0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ab ){.        rc
e6e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e6f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e700: 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
e710: 65 20 74 68 65 20 6e 65 77 20 53 65 73 73 69 6f  e the new Sessio
e720: 6e 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 6e  nTable object an
e730: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
e740: 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  he list..       
e750: 20 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65   ** The new obje
e760: 63 74 20 6d 75 73 74 20 62 65 20 6c 69 6e 6b 65  ct must be linke
e770: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
e780: 66 20 74 68 65 20 6c 69 73 74 2c 20 6e 6f 74 20  f the list, not 
e790: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70  .        ** simp
e7a0: 6c 79 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ly added to the 
e7b0: 73 74 61 72 74 20 6f 66 20 69 74 20 69 6e 20 6f  start of it in o
e7c0: 72 64 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  rder to ensure t
e7d0: 68 61 74 20 74 61 62 6c 65 73 0a 20 20 20 20 20  hat tables.     
e7e0: 20 20 20 2a 2a 20 61 70 70 65 61 72 20 69 6e 20     ** appear in 
e7f0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
e800: 72 20 77 68 65 6e 20 61 20 63 68 61 6e 67 65 73  r when a changes
e810: 65 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 69  et or patchset i
e820: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 76 65  s.        ** eve
e830: 6e 74 75 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ntually generate
e840: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65  d. */.        Se
e850: 73 73 69 6f 6e 54 61 62 6c 65 20 2a 2a 70 70 54  ssionTable **ppT
e860: 61 62 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ab;.        mems
e870: 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65  et(pTab, 0, size
e880: 6f 66 28 53 65 73 73 69 6f 6e 54 61 62 6c 65 29  of(SessionTable)
e890: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
e8a0: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
e8b0: 29 26 70 54 61 62 5b 31 5d 3b 0a 20 20 20 20 20  )&pTab[1];.     
e8c0: 20 20 20 6d 65 6d 63 70 79 28 70 54 61 62 2d 3e     memcpy(pTab->
e8d0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
e8e0: 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ame+1);.        
e8f0: 66 6f 72 28 70 70 54 61 62 3d 26 70 53 65 73 73  for(ppTab=&pSess
e900: 69 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20 2a 70 70  ion->pTable; *pp
e910: 54 61 62 3b 20 70 70 54 61 62 3d 26 28 2a 70 70  Tab; ppTab=&(*pp
e920: 54 61 62 29 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  Tab)->pNext);.  
e930: 20 20 20 20 20 20 2a 70 70 54 61 62 20 3d 20 70        *ppTab = p
e940: 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Tab;.      }.   
e950: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
e960: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
e970: 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 70  lite3_db_mutex(p
e980: 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29 3b 0a 20  Session->db));. 
e990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e9a0: 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
e9b0: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 69   there is room i
e9c0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 74 6f 20  n the buffer to 
e9d0: 61 70 70 65 6e 64 20 6e 42 79 74 65 20 62 79 74  append nByte byt
e9e0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 49  es of data..** I
e9f0: 66 20 6e 6f 74 2c 20 75 73 65 20 73 71 6c 69 74  f not, use sqlit
ea00: 65 33 5f 72 65 61 6c 6c 6f 63 28 29 20 74 6f 20  e3_realloc() to 
ea10: 67 72 6f 77 20 74 68 65 20 62 75 66 66 65 72 20  grow the buffer 
ea20: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
ea30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
ea40: 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 7a 65  ssful, return ze
ea50: 72 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ro. Otherwise, i
ea60: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
ea70: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
ea80: 64 2c 0a 2a 2a 20 73 65 74 20 2a 70 52 63 20 74  d,.** set *pRc t
ea90: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
eaa0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
eab0: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
eac0: 74 20 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47  t sessionBufferG
ead0: 72 6f 77 28 53 65 73 73 69 6f 6e 42 75 66 66 65  row(SessionBuffe
eae0: 72 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c  r *p, int nByte,
eaf0: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66   int *pRc){.  if
eb00: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
eb10: 4b 20 26 26 20 70 2d 3e 6e 41 6c 6c 6f 63 2d 70  K && p->nAlloc-p
eb20: 2d 3e 6e 42 75 66 3c 6e 42 79 74 65 20 29 7b 0a  ->nBuf<nByte ){.
eb30: 20 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 20 20      u8 *aNew;.  
eb40: 20 20 69 36 34 20 6e 4e 65 77 20 3d 20 70 2d 3e    i64 nNew = p->
eb50: 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c  nAlloc ? p->nAll
eb60: 6f 63 20 3a 20 31 32 38 3b 0a 20 20 20 20 64 6f  oc : 128;.    do
eb70: 20 7b 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20   {.      nNew = 
eb80: 6e 4e 65 77 2a 32 3b 0a 20 20 20 20 7d 77 68 69  nNew*2;.    }whi
eb90: 6c 65 28 20 28 6e 4e 65 77 2d 70 2d 3e 6e 42 75  le( (nNew-p->nBu
eba0: 66 29 3c 6e 42 79 74 65 20 29 3b 0a 0a 20 20 20  f)<nByte );..   
ebb0: 20 61 4e 65 77 20 3d 20 28 75 38 20 2a 29 73 71   aNew = (u8 *)sq
ebc0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
ebd0: 70 2d 3e 61 42 75 66 2c 20 6e 4e 65 77 29 3b 0a  p->aBuf, nNew);.
ebe0: 20 20 20 20 69 66 28 20 30 3d 3d 61 4e 65 77 20      if( 0==aNew 
ebf0: 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
ec00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ec10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
ec20: 2d 3e 61 42 75 66 20 3d 20 61 4e 65 77 3b 0a 20  ->aBuf = aNew;. 
ec30: 20 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d       p->nAlloc =
ec40: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   nNew;.    }.  }
ec50: 0a 20 20 72 65 74 75 72 6e 20 28 2a 70 52 63 21  .  return (*pRc!
ec60: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a  =SQLITE_OK);.}..
ec70: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65  /*.** Append the
ec80: 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
ec90: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
eca0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 75 66 66  ment to the buff
ecb0: 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  er passed.** as 
ecc0: 74 68 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a  the first..**.**
ecd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ece0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52  s a no-op if *pR
ecf0: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  c is non-zero wh
ed00: 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e  en it is called.
ed10: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
ed20: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ed30: 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  s, *pRc is set t
ed40: 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
ed50: 72 20 63 6f 64 65 0a 2a 2a 20 62 65 66 6f 72 65  r code.** before
ed60: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
ed70: 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
ed80: 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 53 65  onAppendValue(Se
ed90: 73 73 69 6f 6e 42 75 66 66 65 72 20 2a 70 2c 20  ssionBuffer *p, 
eda0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
edb0: 56 61 6c 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  Val, int *pRc){.
edc0: 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b    int rc = *pRc;
edd0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ede0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
edf0: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
ee00: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 65  = 0;.    rc = se
ee10: 73 73 69 6f 6e 53 65 72 69 61 6c 69 7a 65 56 61  ssionSerializeVa
ee20: 6c 75 65 28 30 2c 20 70 56 61 6c 2c 20 26 6e 42  lue(0, pVal, &nB
ee30: 79 74 65 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  yte);.    sessio
ee40: 6e 42 75 66 66 65 72 47 72 6f 77 28 70 2c 20 6e  nBufferGrow(p, n
ee50: 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Byte, &rc);.    
ee60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ee70: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ee80: 73 65 73 73 69 6f 6e 53 65 72 69 61 6c 69 7a 65  sessionSerialize
ee90: 56 61 6c 75 65 28 26 70 2d 3e 61 42 75 66 5b 70  Value(&p->aBuf[p
eea0: 2d 3e 6e 42 75 66 5d 2c 20 70 56 61 6c 2c 20 30  ->nBuf], pVal, 0
eeb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 42 75 66  );.      p->nBuf
eec0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
eed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
eee0: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
eef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ef00: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
ef10: 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20 6f 74  op if *pRc is ot
ef20: 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
ef30: 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20 0a 2a  OK when it is .*
ef40: 2a 20 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72 77  * called. Otherw
ef50: 69 73 65 2c 20 61 70 70 65 6e 64 20 61 20 73 69  ise, append a si
ef60: 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
ef70: 20 62 75 66 66 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   buffer. .**.** 
ef80: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
ef90: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
efa0: 65 64 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20  ed, set *pRc to 
efb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
efc0: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
efd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
efe0: 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 79   sessionAppendBy
eff0: 74 65 28 53 65 73 73 69 6f 6e 42 75 66 66 65 72  te(SessionBuffer
f000: 20 2a 70 2c 20 75 38 20 76 2c 20 69 6e 74 20 2a   *p, u8 v, int *
f010: 70 52 63 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73  pRc){.  if( 0==s
f020: 65 73 73 69 6f 6e 42 75 66 66 65 72 47 72 6f 77  essionBufferGrow
f030: 28 70 2c 20 31 2c 20 70 52 63 29 20 29 7b 0a 20  (p, 1, pRc) ){. 
f040: 20 20 20 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42     p->aBuf[p->nB
f050: 75 66 2b 2b 5d 20 3d 20 76 3b 0a 20 20 7d 0a 7d  uf++] = v;.  }.}
f060: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f070: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
f080: 20 69 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65   if *pRc is othe
f090: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
f0a0: 20 77 68 65 6e 20 69 74 20 69 73 20 0a 2a 2a 20   when it is .** 
f0b0: 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72 77 69 73  called. Otherwis
f0c0: 65 2c 20 61 70 70 65 6e 64 20 61 20 73 69 6e 67  e, append a sing
f0d0: 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65  le varint to the
f0e0: 20 62 75 66 66 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   buffer. .**.** 
f0f0: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
f100: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
f110: 65 64 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20  ed, set *pRc to 
f120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
f130: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
f140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f150: 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 56 61   sessionAppendVa
f160: 72 69 6e 74 28 53 65 73 73 69 6f 6e 42 75 66 66  rint(SessionBuff
f170: 65 72 20 2a 70 2c 20 69 6e 74 20 76 2c 20 69 6e  er *p, int v, in
f180: 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 30  t *pRc){.  if( 0
f190: 3d 3d 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47  ==sessionBufferG
f1a0: 72 6f 77 28 70 2c 20 39 2c 20 70 52 63 29 20 29  row(p, 9, pRc) )
f1b0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 66 20 2b 3d  {.    p->nBuf +=
f1c0: 20 73 65 73 73 69 6f 6e 56 61 72 69 6e 74 50 75   sessionVarintPu
f1d0: 74 28 26 70 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42  t(&p->aBuf[p->nB
f1e0: 75 66 5d 2c 20 76 29 3b 0a 20 20 7d 0a 7d 0a 0a  uf], v);.  }.}..
f1f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f200: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
f210: 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
f220: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
f230: 68 65 6e 20 69 74 20 69 73 20 0a 2a 2a 20 63 61  hen it is .** ca
f240: 6c 6c 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  lled. Otherwise,
f250: 20 61 70 70 65 6e 64 20 61 20 62 6c 6f 62 20 6f   append a blob o
f260: 66 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 75  f data to the bu
f270: 66 66 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ffer. .**.** If 
f280: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
f290: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
f2a0: 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c   set *pRc to SQL
f2b0: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
f2c0: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
f2d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
f2e0: 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
f2f0: 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72  .  SessionBuffer
f300: 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38   *p, .  const u8
f310: 20 2a 61 42 6c 6f 62 2c 20 0a 20 20 69 6e 74 20   *aBlob, .  int 
f320: 6e 42 6c 6f 62 2c 20 0a 20 20 69 6e 74 20 2a 70  nBlob, .  int *p
f330: 52 63 0a 29 7b 0a 20 20 69 66 28 20 6e 42 6c 6f  Rc.){.  if( nBlo
f340: 62 3e 30 20 26 26 20 30 3d 3d 73 65 73 73 69 6f  b>0 && 0==sessio
f350: 6e 42 75 66 66 65 72 47 72 6f 77 28 70 2c 20 6e  nBufferGrow(p, n
f360: 42 6c 6f 62 2c 20 70 52 63 29 20 29 7b 0a 20 20  Blob, pRc) ){.  
f370: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 61 42 75    memcpy(&p->aBu
f380: 66 5b 70 2d 3e 6e 42 75 66 5d 2c 20 61 42 6c 6f  f[p->nBuf], aBlo
f390: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 70  b, nBlob);.    p
f3a0: 2d 3e 6e 42 75 66 20 2b 3d 20 6e 42 6c 6f 62 3b  ->nBuf += nBlob;
f3b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
f3c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
f3d0: 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63 20 69   no-op if *pRc i
f3e0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  s other than SQL
f3f0: 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69  ITE_OK when it i
f400: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20 4f 74  s .** called. Ot
f410: 68 65 72 77 69 73 65 2c 20 61 70 70 65 6e 64 20  herwise, append 
f420: 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  a string to the 
f430: 62 75 66 66 65 72 2e 20 41 6c 6c 20 62 79 74 65  buffer. All byte
f440: 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 0a  s in the string.
f450: 2a 2a 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f  ** up to (but no
f460: 74 20 69 6e 63 6c 75 64 69 6e 67 29 20 74 68 65  t including) the
f470: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
f480: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
f490: 68 65 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  he buffer..**.**
f4a0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
f4b0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
f4c0: 72 65 64 2c 20 73 65 74 20 2a 70 52 63 20 74 6f  red, set *pRc to
f4d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65   SQLITE_NOMEM be
f4e0: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
f4f0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
f500: 64 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53  d sessionAppendS
f510: 74 72 28 0a 20 20 53 65 73 73 69 6f 6e 42 75 66  tr(.  SessionBuf
f520: 66 65 72 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74  fer *p, .  const
f530: 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 0a 20 20   char *zStr, .  
f540: 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 6e  int *pRc.){.  in
f550: 74 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33  t nStr = sqlite3
f560: 53 74 72 6c 65 6e 33 30 28 7a 53 74 72 29 3b 0a  Strlen30(zStr);.
f570: 20 20 69 66 28 20 30 3d 3d 73 65 73 73 69 6f 6e    if( 0==session
f580: 42 75 66 66 65 72 47 72 6f 77 28 70 2c 20 6e 53  BufferGrow(p, nS
f590: 74 72 2c 20 70 52 63 29 20 29 7b 0a 20 20 20 20  tr, pRc) ){.    
f5a0: 6d 65 6d 63 70 79 28 26 70 2d 3e 61 42 75 66 5b  memcpy(&p->aBuf[
f5b0: 70 2d 3e 6e 42 75 66 5d 2c 20 7a 53 74 72 2c 20  p->nBuf], zStr, 
f5c0: 6e 53 74 72 29 3b 0a 20 20 20 20 70 2d 3e 6e 42  nStr);.    p->nB
f5d0: 75 66 20 2b 3d 20 6e 53 74 72 3b 0a 20 20 7d 0a  uf += nStr;.  }.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
f5f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
f600: 70 20 69 66 20 2a 70 52 63 20 69 73 20 6f 74 68  p if *pRc is oth
f610: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
f620: 4b 20 77 68 65 6e 20 69 74 20 69 73 20 0a 2a 2a  K when it is .**
f630: 20 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72 77 69   called. Otherwi
f640: 73 65 2c 20 61 70 70 65 6e 64 20 74 68 65 20 73  se, append the s
f650: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
f660: 74 69 6f 6e 20 6f 66 20 69 6e 74 65 67 65 72 20  tion of integer 
f670: 69 56 61 6c 0a 2a 2a 20 74 6f 20 74 68 65 20 62  iVal.** to the b
f680: 75 66 66 65 72 2e 20 4e 6f 20 6e 75 6c 2d 74 65  uffer. No nul-te
f690: 72 6d 69 6e 61 74 6f 72 20 69 73 20 77 72 69 74  rminator is writ
f6a0: 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ten..**.** If an
f6b0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
f6c0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 73  s encountered, s
f6d0: 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54  et *pRc to SQLIT
f6e0: 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 0a 2a  E_NOMEM before.*
f6f0: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
f700: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
f710: 69 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72  ionAppendInteger
f720: 28 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65  (.  SessionBuffe
f730: 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  r *p,           
f740: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
f750: 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20   append to */.  
f760: 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20 20 20  int iVal,       
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 77 72 69 74  /* Value to writ
f790: 65 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  e the string rep
f7a0: 2e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  . of */.  int *p
f7b0: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
f7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
f7d0: 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
f7e0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 42 75  */.){.  char aBu
f7f0: 66 5b 32 34 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[24];.  sqlite3
f800: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
f810: 28 61 42 75 66 29 2d 31 2c 20 61 42 75 66 2c 20  (aBuf)-1, aBuf, 
f820: 22 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 73  "%d", iVal);.  s
f830: 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
f840: 70 2c 20 61 42 75 66 2c 20 70 52 63 29 3b 0a 7d  p, aBuf, pRc);.}
f850: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f860: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
f870: 20 69 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65   if *pRc is othe
f880: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
f890: 20 77 68 65 6e 20 69 74 20 69 73 20 0a 2a 2a 20   when it is .** 
f8a0: 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72 77 69 73  called. Otherwis
f8b0: 65 2c 20 61 70 70 65 6e 64 20 74 68 65 20 73 74  e, append the st
f8c0: 72 69 6e 67 20 7a 53 74 72 20 65 6e 63 6c 6f 73  ring zStr enclos
f8d0: 65 64 20 69 6e 20 71 75 6f 74 65 73 20 28 22 29  ed in quotes (")
f8e0: 20 61 6e 64 0a 2a 2a 20 77 69 74 68 20 61 6e 79   and.** with any
f8f0: 20 65 6d 62 65 64 64 65 64 20 71 75 6f 74 65 20   embedded quote 
f900: 63 68 61 72 61 63 74 65 72 73 20 65 73 63 61 70  characters escap
f910: 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ed to the buffer
f920: 2e 20 4e 6f 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  . No .** nul-ter
f930: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
f940: 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49  written..**.** I
f950: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
f960: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
f970: 64 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53  d, set *pRc to S
f980: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f  QLITE_NOMEM befo
f990: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
f9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f9b0: 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 49 64 65  sessionAppendIde
f9c0: 6e 74 28 0a 20 20 53 65 73 73 69 6f 6e 42 75 66  nt(.  SessionBuf
f9d0: 66 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  fer *p,         
f9e0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
f9f0: 74 6f 20 61 20 61 70 70 65 6e 64 20 74 6f 20 2a  to a append to *
fa00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fa10: 7a 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  zStr,           
fa20: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
fa30: 20 71 75 6f 74 65 2c 20 65 73 63 61 70 65 20 61   quote, escape a
fa40: 6e 64 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  nd append */.  i
fa50: 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa70: 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
fa80: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
fa90: 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 53   nStr = sqlite3S
faa0: 74 72 6c 65 6e 33 30 28 7a 53 74 72 29 2a 32 20  trlen30(zStr)*2 
fab0: 2b 20 32 20 2b 20 31 3b 0a 20 20 69 66 28 20 30  + 2 + 1;.  if( 0
fac0: 3d 3d 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47  ==sessionBufferG
fad0: 72 6f 77 28 70 2c 20 6e 53 74 72 2c 20 70 52 63  row(p, nStr, pRc
fae0: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
faf0: 4f 75 74 20 3d 20 28 63 68 61 72 20 2a 29 26 70  Out = (char *)&p
fb00: 2d 3e 61 42 75 66 5b 70 2d 3e 6e 42 75 66 5d 3b  ->aBuf[p->nBuf];
fb10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fb20: 2a 7a 49 6e 20 3d 20 7a 53 74 72 3b 0a 20 20 20  *zIn = zStr;.   
fb30: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 27 22 27 3b 0a   *zOut++ = '"';.
fb40: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e 20      while( *zIn 
fb50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 49  ){.      if( *zI
fb60: 6e 3d 3d 27 22 27 20 29 20 2a 7a 4f 75 74 2b 2b  n=='"' ) *zOut++
fb70: 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 2a 7a   = '"';.      *z
fb80: 4f 75 74 2b 2b 20 3d 20 2a 28 7a 49 6e 2b 2b 29  Out++ = *(zIn++)
fb90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 4f 75  ;.    }.    *zOu
fba0: 74 2b 2b 20 3d 20 27 22 27 3b 0a 20 20 20 20 70  t++ = '"';.    p
fbb0: 2d 3e 6e 42 75 66 20 3d 20 28 69 6e 74 29 28 28  ->nBuf = (int)((
fbc0: 75 38 20 2a 29 7a 4f 75 74 20 2d 20 70 2d 3e 61  u8 *)zOut - p->a
fbd0: 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Buf);.  }.}../*.
fbe0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fbf0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a   is a no-op if *
fc00: 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
fc10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
fc20: 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64   it is.** called
fc30: 2e 20 4f 74 68 65 72 77 73 65 2c 20 69 74 20 61  . Otherwse, it a
fc40: 70 70 65 6e 64 73 20 74 68 65 20 73 65 72 69 61  ppends the seria
fc50: 6c 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lized version of
fc60: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
fc70: 64 0a 2a 2a 20 69 6e 20 63 6f 6c 75 6d 6e 20 69  d.** in column i
fc80: 43 6f 6c 20 6f 66 20 74 68 65 20 72 6f 77 20 74  Col of the row t
fc90: 68 61 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  hat SQL statemen
fca0: 74 20 70 53 74 6d 74 20 63 75 72 72 65 6e 74 6c  t pStmt currentl
fcb0: 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 74  y points.** to t
fcc0: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 0a 2a 2f  o the buffer..*/
fcd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
fce0: 73 69 6f 6e 41 70 70 65 6e 64 43 6f 6c 28 0a 20  sionAppendCol(. 
fcf0: 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20 2a   SessionBuffer *
fd00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
fd10: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70   /* Buffer to ap
fd20: 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 73 71 6c  pend to */.  sql
fd30: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
fd40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
fd50: 48 61 6e 64 6c 65 20 70 6f 69 6e 74 69 6e 67 20  Handle pointing 
fd60: 74 6f 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  to row containin
fd70: 67 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  g value */.  int
fd80: 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fda0: 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 61 64 20 76  Column to read v
fdb0: 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  alue from */.  i
fdc0: 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fde0: 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
fdf0: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  code */.){.  if(
fe00: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
fe10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70   ){.    int eTyp
fe20: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
fe30: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
fe40: 43 6f 6c 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  Col);.    sessio
fe50: 6e 41 70 70 65 6e 64 42 79 74 65 28 70 2c 20 28  nAppendByte(p, (
fe60: 75 38 29 65 54 79 70 65 2c 20 70 52 63 29 3b 0a  u8)eType, pRc);.
fe70: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
fe80: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c  QLITE_INTEGER ||
fe90: 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
fea0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 73 71  LOAT ){.      sq
feb0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
fec0: 20 20 20 20 20 75 38 20 61 42 75 66 5b 38 5d 3b       u8 aBuf[8];
fed0: 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
fee0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
fef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
ff00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
ff10: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c  nt64(pStmt, iCol
ff20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ff30: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
ff40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ff50: 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
ff60: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 6d  iCol);.        m
ff70: 65 6d 63 70 79 28 26 69 2c 20 26 72 2c 20 38 29  emcpy(&i, &r, 8)
ff80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff90: 73 65 73 73 69 6f 6e 50 75 74 49 36 34 28 61 42  sessionPutI64(aB
ffa0: 75 66 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 65  uf, i);.      se
ffb0: 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
ffc0: 70 2c 20 61 42 75 66 2c 20 38 2c 20 70 52 63 29  p, aBuf, 8, pRc)
ffd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ffe0: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
fff0: 4f 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  OB || eType==SQL
10000 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
10010 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69    u8 *z;.      i
10020 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
10030 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
10040 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
10050 20 20 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69    z = (u8 *)sqli
10060 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
10070 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
10080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10090 20 20 20 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c     z = (u8 *)sql
100a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
100b0 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
100c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 42 79       }.      nBy
100d0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  te = sqlite3_col
100e0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
100f0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66   iCol);.      if
10100 28 20 7a 20 7c 7c 20 28 65 54 79 70 65 3d 3d 53  ( z || (eType==S
10110 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 6e 42  QLITE_BLOB && nB
10120 79 74 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  yte==0) ){.     
10130 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
10140 56 61 72 69 6e 74 28 70 2c 20 6e 42 79 74 65 2c  Varint(p, nByte,
10150 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 73   pRc);.        s
10160 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62  essionAppendBlob
10170 28 70 2c 20 7a 2c 20 6e 42 79 74 65 2c 20 70 52  (p, z, nByte, pR
10180 63 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  c);.      }else{
10190 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
101a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
101b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
101c0 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
101d0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
101e0 73 20 61 6e 20 75 70 64 61 74 65 20 63 68 61 6e  s an update chan
101f0 67 65 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ge to the buffer
10200 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
10210 74 73 20 0a 2a 2a 20 75 6e 64 65 72 20 22 43 48  ts .** under "CH
10220 41 4e 47 45 53 45 54 20 46 4f 52 4d 41 54 22 20  ANGESET FORMAT" 
10230 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
10240 65 20 66 69 6c 65 29 2e 20 41 6e 20 75 70 64 61  e file). An upda
10250 74 65 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f  te change .** co
10260 6e 73 69 73 74 73 20 6f 66 3a 0a 2a 2a 0a 2a 2a  nsists of:.**.**
10270 20 20 20 31 20 62 79 74 65 3a 20 20 53 51 4c 49     1 byte:  SQLI
10280 54 45 5f 55 50 44 41 54 45 20 28 30 78 31 37 29  TE_UPDATE (0x17)
10290 0a 2a 2a 20 20 20 6e 20 62 79 74 65 73 3a 20 6f  .**   n bytes: o
102a0 6c 64 2e 2a 20 72 65 63 6f 72 64 20 28 73 65 65  ld.* record (see
102b0 20 52 45 43 4f 52 44 20 46 4f 52 4d 41 54 29 0a   RECORD FORMAT).
102c0 2a 2a 20 20 20 6d 20 62 79 74 65 73 3a 20 6e 65  **   m bytes: ne
102d0 77 2e 2a 20 72 65 63 6f 72 64 20 28 73 65 65 20  w.* record (see 
102e0 52 45 43 4f 52 44 20 46 4f 52 4d 41 54 29 0a 2a  RECORD FORMAT).*
102f0 2a 0a 2a 2a 20 54 68 65 20 53 65 73 73 69 6f 6e  *.** The Session
10300 43 68 61 6e 67 65 20 6f 62 6a 65 63 74 20 70 61  Change object pa
10310 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
10320 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61  d argument conta
10330 69 6e 73 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ins the.** value
10340 73 20 74 68 61 74 20 77 65 72 65 20 73 74 6f 72  s that were stor
10350 65 64 20 69 6e 20 74 68 65 20 72 6f 77 20 77 68  ed in the row wh
10360 65 6e 20 74 68 65 20 73 65 73 73 69 6f 6e 20 62  en the session b
10370 65 67 61 6e 20 28 74 68 65 20 6f 6c 64 2e 2a 0a  egan (the old.*.
10380 2a 2a 20 76 61 6c 75 65 73 29 2e 20 54 68 65 20  ** values). The 
10390 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
103a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
103b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70  econd argument p
103c0 6f 69 6e 74 73 0a 2a 2a 20 61 74 20 74 68 65 20  oints.** at the 
103d0 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20  current version 
103e0 6f 66 20 74 68 65 20 72 6f 77 20 28 74 68 65 20  of the row (the 
103f0 6e 65 77 2e 2a 20 76 61 6c 75 65 73 29 2e 0a 2a  new.* values)..*
10400 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
10410 68 65 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  he old.* values 
10420 61 72 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65  are equal to the
10430 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
10440 20 6e 65 77 2e 2a 20 76 61 6c 75 65 0a 2a 2a 20   new.* value.** 
10450 28 69 2e 65 2e 20 6e 6f 74 68 69 6e 67 20 68 61  (i.e. nothing ha
10460 73 20 63 68 61 6e 67 65 64 29 2c 20 74 68 65 6e  s changed), then
10470 20 6e 6f 20 64 61 74 61 20 61 74 20 61 6c 6c 20   no data at all 
10480 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
10490 68 65 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  he buffer..**.**
104a0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
104b0 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20 63 6f 6e  old.* record con
104c0 74 61 69 6e 73 20 61 6c 6c 20 70 72 69 6d 61 72  tains all primar
104d0 79 20 6b 65 79 20 76 61 6c 75 65 73 20 61 6e 64  y key values and
104e0 20 74 68 65 20 0a 2a 2a 20 6f 72 69 67 69 6e 61   the .** origina
104f0 6c 20 76 61 6c 75 65 73 20 6f 66 20 61 6e 79 20  l values of any 
10500 66 69 65 6c 64 73 20 74 68 61 74 20 68 61 76 65  fields that have
10510 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
10520 54 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  The new.* record
10530 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68   .** contains th
10540 65 20 6e 65 77 20 76 61 6c 75 65 73 20 6f 66 20  e new values of 
10550 6f 6e 6c 79 20 74 68 6f 73 65 20 66 69 65 6c 64  only those field
10560 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
10570 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 20 0a 73   modified..*/ .s
10580 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
10590 6e 41 70 70 65 6e 64 55 70 64 61 74 65 28 0a 20  nAppendUpdate(. 
105a0 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20 2a   SessionBuffer *
105b0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
105c0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70   /* Buffer to ap
105d0 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  pend to */.  int
105e0 20 65 50 61 74 63 68 73 65 74 2c 20 20 20 20 20   ePatchset,     
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10600 54 72 75 65 20 66 6f 72 20 22 70 61 74 63 68 73  True for "patchs
10610 65 74 22 2c 20 30 20 66 6f 72 20 22 63 68 61 6e  et", 0 for "chan
10620 67 65 73 65 74 22 20 2a 2f 0a 20 20 73 71 6c 69  geset" */.  sqli
10630 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
10640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10650 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
10660 70 6f 69 6e 74 69 6e 67 20 61 74 20 6e 65 77 20  pointing at new 
10670 72 6f 77 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e  row */.  Session
10680 43 68 61 6e 67 65 20 2a 70 2c 20 20 20 20 20 20  Change *p,      
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
106a0 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6c  ct containing ol
106b0 64 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38  d values */.  u8
106c0 20 2a 61 62 50 4b 20 20 20 20 20 20 20 20 20 20   *abPK          
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106e0 20 42 6f 6f 6c 65 61 6e 20 61 72 72 61 79 20 2d   Boolean array -
106f0 20 74 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c   true for PK col
10700 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  umns */.){.  int
10710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10720 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72  .  SessionBuffer
10730 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf2 = {0,0,0};
10740 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 63   /* Buffer to ac
10750 63 75 6d 75 6c 61 74 65 20 6e 65 77 2e 2a 20 72  cumulate new.* r
10760 65 63 6f 72 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  ecord in */.  in
10770 74 20 62 4e 6f 6f 70 20 3d 20 31 3b 20 20 20 20  t bNoop = 1;    
10780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10790 65 74 20 74 6f 20 7a 65 72 6f 20 69 66 20 61 6e  et to zero if an
107a0 79 20 76 61 6c 75 65 73 20 61 72 65 20 6d 6f 64  y values are mod
107b0 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ified */.  int n
107c0 52 65 77 69 6e 64 20 3d 20 70 42 75 66 2d 3e 6e  Rewind = pBuf->n
107d0 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 65 74 20  Buf;     /* Set 
107e0 74 6f 20 7a 65 72 6f 20 69 66 20 61 6e 79 20 76  to zero if any v
107f0 61 6c 75 65 73 20 61 72 65 20 6d 6f 64 69 66 69  alues are modifi
10800 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ed */.  int i;  
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
10830 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
10840 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
10850 20 2a 70 43 73 72 20 3d 20 70 2d 3e 61 52 65 63   *pCsr = p->aRec
10860 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ord;        /* U
10870 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
10880 68 72 6f 75 67 68 20 6f 6c 64 2e 2a 20 76 61 6c  hrough old.* val
10890 75 65 73 20 2a 2f 0a 0a 20 20 73 65 73 73 69 6f  ues */..  sessio
108a0 6e 41 70 70 65 6e 64 42 79 74 65 28 70 42 75 66  nAppendByte(pBuf
108b0 2c 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2c  , SQLITE_UPDATE,
108c0 20 26 72 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e   &rc);.  session
108d0 41 70 70 65 6e 64 42 79 74 65 28 70 42 75 66 2c  AppendByte(pBuf,
108e0 20 70 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20 26   p->bIndirect, &
108f0 72 63 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rc);.  for(i=0; 
10900 69 3c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  i<sqlite3_column
10910 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 20 69  _count(pStmt); i
10920 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 68  ++){.    int bCh
10930 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20 20 20 69  anged = 0;.    i
10940 6e 74 20 6e 41 64 76 61 6e 63 65 3b 0a 20 20 20  nt nAdvance;.   
10950 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a 70 43   int eType = *pC
10960 73 72 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  sr;.    switch( 
10970 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
10980 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
10990 0a 20 20 20 20 20 20 20 20 6e 41 64 76 61 6e 63  .        nAdvanc
109a0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
109b0 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
109c0 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
109d0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  !=SQLITE_NULL ){
109e0 0a 20 20 20 20 20 20 20 20 20 20 62 43 68 61 6e  .          bChan
109f0 67 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ged = 1;.       
10a00 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
10a10 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ;..      case SQ
10a20 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
10a30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
10a40 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
10a50 20 6e 41 64 76 61 6e 63 65 20 3d 20 39 3b 0a 20   nAdvance = 9;. 
10a60 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
10a70 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ==sqlite3_column
10a80 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20  _type(pStmt, i) 
10a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10aa0 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 20  ite3_int64 iVal 
10ab0 3d 20 73 65 73 73 69 6f 6e 47 65 74 49 36 34 28  = sessionGetI64(
10ac0 26 70 43 73 72 5b 31 5d 29 3b 0a 20 20 20 20 20  &pCsr[1]);.     
10ad0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
10ae0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
10af0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
10b00 28 20 69 56 61 6c 3d 3d 73 71 6c 69 74 65 33 5f  ( iVal==sqlite3_
10b10 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
10b20 6d 74 2c 20 69 29 20 29 20 62 72 65 61 6b 3b 0a  mt, i) ) break;.
10b30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
10b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75  .            dou
10b50 62 6c 65 20 64 56 61 6c 3b 0a 20 20 20 20 20 20  ble dVal;.      
10b60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 56        memcpy(&dV
10b70 61 6c 2c 20 26 69 56 61 6c 2c 20 38 29 3b 0a 20  al, &iVal, 8);. 
10b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
10b90 56 61 6c 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c  Val==sqlite3_col
10ba0 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
10bb0 2c 20 69 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  , i) ) break;.  
10bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 43 68 61    }.        bCha
10be0 6e 67 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  nged = 1;.      
10bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10c00 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
10c10 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
10c20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 48  ;.        int nH
10c30 64 72 20 3d 20 31 20 2b 20 73 65 73 73 69 6f 6e  dr = 1 + session
10c40 56 61 72 69 6e 74 47 65 74 28 26 70 43 73 72 5b  VarintGet(&pCsr[
10c50 31 5d 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  1], &n);.       
10c60 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
10c70 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
10c80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
10c90 42 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 41 64  B );.        nAd
10ca0 76 61 6e 63 65 20 3d 20 6e 48 64 72 20 2b 20 6e  vance = nHdr + n
10cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
10cc0 79 70 65 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c  ype==sqlite3_col
10cd0 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
10ce0 69 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  i) .         && 
10cf0 6e 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  n==sqlite3_colum
10d00 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
10d10 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
10d20 6e 3d 3d 30 20 7c 7c 20 30 3d 3d 6d 65 6d 63 6d  n==0 || 0==memcm
10d30 70 28 26 70 43 73 72 5b 6e 48 64 72 5d 2c 20 73  p(&pCsr[nHdr], s
10d40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
10d50 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c 20 6e 29  ob(pStmt, i), n)
10d60 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
10d70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10d90 62 43 68 61 6e 67 65 64 20 3d 20 31 3b 0a 20 20  bChanged = 1;.  
10da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10db0 20 2f 2a 20 49 66 20 61 74 20 6c 65 61 73 74 20   /* If at least 
10dc0 6f 6e 65 20 66 69 65 6c 64 20 68 61 73 20 62 65  one field has be
10dd0 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  en modified, thi
10de0 73 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70  s is not a no-op
10df0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 68  . */.    if( bCh
10e00 61 6e 67 65 64 20 29 20 62 4e 6f 6f 70 20 3d 20  anged ) bNoop = 
10e10 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61  0;..    /* Add a
10e20 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 6f 6c   field to the ol
10e30 64 2e 2a 20 72 65 63 6f 72 64 2e 20 54 68 69 73  d.* record. This
10e40 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
10e50 68 69 73 20 6d 6f 64 75 6c 65 73 20 69 73 0a 20  his modules is. 
10e60 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
10e70 67 65 6e 65 72 61 74 69 6e 67 20 61 20 70 61 74  generating a pat
10e80 63 68 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66  chset. */.    if
10e90 28 20 65 50 61 74 63 68 73 65 74 21 3d 53 45 53  ( ePatchset!=SES
10ea0 53 49 4f 4e 53 5f 50 41 54 43 48 53 45 54 20 29  SIONS_PATCHSET )
10eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 50 61 74  {.      if( ePat
10ec0 63 68 73 65 74 3d 3d 53 45 53 53 49 4f 4e 53 5f  chset==SESSIONS_
10ed0 46 55 4c 4c 43 48 41 4e 47 45 53 45 54 20 7c 7c  FULLCHANGESET ||
10ee0 20 62 43 68 61 6e 67 65 64 20 7c 7c 20 61 62 50   bChanged || abP
10ef0 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  K[i] ){.        
10f00 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f  sessionAppendBlo
10f10 62 28 70 42 75 66 2c 20 70 43 73 72 2c 20 6e 41  b(pBuf, pCsr, nA
10f20 64 76 61 6e 63 65 2c 20 26 72 63 29 3b 0a 20 20  dvance, &rc);.  
10f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10f40 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
10f50 42 79 74 65 28 70 42 75 66 2c 20 30 2c 20 26 72  Byte(pBuf, 0, &r
10f60 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
10f70 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20  }..    /* Add a 
10f80 66 69 65 6c 64 20 74 6f 20 74 68 65 20 6e 65 77  field to the new
10f90 2e 2a 20 72 65 63 6f 72 64 2e 20 4f 72 20 74 68  .* record. Or th
10fa0 65 20 6f 6e 6c 79 20 72 65 63 6f 72 64 20 69 66  e only record if
10fb0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
10fc0 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 70  * generating a p
10fd0 61 74 63 68 73 65 74 2e 20 20 2a 2f 0a 20 20 20  atchset.  */.   
10fe0 20 69 66 28 20 62 43 68 61 6e 67 65 64 20 7c 7c   if( bChanged ||
10ff0 20 28 65 50 61 74 63 68 73 65 74 3d 3d 53 45 53   (ePatchset==SES
11000 53 49 4f 4e 53 5f 50 41 54 43 48 53 45 54 20 26  SIONS_PATCHSET &
11010 26 20 61 62 50 4b 5b 69 5d 29 20 29 7b 0a 20 20  & abPK[i]) ){.  
11020 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
11030 64 43 6f 6c 28 26 62 75 66 32 2c 20 70 53 74 6d  dCol(&buf2, pStm
11040 74 2c 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20  t, i, &rc);.    
11050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 73  }else{.      ses
11060 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26  sionAppendByte(&
11070 62 75 66 32 2c 20 30 2c 20 26 72 63 29 3b 0a 20  buf2, 0, &rc);. 
11080 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 20 2b     }..    pCsr +
11090 3d 20 6e 41 64 76 61 6e 63 65 3b 0a 20 20 7d 0a  = nAdvance;.  }.
110a0 0a 20 20 69 66 28 20 62 4e 6f 6f 70 20 29 7b 0a  .  if( bNoop ){.
110b0 20 20 20 20 70 42 75 66 2d 3e 6e 42 75 66 20 3d      pBuf->nBuf =
110c0 20 6e 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73   nRewind;.  }els
110d0 65 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  e{.    sessionAp
110e0 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 62  pendBlob(pBuf, b
110f0 75 66 32 2e 61 42 75 66 2c 20 62 75 66 32 2e 6e  uf2.aBuf, buf2.n
11100 42 75 66 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 20  Buf, &rc);.  }. 
11110 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 75   sqlite3_free(bu
11120 66 32 2e 61 42 75 66 29 3b 0a 0a 20 20 72 65 74  f2.aBuf);..  ret
11130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11140 20 41 70 70 65 6e 64 20 61 20 44 45 4c 45 54 45   Append a DELETE
11150 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20 62   change to the b
11160 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
11170 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
11180 6e 74 2e 20 55 73 65 0a 2a 2a 20 74 68 65 20 63  nt. Use.** the c
11190 68 61 6e 67 65 73 65 74 20 66 6f 72 6d 61 74 20  hangeset format 
111a0 69 66 20 61 72 67 75 6d 65 6e 74 20 62 50 61 74  if argument bPat
111b0 63 68 73 65 74 20 69 73 20 7a 65 72 6f 2c 20 6f  chset is zero, o
111c0 72 20 74 68 65 20 70 61 74 63 68 73 65 74 0a 2a  r the patchset.*
111d0 2a 20 66 6f 72 6d 61 74 20 6f 74 68 65 72 77 69  * format otherwi
111e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
111f0 74 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 44  t sessionAppendD
11200 65 6c 65 74 65 28 0a 20 20 53 65 73 73 69 6f 6e  elete(.  Session
11210 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
11220 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
11230 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  er to append to 
11240 2a 2f 0a 20 20 69 6e 74 20 65 43 68 61 6e 67 65  */.  int eChange
11250 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
11260 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
11270 45 53 53 49 4f 4e 53 5f 43 48 41 4e 47 45 53 45  ESSIONS_CHANGESE
11280 54 20 65 74 63 2e 20 2a 2f 0a 20 20 53 65 73 73  T etc. */.  Sess
11290 69 6f 6e 43 68 61 6e 67 65 20 2a 70 2c 20 20 20  ionChange *p,   
112a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
112b0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
112c0 20 6f 6c 64 20 76 61 6c 75 65 73 20 2a 2f 0a 20   old values */. 
112d0 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11300 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a  lumns in table *
11310 2f 0a 20 20 75 38 20 2a 61 62 50 4b 20 20 20 20  /.  u8 *abPK    
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 20 61      /* Boolean a
11340 72 72 61 79 20 2d 20 74 72 75 65 20 66 6f 72 20  rray - true for 
11350 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b  PK columns */.){
11360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11370 54 45 5f 4f 4b 3b 0a 0a 20 20 73 65 73 73 69 6f  TE_OK;..  sessio
11380 6e 41 70 70 65 6e 64 42 79 74 65 28 70 42 75 66  nAppendByte(pBuf
11390 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
113a0 20 26 72 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e   &rc);.  session
113b0 41 70 70 65 6e 64 42 79 74 65 28 70 42 75 66 2c  AppendByte(pBuf,
113c0 20 70 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20 26   p->bIndirect, &
113d0 72 63 29 3b 0a 0a 20 20 69 66 28 20 65 43 68 61  rc);..  if( eCha
113e0 6e 67 65 73 65 74 21 3d 53 45 53 53 49 4f 4e 53  ngeset!=SESSIONS
113f0 5f 50 41 54 43 48 53 45 54 20 29 7b 0a 20 20 20  _PATCHSET ){.   
11400 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c   sessionAppendBl
11410 6f 62 28 70 42 75 66 2c 20 70 2d 3e 61 52 65 63  ob(pBuf, p->aRec
11420 6f 72 64 2c 20 70 2d 3e 6e 52 65 63 6f 72 64 2c  ord, p->nRecord,
11430 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   &rc);.  }else{.
11440 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75      int i;.    u
11450 38 20 2a 61 20 3d 20 70 2d 3e 61 52 65 63 6f 72  8 *a = p->aRecor
11460 64 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  d;.    for(i=0; 
11470 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11480 20 20 20 20 75 38 20 2a 70 53 74 61 72 74 20 3d      u8 *pStart =
11490 20 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 54   a;.      int eT
114a0 79 70 65 20 3d 20 2a 61 2b 2b 3b 0a 0a 20 20 20  ype = *a++;..   
114b0 20 20 20 73 77 69 74 63 68 28 20 65 54 79 70 65     switch( eType
114c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
114d0 20 30 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65   0:.        case
114e0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
114f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11500 61 62 50 4b 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  abPK[i]==0 );.  
11510 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
11520 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
11530 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
11540 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
11550 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20  NTEGER:.        
11560 20 20 61 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20    a += 8;.      
11570 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
11580 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11590 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
115a0 20 20 20 20 20 20 20 20 20 20 61 20 2b 3d 20 73            a += s
115b0 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28  essionVarintGet(
115c0 61 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  a, &n);.        
115d0 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    a += n;.      
115e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
115f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11600 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d 20 29     if( abPK[i] )
11610 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
11620 6e 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  nAppendBlob(pBuf
11630 2c 20 70 53 74 61 72 74 2c 20 28 69 6e 74 29 28  , pStart, (int)(
11640 61 2d 70 53 74 61 72 74 29 2c 20 26 72 63 29 3b  a-pStart), &rc);
11650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11660 20 20 20 61 73 73 65 72 74 28 20 28 61 20 2d 20     assert( (a - 
11670 70 2d 3e 61 52 65 63 6f 72 64 29 3d 3d 70 2d 3e  p->aRecord)==p->
11680 6e 52 65 63 6f 72 64 20 29 3b 0a 20 20 7d 0a 0a  nRecord );.  }..
11690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
116a0 2f 2a 0a 2a 2a 20 46 6f 72 6d 75 6c 61 74 65 20  /*.** Formulate 
116b0 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 53 45  and prepare a SE
116c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
116d0 6f 20 72 65 74 72 69 65 76 65 20 61 20 72 6f 77  o retrieve a row
116e0 20 66 72 6f 6d 20 74 61 62 6c 65 0a 2a 2a 20 7a   from table.** z
116f0 54 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20  Tab in database 
11700 7a 44 62 20 62 61 73 65 64 20 6f 6e 20 69 74 73  zDb based on its
11710 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 69 2e   primary key. i.
11720 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e..**.**   SELEC
11730 54 20 2a 20 46 52 4f 4d 20 7a 44 62 2e 7a 54 61  T * FROM zDb.zTa
11740 62 20 57 48 45 52 45 20 70 6b 31 20 3d 20 3f 20  b WHERE pk1 = ? 
11750 41 4e 44 20 70 6b 32 20 3d 20 3f 20 41 4e 44 20  AND pk2 = ? AND 
11760 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
11770 74 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 53  t sessionSelectS
11780 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tmt(.  sqlite3 *
11790 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
117a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
117b0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
117c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
117e0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
117f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11800 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *zTab,          
11810 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
11820 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  me */.  int nCol
11830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11840 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11850 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11860 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
11870 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20   char **azCol,  
11880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
11890 6d 65 73 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c  mes of table col
118a0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62  umns */.  u8 *ab
118b0 50 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  PK,             
118c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 49            /* PRI
118d0 4d 41 52 59 20 4b 45 59 20 20 61 72 72 61 79 20  MARY KEY  array 
118e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
118f0 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20  t **ppStmt      
11900 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65       /* OUT: Pre
11910 70 61 72 65 64 20 53 45 4c 45 43 54 20 73 74 61  pared SELECT sta
11920 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  tement */.){.  i
11930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11940 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  K;.  char *zSql 
11950 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 20  = 0;.  int nSql 
11960 3d 20 2d 31 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  = -1;..  if( 0==
11970 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
11980 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20  "sqlite_stat1", 
11990 7a 54 61 62 29 20 29 7b 0a 20 20 20 20 7a 53 71  zTab) ){.    zSq
119a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
119b0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
119c0 4c 45 43 54 20 74 62 6c 2c 20 3f 32 2c 20 73 74  LECT tbl, ?2, st
119d0 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
119e0 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
119f0 6c 20 49 53 20 3f 31 20 41 4e 44 20 22 0a 20 20  l IS ?1 AND ".  
11a00 20 20 20 20 20 20 22 69 64 78 20 49 53 20 28 43        "idx IS (C
11a10 41 53 45 20 57 48 45 4e 20 3f 32 3d 58 27 27 20  ASE WHEN ?2=X'' 
11a20 54 48 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 3f  THEN NULL ELSE ?
11a30 32 20 45 4e 44 29 22 2c 20 7a 44 62 0a 20 20 20  2 END)", zDb.   
11a40 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
11a50 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
11a60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
11a70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
11a80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
11a90 70 20 3d 20 22 22 3b 0a 20 20 20 20 53 65 73 73  p = "";.    Sess
11aa0 69 6f 6e 42 75 66 66 65 72 20 62 75 66 20 3d 20  ionBuffer buf = 
11ab0 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20  {0, 0, 0};..    
11ac0 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72  sessionAppendStr
11ad0 28 26 62 75 66 2c 20 22 53 45 4c 45 43 54 20 2a  (&buf, "SELECT *
11ae0 20 46 52 4f 4d 20 22 2c 20 26 72 63 29 3b 0a 20   FROM ", &rc);. 
11af0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
11b00 49 64 65 6e 74 28 26 62 75 66 2c 20 7a 44 62 2c  Ident(&buf, zDb,
11b10 20 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69   &rc);.    sessi
11b20 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66  onAppendStr(&buf
11b30 2c 20 22 2e 22 2c 20 26 72 63 29 3b 0a 20 20 20  , ".", &rc);.   
11b40 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 49 64   sessionAppendId
11b50 65 6e 74 28 26 62 75 66 2c 20 7a 54 61 62 2c 20  ent(&buf, zTab, 
11b60 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
11b70 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
11b80 20 22 20 57 48 45 52 45 20 22 2c 20 26 72 63 29   " WHERE ", &rc)
11b90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11ba0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11bb0 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d 20 29     if( abPK[i] )
11bc0 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
11bd0 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
11be0 20 7a 53 65 70 2c 20 26 72 63 29 3b 0a 20 20 20   zSep, &rc);.   
11bf0 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
11c00 6e 64 49 64 65 6e 74 28 26 62 75 66 2c 20 61 7a  ndIdent(&buf, az
11c10 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  Col[i], &rc);.  
11c20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
11c30 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20 49  endStr(&buf, " I
11c40 53 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20 20  S ?", &rc);.    
11c50 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
11c60 64 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69  dInteger(&buf, i
11c70 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  +1, &rc);.      
11c80 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22    zSep = " AND "
11c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ca0 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 68 61 72      zSql = (char
11cb0 2a 29 62 75 66 2e 61 42 75 66 3b 0a 20 20 20 20  *)buf.aBuf;.    
11cc0 6e 53 71 6c 20 3d 20 62 75 66 2e 6e 42 75 66 3b  nSql = buf.nBuf;
11cd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
11ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
11d00 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
11d10 6c 2c 20 6e 53 71 6c 2c 20 70 70 53 74 6d 74 2c  l, nSql, ppStmt,
11d20 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
11d30 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
11d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11d50 2a 0a 2a 2a 20 42 69 6e 64 20 74 68 65 20 50 52  *.** Bind the PR
11d60 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73  IMARY KEY values
11d70 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
11d80 20 70 61 73 73 65 64 20 69 6e 20 61 72 67 75 6d   passed in argum
11d90 65 6e 74 20 70 43 68 61 6e 67 65 0a 2a 2a 20 74  ent pChange.** t
11da0 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
11db0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
11dc0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
11dd0 65 6e 74 2e 20 54 68 65 20 53 45 4c 45 43 54 20  ent. The SELECT 
11de0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20  statement.** is 
11df0 61 73 20 70 72 65 70 61 72 65 64 20 62 79 20 66  as prepared by f
11e00 75 6e 63 74 69 6f 6e 20 73 65 73 73 69 6f 6e 53  unction sessionS
11e10 65 6c 65 63 74 53 74 6d 74 28 29 2e 0a 2a 2a 0a  electStmt()..**.
11e20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
11e30 5f 4f 4b 20 69 66 20 61 6c 6c 20 50 4b 20 76 61  _OK if all PK va
11e40 6c 75 65 73 20 61 72 65 20 73 75 63 63 65 73 73  lues are success
11e50 66 75 6c 6c 79 20 62 6f 75 6e 64 2c 20 6f 72 20  fully bound, or 
11e60 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
11e70 6f 72 20 63 6f 64 65 20 28 65 2e 67 2e 20 53 51  or code (e.g. SQ
11e80 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 6f 74 68 65  LITE_NOMEM) othe
11e90 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
11ea0 20 69 6e 74 20 73 65 73 73 69 6f 6e 53 65 6c 65   int sessionSele
11eb0 63 74 42 69 6e 64 28 0a 20 20 73 71 6c 69 74 65  ctBind(.  sqlite
11ec0 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 2c  3_stmt *pSelect,
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
11ee0 45 43 54 20 66 72 6f 6d 20 73 65 73 73 69 6f 6e  ECT from session
11ef0 53 65 6c 65 63 74 53 74 6d 74 28 29 20 2a 2f 0a  SelectStmt() */.
11f00 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20    int nCol,     
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11f30 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
11f40 2a 2f 0a 20 20 75 38 20 2a 61 62 50 4b 2c 20 20  */.  u8 *abPK,  
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20       /* PRIMARY 
11f70 4b 45 59 20 61 72 72 61 79 20 2a 2f 0a 20 20 53  KEY array */.  S
11f80 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a 70 43  essionChange *pC
11f90 68 61 6e 67 65 20 20 20 20 20 20 20 20 20 20 2f  hange          /
11fa0 2a 20 43 68 61 6e 67 65 20 73 74 72 75 63 74 75  * Change structu
11fb0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
11fc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
11fd0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 2a 61 20  ITE_OK;.  u8 *a 
11fe0 3d 20 70 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f  = pChange->aReco
11ff0 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rd;..  for(i=0; 
12000 69 3c 6e 43 6f 6c 20 26 26 20 72 63 3d 3d 53 51  i<nCol && rc==SQ
12010 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
12020 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a     int eType = *
12030 61 2b 2b 3b 0a 0a 20 20 20 20 73 77 69 74 63 68  a++;..    switch
12040 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ( eType ){.     
12050 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 63   case 0:.      c
12060 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
12070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12080 20 61 62 50 4b 5b 69 5d 3d 3d 30 20 29 3b 0a 20   abPK[i]==0 );. 
12090 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
120a0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
120b0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
120c0 20 20 20 20 69 66 28 20 61 62 50 4b 5b 69 5d 20      if( abPK[i] 
120d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
120e0 20 69 56 61 6c 20 3d 20 73 65 73 73 69 6f 6e 47   iVal = sessionG
120f0 65 74 49 36 34 28 61 29 3b 0a 20 20 20 20 20 20  etI64(a);.      
12100 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12110 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c  _bind_int64(pSel
12120 65 63 74 2c 20 69 2b 31 2c 20 69 56 61 6c 29 3b  ect, i+1, iVal);
12130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12140 20 20 20 61 20 2b 3d 20 38 3b 0a 20 20 20 20 20     a += 8;.     
12150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12160 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  }..      case SQ
12170 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
12180 20 20 20 20 20 20 69 66 28 20 61 62 50 4b 5b 69        if( abPK[i
12190 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  ] ){.          d
121a0 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 20 20 20 20  ouble rVal;.    
121b0 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
121c0 20 73 65 73 73 69 6f 6e 47 65 74 49 36 34 28 61   sessionGetI64(a
121d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
121e0 63 70 79 28 26 72 56 61 6c 2c 20 26 69 56 61 6c  cpy(&rVal, &iVal
121f0 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 8);.          
12200 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
12210 64 5f 64 6f 75 62 6c 65 28 70 53 65 6c 65 63 74  d_double(pSelect
12220 2c 20 69 2b 31 2c 20 72 56 61 6c 29 3b 0a 20 20  , i+1, rVal);.  
12230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12240 61 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  a += 8;.        
12250 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
12260 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
12270 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20  E_TEXT: {.      
12280 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
12290 20 61 20 2b 3d 20 73 65 73 73 69 6f 6e 56 61 72   a += sessionVar
122a0 69 6e 74 47 65 74 28 61 2c 20 26 6e 29 3b 0a 20  intGet(a, &n);. 
122b0 20 20 20 20 20 20 20 69 66 28 20 61 62 50 4b 5b         if( abPK[
122c0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
122d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
122e0 64 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  d_text(pSelect, 
122f0 69 2b 31 2c 20 28 63 68 61 72 20 2a 29 61 2c 20  i+1, (char *)a, 
12300 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
12310 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ENT);.        }.
12320 20 20 20 20 20 20 20 20 61 20 2b 3d 20 6e 3b 0a          a += n;.
12330 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12340 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
12350 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
12360 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
12370 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
12380 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20  QLITE_BLOB );.  
12390 20 20 20 20 20 20 61 20 2b 3d 20 73 65 73 73 69        a += sessi
123a0 6f 6e 56 61 72 69 6e 74 47 65 74 28 61 2c 20 26  onVarintGet(a, &
123b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
123c0 61 62 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20  abPK[i] ){.     
123d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
123e0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 65 6c  3_bind_blob(pSel
123f0 65 63 74 2c 20 69 2b 31 2c 20 61 2c 20 6e 2c 20  ect, i+1, a, n, 
12400 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12420 20 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20       a += n;.   
12430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12460 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12470 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
12480 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
12490 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
124a0 45 5f 4f 4b 20 77 68 65 6e 20 69 74 0a 2a 2a 20  E_OK when it.** 
124b0 69 73 20 63 61 6c 6c 65 64 2e 20 4f 74 68 65 72  is called. Other
124c0 77 69 73 65 2c 20 61 70 70 65 6e 64 20 61 20 73  wise, append a s
124d0 65 72 69 61 6c 69 7a 65 64 20 74 61 62 6c 65 20  erialized table 
124e0 68 65 61 64 65 72 20 28 70 61 72 74 20 6f 66 20  header (part of 
124f0 74 68 65 20 62 69 6e 61 72 79 20 0a 2a 2a 20 63  the binary .** c
12500 68 61 6e 67 65 73 65 74 20 66 6f 72 6d 61 74 29  hangeset format)
12510 20 74 6f 20 62 75 66 66 65 72 20 2a 70 42 75 66   to buffer *pBuf
12520 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
12530 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74  curs, set *pRc t
12540 6f 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  o an.** SQLite e
12550 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
12560 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
12570 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
12580 6f 6e 41 70 70 65 6e 64 54 61 62 6c 65 48 64 72  onAppendTableHdr
12590 28 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65  (.  SessionBuffe
125a0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
125b0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 68 65      /* Append he
125c0 61 64 65 72 20 74 6f 20 74 68 69 73 20 62 75 66  ader to this buf
125d0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 50 61  fer */.  int ePa
125e0 74 63 68 73 65 74 2c 20 20 20 20 20 20 20 20 20  tchset,         
125f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
12600 74 68 65 20 70 61 74 63 68 73 65 74 20 66 6f 72  the patchset for
12610 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  mat if true */. 
12620 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a 70   SessionTable *p
12630 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
12640 20 2f 2a 20 54 61 62 6c 65 20 6f 62 6a 65 63 74   /* Table object
12650 20 74 6f 20 61 70 70 65 6e 64 20 68 65 61 64 65   to append heade
12660 72 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  r for */.  int *
12670 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
12680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12690 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
126a0 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 57 72 69 74   */.){.  /* Writ
126b0 65 20 61 20 74 61 62 6c 65 20 68 65 61 64 65 72  e a table header
126c0 20 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 41 70 70   */.  sessionApp
126d0 65 6e 64 42 79 74 65 28 70 42 75 66 2c 20 28 65  endByte(pBuf, (e
126e0 50 61 74 63 68 73 65 74 3d 3d 53 45 53 53 49 4f  Patchset==SESSIO
126f0 4e 53 5f 50 41 54 43 48 53 45 54 29 20 3f 20 27  NS_PATCHSET) ? '
12700 50 27 20 3a 20 27 54 27 2c 20 70 52 63 29 3b 0a  P' : 'T', pRc);.
12710 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 56    sessionAppendV
12720 61 72 69 6e 74 28 70 42 75 66 2c 20 70 54 61 62  arint(pBuf, pTab
12730 2d 3e 6e 43 6f 6c 2c 20 70 52 63 29 3b 0a 20 20  ->nCol, pRc);.  
12740 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f  sessionAppendBlo
12750 62 28 70 42 75 66 2c 20 70 54 61 62 2d 3e 61 62  b(pBuf, pTab->ab
12760 50 4b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  PK, pTab->nCol, 
12770 70 52 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e 41  pRc);.  sessionA
12780 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
12790 28 75 38 20 2a 29 70 54 61 62 2d 3e 7a 4e 61 6d  (u8 *)pTab->zNam
127a0 65 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70  e, (int)strlen(p
127b0 54 61 62 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  Tab->zName)+1, p
127c0 52 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Rc);.}../*.** Ge
127d0 6e 65 72 61 74 65 20 65 69 74 68 65 72 20 61 20  nerate either a 
127e0 63 68 61 6e 67 65 73 65 74 20 28 69 66 20 61 72  changeset (if ar
127f0 67 75 6d 65 6e 74 20 62 50 61 74 63 68 73 65 74  gument bPatchset
12800 20 69 73 20 7a 65 72 6f 29 20 6f 72 20 61 20 70   is zero) or a p
12810 61 74 63 68 73 65 74 0a 2a 2a 20 28 69 66 20 69  atchset.** (if i
12820 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 62  t is non-zero) b
12830 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
12840 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
12850 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  the session obje
12860 63 74 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  ct.** passed as 
12870 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12880 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  nt..**.** If no 
12890 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
128a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
128b0 6e 65 64 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ned and the new 
128c0 63 68 61 6e 67 65 73 65 74 2f 70 61 74 63 68 73  changeset/patchs
128d0 65 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  et.** stored in 
128e0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
128f0 20 2a 70 6e 43 68 61 6e 67 65 73 65 74 20 61 6e   *pnChangeset an
12900 64 20 2a 70 70 43 68 61 6e 67 65 73 65 74 2e 20  d *ppChangeset. 
12910 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  Or, if an error.
12920 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  ** occurs, an SQ
12930 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
12940 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
12950 62 6f 74 68 20 6f 75 74 70 75 74 20 76 61 72 69  both output vari
12960 61 62 6c 65 73 20 73 65 74 20 0a 2a 2a 20 74 6f  ables set .** to
12970 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
12980 74 20 73 65 73 73 69 6f 6e 47 65 6e 65 72 61 74  t sessionGenerat
12990 65 43 68 61 6e 67 65 73 65 74 28 0a 20 20 73 71  eChangeset(.  sq
129a0 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
129b0 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a  Session,      /*
129c0 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   Session object 
129d0 2a 2f 0a 20 20 69 6e 74 20 65 50 61 74 63 68 73  */.  int ePatchs
129e0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
129f0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
12a00 45 53 53 49 4f 4e 53 5f 43 48 41 4e 47 45 53 45  ESSIONS_CHANGESE
12a10 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
12a20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69 64 20  (*xOutput)(void 
12a30 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69  *pOut, const voi
12a40 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
12a50 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70 4f  ata),.  void *pO
12a60 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
12a70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
12a80 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 4f   argument for xO
12a90 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  utput */.  int *
12aa0 70 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20  pnChangeset,    
12ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
12ac0 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  T: Size of buffe
12ad0 72 20 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65  r at *ppChangese
12ae0 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
12af0 43 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20  Changeset       
12b00 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
12b10 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
12b20 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 7b   changeset */.){
12b30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12b40 20 70 53 65 73 73 69 6f 6e 2d 3e 64 62 3b 20 20   pSession->db;  
12b50 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61 74     /* Source dat
12b60 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
12b70 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
12b80 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
12b90 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
12ba0 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
12bb0 61 63 68 65 64 20 74 61 62 6c 65 73 20 2a 2f 0a  ached tables */.
12bc0 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20    SessionBuffer 
12bd0 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  buf = {0,0,0};  
12be0 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
12bf0 68 69 63 68 20 74 6f 20 61 63 63 75 6d 6c 61 74  hich to accumlat
12c00 65 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20  e changeset */. 
12c10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
12c40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 78 4f  */..  assert( xO
12c50 75 74 70 75 74 3d 3d 30 20 7c 7c 20 28 70 6e 43  utput==0 || (pnC
12c60 68 61 6e 67 65 73 65 74 3d 3d 30 20 26 26 20 70  hangeset==0 && p
12c70 70 43 68 61 6e 67 65 73 65 74 3d 3d 30 20 29 20  pChangeset==0 ) 
12c80 29 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  );..  /* Zero th
12c90 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
12ca0 65 73 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  es in case an er
12cb0 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ror occurs. If t
12cc0 68 69 73 20 73 65 73 73 69 6f 6e 0a 20 20 2a 2a  his session.  **
12cd0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 72 65 61   object is alrea
12ce0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
12cf0 73 74 61 74 65 20 28 73 71 6c 69 74 65 33 5f 73  state (sqlite3_s
12d00 65 73 73 69 6f 6e 2e 72 63 20 21 3d 20 53 51 4c  ession.rc != SQL
12d10 49 54 45 5f 4f 4b 29 2c 0a 20 20 2a 2a 20 74 68  ITE_OK),.  ** th
12d20 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  is call will be 
12d30 61 20 6e 6f 2d 6f 70 2e 20 20 2a 2f 0a 20 20 69  a no-op.  */.  i
12d40 66 28 20 78 4f 75 74 70 75 74 3d 3d 30 20 29 7b  f( xOutput==0 ){
12d50 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 73 65  .    *pnChangese
12d60 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70 43 68  t = 0;.    *ppCh
12d70 61 6e 67 65 73 65 74 20 3d 20 30 3b 0a 20 20 7d  angeset = 0;.  }
12d80 0a 0a 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e  ..  if( pSession
12d90 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70 53  ->rc ) return pS
12da0 65 73 73 69 6f 6e 2d 3e 72 63 3b 0a 20 20 72 63  ession->rc;.  rc
12db0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
12dc0 70 53 65 73 73 69 6f 6e 2d 3e 64 62 2c 20 22 53  pSession->db, "S
12dd0 41 56 45 50 4f 49 4e 54 20 63 68 61 6e 67 65 73  AVEPOINT changes
12de0 65 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  et", 0, 0, 0);. 
12df0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12e00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
12e10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12e20 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 64  _enter(sqlite3_d
12e30 62 5f 6d 75 74 65 78 28 64 62 29 29 3b 0a 0a 20  b_mutex(db));.. 
12e40 20 66 6f 72 28 70 54 61 62 3d 70 53 65 73 73 69   for(pTab=pSessi
12e50 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20 72 63 3d 3d  on->pTable; rc==
12e60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 61  SQLITE_OK && pTa
12e70 62 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e  b; pTab=pTab->pN
12e80 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ext){.    if( pT
12e90 61 62 2d 3e 6e 45 6e 74 72 79 20 29 7b 0a 20 20  ab->nEntry ){.  
12ea0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12eb0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  zName = pTab->zN
12ec0 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
12ed0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
12ee0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12ef0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
12f00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 75 38  able */.      u8
12f10 20 2a 61 62 50 4b 3b 20 20 20 20 20 20 20 20 20   *abPK;         
12f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69            /* Pri
12f30 6d 61 72 79 20 6b 65 79 20 61 72 72 61 79 20 2a  mary key array *
12f40 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
12f50 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 20  ar **azCol = 0; 
12f60 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 6f 6c      /* Table col
12f70 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  umns */.      in
12f80 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
12f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
12fa0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
12fb0 6f 75 67 68 20 68 61 73 68 20 62 75 63 6b 65 74  ough hash bucket
12fc0 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
12fd0 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 20 3d 20  e3_stmt *pSel = 
12fe0 30 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  0;     /* SELECT
12ff0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 71 75   statement to qu
13000 65 72 79 20 74 61 62 6c 65 20 70 54 61 62 20 2a  ery table pTab *
13010 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 77  /.      int nRew
13020 69 6e 64 20 3d 20 62 75 66 2e 6e 42 75 66 3b 20  ind = buf.nBuf; 
13030 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73      /* Initial s
13040 69 7a 65 20 6f 66 20 77 72 69 74 65 20 62 75 66  ize of write buf
13050 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
13060 20 6e 4e 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nNoop;         
13070 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13080 20 6f 66 20 62 75 66 66 65 72 20 61 66 74 65 72   of buffer after
13090 20 77 72 69 74 69 6e 67 20 74 62 6c 20 68 65 61   writing tbl hea
130a0 64 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  der */..      /*
130b0 20 43 68 65 63 6b 20 74 68 65 20 74 61 62 6c 65   Check the table
130c0 20 73 63 68 65 6d 61 20 69 73 20 73 74 69 6c 6c   schema is still
130d0 20 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63   Ok. */.      rc
130e0 20 3d 20 73 65 73 73 69 6f 6e 54 61 62 6c 65 49   = sessionTableI
130f0 6e 66 6f 28 64 62 2c 20 70 53 65 73 73 69 6f 6e  nfo(db, pSession
13100 2d 3e 7a 44 62 2c 20 7a 4e 61 6d 65 2c 20 26 6e  ->zDb, zName, &n
13110 43 6f 6c 2c 20 30 2c 20 26 61 7a 43 6f 6c 2c 20  Col, 0, &azCol, 
13120 26 61 62 50 4b 29 3b 0a 20 20 20 20 20 20 69 66  &abPK);.      if
13130 28 20 21 72 63 20 26 26 20 28 70 54 61 62 2d 3e  ( !rc && (pTab->
13140 6e 43 6f 6c 21 3d 6e 43 6f 6c 20 7c 7c 20 6d 65  nCol!=nCol || me
13150 6d 63 6d 70 28 61 62 50 4b 2c 20 70 54 61 62 2d  mcmp(abPK, pTab-
13160 3e 61 62 50 4b 2c 20 6e 43 6f 6c 29 29 20 29 7b  >abPK, nCol)) ){
13170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
13180 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20  LITE_SCHEMA;.   
13190 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57     }..      /* W
131a0 72 69 74 65 20 61 20 74 61 62 6c 65 20 68 65 61  rite a table hea
131b0 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 65 73  der */.      ses
131c0 73 69 6f 6e 41 70 70 65 6e 64 54 61 62 6c 65 48  sionAppendTableH
131d0 64 72 28 26 62 75 66 2c 20 65 50 61 74 63 68 73  dr(&buf, ePatchs
131e0 65 74 2c 20 70 54 61 62 2c 20 26 72 63 29 3b 0a  et, pTab, &rc);.
131f0 0a 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20  .      /* Build 
13200 61 6e 64 20 63 6f 6d 70 69 6c 65 20 61 20 73 74  and compile a st
13210 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
13220 74 65 3a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  te: */.      if(
13230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13240 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13250 65 73 73 69 6f 6e 53 65 6c 65 63 74 53 74 6d 74  essionSelectStmt
13260 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  (.            db
13270 2c 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 44 62 2c  , pSession->zDb,
13280 20 7a 4e 61 6d 65 2c 20 6e 43 6f 6c 2c 20 61 7a   zName, nCol, az
13290 43 6f 6c 2c 20 61 62 50 4b 2c 20 26 70 53 65 6c  Col, abPK, &pSel
132a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
132b0 20 20 6e 4e 6f 6f 70 20 3d 20 62 75 66 2e 6e 42    nNoop = buf.nB
132c0 75 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  uf;.      for(i=
132d0 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 68 61 6e  0; i<pTab->nChan
132e0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
132f0 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
13300 20 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65     SessionChange
13310 20 2a 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   *p;         /* 
13320 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
13330 74 68 72 6f 75 67 68 20 63 68 61 6e 67 65 73 20  through changes 
13340 2a 2f 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  */..        for(
13350 70 3d 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65  p=pTab->apChange
13360 5b 69 5d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  [i]; rc==SQLITE_
13370 4f 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 4e  OK && p; p=p->pN
13380 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
13390 72 63 20 3d 20 73 65 73 73 69 6f 6e 53 65 6c 65  rc = sessionSele
133a0 63 74 42 69 6e 64 28 70 53 65 6c 2c 20 6e 43 6f  ctBind(pSel, nCo
133b0 6c 2c 20 61 62 50 4b 2c 20 70 29 3b 0a 20 20 20  l, abPK, p);.   
133c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
133d0 51 4c 49 54 45 5f 4f 4b 20 29 20 63 6f 6e 74 69  QLITE_OK ) conti
133e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
133f0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
13400 70 53 65 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  pSel)==SQLITE_RO
13410 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
13420 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49   if( p->op==SQLI
13430 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20  TE_INSERT ){.   
13440 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
13450 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
13460 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
13470 42 79 74 65 28 26 62 75 66 2c 20 53 51 4c 49 54  Byte(&buf, SQLIT
13480 45 5f 49 4e 53 45 52 54 2c 20 26 72 63 29 3b 0a  E_INSERT, &rc);.
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
134a0 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28  ssionAppendByte(
134b0 26 62 75 66 2c 20 70 2d 3e 62 49 6e 64 69 72 65  &buf, p->bIndire
134c0 63 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ct, &rc);.      
134d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
134e0 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69  =0; iCol<nCol; i
134f0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
13500 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
13510 70 70 65 6e 64 43 6f 6c 28 26 62 75 66 2c 20 70  ppendCol(&buf, p
13520 53 65 6c 2c 20 69 43 6f 6c 2c 20 26 72 63 29 3b  Sel, iCol, &rc);
13530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13540 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
13550 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
13560 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 41 70    rc = sessionAp
13570 70 65 6e 64 55 70 64 61 74 65 28 26 62 75 66 2c  pendUpdate(&buf,
13580 20 65 50 61 74 63 68 73 65 74 2c 20 70 53 65 6c   ePatchset, pSel
13590 2c 20 70 2c 20 61 62 50 4b 29 3b 0a 20 20 20 20  , p, abPK);.    
135a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
135b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
135c0 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53 45  >op!=SQLITE_INSE
135d0 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RT ){.          
135e0 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 41 70    rc = sessionAp
135f0 70 65 6e 64 44 65 6c 65 74 65 28 26 62 75 66 2c  pendDelete(&buf,
13600 20 65 50 61 74 63 68 73 65 74 2c 20 70 2c 20 6e   ePatchset, p, n
13610 43 6f 6c 2c 20 61 62 50 4b 29 3b 0a 20 20 20 20  Col, abPK);.    
13620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13660 72 65 73 65 74 28 70 53 65 6c 29 3b 0a 20 20 20  reset(pSel);.   
13670 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
13680 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75      /* If the bu
13690 66 66 65 72 20 69 73 20 6e 6f 77 20 6c 61 72 67  ffer is now larg
136a0 65 72 20 74 68 61 6e 20 73 65 73 73 69 6f 6e 73  er than sessions
136b0 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65  _strm_chunk_size
136c0 2c 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 20  , pass.         
136d0 20 2a 2a 20 69 74 73 20 63 6f 6e 74 65 6e 74 73   ** its contents
136e0 20 74 6f 20 74 68 65 20 78 4f 75 74 70 75 74 28   to the xOutput(
136f0 29 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  ) callback. */. 
13700 20 20 20 20 20 20 20 20 20 69 66 28 20 78 4f 75           if( xOu
13710 74 70 75 74 20 0a 20 20 20 20 20 20 20 20 20 20  tput .          
13720 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13730 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  K .           &&
13740 20 62 75 66 2e 6e 42 75 66 3e 6e 4e 6f 6f 70 20   buf.nBuf>nNoop 
13750 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 62  .           && b
13760 75 66 2e 6e 42 75 66 3e 73 65 73 73 69 6f 6e 73  uf.nBuf>sessions
13770 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65  _strm_chunk_size
13780 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20   .          ){. 
13790 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
137a0 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20 28 76  xOutput(pOut, (v
137b0 6f 69 64 2a 29 62 75 66 2e 61 42 75 66 2c 20 62  oid*)buf.aBuf, b
137c0 75 66 2e 6e 42 75 66 29 3b 0a 20 20 20 20 20 20  uf.nBuf);.      
137d0 20 20 20 20 20 20 6e 4e 6f 6f 70 20 3d 20 2d 31        nNoop = -1
137e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75  ;.            bu
137f0 66 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  f.nBuf = 0;.    
13800 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
13810 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13820 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
13830 7a 65 28 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  ze(pSel);.      
13840 69 66 28 20 62 75 66 2e 6e 42 75 66 3d 3d 6e 4e  if( buf.nBuf==nN
13850 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 62  oop ){.        b
13860 75 66 2e 6e 42 75 66 20 3d 20 6e 52 65 77 69 6e  uf.nBuf = nRewin
13870 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
13880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63   sqlite3_free((c
13890 68 61 72 2a 29 61 7a 43 6f 6c 29 3b 20 20 2f 2a  har*)azCol);  /*
138a0 20 63 61 73 74 20 77 6f 72 6b 73 20 61 72 6f 75   cast works arou
138b0 6e 64 20 56 43 2b 2b 20 62 75 67 20 2a 2f 0a 20  nd VC++ bug */. 
138c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
138d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
138e0 0a 20 20 20 20 69 66 28 20 78 4f 75 74 70 75 74  .    if( xOutput
138f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ==0 ){.      *pn
13900 43 68 61 6e 67 65 73 65 74 20 3d 20 62 75 66 2e  Changeset = buf.
13910 6e 42 75 66 3b 0a 20 20 20 20 20 20 2a 70 70 43  nBuf;.      *ppC
13920 68 61 6e 67 65 73 65 74 20 3d 20 62 75 66 2e 61  hangeset = buf.a
13930 42 75 66 3b 0a 20 20 20 20 20 20 62 75 66 2e 61  Buf;.      buf.a
13940 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Buf = 0;.    }el
13950 73 65 20 69 66 28 20 62 75 66 2e 6e 42 75 66 3e  se if( buf.nBuf>
13960 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
13970 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20 28 76  xOutput(pOut, (v
13980 6f 69 64 2a 29 62 75 66 2e 61 42 75 66 2c 20 62  oid*)buf.aBuf, b
13990 75 66 2e 6e 42 75 66 29 3b 0a 20 20 20 20 7d 0a  uf.nBuf);.    }.
139a0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
139b0 72 65 65 28 62 75 66 2e 61 42 75 66 29 3b 0a 20  ree(buf.aBuf);. 
139c0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
139d0 2c 20 22 52 45 4c 45 41 53 45 20 63 68 61 6e 67  , "RELEASE chang
139e0 65 73 65 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b  eset", 0, 0, 0);
139f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13a00 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 64  _leave(sqlite3_d
13a10 62 5f 6d 75 74 65 78 28 64 62 29 29 3b 0a 20 20  b_mutex(db));.  
13a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13a30 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 63 68 61  .** Obtain a cha
13a40 6e 67 65 73 65 74 20 6f 62 6a 65 63 74 20 63 6f  ngeset object co
13a50 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 63 68 61  ntaining all cha
13a60 6e 67 65 73 20 72 65 63 6f 72 64 65 64 20 62 79  nges recorded by
13a70 20 74 68 65 20 0a 2a 2a 20 73 65 73 73 69 6f 6e   the .** session
13a80 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
13a90 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
13aa0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ment..**.** It i
13ab0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
13ac0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
13ad0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
13ae0 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
13af0 20 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74   .** using sqlit
13b00 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
13b10 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  t sqlite3session
13b20 5f 63 68 61 6e 67 65 73 65 74 28 0a 20 20 73 71  _changeset(.  sq
13b30 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
13b40 53 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a  Session,      /*
13b50 20 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20   Session object 
13b60 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e  */.  int *pnChan
13b70 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  geset,          
13b80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
13b90 65 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a  e of buffer at *
13ba0 70 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20  ppChangeset */. 
13bb0 20 76 6f 69 64 20 2a 2a 70 70 43 68 61 6e 67 65   void **ppChange
13bc0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
13bd0 20 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72 20   /* OUT: Buffer 
13be0 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67  containing chang
13bf0 65 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  eset */.){.  ret
13c00 75 72 6e 20 73 65 73 73 69 6f 6e 47 65 6e 65 72  urn sessionGener
13c10 61 74 65 43 68 61 6e 67 65 73 65 74 28 0a 20 20  ateChangeset(.  
13c20 20 20 20 20 70 53 65 73 73 69 6f 6e 2c 20 53 45      pSession, SE
13c30 53 53 49 4f 4e 53 5f 43 48 41 4e 47 45 53 45 54  SSIONS_CHANGESET
13c40 2c 20 30 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  , 0, 0, pnChange
13c50 73 65 74 2c 20 70 70 43 68 61 6e 67 65 73 65 74  set, ppChangeset
13c60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 65  );.}../*.** Stre
13c70 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66  aming version of
13c80 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
13c90 63 68 61 6e 67 65 73 65 74 28 29 2e 0a 2a 2f 0a  changeset()..*/.
13ca0 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  int sqlite3sessi
13cb0 6f 6e 5f 63 68 61 6e 67 65 73 65 74 5f 73 74 72  on_changeset_str
13cc0 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  m(.  sqlite3_ses
13cd0 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 0a  sion *pSession,.
13ce0 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29    int (*xOutput)
13cf0 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e  (void *pOut, con
13d00 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
13d10 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f  int nData),.  vo
13d20 69 64 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 72 65  id *pOut.){.  re
13d30 74 75 72 6e 20 73 65 73 73 69 6f 6e 47 65 6e 65  turn sessionGene
13d40 72 61 74 65 43 68 61 6e 67 65 73 65 74 28 0a 20  rateChangeset(. 
13d50 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2c 20 53       pSession, S
13d60 45 53 53 49 4f 4e 53 5f 43 48 41 4e 47 45 53 45  ESSIONS_CHANGESE
13d70 54 2c 20 78 4f 75 74 70 75 74 2c 20 70 4f 75 74  T, xOutput, pOut
13d80 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
13d90 2a 20 53 74 72 65 61 6d 69 6e 67 20 76 65 72 73  * Streaming vers
13da0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 73 65  ion of sqlite3se
13db0 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 29  ssion_patchset()
13dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13dd0 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74  session_patchset
13de0 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74 65 33  _strm(.  sqlite3
13df0 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
13e00 6f 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74  on,.  int (*xOut
13e10 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c  put)(void *pOut,
13e20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
13e30 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a  ta, int nData),.
13e40 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 7b 0a    void *pOut.){.
13e50 20 20 72 65 74 75 72 6e 20 73 65 73 73 69 6f 6e    return session
13e60 47 65 6e 65 72 61 74 65 43 68 61 6e 67 65 73 65  GenerateChangese
13e70 74 28 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f  t(.      pSessio
13e80 6e 2c 20 53 45 53 53 49 4f 4e 53 5f 50 41 54 43  n, SESSIONS_PATC
13e90 48 53 45 54 2c 20 78 4f 75 74 70 75 74 2c 20 70  HSET, xOutput, p
13ea0 4f 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Out, 0, 0);.}../
13eb0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70 61  *.** Obtain a pa
13ec0 74 63 68 73 65 74 20 6f 62 6a 65 63 74 20 63 6f  tchset object co
13ed0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 63 68 61  ntaining all cha
13ee0 6e 67 65 73 20 72 65 63 6f 72 64 65 64 20 62 79  nges recorded by
13ef0 20 74 68 65 20 0a 2a 2a 20 73 65 73 73 69 6f 6e   the .** session
13f00 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
13f10 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
13f20 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ment..**.** It i
13f30 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
13f40 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
13f50 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
13f60 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
13f70 20 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74   .** using sqlit
13f80 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
13f90 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  t sqlite3session
13fa0 5f 70 61 74 63 68 73 65 74 28 0a 20 20 73 71 6c  _patchset(.  sql
13fb0 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53  ite3_session *pS
13fc0 65 73 73 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20  ession,      /* 
13fd0 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  Session object *
13fe0 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 63 68  /.  int *pnPatch
13ff0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
14000 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
14010 20 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a 70   of buffer at *p
14020 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20  pChangeset */.  
14030 76 6f 69 64 20 2a 2a 70 70 50 61 74 63 68 73 65  void **ppPatchse
14040 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
14050 2f 2a 20 4f 55 54 3a 20 42 75 66 66 65 72 20 63  /* OUT: Buffer c
14060 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67 65  ontaining change
14070 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  set */.){.  retu
14080 72 6e 20 73 65 73 73 69 6f 6e 47 65 6e 65 72 61  rn sessionGenera
14090 74 65 43 68 61 6e 67 65 73 65 74 28 0a 20 20 20  teChangeset(.   
140a0 20 20 20 70 53 65 73 73 69 6f 6e 2c 20 53 45 53     pSession, SES
140b0 53 49 4f 4e 53 5f 50 41 54 43 48 53 45 54 2c 20  SIONS_PATCHSET, 
140c0 30 2c 20 30 2c 20 70 6e 50 61 74 63 68 73 65 74  0, 0, pnPatchset
140d0 2c 20 70 70 50 61 74 63 68 73 65 74 29 3b 0a 7d  , ppPatchset);.}
140e0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65 73  ..int sqlite3ses
140f0 73 69 6f 6e 5f 66 75 6c 6c 63 68 61 6e 67 65 73  sion_fullchanges
14100 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  et(.  sqlite3_se
14110 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c  ssion *pSession,
14120 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e        /* Session
14130 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
14140 20 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 20 20   *pnChangeset,  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14160 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66  OUT: Size of buf
14170 66 65 72 20 61 74 20 2a 70 70 43 68 61 6e 67 65  fer at *ppChange
14180 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a  set */.  void **
14190 70 70 43 68 61 6e 67 65 73 65 74 20 20 20 20 20  ppChangeset     
141a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
141b0 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
141c0 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a  ng changeset */.
141d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 73 73  ){.  return sess
141e0 69 6f 6e 47 65 6e 65 72 61 74 65 43 68 61 6e 67  ionGenerateChang
141f0 65 73 65 74 28 0a 20 20 20 20 20 20 70 53 65 73  eset(.      pSes
14200 73 69 6f 6e 2c 20 53 45 53 53 49 4f 4e 53 5f 46  sion, SESSIONS_F
14210 55 4c 4c 43 48 41 4e 47 45 53 45 54 2c 20 30 2c  ULLCHANGESET, 0,
14220 20 30 2c 20 70 6e 43 68 61 6e 67 65 73 65 74 2c   0, pnChangeset,
14230 20 70 70 43 68 61 6e 67 65 73 65 74 29 3b 0a 7d   ppChangeset);.}
14240 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  .../*.** Enable 
14250 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  or disable the s
14260 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61  ession object pa
14270 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
14280 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  t argument..*/.i
14290 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
142a0 6e 5f 65 6e 61 62 6c 65 28 73 71 6c 69 74 65 33  n_enable(sqlite3
142b0 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  _session *pSessi
142c0 6f 6e 2c 20 69 6e 74 20 62 45 6e 61 62 6c 65 29  on, int bEnable)
142d0 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 73  {.  int ret;.  s
142e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
142f0 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  er(sqlite3_db_mu
14300 74 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62  tex(pSession->db
14310 29 29 3b 0a 20 20 69 66 28 20 62 45 6e 61 62 6c  ));.  if( bEnabl
14320 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 73  e>=0 ){.    pSes
14330 73 69 6f 6e 2d 3e 62 45 6e 61 62 6c 65 20 3d 20  sion->bEnable = 
14340 62 45 6e 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 72  bEnable;.  }.  r
14350 65 74 20 3d 20 70 53 65 73 73 69 6f 6e 2d 3e 62  et = pSession->b
14360 45 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  Enable;.  sqlite
14370 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
14380 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 70  lite3_db_mutex(p
14390 53 65 73 73 69 6f 6e 2d 3e 64 62 29 29 3b 0a 20  Session->db));. 
143a0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
143b0 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
143c0 64 69 73 61 62 6c 65 20 74 68 65 20 73 65 73 73  disable the sess
143d0 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ion object passe
143e0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
143f0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
14400 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69  sqlite3session_i
14410 6e 64 69 72 65 63 74 28 73 71 6c 69 74 65 33 5f  ndirect(sqlite3_
14420 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  session *pSessio
14430 6e 2c 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74  n, int bIndirect
14440 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
14450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14460 74 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ter(sqlite3_db_m
14470 75 74 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64  utex(pSession->d
14480 62 29 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 69  b));.  if( bIndi
14490 72 65 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 70  rect>=0 ){.    p
144a0 53 65 73 73 69 6f 6e 2d 3e 62 49 6e 64 69 72 65  Session->bIndire
144b0 63 74 20 3d 20 62 49 6e 64 69 72 65 63 74 3b 0a  ct = bIndirect;.
144c0 20 20 7d 0a 20 20 72 65 74 20 3d 20 70 53 65 73    }.  ret = pSes
144d0 73 69 6f 6e 2d 3e 62 49 6e 64 69 72 65 63 74 3b  sion->bIndirect;
144e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
144f0 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 64  _leave(sqlite3_d
14500 62 5f 6d 75 74 65 78 28 70 53 65 73 73 69 6f 6e  b_mutex(pSession
14510 2d 3e 64 62 29 29 3b 0a 20 20 72 65 74 75 72 6e  ->db));.  return
14520 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   ret;.}../*.** R
14530 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
14540 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
14550 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6f 6e 69   changes to moni
14560 74 6f 72 65 64 20 74 61 62 6c 65 73 20 72 65 63  tored tables rec
14570 6f 72 64 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  orded.** by the 
14580 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
14590 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
145a0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  y argument..*/.i
145b0 6e 74 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  nt sqlite3sessio
145c0 6e 5f 69 73 65 6d 70 74 79 28 73 71 6c 69 74 65  n_isempty(sqlite
145d0 33 5f 73 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  3_session *pSess
145e0 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 72 65 74 20  ion){.  int ret 
145f0 3d 20 30 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61  = 0;.  SessionTa
14600 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 73 71  ble *pTab;..  sq
14610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14620 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74  r(sqlite3_db_mut
14630 65 78 28 70 53 65 73 73 69 6f 6e 2d 3e 64 62 29  ex(pSession->db)
14640 29 3b 0a 20 20 66 6f 72 28 70 54 61 62 3d 70 53  );.  for(pTab=pS
14650 65 73 73 69 6f 6e 2d 3e 70 54 61 62 6c 65 3b 20  ession->pTable; 
14660 70 54 61 62 20 26 26 20 72 65 74 3d 3d 30 3b 20  pTab && ret==0; 
14670 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e 65 78 74  pTab=pTab->pNext
14680 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 28 70 54  ){.    ret = (pT
14690 61 62 2d 3e 6e 45 6e 74 72 79 3e 30 29 3b 0a 20  ab->nEntry>0);. 
146a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
146b0 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
146c0 5f 64 62 5f 6d 75 74 65 78 28 70 53 65 73 73 69  _db_mutex(pSessi
146d0 6f 6e 2d 3e 64 62 29 29 3b 0a 0a 20 20 72 65 74  on->db));..  ret
146e0 75 72 6e 20 28 72 65 74 3d 3d 30 29 3b 0a 7d 0a  urn (ret==0);.}.
146f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 77 6f  ./*.** Do the wo
14700 72 6b 20 66 6f 72 20 65 69 74 68 65 72 20 73 71  rk for either sq
14710 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
14720 74 61 72 74 28 29 20 6f 72 20 73 74 61 72 74 5f  tart() or start_
14730 73 74 72 6d 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  strm()..*/.stati
14740 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
14750 6e 67 65 73 65 74 53 74 61 72 74 28 0a 20 20 73  ngesetStart(.  s
14760 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74  qlite3_changeset
14770 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20 2f  _iter **pp,    /
14780 2a 20 4f 55 54 3a 20 43 68 61 6e 67 65 73 65 74  * OUT: Changeset
14790 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64 6c 65   iterator handle
147a0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70   */.  int (*xInp
147b0 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76  ut)(void *pIn, v
147c0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
147d0 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  *pnData),.  void
147e0 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 6e 43 68   *pIn,.  int nCh
147f0 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20  angeset,        
14800 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14810 20 6f 66 20 62 75 66 66 65 72 20 70 43 68 61 6e   of buffer pChan
14820 67 65 73 65 74 20 69 6e 20 62 79 74 65 73 20 2a  geset in bytes *
14830 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67  /.  void *pChang
14840 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  eset,           
14850 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
14860 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
14870 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  ing changeset */
14880 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 74 20 20  .  int bInvert  
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
148b0 76 65 72 74 20 63 68 61 6e 67 65 73 65 74 20 2a  vert changeset *
148c0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  /.){.  sqlite3_c
148d0 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
148e0 52 65 74 3b 20 20 20 2f 2a 20 49 74 65 72 61 74  Ret;   /* Iterat
148f0 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  or to return */.
14900 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14930 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
14940 20 66 6f 72 20 69 74 65 72 61 74 6f 72 20 2a 2f   for iterator */
14950 0a 0a 20 20 61 73 73 65 72 74 28 20 78 49 6e 70  ..  assert( xInp
14960 75 74 3d 3d 30 20 7c 7c 20 28 70 43 68 61 6e 67  ut==0 || (pChang
14970 65 73 65 74 3d 3d 30 20 26 26 20 6e 43 68 61 6e  eset==0 && nChan
14980 67 65 73 65 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  geset==0) );..  
14990 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6f 75 74 70  /* Zero the outp
149a0 75 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 63  ut variable in c
149b0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
149c0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 20 3d 20  urs. */.  *pp = 
149d0 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
149e0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
149f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 74   the iterator st
14a00 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e 42  ructure. */.  nB
14a10 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c  yte = sizeof(sql
14a20 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
14a30 74 65 72 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  ter);.  pRet = (
14a40 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
14a50 74 5f 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33  t_iter *)sqlite3
14a60 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
14a70 20 20 69 66 28 20 21 70 52 65 74 20 29 20 72 65    if( !pRet ) re
14a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14a90 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 52 65 74  M;.  memset(pRet
14aa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
14ab0 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
14ac0 65 72 29 29 3b 0a 20 20 70 52 65 74 2d 3e 69 6e  er));.  pRet->in
14ad0 2e 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  .aData = (u8 *)p
14ae0 43 68 61 6e 67 65 73 65 74 3b 0a 20 20 70 52 65  Changeset;.  pRe
14af0 74 2d 3e 69 6e 2e 6e 44 61 74 61 20 3d 20 6e 43  t->in.nData = nC
14b00 68 61 6e 67 65 73 65 74 3b 0a 20 20 70 52 65 74  hangeset;.  pRet
14b10 2d 3e 69 6e 2e 78 49 6e 70 75 74 20 3d 20 78 49  ->in.xInput = xI
14b20 6e 70 75 74 3b 0a 20 20 70 52 65 74 2d 3e 69 6e  nput;.  pRet->in
14b30 2e 70 49 6e 20 3d 20 70 49 6e 3b 0a 20 20 70 52  .pIn = pIn;.  pR
14b40 65 74 2d 3e 69 6e 2e 62 45 6f 66 20 3d 20 28 78  et->in.bEof = (x
14b50 49 6e 70 75 74 20 3f 20 30 20 3a 20 31 29 3b 0a  Input ? 0 : 1);.
14b60 20 20 70 52 65 74 2d 3e 62 49 6e 76 65 72 74 20    pRet->bInvert 
14b70 3d 20 62 49 6e 76 65 72 74 3b 0a 0a 20 20 2f 2a  = bInvert;..  /*
14b80 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
14b90 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
14ba0 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
14bb0 2e 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 70 52 65  . */.  *pp = pRe
14bc0 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
14bd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14be0 43 72 65 61 74 65 20 61 6e 20 69 74 65 72 61 74  Create an iterat
14bf0 6f 72 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  or used to itera
14c00 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
14c10 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 63 68 61  ontents of a cha
14c20 6e 67 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ngeset..*/.int s
14c30 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
14c40 73 74 61 72 74 28 0a 20 20 73 71 6c 69 74 65 33  start(.  sqlite3
14c50 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
14c60 2a 2a 70 70 2c 20 20 20 20 2f 2a 20 4f 55 54 3a  **pp,    /* OUT:
14c70 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
14c80 74 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  tor handle */.  
14c90 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c 20  int nChangeset, 
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
14cc0 72 20 70 43 68 61 6e 67 65 73 65 74 20 69 6e 20  r pChangeset in 
14cd0 62 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  bytes */.  void 
14ce0 2a 70 43 68 61 6e 67 65 73 65 74 20 20 20 20 20  *pChangeset     
14cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14d00 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
14d10 63 6f 6e 74 61 69 6e 69 6e 67 20 63 68 61 6e 67  containing chang
14d20 65 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  eset */.){.  ret
14d30 75 72 6e 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  urn sessionChang
14d40 65 73 65 74 53 74 61 72 74 28 70 70 2c 20 30 2c  esetStart(pp, 0,
14d50 20 30 2c 20 6e 43 68 61 6e 67 65 73 65 74 2c 20   0, nChangeset, 
14d60 70 43 68 61 6e 67 65 73 65 74 2c 20 30 29 3b 0a  pChangeset, 0);.
14d70 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  }.int sqlite3cha
14d80 6e 67 65 73 65 74 5f 73 74 61 72 74 5f 76 32 28  ngeset_start_v2(
14d90 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
14da0 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20  eset_iter **pp, 
14db0 20 20 20 2f 2a 20 4f 55 54 3a 20 43 68 61 6e 67     /* OUT: Chang
14dc0 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 68 61  eset iterator ha
14dd0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ndle */.  int nC
14de0 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20  hangeset,       
14df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
14e00 65 20 6f 66 20 62 75 66 66 65 72 20 70 43 68 61  e of buffer pCha
14e10 6e 67 65 73 65 74 20 69 6e 20 62 79 74 65 73 20  ngeset in bytes 
14e20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e  */.  void *pChan
14e30 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  geset,          
14e40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
14e50 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
14e60 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
14e70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 0a 29 7b  /.  int flags.){
14e80 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 74 20 3d  .  int bInvert =
14e90 20 21 21 28 66 6c 61 67 73 20 26 20 53 51 4c 49   !!(flags & SQLI
14ea0 54 45 5f 43 48 41 4e 47 45 53 45 54 53 54 41 52  TE_CHANGESETSTAR
14eb0 54 5f 49 4e 56 45 52 54 29 3b 0a 20 20 72 65 74  T_INVERT);.  ret
14ec0 75 72 6e 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  urn sessionChang
14ed0 65 73 65 74 53 74 61 72 74 28 70 70 2c 20 30 2c  esetStart(pp, 0,
14ee0 20 30 2c 20 6e 43 68 61 6e 67 65 73 65 74 2c 20   0, nChangeset, 
14ef0 70 43 68 61 6e 67 65 73 65 74 2c 20 62 49 6e 76  pChangeset, bInv
14f00 65 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ert);.}../*.** S
14f10 74 72 65 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e  treaming version
14f20 20 6f 66 20 73 71 6c 69 74 65 33 63 68 61 6e 67   of sqlite3chang
14f30 65 73 65 74 5f 73 74 61 72 74 28 29 2e 0a 2a 2f  eset_start()..*/
14f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
14f50 67 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d  geset_start_strm
14f60 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
14f70 67 65 73 65 74 5f 69 74 65 72 20 2a 2a 70 70 2c  geset_iter **pp,
14f80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 68 61 6e      /* OUT: Chan
14f90 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 68  geset iterator h
14fa0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28  andle */.  int (
14fb0 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a 70  *xInput)(void *p
14fc0 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  In, void *pData,
14fd0 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 0a 20   int *pnData),. 
14fe0 20 76 6f 69 64 20 2a 70 49 6e 0a 29 7b 0a 20 20   void *pIn.){.  
14ff0 72 65 74 75 72 6e 20 73 65 73 73 69 6f 6e 43 68  return sessionCh
15000 61 6e 67 65 73 65 74 53 74 61 72 74 28 70 70 2c  angesetStart(pp,
15010 20 78 49 6e 70 75 74 2c 20 70 49 6e 2c 20 30 2c   xInput, pIn, 0,
15020 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
15030 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
15040 74 61 72 74 5f 76 32 5f 73 74 72 6d 28 0a 20 20  tart_v2_strm(.  
15050 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
15060 74 5f 69 74 65 72 20 2a 2a 70 70 2c 20 20 20 20  t_iter **pp,    
15070 2f 2a 20 4f 55 54 3a 20 43 68 61 6e 67 65 73 65  /* OUT: Changese
15080 74 20 69 74 65 72 61 74 6f 72 20 68 61 6e 64 6c  t iterator handl
15090 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e  e */.  int (*xIn
150a0 70 75 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20  put)(void *pIn, 
150b0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
150c0 20 2a 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69   *pnData),.  voi
150d0 64 20 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 66 6c  d *pIn,.  int fl
150e0 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20 62 49 6e  ags.){.  int bIn
150f0 76 65 72 74 20 3d 20 21 21 28 66 6c 61 67 73 20  vert = !!(flags 
15100 26 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  & SQLITE_CHANGES
15110 45 54 53 54 41 52 54 5f 49 4e 56 45 52 54 29 3b  ETSTART_INVERT);
15120 0a 20 20 72 65 74 75 72 6e 20 73 65 73 73 69 6f  .  return sessio
15130 6e 43 68 61 6e 67 65 73 65 74 53 74 61 72 74 28  nChangesetStart(
15140 70 70 2c 20 78 49 6e 70 75 74 2c 20 70 49 6e 2c  pp, xInput, pIn,
15150 20 30 2c 20 30 2c 20 62 49 6e 76 65 72 74 29 3b   0, 0, bInvert);
15160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
15170 20 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 6f 62   SessionInput ob
15180 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
15190 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
151a0 20 69 73 20 61 20 73 74 72 65 61 6d 69 6e 67 0a   is a streaming.
151b0 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  ** object and th
151c0 65 20 62 75 66 66 65 72 20 69 73 20 66 75 6c 6c  e buffer is full
151d0 2c 20 64 69 73 63 61 72 64 20 73 6f 6d 65 20 64  , discard some d
151e0 61 74 61 20 74 6f 20 66 72 65 65 20 75 70 20 73  ata to free up s
151f0 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
15200 76 6f 69 64 20 73 65 73 73 69 6f 6e 44 69 73 63  void sessionDisc
15210 61 72 64 44 61 74 61 28 53 65 73 73 69 6f 6e 49  ardData(SessionI
15220 6e 70 75 74 20 2a 70 49 6e 29 7b 0a 20 20 69 66  nput *pIn){.  if
15230 28 20 70 49 6e 2d 3e 78 49 6e 70 75 74 20 26 26  ( pIn->xInput &&
15240 20 70 49 6e 2d 3e 69 4e 65 78 74 3e 3d 73 65 73   pIn->iNext>=ses
15250 73 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b  sions_strm_chunk
15260 5f 73 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  _size ){.    int
15270 20 6e 4d 6f 76 65 20 3d 20 70 49 6e 2d 3e 62 75   nMove = pIn->bu
15280 66 2e 6e 42 75 66 20 2d 20 70 49 6e 2d 3e 69 4e  f.nBuf - pIn->iN
15290 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
152a0 20 6e 4d 6f 76 65 3e 3d 30 20 29 3b 0a 20 20 20   nMove>=0 );.   
152b0 20 69 66 28 20 6e 4d 6f 76 65 3e 30 20 29 7b 0a   if( nMove>0 ){.
152c0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49        memmove(pI
152d0 6e 2d 3e 62 75 66 2e 61 42 75 66 2c 20 26 70 49  n->buf.aBuf, &pI
152e0 6e 2d 3e 62 75 66 2e 61 42 75 66 5b 70 49 6e 2d  n->buf.aBuf[pIn-
152f0 3e 69 4e 65 78 74 5d 2c 20 6e 4d 6f 76 65 29 3b  >iNext], nMove);
15300 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 2d 3e  .    }.    pIn->
15310 62 75 66 2e 6e 42 75 66 20 2d 3d 20 70 49 6e 2d  buf.nBuf -= pIn-
15320 3e 69 4e 65 78 74 3b 0a 20 20 20 20 70 49 6e 2d  >iNext;.    pIn-
15330 3e 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >iNext = 0;.    
15340 70 49 6e 2d 3e 6e 44 61 74 61 20 3d 20 70 49 6e  pIn->nData = pIn
15350 2d 3e 62 75 66 2e 6e 42 75 66 3b 0a 20 20 7d 0a  ->buf.nBuf;.  }.
15360 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
15370 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
15380 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79  t least nByte by
15390 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  tes available in
153a0 20 74 68 65 20 62 75 66 66 65 72 2e 20 4f 72 2c   the buffer. Or,
153b0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65  .** if there are
153c0 20 6e 6f 74 20 6e 42 79 74 65 20 62 79 74 65 73   not nByte bytes
153d0 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20 74 68   remaining in th
153e0 65 20 69 6e 70 75 74 2c 20 74 68 61 74 20 61 6c  e input, that al
153f0 6c 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 64  l available.** d
15400 61 74 61 20 69 73 20 69 6e 20 74 68 65 20 62 75  ata is in the bu
15410 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ffer..**.** Retu
15420 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
15430 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
15440 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 53  ror occurs, or S
15450 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
15460 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
15470 74 20 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75  t sessionInputBu
15480 66 66 65 72 28 53 65 73 73 69 6f 6e 49 6e 70 75  ffer(SessionInpu
15490 74 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 42 79 74  t *pIn, int nByt
154a0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
154b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
154c0 70 49 6e 2d 3e 78 49 6e 70 75 74 20 29 7b 0a 20  pIn->xInput ){. 
154d0 20 20 20 77 68 69 6c 65 28 20 21 70 49 6e 2d 3e     while( !pIn->
154e0 62 45 6f 66 20 26 26 20 28 70 49 6e 2d 3e 69 4e  bEof && (pIn->iN
154f0 65 78 74 2b 6e 42 79 74 65 29 3e 3d 70 49 6e 2d  ext+nByte)>=pIn-
15500 3e 6e 44 61 74 61 20 26 26 20 72 63 3d 3d 53 51  >nData && rc==SQ
15510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15520 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73 65 73 73   int nNew = sess
15530 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f  ions_strm_chunk_
15540 73 69 7a 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  size;..      if(
15550 20 70 49 6e 2d 3e 62 4e 6f 44 69 73 63 61 72 64   pIn->bNoDiscard
15560 3d 3d 30 20 29 20 73 65 73 73 69 6f 6e 44 69 73  ==0 ) sessionDis
15570 63 61 72 64 44 61 74 61 28 70 49 6e 29 3b 0a 20  cardData(pIn);. 
15580 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
15590 4f 4b 3d 3d 73 65 73 73 69 6f 6e 42 75 66 66 65  OK==sessionBuffe
155a0 72 47 72 6f 77 28 26 70 49 6e 2d 3e 62 75 66 2c  rGrow(&pIn->buf,
155b0 20 6e 4e 65 77 2c 20 26 72 63 29 20 29 7b 0a 20   nNew, &rc) ){. 
155c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 49 6e 2d         rc = pIn-
155d0 3e 78 49 6e 70 75 74 28 70 49 6e 2d 3e 70 49 6e  >xInput(pIn->pIn
155e0 2c 20 26 70 49 6e 2d 3e 62 75 66 2e 61 42 75 66  , &pIn->buf.aBuf
155f0 5b 70 49 6e 2d 3e 62 75 66 2e 6e 42 75 66 5d 2c  [pIn->buf.nBuf],
15600 20 26 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20   &nNew);.       
15610 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 29 7b 0a   if( nNew==0 ){.
15620 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 62            pIn->b
15630 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Eof = 1;.       
15640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15650 20 20 70 49 6e 2d 3e 62 75 66 2e 6e 42 75 66 20    pIn->buf.nBuf 
15660 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
15670 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
15680 20 20 70 49 6e 2d 3e 61 44 61 74 61 20 3d 20 70    pIn->aData = p
15690 49 6e 2d 3e 62 75 66 2e 61 42 75 66 3b 0a 20 20  In->buf.aBuf;.  
156a0 20 20 20 20 70 49 6e 2d 3e 6e 44 61 74 61 20 3d      pIn->nData =
156b0 20 70 49 6e 2d 3e 62 75 66 2e 6e 42 75 66 3b 0a   pIn->buf.nBuf;.
156c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
156d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
156e0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
156f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
15700 70 52 65 63 20 70 6f 69 6e 74 73 20 74 6f 20 74  pRec points to t
15710 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 72 65  he start of a re
15720 63 6f 72 64 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  cord.** that con
15730 74 61 69 6e 73 20 6e 43 6f 6c 20 76 61 6c 75 65  tains nCol value
15740 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
15750 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 70 6f   advances the po
15760 69 6e 74 65 72 20 2a 70 70 52 65 63 0a 2a 2a 20  inter *ppRec.** 
15770 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
15780 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65  to the byte imme
15790 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
157a0 67 20 74 68 61 74 20 72 65 63 6f 72 64 2e 0a 2a  g that record..*
157b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
157c0 73 73 69 6f 6e 53 6b 69 70 52 65 63 6f 72 64 28  ssionSkipRecord(
157d0 0a 20 20 75 38 20 2a 2a 70 70 52 65 63 2c 20 20  .  u8 **ppRec,  
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 65     /* IN/OUT: Re
15800 63 6f 72 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cord pointer */.
15810 20 20 69 6e 74 20 6e 43 6f 6c 20 20 20 20 20 20    int nCol      
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
15840 61 6c 75 65 73 20 69 6e 20 72 65 63 6f 72 64 20  alues in record 
15850 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65 63  */.){.  u8 *aRec
15860 20 3d 20 2a 70 70 52 65 63 3b 0a 20 20 69 6e 74   = *ppRec;.  int
15870 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15880 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
15890 20 69 6e 74 20 65 54 79 70 65 20 3d 20 2a 61 52   int eType = *aR
158a0 65 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 65 54  ec++;.    if( eT
158b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
158c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
158d0 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
158e0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
158f0 20 61 52 65 63 20 2b 3d 20 73 65 73 73 69 6f 6e   aRec += session
15900 56 61 72 69 6e 74 47 65 74 28 28 75 38 2a 29 61  VarintGet((u8*)a
15910 52 65 63 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  Rec, &nByte);.  
15920 20 20 20 20 61 52 65 63 20 2b 3d 20 6e 42 79 74      aRec += nByt
15930 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
15940 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
15950 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d  NTEGER || eType=
15960 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
15970 0a 20 20 20 20 20 20 61 52 65 63 20 2b 3d 20 38  .      aRec += 8
15980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
15990 70 70 52 65 63 20 3d 20 61 52 65 63 3b 0a 7d 0a  ppRec = aRec;.}.
159a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
159b0 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 76 61  tion sets the va
159c0 6c 75 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  lue of the sqlit
159d0 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20  e3_value object 
159e0 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
159f0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
15a00 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
15a10 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
15a20 68 65 6c 64 20 69 6e 20 74 68 65 20 61 44 61 74  held in the aDat
15a30 61 5b 5d 20 0a 2a 2a 20 62 75 66 66 65 72 2e 20  a[] .** buffer. 
15a40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15a50 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
15a60 66 75 6c 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ful, or SQLITE_N
15a70 4f 4d 45 4d 20 69 66 20 61 6e 20 4f 4f 4d 0a 2a  OMEM if an OOM.*
15a80 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
15a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15aa0 73 73 69 6f 6e 56 61 6c 75 65 53 65 74 53 74 72  ssionValueSetStr
15ab0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  (.  sqlite3_valu
15ac0 65 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20  e *pVal,        
15ad0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76      /* Set the v
15ae0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  alue of this obj
15af0 65 63 74 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ect */.  u8 *aDa
15b00 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
15b10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
15b20 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74  er containing st
15b30 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 64 61 74  ring or blob dat
15b40 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  a */.  int nData
15b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15b60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15b70 66 20 62 75 66 66 65 72 20 61 44 61 74 61 5b 5d  f buffer aData[]
15b80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
15b90 38 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20  8 enc           
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15bb0 2a 20 53 74 72 69 6e 67 20 65 6e 63 6f 64 69 6e  * String encodin
15bc0 67 20 28 30 20 66 6f 72 20 62 6c 6f 62 73 29 20  g (0 for blobs) 
15bd0 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 6e 20 74 68  */.){.  /* In th
15be0 65 6f 72 79 20 74 68 69 73 20 63 6f 64 65 20 63  eory this code c
15bf0 6f 75 6c 64 20 6a 75 73 74 20 70 61 73 73 20 53  ould just pass S
15c00 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20  QLITE_TRANSIENT 
15c10 61 73 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  as the final.  *
15c20 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  * argument to sq
15c30 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
15c40 28 29 20 61 6e 64 20 68 61 76 65 20 74 68 65 20  () and have the 
15c50 63 6f 70 79 20 63 72 65 61 74 65 64 20 0a 20 20  copy created .  
15c60 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
15c70 2e 20 42 75 74 20 64 6f 69 6e 67 20 73 6f 20 6d  . But doing so m
15c80 61 6b 65 73 20 69 74 20 64 69 66 66 69 63 75 6c  akes it difficul
15c90 74 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  t to detect any 
15ca0 4f 4f 4d 0a 20 20 2a 2a 20 65 72 72 6f 72 2e 20  OOM.  ** error. 
15cb0 48 65 6e 63 65 20 74 68 65 20 63 6f 64 65 20 74  Hence the code t
15cc0 6f 20 63 72 65 61 74 65 20 74 68 65 20 63 6f 70  o create the cop
15cd0 79 20 65 78 74 65 72 6e 61 6c 6c 79 2e 20 2a 2f  y externally. */
15ce0 0a 20 20 75 38 20 2a 61 43 6f 70 79 20 3d 20 73  .  u8 *aCopy = s
15cf0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
15d00 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e  (sqlite3_int64)n
15d10 44 61 74 61 2b 31 29 3b 0a 20 20 69 66 28 20 61  Data+1);.  if( a
15d20 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  Copy==0 ) return
15d30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15d40 20 6d 65 6d 63 70 79 28 61 43 6f 70 79 2c 20 61   memcpy(aCopy, a
15d50 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
15d60 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
15d70 74 72 28 70 56 61 6c 2c 20 6e 44 61 74 61 2c 20  tr(pVal, nData, 
15d80 28 63 68 61 72 2a 29 61 43 6f 70 79 2c 20 65 6e  (char*)aCopy, en
15d90 63 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  c, sqlite3_free)
15da0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15db0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
15dc0 65 73 65 72 69 61 6c 69 7a 65 20 61 20 73 69 6e  eserialize a sin
15dd0 67 6c 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  gle record from 
15de0 61 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f  a buffer in memo
15df0 72 79 2e 20 53 65 65 20 22 52 45 43 4f 52 44 20  ry. See "RECORD 
15e00 46 4f 52 4d 41 54 22 0a 2a 2a 20 66 6f 72 20 64  FORMAT".** for d
15e10 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  etails..**.** Wh
15e20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15e30 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 61 43   is called, *paC
15e40 68 61 6e 67 65 20 70 6f 69 6e 74 73 20 74 6f 20  hange points to 
15e50 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15e60 20 72 65 63 6f 72 64 0a 2a 2a 20 74 6f 20 64 65   record.** to de
15e70 73 65 72 69 61 6c 69 7a 65 2e 20 41 73 73 75 6d  serialize. Assum
15e80 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
15e90 75 72 73 2c 20 2a 70 61 43 68 61 6e 67 65 20 69  urs, *paChange i
15ea0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
15eb0 6f 0a 2a 2a 20 6f 6e 65 20 62 79 74 65 20 61 66  o.** one byte af
15ec0 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
15ed0 68 65 20 73 61 6d 65 20 72 65 63 6f 72 64 20 62  he same record b
15ee0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
15ef0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
15f00 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
15f10 61 62 50 4b 20 69 73 20 4e 55 4c 4c 2c 20 74 68  abPK is NULL, th
15f20 65 6e 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  en the record co
15f30 6e 74 61 69 6e 73 20 6e 43 6f 6c 20 76 61 6c 75  ntains nCol valu
15f40 65 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 61 62  es. Or,.** if ab
15f50 50 4b 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  PK is other than
15f60 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
15f70 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20  record contains 
15f80 6f 6e 6c 79 20 74 68 65 20 50 4b 20 66 69 65 6c  only the PK fiel
15f90 64 73 0a 2a 2a 20 28 69 6e 20 6f 74 68 65 72 20  ds.** (in other 
15fa0 77 6f 72 64 73 2c 20 69 74 20 69 73 20 61 20 70  words, it is a p
15fb0 61 74 63 68 73 65 74 20 44 45 4c 45 54 45 20 72  atchset DELETE r
15fc0 65 63 6f 72 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ecord)..**.** If
15fd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
15fe0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
15ff0 20 61 70 4f 75 74 5b 5d 20 61 72 72 61 79 20 28   apOut[] array (
16000 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65  allocated by the
16010 20 63 61 6c 6c 65 72 29 0a 2a 2a 20 69 73 20 73   caller).** is s
16020 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
16030 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
16040 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
16050 67 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  g the value read
16060 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 72  .** from the cor
16070 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 73 69 74  responding posit
16080 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ion in the recor
16090 64 2e 20 49 66 20 74 68 61 74 20 76 61 6c 75 65  d. If that value
160a0 20 69 73 20 6e 6f 74 0a 2a 2a 20 69 6e 63 6c 75   is not.** inclu
160b0 64 65 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ded in the recor
160c0 64 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  d (i.e. because 
160d0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 70 61  the record is pa
160e0 72 74 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20  rt of an UPDATE 
160f0 63 68 61 6e 67 65 0a 2a 2a 20 61 6e 64 20 74 68  change.** and th
16100 65 20 66 69 65 6c 64 20 77 61 73 20 6e 6f 74 20  e field was not 
16110 6d 6f 64 69 66 69 65 64 29 2c 20 74 68 65 20 63  modified), the c
16120 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6c 65  orresponding ele
16130 6d 65 6e 74 20 6f 66 20 61 70 4f 75 74 5b 5d 20  ment of apOut[] 
16140 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c  is.** set to NUL
16150 4c 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  L..**.** It is t
16160 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
16170 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
16180 74 6f 20 66 72 65 65 20 61 6c 6c 20 73 71 6c 69  to free all sqli
16190 74 65 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  te_value structu
161a0 72 65 73 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  res.** using sql
161b0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
161c0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
161d0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
161e0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 65 2e 67   error code (e.g
161f0 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20  . SQLITE_NOMEM) 
16200 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
16210 54 68 65 20 61 70 4f 75 74 5b 5d 20 61 72 72 61  The apOut[] arra
16220 79 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  y may have been 
16230 70 61 72 74 69 61 6c 6c 79 20 70 6f 70 75 6c 61  partially popula
16240 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ted in this case
16250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16260 73 65 73 73 69 6f 6e 52 65 61 64 52 65 63 6f 72  sessionReadRecor
16270 64 28 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75  d(.  SessionInpu
16280 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 20  t *pIn,         
16290 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 64 61       /* Input da
162a0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ta */.  int nCol
162b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
162c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
162d0 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 72  r of values in r
162e0 65 63 6f 72 64 20 2a 2f 0a 20 20 75 38 20 2a 61  ecord */.  u8 *a
162f0 62 50 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  bPK,            
16300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
16310 72 61 79 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  ray of primary k
16320 65 79 20 66 6c 61 67 73 2c 20 6f 72 20 4e 55 4c  ey flags, or NUL
16330 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  L */.  sqlite3_v
16340 61 6c 75 65 20 2a 2a 61 70 4f 75 74 20 20 20 20  alue **apOut    
16350 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
16360 76 61 6c 75 65 73 20 74 6f 20 74 68 69 73 20 61  values to this a
16370 72 72 61 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rray */.){.  int
16380 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
163a0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
163b0 74 68 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20  through columns 
163c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
163d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
163e0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 72  i=0; i<nCol && r
163f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
16400 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  +){.    int eTyp
16410 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
16420 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
16430 20 76 61 6c 75 65 20 28 53 51 4c 49 54 45 5f 4e   value (SQLITE_N
16440 55 4c 4c 2c 20 54 45 58 54 20 65 74 63 2e 29 20  ULL, TEXT etc.) 
16450 2a 2f 0a 20 20 20 20 69 66 28 20 61 62 50 4b 20  */.    if( abPK 
16460 26 26 20 61 62 50 4b 5b 69 5d 3d 3d 30 20 29 20  && abPK[i]==0 ) 
16470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63  continue;.    rc
16480 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70 75 74 42   = sessionInputB
16490 75 66 66 65 72 28 70 49 6e 2c 20 39 29 3b 0a 20  uffer(pIn, 9);. 
164a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
164b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
164c0 28 20 70 49 6e 2d 3e 69 4e 65 78 74 3e 3d 70 49  ( pIn->iNext>=pI
164d0 6e 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  n->nData ){.    
164e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
164f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
16500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16510 20 20 20 65 54 79 70 65 20 3d 20 70 49 6e 2d 3e     eType = pIn->
16520 61 44 61 74 61 5b 70 49 6e 2d 3e 69 4e 65 78 74  aData[pIn->iNext
16530 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ++];.        ass
16540 65 72 74 28 20 61 70 4f 75 74 5b 69 5d 3d 3d 30  ert( apOut[i]==0
16550 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
16560 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20  eType ){.       
16570 20 20 20 61 70 4f 75 74 5b 69 5d 20 3d 20 73 71     apOut[i] = sq
16580 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
16590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
165a0 21 61 70 4f 75 74 5b 69 5d 20 29 20 72 63 20 3d  !apOut[i] ) rc =
165b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
165c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
165d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
165e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
165f0 0a 20 20 20 20 20 20 75 38 20 2a 61 56 61 6c 20  .      u8 *aVal 
16600 3d 20 26 70 49 6e 2d 3e 61 44 61 74 61 5b 70 49  = &pIn->aData[pI
16610 6e 2d 3e 69 4e 65 78 74 5d 3b 0a 20 20 20 20 20  n->iNext];.     
16620 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
16630 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
16640 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
16650 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
16660 74 65 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d  te;.        pIn-
16670 3e 69 4e 65 78 74 20 2b 3d 20 73 65 73 73 69 6f  >iNext += sessio
16680 6e 56 61 72 69 6e 74 47 65 74 28 61 56 61 6c 2c  nVarintGet(aVal,
16690 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
166a0 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e    rc = sessionIn
166b0 70 75 74 42 75 66 66 65 72 28 70 49 6e 2c 20 6e  putBuffer(pIn, n
166c0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
166d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
166e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
166f0 28 20 6e 42 79 74 65 3c 30 20 7c 7c 20 6e 42 79  ( nByte<0 || nBy
16700 74 65 3e 70 49 6e 2d 3e 6e 44 61 74 61 2d 70 49  te>pIn->nData-pI
16710 6e 2d 3e 69 4e 65 78 74 20 29 7b 0a 20 20 20 20  n->iNext ){.    
16720 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16730 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
16750 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  e{.            u
16760 38 20 65 6e 63 20 3d 20 28 65 54 79 70 65 3d 3d  8 enc = (eType==
16770 53 51 4c 49 54 45 5f 54 45 58 54 20 3f 20 53 51  SQLITE_TEXT ? SQ
16780 4c 49 54 45 5f 55 54 46 38 20 3a 20 30 29 3b 0a  LITE_UTF8 : 0);.
16790 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
167a0 20 73 65 73 73 69 6f 6e 56 61 6c 75 65 53 65 74   sessionValueSet
167b0 53 74 72 28 61 70 4f 75 74 5b 69 5d 2c 26 70 49  Str(apOut[i],&pI
167c0 6e 2d 3e 61 44 61 74 61 5b 70 49 6e 2d 3e 69 4e  n->aData[pIn->iN
167d0 65 78 74 5d 2c 6e 42 79 74 65 2c 65 6e 63 29 3b  ext],nByte,enc);
167e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
167f0 2d 3e 69 4e 65 78 74 20 2b 3d 20 6e 42 79 74 65  ->iNext += nByte
16800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16820 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
16830 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
16840 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
16850 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
16860 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16870 76 20 3d 20 73 65 73 73 69 6f 6e 47 65 74 49 36  v = sessionGetI6
16880 34 28 61 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  4(aVal);.       
16890 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
168a0 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
168b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
168c0 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 61  dbeMemSetInt64(a
168d0 70 4f 75 74 5b 69 5d 2c 20 76 29 3b 0a 20 20 20  pOut[i], v);.   
168e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
168f0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 64 3b 0a        double d;.
16900 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
16910 28 26 64 2c 20 26 76 2c 20 38 29 3b 0a 20 20 20  (&d, &v, 8);.   
16920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16930 62 65 4d 65 6d 53 65 74 44 6f 75 62 6c 65 28 61  beMemSetDouble(a
16940 70 4f 75 74 5b 69 5d 2c 20 64 29 3b 0a 20 20 20  pOut[i], d);.   
16950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16960 49 6e 2d 3e 69 4e 65 78 74 20 2b 3d 20 38 3b 0a  In->iNext += 8;.
16970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16980 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
16990 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
169a0 75 74 20 70 6f 69 6e 74 65 72 20 63 75 72 72 65  ut pointer curre
169b0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
169c0 68 65 20 73 65 63 6f 6e 64 20 62 79 74 65 20 6f  he second byte o
169d0 66 20 61 20 74 61 62 6c 65 2d 68 65 61 64 65 72  f a table-header
169e0 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c  ..** Specificall
169f0 79 2c 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  y, to the follow
16a00 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 6e  ing:.**.**   + n
16a10 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16a20 20 69 6e 20 74 61 62 6c 65 20 28 76 61 72 69 6e   in table (varin
16a30 74 29 0a 2a 2a 20 20 20 2b 20 61 72 72 61 79 20  t).**   + array 
16a40 6f 66 20 50 4b 20 66 6c 61 67 73 20 28 31 20 62  of PK flags (1 b
16a50 79 74 65 20 70 65 72 20 63 6f 6c 75 6d 6e 29 2c  yte per column),
16a60 0a 2a 2a 20 20 20 2b 20 74 61 62 6c 65 20 6e 61  .**   + table na
16a70 6d 65 20 28 6e 75 6c 20 74 65 72 6d 69 6e 61 74  me (nul terminat
16a80 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed)..**.** This 
16a90 66 75 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73  function ensures
16aa0 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65   that all of the
16ab0 20 61 62 6f 76 65 20 69 73 20 70 72 65 73 65 6e   above is presen
16ac0 74 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 0a  t in the input .
16ad0 2a 2a 20 62 75 66 66 65 72 20 28 69 2e 65 2e 20  ** buffer (i.e. 
16ae0 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61  that it can be a
16af0 63 63 65 73 73 65 64 20 77 69 74 68 6f 75 74 20  ccessed without 
16b00 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 78 49 6e  any calls to xIn
16b10 70 75 74 28 29 29 2e 0a 2a 2a 20 49 66 20 73 75  put())..** If su
16b20 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
16b30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16b40 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
16b50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16b60 2e 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70  ..** The input p
16b70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 6d 6f  ointer is not mo
16b80 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
16b90 6e 74 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65  nt sessionChange
16ba0 73 65 74 42 75 66 66 65 72 54 62 6c 68 64 72 28  setBufferTblhdr(
16bb0 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 2a 70 49  SessionInput *pI
16bc0 6e 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b  n, int *pnByte){
16bd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16be0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 6f  TE_OK;.  int nCo
16bf0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  l = 0;.  int nRe
16c00 61 64 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  ad = 0;..  rc = 
16c10 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66 66  sessionInputBuff
16c20 65 72 28 70 49 6e 2c 20 39 29 3b 0a 20 20 69 66  er(pIn, 9);.  if
16c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 2b 3d 20  ){.    nRead += 
16c50 73 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74  sessionVarintGet
16c60 28 26 70 49 6e 2d 3e 61 44 61 74 61 5b 70 49 6e  (&pIn->aData[pIn
16c70 2d 3e 69 4e 65 78 74 20 2b 20 6e 52 65 61 64 5d  ->iNext + nRead]
16c80 2c 20 26 6e 43 6f 6c 29 3b 0a 20 20 20 20 2f 2a  , &nCol);.    /*
16c90 20 54 68 65 20 68 61 72 64 20 75 70 70 65 72 20   The hard upper 
16ca0 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20 6e 75  limit for the nu
16cb0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16cc0 69 6e 20 61 6e 20 53 51 4c 69 74 65 0a 20 20 20  in an SQLite.   
16cd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
16ce0 6c 65 20 69 73 2c 20 61 63 63 6f 72 64 69 6e 67  le is, according
16cf0 20 74 6f 20 73 71 6c 69 74 65 4c 69 6d 69 74 2e   to sqliteLimit.
16d00 68 2c 20 33 32 36 37 36 2e 20 53 6f 20 0a 20 20  h, 32676. So .  
16d10 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 61 6e    ** consider an
16d20 79 20 74 61 62 6c 65 2d 68 65 61 64 65 72 20 74  y table-header t
16d30 68 61 74 20 70 75 72 70 6f 72 74 73 20 74 6f 20  hat purports to 
16d40 68 61 76 65 20 6d 6f 72 65 20 74 68 61 6e 20 36  have more than 6
16d50 35 35 33 36 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  5536 .    ** col
16d60 75 6d 6e 73 20 74 6f 20 62 65 20 63 6f 72 72 75  umns to be corru
16d70 70 74 2e 20 54 68 69 73 20 69 73 20 63 6f 6e 76  pt. This is conv
16d80 65 6e 69 65 6e 74 20 62 65 63 61 75 73 65 20 6f  enient because o
16d90 74 68 65 72 77 69 73 65 2c 20 0a 20 20 20 20 2a  therwise, .    *
16da0 2a 20 69 66 20 74 68 65 20 28 6e 43 6f 6c 3e 36  * if the (nCol>6
16db0 35 35 33 36 29 20 63 6f 6e 64 69 74 69 6f 6e 20  5536) condition 
16dc0 62 65 6c 6f 77 20 77 65 72 65 20 6f 6d 69 74 74  below were omitt
16dd0 65 64 2c 20 61 20 73 75 66 66 69 63 69 65 6e 74  ed, a sufficient
16de0 6c 79 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  ly .    ** large
16df0 20 76 61 6c 75 65 20 66 6f 72 20 6e 43 6f 6c 20   value for nCol 
16e00 6d 61 79 20 63 61 75 73 65 20 6e 52 65 61 64 20  may cause nRead 
16e10 74 6f 20 77 72 61 70 20 61 72 6f 75 6e 64 20 61  to wrap around a
16e20 6e 64 20 62 65 63 6f 6d 65 20 0a 20 20 20 20 2a  nd become .    *
16e30 2a 20 6e 65 67 61 74 69 76 65 2e 20 4c 65 61 64  * negative. Lead
16e40 69 6e 67 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ing to a crash. 
16e50 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3c  */.    if( nCol<
16e60 30 20 7c 7c 20 6e 43 6f 6c 3e 36 35 35 33 36 20  0 || nCol>65536 
16e70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16e80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16e90 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
16ea0 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
16eb0 49 6e 70 75 74 42 75 66 66 65 72 28 70 49 6e 2c  InputBuffer(pIn,
16ec0 20 6e 52 65 61 64 2b 6e 43 6f 6c 2b 31 30 30 29   nRead+nCol+100)
16ed0 3b 0a 20 20 20 20 20 20 6e 52 65 61 64 20 2b 3d  ;.      nRead +=
16ee0 20 6e 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d   nCol;.    }.  }
16ef0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
16f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f10 77 68 69 6c 65 28 20 28 70 49 6e 2d 3e 69 4e 65  while( (pIn->iNe
16f20 78 74 20 2b 20 6e 52 65 61 64 29 3c 70 49 6e 2d  xt + nRead)<pIn-
16f30 3e 6e 44 61 74 61 20 26 26 20 70 49 6e 2d 3e 61  >nData && pIn->a
16f40 44 61 74 61 5b 70 49 6e 2d 3e 69 4e 65 78 74 20  Data[pIn->iNext 
16f50 2b 20 6e 52 65 61 64 5d 20 29 7b 0a 20 20 20 20  + nRead] ){.    
16f60 20 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d    nRead++;.    }
16f70 0a 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e 69  .    if( (pIn->i
16f80 4e 65 78 74 20 2b 20 6e 52 65 61 64 29 3c 70 49  Next + nRead)<pI
16f90 6e 2d 3e 6e 44 61 74 61 20 29 20 62 72 65 61 6b  n->nData ) break
16fa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69  ;.    rc = sessi
16fb0 6f 6e 49 6e 70 75 74 42 75 66 66 65 72 28 70 49  onInputBuffer(pI
16fc0 6e 2c 20 6e 52 65 61 64 20 2b 20 31 30 30 29 3b  n, nRead + 100);
16fd0 0a 20 20 7d 0a 20 20 2a 70 6e 42 79 74 65 20 3d  .  }.  *pnByte =
16fe0 20 6e 52 65 61 64 2b 31 3b 0a 20 20 72 65 74 75   nRead+1;.  retu
16ff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17000 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
17010 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
17020 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
17030 62 79 74 65 20 6f 66 20 74 68 65 20 66 69 72 73  byte of the firs
17040 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 61 20  t field.** of a 
17050 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e  record consistin
17060 67 20 6f 66 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  g of nCol column
17070 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
17080 20 65 6e 73 75 72 65 73 20 74 68 65 20 65 6e 74   ensures the ent
17090 69 72 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  ire.** record is
170a0 20 62 75 66 66 65 72 65 64 2e 20 49 74 20 64 6f   buffered. It do
170b0 65 73 20 6e 6f 74 20 6d 6f 76 65 20 74 68 65 20  es not move the 
170c0 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 2e 0a 2a  input pointer..*
170d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
170e0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
170f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
17100 6e 42 79 74 65 20 69 73 20 73 65 74 20 74 6f 20  nByte is set to 
17110 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  the size of.** t
17120 68 65 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74  he record in byt
17130 65 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  es. Otherwise, a
17140 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
17150 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
17160 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61   The.** final va
17170 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 20 69  lue of *pnByte i
17180 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
17190 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
171a0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43  tic int sessionC
171b0 68 61 6e 67 65 73 65 74 42 75 66 66 65 72 52 65  hangesetBufferRe
171c0 63 6f 72 64 28 0a 20 20 53 65 73 73 69 6f 6e 49  cord(.  SessionI
171d0 6e 70 75 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  nput *pIn,      
171e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
171f0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
17200 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
17210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17220 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17230 69 6e 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  in record */.  i
17240 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20  nt *pnByte      
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17260 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 72  * OUT: Size of r
17270 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a  ecord in bytes *
17280 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
17290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
172a0 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 6e   nByte = 0;.  in
172b0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
172c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
172d0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
172e0 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
172f0 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e    rc = sessionIn
17300 70 75 74 42 75 66 66 65 72 28 70 49 6e 2c 20 6e  putBuffer(pIn, n
17310 42 79 74 65 20 2b 20 31 30 29 3b 0a 20 20 20 20  Byte + 10);.    
17320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17330 4b 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  K ){.      eType
17340 20 3d 20 70 49 6e 2d 3e 61 44 61 74 61 5b 70 49   = pIn->aData[pI
17350 6e 2d 3e 69 4e 65 78 74 20 2b 20 6e 42 79 74 65  n->iNext + nByte
17360 2b 2b 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ++];.      if( e
17370 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
17380 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  T || eType==SQLI
17390 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
173a0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
173b0 20 20 6e 42 79 74 65 20 2b 3d 20 73 65 73 73 69    nByte += sessi
173c0 6f 6e 56 61 72 69 6e 74 47 65 74 28 26 70 49 6e  onVarintGet(&pIn
173d0 2d 3e 61 44 61 74 61 5b 70 49 6e 2d 3e 69 4e 65  ->aData[pIn->iNe
173e0 78 74 2b 6e 42 79 74 65 5d 2c 20 26 6e 29 3b 0a  xt+nByte], &n);.
173f0 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d          nByte +=
17400 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   n;.        rc =
17410 20 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66   sessionInputBuf
17420 66 65 72 28 70 49 6e 2c 20 6e 42 79 74 65 29 3b  fer(pIn, nByte);
17430 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17440 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
17450 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d  NTEGER || eType=
17460 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
17470 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b  .        nByte +
17480 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 8;.      }.   
17490 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 42 79 74 65   }.  }.  *pnByte
174a0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75   = nByte;.  retu
174b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
174c0 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
174d0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
174e0 74 73 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  ts to the second
174f0 20 62 79 74 65 20 6f 66 20 61 20 74 61 62 6c 65   byte of a table
17500 2d 68 65 61 64 65 72 2e 0a 2a 2a 20 53 70 65 63  -header..** Spec
17510 69 66 69 63 61 6c 6c 79 2c 20 74 6f 20 74 68 65  ifically, to the
17520 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
17530 2a 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20  *   + number of 
17540 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
17550 20 28 76 61 72 69 6e 74 29 0a 2a 2a 20 20 20 2b   (varint).**   +
17560 20 61 72 72 61 79 20 6f 66 20 50 4b 20 66 6c 61   array of PK fla
17570 67 73 20 28 31 20 62 79 74 65 20 70 65 72 20 63  gs (1 byte per c
17580 6f 6c 75 6d 6e 29 2c 0a 2a 2a 20 20 20 2b 20 74  olumn),.**   + t
17590 61 62 6c 65 20 6e 61 6d 65 20 28 6e 75 6c 20 74  able name (nul t
175a0 65 72 6d 69 6e 61 74 65 64 29 2e 0a 2a 2a 0a 2a  erminated)..**.*
175b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
175c0 64 65 63 6f 64 65 73 20 74 68 65 20 74 61 62 6c  decodes the tabl
175d0 65 2d 68 65 61 64 65 72 20 61 6e 64 20 70 6f 70  e-header and pop
175e0 75 6c 61 74 65 73 20 74 68 65 20 70 2d 3e 6e 43  ulates the p->nC
175f0 6f 6c 2c 20 0a 2a 2a 20 70 2d 3e 7a 54 61 62 20  ol, .** p->zTab 
17600 61 6e 64 20 70 2d 3e 61 62 50 4b 5b 5d 20 76 61  and p->abPK[] va
17610 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64 69 6e  riables accordin
17620 67 6c 79 2e 20 54 68 65 20 70 2d 3e 61 70 56 61  gly. The p->apVa
17630 6c 75 65 5b 5d 20 61 72 72 61 79 20 69 73 20 0a  lue[] array is .
17640 2a 2a 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  ** also allocate
17650 64 20 6f 72 20 72 65 73 69 7a 65 64 20 61 63 63  d or resized acc
17660 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  ording to the ne
17670 77 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 43  w value of p->nC
17680 6f 6c 2e 20 54 68 65 0a 2a 2a 20 69 6e 70 75 74  ol. The.** input
17690 20 70 6f 69 6e 74 65 72 20 69 73 20 6c 65 66 74   pointer is left
176a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
176b0 20 62 79 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   byte following 
176c0 74 68 65 20 74 61 62 6c 65 20 68 65 61 64 65 72  the table header
176d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
176e0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
176f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
17700 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
17710 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  te error code.**
17720 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
17730 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   the final value
17740 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  s of the various
17750 20 66 69 65 6c 64 73 20 65 6e 75 6d 65 72 61 74   fields enumerat
17760 65 64 20 61 62 6f 76 65 0a 2a 2a 20 61 72 65 20  ed above.** are 
17770 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
17780 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
17790 43 68 61 6e 67 65 73 65 74 52 65 61 64 54 62 6c  ChangesetReadTbl
177a0 68 64 72 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  hdr(sqlite3_chan
177b0 67 65 73 65 74 5f 69 74 65 72 20 2a 70 29 7b 0a  geset_iter *p){.
177c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
177d0 6e 43 6f 70 79 3b 0a 20 20 61 73 73 65 72 74 28  nCopy;.  assert(
177e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
177f0 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 65 73  K );..  rc = ses
17800 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 42 75 66  sionChangesetBuf
17810 66 65 72 54 62 6c 68 64 72 28 26 70 2d 3e 69 6e  ferTblhdr(&p->in
17820 2c 20 26 6e 43 6f 70 79 29 3b 0a 20 20 69 66 28  , &nCopy);.  if(
17830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17840 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
17850 0a 20 20 20 20 69 6e 74 20 6e 56 61 72 69 6e 74  .    int nVarint
17860 3b 0a 20 20 20 20 6e 56 61 72 69 6e 74 20 3d 20  ;.    nVarint = 
17870 73 65 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74  sessionVarintGet
17880 28 26 70 2d 3e 69 6e 2e 61 44 61 74 61 5b 70 2d  (&p->in.aData[p-
17890 3e 69 6e 2e 69 4e 65 78 74 5d 2c 20 26 70 2d 3e  >in.iNext], &p->
178a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  nCol);.    if( p
178b0 2d 3e 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ->nCol>0 ){.    
178c0 20 20 6e 43 6f 70 79 20 2d 3d 20 6e 56 61 72 69    nCopy -= nVari
178d0 6e 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 2e  nt;.      p->in.
178e0 69 4e 65 78 74 20 2b 3d 20 6e 56 61 72 69 6e 74  iNext += nVarint
178f0 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ;.      nByte = 
17900 70 2d 3e 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  p->nCol * sizeof
17910 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
17920 20 2a 20 32 20 2b 20 6e 43 6f 70 79 3b 0a 20 20   * 2 + nCopy;.  
17930 20 20 20 20 70 2d 3e 74 62 6c 68 64 72 2e 6e 42      p->tblhdr.nB
17940 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  uf = 0;.      se
17950 73 73 69 6f 6e 42 75 66 66 65 72 47 72 6f 77 28  ssionBufferGrow(
17960 26 70 2d 3e 74 62 6c 68 64 72 2c 20 6e 42 79 74  &p->tblhdr, nByt
17970 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 65 6c  e, &rc);.    }el
17980 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
17990 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
179a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
179b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
179c0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50  OK ){.    int iP
179d0 4b 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  K = sizeof(sqlit
179e0 65 33 5f 76 61 6c 75 65 2a 29 2a 70 2d 3e 6e 43  e3_value*)*p->nC
179f0 6f 6c 2a 32 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ol*2;.    memset
17a00 28 70 2d 3e 74 62 6c 68 64 72 2e 61 42 75 66 2c  (p->tblhdr.aBuf,
17a10 20 30 2c 20 69 50 4b 29 3b 0a 20 20 20 20 6d 65   0, iPK);.    me
17a20 6d 63 70 79 28 26 70 2d 3e 74 62 6c 68 64 72 2e  mcpy(&p->tblhdr.
17a30 61 42 75 66 5b 69 50 4b 5d 2c 20 26 70 2d 3e 69  aBuf[iPK], &p->i
17a40 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e  n.aData[p->in.iN
17a50 65 78 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  ext], nCopy);.  
17a60 20 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 20 2b 3d    p->in.iNext +=
17a70 20 6e 43 6f 70 79 3b 0a 20 20 7d 0a 0a 20 20 70   nCopy;.  }..  p
17a80 2d 3e 61 70 56 61 6c 75 65 20 3d 20 28 73 71 6c  ->apValue = (sql
17a90 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 70 2d 3e  ite3_value**)p->
17aa0 74 62 6c 68 64 72 2e 61 42 75 66 3b 0a 20 20 70  tblhdr.aBuf;.  p
17ab0 2d 3e 61 62 50 4b 20 3d 20 28 75 38 2a 29 26 70  ->abPK = (u8*)&p
17ac0 2d 3e 61 70 56 61 6c 75 65 5b 70 2d 3e 6e 43 6f  ->apValue[p->nCo
17ad0 6c 2a 32 5d 3b 0a 20 20 70 2d 3e 7a 54 61 62 20  l*2];.  p->zTab 
17ae0 3d 20 28 63 68 61 72 2a 29 26 70 2d 3e 61 62 50  = (char*)&p->abP
17af0 4b 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 72 65  K[p->nCol];.  re
17b00 74 75 72 6e 20 28 70 2d 3e 72 63 20 3d 20 72 63  turn (p->rc = rc
17b10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
17b20 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 65  nce the changese
17b30 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  t iterator to th
17b40 65 20 6e 65 78 74 20 63 68 61 6e 67 65 2e 0a 2a  e next change..*
17b50 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 70 61 52  *.** If both paR
17b60 65 63 20 61 6e 64 20 70 6e 52 65 63 20 61 72 65  ec and pnRec are
17b70 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
17b80 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
17b90 6c 69 6b 65 20 74 68 65 20 70 75 62 6c 69 63 0a  like the public.
17ba0 2a 2a 20 41 50 49 20 73 71 6c 69 74 65 33 63 68  ** API sqlite3ch
17bb0 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29 2e 20  angeset_next(). 
17bc0 49 66 20 53 51 4c 49 54 45 5f 52 4f 57 20 69 73  If SQLITE_ROW is
17bd0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
17be0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  the.** sqlite3ch
17bf0 61 6e 67 65 73 65 74 5f 6e 65 77 28 29 20 61 6e  angeset_new() an
17c00 64 20 6f 6c 64 28 29 20 41 50 49 73 20 6d 61 79  d old() APIs may
17c10 20 62 65 20 75 73 65 64 20 74 6f 20 71 75 65 72   be used to quer
17c20 79 20 66 6f 72 20 76 61 6c 75 65 73 2e 0a 2a 2a  y for values..**
17c30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17c40 66 20 70 61 52 65 63 20 61 6e 64 20 70 6e 52 65  f paRec and pnRe
17c50 63 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20  c are not NULL, 
17c60 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
17c70 6f 20 74 68 65 20 63 68 61 6e 67 65 0a 2a 2a 20  o the change.** 
17c80 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
17c90 6e 20 74 6f 20 2a 70 61 52 65 63 20 62 65 66 6f  n to *paRec befo
17ca0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 64  re returning and
17cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17cc0 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 72  ytes in.** the r
17cd0 65 63 6f 72 64 20 74 6f 20 2a 70 6e 52 65 63 2e  ecord to *pnRec.
17ce0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  .**.** Either wa
17cf0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
17d00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
17d10 52 4f 57 20 69 66 20 74 68 65 20 69 74 65 72 61  ROW if the itera
17d20 74 6f 72 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  tor is .** succe
17d30 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65 64  ssfully advanced
17d40 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61   to the next cha
17d50 6e 67 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67  nge in the chang
17d60 65 73 65 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  eset, an SQLite 
17d70 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
17d80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
17d90 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 4f 4e  s, or SQLITE_DON
17da0 45 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  E if there are n
17db0 6f 20 66 75 72 74 68 65 72 20 0a 2a 2a 20 63 68  o further .** ch
17dc0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68 61  anges in the cha
17dd0 6e 67 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  ngeset..*/.stati
17de0 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
17df0 6e 67 65 73 65 74 4e 65 78 74 28 0a 20 20 73 71  ngesetNext(.  sq
17e00 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
17e10 69 74 65 72 20 2a 70 2c 20 20 20 20 20 20 2f 2a  iter *p,      /*
17e20 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
17e30 74 6f 72 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61  tor */.  u8 **pa
17e40 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
17e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
17e60 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 72  on-NULL, store r
17e70 65 63 6f 72 64 20 70 6f 69 6e 74 65 72 20 68 65  ecord pointer he
17e80 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  re */.  int *pnR
17e90 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
17ea0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
17eb0 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 73 69  n-NULL, store si
17ec0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 72  ze of record her
17ed0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
17ee0 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
17ef0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
17f00 2d 4e 55 4c 4c 2c 20 74 72 75 65 20 69 66 20 6e  -NULL, true if n
17f10 65 77 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  ew table */.){. 
17f20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 6f 70 3b   int i;.  u8 op;
17f30 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 52  ..  assert( (paR
17f40 65 63 3d 3d 30 20 26 26 20 70 6e 52 65 63 3d 3d  ec==0 && pnRec==
17f50 30 29 20 7c 7c 20 28 70 61 52 65 63 20 26 26 20  0) || (paRec && 
17f60 70 6e 52 65 63 29 20 29 3b 0a 0a 20 20 2f 2a 20  pnRec) );..  /* 
17f70 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
17f80 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  is in the error-
17f90 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 69 6d  state, return im
17fa0 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  mediately. */.  
17fb0 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
17fc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 2d  E_OK ) return p-
17fd0 3e 72 63 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  >rc;..  /* Free 
17fe0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
17ff0 65 6e 74 73 20 6f 66 20 70 2d 3e 61 70 56 61 6c  ents of p->apVal
18000 75 65 5b 5d 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ue[], if any. */
18010 0a 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c 75  .  if( p->apValu
18020 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
18030 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 2a 32 3b 20 69  ; i<p->nCol*2; i
18040 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
18050 65 33 56 61 6c 75 65 46 72 65 65 28 70 2d 3e 61  e3ValueFree(p->a
18060 70 56 61 6c 75 65 5b 69 5d 29 3b 0a 20 20 20 20  pValue[i]);.    
18070 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  }.    memset(p->
18080 61 70 56 61 6c 75 65 2c 20 30 2c 20 73 69 7a 65  apValue, 0, size
18090 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
180a0 2a 29 2a 70 2d 3e 6e 43 6f 6c 2a 32 29 3b 0a 20  *)*p->nCol*2);. 
180b0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
180c0 72 65 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  re the buffer co
180d0 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
180e0 31 30 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75  10 bytes of inpu
180f0 74 20 64 61 74 61 2c 20 6f 72 20 61 6c 6c 0a 20  t data, or all. 
18100 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 64 61   ** remaining da
18110 74 61 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ta if there are 
18120 6c 65 73 73 20 74 68 61 6e 20 31 30 20 62 79 74  less than 10 byt
18130 65 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  es available. Th
18140 69 73 20 69 73 0a 20 20 2a 2a 20 73 75 66 66 69  is is.  ** suffi
18150 63 69 65 6e 74 20 65 69 74 68 65 72 20 66 6f 72  cient either for
18160 20 74 68 65 20 27 54 27 20 6f 72 20 27 50 27 20   the 'T' or 'P' 
18170 62 79 74 65 20 61 6e 64 20 74 68 65 20 76 61 72  byte and the var
18180 69 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  int that follows
18190 0a 20 20 2a 2a 20 69 74 2c 20 6f 72 20 66 6f 72  .  ** it, or for
181a0 20 74 68 65 20 74 77 6f 20 73 69 6e 67 6c 65 20   the two single 
181b0 62 79 74 65 20 76 61 6c 75 65 73 20 6f 74 68 65  byte values othe
181c0 72 77 69 73 65 2e 20 2a 2f 0a 20 20 70 2d 3e 72  rwise. */.  p->r
181d0 63 20 3d 20 73 65 73 73 69 6f 6e 49 6e 70 75 74  c = sessionInput
181e0 42 75 66 66 65 72 28 26 70 2d 3e 69 6e 2c 20 32  Buffer(&p->in, 2
181f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
18200 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18210 72 6e 20 70 2d 3e 72 63 3b 0a 0a 20 20 2f 2a 20  rn p->rc;..  /* 
18220 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
18230 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 74 68  is already at th
18240 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 68 61  e end of the cha
18250 6e 67 65 73 65 74 2c 20 72 65 74 75 72 6e 20 44  ngeset, return D
18260 4f 4e 45 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ONE. */.  if( p-
18270 3e 69 6e 2e 69 4e 65 78 74 3e 3d 70 2d 3e 69 6e  >in.iNext>=p->in
18280 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  .nData ){.    re
18290 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
182a0 3b 0a 20 20 7d 0a 0a 20 20 73 65 73 73 69 6f 6e  ;.  }..  session
182b0 44 69 73 63 61 72 64 44 61 74 61 28 26 70 2d 3e  DiscardData(&p->
182c0 69 6e 29 3b 0a 20 20 70 2d 3e 69 6e 2e 69 43 75  in);.  p->in.iCu
182d0 72 72 65 6e 74 20 3d 20 70 2d 3e 69 6e 2e 69 4e  rrent = p->in.iN
182e0 65 78 74 3b 0a 0a 20 20 6f 70 20 3d 20 70 2d 3e  ext;..  op = p->
182f0 69 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69  in.aData[p->in.i
18300 4e 65 78 74 2b 2b 5d 3b 0a 20 20 77 68 69 6c 65  Next++];.  while
18310 28 20 6f 70 3d 3d 27 54 27 20 7c 7c 20 6f 70 3d  ( op=='T' || op=
18320 3d 27 50 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='P' ){.    if( 
18330 70 62 4e 65 77 20 29 20 2a 70 62 4e 65 77 20 3d  pbNew ) *pbNew =
18340 20 31 3b 0a 20 20 20 20 70 2d 3e 62 50 61 74 63   1;.    p->bPatc
18350 68 73 65 74 20 3d 20 28 6f 70 3d 3d 27 50 27 29  hset = (op=='P')
18360 3b 0a 20 20 20 20 69 66 28 20 73 65 73 73 69 6f  ;.    if( sessio
18370 6e 43 68 61 6e 67 65 73 65 74 52 65 61 64 54 62  nChangesetReadTb
18380 6c 68 64 72 28 70 29 20 29 20 72 65 74 75 72 6e  lhdr(p) ) return
18390 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20   p->rc;.    if( 
183a0 28 70 2d 3e 72 63 20 3d 20 73 65 73 73 69 6f 6e  (p->rc = session
183b0 49 6e 70 75 74 42 75 66 66 65 72 28 26 70 2d 3e  InputBuffer(&p->
183c0 69 6e 2c 20 32 29 29 20 29 20 72 65 74 75 72 6e  in, 2)) ) return
183d0 20 70 2d 3e 72 63 3b 0a 20 20 20 20 70 2d 3e 69   p->rc;.    p->i
183e0 6e 2e 69 43 75 72 72 65 6e 74 20 3d 20 70 2d 3e  n.iCurrent = p->
183f0 69 6e 2e 69 4e 65 78 74 3b 0a 20 20 20 20 69 66  in.iNext;.    if
18400 28 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 3e 3d 70  ( p->in.iNext>=p
18410 2d 3e 69 6e 2e 6e 44 61 74 61 20 29 20 72 65 74  ->in.nData ) ret
18420 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
18430 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 69 6e 2e  .    op = p->in.
18440 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e 65 78  aData[p->in.iNex
18450 74 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  t++];.  }..  if(
18460 20 70 2d 3e 7a 54 61 62 3d 3d 30 20 7c 7c 20 28   p->zTab==0 || (
18470 70 2d 3e 62 50 61 74 63 68 73 65 74 20 26 26 20  p->bPatchset && 
18480 70 2d 3e 62 49 6e 76 65 72 74 29 20 29 7b 0a 20  p->bInvert) ){. 
18490 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
184a0 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 68  record in the ch
184b0 61 6e 67 65 73 65 74 20 69 73 20 6e 6f 74 20 61  angeset is not a
184c0 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20 4d   table header. M
184d0 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20  ust be a.    ** 
184e0 63 6f 72 72 75 70 74 20 63 68 61 6e 67 65 73 65  corrupt changese
184f0 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
18500 28 20 70 2d 3e 69 6e 2e 69 4e 65 78 74 3d 3d 31  ( p->in.iNext==1
18510 20 7c 7c 20 70 2d 3e 7a 54 61 62 20 29 3b 0a 20   || p->zTab );. 
18520 20 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63     return (p->rc
18530 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18540 54 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 0a 20 20  T_BKPT);.  }..  
18550 70 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 2d  p->op = op;.  p-
18560 3e 62 49 6e 64 69 72 65 63 74 20 3d 20 70 2d 3e  >bIndirect = p->
18570 69 6e 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69  in.aData[p->in.i
18580 4e 65 78 74 2b 2b 5d 3b 0a 20 20 69 66 28 20 70  Next++];.  if( p
18590 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 55 50 44  ->op!=SQLITE_UPD
185a0 41 54 45 20 26 26 20 70 2d 3e 6f 70 21 3d 53 51  ATE && p->op!=SQ
185b0 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 70  LITE_DELETE && p
185c0 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53  ->op!=SQLITE_INS
185d0 45 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ERT ){.    retur
185e0 6e 20 28 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  n (p->rc = SQLIT
185f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 29 3b  E_CORRUPT_BKPT);
18600 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 52 65  .  }..  if( paRe
18610 63 20 29 7b 20 0a 20 20 20 20 69 6e 74 20 6e 56  c ){ .    int nV
18620 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
18630 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18640 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62  r of values to b
18650 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  uffer */.    if(
18660 20 70 2d 3e 62 50 61 74 63 68 73 65 74 3d 3d 30   p->bPatchset==0
18670 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   && op==SQLITE_U
18680 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  PDATE ){.      n
18690 56 61 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 20 2a 20  Val = p->nCol * 
186a0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
186b0 20 70 2d 3e 62 50 61 74 63 68 73 65 74 20 26 26   p->bPatchset &&
186c0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
186d0 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 56 61 6c  TE ){.      nVal
186e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
186f0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
18700 69 2b 2b 29 20 69 66 28 20 70 2d 3e 61 62 50 4b  i++) if( p->abPK
18710 5b 69 5d 20 29 20 6e 56 61 6c 2b 2b 3b 0a 20 20  [i] ) nVal++;.  
18720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
18730 56 61 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20  Val = p->nCol;. 
18740 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
18750 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65   sessionChangese
18760 74 42 75 66 66 65 72 52 65 63 6f 72 64 28 26 70  tBufferRecord(&p
18770 2d 3e 69 6e 2c 20 6e 56 61 6c 2c 20 70 6e 52 65  ->in, nVal, pnRe
18780 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  c);.    if( p->r
18790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
187a0 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20  eturn p->rc;.   
187b0 20 2a 70 61 52 65 63 20 3d 20 26 70 2d 3e 69 6e   *paRec = &p->in
187c0 2e 61 44 61 74 61 5b 70 2d 3e 69 6e 2e 69 4e 65  .aData[p->in.iNe
187d0 78 74 5d 3b 0a 20 20 20 20 70 2d 3e 69 6e 2e 69  xt];.    p->in.i
187e0 4e 65 78 74 20 2b 3d 20 2a 70 6e 52 65 63 3b 0a  Next += *pnRec;.
187f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
18800 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 4f  ite3_value **apO
18810 6c 64 20 3d 20 28 70 2d 3e 62 49 6e 76 65 72 74  ld = (p->bInvert
18820 20 3f 20 26 70 2d 3e 61 70 56 61 6c 75 65 5b 70   ? &p->apValue[p
18830 2d 3e 6e 43 6f 6c 5d 20 3a 20 70 2d 3e 61 70 56  ->nCol] : p->apV
18840 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
18850 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 4e 65 77  e3_value **apNew
18860 20 3d 20 28 70 2d 3e 62 49 6e 76 65 72 74 20 3f   = (p->bInvert ?
18870 20 70 2d 3e 61 70 56 61 6c 75 65 20 3a 20 26 70   p->apValue : &p
18880 2d 3e 61 70 56 61 6c 75 65 5b 70 2d 3e 6e 43 6f  ->apValue[p->nCo
18890 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
188a0 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
188b0 45 20 6f 72 20 44 45 4c 45 54 45 2c 20 72 65 61  E or DELETE, rea
188c0 64 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65 63 6f  d the old.* reco
188d0 72 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rd. */.    if( p
188e0 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 53  ->op!=SQLITE_INS
188f0 45 52 54 20 26 26 20 28 70 2d 3e 62 50 61 74 63  ERT && (p->bPatc
18900 68 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  hset==0 || p->op
18910 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 29  ==SQLITE_DELETE)
18920 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 62   ){.      u8 *ab
18930 50 4b 20 3d 20 70 2d 3e 62 50 61 74 63 68 73 65  PK = p->bPatchse
18940 74 20 3f 20 70 2d 3e 61 62 50 4b 20 3a 20 30 3b  t ? p->abPK : 0;
18950 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
18960 65 73 73 69 6f 6e 52 65 61 64 52 65 63 6f 72 64  essionReadRecord
18970 28 26 70 2d 3e 69 6e 2c 20 70 2d 3e 6e 43 6f 6c  (&p->in, p->nCol
18980 2c 20 61 62 50 4b 2c 20 61 70 4f 6c 64 29 3b 0a  , abPK, apOld);.
18990 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
189a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
189b0 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 7d  urn p->rc;.    }
189c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
189d0 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   is an INSERT or
189e0 20 55 50 44 41 54 45 2c 20 72 65 61 64 20 74 68   UPDATE, read th
189f0 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  e new.* record. 
18a00 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  */.    if( p->op
18a10 21 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  !=SQLITE_DELETE 
18a20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
18a30 20 73 65 73 73 69 6f 6e 52 65 61 64 52 65 63 6f   sessionReadReco
18a40 72 64 28 26 70 2d 3e 69 6e 2c 20 70 2d 3e 6e 43  rd(&p->in, p->nC
18a50 6f 6c 2c 20 30 2c 20 61 70 4e 65 77 29 3b 0a 20  ol, 0, apNew);. 
18a60 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
18a70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18a80 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 7d 0a  rn p->rc;.    }.
18a90 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 62 50 61  .    if( (p->bPa
18aa0 74 63 68 73 65 74 20 7c 7c 20 70 2d 3e 62 49 6e  tchset || p->bIn
18ab0 76 65 72 74 29 20 26 26 20 70 2d 3e 6f 70 3d 3d  vert) && p->op==
18ac0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
18ad0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
18ae0 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 74  s is an UPDATE t
18af0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
18b00 20 70 61 74 63 68 73 65 74 2c 20 74 68 65 6e 20   patchset, then 
18b10 61 6c 6c 20 50 4b 20 61 6e 64 0a 20 20 20 20 20  all PK and.     
18b20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 66 69 65   ** modified fie
18b30 6c 64 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  lds are present 
18b40 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 72 65 63  in the new.* rec
18b50 6f 72 64 2e 20 54 68 65 20 6f 6c 64 2e 2a 20 72  ord. The old.* r
18b60 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 69  ecord.      ** i
18b70 73 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6d 70  s currently comp
18b80 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 54 68  letely empty. Th
18b90 69 73 20 62 6c 6f 63 6b 20 73 68 69 66 74 73 20  is block shifts 
18ba0 74 68 65 20 50 4b 20 66 69 65 6c 64 73 20 66 72  the PK fields fr
18bb0 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  om.      ** new.
18bc0 2a 20 74 6f 20 6f 6c 64 2e 2a 2c 20 74 6f 20 61  * to old.*, to a
18bd0 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 63  ccommodate the c
18be0 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20 74  ode that reads t
18bf0 68 65 73 65 20 61 72 72 61 79 73 2e 20 20 2a 2f  hese arrays.  */
18c00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
18c10 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
18c20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18c30 20 70 2d 3e 62 50 61 74 63 68 73 65 74 3d 3d 30   p->bPatchset==0
18c40 20 7c 7c 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69   || p->apValue[i
18c50 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]==0 );.        
18c60 69 66 28 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29  if( p->abPK[i] )
18c70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
18c80 72 74 28 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69  rt( p->apValue[i
18c90 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]==0 );.        
18ca0 20 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69 5d 20    p->apValue[i] 
18cb0 3d 20 70 2d 3e 61 70 56 61 6c 75 65 5b 69 2b 70  = p->apValue[i+p
18cc0 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  ->nCol];.       
18cd0 20 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c 75     if( p->apValu
18ce0 65 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  e[i]==0 ) return
18cf0 20 28 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45   (p->rc = SQLITE
18d00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 29 3b 0a  _CORRUPT_BKPT);.
18d10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 56            p->apV
18d20 61 6c 75 65 5b 69 2b 70 2d 3e 6e 43 6f 6c 5d 20  alue[i+p->nCol] 
18d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
18d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
18d50 20 69 66 28 20 70 2d 3e 62 49 6e 76 65 72 74 20   if( p->bInvert 
18d60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
18d70 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
18d80 54 20 29 20 70 2d 3e 6f 70 20 3d 20 53 51 4c 49  T ) p->op = SQLI
18d90 54 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  TE_DELETE;.     
18da0 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d   else if( p->op=
18db0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
18dc0 20 70 2d 3e 6f 70 20 3d 20 53 51 4c 49 54 45 5f   p->op = SQLITE_
18dd0 49 4e 53 45 52 54 3b 0a 20 20 20 20 7d 0a 20 20  INSERT;.    }.  
18de0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
18df0 54 45 5f 52 4f 57 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TE_ROW;.}../*.**
18e00 20 41 64 76 61 6e 63 65 20 61 6e 20 69 74 65 72   Advance an iter
18e10 61 74 6f 72 20 63 72 65 61 74 65 64 20 62 79 20  ator created by 
18e20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
18e30 5f 73 74 61 72 74 28 29 20 74 6f 20 74 68 65 20  _start() to the 
18e40 6e 65 78 74 0a 2a 2a 20 63 68 61 6e 67 65 20 69  next.** change i
18e50 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
18e60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
18e70 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
18e80 5f 52 4f 57 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  _ROW, SQLITE_DON
18e90 45 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  E.** or SQLITE_C
18ea0 4f 52 52 55 50 54 2e 0a 2a 2a 0a 2a 2a 20 54 68  ORRUPT..**.** Th
18eb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
18ec0 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  not be called on
18ed0 20 69 74 65 72 61 74 6f 72 73 20 70 61 73 73 65   iterators passe
18ee0 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 20  d to a conflict 
18ef0 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62  handler.** callb
18f00 61 63 6b 20 62 79 20 63 68 61 6e 67 65 73 65 74  ack by changeset
18f10 5f 61 70 70 6c 79 28 29 2e 0a 2a 2f 0a 69 6e 74  _apply()..*/.int
18f20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
18f30 74 5f 6e 65 78 74 28 73 71 6c 69 74 65 33 5f 63  t_next(sqlite3_c
18f40 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
18f50 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 73 73  ){.  return sess
18f60 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e 65 78 74  ionChangesetNext
18f70 28 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  (p, 0, 0, 0);.}.
18f80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
18f90 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 65 78  wing function ex
18fa0 74 72 61 63 74 73 20 69 6e 66 6f 72 6d 61 74 69  tracts informati
18fb0 6f 6e 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  on on the curren
18fc0 74 20 63 68 61 6e 67 65 0a 2a 2a 20 66 72 6f 6d  t change.** from
18fd0 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
18fe0 72 61 74 6f 72 2e 20 49 74 20 6d 61 79 20 6f 6e  rator. It may on
18ff0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
19000 65 72 20 63 68 61 6e 67 65 73 65 74 5f 6e 65 78  er changeset_nex
19010 74 28 29 0a 2a 2a 20 68 61 73 20 72 65 74 75 72  t().** has retur
19020 6e 65 64 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a  ned SQLITE_ROW..
19030 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
19040 61 6e 67 65 73 65 74 5f 6f 70 28 0a 20 20 73 71  angeset_op(.  sq
19050 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
19060 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
19070 20 49 74 65 72 61 74 6f 72 20 68 61 6e 64 6c 65   Iterator handle
19080 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19090 20 2a 2a 70 7a 54 61 62 2c 20 20 20 20 20 20 20   **pzTab,       
190a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
190b0 69 6e 74 65 72 20 74 6f 20 74 61 62 6c 65 20 6e  inter to table n
190c0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ame */.  int *pn
190d0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
190e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
190f0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
19100 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ns in table */. 
19110 20 69 6e 74 20 2a 70 4f 70 2c 20 20 20 20 20 20   int *pOp,      
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 49 54 45 5f   /* OUT: SQLITE_
19140 49 4e 53 45 52 54 2c 20 44 45 4c 45 54 45 20 6f  INSERT, DELETE o
19150 72 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 69 6e  r UPDATE */.  in
19160 74 20 2a 70 62 49 6e 64 69 72 65 63 74 20 20 20  t *pbIndirect   
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19180 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 63 68   OUT: True if ch
19190 61 6e 67 65 20 69 73 20 69 6e 64 69 72 65 63 74  ange is indirect
191a0 20 2a 2f 0a 29 7b 0a 20 20 2a 70 4f 70 20 3d 20   */.){.  *pOp = 
191b0 70 49 74 65 72 2d 3e 6f 70 3b 0a 20 20 2a 70 6e  pIter->op;.  *pn
191c0 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 43 6f  Col = pIter->nCo
191d0 6c 3b 0a 20 20 2a 70 7a 54 61 62 20 3d 20 70 49  l;.  *pzTab = pI
191e0 74 65 72 2d 3e 7a 54 61 62 3b 0a 20 20 69 66 28  ter->zTab;.  if(
191f0 20 70 62 49 6e 64 69 72 65 63 74 20 29 20 2a 70   pbIndirect ) *p
19200 62 49 6e 64 69 72 65 63 74 20 3d 20 70 49 74 65  bIndirect = pIte
19210 72 2d 3e 62 49 6e 64 69 72 65 63 74 3b 0a 20 20  r->bIndirect;.  
19220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19240 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  n information re
19250 67 61 72 64 69 6e 67 20 74 68 65 20 50 52 49 4d  garding the PRIM
19260 41 52 59 20 4b 45 59 20 61 6e 64 20 6e 75 6d 62  ARY KEY and numb
19270 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
19280 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19290 20 74 61 62 6c 65 20 61 66 66 65 63 74 65 64 20   table affected 
192a0 62 79 20 74 68 65 20 63 68 61 6e 67 65 20 74 68  by the change th
192b0 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  at pIter current
192c0 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e  ly points.** to.
192d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
192e0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
192f0 64 20 61 66 74 65 72 20 63 68 61 6e 67 65 73 65  d after changese
19300 74 5f 6e 65 78 74 28 29 20 72 65 74 75 72 6e 73  t_next() returns
19310 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a  .** SQLITE_ROW..
19320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68  */.int sqlite3ch
19330 61 6e 67 65 73 65 74 5f 70 6b 28 0a 20 20 73 71  angeset_pk(.  sq
19340 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
19350 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
19360 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   Iterator object
19370 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19380 68 61 72 20 2a 2a 70 61 62 50 4b 2c 20 20 20 20  har **pabPK,    
19390 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72        /* OUT: Ar
193a0 72 61 79 20 6f 66 20 62 6f 6f 6c 65 61 6e 20 2d  ray of boolean -
193b0 20 74 72 75 65 20 66 6f 72 20 50 4b 20 63 6f 6c   true for PK col
193c0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  s */.  int *pnCo
193d0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
193e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
193f0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
19400 20 69 6e 20 6f 75 74 70 75 74 20 61 72 72 61 79   in output array
19410 20 2a 2f 0a 29 7b 0a 20 20 2a 70 61 62 50 4b 20   */.){.  *pabPK 
19420 3d 20 70 49 74 65 72 2d 3e 61 62 50 4b 3b 0a 20  = pIter->abPK;. 
19430 20 69 66 28 20 70 6e 43 6f 6c 20 29 20 2a 70 6e   if( pnCol ) *pn
19440 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 43 6f  Col = pIter->nCo
19450 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  l;.  return SQLI
19460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19470 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
19480 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19490 20 77 68 69 6c 65 20 74 68 65 20 69 74 65 72 61   while the itera
194a0 74 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  tor is pointing 
194b0 74 6f 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  to an.** SQLITE_
194c0 55 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45  UPDATE or SQLITE
194d0 5f 44 45 4c 45 54 45 20 63 68 61 6e 67 65 20 28  _DELETE change (
194e0 73 65 65 20 73 71 6c 69 74 65 33 63 68 61 6e 67  see sqlite3chang
194f0 65 73 65 74 5f 6f 70 28 29 29 2e 0a 2a 2a 20 4f  eset_op())..** O
19500 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
19510 5f 4d 49 53 55 53 45 20 69 73 20 72 65 74 75 72  _MISUSE is retur
19520 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 73 65  ned..**.** It se
19530 74 73 20 2a 70 70 56 61 6c 75 65 20 74 6f 20 70  ts *ppValue to p
19540 6f 69 6e 74 20 74 6f 20 61 6e 20 73 71 6c 69 74  oint to an sqlit
19550 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
19560 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
19570 65 0a 2a 2a 20 69 56 61 6c 27 74 68 20 76 61 6c  e.** iVal'th val
19580 75 65 20 69 6e 20 74 68 65 20 6f 6c 64 2e 2a 20  ue in the old.* 
19590 72 65 63 6f 72 64 2e 20 4f 72 2c 20 69 66 20 74  record. Or, if t
195a0 68 61 74 20 70 61 72 74 69 63 75 6c 61 72 20 76  hat particular v
195b0 61 6c 75 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 69  alue is not.** i
195c0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
195d0 65 63 6f 72 64 20 28 62 65 63 61 75 73 65 20 74  ecord (because t
195e0 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6e 20  he change is an 
195f0 55 50 44 41 54 45 20 61 6e 64 20 74 68 65 20 66  UPDATE and the f
19600 69 65 6c 64 0a 2a 2a 20 77 61 73 20 6e 6f 74 20  ield.** was not 
19610 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 69 73 20  modified and is 
19620 6e 6f 74 20 61 20 50 4b 20 63 6f 6c 75 6d 6e 29  not a PK column)
19630 2c 20 73 65 74 20 2a 70 70 56 61 6c 75 65 20 74  , set *ppValue t
19640 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  o NULL..**.** If
19650 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20 6f   value iVal is o
19660 75 74 2d 6f 66 2d 72 61 6e 67 65 2c 20 53 51 4c  ut-of-range, SQL
19670 49 54 45 5f 52 41 4e 47 45 20 69 73 20 72 65 74  ITE_RANGE is ret
19680 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61 6c  urned and *ppVal
19690 75 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 6d 6f 64  ue is.** not mod
196a0 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73 65  ified. Otherwise
196b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
196c0 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
196d0 65 73 65 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69  eset_old(.  sqli
196e0 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74  te3_changeset_it
196f0 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43  er *pIter,  /* C
19700 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f  hangeset iterato
19710 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c  r */.  int iVal,
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19740 6f 66 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 20 74  of old.* value t
19750 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
19760 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
19770 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  ppValue         
19780 2f 2a 20 4f 55 54 3a 20 4f 6c 64 20 76 61 6c 75  /* OUT: Old valu
19790 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e 74  e (or NULL point
197a0 65 72 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  er) */.){.  if( 
197b0 70 49 74 65 72 2d 3e 6f 70 21 3d 53 51 4c 49 54  pIter->op!=SQLIT
197c0 45 5f 55 50 44 41 54 45 20 26 26 20 70 49 74 65  E_UPDATE && pIte
197d0 72 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 44 45  r->op!=SQLITE_DE
197e0 4c 45 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  LETE ){.    retu
197f0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
19800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 56 61 6c  ;.  }.  if( iVal
19810 3c 30 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74 65  <0 || iVal>=pIte
19820 72 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72  r->nCol ){.    r
19830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e  eturn SQLITE_RAN
19840 47 45 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c  GE;.  }.  *ppVal
19850 75 65 20 3d 20 70 49 74 65 72 2d 3e 61 70 56 61  ue = pIter->apVa
19860 6c 75 65 5b 69 56 61 6c 5d 3b 0a 20 20 72 65 74  lue[iVal];.  ret
19870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19880 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19890 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
198a0 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 74  e called while t
198b0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 70  he iterator is p
198c0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 0a 2a 2a  ointing to an.**
198d0 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f   SQLITE_UPDATE o
198e0 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  r SQLITE_INSERT 
198f0 63 68 61 6e 67 65 20 28 73 65 65 20 73 71 6c 69  change (see sqli
19900 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28  te3changeset_op(
19910 29 29 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ))..** Otherwise
19920 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  , SQLITE_MISUSE 
19930 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
19940 2a 2a 20 49 74 20 73 65 74 73 20 2a 70 70 56 61  ** It sets *ppVa
19950 6c 75 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lue to point to 
19960 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
19970 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
19980 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 69 56 61  ining the.** iVa
19990 6c 27 74 68 20 76 61 6c 75 65 20 69 6e 20 74 68  l'th value in th
199a0 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  e new.* record. 
199b0 4f 72 2c 20 69 66 20 74 68 61 74 20 70 61 72 74  Or, if that part
199c0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 69 73 20  icular value is 
199d0 6e 6f 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20  not.** included 
199e0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 28 62  in the record (b
199f0 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67  ecause the chang
19a00 65 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 61  e is an UPDATE a
19a10 6e 64 20 74 68 65 20 66 69 65 6c 64 0a 2a 2a 20  nd the field.** 
19a20 77 61 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64  was not modified
19a30 29 2c 20 73 65 74 20 2a 70 70 56 61 6c 75 65 20  ), set *ppValue 
19a40 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
19a50 66 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20  f value iVal is 
19a60 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 2c 20 53 51  out-of-range, SQ
19a70 4c 49 54 45 5f 52 41 4e 47 45 20 69 73 20 72 65  LITE_RANGE is re
19a80 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 56 61  turned and *ppVa
19a90 6c 75 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 6d 6f  lue is.** not mo
19aa0 64 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73  dified. Otherwis
19ab0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
19ac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e  .int sqlite3chan
19ad0 67 65 73 65 74 5f 6e 65 77 28 0a 20 20 73 71 6c  geset_new(.  sql
19ae0 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
19af0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20  ter *pIter,  /* 
19b00 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61 74  Changeset iterat
19b10 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c  or */.  int iVal
19b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19b30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19b40 20 6f 66 20 6e 65 77 2e 2a 20 76 61 6c 75 65 20   of new.* value 
19b50 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
19b60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
19b70 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20 20 20  *ppValue        
19b80 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c   /* OUT: New val
19b90 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69 6e  ue (or NULL poin
19ba0 74 65 72 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ter) */.){.  if(
19bb0 20 70 49 74 65 72 2d 3e 6f 70 21 3d 53 51 4c 49   pIter->op!=SQLI
19bc0 54 45 5f 55 50 44 41 54 45 20 26 26 20 70 49 74  TE_UPDATE && pIt
19bd0 65 72 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49  er->op!=SQLITE_I
19be0 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 72 65 74  NSERT ){.    ret
19bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
19c00 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 56 61  E;.  }.  if( iVa
19c10 6c 3c 30 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74  l<0 || iVal>=pIt
19c20 65 72 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  er->nCol ){.    
19c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 41  return SQLITE_RA
19c40 4e 47 45 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61  NGE;.  }.  *ppVa
19c50 6c 75 65 20 3d 20 70 49 74 65 72 2d 3e 61 70 56  lue = pIter->apV
19c60 61 6c 75 65 5b 70 49 74 65 72 2d 3e 6e 43 6f 6c  alue[pIter->nCol
19c70 2b 69 56 61 6c 5d 3b 0a 20 20 72 65 74 75 72 6e  +iVal];.  return
19c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19c90 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19ca0 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72  ng two macros ar
19cb0 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
19cc0 79 2e 20 54 68 65 79 20 61 72 65 20 73 69 6d 69  y. They are simi
19cd0 6c 61 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 71  lar to the.** sq
19ce0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
19cf0 65 77 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ew() and sqlite3
19d00 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 29 20  changeset_old() 
19d10 66 75 6e 63 74 69 6f 6e 73 2c 20 65 78 63 65 70  functions, excep
19d20 74 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6f  t that.** they o
19d30 6d 69 74 20 61 6c 6c 20 65 72 72 6f 72 20 63 68  mit all error ch
19d40 65 63 6b 69 6e 67 20 61 6e 64 20 72 65 74 75 72  ecking and retur
19d50 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19d60 68 65 20 72 65 71 75 65 73 74 65 64 20 76 61 6c  he requested val
19d70 75 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  ue..*/.#define s
19d80 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e  essionChangesetN
19d90 65 77 28 70 49 74 65 72 2c 20 69 56 61 6c 29 20  ew(pIter, iVal) 
19da0 28 70 49 74 65 72 29 2d 3e 61 70 56 61 6c 75 65  (pIter)->apValue
19db0 5b 28 70 49 74 65 72 29 2d 3e 6e 43 6f 6c 2b 28  [(pIter)->nCol+(
19dc0 69 56 61 6c 29 5d 0a 23 64 65 66 69 6e 65 20 73  iVal)].#define s
19dd0 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4f  essionChangesetO
19de0 6c 64 28 70 49 74 65 72 2c 20 69 56 61 6c 29 20  ld(pIter, iVal) 
19df0 28 70 49 74 65 72 29 2d 3e 61 70 56 61 6c 75 65  (pIter)->apValue
19e00 5b 28 69 56 61 6c 29 5d 0a 0a 2f 2a 0a 2a 2a 20  [(iVal)]../*.** 
19e10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
19e20 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19e30 20 77 69 74 68 20 61 20 63 68 61 6e 67 65 73 65   with a changese
19e40 74 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  t iterator that 
19e50 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 73 73  has been.** pass
19e60 65 64 20 74 6f 20 61 6e 20 53 51 4c 49 54 45 5f  ed to an SQLITE_
19e70 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 6f  CHANGESET_DATA o
19e80 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  r SQLITE_CHANGES
19e90 45 54 5f 43 4f 4e 46 4c 49 43 54 20 0a 2a 2a 20  ET_CONFLICT .** 
19ea0 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72  conflict-handler
19eb0 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
19ec0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4d 49 53  wise, SQLITE_MIS
19ed0 55 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USE is returned.
19ee0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
19ef0 73 66 75 6c 2c 20 2a 70 70 56 61 6c 75 65 20 69  sful, *ppValue i
19f00 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
19f10 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
19f20 75 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ue structure.** 
19f30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
19f40 56 61 6c 27 74 68 20 76 61 6c 75 65 20 6f 66 20  Val'th value of 
19f50 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  the conflicting 
19f60 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
19f70 20 76 61 6c 75 65 20 69 56 61 6c 20 69 73 20 6f   value iVal is o
19f80 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 72 20 73  ut-of-range or s
19f90 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
19fa0 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
19fb0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
19fc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19fd0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
19fe0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
19ff0 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c  3changeset_confl
1a000 69 63 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ict(.  sqlite3_c
1a010 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
1a020 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65  Iter,  /* Change
1a030 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  set iterator */.
1a040 20 20 69 6e 74 20 69 56 61 6c 2c 20 20 20 20 20    int iVal,     
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
1a070 6e 66 6c 69 63 74 20 72 65 63 6f 72 64 20 76 61  nflict record va
1a080 6c 75 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  lue to fetch */.
1a090 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a0a0 2a 2a 70 70 56 61 6c 75 65 20 20 20 20 20 20 20  **ppValue       
1a0b0 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
1a0c0 66 72 6f 6d 20 63 6f 6e 66 6c 69 63 74 69 6e 67  from conflicting
1a0d0 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   row */.){.  if(
1a0e0 20 21 70 49 74 65 72 2d 3e 70 43 6f 6e 66 6c 69   !pIter->pConfli
1a0f0 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
1a100 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
1a110 20 20 7d 0a 20 20 69 66 28 20 69 56 61 6c 3c 30    }.  if( iVal<0
1a120 20 7c 7c 20 69 56 61 6c 3e 3d 70 49 74 65 72 2d   || iVal>=pIter-
1a130 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  >nCol ){.    ret
1a140 75 72 6e 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  urn SQLITE_RANGE
1a150 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c 75 65  ;.  }.  *ppValue
1a160 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1a170 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
1a180 43 6f 6e 66 6c 69 63 74 2c 20 69 56 61 6c 29 3b  Conflict, iVal);
1a190 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a1a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1a1b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
1a1c0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
1a1d0 69 74 68 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ith an iterator 
1a1e0 70 61 73 73 65 64 20 74 6f 20 61 6e 0a 2a 2a 20  passed to an.** 
1a1f0 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
1a200 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 63 6f 6e  _FOREIGN_KEY con
1a210 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 63 61  flict handler ca
1a220 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
1a230 63 61 73 65 0a 2a 2a 20 69 74 20 73 65 74 73 20  case.** it sets 
1a240 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
1a250 62 6c 65 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ble to the total
1a260 20 6e 75 6d 62 65 72 20 6f 66 20 6b 6e 6f 77 6e   number of known
1a270 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
1a280 76 69 6f 6c 61 74 69 6f 6e 73 20 69 6e 20 74 68  violations in th
1a290 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 64 61  e destination da
1a2a0 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75 72  tabase and retur
1a2b0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1a2c0 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
1a2d0 20 63 61 73 65 73 20 74 68 69 73 20 66 75 6e 63   cases this func
1a2e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1a2f0 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 69  ITE_MISUSE..*/.i
1a300 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
1a310 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c 69 63 74 73  set_fk_conflicts
1a320 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  (.  sqlite3_chan
1a330 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
1a340 72 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 65 74  r,  /* Changeset
1a350 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
1a360 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20  nt *pnOut       
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a380 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1a390 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 2a   FK violations *
1a3a0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  /.){.  if( pIter
1a3b0 2d 3e 70 43 6f 6e 66 6c 69 63 74 20 7c 7c 20 70  ->pConflict || p
1a3c0 49 74 65 72 2d 3e 61 70 56 61 6c 75 65 20 29 7b  Iter->apValue ){
1a3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a3e0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
1a3f0 20 2a 70 6e 4f 75 74 20 3d 20 70 49 74 65 72 2d   *pnOut = pIter-
1a400 3e 6e 43 6f 6c 3b 0a 20 20 72 65 74 75 72 6e 20  >nCol;.  return 
1a410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1a420 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e  *.** Finalize an
1a430 20 69 74 65 72 61 74 6f 72 20 61 6c 6c 6f 63 61   iterator alloca
1a440 74 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  ted with sqlite3
1a450 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
1a460 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
1a470 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  nction may not b
1a480 65 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  e called on iter
1a490 61 74 6f 72 73 20 70 61 73 73 65 64 20 74 6f 20  ators passed to 
1a4a0 61 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  a conflict handl
1a4b0 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 62  er.** callback b
1a4c0 79 20 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  y changeset_appl
1a4d0 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y()..*/.int sqli
1a4e0 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e  te3changeset_fin
1a4f0 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 68  alize(sqlite3_ch
1a500 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 29  angeset_iter *p)
1a510 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a520 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1a530 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1a560 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a570 70 2d 3e 61 70 56 61 6c 75 65 5b 5d 20 2a 2f 0a  p->apValue[] */.
1a580 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
1a590 20 20 20 20 69 66 28 20 70 2d 3e 61 70 56 61 6c      if( p->apVal
1a5a0 75 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ue ){.      for(
1a5b0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 2a 32  i=0; i<p->nCol*2
1a5c0 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65 33 56 61  ; i++) sqlite3Va
1a5d0 6c 75 65 46 72 65 65 28 70 2d 3e 61 70 56 61 6c  lueFree(p->apVal
1a5e0 75 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ue[i]);.    }.  
1a5f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a600 2d 3e 74 62 6c 68 64 72 2e 61 42 75 66 29 3b 0a  ->tblhdr.aBuf);.
1a610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a620 28 70 2d 3e 69 6e 2e 62 75 66 2e 61 42 75 66 29  (p->in.buf.aBuf)
1a630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a640 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ee(p);.  }.  ret
1a650 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
1a660 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43 68 61  c int sessionCha
1a670 6e 67 65 73 65 74 49 6e 76 65 72 74 28 0a 20 20  ngesetInvert(.  
1a680 53 65 73 73 69 6f 6e 49 6e 70 75 74 20 2a 70 49  SessionInput *pI
1a690 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nput,           
1a6a0 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67 65 73  /* Input changes
1a6b0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 4f  et */.  int (*xO
1a6c0 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
1a6d0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1a6e0 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
1a6f0 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 2c 0a  ,.  void *pOut,.
1a700 20 20 69 6e 74 20 2a 70 6e 49 6e 76 65 72 74 65    int *pnInverte
1a710 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a720 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1a730 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6f 75 74   of bytes in out
1a740 70 75 74 20 63 68 61 6e 67 65 73 65 74 20 2a 2f  put changeset */
1a750 0a 20 20 76 6f 69 64 20 2a 2a 70 70 49 6e 76 65  .  void **ppInve
1a760 72 74 65 64 20 20 20 20 20 20 20 20 20 20 20 20  rted            
1a770 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 76 65 72     /* OUT: Inver
1a780 73 65 20 6f 66 20 70 43 68 61 6e 67 65 73 65 74  se of pChangeset
1a790 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a7a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1a7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a7c0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 65  rn value */.  Se
1a7d0 73 73 69 6f 6e 42 75 66 66 65 72 20 73 4f 75 74  ssionBuffer sOut
1a7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a7f0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
1a800 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  /.  int nCol = 0
1a810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a820 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a830 20 63 6f 6c 73 20 69 6e 20 63 75 72 72 65 6e 74   cols in current
1a840 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 2a   table */.  u8 *
1a850 61 62 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20  abPK = 0;       
1a860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1a870 4b 20 61 72 72 61 79 20 66 6f 72 20 63 75 72 72  K array for curr
1a880 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ent table */.  s
1a890 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1a8a0 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  pVal = 0;      /
1a8b0 2a 20 53 70 61 63 65 20 66 6f 72 20 76 61 6c 75  * Space for valu
1a8c0 65 73 20 66 6f 72 20 55 50 44 41 54 45 20 69 6e  es for UPDATE in
1a8d0 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 73  version */.  Ses
1a8e0 73 69 6f 6e 42 75 66 66 65 72 20 73 50 4b 20 3d  sionBuffer sPK =
1a8f0 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 2f 2a 20   {0, 0, 0};  /* 
1a900 50 4b 20 61 72 72 61 79 20 66 6f 72 20 63 75 72  PK array for cur
1a910 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rent table */.. 
1a920 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a930 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1a940 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4f   */.  memset(&sO
1a950 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ut, 0, sizeof(Se
1a960 73 73 69 6f 6e 42 75 66 66 65 72 29 29 3b 0a 0a  ssionBuffer));..
1a970 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6f 75    /* Zero the ou
1a980 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 69  tput variables i
1a990 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
1a9a0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
1a9b0 20 70 70 49 6e 76 65 72 74 65 64 20 29 7b 0a 20   ppInverted ){. 
1a9c0 20 20 20 2a 70 70 49 6e 76 65 72 74 65 64 20 3d     *ppInverted =
1a9d0 20 30 3b 0a 20 20 20 20 2a 70 6e 49 6e 76 65 72   0;.    *pnInver
1a9e0 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ted = 0;.  }..  
1a9f0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1aa00 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 2f  u8 eType;..    /
1aa10 2a 20 54 65 73 74 20 66 6f 72 20 45 4f 46 2e 20  * Test for EOF. 
1aa20 2a 2f 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  */.    if( (rc =
1aa30 20 73 65 73 73 69 6f 6e 49 6e 70 75 74 42 75 66   sessionInputBuf
1aa40 66 65 72 28 70 49 6e 70 75 74 2c 20 32 29 29 20  fer(pInput, 2)) 
1aa50 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f  ) goto finished_
1aa60 69 6e 76 65 72 74 3b 0a 20 20 20 20 69 66 28 20  invert;.    if( 
1aa70 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 3e 3d 70  pInput->iNext>=p
1aa80 49 6e 70 75 74 2d 3e 6e 44 61 74 61 20 29 20 62  Input->nData ) b
1aa90 72 65 61 6b 3b 0a 20 20 20 20 65 54 79 70 65 20  reak;.    eType 
1aaa0 3d 20 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b  = pInput->aData[
1aab0 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 5d 3b 0a  pInput->iNext];.
1aac0 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 54 79  .    switch( eTy
1aad0 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
1aae0 20 27 54 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'T': {.        
1aaf0 2f 2a 20 41 20 27 74 61 62 6c 65 27 20 72 65 63  /* A 'table' rec
1ab00 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 3a  ord consists of:
1ab10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ab20 20 20 20 20 2a 2a 20 20 20 2a 20 41 20 63 6f 6e      **   * A con
1ab30 73 74 61 6e 74 20 27 54 27 20 63 68 61 72 61 63  stant 'T' charac
1ab40 74 65 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ter,.        ** 
1ab50 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f    * Number of co
1ab60 6c 75 6d 6e 73 20 69 6e 20 73 61 69 64 20 74 61  lumns in said ta
1ab70 62 6c 65 20 28 61 20 76 61 72 69 6e 74 29 2c 0a  ble (a varint),.
1ab80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2a 20 41          **   * A
1ab90 6e 20 61 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20  n array of nCol 
1aba0 62 79 74 65 73 20 28 73 50 4b 29 2c 0a 20 20 20  bytes (sPK),.   
1abb0 20 20 20 20 20 2a 2a 20 20 20 2a 20 41 20 6e 75       **   * A nu
1abc0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 61 62  l-terminated tab
1abd0 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 20 20 20  le name..       
1abe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1abf0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
1ac00 6e 74 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 20  nt nVar;.       
1ac10 20 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 2b 2b   pInput->iNext++
1ac20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 72  ;.        if( (r
1ac30 63 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  c = sessionChang
1ac40 65 73 65 74 42 75 66 66 65 72 54 62 6c 68 64 72  esetBufferTblhdr
1ac50 28 70 49 6e 70 75 74 2c 20 26 6e 42 79 74 65 29  (pInput, &nByte)
1ac60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
1ac70 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f 69 6e 76  oto finished_inv
1ac80 65 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ert;.        }. 
1ac90 20 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 65         nVar = se
1aca0 73 73 69 6f 6e 56 61 72 69 6e 74 47 65 74 28 26  ssionVarintGet(&
1acb0 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70 49  pInput->aData[pI
1acc0 6e 70 75 74 2d 3e 69 4e 65 78 74 5d 2c 20 26 6e  nput->iNext], &n
1acd0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 50  Col);.        sP
1ace0 4b 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  K.nBuf = 0;.    
1acf0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1ad00 64 42 6c 6f 62 28 26 73 50 4b 2c 20 26 70 49 6e  dBlob(&sPK, &pIn
1ad10 70 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e 70 75  put->aData[pInpu
1ad20 74 2d 3e 69 4e 65 78 74 2b 6e 56 61 72 5d 2c 20  t->iNext+nVar], 
1ad30 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  nCol, &rc);.    
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 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  pe, &rc);.      
1ad70 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
1ad80 6c 6f 62 28 26 73 4f 75 74 2c 20 26 70 49 6e 70  lob(&sOut, &pInp
1ad90 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e 70 75 74  ut->aData[pInput
1ada0 2d 3e 69 4e 65 78 74 5d 2c 20 6e 42 79 74 65 2c  ->iNext], nByte,
1adb0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
1adc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 69 6e  f( rc ) goto fin
1add0 69 73 68 65 64 5f 69 6e 76 65 72 74 3b 0a 0a 20  ished_invert;.. 
1ade0 20 20 20 20 20 20 20 70 49 6e 70 75 74 2d 3e 69         pInput->i
1adf0 4e 65 78 74 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Next += nByte;. 
1ae00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1ae10 72 65 65 28 61 70 56 61 6c 29 3b 0a 20 20 20 20  ree(apVal);.    
1ae20 20 20 20 20 61 70 56 61 6c 20 3d 20 30 3b 0a 20      apVal = 0;. 
1ae30 20 20 20 20 20 20 20 61 62 50 4b 20 3d 20 73 50         abPK = sP
1ae40 4b 2e 61 42 75 66 3b 0a 20 20 20 20 20 20 20 20  K.aBuf;.        
1ae50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1ae60 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1ae70 45 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 20 20  E_INSERT:.      
1ae80 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
1ae90 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE: {.        in
1aea0 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  t nByte;.       
1aeb0 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74 20 3d   int bIndirect =
1aec0 20 70 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70   pInput->aData[p
1aed0 49 6e 70 75 74 2d 3e 69 4e 65 78 74 2b 31 5d 3b  Input->iNext+1];
1aee0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79  .        int eTy
1aef0 70 65 32 20 3d 20 28 65 54 79 70 65 3d 3d 53 51  pe2 = (eType==SQ
1af00 4c 49 54 45 5f 44 45 4c 45 54 45 20 3f 20 53 51  LITE_DELETE ? SQ
1af10 4c 49 54 45 5f 49 4e 53 45 52 54 20 3a 20 53 51  LITE_INSERT : SQ
1af20 4c 49 54 45 5f 44 45 4c 45 54 45 29 3b 0a 20 20  LITE_DELETE);.  
1af30 20 20 20 20 20 20 70 49 6e 70 75 74 2d 3e 69 4e        pInput->iN
1af40 65 78 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ext += 2;.      
1af50 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1af60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
1af70 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
1af80 68 61 6e 67 65 73 65 74 42 75 66 66 65 72 52 65  hangesetBufferRe
1af90 63 6f 72 64 28 70 49 6e 70 75 74 2c 20 6e 43 6f  cord(pInput, nCo
1afa0 6c 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  l, &nByte);.    
1afb0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1afc0 64 42 79 74 65 28 26 73 4f 75 74 2c 20 65 54 79  dByte(&sOut, eTy
1afd0 70 65 32 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  pe2, &rc);.     
1afe0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1aff0 42 79 74 65 28 26 73 4f 75 74 2c 20 62 49 6e 64  Byte(&sOut, bInd
1b000 69 72 65 63 74 2c 20 26 72 63 29 3b 0a 20 20 20  irect, &rc);.   
1b010 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1b020 6e 64 42 6c 6f 62 28 26 73 4f 75 74 2c 20 26 70  ndBlob(&sOut, &p
1b030 49 6e 70 75 74 2d 3e 61 44 61 74 61 5b 70 49 6e  Input->aData[pIn
1b040 70 75 74 2d 3e 69 4e 65 78 74 5d 2c 20 6e 42 79  put->iNext], nBy
1b050 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  te, &rc);.      
1b060 20 20 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74 20    pInput->iNext 
1b070 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
1b080 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1b090 66 69 6e 69 73 68 65 64 5f 69 6e 76 65 72 74 3b  finished_invert;
1b0a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b0b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
1b0c0 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
1b0d0 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E: {.        int
1b0e0 20 69 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20   iCol;..        
1b0f0 69 66 28 20 30 3d 3d 61 70 56 61 6c 20 29 7b 0a  if( 0==apVal ){.
1b100 20 20 20 20 20 20 20 20 20 20 61 70 56 61 6c 20            apVal 
1b110 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  = (sqlite3_value
1b120 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   **)sqlite3_mall
1b130 6f 63 36 34 28 73 69 7a 65 6f 66 28 61 70 56 61  oc64(sizeof(apVa
1b140 6c 5b 30 5d 29 2a 6e 43 6f 6c 2a 32 29 3b 0a 20  l[0])*nCol*2);. 
1b150 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
1b160 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  apVal ){.       
1b170 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b180 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1b190 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65      goto finishe
1b1a0 64 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20 20 20  d_invert;.      
1b1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b1c0 6d 65 6d 73 65 74 28 61 70 56 61 6c 2c 20 30 2c  memset(apVal, 0,
1b1d0 20 73 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d   sizeof(apVal[0]
1b1e0 29 2a 6e 43 6f 6c 2a 32 29 3b 0a 20 20 20 20 20  )*nCol*2);.     
1b1f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1b200 20 57 72 69 74 65 20 74 68 65 20 68 65 61 64 65   Write the heade
1b210 72 20 66 6f 72 20 74 68 65 20 6e 65 77 20 55 50  r for the new UP
1b220 44 41 54 45 20 63 68 61 6e 67 65 2e 20 53 61 6d  DATE change. Sam
1b230 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
1b240 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 65  l. */.        se
1b250 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28  ssionAppendByte(
1b260 26 73 4f 75 74 2c 20 65 54 79 70 65 2c 20 26 72  &sOut, eType, &r
1b270 63 29 3b 0a 20 20 20 20 20 20 20 20 73 65 73 73  c);.        sess
1b280 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26 73  ionAppendByte(&s
1b290 4f 75 74 2c 20 70 49 6e 70 75 74 2d 3e 61 44 61  Out, pInput->aDa
1b2a0 74 61 5b 70 49 6e 70 75 74 2d 3e 69 4e 65 78 74  ta[pInput->iNext
1b2b0 2b 31 5d 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  +1], &rc);..    
1b2c0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b2d0 6f 6c 64 2e 2a 20 61 6e 64 20 6e 65 77 2e 2a 20  old.* and new.* 
1b2e0 72 65 63 6f 72 64 73 20 66 6f 72 20 74 68 65 20  records for the 
1b2f0 75 70 64 61 74 65 20 63 68 61 6e 67 65 2e 20 2a  update change. *
1b300 2f 0a 20 20 20 20 20 20 20 20 70 49 6e 70 75 74  /.        pInput
1b310 2d 3e 69 4e 65 78 74 20 2b 3d 20 32 3b 0a 20 20  ->iNext += 2;.  
1b320 20 20 20 20 20 20 72 63 20 3d 20 73 65 73 73 69        rc = sessi
1b330 6f 6e 52 65 61 64 52 65 63 6f 72 64 28 70 49 6e  onReadRecord(pIn
1b340 70 75 74 2c 20 6e 43 6f 6c 2c 20 30 2c 20 26 61  put, nCol, 0, &a
1b350 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20  pVal[0]);.      
1b360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b380 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 61   rc = sessionRea
1b390 64 52 65 63 6f 72 64 28 70 49 6e 70 75 74 2c 20  dRecord(pInput, 
1b3a0 6e 43 6f 6c 2c 20 30 2c 20 26 61 70 56 61 6c 5b  nCol, 0, &apVal[
1b3b0 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  nCol]);.        
1b3c0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1b3d0 69 74 65 20 74 68 65 20 6e 65 77 20 6f 6c 64 2e  ite the new old.
1b3e0 2a 20 72 65 63 6f 72 64 2e 20 43 6f 6e 73 69 73  * record. Consis
1b3f0 74 73 20 6f 66 20 74 68 65 20 50 4b 20 63 6f 6c  ts of the PK col
1b400 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  umns from the.  
1b410 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61        ** origina
1b420 6c 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2c 20  l old.* record, 
1b430 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 76 61  and the other va
1b440 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 6f 72  lues from the or
1b450 69 67 69 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  iginal.        *
1b460 2a 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e 20  * new.* record. 
1b470 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
1b480 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c  Col=0; iCol<nCol
1b490 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1b4a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
1b4b0 75 65 20 2a 70 56 61 6c 20 3d 20 61 70 56 61 6c  ue *pVal = apVal
1b4c0 5b 69 43 6f 6c 20 2b 20 28 61 62 50 4b 5b 69 43  [iCol + (abPK[iC
1b4d0 6f 6c 5d 20 3f 20 30 20 3a 20 6e 43 6f 6c 29 5d  ol] ? 0 : nCol)]
1b4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 73 73  ;.          sess
1b4f0 69 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26  ionAppendValue(&
1b500 73 4f 75 74 2c 20 70 56 61 6c 2c 20 26 72 63 29  sOut, pVal, &rc)
1b510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b520 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1b530 65 20 6e 65 77 20 6e 65 77 2e 2a 20 72 65 63 6f  e new new.* reco
1b540 72 64 2e 20 43 6f 6e 73 69 73 74 73 20 6f 66 20  rd. Consists of 
1b550 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 76 61  a copy of all va
1b560 6c 75 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  lues.        ** 
1b570 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
1b580 6c 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2c 20  l old.* record, 
1b590 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 50  except for the P
1b5a0 4b 20 63 6f 6c 75 6d 6e 73 2c 20 77 68 69 63 68  K columns, which
1b5b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
1b5c0 73 65 74 20 74 6f 20 22 75 6e 64 65 66 69 6e 65  set to "undefine
1b5d0 64 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  d". */.        f
1b5e0 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1b5f0 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1b600 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b610 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 28  _value *pVal = (
1b620 61 62 50 4b 5b 69 43 6f 6c 5d 20 3f 20 30 20 3a  abPK[iCol] ? 0 :
1b630 20 61 70 56 61 6c 5b 69 43 6f 6c 5d 29 3b 0a 20   apVal[iCol]);. 
1b640 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e           session
1b650 41 70 70 65 6e 64 56 61 6c 75 65 28 26 73 4f 75  AppendValue(&sOu
1b660 74 2c 20 70 56 61 6c 2c 20 26 72 63 29 3b 0a 20  t, pVal, &rc);. 
1b670 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b680 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
1b690 6f 6c 3c 6e 43 6f 6c 2a 32 3b 20 69 43 6f 6c 2b  ol<nCol*2; iCol+
1b6a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1b6b0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 61  lite3ValueFree(a
1b6c0 70 56 61 6c 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  pVal[iCol]);.   
1b6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
1b6e0 65 6d 73 65 74 28 61 70 56 61 6c 2c 20 30 2c 20  emset(apVal, 0, 
1b6f0 73 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d 29  sizeof(apVal[0])
1b700 2a 6e 43 6f 6c 2a 32 29 3b 0a 20 20 20 20 20 20  *nCol*2);.      
1b710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b730 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 5f 69   goto finished_i
1b740 6e 76 65 72 74 3b 0a 20 20 20 20 20 20 20 20 7d  nvert;.        }
1b750 0a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
1b760 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b770 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1b780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1b790 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b7a0 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64     goto finished
1b7b0 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20 7d 0a 0a  _invert;.    }..
1b7c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1b7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1b7e0 20 69 66 28 20 78 4f 75 74 70 75 74 20 26 26 20   if( xOutput && 
1b7f0 73 4f 75 74 2e 6e 42 75 66 3e 3d 73 65 73 73 69  sOut.nBuf>=sessi
1b800 6f 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73  ons_strm_chunk_s
1b810 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
1b820 3d 20 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20  = xOutput(pOut, 
1b830 73 4f 75 74 2e 61 42 75 66 2c 20 73 4f 75 74 2e  sOut.aBuf, sOut.
1b840 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 73 4f 75  nBuf);.      sOu
1b850 74 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  t.nBuf = 0;.    
1b860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b870 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1b880 68 65 64 5f 69 6e 76 65 72 74 3b 0a 20 20 20 20  hed_invert;.    
1b890 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1b8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b8b0 3b 0a 20 20 69 66 28 20 70 6e 49 6e 76 65 72 74  ;.  if( pnInvert
1b8c0 65 64 20 29 7b 0a 20 20 20 20 2a 70 6e 49 6e 76  ed ){.    *pnInv
1b8d0 65 72 74 65 64 20 3d 20 73 4f 75 74 2e 6e 42 75  erted = sOut.nBu
1b8e0 66 3b 0a 20 20 20 20 2a 70 70 49 6e 76 65 72 74  f;.    *ppInvert
1b8f0 65 64 20 3d 20 73 4f 75 74 2e 61 42 75 66 3b 0a  ed = sOut.aBuf;.
1b900 20 20 20 20 73 4f 75 74 2e 61 42 75 66 20 3d 20      sOut.aBuf = 
1b910 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
1b920 4f 75 74 2e 6e 42 75 66 3e 30 20 29 7b 0a 20 20  Out.nBuf>0 ){.  
1b930 20 20 72 63 20 3d 20 78 4f 75 74 70 75 74 28 70    rc = xOutput(p
1b940 4f 75 74 2c 20 73 4f 75 74 2e 61 42 75 66 2c 20  Out, sOut.aBuf, 
1b950 73 4f 75 74 2e 6e 42 75 66 29 3b 0a 20 20 7d 0a  sOut.nBuf);.  }.
1b960 0a 20 66 69 6e 69 73 68 65 64 5f 69 6e 76 65 72  . finished_inver
1b970 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
1b980 65 28 73 4f 75 74 2e 61 42 75 66 29 3b 0a 20 20  e(sOut.aBuf);.  
1b990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 56  sqlite3_free(apV
1b9a0 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  al);.  sqlite3_f
1b9b0 72 65 65 28 73 50 4b 2e 61 42 75 66 29 3b 0a 20  ree(sPK.aBuf);. 
1b9c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1b9d0 2f 2a 0a 2a 2a 20 49 6e 76 65 72 74 20 61 20 63  /*.** Invert a c
1b9e0 68 61 6e 67 65 73 65 74 20 6f 62 6a 65 63 74 2e  hangeset object.
1b9f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
1ba00 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28  hangeset_invert(
1ba10 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65  .  int nChangese
1ba20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1ba30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ba40 62 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a  bytes in input *
1ba50 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1ba60 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  pChangeset,     
1ba70 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
1ba80 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ngeset */.  int 
1ba90 2a 70 6e 49 6e 76 65 72 74 65 64 2c 20 20 20 20  *pnInverted,    
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bab0 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  UT: Number of by
1bac0 74 65 73 20 69 6e 20 6f 75 74 70 75 74 20 63 68  tes in output ch
1bad0 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69  angeset */.  voi
1bae0 64 20 2a 2a 70 70 49 6e 76 65 72 74 65 64 20 20  d **ppInverted  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb00 4f 55 54 3a 20 49 6e 76 65 72 73 65 20 6f 66 20  OUT: Inverse of 
1bb10 70 43 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 7b  pChangeset */.){
1bb20 0a 20 20 53 65 73 73 69 6f 6e 49 6e 70 75 74 20  .  SessionInput 
1bb30 73 49 6e 70 75 74 3b 0a 0a 20 20 2f 2a 20 53 65  sInput;..  /* Se
1bb40 74 20 75 70 20 74 68 65 20 69 6e 70 75 74 20 73  t up the input s
1bb50 74 72 65 61 6d 20 2a 2f 0a 20 20 6d 65 6d 73 65  tream */.  memse
1bb60 74 28 26 73 49 6e 70 75 74 2c 20 30 2c 20 73 69  t(&sInput, 0, si
1bb70 7a 65 6f 66 28 53 65 73 73 69 6f 6e 49 6e 70 75  zeof(SessionInpu
1bb80 74 29 29 3b 0a 20 20 73 49 6e 70 75 74 2e 6e 44  t));.  sInput.nD
1bb90 61 74 61 20 3d 20 6e 43 68 61 6e 67 65 73 65 74  ata = nChangeset
1bba0 3b 0a 20 20 73 49 6e 70 75 74 2e 61 44 61 74 61  ;.  sInput.aData
1bbb0 20 3d 20 28 75 38 2a 29 70 43 68 61 6e 67 65 73   = (u8*)pChanges
1bbc0 65 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 65  et;..  return se
1bbd0 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 49 6e  ssionChangesetIn
1bbe0 76 65 72 74 28 26 73 49 6e 70 75 74 2c 20 30 2c  vert(&sInput, 0,
1bbf0 20 30 2c 20 70 6e 49 6e 76 65 72 74 65 64 2c 20   0, pnInverted, 
1bc00 70 70 49 6e 76 65 72 74 65 64 29 3b 0a 7d 0a 0a  ppInverted);.}..
1bc10 2f 2a 0a 2a 2a 20 53 74 72 65 61 6d 69 6e 67 20  /*.** Streaming 
1bc20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1bc30 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  e3changeset_inve
1bc40 72 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rt()..*/.int sql
1bc50 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e  ite3changeset_in
1bc60 76 65 72 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74  vert_strm(.  int
1bc70 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20   (*xInput)(void 
1bc80 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74  *pIn, void *pDat
1bc90 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c  a, int *pnData),
1bca0 0a 20 20 76 6f 69 64 20 2a 70 49 6e 2c 0a 20 20  .  void *pIn,.  
1bcb0 69 6e 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76  int (*xOutput)(v
1bcc0 6f 69 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74  oid *pOut, const
1bcd0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
1bce0 74 20 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64  t nData),.  void
1bcf0 20 2a 70 4f 75 74 0a 29 7b 0a 20 20 53 65 73 73   *pOut.){.  Sess
1bd00 69 6f 6e 49 6e 70 75 74 20 73 49 6e 70 75 74 3b  ionInput sInput;
1bd10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1bd20 20 53 65 74 20 75 70 20 74 68 65 20 69 6e 70 75   Set up the inpu
1bd30 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 6d 65  t stream */.  me
1bd40 6d 73 65 74 28 26 73 49 6e 70 75 74 2c 20 30 2c  mset(&sInput, 0,
1bd50 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 49   sizeof(SessionI
1bd60 6e 70 75 74 29 29 3b 0a 20 20 73 49 6e 70 75 74  nput));.  sInput
1bd70 2e 78 49 6e 70 75 74 20 3d 20 78 49 6e 70 75 74  .xInput = xInput
1bd80 3b 0a 20 20 73 49 6e 70 75 74 2e 70 49 6e 20 3d  ;.  sInput.pIn =
1bd90 20 70 49 6e 3b 0a 0a 20 20 72 63 20 3d 20 73 65   pIn;..  rc = se
1bda0 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 49 6e  ssionChangesetIn
1bdb0 76 65 72 74 28 26 73 49 6e 70 75 74 2c 20 78 4f  vert(&sInput, xO
1bdc0 75 74 70 75 74 2c 20 70 4f 75 74 2c 20 30 2c 20  utput, pOut, 0, 
1bdd0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
1bde0 65 65 28 73 49 6e 70 75 74 2e 62 75 66 2e 61 42  ee(sInput.buf.aB
1bdf0 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  uf);.  return rc
1be00 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1be10 75 63 74 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  uct SessionApply
1be20 43 74 78 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  Ctx SessionApply
1be30 43 74 78 3b 0a 73 74 72 75 63 74 20 53 65 73 73  Ctx;.struct Sess
1be40 69 6f 6e 41 70 70 6c 79 43 74 78 20 7b 0a 20 20  ionApplyCtx {.  
1be50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
1be60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
1be70 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  lete;          /
1be80 2a 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  * DELETE stateme
1be90 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
1bea0 73 74 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20  stmt *pUpdate;  
1beb0 20 20 20 20 20 20 20 20 2f 2a 20 55 50 44 41 54          /* UPDAT
1bec0 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
1bed0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bee0 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20 20  Insert;         
1bef0 20 2f 2a 20 49 4e 53 45 52 54 20 73 74 61 74 65   /* INSERT state
1bf00 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
1bf10 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b  3_stmt *pSelect;
1bf20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
1bf30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1bf40 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a     /* Size of az
1bf70 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 50 4b 5b 5d  Col[] and abPK[]
1bf80 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 63 6f 6e   arrays */.  con
1bf90 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b  st char **azCol;
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfb0 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
1bfc0 6e 61 6d 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61  names */.  u8 *a
1bfd0 62 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bPK;            
1bfe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
1bff0 6f 6c 65 61 6e 20 61 72 72 61 79 20 2d 20 74 72  olean array - tr
1c000 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1c010 69 6e 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 62  in PK */.  int b
1c020 53 74 61 74 31 3b 20 20 20 20 20 20 20 20 20 20  Stat1;          
1c030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c040 75 65 20 69 66 20 74 61 62 6c 65 20 69 73 20 73  ue if table is s
1c050 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a 20  qlite_stat1 */. 
1c060 20 69 6e 74 20 62 44 65 66 65 72 43 6f 6e 73 74   int bDeferConst
1c070 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 20 20  raints;         
1c080 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 66 65   /* True to defe
1c090 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
1c0a0 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72  .  SessionBuffer
1c0b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20   constraints;   
1c0c0 20 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 63     /* Deferred c
1c0d0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 73  onstraints are s
1c0e0 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
1c0f0 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20 72 65  SessionBuffer re
1c100 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
1c110 2f 2a 20 52 65 62 61 73 65 20 69 6e 66 6f 72 6d  /* Rebase inform
1c120 61 74 69 6f 6e 20 28 69 66 20 61 6e 79 29 20 68  ation (if any) h
1c130 65 72 65 20 2a 2f 0a 20 20 75 38 20 62 52 65 62  ere */.  u8 bReb
1c140 61 73 65 53 74 61 72 74 65 64 3b 20 20 20 20 20  aseStarted;     
1c150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1c160 61 62 6c 65 20 68 65 61 64 65 72 20 69 73 20 61  able header is a
1c170 6c 72 65 61 64 79 20 69 6e 20 72 65 62 61 73 65  lready in rebase
1c180 20 2a 2f 0a 20 20 75 38 20 62 52 65 62 61 73 65   */.  u8 bRebase
1c190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c1a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1c1b0 20 63 6f 6c 6c 65 63 74 20 72 65 62 61 73 65 20   collect rebase 
1c1c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 7d  information */.}
1c1d0 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 75 6c 61  ;../*.** Formula
1c1e0 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  te a statement t
1c1f0 6f 20 44 45 4c 45 54 45 20 61 20 72 6f 77 20 66  o DELETE a row f
1c200 72 6f 6d 20 64 61 74 61 62 61 73 65 20 64 62 2e  rom database db.
1c210 20 41 73 73 75 6d 69 6e 67 20 61 20 74 61 62 6c   Assuming a tabl
1c220 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  e.** structure l
1c230 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1c240 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1c250 20 78 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 50   x(a, b, c, d, P
1c260 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 63 29  RIMARY KEY(a, c)
1c270 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c  );.**.** The DEL
1c280 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f  ETE statement lo
1c290 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
1c2a0 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
1c2b0 46 52 4f 4d 20 78 20 57 48 45 52 45 20 61 20 3d  FROM x WHERE a =
1c2c0 20 3a 31 20 41 4e 44 20 63 20 3d 20 3a 33 20 41   :1 AND c = :3 A
1c2d0 4e 44 20 28 3a 35 20 4f 52 20 62 20 49 53 20 3a  ND (:5 OR b IS :
1c2e0 32 20 41 4e 44 20 64 20 49 53 20 3a 34 29 0a 2a  2 AND d IS :4).*
1c2f0 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 3a 35  *.** Variable :5
1c300 20 28 6e 43 6f 6c 2b 31 29 20 69 73 20 61 20 62   (nCol+1) is a b
1c310 6f 6f 6c 65 61 6e 2e 20 49 74 20 73 68 6f 75 6c  oolean. It shoul
1c320 64 20 62 65 20 73 65 74 20 74 6f 20 30 20 69 66  d be set to 0 if
1c330 20 77 65 20 72 65 71 75 69 72 65 0a 2a 2a 20 6d   we require.** m
1c340 61 74 63 68 69 6e 67 20 62 20 61 6e 64 20 64 20  atching b and d 
1c350 76 61 6c 75 65 73 2c 20 6f 72 20 31 20 6f 74 68  values, or 1 oth
1c360 65 72 77 69 73 65 2e 20 54 68 65 20 73 65 63 6f  erwise. The seco
1c370 6e 64 20 63 61 73 65 20 63 6f 6d 65 73 20 75 70  nd case comes up
1c380 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c   if the.** confl
1c390 69 63 74 20 68 61 6e 64 6c 65 72 20 69 73 20 69  ict handler is i
1c3a0 6e 76 6f 6b 65 64 20 77 69 74 68 20 4e 4f 54 46  nvoked with NOTF
1c3b0 4f 55 4e 44 20 61 6e 64 20 72 65 74 75 72 6e 73  OUND and returns
1c3c0 20 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41   CHANGESET_REPLA
1c3d0 43 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  CE..**.** If suc
1c3e0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
1c3f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1c400 6e 64 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43  nd SessionApplyC
1c410 74 78 2e 70 44 65 6c 65 74 65 20 69 73 20 6c 65  tx.pDelete is le
1c420 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ft.** pointing t
1c430 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 76  o the prepared v
1c440 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ersion of the SQ
1c450 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
1c460 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69  static int sessi
1c470 6f 6e 44 65 6c 65 74 65 52 6f 77 28 0a 20 20 73  onDeleteRow(.  s
1c480 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4a0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1c4b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1c4c0 72 20 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20  r *zTab,        
1c4d0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1c4e0 6e 61 6d 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f  name */.  Sessio
1c4f0 6e 41 70 70 6c 79 43 74 78 20 2a 70 20 20 20 20  nApplyCtx *p    
1c500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73            /* Ses
1c510 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 2d 61  sion changeset-a
1c520 70 70 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  pply context */.
1c530 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
1c540 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
1c550 20 22 22 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   "";.  int rc = 
1c560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 65 73  SQLITE_OK;.  Ses
1c570 73 69 6f 6e 42 75 66 66 65 72 20 62 75 66 20 3d  sionBuffer buf =
1c580 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 69 6e   {0, 0, 0};.  in
1c590 74 20 6e 50 6b 20 3d 20 30 3b 0a 0a 20 20 73 65  t nPk = 0;..  se
1c5a0 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26  ssionAppendStr(&
1c5b0 62 75 66 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  buf, "DELETE FRO
1c5c0 4d 20 22 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  M ", &rc);.  ses
1c5d0 73 69 6f 6e 41 70 70 65 6e 64 49 64 65 6e 74 28  sionAppendIdent(
1c5e0 26 62 75 66 2c 20 7a 54 61 62 2c 20 26 72 63 29  &buf, zTab, &rc)
1c5f0 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ;.  sessionAppen
1c600 64 53 74 72 28 26 62 75 66 2c 20 22 20 57 48 45  dStr(&buf, " WHE
1c610 52 45 20 22 2c 20 26 72 63 29 3b 0a 0a 20 20 66  RE ", &rc);..  f
1c620 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
1c630 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1c640 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a 20   p->abPK[i] ){. 
1c650 20 20 20 20 20 6e 50 6b 2b 2b 3b 0a 20 20 20 20       nPk++;.    
1c660 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53    sessionAppendS
1c670 74 72 28 26 62 75 66 2c 20 7a 53 65 70 2c 20 26  tr(&buf, zSep, &
1c680 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69  rc);.      sessi
1c690 6f 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26 62  onAppendIdent(&b
1c6a0 75 66 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c  uf, p->azCol[i],
1c6b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73   &rc);.      ses
1c6c0 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62  sionAppendStr(&b
1c6d0 75 66 2c 20 22 20 3d 20 3f 22 2c 20 26 72 63 29  uf, " = ?", &rc)
1c6e0 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1c6f0 70 70 65 6e 64 49 6e 74 65 67 65 72 28 26 62 75  ppendInteger(&bu
1c700 66 2c 20 69 2b 31 2c 20 26 72 63 29 3b 0a 20 20  f, i+1, &rc);.  
1c710 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
1c720 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ";.    }.  }.. 
1c730 20 69 66 28 20 6e 50 6b 3c 70 2d 3e 6e 43 6f 6c   if( nPk<p->nCol
1c740 20 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41   ){.    sessionA
1c750 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1c760 20 41 4e 44 20 28 3f 22 2c 20 26 72 63 29 3b 0a   AND (?", &rc);.
1c770 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c780 64 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 70  dInteger(&buf, p
1c790 2d 3e 6e 43 6f 6c 2b 31 2c 20 26 72 63 29 3b 0a  ->nCol+1, &rc);.
1c7a0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c7b0 64 53 74 72 28 26 62 75 66 2c 20 22 20 4f 52 20  dStr(&buf, " OR 
1c7c0 22 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 7a 53  ", &rc);..    zS
1c7d0 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  ep = "";.    for
1c7e0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
1c7f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1c800 20 21 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a   !p->abPK[i] ){.
1c810 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
1c820 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 7a  ppendStr(&buf, z
1c830 53 65 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  Sep, &rc);.     
1c840 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1c850 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d 3e 61  Ident(&buf, p->a
1c860 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zCol[i], &rc);. 
1c870 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70         sessionAp
1c880 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1c890 49 53 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20  IS ?", &rc);.   
1c8a0 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1c8b0 6e 64 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20  ndInteger(&buf, 
1c8c0 69 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  i+1, &rc);.     
1c8d0 20 20 20 7a 53 65 70 20 3d 20 22 41 4e 44 20 22     zSep = "AND "
1c8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c8f0 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
1c900 64 53 74 72 28 26 62 75 66 2c 20 22 29 22 2c 20  dStr(&buf, ")", 
1c910 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  &rc);.  }..  if(
1c920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c930 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c940 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1c950 2c 20 28 63 68 61 72 20 2a 29 62 75 66 2e 61 42  , (char *)buf.aB
1c960 75 66 2c 20 62 75 66 2e 6e 42 75 66 2c 20 26 70  uf, buf.nBuf, &p
1c970 2d 3e 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20  ->pDelete, 0);. 
1c980 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1c990 65 28 62 75 66 2e 61 42 75 66 29 3b 0a 0a 20 20  e(buf.aBuf);..  
1c9a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c9b0 0a 2a 2a 20 46 6f 72 6d 75 6c 61 74 65 20 61 6e  .** Formulate an
1c9c0 64 20 70 72 65 70 61 72 65 20 61 20 73 74 61 74  d prepare a stat
1c9d0 65 6d 65 6e 74 20 74 6f 20 55 50 44 41 54 45 20  ement to UPDATE 
1c9e0 61 20 72 6f 77 20 66 72 6f 6d 20 64 61 74 61 62  a row from datab
1c9f0 61 73 65 20 64 62 2e 20 0a 2a 2a 20 41 73 73 75  ase db. .** Assu
1ca00 6d 69 6e 67 20 61 20 74 61 62 6c 65 20 73 74 72  ming a table str
1ca10 75 63 74 75 72 65 20 6c 69 6b 65 20 74 68 69 73  ucture like this
1ca20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
1ca30 54 45 20 54 41 42 4c 45 20 78 28 61 2c 20 62 2c  TE TABLE x(a, b,
1ca40 20 63 2c 20 64 2c 20 50 52 49 4d 41 52 59 20 4b   c, d, PRIMARY K
1ca50 45 59 28 61 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(a, c));.**.**
1ca60 20 54 68 65 20 55 50 44 41 54 45 20 73 74 61 74   The UPDATE stat
1ca70 65 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ement looks like
1ca80 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ca90 20 55 50 44 41 54 45 20 78 20 53 45 54 0a 2a 2a   UPDATE x SET.**
1caa0 20 20 20 20 20 61 20 3d 20 43 41 53 45 20 57 48       a = CASE WH
1cab0 45 4e 20 3f 32 20 20 54 48 45 4e 20 3f 33 20 20  EN ?2  THEN ?3  
1cac0 45 4c 53 45 20 61 20 45 4e 44 2c 0a 2a 2a 20 20  ELSE a END,.**  
1cad0 20 20 20 62 20 3d 20 43 41 53 45 20 57 48 45 4e     b = CASE WHEN
1cae0 20 3f 35 20 20 54 48 45 4e 20 3f 36 20 20 45 4c   ?5  THEN ?6  EL
1caf0 53 45 20 62 20 45 4e 44 2c 0a 2a 2a 20 20 20 20  SE b END,.**    
1cb00 20 63 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f   c = CASE WHEN ?
1cb10 38 20 20 54 48 45 4e 20 3f 39 20 20 45 4c 53 45  8  THEN ?9  ELSE
1cb20 20 63 20 45 4e 44 2c 0a 2a 2a 20 20 20 20 20 64   c END,.**     d
1cb30 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f 31 31   = CASE WHEN ?11
1cb40 20 54 48 45 4e 20 3f 31 32 20 45 4c 53 45 20 64   THEN ?12 ELSE d
1cb50 20 45 4e 44 0a 2a 2a 20 20 20 20 20 57 48 45 52   END.**     WHER
1cb60 45 20 61 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d  E a = ?1 AND c =
1cb70 20 3f 37 20 41 4e 44 20 28 3f 31 33 20 4f 52 20   ?7 AND (?13 OR 
1cb80 0a 2a 2a 20 20 20 20 20 20 20 28 3f 35 3d 3d 30  .**       (?5==0
1cb90 20 4f 52 20 62 20 49 53 20 3f 34 29 20 41 4e 44   OR b IS ?4) AND
1cba0 20 28 3f 31 31 3d 3d 30 20 4f 52 20 64 20 49 53   (?11==0 OR d IS
1cbb0 20 3f 31 30 29 20 41 4e 44 0a 2a 2a 20 20 20 20   ?10) AND.**    
1cbc0 20 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63   ).**.** For eac
1cbd0 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
1cbe0 74 61 62 6c 65 2c 20 74 68 65 72 65 20 61 72 65  table, there are
1cbf0 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
1cc00 20 74 6f 20 62 69 6e 64 3a 0a 2a 2a 0a 2a 2a 20   to bind:.**.** 
1cc10 20 20 20 20 3f 28 69 2a 33 2b 31 29 20 20 20 20      ?(i*3+1)    
1cc20 54 68 65 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 20  The old.* value 
1cc30 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69  of the column, i
1cc40 66 20 61 6e 79 2e 0a 2a 2a 20 20 20 20 20 3f 28  f any..**     ?(
1cc50 69 2a 33 2b 32 29 20 20 20 20 41 20 62 6f 6f 6c  i*3+2)    A bool
1cc60 65 61 6e 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ean flag indicat
1cc70 69 6e 67 20 74 68 61 74 20 74 68 65 20 76 61 6c  ing that the val
1cc80 75 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 64 69  ue is being modi
1cc90 66 69 65 64 2e 0a 2a 2a 20 20 20 20 20 3f 28 69  fied..**     ?(i
1cca0 2a 33 2b 33 29 20 20 20 20 54 68 65 20 6e 65 77  *3+3)    The new
1ccb0 2e 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  .* value of the 
1ccc0 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a  column, if any..
1ccd0 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 61 20 62 6f  **.** Also, a bo
1cce0 6f 6c 65 61 6e 20 66 6c 61 67 20 74 68 61 74 2c  olean flag that,
1ccf0 20 69 66 20 73 65 74 20 74 6f 20 74 72 75 65 2c   if set to true,
1cd00 20 63 61 75 73 65 73 20 74 68 65 20 73 74 61 74   causes the stat
1cd10 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 0a  ement to update.
1cd20 2a 2a 20 61 20 72 6f 77 20 65 76 65 6e 20 69 66  ** a row even if
1cd30 20 74 68 65 20 6e 6f 6e 2d 50 4b 20 76 61 6c 75   the non-PK valu
1cd40 65 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  es do not match.
1cd50 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1cd60 64 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66  d if the.** conf
1cd70 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 69 73 20  lict-handler is 
1cd80 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 43 48 41  invoked with CHA
1cd90 4e 47 45 53 45 54 5f 44 41 54 41 20 61 6e 64 20  NGESET_DATA and 
1cda0 72 65 74 75 72 6e 73 0a 2a 2a 20 43 48 41 4e 47  returns.** CHANG
1cdb0 45 53 45 54 5f 52 45 50 4c 41 43 45 2e 20 54 68  ESET_REPLACE. Th
1cdc0 69 73 20 69 73 20 76 61 72 69 61 62 6c 65 20 22  is is variable "
1cdd0 3f 28 6e 43 6f 6c 2a 33 2b 31 29 22 2e 0a 2a 2a  ?(nCol*3+1)"..**
1cde0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1cdf0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1ce00 72 65 74 75 72 6e 65 64 20 61 6e 64 20 53 65 73  returned and Ses
1ce10 73 69 6f 6e 41 70 70 6c 79 43 74 78 2e 70 55 70  sionApplyCtx.pUp
1ce20 64 61 74 65 20 69 73 20 6c 65 66 74 0a 2a 2a 20  date is left.** 
1ce30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1ce40 70 72 65 70 61 72 65 64 20 76 65 72 73 69 6f 6e  prepared version
1ce50 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
1ce60 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
1ce70 20 69 6e 74 20 73 65 73 73 69 6f 6e 55 70 64 61   int sessionUpda
1ce80 74 65 52 6f 77 28 0a 20 20 73 71 6c 69 74 65 33  teRow(.  sqlite3
1ce90 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1cea0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1ceb0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1cec0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1ced0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1cee0 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1cef0 2f 0a 20 20 53 65 73 73 69 6f 6e 41 70 70 6c 79  /.  SessionApply
1cf00 43 74 78 20 2a 70 20 20 20 20 20 20 20 20 20 20  Ctx *p          
1cf10 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 63      /* Session c
1cf20 68 61 6e 67 65 73 65 74 2d 61 70 70 6c 79 20 63  hangeset-apply c
1cf30 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 69  ontext */.){.  i
1cf40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cf50 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  K;.  int i;.  co
1cf60 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
1cf70 20 22 22 3b 0a 20 20 53 65 73 73 69 6f 6e 42 75   "";.  SessionBu
1cf80 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30  ffer buf = {0, 0
1cf90 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  , 0};..  /* Appe
1cfa0 6e 64 20 22 55 50 44 41 54 45 20 74 62 6c 20 53  nd "UPDATE tbl S
1cfb0 45 54 20 22 20 2a 2f 0a 20 20 73 65 73 73 69 6f  ET " */.  sessio
1cfc0 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
1cfd0 20 22 55 50 44 41 54 45 20 22 2c 20 26 72 63 29   "UPDATE ", &rc)
1cfe0 3b 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ;.  sessionAppen
1cff0 64 49 64 65 6e 74 28 26 62 75 66 2c 20 7a 54 61  dIdent(&buf, zTa
1d000 62 2c 20 26 72 63 29 3b 0a 20 20 73 65 73 73 69  b, &rc);.  sessi
1d010 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66  onAppendStr(&buf
1d020 2c 20 22 20 53 45 54 20 22 2c 20 26 72 63 29 3b  , " SET ", &rc);
1d030 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1d040 65 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 2a 2f  e assignments */
1d050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1d060 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1d070 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1d080 72 28 26 62 75 66 2c 20 7a 53 65 70 2c 20 26 72  r(&buf, zSep, &r
1d090 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41  c);.    sessionA
1d0a0 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c  ppendIdent(&buf,
1d0b0 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72   p->azCol[i], &r
1d0c0 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41  c);.    sessionA
1d0d0 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1d0e0 20 3d 20 43 41 53 45 20 57 48 45 4e 20 3f 22 2c   = CASE WHEN ?",
1d0f0 20 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69   &rc);.    sessi
1d100 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72 28  onAppendInteger(
1d110 26 62 75 66 2c 20 69 2a 33 2b 32 2c 20 26 72 63  &buf, i*3+2, &rc
1d120 29 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70  );.    sessionAp
1d130 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1d140 54 48 45 4e 20 3f 22 2c 20 26 72 63 29 3b 0a 20  THEN ?", &rc);. 
1d150 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d160 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1d170 33 2b 33 2c 20 26 72 63 29 3b 0a 20 20 20 20 73  3+3, &rc);.    s
1d180 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1d190 26 62 75 66 2c 20 22 20 45 4c 53 45 20 22 2c 20  &buf, " ELSE ", 
1d1a0 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
1d1b0 6e 41 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75  nAppendIdent(&bu
1d1c0 66 2c 20 70 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20  f, p->azCol[i], 
1d1d0 26 72 63 29 3b 0a 20 20 20 20 73 65 73 73 69 6f  &rc);.    sessio
1d1e0 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c  nAppendStr(&buf,
1d1f0 20 22 20 45 4e 44 22 2c 20 26 72 63 29 3b 0a 20   " END", &rc);. 
1d200 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
1d210 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
1d220 20 74 68 65 20 50 4b 20 70 61 72 74 20 6f 66 20   the PK part of 
1d230 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1d240 20 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 41 70 70   */.  sessionApp
1d250 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20 57  endStr(&buf, " W
1d260 48 45 52 45 20 22 2c 20 26 72 63 29 3b 0a 20 20  HERE ", &rc);.  
1d270 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1d280 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1d290 28 20 70 2d 3e 61 62 50 4b 5b 69 5d 20 29 7b 0a  ( p->abPK[i] ){.
1d2a0 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
1d2b0 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c 20 70  endIdent(&buf, p
1d2c0 2d 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29  ->azCol[i], &rc)
1d2d0 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1d2e0 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1d2f0 20 3d 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20   = ?", &rc);.   
1d300 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d310 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1d320 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  3+1, &rc);.     
1d330 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1d340 72 28 26 62 75 66 2c 20 22 20 41 4e 44 20 22 2c  r(&buf, " AND ",
1d350 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d360 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1d370 65 20 6e 6f 6e 2d 50 4b 20 70 61 72 74 20 6f 66  e non-PK part of
1d380 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d390 65 20 2a 2f 0a 20 20 73 65 73 73 69 6f 6e 41 70  e */.  sessionAp
1d3a0 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1d3b0 28 3f 22 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  (?", &rc);.  ses
1d3c0 73 69 6f 6e 41 70 70 65 6e 64 49 6e 74 65 67 65  sionAppendIntege
1d3d0 72 28 26 62 75 66 2c 20 70 2d 3e 6e 43 6f 6c 2a  r(&buf, p->nCol*
1d3e0 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 73 65 73  3+1, &rc);.  ses
1d3f0 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62  sionAppendStr(&b
1d400 75 66 2c 20 22 20 4f 52 20 31 22 2c 20 26 72 63  uf, " OR 1", &rc
1d410 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1d420 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
1d430 20 20 20 69 66 28 20 21 70 2d 3e 61 62 50 4b 5b     if( !p->abPK[
1d440 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 65 73 73  i] ){.      sess
1d450 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75  ionAppendStr(&bu
1d460 66 2c 20 22 20 41 4e 44 20 28 3f 22 2c 20 26 72  f, " AND (?", &r
1d470 63 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f  c);.      sessio
1d480 6e 41 70 70 65 6e 64 49 6e 74 65 67 65 72 28 26  nAppendInteger(&
1d490 62 75 66 2c 20 69 2a 33 2b 32 2c 20 26 72 63 29  buf, i*3+2, &rc)
1d4a0 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
1d4b0 70 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22  ppendStr(&buf, "
1d4c0 3d 30 20 4f 52 20 22 2c 20 26 72 63 29 3b 0a 20  =0 OR ", &rc);. 
1d4d0 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65       sessionAppe
1d4e0 6e 64 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d  ndIdent(&buf, p-
1d4f0 3e 61 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b  >azCol[i], &rc);
1d500 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70  .      sessionAp
1d510 70 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 20  pendStr(&buf, " 
1d520 49 53 20 3f 22 2c 20 26 72 63 29 3b 0a 20 20 20  IS ?", &rc);.   
1d530 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1d540 49 6e 74 65 67 65 72 28 26 62 75 66 2c 20 69 2a  Integer(&buf, i*
1d550 33 2b 31 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  3+1, &rc);.     
1d560 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1d570 72 28 26 62 75 66 2c 20 22 29 22 2c 20 26 72 63  r(&buf, ")", &rc
1d580 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1d590 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1d5a0 26 62 75 66 2c 20 22 29 22 2c 20 26 72 63 29 3b  &buf, ")", &rc);
1d5b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d5c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1d5d0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1d5e0 65 5f 76 32 28 64 62 2c 20 28 63 68 61 72 20 2a  e_v2(db, (char *
1d5f0 29 62 75 66 2e 61 42 75 66 2c 20 62 75 66 2e 6e  )buf.aBuf, buf.n
1d600 42 75 66 2c 20 26 70 2d 3e 70 55 70 64 61 74 65  Buf, &p->pUpdate
1d610 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1d620 74 65 33 5f 66 72 65 65 28 62 75 66 2e 61 42 75  te3_free(buf.aBu
1d630 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  f);..  return rc
1d640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d  ;.}.../*.** Form
1d650 75 6c 61 74 65 20 61 6e 64 20 70 72 65 70 61 72  ulate and prepar
1d660 65 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  e an SQL stateme
1d670 6e 74 20 74 6f 20 71 75 65 72 79 20 74 61 62 6c  nt to query tabl
1d680 65 20 7a 54 61 62 20 62 79 20 70 72 69 6d 61 72  e zTab by primar
1d690 79 0a 2a 2a 20 6b 65 79 2e 20 41 73 73 75 6d 69  y.** key. Assumi
1d6a0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1d6b0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1d6c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
1d6d0 54 45 20 54 41 42 4c 45 20 78 28 61 2c 20 62 2c  TE TABLE x(a, b,
1d6e0 20 63 2c 20 64 2c 20 50 52 49 4d 41 52 59 20 4b   c, d, PRIMARY K
1d6f0 45 59 28 61 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(a, c));.**.**
1d700 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1d710 65 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ement looks like
1d720 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1d730 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
1d740 20 57 48 45 52 45 20 61 20 3d 20 3f 31 20 41 4e   WHERE a = ?1 AN
1d750 44 20 63 20 3d 20 3f 33 0a 2a 2a 0a 2a 2a 20 49  D c = ?3.**.** I
1d760 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
1d770 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d780 6e 65 64 20 61 6e 64 20 53 65 73 73 69 6f 6e 41  ned and SessionA
1d790 70 70 6c 79 43 74 78 2e 70 53 65 6c 65 63 74 20  pplyCtx.pSelect 
1d7a0 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
1d7b0 69 6e 67 20 74 6f 20 74 68 65 20 70 72 65 70 61  ing to the prepa
1d7c0 72 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  red version of t
1d7d0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1d7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d7f0 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 52 6f 77  sessionSelectRow
1d800 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d830 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
1d840 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20  t char *zTab,   
1d850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d860 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 53  able name */.  S
1d870 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a  essionApplyCtx *
1d880 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1d890 2a 20 53 65 73 73 69 6f 6e 20 63 68 61 6e 67 65  * Session change
1d8a0 73 65 74 2d 61 70 70 6c 79 20 63 6f 6e 74 65 78  set-apply contex
1d8b0 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
1d8c0 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 53 74   sessionSelectSt
1d8d0 6d 74 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d  mt(.      db, "m
1d8e0 61 69 6e 22 2c 20 7a 54 61 62 2c 20 70 2d 3e 6e  ain", zTab, p->n
1d8f0 43 6f 6c 2c 20 70 2d 3e 61 7a 43 6f 6c 2c 20 70  Col, p->azCol, p
1d900 2d 3e 61 62 50 4b 2c 20 26 70 2d 3e 70 53 65 6c  ->abPK, &p->pSel
1d910 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ect);.}../*.** F
1d920 6f 72 6d 75 6c 61 74 65 20 61 6e 64 20 70 72 65  ormulate and pre
1d930 70 61 72 65 20 61 6e 20 49 4e 53 45 52 54 20 73  pare an INSERT s
1d940 74 61 74 65 6d 65 6e 74 20 74 6f 20 61 64 64 20  tatement to add 
1d950 61 20 72 65 63 6f 72 64 20 74 6f 20 74 61 62 6c  a record to tabl
1d960 65 20 7a 54 61 62 2e 0a 2a 2a 20 46 6f 72 20 65  e zTab..** For e
1d970 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
1d980 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
1d990 69 6e 2e 22 7a 54 61 62 22 20 56 41 4c 55 45 53  in."zTab" VALUES
1d9a0 28 3f 31 2c 20 3f 32 2c 20 3f 33 20 2e 2e 2e 29  (?1, ?2, ?3 ...)
1d9b0 3b 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ;.**.** If succe
1d9c0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1d9d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d9e0 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78   SessionApplyCtx
1d9f0 2e 70 49 6e 73 65 72 74 20 69 73 20 6c 65 66 74  .pInsert is left
1da00 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
1da10 74 68 65 20 70 72 65 70 61 72 65 64 20 76 65 72  the prepared ver
1da20 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 20  sion of the SQL 
1da30 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
1da40 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
1da50 49 6e 73 65 72 74 52 6f 77 28 0a 20 20 73 71 6c  InsertRow(.  sql
1da60 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da80 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1da90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1daa0 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *zTab,          
1dab0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1dac0 6d 65 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 41  me */.  SessionA
1dad0 70 70 6c 79 43 74 78 20 2a 70 20 20 20 20 20 20  pplyCtx *p      
1dae0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69          /* Sessi
1daf0 6f 6e 20 63 68 61 6e 67 65 73 65 74 2d 61 70 70  on changeset-app
1db00 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ly context */.){
1db10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1db20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
1db30 20 20 53 65 73 73 69 6f 6e 42 75 66 66 65 72 20    SessionBuffer 
1db40 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
1db50 0a 0a 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e  ..  sessionAppen
1db60 64 53 74 72 28 26 62 75 66 2c 20 22 49 4e 53 45  dStr(&buf, "INSE
1db70 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 22 2c 20  RT INTO main.", 
1db80 26 72 63 29 3b 0a 20 20 73 65 73 73 69 6f 6e 41  &rc);.  sessionA
1db90 70 70 65 6e 64 49 64 65 6e 74 28 26 62 75 66 2c  ppendIdent(&buf,
1dba0 20 7a 54 61 62 2c 20 26 72 63 29 3b 0a 20 20 73   zTab, &rc);.  s
1dbb0 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74 72 28  essionAppendStr(
1dbc0 26 62 75 66 2c 20 22 28 22 2c 20 26 72 63 29 3b  &buf, "(", &rc);
1dbd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1dbe0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1dbf0 20 69 66 28 20 69 21 3d 30 20 29 20 73 65 73 73   if( i!=0 ) sess
1dc00 69 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75  ionAppendStr(&bu
1dc10 66 2c 20 22 2c 20 22 2c 20 26 72 63 29 3b 0a 20  f, ", ", &rc);. 
1dc20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
1dc30 49 64 65 6e 74 28 26 62 75 66 2c 20 70 2d 3e 61  Ident(&buf, p->a
1dc40 7a 43 6f 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zCol[i], &rc);. 
1dc50 20 7d 0a 0a 20 20 73 65 73 73 69 6f 6e 41 70 70   }..  sessionApp
1dc60 65 6e 64 53 74 72 28 26 62 75 66 2c 20 22 29 20  endStr(&buf, ") 
1dc70 56 41 4c 55 45 53 28 3f 22 2c 20 26 72 63 29 3b  VALUES(?", &rc);
1dc80 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
1dc90 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1dca0 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 53 74   sessionAppendSt
1dcb0 72 28 26 62 75 66 2c 20 22 2c 20 3f 22 2c 20 26  r(&buf, ", ?", &
1dcc0 72 63 29 3b 0a 20 20 7d 0a 20 20 73 65 73 73 69  rc);.  }.  sessi
1dcd0 6f 6e 41 70 70 65 6e 64 53 74 72 28 26 62 75 66  onAppendStr(&buf
1dce0 2c 20 22 29 22 2c 20 26 72 63 29 3b 0a 0a 20 20  , ")", &rc);..  
1dcf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dd00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1dd10 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1dd20 28 64 62 2c 20 28 63 68 61 72 20 2a 29 62 75 66  (db, (char *)buf
1dd30 2e 61 42 75 66 2c 20 62 75 66 2e 6e 42 75 66 2c  .aBuf, buf.nBuf,
1dd40 20 26 70 2d 3e 70 49 6e 73 65 72 74 2c 20 30 29   &p->pInsert, 0)
1dd50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1dd60 66 72 65 65 28 62 75 66 2e 61 42 75 66 29 3b 0a  free(buf.aBuf);.
1dd70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dd80 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69  static int sessi
1dd90 6f 6e 50 72 65 70 61 72 65 28 73 71 6c 69 74 65  onPrepare(sqlite
1dda0 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 73  3 *db, sqlite3_s
1ddb0 74 6d 74 20 2a 2a 70 70 2c 20 63 6f 6e 73 74 20  tmt **pp, const 
1ddc0 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 72  char *zSql){.  r
1ddd0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
1dde0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
1ddf0 6c 2c 20 2d 31 2c 20 70 70 2c 20 30 29 3b 0a 7d  l, -1, pp, 0);.}
1de00 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
1de10 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 61  statements for a
1de20 70 70 6c 79 69 6e 67 20 63 68 61 6e 67 65 73 20  pplying changes 
1de30 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  to the sqlite_st
1de40 61 74 31 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  at1 table..** Th
1de50 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ese are similar 
1de60 74 6f 20 74 68 6f 73 65 20 63 72 65 61 74 65 64  to those created
1de70 20 62 79 20 73 65 73 73 69 6f 6e 53 65 6c 65 63   by sessionSelec
1de80 74 52 6f 77 28 29 2c 0a 2a 2a 20 73 65 73 73 69  tRow(),.** sessi
1de90 6f 6e 49 6e 73 65 72 74 52 6f 77 28 29 2c 20 73  onInsertRow(), s
1dea0 65 73 73 69 6f 6e 55 70 64 61 74 65 52 6f 77 28  essionUpdateRow(
1deb0 29 20 61 6e 64 20 73 65 73 73 69 6f 6e 44 65 6c  ) and sessionDel
1dec0 65 74 65 52 6f 77 28 29 20 66 6f 72 20 0a 2a 2a  eteRow() for .**
1ded0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2e 0a 2a   other tables..*
1dee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
1def0 73 69 6f 6e 53 74 61 74 31 53 71 6c 28 73 71 6c  sionStat1Sql(sql
1df00 69 74 65 33 20 2a 64 62 2c 20 53 65 73 73 69 6f  ite3 *db, Sessio
1df10 6e 41 70 70 6c 79 43 74 78 20 2a 70 29 7b 0a 20  nApplyCtx *p){. 
1df20 20 69 6e 74 20 72 63 20 3d 20 73 65 73 73 69 6f   int rc = sessio
1df30 6e 53 65 6c 65 63 74 52 6f 77 28 64 62 2c 20 22  nSelectRow(db, "
1df40 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 70  sqlite_stat1", p
1df50 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1df60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1df70 20 3d 20 73 65 73 73 69 6f 6e 50 72 65 70 61 72   = sessionPrepar
1df80 65 28 64 62 2c 20 26 70 2d 3e 70 49 6e 73 65 72  e(db, &p->pInser
1df90 74 2c 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  t,.        "INSE
1dfa0 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 73 71 6c  RT INTO main.sql
1dfb0 69 74 65 5f 73 74 61 74 31 20 56 41 4c 55 45 53  ite_stat1 VALUES
1dfc0 28 3f 31 2c 20 22 0a 20 20 20 20 20 20 20 20 22  (?1, ".        "
1dfd0 43 41 53 45 20 57 48 45 4e 20 6c 65 6e 67 74 68  CASE WHEN length
1dfe0 28 3f 32 29 3d 30 20 41 4e 44 20 74 79 70 65 6f  (?2)=0 AND typeo
1dff0 66 28 3f 32 29 3d 27 62 6c 6f 62 27 20 54 48 45  f(?2)='blob' THE
1e000 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 3f 32 20 45  N NULL ELSE ?2 E
1e010 4e 44 2c 20 22 0a 20 20 20 20 20 20 20 20 22 3f  ND, ".        "?
1e020 33 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  3)".    );.  }. 
1e030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e040 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1e050 65 73 73 69 6f 6e 50 72 65 70 61 72 65 28 64 62  essionPrepare(db
1e060 2c 20 26 70 2d 3e 70 55 70 64 61 74 65 2c 0a 20  , &p->pUpdate,. 
1e070 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20 6d         "UPDATE m
1e080 61 69 6e 2e 73 71 6c 69 74 65 5f 73 74 61 74 31  ain.sqlite_stat1
1e090 20 53 45 54 20 22 0a 20 20 20 20 20 20 20 20 22   SET ".        "
1e0a0 74 62 6c 20 3d 20 43 41 53 45 20 57 48 45 4e 20  tbl = CASE WHEN 
1e0b0 3f 32 20 54 48 45 4e 20 3f 33 20 45 4c 53 45 20  ?2 THEN ?3 ELSE 
1e0c0 74 62 6c 20 45 4e 44 2c 20 22 0a 20 20 20 20 20  tbl END, ".     
1e0d0 20 20 20 22 69 64 78 20 3d 20 43 41 53 45 20 57     "idx = CASE W
1e0e0 48 45 4e 20 3f 35 20 54 48 45 4e 20 3f 36 20 45  HEN ?5 THEN ?6 E
1e0f0 4c 53 45 20 69 64 78 20 45 4e 44 2c 20 22 0a 20  LSE idx END, ". 
1e100 20 20 20 20 20 20 20 22 73 74 61 74 20 3d 20 43         "stat = C
1e110 41 53 45 20 57 48 45 4e 20 3f 38 20 54 48 45 4e  ASE WHEN ?8 THEN
1e120 20 3f 39 20 45 4c 53 45 20 73 74 61 74 20 45 4e   ?9 ELSE stat EN
1e130 44 20 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  D  ".        "WH
1e140 45 52 45 20 74 62 6c 3d 3f 31 20 41 4e 44 20 69  ERE tbl=?1 AND i
1e150 64 78 20 49 53 20 22 0a 20 20 20 20 20 20 20 20  dx IS ".        
1e160 22 43 41 53 45 20 57 48 45 4e 20 6c 65 6e 67 74  "CASE WHEN lengt
1e170 68 28 3f 34 29 3d 30 20 41 4e 44 20 74 79 70 65  h(?4)=0 AND type
1e180 6f 66 28 3f 34 29 3d 27 62 6c 6f 62 27 20 54 48  of(?4)='blob' TH
1e190 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 3f 34 20  EN NULL ELSE ?4 
1e1a0 45 4e 44 20 22 0a 20 20 20 20 20 20 20 20 22 41  END ".        "A
1e1b0 4e 44 20 28 3f 31 30 20 4f 52 20 3f 38 3d 30 20  ND (?10 OR ?8=0 
1e1c0 4f 52 20 73 74 61 74 20 49 53 20 3f 37 29 22 0a  OR stat IS ?7)".
1e1d0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
1e1e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e1f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69  {.    rc = sessi
1e200 6f 6e 50 72 65 70 61 72 65 28 64 62 2c 20 26 70  onPrepare(db, &p
1e210 2d 3e 70 44 65 6c 65 74 65 2c 0a 20 20 20 20 20  ->pDelete,.     
1e220 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1e230 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 73 74 61 74  main.sqlite_stat
1e240 31 20 57 48 45 52 45 20 74 62 6c 3d 3f 31 20 41  1 WHERE tbl=?1 A
1e250 4e 44 20 69 64 78 20 49 53 20 22 0a 20 20 20 20  ND idx IS ".    
1e260 20 20 20 20 22 43 41 53 45 20 57 48 45 4e 20 6c      "CASE WHEN l
1e270 65 6e 67 74 68 28 3f 32 29 3d 30 20 41 4e 44 20  ength(?2)=0 AND 
1e280 74 79 70 65 6f 66 28 3f 32 29 3d 27 62 6c 6f 62  typeof(?2)='blob
1e290 27 20 54 48 45 4e 20 4e 55 4c 4c 20 45 4c 53 45  ' THEN NULL ELSE
1e2a0 20 3f 32 20 45 4e 44 20 22 0a 20 20 20 20 20 20   ?2 END ".      
1e2b0 20 20 22 41 4e 44 20 28 3f 34 20 4f 52 20 73 74    "AND (?4 OR st
1e2c0 61 74 20 49 53 20 3f 33 29 22 0a 20 20 20 20 29  at IS ?3)".    )
1e2d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e2e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  c;.}../*.** A wr
1e2f0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1e300 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
1e310 29 20 74 68 61 74 20 64 65 74 65 63 74 73 20 61  ) that detects a
1e320 6e 20 65 78 74 72 61 20 70 72 6f 62 6c 65 6d 2e  n extra problem.
1e330 20 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74   .** See comment
1e340 73 20 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  s in the body of
1e350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1e360 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73  or details..*/.s
1e370 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1e380 6e 42 69 6e 64 56 61 6c 75 65 28 0a 20 20 73 71  nBindValue(.  sq
1e390 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e3a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
1e3b0 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 69   Statement to bi
1e3c0 6e 64 20 76 61 6c 75 65 20 74 6f 20 2a 2f 0a 20  nd value to */. 
1e3d0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3f0 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 75   /* Parameter nu
1e400 6d 62 65 72 20 74 6f 20 62 69 6e 64 20 74 6f 20  mber to bind to 
1e410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1e420 75 65 20 2a 70 56 61 6c 20 20 20 20 20 20 20 20  ue *pVal        
1e430 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1e440 20 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e   bind */.){.  in
1e450 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65  t eType = sqlite
1e460 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
1e470 6c 29 3b 0a 20 20 2f 2a 20 43 4f 56 45 52 41 47  l);.  /* COVERAG
1e480 45 3a 20 54 68 65 20 28 70 56 61 6c 2d 3e 7a 3d  E: The (pVal->z=
1e490 3d 30 29 20 62 72 61 6e 63 68 20 69 73 20 6e 65  =0) branch is ne
1e4a0 76 65 72 20 74 72 75 65 20 75 73 69 6e 67 20 63  ver true using c
1e4b0 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 73 0a  urrent versions.
1e4c0 20 20 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 20    ** of SQLite. 
1e4d0 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
1e4e0 73 20 69 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f  s in an sqlite3_
1e4f0 76 61 6c 75 65 5f 78 78 78 28 29 20 66 75 6e 63  value_xxx() func
1e500 74 69 6f 6e 2c 20 65 69 74 68 65 72 0a 20 20 2a  tion, either.  *
1e510 2a 20 74 68 65 20 28 70 56 61 6c 2d 3e 7a 29 20  * the (pVal->z) 
1e520 76 61 72 69 61 62 6c 65 20 72 65 6d 61 69 6e 73  variable remains
1e530 20 61 73 20 69 74 20 77 61 73 20 6f 72 20 74 68   as it was or th
1e540 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 76 61  e type of the va
1e550 6c 75 65 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  lue is.  ** set 
1e560 74 6f 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 2e 20  to SQLITE_NULL. 
1e570 20 2a 2f 0a 20 20 69 66 28 20 28 65 54 79 70 65   */.  if( (eType
1e580 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
1e590 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
1e5a0 4c 4f 42 29 20 26 26 20 70 56 61 6c 2d 3e 7a 3d  LOB) && pVal->z=
1e5b0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1e5c0 73 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  s condition occu
1e5d0 72 73 20 77 68 65 6e 20 61 6e 20 65 61 72 6c 69  rs when an earli
1e5e0 65 72 20 4f 4f 4d 20 69 6e 20 61 20 63 61 6c 6c  er OOM in a call
1e5f0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
1e600 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20  e3_value_text() 
1e610 6f 72 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  or sqlite3_value
1e620 5f 62 6c 6f 62 28 29 20 28 70 65 72 68 61 70 73  _blob() (perhaps
1e630 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 20 20 20   from within.   
1e640 20 2a 2a 20 61 20 63 6f 6e 66 6c 69 63 74 2d 68   ** a conflict-h
1e650 61 6e 64 6c 65 72 29 20 68 61 73 20 7a 65 72 6f  andler) has zero
1e660 65 64 20 74 68 65 20 70 56 61 6c 2d 3e 7a 20 70  ed the pVal->z p
1e670 6f 69 6e 74 65 72 2e 20 52 65 74 75 72 6e 20 4e  ointer. Return N
1e680 4f 4d 45 4d 2e 20 2a 2f 0a 20 20 20 20 72 65 74  OMEM. */.    ret
1e690 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e6a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1e6b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1e6c0 65 28 70 53 74 6d 74 2c 20 69 2c 20 70 56 61 6c  e(pStmt, i, pVal
1e6d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
1e6e0 61 74 6f 72 20 70 49 74 65 72 20 6d 75 73 74 20  ator pIter must 
1e6f0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 53 51 4c 49  point to an SQLI
1e700 54 45 5f 49 4e 53 45 52 54 20 65 6e 74 72 79 2e  TE_INSERT entry.
1e710 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1e720 2a 2a 20 74 72 61 6e 73 66 65 72 73 20 6e 65 77  ** transfers new
1e730 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  .* values from t
1e740 68 65 20 63 75 72 72 65 6e 74 20 69 74 65 72 61  he current itera
1e750 74 6f 72 20 65 6e 74 72 79 20 74 6f 20 73 74 61  tor entry to sta
1e760 74 65 6d 65 6e 74 0a 2a 2a 20 70 53 74 6d 74 2e  tement.** pStmt.
1e770 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
1e780 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 68   inserted into h
1e790 61 73 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e  as nCol columns.
1e7a0 0a 2a 2a 0a 2a 2a 20 4e 65 77 2e 2a 20 76 61 6c  .**.** New.* val
1e7b0 75 65 20 24 69 20 66 72 6f 6d 20 74 68 65 20 69  ue $i from the i
1e7c0 74 65 72 61 74 6f 72 20 69 73 20 62 6f 75 6e 64  terator is bound
1e7d0 20 74 6f 20 76 61 72 69 61 62 6c 65 20 28 24 69   to variable ($i
1e7e0 2b 31 29 20 6f 66 20 0a 2a 2a 20 73 74 61 74 65  +1) of .** state
1e7f0 6d 65 6e 74 20 70 53 74 6d 74 2e 20 49 66 20 70  ment pStmt. If p
1e800 61 72 61 6d 65 74 65 72 20 61 62 50 4b 20 69 73  arameter abPK is
1e810 20 4e 55 4c 4c 2c 20 61 6c 6c 20 76 61 6c 75 65   NULL, all value
1e820 73 20 66 72 6f 6d 20 30 20 74 6f 20 28 6e 43 6f  s from 0 to (nCo
1e830 6c 2d 31 29 0a 2a 2a 20 61 72 65 20 74 72 61 6e  l-1).** are tran
1e840 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 73 74  sfered to the st
1e850 61 74 65 6d 65 6e 74 2e 20 4f 74 68 65 72 77 69  atement. Otherwi
1e860 73 65 2c 20 69 66 20 61 62 50 4b 20 69 73 20 6e  se, if abPK is n
1e870 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
1e880 74 73 0a 2a 2a 20 74 6f 20 61 6e 20 61 72 72 61  ts.** to an arra
1e890 79 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20  y nCol elements 
1e8a0 69 6e 20 73 69 7a 65 2e 20 49 6e 20 74 68 69 73  in size. In this
1e8b0 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 6f 73 65   case only those
1e8c0 20 76 61 6c 75 65 73 20 66 6f 72 20 0a 2a 2a 20   values for .** 
1e8d0 77 68 69 63 68 20 61 62 50 4b 5b 24 69 5d 20 69  which abPK[$i] i
1e8e0 73 20 74 72 75 65 20 61 72 65 20 72 65 61 64 20  s true are read 
1e8f0 66 72 6f 6d 20 74 68 65 20 69 74 65 72 61 74 6f  from the iterato
1e900 72 20 61 6e 64 20 62 6f 75 6e 64 20 74 6f 20 74  r and bound to t
1e910 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
1e920 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 53 51 4c 69 74  ..**.** An SQLit
1e930 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1e940 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20 65  returned if an e
1e950 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 4f 74 68  rror occurs. Oth
1e960 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1e970 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1e980 20 73 65 73 73 69 6f 6e 42 69 6e 64 52 6f 77 28   sessionBindRow(
1e990 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
1e9a0 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
1e9b0 2c 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74  ,  /* Iterator t
1e9c0 6f 20 72 65 61 64 20 76 61 6c 75 65 73 20 66 72  o read values fr
1e9d0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 56 61  om */.  int(*xVa
1e9e0 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 68 61  lue)(sqlite3_cha
1e9f0 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 2c 20 69  ngeset_iter *, i
1ea00 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  nt, sqlite3_valu
1ea10 65 20 2a 2a 29 2c 0a 20 20 69 6e 74 20 6e 43 6f  e **),.  int nCo
1ea20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1ea30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ea40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
1ea50 0a 20 20 75 38 20 2a 61 62 50 4b 2c 20 20 20 20  .  u8 *abPK,    
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
1ea80 4c 2c 20 62 69 6e 64 20 6f 6e 6c 79 20 69 66 20  L, bind only if 
1ea90 74 72 75 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  true */.  sqlite
1eaa0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20  3_stmt *pStmt   
1eab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
1eac0 64 20 76 61 6c 75 65 73 20 74 6f 20 74 68 69 73  d values to this
1ead0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
1eae0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1eaf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eb00 0a 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 71  .  /* Neither sq
1eb10 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
1eb20 6c 64 20 6f 72 20 73 71 6c 69 74 65 33 63 68 61  ld or sqlite3cha
1eb30 6e 67 65 73 65 74 5f 6e 65 77 20 63 61 6e 20 66  ngeset_new can f
1eb40 61 69 6c 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  ail if the.  ** 
1eb50 61 72 67 75 6d 65 6e 74 20 69 74 65 72 61 74 6f  argument iterato
1eb60 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 75  r points to a su
1eb70 69 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 4d 61  itable entry. Ma
1eb80 6b 65 20 73 75 72 65 20 74 68 61 74 20 78 56 61  ke sure that xVa
1eb90 6c 75 65 20 0a 20 20 2a 2a 20 69 73 20 6f 6e 65  lue .  ** is one
1eba0 20 6f 66 20 74 68 65 73 65 20 74 6f 20 67 75 61   of these to gua
1ebb0 72 61 6e 74 65 65 20 74 68 61 74 20 69 74 20 69  rantee that it i
1ebc0 73 20 73 61 66 65 20 74 6f 20 69 67 6e 6f 72 65  s safe to ignore
1ebd0 20 74 68 65 20 72 65 74 75 72 6e 20 0a 20 20 2a   the return .  *
1ebe0 2a 20 69 6e 20 74 68 65 20 63 6f 64 65 20 62 65  * in the code be
1ebf0 6c 6f 77 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  low. */.  assert
1ec00 28 20 78 56 61 6c 75 65 3d 3d 73 71 6c 69 74 65  ( xValue==sqlite
1ec10 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 20 7c  3changeset_old |
1ec20 7c 20 78 56 61 6c 75 65 3d 3d 73 71 6c 69 74 65  | xValue==sqlite
1ec30 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 20 29  3changeset_new )
1ec40 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  ;..  for(i=0; rc
1ec50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1ec60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1ec70 20 69 66 28 20 21 61 62 50 4b 20 7c 7c 20 61 62   if( !abPK || ab
1ec80 50 4b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  PK[i] ){.      s
1ec90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1eca0 61 6c 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29  al;.      (void)
1ecb0 78 56 61 6c 75 65 28 70 49 74 65 72 2c 20 69 2c  xValue(pIter, i,
1ecc0 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
1ecd0 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( pVal==0 ){.  
1ece0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
1ecf0 75 65 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ue in the change
1ed00 73 65 74 20 77 61 73 20 22 75 6e 64 65 66 69 6e  set was "undefin
1ed10 65 64 22 2e 20 54 68 69 73 20 69 6e 64 69 63 61  ed". This indica
1ed20 74 65 73 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  tes a.        **
1ed30 20 63 6f 72 72 75 70 74 20 63 68 61 6e 67 65 73   corrupt changes
1ed40 65 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20  et blob.  */.   
1ed50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ed60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ed70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ed80 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
1ed90 42 69 6e 64 56 61 6c 75 65 28 70 53 74 6d 74 2c  BindValue(pStmt,
1eda0 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20   i+1, pVal);.   
1edb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1edc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1edd0 2a 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  *.** SQL stateme
1ede0 6e 74 20 70 53 65 6c 65 63 74 20 69 73 20 61 73  nt pSelect is as
1edf0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
1ee00 65 20 73 65 73 73 69 6f 6e 53 65 6c 65 63 74 52  e sessionSelectR
1ee10 6f 77 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ow() function..*
1ee20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ee30 62 69 6e 64 73 20 74 68 65 20 70 72 69 6d 61 72  binds the primar
1ee40 79 20 6b 65 79 20 76 61 6c 75 65 73 20 66 72 6f  y key values fro
1ee50 6d 20 74 68 65 20 63 68 61 6e 67 65 20 74 68 61  m the change tha
1ee60 74 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a 20 69  t changeset.** i
1ee70 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 70 6f  terator pIter po
1ee80 69 6e 74 73 20 74 6f 20 74 6f 20 74 68 65 20 53  ints to to the S
1ee90 45 4c 45 43 54 20 61 6e 64 20 61 74 74 65 6d 70  ELECT and attemp
1eea0 74 73 20 74 6f 20 73 65 65 6b 20 74 6f 20 74 68  ts to seek to th
1eeb0 65 20 74 61 62 6c 65 0a 2a 2a 20 65 6e 74 72 79  e table.** entry
1eec0 2e 20 49 66 20 61 20 72 6f 77 20 69 73 20 66 6f  . If a row is fo
1eed0 75 6e 64 2c 20 74 68 65 20 53 45 4c 45 43 54 20  und, the SELECT 
1eee0 73 74 61 74 65 6d 65 6e 74 20 6c 65 66 74 20 70  statement left p
1eef0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 72  ointing at the r
1ef00 6f 77 20 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ow .** and SQLIT
1ef10 45 5f 52 4f 57 20 69 73 20 72 65 74 75 72 6e 65  E_ROW is returne
1ef20 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1ef30 20 6e 6f 20 72 6f 77 20 69 73 20 66 6f 75 6e 64   no row is found
1ef40 20 61 6e 64 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a   and no error.**
1ef50 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 74 68   has occured, th
1ef60 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
1ef70 65 73 65 74 20 61 6e 64 20 53 51 4c 49 54 45 5f  eset and SQLITE_
1ef80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1ef90 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  If an.** error o
1efa0 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
1efb0 6d 65 6e 74 20 69 73 20 72 65 73 65 74 20 61 6e  ment is reset an
1efc0 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
1efd0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1efe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
1eff0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1f000 6e 73 20 53 51 4c 49 54 45 5f 52 4f 57 2c 20 74  ns SQLITE_ROW, t
1f010 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1f020 76 65 6e 74 75 61 6c 6c 79 20 72 65 73 65 74 28  ventually reset(
1f030 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
1f040 70 53 65 6c 65 63 74 2e 20 49 66 20 61 6e 79 20  pSelect. If any 
1f050 6f 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 72  other value is r
1f060 65 74 75 72 6e 65 64 2c 20 74 68 65 20 73 74 61  eturned, the sta
1f070 74 65 6d 65 6e 74 20 64 6f 65 73 0a 2a 2a 20 6e  tement does.** n
1f080 6f 74 20 72 65 71 75 69 72 65 20 61 20 72 65 73  ot require a res
1f090 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  et()..**.** If t
1f0a0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1f0b0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1f0c0 61 6e 20 49 4e 53 45 52 54 20 72 65 63 6f 72 64  an INSERT record
1f0d0 2c 20 62 69 6e 64 20 76 61 6c 75 65 73 20 66 72  , bind values fr
1f0e0 6f 6d 20 74 68 65 0a 2a 2a 20 6e 65 77 2e 2a 20  om the.** new.* 
1f0f0 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 53 45  record to the SE
1f100 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1f110 4f 72 2c 20 69 66 20 69 74 20 70 6f 69 6e 74 73  Or, if it points
1f120 20 74 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 0a   to a DELETE or.
1f130 2a 2a 20 55 50 44 41 54 45 2c 20 62 69 6e 64 20  ** UPDATE, bind 
1f140 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
1f150 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 2e 20 0a 2a  old.* record. .*
1f160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
1f170 73 69 6f 6e 53 65 65 6b 54 6f 52 6f 77 28 0a 20  sionSeekToRow(. 
1f180 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
1f1b0 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
1f1c0 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
1f1d0 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e  *pIter,  /* Chan
1f1e0 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 2a  geset iterator *
1f1f0 2f 0a 20 20 75 38 20 2a 61 62 50 4b 2c 20 20 20  /.  u8 *abPK,   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b      /* Primary k
1f220 65 79 20 66 6c 61 67 73 20 61 72 72 61 79 20 2a  ey flags array *
1f230 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1f240 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
1f250 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1f260 61 74 65 6d 65 6e 74 20 66 72 6f 6d 20 73 65 73  atement from ses
1f270 73 69 6f 6e 53 65 6c 65 63 74 52 6f 77 28 29 20  sionSelectRow() 
1f280 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f2b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1f2c0 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f2e0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1f2f0 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
1f300 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 43 68 61 6e 67 73 65 74 20 6f 70 65 72 61  * Changset opera
1f330 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 55 50 44  tion (SQLITE_UPD
1f340 41 54 45 20 65 74 63 2e 29 20 2a 2f 0a 20 20 63  ATE etc.) */.  c
1f350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 75 6d 6d  onst char *zDumm
1f360 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
1f370 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 0a 20 20 73  * Unused */..  s
1f380 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
1f390 6f 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d 6d  op(pIter, &zDumm
1f3a0 79 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20 30  y, &nCol, &op, 0
1f3b0 29 3b 0a 20 20 72 63 20 3d 20 73 65 73 73 69 6f  );.  rc = sessio
1f3c0 6e 42 69 6e 64 52 6f 77 28 70 49 74 65 72 2c 20  nBindRow(pIter, 
1f3d0 0a 20 20 20 20 20 20 6f 70 3d 3d 53 51 4c 49 54  .      op==SQLIT
1f3e0 45 5f 49 4e 53 45 52 54 20 3f 20 73 71 6c 69 74  E_INSERT ? sqlit
1f3f0 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 20  e3changeset_new 
1f400 3a 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  : sqlite3changes
1f410 65 74 5f 6f 6c 64 2c 0a 20 20 20 20 20 20 6e 43  et_old,.      nC
1f420 6f 6c 2c 20 61 62 50 4b 2c 20 70 53 65 6c 65 63  ol, abPK, pSelec
1f430 74 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  t.  );..  if( rc
1f440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f460 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
1f470 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f480 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 73 71 6c  E_ROW ) rc = sql
1f490 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
1f4a0 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ct);.  }..  retu
1f4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f4c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f4d0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
1f4e0 68 69 6e 20 73 71 6c 69 74 65 33 63 68 61 6e 67  hin sqlite3chang
1f4f0 73 65 74 5f 61 70 70 6c 79 5f 76 32 28 29 20 77  set_apply_v2() w
1f500 68 65 6e 0a 2a 2a 20 61 20 63 6f 6e 66 6c 69 63  hen.** a conflic
1f510 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1f520 20 61 6e 64 20 72 65 73 6f 6c 76 65 64 20 75 73   and resolved us
1f530 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ing conflict res
1f540 6f 6c 75 74 69 6f 6e 0a 2a 2a 20 6d 6f 64 65 20  olution.** mode 
1f550 65 54 79 70 65 20 28 65 69 74 68 65 72 20 53 51  eType (either SQ
1f560 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f  LITE_CHANGESET_O
1f570 4d 49 54 20 6f 72 20 53 51 4c 49 54 45 5f 43 48  MIT or SQLITE_CH
1f580 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45 29  ANGESET_REPLACE)
1f590 2e 2e 0a 2a 2a 20 49 74 20 61 64 64 73 20 61 20  ...** It adds a 
1f5a0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1f5b0 69 6f 6e 20 72 65 63 6f 72 64 20 74 6f 20 74 68  ion record to th
1f5c0 65 20 62 75 66 66 65 72 20 69 6e 20 0a 2a 2a 20  e buffer in .** 
1f5d0 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74 78 2e  SessionApplyCtx.
1f5e0 72 65 62 61 73 65 2c 20 77 68 69 63 68 20 77 69  rebase, which wi
1f5f0 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ll eventually be
1f600 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1f610 20 63 61 6c 6c 65 72 0a 2a 2a 20 6f 66 20 61 70   caller.** of ap
1f620 70 6c 79 5f 76 32 28 29 20 61 73 20 74 68 65 20  ply_v2() as the 
1f630 22 72 65 62 61 73 65 22 20 62 75 66 66 65 72 2e  "rebase" buffer.
1f640 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f650 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
1f660 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1f670 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1f680 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1f690 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 52  tic int sessionR
1f6a0 65 62 61 73 65 41 64 64 28 0a 20 20 53 65 73 73  ebaseAdd(.  Sess
1f6b0 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a 70 2c 20  ionApplyCtx *p, 
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f6d0 70 70 6c 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  pply context */.
1f6e0 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20    int eType,    
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
1f710 73 6f 6c 75 74 69 6f 6e 20 28 4f 4d 49 54 20 6f  solution (OMIT o
1f720 72 20 52 45 50 4c 41 43 45 29 20 2a 2f 0a 20 20  r REPLACE) */.  
1f730 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
1f740 74 5f 69 74 65 72 20 2a 70 49 74 65 72 20 20 20  t_iter *pIter   
1f750 2f 2a 20 49 74 65 72 61 74 6f 72 20 70 6f 69 6e  /* Iterator poin
1f760 74 69 6e 67 20 61 74 20 63 75 72 72 65 6e 74 20  ting at current 
1f770 63 68 61 6e 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  change */.){.  i
1f780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f790 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 62 52 65 62  K;.  if( p->bReb
1f7a0 61 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ase ){.    int i
1f7b0 3b 0a 20 20 20 20 69 6e 74 20 65 4f 70 20 3d 20  ;.    int eOp = 
1f7c0 70 49 74 65 72 2d 3e 6f 70 3b 0a 20 20 20 20 69  pIter->op;.    i
1f7d0 66 28 20 70 2d 3e 62 52 65 62 61 73 65 53 74 61  f( p->bRebaseSta
1f7e0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rted==0 ){.     
1f7f0 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 74 61 62   /* Append a tab
1f800 6c 65 2d 68 65 61 64 65 72 20 74 6f 20 74 68 65  le-header to the
1f810 20 72 65 62 61 73 65 20 62 75 66 66 65 72 20 2a   rebase buffer *
1f820 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1f830 61 72 20 2a 7a 54 61 62 20 3d 20 70 49 74 65 72  ar *zTab = pIter
1f840 2d 3e 7a 54 61 62 3b 0a 20 20 20 20 20 20 73 65  ->zTab;.      se
1f850 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28  ssionAppendByte(
1f860 26 70 2d 3e 72 65 62 61 73 65 2c 20 27 54 27 2c  &p->rebase, 'T',
1f870 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65 73   &rc);.      ses
1f880 73 69 6f 6e 41 70 70 65 6e 64 56 61 72 69 6e 74  sionAppendVarint
1f890 28 26 70 2d 3e 72 65 62 61 73 65 2c 20 70 2d 3e  (&p->rebase, p->
1f8a0 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  nCol, &rc);.    
1f8b0 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
1f8c0 6c 6f 62 28 26 70 2d 3e 72 65 62 61 73 65 2c 20  lob(&p->rebase, 
1f8d0 70 2d 3e 61 62 50 4b 2c 20 70 2d 3e 6e 43 6f 6c  p->abPK, p->nCol
1f8e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 73 65  , &rc);.      se
1f8f0 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
1f900 26 70 2d 3e 72 65 62 61 73 65 2c 20 28 75 38 2a  &p->rebase, (u8*
1f910 29 7a 54 61 62 2c 20 28 69 6e 74 29 73 74 72 6c  )zTab, (int)strl
1f920 65 6e 28 7a 54 61 62 29 2b 31 2c 20 26 72 63 29  en(zTab)+1, &rc)
1f930 3b 0a 20 20 20 20 20 20 70 2d 3e 62 52 65 62 61  ;.      p->bReba
1f940 73 65 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  seStarted = 1;. 
1f950 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1f960 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
1f970 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43  CHANGESET_REPLAC
1f980 45 7c 7c 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  E||eType==SQLITE
1f990 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54 20  _CHANGESET_OMIT 
1f9a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
1f9b0 4f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  Op==SQLITE_DELET
1f9c0 45 20 7c 7c 20 65 4f 70 3d 3d 53 51 4c 49 54 45  E || eOp==SQLITE
1f9d0 5f 49 4e 53 45 52 54 20 7c 7c 20 65 4f 70 3d 3d  _INSERT || eOp==
1f9e0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 3b  SQLITE_UPDATE );
1f9f0 0a 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70  ..    sessionApp
1fa00 65 6e 64 42 79 74 65 28 26 70 2d 3e 72 65 62 61  endByte(&p->reba
1fa10 73 65 2c 20 0a 20 20 20 20 20 20 20 20 28 65 4f  se, .        (eO
1fa20 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
1fa30 20 3f 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45   ? SQLITE_DELETE
1fa40 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   : SQLITE_INSERT
1fa50 29 2c 20 26 72 63 0a 20 20 20 20 20 20 20 20 29  ), &rc.        )
1fa60 3b 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70  ;.    sessionApp
1fa70 65 6e 64 42 79 74 65 28 26 70 2d 3e 72 65 62 61  endByte(&p->reba
1fa80 73 65 2c 20 28 65 54 79 70 65 3d 3d 53 51 4c 49  se, (eType==SQLI
1fa90 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50  TE_CHANGESET_REP
1faa0 4c 41 43 45 29 2c 20 26 72 63 29 3b 0a 20 20 20  LACE), &rc);.   
1fab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1fac0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1fad0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1fae0 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  pVal = 0;.      
1faf0 69 66 28 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f  if( eOp==SQLITE_
1fb00 44 45 4c 45 54 45 20 7c 7c 20 28 65 4f 70 3d 3d  DELETE || (eOp==
1fb10 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 26 26  SQLITE_UPDATE &&
1fb20 20 70 2d 3e 61 62 50 4b 5b 69 5d 29 20 29 7b 0a   p->abPK[i]) ){.
1fb30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63          sqlite3c
1fb40 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 70 49 74  hangeset_old(pIt
1fb50 65 72 2c 20 69 2c 20 26 70 56 61 6c 29 3b 0a 20  er, i, &pVal);. 
1fb60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fb70 20 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67      sqlite3chang
1fb80 65 73 65 74 5f 6e 65 77 28 70 49 74 65 72 2c 20  eset_new(pIter, 
1fb90 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  i, &pVal);.     
1fba0 20 7d 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e   }.      session
1fbb0 41 70 70 65 6e 64 56 61 6c 75 65 28 26 70 2d 3e  AppendValue(&p->
1fbc0 72 65 62 61 73 65 2c 20 70 56 61 6c 2c 20 26 72  rebase, pVal, &r
1fbd0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1fbe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fbf0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63  .** Invoke the c
1fc00 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20  onflict handler 
1fc10 66 6f 72 20 74 68 65 20 63 68 61 6e 67 65 20 74  for the change t
1fc20 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 65  hat the changese
1fc30 74 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 63 75  t iterator.** cu
1fc40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1fc50 6f 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  o..**.** Argumen
1fc60 74 20 65 54 79 70 65 20 6d 75 73 74 20 62 65 20  t eType must be 
1fc70 65 69 74 68 65 72 20 43 48 41 4e 47 45 53 45 54  either CHANGESET
1fc80 5f 44 41 54 41 20 6f 72 20 43 48 41 4e 47 45 53  _DATA or CHANGES
1fc90 45 54 5f 43 4f 4e 46 4c 49 43 54 2e 0a 2a 2a 20  ET_CONFLICT..** 
1fca0 49 66 20 61 72 67 75 6d 65 6e 74 20 70 62 52 65  If argument pbRe
1fcb0 70 6c 61 63 65 20 69 73 20 4e 55 4c 4c 2c 20 74  place is NULL, t
1fcc0 68 65 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  hen the type of 
1fcd0 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65 72  conflict handler
1fce0 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 64 65 70 65   invoked.** depe
1fcf0 6e 64 73 20 73 6f 6c 65 6c 79 20 6f 6e 20 65 54  nds solely on eT
1fd00 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ype, as follows:
1fd10 0a 2a 2a 0a 2a 2a 20 20 20 20 65 54 79 70 65 20  .**.**    eType 
1fd20 76 61 6c 75 65 20 20 20 20 20 20 20 20 20 20 20  value           
1fd30 20 20 20 20 20 20 56 61 6c 75 65 20 70 61 73 73        Value pass
1fd40 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 0a  ed to xConflict.
1fd50 2a 2a 20 20 20 20 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 2d  ----------------
1fd70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd80 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 43 48  -------.**    CH
1fd90 41 4e 47 45 53 45 54 5f 44 41 54 41 20 20 20 20  ANGESET_DATA    
1fda0 20 20 20 20 20 20 20 20 20 20 43 48 41 4e 47 45            CHANGE
1fdb0 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 0a 2a 2a 20  SET_NOTFOUND.** 
1fdc0 20 20 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e     CHANGESET_CON
1fdd0 46 4c 49 43 54 20 20 20 20 20 20 20 20 20 20 43  FLICT          C
1fde0 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52 41  HANGESET_CONSTRA
1fdf0 49 4e 54 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  INT.**.** Or, if
1fe00 20 70 62 52 65 70 6c 61 63 65 20 69 73 20 6e 6f   pbReplace is no
1fe10 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6e 20  t NULL, then an 
1fe20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
1fe30 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  to find an exist
1fe40 69 6e 67 0a 2a 2a 20 72 65 63 6f 72 64 20 77 69  ing.** record wi
1fe50 74 68 20 74 68 65 20 73 61 6d 65 20 70 72 69 6d  th the same prim
1fe60 61 72 79 20 6b 65 79 20 61 73 20 74 68 65 20 72  ary key as the r
1fe70 65 63 6f 72 64 20 61 62 6f 75 74 20 74 6f 20 62  ecord about to b
1fe80 65 20 64 65 6c 65 74 65 64 2c 20 75 70 64 61 74  e deleted, updat
1fe90 65 64 0a 2a 2a 20 6f 72 20 69 6e 73 65 72 74 65  ed.** or inserte
1fea0 64 2e 20 49 66 20 73 75 63 68 20 61 20 72 65 63  d. If such a rec
1feb0 6f 72 64 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ord can be found
1fec0 2c 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  , it is availabl
1fed0 65 20 74 6f 20 74 68 65 20 63 6f 6e 66 6c 69 63  e to the conflic
1fee0 74 0a 2a 2a 20 68 61 6e 64 6c 65 72 20 61 73 20  t.** handler as 
1fef0 74 68 65 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67  the "conflicting
1ff00 22 20 72 65 63 6f 72 64 2e 20 49 6e 20 74 68 69  " record. In thi
1ff10 73 20 63 61 73 65 20 74 68 65 20 74 79 70 65 20  s case the type 
1ff20 6f 66 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 68  of conflict.** h
1ff30 61 6e 64 6c 65 72 20 69 6e 76 6f 6b 65 64 20 69  andler invoked i
1ff40 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1ff50 0a 2a 2a 20 20 20 20 65 54 79 70 65 20 76 61 6c  .**    eType val
1ff60 75 65 20 20 20 20 20 20 20 20 20 50 4b 20 52 65  ue         PK Re
1ff70 63 6f 72 64 20 66 6f 75 6e 64 3f 20 20 20 56 61  cord found?   Va
1ff80 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 78 43  lue passed to xC
1ff90 6f 6e 66 6c 69 63 74 0a 2a 2a 20 20 20 20 2d 2d  onflict.**    --
1ffa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ffb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ffc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ffd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1ffe0 2a 20 20 20 20 43 48 41 4e 47 45 53 45 54 5f 44  *    CHANGESET_D
1fff0 41 54 41 20 20 20 20 20 20 59 65 73 20 20 20 20  ATA      Yes    
20000 20 20 20 20 20 20 20 20 20 20 20 20 43 48 41 4e              CHAN
20010 47 45 53 45 54 5f 44 41 54 41 0a 2a 2a 20 20 20  GESET_DATA.**   
20020 20 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20   CHANGESET_DATA 
20030 20 20 20 20 20 4e 6f 20 20 20 20 20 20 20 20 20       No         
20040 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53 45          CHANGESE
20050 54 5f 4e 4f 54 46 4f 55 4e 44 0a 2a 2a 20 20 20  T_NOTFOUND.**   
20060 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c   CHANGESET_CONFL
20070 49 43 54 20 20 59 65 73 20 20 20 20 20 20 20 20  ICT  Yes        
20080 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53 45          CHANGESE
20090 54 5f 43 4f 4e 46 4c 49 43 54 0a 2a 2a 20 20 20  T_CONFLICT.**   
200a0 20 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c   CHANGESET_CONFL
200b0 49 43 54 20 20 4e 6f 20 20 20 20 20 20 20 20 20  ICT  No         
200c0 20 20 20 20 20 20 20 20 43 48 41 4e 47 45 53 45          CHANGESE
200d0 54 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 0a  T_CONSTRAINT.**.
200e0 2a 2a 20 49 66 20 70 62 52 65 70 6c 61 63 65 20  ** If pbReplace 
200f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
20100 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 61   a record with a
20110 20 6d 61 74 63 68 69 6e 67 20 50 4b 20 69 73 20   matching PK is 
20120 66 6f 75 6e 64 2c 20 61 6e 64 0a 2a 2a 20 74 68  found, and.** th
20130 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
20140 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er function retu
20150 72 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  rns SQLITE_CHANG
20160 45 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 2a 70  ESET_REPLACE, *p
20170 62 52 65 70 6c 61 63 65 0a 2a 2a 20 69 73 20 73  bReplace.** is s
20180 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 62  et to non-zero b
20190 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
201a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
201b0 20 49 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   If the conflict
201c0 20 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73   handler returns
201d0 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
201e0 54 5f 41 42 4f 52 54 2c 20 53 51 4c 49 54 45 5f  T_ABORT, SQLITE_
201f0 41 42 4f 52 54 20 69 73 0a 2a 2a 20 72 65 74 75  ABORT is.** retu
20200 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
20210 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
20220 72 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 76  r returns an inv
20230 61 6c 69 64 20 76 61 6c 75 65 2c 20 0a 2a 2a 20  alid value, .** 
20240 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 49  SQLITE_MISUSE. I
20250 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  f the conflict h
20260 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20 53  andler returns S
20270 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
20280 4f 4d 49 54 2c 0a 2a 2a 20 74 68 69 73 20 66 75  OMIT,.** this fu
20290 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
202a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
202b0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 43  tic int sessionC
202c0 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a  onflictHandler(.
202d0 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20    int eType,    
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 20 2f 2a 20 45 69 74 68 65 72 20 43 48 41 4e    /* Either CHAN
20300 47 45 53 45 54 5f 44 41 54 41 20 6f 72 20 43 4f  GESET_DATA or CO
20310 4e 46 4c 49 43 54 20 2a 2f 0a 20 20 53 65 73 73  NFLICT */.  Sess
20320 69 6f 6e 41 70 70 6c 79 43 74 78 20 2a 70 2c 20  ionApplyCtx *p, 
20330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
20340 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
20350 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
20360 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
20370 69 74 65 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a  iter *pIter,  /*
20380 20 43 68 61 6e 67 65 73 65 74 20 69 74 65 72 61   Changeset itera
20390 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  tor */.  int(*xC
203a0 6f 6e 66 6c 69 63 74 29 28 76 6f 69 64 20 2a 2c  onflict)(void *,
203b0 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 63 68   int, sqlite3_ch
203c0 61 6e 67 65 73 65 74 5f 69 74 65 72 2a 29 2c 0a  angeset_iter*),.
203d0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
20400 65 6e 74 20 66 6f 72 20 63 6f 6e 66 6c 69 63 74  ent for conflict
20410 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e   handler */.  in
20420 74 20 2a 70 62 52 65 70 6c 61 63 65 20 20 20 20  t *pbReplace    
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20440 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75   OUT: Set to tru
20450 65 20 69 66 20 50 4b 20 72 6f 77 20 69 73 20 66  e if PK row is f
20460 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ound */.){.  int
20470 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20   res = 0;       
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20490 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
204a0 79 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  y conflict handl
204b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
204c0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
204d0 74 20 6f 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t op;.  const ch
204e0 61 72 20 2a 7a 44 75 6d 6d 79 3b 0a 0a 20 20 73  ar *zDummy;..  s
204f0 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
20500 6f 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d 6d  op(pIter, &zDumm
20510 79 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20 30  y, &nCol, &op, 0
20520 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  );..  assert( eT
20530 79 70 65 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e  ype==SQLITE_CHAN
20540 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 7c  GESET_CONFLICT |
20550 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
20560 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 29  CHANGESET_DATA )
20570 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
20580 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
20590 46 4c 49 43 54 2b 31 3d 3d 53 51 4c 49 54 45 5f  FLICT+1==SQLITE_
205a0 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
205b0 41 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72 74  AINT );.  assert
205c0 28 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  ( SQLITE_CHANGES
205d0 45 54 5f 44 41 54 41 2b 31 3d 3d 53 51 4c 49 54  ET_DATA+1==SQLIT
205e0 45 5f 43 48 41 4e 47 45 53 45 54 5f 4e 4f 54 46  E_CHANGESET_NOTF
205f0 4f 55 4e 44 20 29 3b 0a 0a 20 20 2f 2a 20 42 69  OUND );..  /* Bi
20600 6e 64 20 74 68 65 20 6e 65 77 2e 2a 20 50 52 49  nd the new.* PRI
20610 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73 20  MARY KEY values 
20620 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
20630 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 66  atement. */.  if
20640 28 20 70 62 52 65 70 6c 61 63 65 20 29 7b 0a 20  ( pbReplace ){. 
20650 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 53     rc = sessionS
20660 65 65 6b 54 6f 52 6f 77 28 70 2d 3e 64 62 2c 20  eekToRow(p->db, 
20670 70 49 74 65 72 2c 20 70 2d 3e 61 62 50 4b 2c 20  pIter, p->abPK, 
20680 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  p->pSelect);.  }
20690 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
206a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
206b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
206c0 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ROW ){.    /* Th
206d0 65 72 65 20 65 78 69 73 74 73 20 61 6e 6f 74 68  ere exists anoth
206e0 65 72 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  er row with the 
206f0 6e 65 77 2e 2a 20 70 72 69 6d 61 72 79 20 6b 65  new.* primary ke
20700 79 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  y. */.    pIter-
20710 3e 70 43 6f 6e 66 6c 69 63 74 20 3d 20 70 2d 3e  >pConflict = p->
20720 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 72 65 73  pSelect;.    res
20730 20 3d 20 78 43 6f 6e 66 6c 69 63 74 28 70 43 74   = xConflict(pCt
20740 78 2c 20 65 54 79 70 65 2c 20 70 49 74 65 72 29  x, eType, pIter)
20750 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 43 6f  ;.    pIter->pCo
20760 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 20 20  nflict = 0;.    
20770 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
20780 65 74 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  et(p->pSelect);.
20790 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
207a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
207b0 20 69 66 28 20 70 2d 3e 62 44 65 66 65 72 43 6f   if( p->bDeferCo
207c0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 65 54 79  nstraints && eTy
207d0 70 65 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e 47  pe==SQLITE_CHANG
207e0 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20 29 7b  ESET_CONFLICT ){
207f0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 65 61  .      /* Instea
20800 64 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 74 68  d of invoking th
20810 65 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c  e conflict handl
20820 65 72 2c 20 61 70 70 65 6e 64 20 74 68 65 20 63  er, append the c
20830 68 61 6e 67 65 20 62 6c 6f 62 0a 20 20 20 20 20  hange blob.     
20840 20 2a 2a 20 74 6f 20 74 68 65 20 53 65 73 73 69   ** to the Sessi
20850 6f 6e 41 70 70 6c 79 43 74 78 2e 63 6f 6e 73 74  onApplyCtx.const
20860 72 61 69 6e 74 73 20 62 75 66 66 65 72 2e 20 2a  raints buffer. *
20870 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 42 6c 6f  /.      u8 *aBlo
20880 62 20 3d 20 26 70 49 74 65 72 2d 3e 69 6e 2e 61  b = &pIter->in.a
20890 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 6e 2e 69  Data[pIter->in.i
208a0 43 75 72 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  Current];.      
208b0 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 70 49 74 65  int nBlob = pIte
208c0 72 2d 3e 69 6e 2e 69 4e 65 78 74 20 2d 20 70 49  r->in.iNext - pI
208d0 74 65 72 2d 3e 69 6e 2e 69 43 75 72 72 65 6e 74  ter->in.iCurrent
208e0 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41  ;.      sessionA
208f0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 63 6f  ppendBlob(&p->co
20900 6e 73 74 72 61 69 6e 74 73 2c 20 61 42 6c 6f 62  nstraints, aBlob
20910 2c 20 6e 42 6c 6f 62 2c 20 26 72 63 29 3b 0a 20  , nBlob, &rc);. 
20920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20930 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
20940 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 74  {.      /* No ot
20950 68 65 72 20 72 6f 77 20 77 69 74 68 20 74 68 65  her row with the
20960 20 6e 65 77 2e 2a 20 70 72 69 6d 61 72 79 20 6b   new.* primary k
20970 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 73  ey. */.      res
20980 20 3d 20 78 43 6f 6e 66 6c 69 63 74 28 70 43 74   = xConflict(pCt
20990 78 2c 20 65 54 79 70 65 2b 31 2c 20 70 49 74 65  x, eType+1, pIte
209a0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  r);.      if( re
209b0 73 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  s==SQLITE_CHANGE
209c0 53 45 54 5f 52 45 50 4c 41 43 45 20 29 20 72 63  SET_REPLACE ) rc
209d0 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
209e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
209f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20a00 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
20a10 72 65 73 20 29 7b 0a 20 20 20 20 20 20 63 61 73  res ){.      cas
20a20 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  e SQLITE_CHANGES
20a30 45 54 5f 52 45 50 4c 41 43 45 3a 0a 20 20 20 20  ET_REPLACE:.    
20a40 20 20 20 20 61 73 73 65 72 74 28 20 70 62 52 65      assert( pbRe
20a50 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20  place );.       
20a60 20 2a 70 62 52 65 70 6c 61 63 65 20 3d 20 31 3b   *pbReplace = 1;
20a70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20a80 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
20a90 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
20aa0 54 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  T:.        break
20ab0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ;..      case SQ
20ac0 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 41  LITE_CHANGESET_A
20ad0 42 4f 52 54 3a 0a 20 20 20 20 20 20 20 20 72 63  BORT:.        rc
20ae0 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
20af0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20b00 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
20b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20b20 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20  ITE_MISUSE;.    
20b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20b60 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 62 61  rc = sessionReba
20b70 73 65 41 64 64 28 70 2c 20 72 65 73 2c 20 70 49  seAdd(p, res, pI
20b80 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
20b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ba0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
20bb0 6f 20 61 70 70 6c 79 20 74 68 65 20 63 68 61 6e  o apply the chan
20bc0 67 65 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ge that the iter
20bd0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
20be0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20bf0 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  t.** currently p
20c00 6f 69 6e 74 73 20 74 6f 20 74 6f 20 74 68 65 20  oints to to the 
20c10 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 63  database. If a c
20c20 6f 6e 66 6c 69 63 74 20 69 73 20 65 6e 63 6f 75  onflict is encou
20c30 6e 74 65 72 65 64 2c 20 69 6e 76 6f 6b 65 0a 2a  ntered, invoke.*
20c40 2a 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  * the conflict h
20c50 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e  andler callback.
20c60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
20c70 6e 74 20 70 62 52 65 74 72 79 20 69 73 20 4e 55  nt pbRetry is NU
20c80 4c 4c 2c 20 74 68 65 6e 20 69 67 6e 6f 72 65 20  LL, then ignore 
20c90 61 6e 79 20 43 48 41 4e 47 45 53 45 54 5f 44 41  any CHANGESET_DA
20ca0 54 41 20 63 6f 6e 66 6c 69 63 74 2e 20 49 66 0a  TA conflict. If.
20cb0 2a 2a 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  ** one is encoun
20cc0 74 65 72 65 64 2c 20 75 70 64 61 74 65 20 6f 72  tered, update or
20cd0 20 64 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20   delete the row 
20ce0 77 69 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e  with the matchin
20cf0 67 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a  g primary key.**
20d00 20 69 6e 73 74 65 61 64 2e 20 4f 72 2c 20 69 66   instead. Or, if
20d10 20 70 62 52 65 74 72 79 20 69 73 20 6e 6f 74 20   pbRetry is not 
20d20 4e 55 4c 4c 20 61 6e 64 20 61 20 43 48 41 4e 47  NULL and a CHANG
20d30 45 53 45 54 5f 44 41 54 41 20 63 6f 6e 66 6c 69  ESET_DATA confli
20d40 63 74 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 6e  ct occurs,.** in
20d50 76 6f 6b 65 20 74 68 65 20 63 6f 6e 66 6c 69 63  voke the conflic
20d60 74 20 68 61 6e 64 6c 65 72 2e 20 49 66 20 69 74  t handler. If it
20d70 20 72 65 74 75 72 6e 73 20 43 48 41 4e 47 45 53   returns CHANGES
20d80 45 54 5f 52 45 50 4c 41 43 45 2c 20 73 65 74 20  ET_REPLACE, set 
20d90 2a 70 62 52 65 74 72 79 0a 2a 2a 20 74 6f 20 74  *pbRetry.** to t
20da0 72 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  rue before retur
20db0 6e 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63 61  ning. In this ca
20dc0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
20dd0 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
20de0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 67 61 69 6e  unction.** again
20df0 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  , this time with
20e00 20 70 62 52 65 74 72 79 20 73 65 74 20 74 6f 20   pbRetry set to 
20e10 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
20e20 72 67 75 6d 65 6e 74 20 70 62 52 65 70 6c 61 63  rgument pbReplac
20e30 65 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 61 20  e is NULL and a 
20e40 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
20e50 43 54 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 0a  CT conflict is .
20e60 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  ** encountered i
20e70 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6e 66 6c 69  nvoke the confli
20e80 63 74 20 68 61 6e 64 6c 65 72 20 77 69 74 68 20  ct handler with 
20e90 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 53 54 52  CHANGESET_CONSTR
20ea0 41 49 4e 54 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  AINT instead..**
20eb0 20 4f 72 2c 20 69 66 20 70 62 52 65 70 6c 61 63   Or, if pbReplac
20ec0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
20ed0 6e 76 6f 6b 65 20 69 74 20 77 69 74 68 20 43 48  nvoke it with CH
20ee0 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54  ANGESET_CONFLICT
20ef0 2e 20 49 66 20 73 75 63 68 0a 2a 2a 20 61 6e 20  . If such.** an 
20f00 69 6e 76 6f 63 61 74 69 6f 6e 20 72 65 74 75 72  invocation retur
20f10 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ns SQLITE_CHANGE
20f20 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 73 65 74  SET_REPLACE, set
20f30 20 2a 70 62 52 65 70 6c 61 63 65 20 74 6f 20 74   *pbReplace to t
20f40 72 75 65 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  rue.** before re
20f50 74 72 79 69 6e 67 2e 20 49 6e 20 74 68 69 73 20  trying. In this 
20f60 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
20f70 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 6d 6f  attempts to remo
20f80 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69  ve the conflicti
20f90 6e 67 0a 2a 2a 20 72 6f 77 20 62 65 66 6f 72 65  ng.** row before
20fa0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 66   invoking this f
20fb0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2c 20 74  unction again, t
20fc0 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 70 62  his time with pb
20fd0 52 65 70 6c 61 63 65 20 73 65 74 20 0a 2a 2a 20  Replace set .** 
20fe0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
20ff0 66 20 61 6e 79 20 63 6f 6e 66 6c 69 63 74 20 68  f any conflict h
21000 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 73 20 53  andler returns S
21010 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
21020 41 42 4f 52 54 2c 20 74 68 69 73 20 66 75 6e 63  ABORT, this func
21030 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
21040 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 20 4f 74  SQLITE_ABORT. Ot
21050 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 65  herwise, if no e
21060 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
21070 49 54 45 5f 4f 4b 20 69 73 20 0a 2a 2a 20 72 65  ITE_OK is .** re
21080 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
21090 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 41 70 70  c int sessionApp
210a0 6c 79 4f 6e 65 4f 70 28 0a 20 20 73 71 6c 69 74  lyOneOp(.  sqlit
210b0 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
210c0 72 20 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68  r *pIter,  /* Ch
210d0 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72  angeset iterator
210e0 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 41 70 70   */.  SessionApp
210f0 6c 79 43 74 78 20 2a 70 2c 20 20 20 20 20 20 20  lyCtx *p,       
21100 20 20 20 20 20 20 2f 2a 20 63 68 61 6e 67 65 73        /* changes
21110 65 74 5f 61 70 70 6c 79 28 29 20 63 6f 6e 74 65  et_apply() conte
21120 78 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6f  xt */.  int(*xCo
21130 6e 66 6c 69 63 74 29 28 76 6f 69 64 20 2a 2c 20  nflict)(void *, 
21140 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  int, sqlite3_cha
21150 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 29 2c 0a  ngeset_iter *),.
21160 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20    void *pCtx,   
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
21190 65 6e 74 20 66 6f 72 20 74 68 65 20 63 6f 6e 66  ent for the conf
211a0 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a  lict handler */.
211b0 20 20 69 6e 74 20 2a 70 62 52 65 70 6c 61 63 65    int *pbReplace
211c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
211d0 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 74    /* OUT: True t
211e0 6f 20 72 65 6d 6f 76 65 20 50 4b 20 72 6f 77 20  o remove PK row 
211f0 61 6e 64 20 72 65 74 72 79 20 2a 2f 0a 20 20 69  and retry */.  i
21200 6e 74 20 2a 70 62 52 65 74 72 79 20 20 20 20 20  nt *pbRetry     
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21220 2a 20 4f 55 54 3a 20 54 72 75 65 20 74 6f 20 72  * OUT: True to r
21230 65 74 72 79 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  etry. */.){.  co
21240 6e 73 74 20 63 68 61 72 20 2a 7a 44 75 6d 6d 79  nst char *zDummy
21250 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 6e  ;.  int op;.  in
21260 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63  t nCol;.  int rc
21270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21280 20 61 73 73 65 72 74 28 20 70 2d 3e 70 44 65 6c   assert( p->pDel
21290 65 74 65 20 26 26 20 70 2d 3e 70 55 70 64 61 74  ete && p->pUpdat
212a0 65 20 26 26 20 70 2d 3e 70 49 6e 73 65 72 74 20  e && p->pInsert 
212b0 26 26 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 3b  && p->pSelect );
212c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 7a  .  assert( p->az
212d0 43 6f 6c 20 26 26 20 70 2d 3e 61 62 50 4b 20 29  Col && p->abPK )
212e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 62 52  ;.  assert( !pbR
212f0 65 70 6c 61 63 65 20 7c 7c 20 2a 70 62 52 65 70  eplace || *pbRep
21300 6c 61 63 65 3d 3d 30 20 29 3b 0a 0a 20 20 73 71  lace==0 );..  sq
21310 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
21320 70 28 70 49 74 65 72 2c 20 26 7a 44 75 6d 6d 79  p(pIter, &zDummy
21330 2c 20 26 6e 43 6f 6c 2c 20 26 6f 70 2c 20 30 29  , &nCol, &op, 0)
21340 3b 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  ;..  if( op==SQL
21350 49 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a 0a 20  ITE_DELETE ){.. 
21360 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65     /* Bind value
21370 73 20 74 6f 20 74 68 65 20 44 45 4c 45 54 45 20  s to the DELETE 
21380 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 63 6f  statement. If co
21390 6e 66 6c 69 63 74 20 68 61 6e 64 6c 69 6e 67 20  nflict handling 
213a0 69 73 20 72 65 71 75 69 72 65 64 2c 0a 20 20 20  is required,.   
213b0 20 2a 2a 20 62 69 6e 64 20 76 61 6c 75 65 73 20   ** bind values 
213c0 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
213d0 61 6e 64 20 73 65 74 20 62 6f 75 6e 64 20 76 61  and set bound va
213e0 72 69 61 62 6c 65 20 28 6e 43 6f 6c 2b 31 29 20  riable (nCol+1) 
213f0 74 6f 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a 20  to true..    ** 
21400 4f 72 2c 20 69 66 20 63 6f 6e 66 6c 69 63 74 20  Or, if conflict 
21410 68 61 6e 64 6c 69 6e 67 20 69 73 20 6e 6f 74 20  handling is not 
21420 72 65 71 75 69 72 65 64 2c 20 62 69 6e 64 20 6a  required, bind j
21430 75 73 74 20 74 68 65 20 50 4b 20 63 6f 6c 75 6d  ust the PK colum
21440 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  n.    ** values 
21450 61 6e 64 2c 20 69 66 20 69 74 20 65 78 69 73 74  and, if it exist
21460 73 2c 20 73 65 74 20 28 6e 43 6f 6c 2b 31 29 20  s, set (nCol+1) 
21470 74 6f 20 66 61 6c 73 65 2e 20 43 6f 6e 66 6c 69  to false. Confli
21480 63 74 20 68 61 6e 64 6c 69 6e 67 0a 20 20 20 20  ct handling.    
21490 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
214a0 65 64 20 69 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ed if:.    **.  
214b0 20 20 2a 2a 20 20 20 2a 20 74 68 69 73 20 69 73    **   * this is
214c0 20 61 20 70 61 74 63 68 73 65 74 2c 20 6f 72 0a   a patchset, or.
214d0 20 20 20 20 2a 2a 20 20 20 2a 20 28 70 62 52 65      **   * (pbRe
214e0 74 72 79 3d 3d 30 29 2c 20 6f 72 0a 20 20 20 20  try==0), or.    
214f0 2a 2a 20 20 20 2a 20 61 6c 6c 20 63 6f 6c 75 6d  **   * all colum
21500 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
21510 61 72 65 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 28  are PK columns (
21520 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
21530 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  re is.    **    
21540 20 6e 6f 20 28 6e 43 6f 6c 2b 31 29 20 76 61 72   no (nCol+1) var
21550 69 61 62 6c 65 20 74 6f 20 62 69 6e 64 20 74 6f  iable to bind to
21560 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  )..    */.    u8
21570 20 2a 61 62 50 4b 20 3d 20 28 70 49 74 65 72 2d   *abPK = (pIter-
21580 3e 62 50 61 74 63 68 73 65 74 20 3f 20 70 2d 3e  >bPatchset ? p->
21590 61 62 50 4b 20 3a 20 30 29 3b 0a 20 20 20 20 72  abPK : 0);.    r
215a0 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64 52  c = sessionBindR
215b0 6f 77 28 70 49 74 65 72 2c 20 73 71 6c 69 74 65  ow(pIter, sqlite
215c0 33 63 68 61 6e 67 65 73 65 74 5f 6f 6c 64 2c 20  3changeset_old, 
215d0 6e 43 6f 6c 2c 20 61 62 50 4b 2c 20 70 2d 3e 70  nCol, abPK, p->p
215e0 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 69 66 28  Delete);.    if(
215f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21600 26 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  & sqlite3_bind_p
21610 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
21620 2d 3e 70 44 65 6c 65 74 65 29 3e 6e 43 6f 6c 20  ->pDelete)>nCol 
21630 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21640 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
21650 2d 3e 70 44 65 6c 65 74 65 2c 20 6e 43 6f 6c 2b  ->pDelete, nCol+
21660 31 2c 20 28 70 62 52 65 74 72 79 3d 3d 30 20 7c  1, (pbRetry==0 |
21670 7c 20 61 62 50 4b 29 29 3b 0a 20 20 20 20 7d 0a  | abPK));.    }.
21680 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21690 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
216a0 63 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  c;..    sqlite3_
216b0 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 29  step(p->pDelete)
216c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
216d0 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c  e3_reset(p->pDel
216e0 65 74 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ete);.    if( rc
216f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
21700 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
21710 2d 3e 64 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ->db)==0 ){.    
21720 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 6f    rc = sessionCo
21730 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a 20  nflictHandler(. 
21740 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21750 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 2c 20  CHANGESET_DATA, 
21760 70 2c 20 70 49 74 65 72 2c 20 78 43 6f 6e 66 6c  p, pIter, xConfl
21770 69 63 74 2c 20 70 43 74 78 2c 20 70 62 52 65 74  ict, pCtx, pbRet
21780 72 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ry.      );.    
21790 7d 65 6c 73 65 20 69 66 28 20 28 72 63 26 30 78  }else if( (rc&0x
217a0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
217b0 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
217c0 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 6f 6e 66  rc = sessionConf
217d0 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a 20 20 20  lictHandler(.   
217e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 48         SQLITE_CH
217f0 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54  ANGESET_CONFLICT
21800 2c 20 70 2c 20 70 49 74 65 72 2c 20 78 43 6f 6e  , p, pIter, xCon
21810 66 6c 69 63 74 2c 20 70 43 74 78 2c 20 30 0a 20  flict, pCtx, 0. 
21820 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
21830 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
21840 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
21850 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
21860 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
21870 6f 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  o the UPDATE sta
21880 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 66  tement. */.    f
21890 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
218a0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b  TE_OK && i<nCol;
218b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
218c0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4f 6c 64  ite3_value *pOld
218d0 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65   = sessionChange
218e0 73 65 74 4f 6c 64 28 70 49 74 65 72 2c 20 69 29  setOld(pIter, i)
218f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21900 76 61 6c 75 65 20 2a 70 4e 65 77 20 3d 20 73 65  value *pNew = se
21910 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 4e 65  ssionChangesetNe
21920 77 28 70 49 74 65 72 2c 20 69 29 3b 0a 0a 20 20  w(pIter, i);..  
21930 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
21940 5f 69 6e 74 28 70 2d 3e 70 55 70 64 61 74 65 2c  _int(p->pUpdate,
21950 20 69 2a 33 2b 32 2c 20 21 21 70 4e 65 77 29 3b   i*3+2, !!pNew);
21960 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 20  .      if( pOld 
21970 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21980 73 65 73 73 69 6f 6e 42 69 6e 64 56 61 6c 75 65  sessionBindValue
21990 28 70 2d 3e 70 55 70 64 61 74 65 2c 20 69 2a 33  (p->pUpdate, i*3
219a0 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 20  +1, pOld);.     
219b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
219c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e  =SQLITE_OK && pN
219d0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
219e0 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64 56 61   = sessionBindVa
219f0 6c 75 65 28 70 2d 3e 70 55 70 64 61 74 65 2c 20  lue(p->pUpdate, 
21a00 69 2a 33 2b 33 2c 20 70 4e 65 77 29 3b 0a 20 20  i*3+3, pNew);.  
21a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21a30 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21a40 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
21a50 55 70 64 61 74 65 2c 20 6e 43 6f 6c 2a 33 2b 31  Update, nCol*3+1
21a60 2c 20 70 62 52 65 74 72 79 3d 3d 30 20 7c 7c 20  , pbRetry==0 || 
21a70 70 49 74 65 72 2d 3e 62 50 61 74 63 68 73 65 74  pIter->bPatchset
21a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
21ab0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 68 65 20   /* Attempt the 
21ac0 55 50 44 41 54 45 2e 20 49 6e 20 74 68 65 20 63  UPDATE. In the c
21ad0 61 73 65 20 6f 66 20 61 20 4e 4f 54 46 4f 55 4e  ase of a NOTFOUN
21ae0 44 20 6f 72 20 44 41 54 41 20 63 6f 6e 66 6c 69  D or DATA confli
21af0 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  ct,.    ** the r
21b00 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 53 51  esult will be SQ
21b10 4c 49 54 45 5f 4f 4b 20 77 69 74 68 20 30 20 72  LITE_OK with 0 r
21b20 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 2a 2f  ows modified. */
21b30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
21b40 70 28 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20  p(p->pUpdate);. 
21b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
21b60 72 65 73 65 74 28 70 2d 3e 70 55 70 64 61 74 65  reset(p->pUpdate
21b70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
21b80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
21b90 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 2d 3e  ite3_changes(p->
21ba0 64 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  db)==0 ){.      
21bb0 2f 2a 20 41 20 4e 4f 54 46 4f 55 4e 44 20 6f 72  /* A NOTFOUND or
21bc0 20 44 41 54 41 20 65 72 72 6f 72 2e 20 53 65 61   DATA error. Sea
21bd0 72 63 68 20 74 68 65 20 74 61 62 6c 65 20 74 6f  rch the table to
21be0 20 73 65 65 20 69 66 20 69 74 20 63 6f 6e 74 61   see if it conta
21bf0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  ins.      ** a r
21c00 6f 77 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  ow with a matchi
21c10 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ng primary key. 
21c20 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20 61  If so, this is a
21c30 20 44 41 54 41 20 63 6f 6e 66 6c 69 63 74 2e 0a   DATA conflict..
21c40 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
21c50 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  se, if there is 
21c60 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6d  no primary key m
21c70 61 74 63 68 2c 20 69 74 20 69 73 20 61 20 4e 4f  atch, it is a NO
21c80 54 46 4f 55 4e 44 2e 20 2a 2f 0a 0a 20 20 20 20  TFOUND. */..    
21c90 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 6f    rc = sessionCo
21ca0 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a 20  nflictHandler(. 
21cb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21cc0 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 2c 20  CHANGESET_DATA, 
21cd0 70 2c 20 70 49 74 65 72 2c 20 78 43 6f 6e 66 6c  p, pIter, xConfl
21ce0 69 63 74 2c 20 70 43 74 78 2c 20 70 62 52 65 74  ict, pCtx, pbRet
21cf0 72 79 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  ry.      );..   
21d00 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 26 30   }else if( (rc&0
21d10 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
21d20 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
21d30 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6c 77 61   /* This is alwa
21d40 79 73 20 61 20 43 4f 4e 53 54 52 41 49 4e 54 20  ys a CONSTRAINT 
21d50 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20  conflict. */.   
21d60 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
21d70 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65 72 28 0a  onflictHandler(.
21d80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21d90 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c  _CHANGESET_CONFL
21da0 49 43 54 2c 20 70 2c 20 70 49 74 65 72 2c 20 78  ICT, p, pIter, x
21db0 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c 20  Conflict, pCtx, 
21dc0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
21dd0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
21de0 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
21df0 45 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20  E_INSERT );.    
21e00 69 66 28 20 70 2d 3e 62 53 74 61 74 31 20 29 7b  if( p->bStat1 ){
21e10 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
21e20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  if there is a co
21e30 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 2e 20 46  nflicting row. F
21e40 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2c  or sqlite_stat1,
21e50 20 74 68 69 73 20 6e 65 65 64 73 0a 20 20 20 20   this needs.    
21e60 20 20 2a 2a 20 74 6f 20 62 65 20 64 6f 6e 65 20    ** to be done 
21e70 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54 2c 20  using a SELECT, 
21e80 61 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 50  as there is no P
21e90 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 20 74 68  RIMARY KEY in th
21ea0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e .      ** data
21eb0 62 61 73 65 20 73 63 68 65 6d 61 20 74 6f 20 74  base schema to t
21ec0 68 72 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f  hrow an exceptio
21ed0 6e 20 69 66 20 61 20 64 75 70 6c 69 63 61 74 65  n if a duplicate
21ee0 20 69 73 20 69 6e 73 65 72 74 65 64 2e 20 20 2a   is inserted.  *
21ef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 73  /.      rc = ses
21f00 73 69 6f 6e 53 65 65 6b 54 6f 52 6f 77 28 70 2d  sionSeekToRow(p-
21f10 3e 64 62 2c 20 70 49 74 65 72 2c 20 70 2d 3e 61  >db, pIter, p->a
21f20 62 50 4b 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  bPK, p->pSelect)
21f30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21f40 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
21f50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21f60 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
21f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
21f80 73 65 74 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  set(p->pSelect);
21f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21fa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21fc0 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64 52  c = sessionBindR
21fd0 6f 77 28 70 49 74 65 72 2c 20 73 71 6c 69 74 65  ow(pIter, sqlite
21fe0 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 2c 20  3changeset_new, 
21ff0 6e 43 6f 6c 2c 20 30 2c 20 70 2d 3e 70 49 6e 73  nCol, 0, p->pIns
22000 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ert);.      if( 
22010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22020 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
22030 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
22040 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  ->pInsert);.    
22050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
22060 65 73 65 74 28 70 2d 3e 70 49 6e 73 65 72 74 29  eset(p->pInsert)
22070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
22080 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
22090 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
220a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 73 73  .      rc = sess
220b0 69 6f 6e 43 6f 6e 66 6c 69 63 74 48 61 6e 64 6c  ionConflictHandl
220c0 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 53 51  er(.          SQ
220d0 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43  LITE_CHANGESET_C
220e0 4f 4e 46 4c 49 43 54 2c 20 70 2c 20 70 49 74 65  ONFLICT, p, pIte
220f0 72 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43  r, xConflict, pC
22100 74 78 2c 20 70 62 52 65 70 6c 61 63 65 0a 20 20  tx, pbReplace.  
22110 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
22120 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22130 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
22140 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 68 61  to apply the cha
22150 6e 67 65 20 74 68 61 74 20 74 68 65 20 69 74 65  nge that the ite
22160 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
22170 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
22180 6e 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  nt.** currently 
22190 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 74 68 65  points to to the
221a0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
221b0 63 6f 6e 66 6c 69 63 74 20 69 73 20 65 6e 63 6f  conflict is enco
221c0 75 6e 74 65 72 65 64 2c 20 69 6e 76 6f 6b 65 0a  untered, invoke.
221d0 2a 2a 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ** the conflict 
221e0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
221f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
22200 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
22210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
22220 20 73 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e 65   sessionApplyOne
22230 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
22240 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e 64  ** function hand
22250 6c 65 73 20 74 68 65 20 63 61 73 65 20 77 68 65  les the case whe
22260 72 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2d  re the conflict-
22270 68 61 6e 64 6c 65 72 20 69 73 20 69 6e 76 6f 6b  handler is invok
22280 65 64 20 61 6e 64 20 0a 2a 2a 20 72 65 74 75 72  ed and .** retur
22290 6e 73 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  ns SQLITE_CHANGE
222a0 53 45 54 5f 52 45 50 4c 41 43 45 20 2d 20 69 6e  SET_REPLACE - in
222b0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
222c0 65 20 63 68 61 6e 67 65 20 73 68 6f 75 6c 64 20  e change should 
222d0 62 65 0a 2a 2a 20 72 65 74 72 69 65 64 20 69 6e  be.** retried in
222e0 20 73 6f 6d 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2f   some manner..*/
222f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
22300 69 6f 6e 41 70 70 6c 79 4f 6e 65 57 69 74 68 52  ionApplyOneWithR
22310 65 74 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20  etry(.  sqlite3 
22320 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
22330 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79          /* Apply
22340 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e   change to "main
22350 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e  " db of this han
22360 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
22370 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
22380 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e  *pIter,  /* Chan
22390 67 65 73 65 74 20 69 74 65 72 61 74 6f 72 20 74  geset iterator t
223a0 6f 20 72 65 61 64 20 63 68 61 6e 67 65 20 66 72  o read change fr
223b0 6f 6d 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e 41  om */.  SessionA
223c0 70 70 6c 79 43 74 78 20 2a 70 41 70 70 6c 79 2c  pplyCtx *pApply,
223d0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79          /* Apply
223e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
223f0 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 76 6f  t(*xConflict)(vo
22400 69 64 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65  id*, int, sqlite
22410 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
22420 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  *),.  void *pCtx
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
22450 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
22460 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29  o xConflict */.)
22470 7b 0a 20 20 69 6e 74 20 62 52 65 70 6c 61 63 65  {.  int bReplace
22480 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 52 65 74   = 0;.  int bRet
22490 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ry = 0;.  int rc
224a0 3b 0a 0a 20 20 72 63 20 3d 20 73 65 73 73 69 6f  ;..  rc = sessio
224b0 6e 41 70 70 6c 79 4f 6e 65 4f 70 28 70 49 74 65  nApplyOneOp(pIte
224c0 72 2c 20 70 41 70 70 6c 79 2c 20 78 43 6f 6e 66  r, pApply, xConf
224d0 6c 69 63 74 2c 20 70 43 74 78 2c 20 26 62 52 65  lict, pCtx, &bRe
224e0 70 6c 61 63 65 2c 20 26 62 52 65 74 72 79 29 3b  place, &bRetry);
224f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
22510 66 20 74 68 65 20 62 52 65 74 72 79 20 66 6c 61  f the bRetry fla
22520 67 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 68  g is set, the ch
22530 61 6e 67 65 20 68 61 73 20 6e 6f 74 20 62 65 65  ange has not bee
22540 6e 20 61 70 70 6c 69 65 64 20 64 75 65 20 74 6f  n applied due to
22550 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   an.    ** SQLIT
22560 45 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41  E_CHANGESET_DATA
22570 20 70 72 6f 62 6c 65 6d 20 28 69 2e 65 2e 20 74   problem (i.e. t
22580 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
22590 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 0a 20   or DELETE and. 
225a0 20 20 20 2a 2a 20 61 20 72 6f 77 20 77 69 74 68     ** a row with
225b0 20 74 68 65 20 63 6f 72 72 65 63 74 20 50 4b 20   the correct PK 
225c0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
225d0 65 20 64 62 2c 20 62 75 74 20 6f 6e 65 20 6f 72  e db, but one or
225e0 20 6d 6f 72 65 20 6f 74 68 65 72 0a 20 20 20 20   more other.    
225f0 2a 2a 20 66 69 65 6c 64 73 20 64 6f 20 6e 6f 74  ** fields do not
22600 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 65 78 70   contain the exp
22610 65 63 74 65 64 20 76 61 6c 75 65 73 29 20 61 6e  ected values) an
22620 64 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 68  d the conflict h
22630 61 6e 64 6c 65 72 20 0a 20 20 20 20 2a 2a 20 72  andler .    ** r
22640 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 43  eturned SQLITE_C
22650 48 41 4e 47 45 53 45 54 5f 52 45 50 4c 41 43 45  HANGESET_REPLACE
22660 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
22670 65 74 72 79 20 74 68 65 20 6f 70 65 72 61 74 69  etry the operati
22680 6f 6e 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 70  on,.    ** but p
22690 61 73 73 20 4e 55 4c 4c 20 61 73 20 74 68 65 20  ass NULL as the 
226a0 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 73  final argument s
226b0 6f 20 74 68 61 74 20 73 65 73 73 69 6f 6e 41 70  o that sessionAp
226c0 70 6c 79 4f 6e 65 4f 70 28 29 20 69 67 6e 6f 72  plyOneOp() ignor
226d0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  es.    ** the SQ
226e0 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 44  LITE_CHANGESET_D
226f0 41 54 41 20 70 72 6f 62 6c 65 6d 2e 20 20 2a 2f  ATA problem.  */
22700 0a 20 20 20 20 69 66 28 20 62 52 65 74 72 79 20  .    if( bRetry 
22710 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22720 20 70 49 74 65 72 2d 3e 6f 70 3d 3d 53 51 4c 49   pIter->op==SQLI
22730 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74  TE_UPDATE || pIt
22740 65 72 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 44  er->op==SQLITE_D
22750 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 20 20 72  ELETE );.      r
22760 63 20 3d 20 73 65 73 73 69 6f 6e 41 70 70 6c 79  c = sessionApply
22770 4f 6e 65 4f 70 28 70 49 74 65 72 2c 20 70 41 70  OneOp(pIter, pAp
22780 70 6c 79 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20  ply, xConflict, 
22790 70 43 74 78 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pCtx, 0, 0);.   
227a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
227b0 65 20 62 52 65 70 6c 61 63 65 20 66 6c 61 67 20  e bReplace flag 
227c0 69 73 20 73 65 74 2c 20 74 68 65 20 63 68 61 6e  is set, the chan
227d0 67 65 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  ge is an INSERT 
227e0 74 68 61 74 20 68 61 73 20 6e 6f 74 0a 20 20 20  that has not.   
227f0 20 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d   ** been perform
22800 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ed because the d
22810 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 20  atabase already 
22820 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 20 77  contains a row w
22830 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ith the.    ** s
22840 70 65 63 69 66 69 65 64 20 70 72 69 6d 61 72 79  pecified primary
22850 20 6b 65 79 20 61 6e 64 20 74 68 65 20 63 6f 6e   key and the con
22860 66 6c 69 63 74 20 68 61 6e 64 6c 65 72 20 72 65  flict handler re
22870 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 53 51  turned.    ** SQ
22880 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 52  LITE_CHANGESET_R
22890 45 50 4c 41 43 45 2e 20 49 6e 20 74 68 69 73 20  EPLACE. In this 
228a0 63 61 73 65 20 72 65 6d 6f 76 65 20 74 68 65 20  case remove the 
228b0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 0a  conflicting row.
228c0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65      ** before re
228d0 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 49  attempting the I
228e0 4e 53 45 52 54 2e 20 20 2a 2f 0a 20 20 20 20 65  NSERT.  */.    e
228f0 6c 73 65 20 69 66 28 20 62 52 65 70 6c 61 63 65  lse if( bReplace
22900 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22910 28 20 70 49 74 65 72 2d 3e 6f 70 3d 3d 53 51 4c  ( pIter->op==SQL
22920 49 54 45 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20  ITE_INSERT );.  
22930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22940 5f 65 78 65 63 28 64 62 2c 20 22 53 41 56 45 50  _exec(db, "SAVEP
22950 4f 49 4e 54 20 72 65 70 6c 61 63 65 5f 6f 70 22  OINT replace_op"
22960 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
22970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22980 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22990 63 20 3d 20 73 65 73 73 69 6f 6e 42 69 6e 64 52  c = sessionBindR
229a0 6f 77 28 70 49 74 65 72 2c 20 0a 20 20 20 20 20  ow(pIter, .     
229b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63 68         sqlite3ch
229c0 61 6e 67 65 73 65 74 5f 6e 65 77 2c 20 70 41 70  angeset_new, pAp
229d0 70 6c 79 2d 3e 6e 43 6f 6c 2c 20 70 41 70 70 6c  ply->nCol, pAppl
229e0 79 2d 3e 61 62 50 4b 2c 20 70 41 70 70 6c 79 2d  y->abPK, pApply-
229f0 3e 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  >pDelete);.     
22a00 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
22a10 69 6e 74 28 70 41 70 70 6c 79 2d 3e 70 44 65 6c  int(pApply->pDel
22a20 65 74 65 2c 20 70 41 70 70 6c 79 2d 3e 6e 43 6f  ete, pApply->nCo
22a30 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  l+1, 1);.      }
22a40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22a60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
22a70 28 70 41 70 70 6c 79 2d 3e 70 44 65 6c 65 74 65  (pApply->pDelete
22a80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22a90 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41  sqlite3_reset(pA
22aa0 70 70 6c 79 2d 3e 70 44 65 6c 65 74 65 29 3b 0a  pply->pDelete);.
22ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ad0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22ae0 73 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e 65 4f  sessionApplyOneO
22af0 70 28 70 49 74 65 72 2c 20 70 41 70 70 6c 79 2c  p(pIter, pApply,
22b00 20 78 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78   xConflict, pCtx
22b10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
22b20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b50 5f 65 78 65 63 28 64 62 2c 20 22 52 45 4c 45 41  _exec(db, "RELEA
22b60 53 45 20 72 65 70 6c 61 63 65 5f 6f 70 22 2c 20  SE replace_op", 
22b70 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
22b80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
22b90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22ba0 2a 2a 20 52 65 74 72 79 20 74 68 65 20 63 68 61  ** Retry the cha
22bb0 6e 67 65 73 20 61 63 63 75 6d 75 6c 61 74 65 64  nges accumulated
22bc0 20 69 6e 20 74 68 65 20 70 41 70 70 6c 79 2d 3e   in the pApply->
22bd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 66 66  constraints buff
22be0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
22bf0 74 20 73 65 73 73 69 6f 6e 52 65 74 72 79 43 6f  t sessionRetryCo
22c00 6e 73 74 72 61 69 6e 74 73 28 0a 20 20 73 71 6c  nstraints(.  sql
22c10 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
22c20 20 62 50 61 74 63 68 73 65 74 2c 0a 20 20 63 6f   bPatchset,.  co
22c30 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a  nst char *zTab,.
22c40 20 20 53 65 73 73 69 6f 6e 41 70 70 6c 79 43 74    SessionApplyCt
22c50 78 20 2a 70 41 70 70 6c 79 2c 0a 20 20 69 6e 74  x *pApply,.  int
22c60 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 76 6f 69  (*xConflict)(voi
22c70 64 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74 65 33  d*, int, sqlite3
22c80 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 2a  _changeset_iter*
22c90 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 20  ),.  void *pCtx 
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
22cc0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
22cd0 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29 7b   xConflict */.){
22ce0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22cf0 54 45 5f 4f 4b 3b 0a 0a 20 20 77 68 69 6c 65 28  TE_OK;..  while(
22d00 20 70 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61   pApply->constra
22d10 69 6e 74 73 2e 6e 42 75 66 20 29 7b 0a 20 20 20  ints.nBuf ){.   
22d20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
22d30 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 32 20  et_iter *pIter2 
22d40 3d 20 30 3b 0a 20 20 20 20 53 65 73 73 69 6f 6e  = 0;.    Session
22d50 42 75 66 66 65 72 20 63 6f 6e 73 20 3d 20 70 41  Buffer cons = pA
22d60 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  pply->constraint
22d70 73 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  s;.    memset(&p
22d80 41 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69 6e  Apply->constrain
22d90 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ts, 0, sizeof(Se
22da0 73 73 69 6f 6e 42 75 66 66 65 72 29 29 3b 0a 0a  ssionBuffer));..
22db0 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
22dc0 43 68 61 6e 67 65 73 65 74 53 74 61 72 74 28 26  ChangesetStart(&
22dd0 70 49 74 65 72 32 2c 20 30 2c 20 30 2c 20 63 6f  pIter2, 0, 0, co
22de0 6e 73 2e 6e 42 75 66 2c 20 63 6f 6e 73 2e 61 42  ns.nBuf, cons.aB
22df0 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  uf, 0);.    if( 
22e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22e10 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
22e20 20 3d 20 32 2a 70 41 70 70 6c 79 2d 3e 6e 43 6f   = 2*pApply->nCo
22e30 6c 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  l*sizeof(sqlite3
22e40 5f 76 61 6c 75 65 2a 29 3b 0a 20 20 20 20 20 20  _value*);.      
22e50 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 70  int rc2;.      p
22e60 49 74 65 72 32 2d 3e 62 50 61 74 63 68 73 65 74  Iter2->bPatchset
22e70 20 3d 20 62 50 61 74 63 68 73 65 74 3b 0a 20 20   = bPatchset;.  
22e80 20 20 20 20 70 49 74 65 72 32 2d 3e 7a 54 61 62      pIter2->zTab
22e90 20 3d 20 28 63 68 61 72 2a 29 7a 54 61 62 3b 0a   = (char*)zTab;.
22ea0 20 20 20 20 20 20 70 49 74 65 72 32 2d 3e 6e 43        pIter2->nC
22eb0 6f 6c 20 3d 20 70 41 70 70 6c 79 2d 3e 6e 43 6f  ol = pApply->nCo
22ec0 6c 3b 0a 20 20 20 20 20 20 70 49 74 65 72 32 2d  l;.      pIter2-
22ed0 3e 61 62 50 4b 20 3d 20 70 41 70 70 6c 79 2d 3e  >abPK = pApply->
22ee0 61 62 50 4b 3b 0a 20 20 20 20 20 20 73 65 73 73  abPK;.      sess
22ef0 69 6f 6e 42 75 66 66 65 72 47 72 6f 77 28 26 70  ionBufferGrow(&p
22f00 49 74 65 72 32 2d 3e 74 62 6c 68 64 72 2c 20 6e  Iter2->tblhdr, n
22f10 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Byte, &rc);.    
22f20 20 20 70 49 74 65 72 32 2d 3e 61 70 56 61 6c 75    pIter2->apValu
22f30 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  e = (sqlite3_val
22f40 75 65 2a 2a 29 70 49 74 65 72 32 2d 3e 74 62 6c  ue**)pIter2->tbl
22f50 68 64 72 2e 61 42 75 66 3b 0a 20 20 20 20 20 20  hdr.aBuf;.      
22f60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22f70 4b 20 29 20 6d 65 6d 73 65 74 28 70 49 74 65 72  K ) memset(pIter
22f80 32 2d 3e 61 70 56 61 6c 75 65 2c 20 30 2c 20 6e  2->apValue, 0, n
22f90 42 79 74 65 29 3b 0a 0a 20 20 20 20 20 20 77 68  Byte);..      wh
22fa0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22fb0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
22fc0 3d 3d 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  ==sqlite3changes
22fd0 65 74 5f 6e 65 78 74 28 70 49 74 65 72 32 29 20  et_next(pIter2) 
22fe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22ff0 73 65 73 73 69 6f 6e 41 70 70 6c 79 4f 6e 65 57  sessionApplyOneW
23000 69 74 68 52 65 74 72 79 28 64 62 2c 20 70 49 74  ithRetry(db, pIt
23010 65 72 32 2c 20 70 41 70 70 6c 79 2c 20 78 43 6f  er2, pApply, xCo
23020 6e 66 6c 69 63 74 2c 20 70 43 74 78 29 3b 0a 20  nflict, pCtx);. 
23030 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
23040 32 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67  2 = sqlite3chang
23050 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49  eset_finalize(pI
23060 74 65 72 32 29 3b 0a 20 20 20 20 20 20 69 66 28  ter2);.      if(
23070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23080 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
23090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 70  .    assert( pAp
230a0 70 6c 79 2d 3e 62 44 65 66 65 72 43 6f 6e 73 74  ply->bDeferConst
230b0 72 61 69 6e 74 73 20 7c 7c 20 70 41 70 70 6c 79  raints || pApply
230c0 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 73 2e 6e 42  ->constraints.nB
230d0 75 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 73 71  uf==0 );..    sq
230e0 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 73 2e  lite3_free(cons.
230f0 61 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  aBuf);.    if( r
23100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
23110 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 41  reak;.    if( pA
23120 70 70 6c 79 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  pply->constraint
23130 73 2e 6e 42 75 66 3e 3d 63 6f 6e 73 2e 6e 42 75  s.nBuf>=cons.nBu
23140 66 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  f ){.      /* No
23150 20 70 72 6f 67 72 65 73 73 20 77 61 73 20 6d 61   progress was ma
23160 64 65 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 72  de on the last r
23170 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ound. */.      p
23180 41 70 70 6c 79 2d 3e 62 44 65 66 65 72 43 6f 6e  Apply->bDeferCon
23190 73 74 72 61 69 6e 74 73 20 3d 20 30 3b 0a 20 20  straints = 0;.  
231a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
231b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
231c0 72 67 75 6d 65 6e 74 20 70 49 74 65 72 20 69 73  rgument pIter is
231d0 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 74 65   a changeset ite
231e0 72 61 74 6f 72 20 74 68 61 74 20 68 61 73 20 62  rator that has b
231f0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  een initialized,
23200 20 62 75 74 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   but.** not yet 
23210 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
23220 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28  3changeset_next(
23230 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
23240 20 61 70 70 6c 69 65 73 20 74 68 65 20 0a 2a 2a   applies the .**
23250 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 74 68   changeset to th
23260 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
23270 61 74 74 61 63 68 65 64 20 74 6f 20 68 61 6e 64  attached to hand
23280 6c 65 20 22 64 62 22 2e 20 54 68 65 20 73 75 70  le "db". The sup
23290 70 6c 69 65 64 0a 2a 2a 20 63 6f 6e 66 6c 69 63  plied.** conflic
232a0 74 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  t handler callba
232b0 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  ck is invoked to
232c0 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6e   resolve any con
232d0 66 6c 69 63 74 73 20 65 6e 63 6f 75 6e 74 65 72  flicts encounter
232e0 65 64 0a 2a 2a 20 77 68 69 6c 65 20 61 70 70 6c  ed.** while appl
232f0 79 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2e  ying the change.
23300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
23310 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74 41  essionChangesetA
23320 70 70 6c 79 28 0a 20 20 73 71 6c 69 74 65 33 20  pply(.  sqlite3 
23330 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
23340 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79          /* Apply
23350 20 63 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e   change to "main
23360 22 20 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e  " db of this han
23370 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
23380 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
23390 2a 70 49 74 65 72 2c 20 20 2f 2a 20 43 68 61 6e  *pIter,  /* Chan
233a0 67 65 73 65 74 20 74 6f 20 61 70 70 6c 79 20 2a  geset to apply *
233b0 2f 0a 20 20 69 6e 74 28 2a 78 46 69 6c 74 65 72  /.  int(*xFilter
233c0 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74  )(.    void *pCt
233d0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
233e0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
233f0 73 69 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70  sixth arg to _ap
23400 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e  ply() */.    con
23410 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20 20  st char *zTab   
23420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
23430 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c  ble name */.  ),
23440 0a 20 20 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63  .  int(*xConflic
23450 74 29 28 0a 20 20 20 20 76 6f 69 64 20 2a 70 43  t)(.    void *pC
23460 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
23470 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
23480 20 66 69 66 74 68 20 61 72 67 20 74 6f 20 5f 61   fifth arg to _a
23490 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e  pply() */.    in
234a0 74 20 65 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20  t eConflict,    
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
234c0 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f  ATA, MISSING, CO
234d0 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49  NFLICT, CONSTRAI
234e0 4e 54 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  NT */.    sqlite
234f0 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72  3_changeset_iter
23500 20 2a 70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c   *p     /* Handl
23510 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61  e describing cha
23520 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74  nge and conflict
23530 20 2a 2f 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20   */.  ),.  void 
23540 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
23550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23560 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
23570 73 65 64 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74  sed to xConflict
23580 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 52   */.  void **ppR
23590 65 62 61 73 65 2c 20 69 6e 74 20 2a 70 6e 52 65  ebase, int *pnRe
235a0 62 61 73 65 2c 20 2f 2a 20 4f 55 54 3a 20 52 65  base, /* OUT: Re
235b0 62 61 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  base information
235c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 20 20 20 20 2f 2a 20 53 45 53 53 49 4f 4e        /* SESSION
235f0 5f 41 50 50 4c 59 5f 58 58 58 20 66 6c 61 67 73  _APPLY_XXX flags
23600 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 63 68   */.){.  int sch
23610 65 6d 61 4d 69 73 6d 61 74 63 68 20 3d 20 30 3b  emaMismatch = 0;
23620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23630 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
23640 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
23650 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
23660 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
23670 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23680 66 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  f current table 
23690 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 20 3d 20  */.  int nTab = 
236a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
236b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
236c0 66 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  f sqlite3Strlen3
236d0 30 28 7a 54 61 62 29 20 2a 2f 0a 20 20 53 65 73  0(zTab) */.  Ses
236e0 73 69 6f 6e 41 70 70 6c 79 43 74 78 20 73 41 70  sionApplyCtx sAp
236f0 70 6c 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ply;         /* 
23700 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28  changeset_apply(
23710 29 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  ) context object
23720 20 2a 2f 0a 20 20 69 6e 74 20 62 50 61 74 63 68   */.  int bPatch
23730 73 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  set;..  assert( 
23740 78 43 6f 6e 66 6c 69 63 74 21 3d 30 20 29 3b 0a  xConflict!=0 );.
23750 0a 20 20 70 49 74 65 72 2d 3e 69 6e 2e 62 4e 6f  .  pIter->in.bNo
23760 44 69 73 63 61 72 64 20 3d 20 31 3b 0a 20 20 6d  Discard = 1;.  m
23770 65 6d 73 65 74 28 26 73 41 70 70 6c 79 2c 20 30  emset(&sApply, 0
23780 2c 20 73 69 7a 65 6f 66 28 73 41 70 70 6c 79 29  , sizeof(sApply)
23790 29 3b 0a 20 20 73 41 70 70 6c 79 2e 62 52 65 62  );.  sApply.bReb
237a0 61 73 65 20 3d 20 28 70 70 52 65 62 61 73 65 20  ase = (ppRebase 
237b0 26 26 20 70 6e 52 65 62 61 73 65 29 3b 0a 20 20  && pnRebase);.  
237c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
237d0 74 65 72 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ter(sqlite3_db_m
237e0 75 74 65 78 28 64 62 29 29 3b 0a 20 20 69 66 28  utex(db));.  if(
237f0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23800 5f 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59 5f  _CHANGESETAPPLY_
23810 4e 4f 53 41 56 45 50 4f 49 4e 54 29 3d 3d 30 20  NOSAVEPOINT)==0 
23820 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23830 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53 41  te3_exec(db, "SA
23840 56 45 50 4f 49 4e 54 20 63 68 61 6e 67 65 73 65  VEPOINT changese
23850 74 5f 61 70 70 6c 79 22 2c 20 30 2c 20 30 2c 20  t_apply", 0, 0, 
23860 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
23870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23890 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41  exec(db, "PRAGMA
238a0 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b   defer_foreign_k
238b0 65 79 73 20 3d 20 31 22 2c 20 30 2c 20 30 2c 20  eys = 1", 0, 0, 
238c0 30 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  0);.  }.  while(
238d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
238e0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
238f0 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6e  lite3changeset_n
23900 65 78 74 28 70 49 74 65 72 29 20 29 7b 0a 20 20  ext(pIter) ){.  
23910 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
23920 69 6e 74 20 6f 70 3b 0a 20 20 20 20 63 6f 6e 73  int op;.    cons
23930 74 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20  t char *zNew;.  
23940 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 63 68    .    sqlite3ch
23950 61 6e 67 65 73 65 74 5f 6f 70 28 70 49 74 65 72  angeset_op(pIter
23960 2c 20 26 7a 4e 65 77 2c 20 26 6e 43 6f 6c 2c 20  , &zNew, &nCol, 
23970 26 6f 70 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  &op, 0);..    if
23980 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 73 71 6c  ( zTab==0 || sql
23990 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e  ite3_strnicmp(zN
239a0 65 77 2c 20 7a 54 61 62 2c 20 6e 54 61 62 2b 31  ew, zTab, nTab+1
239b0 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  ) ){.      u8 *a
239c0 62 50 4b 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  bPK;..      rc =
239d0 20 73 65 73 73 69 6f 6e 52 65 74 72 79 43 6f 6e   sessionRetryCon
239e0 73 74 72 61 69 6e 74 73 28 0a 20 20 20 20 20 20  straints(.      
239f0 20 20 20 20 64 62 2c 20 70 49 74 65 72 2d 3e 62      db, pIter->b
23a00 50 61 74 63 68 73 65 74 2c 20 7a 54 61 62 2c 20  Patchset, zTab, 
23a10 26 73 41 70 70 6c 79 2c 20 78 43 6f 6e 66 6c 69  &sApply, xConfli
23a20 63 74 2c 20 70 43 74 78 0a 20 20 20 20 20 20 29  ct, pCtx.      )
23a30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23a40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
23a50 6b 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k;..      sqlite
23a60 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 73 41  3_free((char*)sA
23a70 70 70 6c 79 2e 61 7a 43 6f 6c 29 3b 20 20 2f 2a  pply.azCol);  /*
23a80 20 63 61 73 74 20 77 6f 72 6b 73 20 61 72 6f 75   cast works arou
23a90 6e 64 20 56 43 2b 2b 20 62 75 67 20 2a 2f 0a 20  nd VC++ bug */. 
23aa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
23ab0 61 6c 69 7a 65 28 73 41 70 70 6c 79 2e 70 44 65  alize(sApply.pDe
23ac0 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  lete);.      sql
23ad0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 41  ite3_finalize(sA
23ae0 70 70 6c 79 2e 70 55 70 64 61 74 65 29 3b 20 0a  pply.pUpdate); .
23af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
23b00 6e 61 6c 69 7a 65 28 73 41 70 70 6c 79 2e 70 49  nalize(sApply.pI
23b10 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 73 71  nsert);.      sq
23b20 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73  lite3_finalize(s
23b30 41 70 70 6c 79 2e 70 53 65 6c 65 63 74 29 3b 0a  Apply.pSelect);.
23b40 20 20 20 20 20 20 73 41 70 70 6c 79 2e 64 62 20        sApply.db 
23b50 3d 20 64 62 3b 0a 20 20 20 20 20 20 73 41 70 70  = db;.      sApp
23b60 6c 79 2e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  ly.pDelete = 0;.
23b70 20 20 20 20 20 20 73 41 70 70 6c 79 2e 70 55 70        sApply.pUp
23b80 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
23b90 73 41 70 70 6c 79 2e 70 49 6e 73 65 72 74 20 3d  sApply.pInsert =
23ba0 20 30 3b 0a 20 20 20 20 20 20 73 41 70 70 6c 79   0;.      sApply
23bb0 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
23bc0 20 20 20 20 73 41 70 70 6c 79 2e 6e 43 6f 6c 20      sApply.nCol 
23bd0 3d 20 30 3b 0a 20 20 20 20 20 20 73 41 70 70 6c  = 0;.      sAppl
23be0 79 2e 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  y.azCol = 0;.   
23bf0 20 20 20 73 41 70 70 6c 79 2e 61 62 50 4b 20 3d     sApply.abPK =
23c00 20 30 3b 0a 20 20 20 20 20 20 73 41 70 70 6c 79   0;.      sApply
23c10 2e 62 53 74 61 74 31 20 3d 20 30 3b 0a 20 20 20  .bStat1 = 0;.   
23c20 20 20 20 73 41 70 70 6c 79 2e 62 44 65 66 65 72     sApply.bDefer
23c30 43 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  Constraints = 1;
23c40 0a 20 20 20 20 20 20 73 41 70 70 6c 79 2e 62 52  .      sApply.bR
23c50 65 62 61 73 65 53 74 61 72 74 65 64 20 3d 20 30  ebaseStarted = 0
23c60 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
23c70 73 41 70 70 6c 79 2e 63 6f 6e 73 74 72 61 69 6e  sApply.constrain
23c80 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ts, 0, sizeof(Se
23c90 73 73 69 6f 6e 42 75 66 66 65 72 29 29 3b 0a 0a  ssionBuffer));..
23ca0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 78        /* If an x
23cb0 46 69 6c 74 65 72 28 29 20 63 61 6c 6c 62 61 63  Filter() callbac
23cc0 6b 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  k was specified,
23cd0 20 69 6e 76 6f 6b 65 20 69 74 20 6e 6f 77 2e 20   invoke it now. 
23ce0 49 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  If the .      **
23cf0 20 78 46 69 6c 74 65 72 20 63 61 6c 6c 62 61 63   xFilter callbac
23d00 6b 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  k returns zero, 
23d10 73 6b 69 70 20 74 68 69 73 20 74 61 62 6c 65 2e  skip this table.
23d20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 0a 20   If it returns. 
23d30 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f       ** non-zero
23d40 2c 20 70 72 6f 63 65 65 64 2e 20 2a 2f 0a 20 20  , proceed. */.  
23d50 20 20 20 20 73 63 68 65 6d 61 4d 69 73 6d 61 74      schemaMismat
23d60 63 68 20 3d 20 28 78 46 69 6c 74 65 72 20 26 26  ch = (xFilter &&
23d70 20 28 30 3d 3d 78 46 69 6c 74 65 72 28 70 43 74   (0==xFilter(pCt
23d80 78 2c 20 7a 4e 65 77 29 29 29 3b 0a 20 20 20 20  x, zNew)));.    
23d90 20 20 69 66 28 20 73 63 68 65 6d 61 4d 69 73 6d    if( schemaMism
23da0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
23db0 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zTab = sqlite3_m
23dc0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 65  printf("%s", zNe
23dd0 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
23de0 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zTab==0 ){.     
23df0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23e00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23e20 20 7d 0a 20 20 20 20 20 20 20 20 6e 54 61 62 20   }.        nTab 
23e30 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
23e40 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 41 70  ab);.        sAp
23e50 70 6c 79 2e 61 7a 43 6f 6c 20 3d 20 28 63 6f 6e  ply.azCol = (con
23e60 73 74 20 63 68 61 72 20 2a 2a 29 7a 54 61 62 3b  st char **)zTab;
23e70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23e80 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 43 6f        int nMinCo
23e90 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
23ea0 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 20 20 73  nt i;..        s
23eb0 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
23ec0 70 6b 28 70 49 74 65 72 2c 20 26 61 62 50 4b 2c  pk(pIter, &abPK,
23ed0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
23ee0 3d 20 73 65 73 73 69 6f 6e 54 61 62 6c 65 49 6e  = sessionTableIn
23ef0 66 6f 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo(.            
23f00 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 4e 65 77  db, "main", zNew
23f10 2c 20 26 73 41 70 70 6c 79 2e 6e 43 6f 6c 2c 20  , &sApply.nCol, 
23f20 26 7a 54 61 62 2c 20 26 73 41 70 70 6c 79 2e 61  &zTab, &sApply.a
23f30 7a 43 6f 6c 2c 20 26 73 41 70 70 6c 79 2e 61 62  zCol, &sApply.ab
23f40 50 4b 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  PK.        );.  
23f50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23f60 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
23f70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
23f80 3b 20 69 3c 73 41 70 70 6c 79 2e 6e 43 6f 6c 3b  ; i<sApply.nCol;
23f90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
23fa0 20 69 66 28 20 73 41 70 70 6c 79 2e 61 62 50 4b   if( sApply.abPK
23fb0 5b 69 5d 20 29 20 6e 4d 69 6e 43 6f 6c 20 3d 20  [i] ) nMinCol = 
23fc0 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i+1;.        }. 
23fd0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 41   .        if( sA
23fe0 70 70 6c 79 2e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a  pply.nCol==0 ){.
23ff0 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
24000 4d 69 73 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20  Mismatch = 1;.  
24010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24020 6c 6f 67 28 53 51 4c 49 54 45 5f 53 43 48 45 4d  log(SQLITE_SCHEM
24030 41 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A, .            
24040 20 20 22 73 71 6c 69 74 65 33 63 68 61 6e 67 65    "sqlite3change
24050 73 65 74 5f 61 70 70 6c 79 28 29 3a 20 6e 6f 20  set_apply(): no 
24060 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
24070 20 7a 54 61 62 0a 20 20 20 20 20 20 20 20 20 20   zTab.          
24080 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24090 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 41       else if( sA
240a0 70 70 6c 79 2e 6e 43 6f 6c 3c 6e 43 6f 6c 20 29  pply.nCol<nCol )
240b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  {.          sche
240c0 6d 61 4d 69 73 6d 61 74 63 68 20 3d 20 31 3b 0a  maMismatch = 1;.
240d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
240e0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 53 43 48  3_log(SQLITE_SCH
240f0 45 4d 41 2c 20 0a 20 20 20 20 20 20 20 20 20 20  EMA, .          
24100 20 20 20 20 22 73 71 6c 69 74 65 33 63 68 61 6e      "sqlite3chan
24110 67 65 73 65 74 5f 61 70 70 6c 79 28 29 3a 20 74  geset_apply(): t
24120 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 63  able %s has %d c
24130 6f 6c 75 6d 6e 73 2c 20 22 0a 20 20 20 20 20 20  olumns, ".      
24140 20 20 20 20 20 20 20 20 22 65 78 70 65 63 74 65          "expecte
24150 64 20 25 64 20 6f 72 20 6d 6f 72 65 22 2c 20 0a  d %d or more", .
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
24170 61 62 2c 20 73 41 70 70 6c 79 2e 6e 43 6f 6c 2c  ab, sApply.nCol,
24180 20 6e 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 20   nCol.          
24190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
241a0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 43       else if( nC
241b0 6f 6c 3c 6e 4d 69 6e 43 6f 6c 20 7c 7c 20 6d 65  ol<nMinCol || me
241c0 6d 63 6d 70 28 73 41 70 70 6c 79 2e 61 62 50 4b  mcmp(sApply.abPK
241d0 2c 20 61 62 50 4b 2c 20 6e 43 6f 6c 29 21 3d 30  , abPK, nCol)!=0
241e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 63   ){.          sc
241f0 68 65 6d 61 4d 69 73 6d 61 74 63 68 20 3d 20 31  hemaMismatch = 1
24200 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24210 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 53  te3_log(SQLITE_S
24220 43 48 45 4d 41 2c 20 22 73 71 6c 69 74 65 33 63  CHEMA, "sqlite3c
24230 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 29  hangeset_apply()
24240 3a 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  : ".            
24250 20 20 22 70 72 69 6d 61 72 79 20 6b 65 79 20 6d    "primary key m
24260 69 73 6d 61 74 63 68 20 66 6f 72 20 74 61 62 6c  ismatch for tabl
24270 65 20 25 73 22 2c 20 7a 54 61 62 0a 20 20 20 20  e %s", zTab.    
24280 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24290 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b   }.        else{
242a0 0a 20 20 20 20 20 20 20 20 20 20 73 41 70 70 6c  .          sAppl
242b0 79 2e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  y.nCol = nCol;. 
242c0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
242d0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
242e0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
242f0 61 74 31 22 29 20 29 7b 0a 20 20 20 20 20 20 20  at1") ){.       
24300 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73       if( (rc = s
24310 65 73 73 69 6f 6e 53 74 61 74 31 53 71 6c 28 64  essionStat1Sql(d
24320 62 2c 20 26 73 41 70 70 6c 79 29 20 29 20 29 7b  b, &sApply) ) ){
24330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
24340 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
24350 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24360 73 41 70 70 6c 79 2e 62 53 74 61 74 31 20 3d 20  sApply.bStat1 = 
24370 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
24380 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
24390 69 66 28 28 72 63 20 3d 20 73 65 73 73 69 6f 6e  if((rc = session
243a0 53 65 6c 65 63 74 52 6f 77 28 64 62 2c 20 7a 54  SelectRow(db, zT
243b0 61 62 2c 20 26 73 41 70 70 6c 79 29 29 0a 20 20  ab, &sApply)).  
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
243d0 20 28 72 63 20 3d 20 73 65 73 73 69 6f 6e 55 70   (rc = sessionUp
243e0 64 61 74 65 52 6f 77 28 64 62 2c 20 7a 54 61 62  dateRow(db, zTab
243f0 2c 20 26 73 41 70 70 6c 79 29 29 0a 20 20 20 20  , &sApply)).    
24400 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
24410 72 63 20 3d 20 73 65 73 73 69 6f 6e 44 65 6c 65  rc = sessionDele
24420 74 65 52 6f 77 28 64 62 2c 20 7a 54 61 62 2c 20  teRow(db, zTab, 
24430 26 73 41 70 70 6c 79 29 29 0a 20 20 20 20 20 20  &sApply)).      
24440 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63            || (rc
24450 20 3d 20 73 65 73 73 69 6f 6e 49 6e 73 65 72 74   = sessionInsert
24460 52 6f 77 28 64 62 2c 20 7a 54 61 62 2c 20 26 73  Row(db, zTab, &s
24470 41 70 70 6c 79 29 29 0a 20 20 20 20 20 20 20 20  Apply)).        
24480 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
244a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
244b0 20 20 20 20 20 20 20 20 73 41 70 70 6c 79 2e 62          sApply.b
244c0 53 74 61 74 31 20 3d 20 30 3b 0a 20 20 20 20 20  Stat1 = 0;.     
244d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
244e0 0a 20 20 20 20 20 20 20 20 6e 54 61 62 20 3d 20  .        nTab = 
244f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
24500 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zTab);.      }. 
24510 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
24520 74 68 65 72 65 20 69 73 20 61 20 73 63 68 65 6d  there is a schem
24530 61 20 6d 69 73 6d 61 74 63 68 20 6f 6e 20 74 68  a mismatch on th
24540 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2c  e current table,
24550 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65 0a   proceed to the.
24560 20 20 20 20 2a 2a 20 6e 65 78 74 20 63 68 61 6e      ** next chan
24570 67 65 2e 20 41 20 6c 6f 67 20 6d 65 73 73 61 67  ge. A log messag
24580 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
24590 65 6e 20 69 73 73 75 65 64 2e 20 2a 2f 0a 20 20  en issued. */.  
245a0 20 20 69 66 28 20 73 63 68 65 6d 61 4d 69 73 6d    if( schemaMism
245b0 61 74 63 68 20 29 20 63 6f 6e 74 69 6e 75 65 3b  atch ) continue;
245c0 0a 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69  ..    rc = sessi
245d0 6f 6e 41 70 70 6c 79 4f 6e 65 57 69 74 68 52 65  onApplyOneWithRe
245e0 74 72 79 28 64 62 2c 20 70 49 74 65 72 2c 20 26  try(db, pIter, &
245f0 73 41 70 70 6c 79 2c 20 78 43 6f 6e 66 6c 69 63  sApply, xConflic
24600 74 2c 20 70 43 74 78 29 3b 0a 20 20 7d 0a 0a 20  t, pCtx);.  }.. 
24610 20 62 50 61 74 63 68 73 65 74 20 3d 20 70 49 74   bPatchset = pIt
24620 65 72 2d 3e 62 50 61 74 63 68 73 65 74 3b 0a 20  er->bPatchset;. 
24630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24640 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
24650 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
24660 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b  finalize(pIter);
24670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24680 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66  lite3changeset_f
24690 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a  inalize(pIter);.
246a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
246b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
246c0 72 63 20 3d 20 73 65 73 73 69 6f 6e 52 65 74 72  rc = sessionRetr
246d0 79 43 6f 6e 73 74 72 61 69 6e 74 73 28 64 62 2c  yConstraints(db,
246e0 20 62 50 61 74 63 68 73 65 74 2c 20 7a 54 61 62   bPatchset, zTab
246f0 2c 20 26 73 41 70 70 6c 79 2c 20 78 43 6f 6e 66  , &sApply, xConf
24700 6c 69 63 74 2c 20 70 43 74 78 29 3b 0a 20 20 7d  lict, pCtx);.  }
24710 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
24720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
24730 20 6e 46 6b 2c 20 6e 6f 74 55 73 65 64 3b 0a 20   nFk, notUsed;. 
24740 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
24750 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
24760 44 42 53 54 41 54 55 53 5f 44 45 46 45 52 52 45  DBSTATUS_DEFERRE
24770 44 5f 46 4b 53 2c 20 26 6e 46 6b 2c 20 26 6e 6f  D_FKS, &nFk, &no
24780 74 55 73 65 64 2c 20 30 29 3b 0a 20 20 20 20 69  tUsed, 0);.    i
24790 66 28 20 6e 46 6b 21 3d 30 20 29 7b 0a 20 20 20  f( nFk!=0 ){.   
247a0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 53 51 4c     int res = SQL
247b0 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42  ITE_CHANGESET_AB
247c0 4f 52 54 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ORT;.      sqlit
247d0 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
247e0 72 20 73 49 74 65 72 3b 0a 20 20 20 20 20 20 6d  r sIter;.      m
247f0 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
24800 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
24810 0a 20 20 20 20 20 20 73 49 74 65 72 2e 6e 43 6f  .      sIter.nCo
24820 6c 20 3d 20 6e 46 6b 3b 0a 20 20 20 20 20 20 72  l = nFk;.      r
24830 65 73 20 3d 20 78 43 6f 6e 66 6c 69 63 74 28 70  es = xConflict(p
24840 43 74 78 2c 20 53 51 4c 49 54 45 5f 43 48 41 4e  Ctx, SQLITE_CHAN
24850 47 45 53 45 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  GESET_FOREIGN_KE
24860 59 2c 20 26 73 49 74 65 72 29 3b 0a 20 20 20 20  Y, &sIter);.    
24870 20 20 69 66 28 20 72 65 73 21 3d 53 51 4c 49 54    if( res!=SQLIT
24880 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49 54  E_CHANGESET_OMIT
24890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
248a0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
248b0 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NT;.      }.    
248c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
248d0 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41  exec(db, "PRAGMA
248e0 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b   defer_foreign_k
248f0 65 79 73 20 3d 20 30 22 2c 20 30 2c 20 30 2c 20  eys = 0", 0, 0, 
24900 30 29 3b 0a 0a 20 20 69 66 28 20 28 66 6c 61 67  0);..  if( (flag
24910 73 20 26 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  s & SQLITE_CHANG
24920 45 53 45 54 41 50 50 4c 59 5f 4e 4f 53 41 56 45  ESETAPPLY_NOSAVE
24930 50 4f 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  POINT)==0 ){.   
24940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
24960 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
24970 2c 20 22 52 45 4c 45 41 53 45 20 63 68 61 6e 67  , "RELEASE chang
24980 65 73 65 74 5f 61 70 70 6c 79 22 2c 20 30 2c 20  eset_apply", 0, 
24990 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
249a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
249b0 65 78 65 63 28 64 62 2c 20 22 52 4f 4c 4c 42 41  exec(db, "ROLLBA
249c0 43 4b 20 54 4f 20 63 68 61 6e 67 65 73 65 74 5f  CK TO changeset_
249d0 61 70 70 6c 79 22 2c 20 30 2c 20 30 2c 20 30 29  apply", 0, 0, 0)
249e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
249f0 65 78 65 63 28 64 62 2c 20 22 52 45 4c 45 41 53  exec(db, "RELEAS
24a00 45 20 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  E changeset_appl
24a10 79 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  y", 0, 0, 0);.  
24a20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
24a30 74 28 20 73 41 70 70 6c 79 2e 62 52 65 62 61 73  t( sApply.bRebas
24a40 65 20 7c 7c 20 73 41 70 70 6c 79 2e 72 65 62 61  e || sApply.reba
24a50 73 65 2e 6e 42 75 66 3d 3d 30 20 29 3b 0a 20 20  se.nBuf==0 );.  
24a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24a70 4b 20 26 26 20 62 50 61 74 63 68 73 65 74 3d 3d  K && bPatchset==
24a80 30 20 26 26 20 73 41 70 70 6c 79 2e 62 52 65 62  0 && sApply.bReb
24a90 61 73 65 20 29 7b 0a 20 20 20 20 2a 70 70 52 65  ase ){.    *ppRe
24aa0 62 61 73 65 20 3d 20 28 76 6f 69 64 2a 29 73 41  base = (void*)sA
24ab0 70 70 6c 79 2e 72 65 62 61 73 65 2e 61 42 75 66  pply.rebase.aBuf
24ac0 3b 0a 20 20 20 20 2a 70 6e 52 65 62 61 73 65 20  ;.    *pnRebase 
24ad0 3d 20 73 41 70 70 6c 79 2e 72 65 62 61 73 65 2e  = sApply.rebase.
24ae0 6e 42 75 66 3b 0a 20 20 20 20 73 41 70 70 6c 79  nBuf;.    sApply
24af0 2e 72 65 62 61 73 65 2e 61 42 75 66 20 3d 20 30  .rebase.aBuf = 0
24b00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
24b10 66 69 6e 61 6c 69 7a 65 28 73 41 70 70 6c 79 2e  finalize(sApply.
24b20 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69  pInsert);.  sqli
24b30 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 41 70  te3_finalize(sAp
24b40 70 6c 79 2e 70 44 65 6c 65 74 65 29 3b 0a 20 20  ply.pDelete);.  
24b50 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
24b60 28 73 41 70 70 6c 79 2e 70 55 70 64 61 74 65 29  (sApply.pUpdate)
24b70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
24b80 6c 69 7a 65 28 73 41 70 70 6c 79 2e 70 53 65 6c  lize(sApply.pSel
24b90 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ect);.  sqlite3_
24ba0 66 72 65 65 28 28 63 68 61 72 2a 29 73 41 70 70  free((char*)sApp
24bb0 6c 79 2e 61 7a 43 6f 6c 29 3b 20 20 2f 2a 20 63  ly.azCol);  /* c
24bc0 61 73 74 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ast works around
24bd0 20 56 43 2b 2b 20 62 75 67 20 2a 2f 0a 20 20 73   VC++ bug */.  s
24be0 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61  qlite3_free((cha
24bf0 72 2a 29 73 41 70 70 6c 79 2e 63 6f 6e 73 74 72  r*)sApply.constr
24c00 61 69 6e 74 73 2e 61 42 75 66 29 3b 0a 20 20 73  aints.aBuf);.  s
24c10 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61  qlite3_free((cha
24c20 72 2a 29 73 41 70 70 6c 79 2e 72 65 62 61 73 65  r*)sApply.rebase
24c30 2e 61 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  .aBuf);.  sqlite
24c40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
24c50 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 64  lite3_db_mutex(d
24c60 62 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  b));.  return rc
24c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  ;.}../*.** Apply
24c80 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 70   the changeset p
24c90 61 73 73 65 64 20 76 69 61 20 70 43 68 61 6e 67  assed via pChang
24ca0 65 73 65 74 2f 6e 43 68 61 6e 67 65 73 65 74 20  eset/nChangeset 
24cb0 74 6f 20 74 68 65 20 6d 61 69 6e 20 0a 2a 2a 20  to the main .** 
24cc0 64 61 74 61 62 61 73 65 20 61 74 74 61 63 68 65  database attache
24cd0 64 20 74 6f 20 68 61 6e 64 6c 65 20 22 64 62 22  d to handle "db"
24ce0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24cf0 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
24d00 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
24d10 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
24d20 20 20 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 63        /* Apply c
24d30 68 61 6e 67 65 20 74 6f 20 22 6d 61 69 6e 22 20  hange to "main" 
24d40 64 62 20 6f 66 20 74 68 69 73 20 68 61 6e 64 6c  db of this handl
24d50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e  e */.  int nChan
24d60 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  geset,          
24d70 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
24d80 66 20 63 68 61 6e 67 65 73 65 74 20 69 6e 20 62  f changeset in b
24d90 79 74 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ytes */.  void *
24da0 70 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  pChangeset,     
24db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
24dc0 6e 67 65 73 65 74 20 62 6c 6f 62 20 2a 2f 0a 20  ngeset blob */. 
24dd0 20 69 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a   int(*xFilter)(.
24de0 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20      void *pCtx, 
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78    /* Copy of six
24e10 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79  th arg to _apply
24e20 28 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  () */.    const 
24e30 63 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20  char *zTab      
24e40 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
24e50 20 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20   name */.  ),.  
24e60 69 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28  int(*xConflict)(
24e70 0a 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  .    void *pCtx,
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69     /* Copy of si
24ea0 78 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c  xth arg to _appl
24eb0 79 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  y() */.    int e
24ec0 43 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20  Conflict,       
24ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41           /* DATA
24ee0 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c  , MISSING, CONFL
24ef0 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20  ICT, CONSTRAINT 
24f00 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
24f10 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
24f20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64       /* Handle d
24f30 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65  escribing change
24f40 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f   and conflict */
24f50 0a 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  .  ),.  void *pC
24f60 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
24f70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24f80 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
24f90 20 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f   to xConflict */
24fa0 0a 20 20 76 6f 69 64 20 2a 2a 70 70 52 65 62 61  .  void **ppReba
24fb0 73 65 2c 20 69 6e 74 20 2a 70 6e 52 65 62 61 73  se, int *pnRebas
24fc0 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 0a 29  e,.  int flags.)
24fd0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  {.  sqlite3_chan
24fe0 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
24ff0 72 3b 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20  r;  /* Iterator 
25000 74 6f 20 73 6b 69 70 20 74 68 72 6f 75 67 68 20  to skip through 
25010 63 68 61 6e 67 65 73 65 74 20 2a 2f 20 20 0a 20  changeset */  . 
25020 20 69 6e 74 20 62 49 6e 76 65 72 73 65 20 3d 20   int bInverse = 
25030 21 21 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  !!(flags & SQLIT
25040 45 5f 43 48 41 4e 47 45 53 45 54 41 50 50 4c 59  E_CHANGESETAPPLY
25050 5f 49 4e 56 45 52 54 29 3b 0a 20 20 69 6e 74 20  _INVERT);.  int 
25060 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e  rc = sessionChan
25070 67 65 73 65 74 53 74 61 72 74 28 26 70 49 74 65  gesetStart(&pIte
25080 72 2c 20 30 2c 20 30 2c 20 6e 43 68 61 6e 67 65  r, 0, 0, nChange
25090 73 65 74 2c 20 70 43 68 61 6e 67 65 73 65 74 2c  set, pChangeset,
250a0 62 49 6e 76 65 72 73 65 29 3b 0a 20 20 69 66 28  bInverse);.  if(
250b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
250c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73 69  {.    rc = sessi
250d0 6f 6e 43 68 61 6e 67 65 73 65 74 41 70 70 6c 79  onChangesetApply
250e0 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 70 49  (.        db, pI
250f0 74 65 72 2c 20 78 46 69 6c 74 65 72 2c 20 78 43  ter, xFilter, xC
25100 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c 20 70  onflict, pCtx, p
25110 70 52 65 62 61 73 65 2c 20 70 6e 52 65 62 61 73  pRebase, pnRebas
25120 65 2c 20 66 6c 61 67 73 0a 20 20 20 20 29 3b 0a  e, flags.    );.
25130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  .}../*.** Apply 
25150 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 70 61  the changeset pa
25160 73 73 65 64 20 76 69 61 20 70 43 68 61 6e 67 65  ssed via pChange
25170 73 65 74 2f 6e 43 68 61 6e 67 65 73 65 74 20 74  set/nChangeset t
25180 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
25190 61 73 65 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ase.** attached 
251a0 74 6f 20 68 61 6e 64 6c 65 20 22 64 62 22 2e 20  to handle "db". 
251b0 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70 70 6c  Invoke the suppl
251c0 69 65 64 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e  ied conflict han
251d0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  dler callback.**
251e0 20 74 6f 20 72 65 73 6f 6c 76 65 20 61 6e 79 20   to resolve any 
251f0 63 6f 6e 66 6c 69 63 74 73 20 65 6e 63 6f 75 6e  conflicts encoun
25200 74 65 72 65 64 20 77 68 69 6c 65 20 61 70 70 6c  tered while appl
25210 79 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2e  ying the change.
25220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63  .*/.int sqlite3c
25230 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 28 0a  hangeset_apply(.
25240 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e 67    /* Apply chang
25270 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20 6f  e to "main" db o
25280 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a 2f  f this handle */
25290 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65  .  int nChangese
252a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
252b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 63 68     /* Size of ch
252c0 61 6e 67 65 73 65 74 20 69 6e 20 62 79 74 65 73  angeset in bytes
252d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 68 61   */.  void *pCha
252e0 6e 67 65 73 65 74 2c 20 20 20 20 20 20 20 20 20  ngeset,         
252f0 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
25300 65 74 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  et blob */.  int
25310 28 2a 78 46 69 6c 74 65 72 29 28 0a 20 20 20 20  (*xFilter)(.    
25320 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25340 20 43 6f 70 79 20 6f 66 20 73 69 78 74 68 20 61   Copy of sixth a
25350 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a  rg to _apply() *
25360 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
25370 20 2a 7a 54 61 62 20 20 20 20 20 20 20 20 20 20   *zTab          
25380 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d      /* Table nam
25390 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69 6e 74 28  e */.  ),.  int(
253a0 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20  *xConflict)(.   
253b0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253d0 2a 20 43 6f 70 79 20 6f 66 20 66 69 66 74 68 20  * Copy of fifth 
253e0 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20  arg to _apply() 
253f0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66  */.    int eConf
25400 6c 69 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  lict,           
25410 20 20 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49       /* DATA, MI
25420 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c  SSING, CONFLICT,
25430 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20   CONSTRAINT */. 
25440 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67     sqlite3_chang
25450 65 73 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20  eset_iter *p    
25460 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72   /* Handle descr
25470 69 62 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64  ibing change and
25480 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29   conflict */.  )
25490 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 20 20  ,.  void *pCtx  
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
254c0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
254d0 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a 29 7b 0a  xConflict */.){.
254e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
254f0 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
25500 76 32 28 0a 20 20 20 20 20 20 64 62 2c 20 6e 43  v2(.      db, nC
25510 68 61 6e 67 65 73 65 74 2c 20 70 43 68 61 6e 67  hangeset, pChang
25520 65 73 65 74 2c 20 78 46 69 6c 74 65 72 2c 20 78  eset, xFilter, x
25530 43 6f 6e 66 6c 69 63 74 2c 20 70 43 74 78 2c 20  Conflict, pCtx, 
25540 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a  0, 0, 0.  );.}..
25550 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 74 68 65 20  /*.** Apply the 
25560 63 68 61 6e 67 65 73 65 74 20 70 61 73 73 65 64  changeset passed
25570 20 76 69 61 20 78 49 6e 70 75 74 2f 70 49 6e 20   via xInput/pIn 
25580 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
25590 62 61 73 65 0a 2a 2a 20 61 74 74 61 63 68 65 64  base.** attached
255a0 20 74 6f 20 68 61 6e 64 6c 65 20 22 64 62 22 2e   to handle "db".
255b0 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 70 70   Invoke the supp
255c0 6c 69 65 64 20 63 6f 6e 66 6c 69 63 74 20 68 61  lied conflict ha
255d0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 0a 2a  ndler callback.*
255e0 2a 20 74 6f 20 72 65 73 6f 6c 76 65 20 61 6e 79  * to resolve any
255f0 20 63 6f 6e 66 6c 69 63 74 73 20 65 6e 63 6f 75   conflicts encou
25600 6e 74 65 72 65 64 20 77 68 69 6c 65 20 61 70 70  ntered while app
25610 6c 79 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  lying the change
25620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25630 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f  changeset_apply_
25640 76 32 5f 73 74 72 6d 28 0a 20 20 73 71 6c 69 74  v2_strm(.  sqlit
25650 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
25660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
25670 70 6c 79 20 63 68 61 6e 67 65 20 74 6f 20 22 6d  ply change to "m
25680 61 69 6e 22 20 64 62 20 6f 66 20 74 68 69 73 20  ain" db of this 
25690 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
256a0 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64 20 2a  (*xInput)(void *
256b0 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  pIn, void *pData
256c0 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 2c 20  , int *pnData), 
256d0 2f 2a 20 49 6e 70 75 74 20 66 75 6e 63 74 69 6f  /* Input functio
256e0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 49 6e  n */.  void *pIn
256f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25720 72 73 74 20 61 72 67 20 66 6f 72 20 78 49 6e 70  rst arg for xInp
25730 75 74 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 46 69  ut */.  int(*xFi
25740 6c 74 65 72 29 28 0a 20 20 20 20 76 6f 69 64 20  lter)(.    void 
25750 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
25760 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
25770 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74 6f   of sixth arg to
25780 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20 20   _apply() */.   
25790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
257a0 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b              /
257b0 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
257c0 20 20 29 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6e    ),.  int(*xCon
257d0 66 6c 69 63 74 29 28 0a 20 20 20 20 76 6f 69 64  flict)(.    void
257e0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
257f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
25800 79 20 6f 66 20 73 69 78 74 68 20 61 72 67 20 74  y of sixth arg t
25810 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f 0a 20 20  o _apply() */.  
25820 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 2c    int eConflict,
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53 49 4e 47  /* DATA, MISSING
25850 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43 4f 4e 53  , CONFLICT, CONS
25860 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20 20 73 71  TRAINT */.    sq
25870 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
25880 69 74 65 72 20 2a 70 20 20 20 20 20 2f 2a 20 48  iter *p     /* H
25890 61 6e 64 6c 65 20 64 65 73 63 72 69 62 69 6e 67  andle describing
258a0 20 63 68 61 6e 67 65 20 61 6e 64 20 63 6f 6e 66   change and conf
258b0 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a 20 20 76  lict */.  ),.  v
258c0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
258e0 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
258f0 20 70 61 73 73 65 64 20 74 6f 20 78 43 6f 6e 66   passed to xConf
25900 6c 69 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  lict */.  void *
25910 2a 70 70 52 65 62 61 73 65 2c 20 69 6e 74 20 2a  *ppRebase, int *
25920 70 6e 52 65 62 61 73 65 2c 0a 20 20 69 6e 74 20  pnRebase,.  int 
25930 66 6c 61 67 73 0a 29 7b 0a 20 20 73 71 6c 69 74  flags.){.  sqlit
25940 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
25950 72 20 2a 70 49 74 65 72 3b 20 20 2f 2a 20 49 74  r *pIter;  /* It
25960 65 72 61 74 6f 72 20 74 6f 20 73 6b 69 70 20 74  erator to skip t
25970 68 72 6f 75 67 68 20 63 68 61 6e 67 65 73 65 74  hrough changeset
25980 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 49 6e 76   */  .  int bInv
25990 65 72 73 65 20 3d 20 21 21 28 66 6c 61 67 73 20  erse = !!(flags 
259a0 26 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53  & SQLITE_CHANGES
259b0 45 54 41 50 50 4c 59 5f 49 4e 56 45 52 54 29 3b  ETAPPLY_INVERT);
259c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 73 73  .  int rc = sess
259d0 69 6f 6e 43 68 61 6e 67 65 73 65 74 53 74 61 72  ionChangesetStar
259e0 74 28 26 70 49 74 65 72 2c 20 78 49 6e 70 75 74  t(&pIter, xInput
259f0 2c 20 70 49 6e 2c 20 30 2c 20 30 2c 20 62 49 6e  , pIn, 0, 0, bIn
25a00 76 65 72 73 65 29 3b 0a 20 20 69 66 28 20 72 63  verse);.  if( rc
25a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25a20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
25a30 68 61 6e 67 65 73 65 74 41 70 70 6c 79 28 0a 20  hangesetApply(. 
25a40 20 20 20 20 20 20 20 64 62 2c 20 70 49 74 65 72         db, pIter
25a50 2c 20 78 46 69 6c 74 65 72 2c 20 78 43 6f 6e 66  , xFilter, xConf
25a60 6c 69 63 74 2c 20 70 43 74 78 2c 20 70 70 52 65  lict, pCtx, ppRe
25a70 62 61 73 65 2c 20 70 6e 52 65 62 61 73 65 2c 20  base, pnRebase, 
25a80 66 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 7d  flags.    );.  }
25a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25aa0 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
25ab0 65 73 65 74 5f 61 70 70 6c 79 5f 73 74 72 6d 28  eset_apply_strm(
25ac0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ae0 20 20 20 2f 2a 20 41 70 70 6c 79 20 63 68 61 6e     /* Apply chan
25af0 67 65 20 74 6f 20 22 6d 61 69 6e 22 20 64 62 20  ge to "main" db 
25b00 6f 66 20 74 68 69 73 20 68 61 6e 64 6c 65 20 2a  of this handle *
25b10 2f 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74  /.  int (*xInput
25b20 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69  )(void *pIn, voi
25b30 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70  d *pData, int *p
25b40 6e 44 61 74 61 29 2c 20 2f 2a 20 49 6e 70 75 74  nData), /* Input
25b50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
25b60 6f 69 64 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  oid *pIn,       
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
25ba0 66 6f 72 20 78 49 6e 70 75 74 20 2a 2f 0a 20 20  for xInput */.  
25bb0 69 6e 74 28 2a 78 46 69 6c 74 65 72 29 28 0a 20  int(*xFilter)(. 
25bc0 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20     void *pCtx,  
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78 74   /* Copy of sixt
25bf0 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79 28  h arg to _apply(
25c00 29 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) */.    const c
25c10 68 61 72 20 2a 7a 54 61 62 20 20 20 20 20 20 20  har *zTab       
25c20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
25c30 6e 61 6d 65 20 2a 2f 0a 20 20 29 2c 0a 20 20 69  name */.  ),.  i
25c40 6e 74 28 2a 78 43 6f 6e 66 6c 69 63 74 29 28 0a  nt(*xConflict)(.
25c50 20 20 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20      void *pCtx, 
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 73 69 78    /* Copy of six
25c80 74 68 20 61 72 67 20 74 6f 20 5f 61 70 70 6c 79  th arg to _apply
25c90 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43  () */.    int eC
25ca0 6f 6e 66 6c 69 63 74 2c 20 20 20 20 20 20 20 20  onflict,        
25cb0 20 20 20 20 20 20 20 20 2f 2a 20 44 41 54 41 2c          /* DATA,
25cc0 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e 46 4c 49   MISSING, CONFLI
25cd0 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 2a  CT, CONSTRAINT *
25ce0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68  /.    sqlite3_ch
25cf0 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 20  angeset_iter *p 
25d00 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 64 65      /* Handle de
25d10 73 63 72 69 62 69 6e 67 20 63 68 61 6e 67 65 20  scribing change 
25d20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  and conflict */.
25d30 20 20 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74    ),.  void *pCt
25d40 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
25d50 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25d60 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
25d70 74 6f 20 78 43 6f 6e 66 6c 69 63 74 20 2a 2f 0a  to xConflict */.
25d80 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
25d90 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
25da0 6c 79 5f 76 32 5f 73 74 72 6d 28 0a 20 20 20 20  ly_v2_strm(.    
25db0 20 20 64 62 2c 20 78 49 6e 70 75 74 2c 20 70 49    db, xInput, pI
25dc0 6e 2c 20 78 46 69 6c 74 65 72 2c 20 78 43 6f 6e  n, xFilter, xCon
25dd0 66 6c 69 63 74 2c 20 70 43 74 78 2c 20 30 2c 20  flict, pCtx, 0, 
25de0 30 2c 20 30 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  0, 0.  );.}../*.
25df0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
25e00 65 67 72 6f 75 70 20 68 61 6e 64 6c 65 2e 0a 2a  egroup handle..*
25e10 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  /.struct sqlite3
25e20 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 7b 0a 20  _changegroup {. 
25e30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
25e60 2f 0a 20 20 69 6e 74 20 62 50 61 74 63 68 3b 20  /.  int bPatch; 
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61      /* True to a
25e90 63 63 75 6d 75 6c 61 74 65 20 70 61 74 63 68 73  ccumulate patchs
25ea0 65 74 73 20 2a 2f 0a 20 20 53 65 73 73 69 6f 6e  ets */.  Session
25eb0 54 61 62 6c 65 20 2a 70 4c 69 73 74 3b 20 20 20  Table *pList;   
25ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
25ed0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 63 75   of tables in cu
25ee0 72 72 65 6e 74 20 70 61 74 63 68 20 2a 2f 0a 7d  rrent patch */.}
25ef0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ;../*.** This fu
25f00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
25f10 20 74 6f 20 6d 65 72 67 65 20 74 77 6f 20 63 68   to merge two ch
25f20 61 6e 67 65 73 20 74 6f 20 74 68 65 20 73 61 6d  anges to the sam
25f30 65 20 72 6f 77 20 74 6f 67 65 74 68 65 72 20 61  e row together a
25f40 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
25f50 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
25f60 5f 63 6f 6e 63 61 74 28 29 20 6f 70 65 72 61 74  _concat() operat
25f70 69 6f 6e 2e 20 41 20 6e 65 77 20 63 68 61 6e 67  ion. A new chang
25f80 65 20 6f 62 6a 65 63 74 20 69 73 0a 2a 2a 20 61  e object is.** a
25f90 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 61 20 70  llocated and a p
25fa0 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 73 74 6f  ointer to it sto
25fb0 72 65 64 20 69 6e 20 2a 70 70 4e 65 77 2e 0a 2a  red in *ppNew..*
25fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  /.static int ses
25fd0 73 69 6f 6e 43 68 61 6e 67 65 4d 65 72 67 65 28  sionChangeMerge(
25fe0 0a 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20  .  SessionTable 
25ff0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
26000 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
26010 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62  cture */.  int b
26020 52 65 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  Rebase,         
26030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26040 75 65 20 66 6f 72 20 61 20 72 65 62 61 73 65 20  ue for a rebase 
26050 68 61 73 68 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  hash-table */.  
26060 69 6e 74 20 62 50 61 74 63 68 73 65 74 2c 20 20  int bPatchset,  
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 2f 2a 20 54 72 75 65 20 66 6f 72 20 70 61 74 63  /* True for patc
26090 68 73 65 74 73 20 2a 2f 0a 20 20 53 65 73 73 69  hsets */.  Sessi
260a0 6f 6e 43 68 61 6e 67 65 20 2a 70 45 78 69 73 74  onChange *pExist
260b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ,          /* Ex
260c0 69 73 74 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f  isting change */
260d0 0a 20 20 69 6e 74 20 6f 70 32 2c 20 20 20 20 20  .  int op2,     
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 63 68 61     /* Second cha
26100 6e 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  nge operation */
26110 0a 20 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74  .  int bIndirect
26120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26130 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 65     /* True if se
26140 63 6f 6e 64 20 63 68 61 6e 67 65 20 69 73 20 69  cond change is i
26150 6e 64 69 72 65 63 74 20 2a 2f 0a 20 20 75 38 20  ndirect */.  u8 
26160 2a 61 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *aRec,          
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26180 53 65 63 6f 6e 64 20 63 68 61 6e 67 65 20 72 65  Second change re
26190 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  cord */.  int nR
261a0 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
261b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
261c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
261d0 61 52 65 63 20 2a 2f 0a 20 20 53 65 73 73 69 6f  aRec */.  Sessio
261e0 6e 43 68 61 6e 67 65 20 2a 2a 70 70 4e 65 77 20  nChange **ppNew 
261f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26200 3a 20 4d 65 72 67 65 64 20 63 68 61 6e 67 65 20  : Merged change 
26210 2a 2f 0a 29 7b 0a 20 20 53 65 73 73 69 6f 6e 43  */.){.  SessionC
26220 68 61 6e 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b  hange *pNew = 0;
26230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26240 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
26250 45 78 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65  Exist ){.    pNe
26260 77 20 3d 20 28 53 65 73 73 69 6f 6e 43 68 61 6e  w = (SessionChan
26270 67 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ge *)sqlite3_mal
26280 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 53 65 73  loc64(sizeof(Ses
26290 73 69 6f 6e 43 68 61 6e 67 65 29 20 2b 20 6e 52  sionChange) + nR
262a0 65 63 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e  ec);.    if( !pN
262b0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
262c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
262d0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
262e0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
262f0 66 28 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 29  f(SessionChange)
26300 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
26310 3d 20 6f 70 32 3b 0a 20 20 20 20 70 4e 65 77 2d  = op2;.    pNew-
26320 3e 62 49 6e 64 69 72 65 63 74 20 3d 20 62 49 6e  >bIndirect = bIn
26330 64 69 72 65 63 74 3b 0a 20 20 20 20 70 4e 65 77  direct;.    pNew
26340 2d 3e 61 52 65 63 6f 72 64 20 3d 20 28 75 38 2a  ->aRecord = (u8*
26350 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 69  )&pNew[1];.    i
26360 66 28 20 62 49 6e 64 69 72 65 63 74 3d 3d 30 20  f( bIndirect==0 
26370 7c 7c 20 62 52 65 62 61 73 65 3d 3d 30 20 29 7b  || bRebase==0 ){
26380 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  .      pNew->nRe
26390 63 6f 72 64 20 3d 20 6e 52 65 63 3b 0a 20 20 20  cord = nRec;.   
263a0 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
263b0 61 52 65 63 6f 72 64 2c 20 61 52 65 63 2c 20 6e  aRecord, aRec, n
263c0 52 65 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Rec);.    }else{
263d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
263e0 20 20 20 20 75 38 20 2a 70 49 6e 20 3d 20 61 52      u8 *pIn = aR
263f0 65 63 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 4f  ec;.      u8 *pO
26400 75 74 20 3d 20 70 4e 65 77 2d 3e 61 52 65 63 6f  ut = pNew->aReco
26410 72 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rd;.      for(i=
26420 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
26430 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
26440 6e 74 20 6e 49 6e 20 3d 20 73 65 73 73 69 6f 6e  nt nIn = session
26450 53 65 72 69 61 6c 4c 65 6e 28 70 49 6e 29 3b 0a  SerialLen(pIn);.
26460 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 49 6e          if( *pIn
26470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26480 20 2a 70 4f 75 74 2b 2b 20 3d 20 30 3b 0a 20 20   *pOut++ = 0;.  
26490 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
264a0 70 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 3d 3d 30  pTab->abPK[i]==0
264b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
264c0 4f 75 74 2b 2b 20 3d 20 30 78 46 46 3b 0a 20 20  Out++ = 0xFF;.  
264d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
264e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f         memcpy(pO
264f0 75 74 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b 0a 20  ut, pIn, nIn);. 
26500 20 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d           pOut +=
26510 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a   nIn;.        }.
26520 20 20 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 6e          pIn += n
26530 49 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  In;.      }.    
26540 20 20 70 4e 65 77 2d 3e 6e 52 65 63 6f 72 64 20    pNew->nRecord 
26550 3d 20 70 4f 75 74 20 2d 20 70 4e 65 77 2d 3e 61  = pOut - pNew->a
26560 52 65 63 6f 72 64 3b 0a 20 20 20 20 7d 0a 20 20  Record;.    }.  
26570 7d 65 6c 73 65 20 69 66 28 20 62 52 65 62 61 73  }else if( bRebas
26580 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
26590 69 73 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  ist->op==SQLITE_
265a0 44 45 4c 45 54 45 20 26 26 20 70 45 78 69 73 74  DELETE && pExist
265b0 2d 3e 62 49 6e 64 69 72 65 63 74 20 29 7b 0a 20  ->bIndirect ){. 
265c0 20 20 20 20 20 2a 70 70 4e 65 77 20 3d 20 70 45       *ppNew = pE
265d0 78 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xist;.    }else{
265e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
265f0 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 6e 52 65  nt64 nByte = nRe
26600 63 20 2b 20 70 45 78 69 73 74 2d 3e 6e 52 65 63  c + pExist->nRec
26610 6f 72 64 20 2b 20 73 69 7a 65 6f 66 28 53 65 73  ord + sizeof(Ses
26620 73 69 6f 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  sionChange);.   
26630 20 20 20 70 4e 65 77 20 3d 20 28 53 65 73 73 69     pNew = (Sessi
26640 6f 6e 43 68 61 6e 67 65 2a 29 73 71 6c 69 74 65  onChange*)sqlite
26650 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
26660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
26670 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
26680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
26690 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
266a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
266b0 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
266c0 70 45 78 69 73 74 2d 3e 61 52 65 63 6f 72 64 3b  pExist->aRecord;
266d0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32 20  .        u8 *a2 
266e0 3d 20 61 52 65 63 3b 0a 20 20 20 20 20 20 20 20  = aRec;.        
266f0 75 38 20 2a 70 4f 75 74 3b 0a 0a 20 20 20 20 20  u8 *pOut;..     
26700 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
26710 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
26720 20 20 20 70 4e 65 77 2d 3e 62 49 6e 64 69 72 65     pNew->bIndire
26730 63 74 20 3d 20 62 49 6e 64 69 72 65 63 74 20 7c  ct = bIndirect |
26740 7c 20 70 45 78 69 73 74 2d 3e 62 49 6e 64 69 72  | pExist->bIndir
26750 65 63 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ect;.        pNe
26760 77 2d 3e 6f 70 20 3d 20 6f 70 32 3b 0a 20 20 20  w->op = op2;.   
26770 20 20 20 20 20 70 4f 75 74 20 3d 20 70 4e 65 77       pOut = pNew
26780 2d 3e 61 52 65 63 6f 72 64 20 3d 20 28 75 38 2a  ->aRecord = (u8*
26790 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 20 20  )&pNew[1];..    
267a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
267b0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
267c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
267d0 31 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69 61  1 = sessionSeria
267e0 6c 4c 65 6e 28 61 31 29 3b 0a 20 20 20 20 20 20  lLen(a1);.      
267f0 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 65 73      int n2 = ses
26800 73 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 32  sionSerialLen(a2
26810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26820 20 2a 61 31 3d 3d 30 78 46 46 20 7c 7c 20 28 70   *a1==0xFF || (p
26830 54 61 62 2d 3e 61 62 50 4b 5b 69 5d 3d 3d 30 20  Tab->abPK[i]==0 
26840 26 26 20 62 49 6e 64 69 72 65 63 74 29 20 29 7b  && bIndirect) ){
26850 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f  .            *pO
26860 75 74 2b 2b 20 3d 20 30 78 46 46 3b 0a 20 20 20  ut++ = 0xFF;.   
26870 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
26880 20 2a 61 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *a2==0 ){.     
26890 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f         memcpy(pO
268a0 75 74 2c 20 61 31 2c 20 6e 31 29 3b 0a 20 20 20  ut, a1, n1);.   
268b0 20 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d           pOut +=
268c0 20 6e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   n1;.          }
268d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
268e0 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20 61    memcpy(pOut, a
268f0 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 20 20  2, n2);.        
26900 20 20 20 20 70 4f 75 74 20 2b 3d 20 6e 32 3b 0a      pOut += n2;.
26910 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26920 20 20 20 20 20 20 61 31 20 2b 3d 20 6e 31 3b 0a        a1 += n1;.
26930 20 20 20 20 20 20 20 20 20 20 61 32 20 2b 3d 20            a2 += 
26940 6e 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n2;.        }.  
26950 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 63        pNew->nRec
26960 6f 72 64 20 3d 20 70 4f 75 74 20 2d 20 70 4e 65  ord = pOut - pNe
26970 77 2d 3e 61 52 65 63 6f 72 64 3b 0a 20 20 20 20  w->aRecord;.    
26980 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
26990 33 5f 66 72 65 65 28 70 45 78 69 73 74 29 3b 0a  3_free(pExist);.
269a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
269b0 20 20 20 69 6e 74 20 6f 70 31 20 3d 20 70 45 78     int op1 = pEx
269c0 69 73 74 2d 3e 6f 70 3b 0a 0a 20 20 20 20 2f 2a  ist->op;..    /*
269d0 20 0a 20 20 20 20 2a 2a 20 20 20 6f 70 31 3d 49   .    **   op1=I
269e0 4e 53 45 52 54 2c 20 6f 70 32 3d 49 4e 53 45 52  NSERT, op2=INSER
269f0 54 20 20 20 20 20 20 2d 3e 20 20 20 20 20 20 55  T      ->      U
26a00 6e 73 75 70 70 6f 72 74 65 64 2e 20 44 69 73 63  nsupported. Disc
26a10 61 72 64 20 6f 70 32 2e 0a 20 20 20 20 2a 2a 20  ard op2..    ** 
26a20 20 20 6f 70 31 3d 49 4e 53 45 52 54 2c 20 6f 70    op1=INSERT, op
26a30 32 3d 55 50 44 41 54 45 20 20 20 20 20 20 2d 3e  2=UPDATE      ->
26a40 20 20 20 20 20 20 49 4e 53 45 52 54 2e 0a 20 20        INSERT..  
26a50 20 20 2a 2a 20 20 20 6f 70 31 3d 49 4e 53 45 52    **   op1=INSER
26a60 54 2c 20 6f 70 32 3d 44 45 4c 45 54 45 20 20 20  T, op2=DELETE   
26a70 20 20 20 2d 3e 20 20 20 20 20 20 28 6e 6f 6e 65     ->      (none
26a80 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
26a90 20 20 6f 70 31 3d 55 50 44 41 54 45 2c 20 6f 70    op1=UPDATE, op
26aa0 32 3d 49 4e 53 45 52 54 20 20 20 20 20 20 2d 3e  2=INSERT      ->
26ab0 20 20 20 20 20 20 55 6e 73 75 70 70 6f 72 74 65        Unsupporte
26ac0 64 2e 20 44 69 73 63 61 72 64 20 6f 70 32 2e 0a  d. Discard op2..
26ad0 20 20 20 20 2a 2a 20 20 20 6f 70 31 3d 55 50 44      **   op1=UPD
26ae0 41 54 45 2c 20 6f 70 32 3d 55 50 44 41 54 45 20  ATE, op2=UPDATE 
26af0 20 20 20 20 20 2d 3e 20 20 20 20 20 20 55 50 44       ->      UPD
26b00 41 54 45 2e 0a 20 20 20 20 2a 2a 20 20 20 6f 70  ATE..    **   op
26b10 31 3d 55 50 44 41 54 45 2c 20 6f 70 32 3d 44 45  1=UPDATE, op2=DE
26b20 4c 45 54 45 20 20 20 20 20 20 2d 3e 20 20 20 20  LETE      ->    
26b30 20 20 44 45 4c 45 54 45 2e 0a 20 20 20 20 2a 2a    DELETE..    **
26b40 0a 20 20 20 20 2a 2a 20 20 20 6f 70 31 3d 44 45  .    **   op1=DE
26b50 4c 45 54 45 2c 20 6f 70 32 3d 49 4e 53 45 52 54  LETE, op2=INSERT
26b60 20 20 20 20 20 20 2d 3e 20 20 20 20 20 20 55 50        ->      UP
26b70 44 41 54 45 2e 0a 20 20 20 20 2a 2a 20 20 20 6f  DATE..    **   o
26b80 70 31 3d 44 45 4c 45 54 45 2c 20 6f 70 32 3d 55  p1=DELETE, op2=U
26b90 50 44 41 54 45 20 20 20 20 20 20 2d 3e 20 20 20  PDATE      ->   
26ba0 20 20 20 55 6e 73 75 70 70 6f 72 74 65 64 2e 20     Unsupported. 
26bb0 44 69 73 63 61 72 64 20 6f 70 32 2e 0a 20 20 20  Discard op2..   
26bc0 20 2a 2a 20 20 20 6f 70 31 3d 44 45 4c 45 54 45   **   op1=DELETE
26bd0 2c 20 6f 70 32 3d 44 45 4c 45 54 45 20 20 20 20  , op2=DELETE    
26be0 20 20 2d 3e 20 20 20 20 20 20 55 6e 73 75 70 70    ->      Unsupp
26bf0 6f 72 74 65 64 2e 20 44 69 73 63 61 72 64 20 6f  orted. Discard o
26c00 70 32 2e 0a 20 20 20 20 2a 2f 20 20 20 0a 20 20  p2..    */   .  
26c10 20 20 69 66 28 20 28 6f 70 31 3d 3d 53 51 4c 49    if( (op1==SQLI
26c20 54 45 5f 49 4e 53 45 52 54 20 26 26 20 6f 70 32  TE_INSERT && op2
26c30 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
26c40 0a 20 20 20 20 20 7c 7c 20 28 6f 70 31 3d 3d 53  .     || (op1==S
26c50 51 4c 49 54 45 5f 55 50 44 41 54 45 20 26 26 20  QLITE_UPDATE && 
26c60 6f 70 32 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45  op2==SQLITE_INSE
26c70 52 54 29 0a 20 20 20 20 20 7c 7c 20 28 6f 70 31  RT).     || (op1
26c80 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
26c90 26 26 20 6f 70 32 3d 3d 53 51 4c 49 54 45 5f 55  && op2==SQLITE_U
26ca0 50 44 41 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  PDATE).     || (
26cb0 6f 70 31 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45  op1==SQLITE_DELE
26cc0 54 45 20 26 26 20 6f 70 32 3d 3d 53 51 4c 49 54  TE && op2==SQLIT
26cd0 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 29 7b  E_DELETE).    ){
26ce0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
26cf0 78 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  xist;.    }else 
26d00 69 66 28 20 6f 70 31 3d 3d 53 51 4c 49 54 45 5f  if( op1==SQLITE_
26d10 49 4e 53 45 52 54 20 26 26 20 6f 70 32 3d 3d 53  INSERT && op2==S
26d20 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a  QLITE_DELETE ){.
26d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26d40 65 65 28 70 45 78 69 73 74 29 3b 0a 20 20 20 20  ee(pExist);.    
26d50 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d    assert( pNew==
26d60 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
26d70 20 20 20 20 20 20 75 38 20 2a 61 45 78 69 73 74        u8 *aExist
26d80 20 3d 20 70 45 78 69 73 74 2d 3e 61 52 65 63 6f   = pExist->aReco
26d90 72 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rd;.      sqlite
26da0 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 0a 20  3_int64 nByte;. 
26db0 20 20 20 20 20 75 38 20 2a 61 43 73 72 3b 0a 0a       u8 *aCsr;..
26dc0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
26dd0 65 20 61 20 6e 65 77 20 53 65 73 73 69 6f 6e 43  e a new SessionC
26de0 68 61 6e 67 65 20 6f 62 6a 65 63 74 2e 20 45 6e  hange object. En
26df0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 61 52  sure that the aR
26e00 65 63 6f 72 64 5b 5d 0a 20 20 20 20 20 20 2a 2a  ecord[].      **
26e10 20 62 75 66 66 65 72 20 6f 66 20 74 68 65 20 6e   buffer of the n
26e20 65 77 20 6f 62 6a 65 63 74 20 69 73 20 6c 61 72  ew object is lar
26e30 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
26e40 64 20 61 6e 79 20 72 65 63 6f 72 64 20 74 68 61  d any record tha
26e50 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 62  t.      ** may b
26e60 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 63  e generated by c
26e70 6f 6d 62 69 6e 69 6e 67 20 74 68 65 20 69 6e 70  ombining the inp
26e80 75 74 20 72 65 63 6f 72 64 73 2e 20 20 2a 2f 0a  ut records.  */.
26e90 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69        nByte = si
26ea0 7a 65 6f 66 28 53 65 73 73 69 6f 6e 43 68 61 6e  zeof(SessionChan
26eb0 67 65 29 20 2b 20 70 45 78 69 73 74 2d 3e 6e 52  ge) + pExist->nR
26ec0 65 63 6f 72 64 20 2b 20 6e 52 65 63 3b 0a 20 20  ecord + nRec;.  
26ed0 20 20 20 20 70 4e 65 77 20 3d 20 28 53 65 73 73      pNew = (Sess
26ee0 69 6f 6e 43 68 61 6e 67 65 20 2a 29 73 71 6c 69  ionChange *)sqli
26ef0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
26f00 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  te);.      if( !
26f10 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
26f20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 45 78  sqlite3_free(pEx
26f30 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ist);.        re
26f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26f50 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
26f60 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
26f70 20 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 43   sizeof(SessionC
26f80 68 61 6e 67 65 29 29 3b 0a 20 20 20 20 20 20 70  hange));.      p
26f90 4e 65 77 2d 3e 62 49 6e 64 69 72 65 63 74 20 3d  New->bIndirect =
26fa0 20 28 62 49 6e 64 69 72 65 63 74 20 26 26 20 70   (bIndirect && p
26fb0 45 78 69 73 74 2d 3e 62 49 6e 64 69 72 65 63 74  Exist->bIndirect
26fc0 29 3b 0a 20 20 20 20 20 20 61 43 73 72 20 3d 20  );.      aCsr = 
26fd0 70 4e 65 77 2d 3e 61 52 65 63 6f 72 64 20 3d 20  pNew->aRecord = 
26fe0 28 75 38 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  (u8 *)&pNew[1];.
26ff0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 31 3d 3d  .      if( op1==
27000 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 7b  SQLITE_INSERT ){
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27020 49 4e 53 45 52 54 20 2b 20 55 50 44 41 54 45 20  INSERT + UPDATE 
27030 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  */.        u8 *a
27040 31 20 3d 20 61 52 65 63 3b 0a 20 20 20 20 20 20  1 = aRec;.      
27050 20 20 61 73 73 65 72 74 28 20 6f 70 32 3d 3d 53    assert( op2==S
27060 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 3b 0a  QLITE_UPDATE );.
27070 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6f 70          pNew->op
27080 20 3d 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   = SQLITE_INSERT
27090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 50  ;.        if( bP
270a0 61 74 63 68 73 65 74 3d 3d 30 20 29 20 73 65 73  atchset==0 ) ses
270b0 73 69 6f 6e 53 6b 69 70 52 65 63 6f 72 64 28 26  sionSkipRecord(&
270c0 61 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b  a1, pTab->nCol);
270d0 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e  .        session
270e0 4d 65 72 67 65 52 65 63 6f 72 64 28 26 61 43 73  MergeRecord(&aCs
270f0 72 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 61  r, pTab->nCol, a
27100 45 78 69 73 74 2c 20 61 31 29 3b 0a 20 20 20 20  Exist, a1);.    
27110 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 31 3d    }else if( op1=
27120 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
27130 7b 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54  {       /* DELET
27140 45 20 2b 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20  E + INSERT */.  
27150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
27160 32 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  2==SQLITE_INSERT
27170 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
27180 2d 3e 6f 70 20 3d 20 53 51 4c 49 54 45 5f 55 50  ->op = SQLITE_UP
27190 44 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 66  DATE;.        if
271a0 28 20 62 50 61 74 63 68 73 65 74 20 29 7b 0a 20  ( bPatchset ){. 
271b0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
271c0 61 43 73 72 2c 20 61 52 65 63 2c 20 6e 52 65 63  aCsr, aRec, nRec
271d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 43 73  );.          aCs
271e0 72 20 2b 3d 20 6e 52 65 63 3b 0a 20 20 20 20 20  r += nRec;.     
271f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27200 20 20 20 20 69 66 28 20 30 3d 3d 73 65 73 73 69      if( 0==sessi
27210 6f 6e 4d 65 72 67 65 55 70 64 61 74 65 28 26 61  onMergeUpdate(&a
27220 43 73 72 2c 20 70 54 61 62 2c 20 62 50 61 74 63  Csr, pTab, bPatc
27230 68 73 65 74 2c 20 61 45 78 69 73 74 2c 20 30 2c  hset, aExist, 0,
27240 61 52 65 63 2c 30 29 20 29 7b 0a 20 20 20 20 20  aRec,0) ){.     
27250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27260 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
27270 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
27280 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
272a0 73 65 20 69 66 28 20 6f 70 32 3d 3d 53 51 4c 49  se if( op2==SQLI
272b0 54 45 5f 55 50 44 41 54 45 20 29 7b 20 20 20 20  TE_UPDATE ){    
272c0 20 20 20 2f 2a 20 55 50 44 41 54 45 20 2b 20 55     /* UPDATE + U
272d0 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20  PDATE */.       
272e0 20 75 38 20 2a 61 31 20 3d 20 61 45 78 69 73 74   u8 *a1 = aExist
272f0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32  ;.        u8 *a2
27300 20 3d 20 61 52 65 63 3b 0a 20 20 20 20 20 20 20   = aRec;.       
27310 20 61 73 73 65 72 74 28 20 6f 70 31 3d 3d 53 51   assert( op1==SQ
27320 4c 49 54 45 5f 55 50 44 41 54 45 20 29 3b 0a 20  LITE_UPDATE );. 
27330 20 20 20 20 20 20 20 69 66 28 20 62 50 61 74 63         if( bPatc
27340 68 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hset==0 ){.     
27350 20 20 20 20 20 73 65 73 73 69 6f 6e 53 6b 69 70       sessionSkip
27360 52 65 63 6f 72 64 28 26 61 31 2c 20 70 54 61 62  Record(&a1, pTab
27370 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ->nCol);.       
27380 20 20 20 73 65 73 73 69 6f 6e 53 6b 69 70 52 65     sessionSkipRe
27390 63 6f 72 64 28 26 61 32 2c 20 70 54 61 62 2d 3e  cord(&a2, pTab->
273a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  nCol);.        }
273b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6f  .        pNew->o
273c0 70 20 3d 20 53 51 4c 49 54 45 5f 55 50 44 41 54  p = SQLITE_UPDAT
273d0 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  E;.        if( 0
273e0 3d 3d 73 65 73 73 69 6f 6e 4d 65 72 67 65 55 70  ==sessionMergeUp
273f0 64 61 74 65 28 26 61 43 73 72 2c 20 70 54 61 62  date(&aCsr, pTab
27400 2c 20 62 50 61 74 63 68 73 65 74 2c 20 61 52 65  , bPatchset, aRe
27410 63 2c 20 61 45 78 69 73 74 2c 61 31 2c 61 32 29  c, aExist,a1,a2)
27420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
27430 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
27440 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
27450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
27460 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20        }else{    
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
27490 50 44 41 54 45 20 2b 20 44 45 4c 45 54 45 20 2a  PDATE + DELETE *
274a0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
274b0 28 20 6f 70 31 3d 3d 53 51 4c 49 54 45 5f 55 50  ( op1==SQLITE_UP
274c0 44 41 54 45 20 26 26 20 6f 70 32 3d 3d 53 51 4c  DATE && op2==SQL
274d0 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 20 20  ITE_DELETE );.  
274e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d        pNew->op =
274f0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 3b 0a   SQLITE_DELETE;.
27500 20 20 20 20 20 20 20 20 69 66 28 20 62 50 61 74          if( bPat
27510 63 68 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  chset ){.       
27520 20 20 20 6d 65 6d 63 70 79 28 61 43 73 72 2c 20     memcpy(aCsr, 
27530 61 52 65 63 2c 20 6e 52 65 63 29 3b 0a 20 20 20  aRec, nRec);.   
27540 20 20 20 20 20 20 20 61 43 73 72 20 2b 3d 20 6e         aCsr += n
27550 52 65 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Rec;.        }el
27560 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  se{.          se
27570 73 73 69 6f 6e 4d 65 72 67 65 52 65 63 6f 72 64  ssionMergeRecord
27580 28 26 61 43 73 72 2c 20 70 54 61 62 2d 3e 6e 43  (&aCsr, pTab->nC
27590 6f 6c 2c 20 61 52 65 63 2c 20 61 45 78 69 73 74  ol, aRec, aExist
275a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
275b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
275c0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
275d0 70 4e 65 77 2d 3e 6e 52 65 63 6f 72 64 20 3d 20  pNew->nRecord = 
275e0 28 69 6e 74 29 28 61 43 73 72 20 2d 20 70 4e 65  (int)(aCsr - pNe
275f0 77 2d 3e 61 52 65 63 6f 72 64 29 3b 0a 20 20 20  w->aRecord);.   
27600 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
27610 65 33 5f 66 72 65 65 28 70 45 78 69 73 74 29 3b  e3_free(pExist);
27620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
27630 70 4e 65 77 20 3d 20 70 4e 65 77 3b 0a 20 20 72  pNew = pNew;.  r
27640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27650 2a 2a 20 41 64 64 20 61 6c 6c 20 63 68 61 6e 67  ** Add all chang
27660 65 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  es in the change
27670 73 65 74 20 74 72 61 76 65 72 73 65 64 20 62 79  set traversed by
27680 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
27690 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
276a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
276b0 20 74 68 65 20 63 68 61 6e 67 65 67 72 6f 75 70   the changegroup
276c0 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f   hash tables..*/
276d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
276e0 69 6f 6e 43 68 61 6e 67 65 73 65 74 54 6f 48 61  ionChangesetToHa
276f0 73 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  sh(.  sqlite3_ch
27700 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49  angeset_iter *pI
27710 74 65 72 2c 20 20 20 2f 2a 20 49 74 65 72 61 74  ter,   /* Iterat
27720 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  or to read from 
27730 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  */.  sqlite3_cha
27740 6e 67 65 67 72 6f 75 70 20 2a 70 47 72 70 2c 20  ngegroup *pGrp, 
27750 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 67        /* Changeg
27760 72 6f 75 70 20 6f 62 6a 65 63 74 20 74 6f 20 61  roup object to a
27770 64 64 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20  dd changeset to 
27780 2a 2f 0a 20 20 69 6e 74 20 62 52 65 62 61 73 65  */.  int bRebase
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
277b0 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 66   hash table is f
277c0 6f 72 20 72 65 62 61 73 69 6e 67 20 2a 2f 0a 29  or rebasing */.)
277d0 7b 0a 20 20 75 38 20 2a 61 52 65 63 3b 0a 20 20  {.  u8 *aRec;.  
277e0 69 6e 74 20 6e 52 65 63 3b 0a 20 20 69 6e 74 20  int nRec;.  int 
277f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27800 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
27810 70 54 61 62 20 3d 20 30 3b 0a 0a 20 20 77 68 69  pTab = 0;..  whi
27820 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
27830 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
27840 4e 65 78 74 28 70 49 74 65 72 2c 20 26 61 52 65  Next(pIter, &aRe
27850 63 2c 20 26 6e 52 65 63 2c 20 30 29 20 29 7b 0a  c, &nRec, 0) ){.
27860 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27870 7a 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 43  zNew;.    int nC
27880 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a  ol;.    int op;.
27890 20 20 20 20 69 6e 74 20 69 48 61 73 68 3b 0a 20      int iHash;. 
278a0 20 20 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74     int bIndirect
278b0 3b 0a 20 20 20 20 53 65 73 73 69 6f 6e 43 68 61  ;.    SessionCha
278c0 6e 67 65 20 2a 70 43 68 61 6e 67 65 3b 0a 20 20  nge *pChange;.  
278d0 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20    SessionChange 
278e0 2a 70 45 78 69 73 74 20 3d 20 30 3b 0a 20 20 20  *pExist = 0;.   
278f0 20 53 65 73 73 69 6f 6e 43 68 61 6e 67 65 20 2a   SessionChange *
27900 2a 70 70 3b 0a 0a 20 20 20 20 69 66 28 20 70 47  *pp;..    if( pG
27910 72 70 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  rp->pList==0 ){.
27920 20 20 20 20 20 20 70 47 72 70 2d 3e 62 50 61 74        pGrp->bPat
27930 63 68 20 3d 20 70 49 74 65 72 2d 3e 62 50 61 74  ch = pIter->bPat
27940 63 68 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  chset;.    }else
27950 20 69 66 28 20 70 49 74 65 72 2d 3e 62 50 61 74   if( pIter->bPat
27960 63 68 73 65 74 21 3d 70 47 72 70 2d 3e 62 50 61  chset!=pGrp->bPa
27970 74 63 68 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tch ){.      rc 
27980 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
27990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
279a0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 63   }..    sqlite3c
279b0 68 61 6e 67 65 73 65 74 5f 6f 70 28 70 49 74 65  hangeset_op(pIte
279c0 72 2c 20 26 7a 4e 65 77 2c 20 26 6e 43 6f 6c 2c  r, &zNew, &nCol,
279d0 20 26 6f 70 2c 20 26 62 49 6e 64 69 72 65 63 74   &op, &bIndirect
279e0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
279f0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
27a00 63 6d 70 28 7a 4e 65 77 2c 20 70 54 61 62 2d 3e  cmp(zNew, pTab->
27a10 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
27a20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69  /* Search the li
27a30 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e  st for a matchin
27a40 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  g table */.     
27a50 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 69 6e 74   int nNew = (int
27a60 29 73 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  )strlen(zNew);. 
27a70 20 20 20 20 20 75 38 20 2a 61 62 50 4b 3b 0a 0a       u8 *abPK;..
27a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 63 68 61        sqlite3cha
27a90 6e 67 65 73 65 74 5f 70 6b 28 70 49 74 65 72 2c  ngeset_pk(pIter,
27aa0 20 26 61 62 50 4b 2c 20 30 29 3b 0a 20 20 20 20   &abPK, 0);.    
27ab0 20 20 66 6f 72 28 70 54 61 62 20 3d 20 70 47 72    for(pTab = pGr
27ac0 70 2d 3e 70 4c 69 73 74 3b 20 70 54 61 62 3b 20  p->pList; pTab; 
27ad0 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e 65 78 74  pTab=pTab->pNext
27ae0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  ){.        if( 0
27af0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
27b00 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
27b10 7a 4e 65 77 2c 20 6e 4e 65 77 2b 31 29 20 29 20  zNew, nNew+1) ) 
27b20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27b30 20 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29       if( !pTab )
27b40 7b 0a 20 20 20 20 20 20 20 20 53 65 73 73 69 6f  {.        Sessio
27b50 6e 54 61 62 6c 65 20 2a 2a 70 70 54 61 62 3b 0a  nTable **ppTab;.
27b60 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
27b70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
27b80 28 73 69 7a 65 6f 66 28 53 65 73 73 69 6f 6e 54  (sizeof(SessionT
27b90 61 62 6c 65 29 20 2b 20 6e 43 6f 6c 20 2b 20 6e  able) + nCol + n
27ba0 4e 65 77 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  New+1);.        
27bb0 69 66 28 20 21 70 54 61 62 20 29 7b 0a 20 20 20  if( !pTab ){.   
27bc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27bd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
27be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
27c00 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73 69 7a  set(pTab, 0, siz
27c10 65 6f 66 28 53 65 73 73 69 6f 6e 54 61 62 6c 65  eof(SessionTable
27c20 29 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ));.        pTab
27c30 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
27c40 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 62 50         pTab->abP
27c50 4b 20 3d 20 28 75 38 2a 29 26 70 54 61 62 5b 31  K = (u8*)&pTab[1
27c60 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
27c70 79 28 70 54 61 62 2d 3e 61 62 50 4b 2c 20 61 62  y(pTab->abPK, ab
27c80 50 4b 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  PK, nCol);.     
27c90 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
27ca0 20 28 63 68 61 72 2a 29 26 70 54 61 62 2d 3e 61   (char*)&pTab->a
27cb0 62 50 4b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20  bPK[nCol];.     
27cc0 20 20 20 6d 65 6d 63 70 79 28 70 54 61 62 2d 3e     memcpy(pTab->
27cd0 7a 4e 61 6d 65 2c 20 7a 4e 65 77 2c 20 6e 4e 65  zName, zNew, nNe
27ce0 77 2b 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  w+1);..        /
27cf0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
27d00 20 6d 75 73 74 20 62 65 20 6c 69 6e 6b 65 64 20   must be linked 
27d10 6f 6e 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  on to the end of
27d20 20 74 68 65 20 6c 69 73 74 2c 20 6e 6f 74 0a 20   the list, not. 
27d30 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 79         ** simply
27d40 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 74   added to the st
27d50 61 72 74 20 6f 66 20 69 74 2e 20 54 68 69 73 20  art of it. This 
27d60 69 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  is to ensure tha
27d70 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
27d80 20 74 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74   tables within t
27d90 68 65 20 6f 75 74 70 75 74 20 6f 66 20 73 71 6c  he output of sql
27da0 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f  ite3changegroup_
27db0 6f 75 74 70 75 74 28 29 20 61 72 65 20 69 6e 20  output() are in 
27dc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27dd0 72 69 67 68 74 20 6f 72 64 65 72 2e 20 20 2a 2f  right order.  */
27de0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 70 54  .        for(ppT
27df0 61 62 3d 26 70 47 72 70 2d 3e 70 4c 69 73 74 3b  ab=&pGrp->pList;
27e00 20 2a 70 70 54 61 62 3b 20 70 70 54 61 62 3d 26   *ppTab; ppTab=&
27e10 28 2a 70 70 54 61 62 29 2d 3e 70 4e 65 78 74 29  (*ppTab)->pNext)
27e20 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 54 61 62  ;.        *ppTab
27e30 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 7d   = pTab;.      }
27e40 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 6e  else if( pTab->n
27e50 43 6f 6c 21 3d 6e 43 6f 6c 20 7c 7c 20 6d 65 6d  Col!=nCol || mem
27e60 63 6d 70 28 70 54 61 62 2d 3e 61 62 50 4b 2c 20  cmp(pTab->abPK, 
27e70 61 62 50 4b 2c 20 6e 43 6f 6c 29 20 29 7b 0a 20  abPK, nCol) ){. 
27e80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27e90 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 20 20 20  TE_SCHEMA;.     
27ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27eb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
27ec0 20 73 65 73 73 69 6f 6e 47 72 6f 77 48 61 73 68   sessionGrowHash
27ed0 28 70 49 74 65 72 2d 3e 62 50 61 74 63 68 73 65  (pIter->bPatchse
27ee0 74 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  t, pTab) ){.    
27ef0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27f00 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  MEM;.      break
27f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 61 73  ;.    }.    iHas
27f20 68 20 3d 20 73 65 73 73 69 6f 6e 43 68 61 6e 67  h = sessionChang
27f30 65 48 61 73 68 28 0a 20 20 20 20 20 20 20 20 70  eHash(.        p
27f40 54 61 62 2c 20 28 70 49 74 65 72 2d 3e 62 50 61  Tab, (pIter->bPa
27f50 74 63 68 73 65 74 20 26 26 20 6f 70 3d 3d 53 51  tchset && op==SQ
27f60 4c 49 54 45 5f 44 45 4c 45 54 45 29 2c 20 61 52  LITE_DELETE), aR
27f70 65 63 2c 20 70 54 61 62 2d 3e 6e 43 68 61 6e 67  ec, pTab->nChang
27f80 65 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a  e.    );..    /*
27f90 20 53 65 61 72 63 68 20 66 6f 72 20 65 78 69 73   Search for exis
27fa0 74 69 6e 67 20 65 6e 74 72 79 2e 20 49 66 20 66  ting entry. If f
27fb0 6f 75 6e 64 2c 20 72 65 6d 6f 76 65 20 69 74 20  ound, remove it 
27fc0 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
27fd0 62 6c 65 2e 20 0a 20 20 20 20 2a 2a 20 43 6f 64  ble. .    ** Cod
27fe0 65 20 62 65 6c 6f 77 20 6d 61 79 20 6c 69 6e 6b  e below may link
27ff0 20 69 74 20 62 61 63 6b 20 69 6e 2e 0a 20 20 20   it back in..   
28000 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 70 3d 26   */.    for(pp=&
28010 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65 5b 69  pTab->apChange[i
28020 48 61 73 68 5d 3b 20 2a 70 70 3b 20 70 70 3d 26  Hash]; *pp; pp=&
28030 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 0a 20  (*pp)->pNext){. 
28040 20 20 20 20 20 69 6e 74 20 62 50 6b 4f 6e 6c 79       int bPkOnly
28050 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  1 = 0;.      int
28060 20 62 50 6b 4f 6e 6c 79 32 20 3d 20 30 3b 0a 20   bPkOnly2 = 0;. 
28070 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
28080 62 50 61 74 63 68 73 65 74 20 29 7b 0a 20 20 20  bPatchset ){.   
28090 20 20 20 20 20 62 50 6b 4f 6e 6c 79 31 20 3d 20       bPkOnly1 = 
280a0 28 2a 70 70 29 2d 3e 6f 70 3d 3d 53 51 4c 49 54  (*pp)->op==SQLIT
280b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
280c0 20 20 62 50 6b 4f 6e 6c 79 32 20 3d 20 6f 70 3d    bPkOnly2 = op=
280d0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 3b 0a  =SQLITE_DELETE;.
280e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
280f0 28 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 45  ( sessionChangeE
28100 71 75 61 6c 28 70 54 61 62 2c 20 62 50 6b 4f 6e  qual(pTab, bPkOn
28110 6c 79 31 2c 20 28 2a 70 70 29 2d 3e 61 52 65 63  ly1, (*pp)->aRec
28120 6f 72 64 2c 20 62 50 6b 4f 6e 6c 79 32 2c 20 61  ord, bPkOnly2, a
28130 52 65 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rec) ){.        
28140 70 45 78 69 73 74 20 3d 20 2a 70 70 3b 0a 20 20  pExist = *pp;.  
28150 20 20 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70        *pp = (*pp
28160 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  )->pNext;.      
28170 20 20 70 54 61 62 2d 3e 6e 45 6e 74 72 79 2d 2d    pTab->nEntry--
28180 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
281a0 20 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e      rc = session
281b0 43 68 61 6e 67 65 4d 65 72 67 65 28 70 54 61 62  ChangeMerge(pTab
281c0 2c 20 62 52 65 62 61 73 65 2c 20 0a 20 20 20 20  , bRebase, .    
281d0 20 20 20 20 70 49 74 65 72 2d 3e 62 50 61 74 63      pIter->bPatc
281e0 68 73 65 74 2c 20 70 45 78 69 73 74 2c 20 6f 70  hset, pExist, op
281f0 2c 20 62 49 6e 64 69 72 65 63 74 2c 20 61 52 65  , bIndirect, aRe
28200 63 2c 20 6e 52 65 63 2c 20 26 70 43 68 61 6e 67  c, nRec, &pChang
28210 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
28220 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
28230 20 69 66 28 20 70 43 68 61 6e 67 65 20 29 7b 0a   if( pChange ){.
28240 20 20 20 20 20 20 70 43 68 61 6e 67 65 2d 3e 70        pChange->p
28250 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 61 70 43  Next = pTab->apC
28260 68 61 6e 67 65 5b 69 48 61 73 68 5d 3b 0a 20 20  hange[iHash];.  
28270 20 20 20 20 70 54 61 62 2d 3e 61 70 43 68 61 6e      pTab->apChan
28280 67 65 5b 69 48 61 73 68 5d 20 3d 20 70 43 68 61  ge[iHash] = pCha
28290 6e 67 65 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  nge;.      pTab-
282a0 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 7d  >nEntry++;.    }
282b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
282c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
282d0 20 70 49 74 65 72 2d 3e 72 63 3b 0a 20 20 72 65   pIter->rc;.  re
282e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
282f0 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 20 63 68  * Serialize a ch
28300 61 6e 67 65 73 65 74 20 28 6f 72 20 70 61 74 63  angeset (or patc
28310 68 73 65 74 29 20 62 61 73 65 64 20 6f 6e 20 61  hset) based on a
28320 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 20 28 6f  ll changesets (o
28330 72 20 70 61 74 63 68 73 65 74 73 29 0a 2a 2a 20  r patchsets).** 
28340 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 61  added to the cha
28350 6e 67 65 67 72 6f 75 70 20 6f 62 6a 65 63 74 20  ngegroup object 
28360 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
28370 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
28380 0a 2a 2a 20 49 66 20 78 4f 75 74 70 75 74 20 69  .** If xOutput i
28390 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
283a0 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2f 70   the changeset/p
283b0 61 74 63 68 73 65 74 20 69 73 20 72 65 74 75 72  atchset is retur
283c0 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 75 73  ned to the.** us
283d0 65 72 20 76 69 61 20 6f 6e 65 20 6f 72 20 6d 6f  er via one or mo
283e0 72 65 20 63 61 6c 6c 73 20 74 6f 20 78 4f 75 74  re calls to xOut
283f0 70 75 74 2c 20 61 73 20 77 69 74 68 20 74 68 65  put, as with the
28400 20 6f 74 68 65 72 20 73 74 72 65 61 6d 69 6e 67   other streaming
28410 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 2e 20  .** interfaces. 
28420 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 78 4f  .**.** Or, if xO
28430 75 74 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  utput is NULL, t
28440 68 65 6e 20 28 2a 70 70 4f 75 74 29 20 69 73 20  hen (*ppOut) is 
28450 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
28460 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
28470 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
28480 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 63 68  ng the output ch
28490 61 6e 67 65 73 65 74 20 62 65 66 6f 72 65 20 74  angeset before t
284a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
284b0 75 72 6e 73 2e 20 49 6e 0a 2a 2a 20 74 68 69 73  urns. In.** this
284c0 20 63 61 73 65 20 28 2a 70 6e 4f 75 74 29 20 69   case (*pnOut) i
284d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
284e0 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
284f0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e  buffer in bytes.
28500 20 49 74 0a 2a 2a 20 69 73 20 74 68 65 20 72 65   It.** is the re
28510 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
28520 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
28530 65 65 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  ee the output bu
28540 66 66 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ffer using.** sq
28550 6c 69 74 65 33 5f 66 72 65 65 28 29 20 77 68 65  lite3_free() whe
28560 6e 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  n it is no longe
28570 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  r required..**.*
28580 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
28590 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
285a0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61  turned. Or, if a
285b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
285c0 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
285d0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
285e0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
285f0 78 4f 75 74 70 75 74 20 69 73 20 4e 55 4c 4c 2c  xOutput is NULL,
28600 20 28 2a 70 70 4f 75 74 29 20 61 6e 64 20 28 2a   (*ppOut) and (*
28610 70 6e 4f 75 74 29 0a 2a 2a 20 61 72 65 20 62 6f  pnOut).** are bo
28620 74 68 20 73 65 74 20 74 6f 20 30 20 62 65 66 6f  th set to 0 befo
28630 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
28640 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
28650 69 6f 6e 43 68 61 6e 67 65 67 72 6f 75 70 4f 75  ionChangegroupOu
28660 74 70 75 74 28 0a 20 20 73 71 6c 69 74 65 33 5f  tput(.  sqlite3_
28670 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 70 47 72  changegroup *pGr
28680 70 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70  p,.  int (*xOutp
28690 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20  ut)(void *pOut, 
286a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
286b0 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20  a, int nData),. 
286c0 20 76 6f 69 64 20 2a 70 4f 75 74 2c 0a 20 20 69   void *pOut,.  i
286d0 6e 74 20 2a 70 6e 4f 75 74 2c 0a 20 20 76 6f 69  nt *pnOut,.  voi
286e0 64 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20 69  d **ppOut.){.  i
286f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28700 4b 3b 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66  K;.  SessionBuff
28710 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
28720 30 7d 3b 0a 20 20 53 65 73 73 69 6f 6e 54 61 62  0};.  SessionTab
28730 6c 65 20 2a 70 54 61 62 3b 0a 20 20 61 73 73 65  le *pTab;.  asse
28740 72 74 28 20 78 4f 75 74 70 75 74 3d 3d 30 20 7c  rt( xOutput==0 |
28750 7c 20 28 70 70 4f 75 74 3d 3d 30 20 26 26 20 70  | (ppOut==0 && p
28760 6e 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  nOut==0) );..  /
28770 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 65 72  * Create the ser
28780 69 61 6c 69 7a 65 64 20 6f 75 74 70 75 74 20 63  ialized output c
28790 68 61 6e 67 65 73 65 74 20 62 61 73 65 64 20 6f  hangeset based o
287a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
287b0 66 20 74 68 65 0a 20 20 2a 2a 20 68 61 73 68 20  f the.  ** hash 
287c0 74 61 62 6c 65 73 20 61 74 74 61 63 68 65 64 20  tables attached 
287d0 74 6f 20 74 68 65 20 53 65 73 73 69 6f 6e 54 61  to the SessionTa
287e0 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 6c  ble objects in l
287f0 69 73 74 20 70 2d 3e 70 4c 69 73 74 2e 20 0a 20  ist p->pList. . 
28800 20 2a 2f 0a 20 20 66 6f 72 28 70 54 61 62 3d 70   */.  for(pTab=p
28810 47 72 70 2d 3e 70 4c 69 73 74 3b 20 72 63 3d 3d  Grp->pList; rc==
28820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 61  SQLITE_OK && pTa
28830 62 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e  b; pTab=pTab->pN
28840 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 65 43  ext){.    int eC
28850 68 61 6e 67 65 73 65 74 20 3d 20 70 47 72 70 2d  hangeset = pGrp-
28860 3e 62 50 61 74 63 68 20 3f 20 53 45 53 53 49 4f  >bPatch ? SESSIO
28870 4e 53 5f 50 41 54 43 48 53 45 54 20 3a 20 53 45  NS_PATCHSET : SE
28880 53 53 49 4f 4e 53 5f 43 48 41 4e 47 45 53 45 54  SSIONS_CHANGESET
28890 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
288a0 20 69 66 28 20 70 54 61 62 2d 3e 6e 45 6e 74 72   if( pTab->nEntr
288b0 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  y==0 ) continue;
288c0 0a 0a 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70  ..    sessionApp
288d0 65 6e 64 54 61 62 6c 65 48 64 72 28 26 62 75 66  endTableHdr(&buf
288e0 2c 20 65 43 68 61 6e 67 65 73 65 74 2c 20 70 54  , eChangeset, pT
288f0 61 62 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 6f  ab, &rc);.    fo
28900 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
28910 43 68 61 6e 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  Change; i++){.  
28920 20 20 20 20 53 65 73 73 69 6f 6e 43 68 61 6e 67      SessionChang
28930 65 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  e *p;.      for(
28940 70 3d 70 54 61 62 2d 3e 61 70 43 68 61 6e 67 65  p=pTab->apChange
28950 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  [i]; p; p=p->pNe
28960 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73  xt){.        ses
28970 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26  sionAppendByte(&
28980 62 75 66 2c 20 70 2d 3e 6f 70 2c 20 26 72 63 29  buf, p->op, &rc)
28990 3b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  ;.        sessio
289a0 6e 41 70 70 65 6e 64 42 79 74 65 28 26 62 75 66  nAppendByte(&buf
289b0 2c 20 70 2d 3e 62 49 6e 64 69 72 65 63 74 2c 20  , p->bIndirect, 
289c0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 73 65  &rc);.        se
289d0 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
289e0 26 62 75 66 2c 20 70 2d 3e 61 52 65 63 6f 72 64  &buf, p->aRecord
289f0 2c 20 70 2d 3e 6e 52 65 63 6f 72 64 2c 20 26 72  , p->nRecord, &r
28a00 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
28a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28a20 20 78 4f 75 74 70 75 74 20 26 26 20 62 75 66 2e   xOutput && buf.
28a30 6e 42 75 66 3e 3d 73 65 73 73 69 6f 6e 73 5f 73  nBuf>=sessions_s
28a40 74 72 6d 5f 63 68 75 6e 6b 5f 73 69 7a 65 20 29  trm_chunk_size )
28a50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28a60 20 78 4f 75 74 70 75 74 28 70 4f 75 74 2c 20 62   xOutput(pOut, b
28a70 75 66 2e 61 42 75 66 2c 20 62 75 66 2e 6e 42 75  uf.aBuf, buf.nBu
28a80 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 75  f);.          bu
28a90 66 2e 6e 42 75 66 20 3d 20 30 3b 0a 20 20 20 20  f.nBuf = 0;.    
28aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28ab0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
28ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28ad0 20 20 20 20 69 66 28 20 78 4f 75 74 70 75 74 20      if( xOutput 
28ae0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  ){.      if( buf
28af0 2e 6e 42 75 66 3e 30 20 29 20 72 63 20 3d 20 78  .nBuf>0 ) rc = x
28b00 4f 75 74 70 75 74 28 70 4f 75 74 2c 20 62 75 66  Output(pOut, buf
28b10 2e 61 42 75 66 2c 20 62 75 66 2e 6e 42 75 66 29  .aBuf, buf.nBuf)
28b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28b30 20 20 20 2a 70 70 4f 75 74 20 3d 20 62 75 66 2e     *ppOut = buf.
28b40 61 42 75 66 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  aBuf;.      *pnO
28b50 75 74 20 3d 20 62 75 66 2e 6e 42 75 66 3b 0a 20  ut = buf.nBuf;. 
28b60 20 20 20 20 20 62 75 66 2e 61 42 75 66 20 3d 20       buf.aBuf = 
28b70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
28b80 71 6c 69 74 65 33 5f 66 72 65 65 28 62 75 66 2e  qlite3_free(buf.
28b90 61 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e  aBuf);..  return
28ba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
28bb0 6c 6f 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d  locate a new, em
28bc0 70 74 79 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  pty, sqlite3_cha
28bd0 6e 67 65 67 72 6f 75 70 2e 0a 2a 2f 0a 69 6e 74  ngegroup..*/.int
28be0 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72   sqlite3changegr
28bf0 6f 75 70 5f 6e 65 77 28 73 71 6c 69 74 65 33 5f  oup_new(sqlite3_
28c00 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 2a 70 70  changegroup **pp
28c10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28c20 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28c30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28c40 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
28c50 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 70 3b  _changegroup *p;
28c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
28c70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 20 3d 20  object */.  p = 
28c80 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67  (sqlite3_changeg
28c90 72 6f 75 70 2a 29 73 71 6c 69 74 65 33 5f 6d 61  roup*)sqlite3_ma
28ca0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 71 6c 69  lloc(sizeof(sqli
28cb0 74 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 29  te3_changegroup)
28cc0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
28cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
28ce0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
28cf0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
28d00 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
28d10 5f 63 68 61 6e 67 65 67 72 6f 75 70 29 29 3b 0a  _changegroup));.
28d20 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20    }.  *pp = p;. 
28d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28d40 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 63 68 61  *.** Add the cha
28d50 6e 67 65 73 65 74 20 63 75 72 72 65 6e 74 6c 79  ngeset currently
28d60 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66 66 65   stored in buffe
28d70 72 20 70 44 61 74 61 2c 20 73 69 7a 65 20 6e 44  r pData, size nD
28d80 61 74 61 20 62 79 74 65 73 2c 0a 2a 2a 20 74 6f  ata bytes,.** to
28d90 20 63 68 61 6e 67 65 73 65 74 2d 67 72 6f 75 70   changeset-group
28da0 20 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   p..*/.int sqlit
28db0 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 61 64  e3changegroup_ad
28dc0 64 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  d(sqlite3_change
28dd0 67 72 6f 75 70 20 2a 70 47 72 70 2c 20 69 6e 74  group *pGrp, int
28de0 20 6e 44 61 74 61 2c 20 76 6f 69 64 20 2a 70 44   nData, void *pD
28df0 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ata){.  sqlite3_
28e00 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
28e10 70 49 74 65 72 3b 20 20 2f 2a 20 49 74 65 72 61  pIter;  /* Itera
28e20 74 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 70 44  tor opened on pD
28e30 61 74 61 2f 6e 44 61 74 61 20 2a 2f 0a 20 20 69  ata/nData */.  i
28e40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28e70 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
28e80 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74 28  changeset_start(
28e90 26 70 49 74 65 72 2c 20 6e 44 61 74 61 2c 20 70  &pIter, nData, p
28ea0 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  Data);.  if( rc=
28eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ec0 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 68    rc = sessionCh
28ed0 61 6e 67 65 73 65 74 54 6f 48 61 73 68 28 70 49  angesetToHash(pI
28ee0 74 65 72 2c 20 70 47 72 70 2c 20 30 29 3b 0a 20  ter, pGrp, 0);. 
28ef0 20 7d 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e   }.  sqlite3chan
28f00 67 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70  geset_finalize(p
28f10 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  Iter);.  return 
28f20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
28f30 61 69 6e 20 61 20 62 75 66 66 65 72 20 63 6f 6e  ain a buffer con
28f40 74 61 69 6e 69 6e 67 20 61 20 63 68 61 6e 67 65  taining a change
28f50 73 65 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  set representing
28f60 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
28f70 6f 6e 0a 2a 2a 20 6f 66 20 61 6c 6c 20 63 68 61  on.** of all cha
28f80 6e 67 65 73 65 74 73 20 61 64 64 65 64 20 74 6f  ngesets added to
28f90 20 74 68 65 20 67 72 6f 75 70 20 73 6f 20 66 61   the group so fa
28fa0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
28fb0 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74  3changegroup_out
28fc0 70 75 74 28 0a 20 20 20 20 73 71 6c 69 74 65 33  put(.    sqlite3
28fd0 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a 70 47  _changegroup *pG
28fe0 72 70 2c 0a 20 20 20 20 69 6e 74 20 2a 70 6e 44  rp,.    int *pnD
28ff0 61 74 61 2c 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ata,.    void **
29000 70 70 44 61 74 61 0a 29 7b 0a 20 20 72 65 74 75  ppData.){.  retu
29010 72 6e 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65  rn sessionChange
29020 67 72 6f 75 70 4f 75 74 70 75 74 28 70 47 72 70  groupOutput(pGrp
29030 2c 20 30 2c 20 30 2c 20 70 6e 44 61 74 61 2c 20  , 0, 0, pnData, 
29040 70 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ppData);.}../*.*
29050 2a 20 53 74 72 65 61 6d 69 6e 67 20 76 65 72 73  * Streaming vers
29060 69 6f 6e 73 20 6f 66 20 63 68 61 6e 67 65 67 72  ions of changegr
29070 6f 75 70 5f 61 64 64 28 29 2e 0a 2a 2f 0a 69 6e  oup_add()..*/.in
29080 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67  t sqlite3changeg
29090 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d 28 0a 20  roup_add_strm(. 
290a0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
290b0 72 6f 75 70 20 2a 70 47 72 70 2c 0a 20 20 69 6e  roup *pGrp,.  in
290c0 74 20 28 2a 78 49 6e 70 75 74 29 28 76 6f 69 64  t (*xInput)(void
290d0 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61   *pIn, void *pDa
290e0 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29  ta, int *pnData)
290f0 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 0a 29 7b  ,.  void *pIn.){
29100 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
29110 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
29120 3b 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f  ;  /* Iterator o
29130 70 65 6e 65 64 20 6f 6e 20 70 44 61 74 61 2f 6e  pened on pData/n
29140 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Data */.  int rc
29150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29170 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
29180 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67  c = sqlite3chang
29190 65 73 65 74 5f 73 74 61 72 74 5f 73 74 72 6d 28  eset_start_strm(
291a0 26 70 49 74 65 72 2c 20 78 49 6e 70 75 74 2c 20  &pIter, xInput, 
291b0 70 49 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pIn);.  if( rc==
291c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
291d0 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43 68 61   rc = sessionCha
291e0 6e 67 65 73 65 74 54 6f 48 61 73 68 28 70 49 74  ngesetToHash(pIt
291f0 65 72 2c 20 70 47 72 70 2c 20 30 29 3b 0a 20 20  er, pGrp, 0);.  
29200 7d 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67  }.  sqlite3chang
29210 65 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49  eset_finalize(pI
29220 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
29230 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 65  c;.}../*.** Stre
29240 61 6d 69 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f  aming versions o
29250 66 20 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75  f changegroup_ou
29260 74 70 75 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  tput()..*/.int s
29270 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
29280 70 5f 6f 75 74 70 75 74 5f 73 74 72 6d 28 0a 20  p_output_strm(. 
29290 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67   sqlite3_changeg
292a0 72 6f 75 70 20 2a 70 47 72 70 2c 0a 20 20 69 6e  roup *pGrp,.  in
292b0 74 20 28 2a 78 4f 75 74 70 75 74 29 28 76 6f 69  t (*xOutput)(voi
292c0 64 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 76  d *pOut, const v
292d0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
292e0 6e 44 61 74 61 29 2c 20 0a 20 20 76 6f 69 64 20  nData), .  void 
292f0 2a 70 4f 75 74 0a 29 7b 0a 20 20 72 65 74 75 72  *pOut.){.  retur
29300 6e 20 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 67  n sessionChangeg
29310 72 6f 75 70 4f 75 74 70 75 74 28 70 47 72 70 2c  roupOutput(pGrp,
29320 20 78 4f 75 74 70 75 74 2c 20 70 4f 75 74 2c 20   xOutput, pOut, 
29330 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
29340 44 65 6c 65 74 65 20 61 20 63 68 61 6e 67 65 67  Delete a changeg
29350 72 6f 75 70 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  roup object..*/.
29360 76 6f 69 64 20 73 71 6c 69 74 65 33 63 68 61 6e  void sqlite3chan
29370 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28 73  gegroup_delete(s
29380 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 67 72 6f  qlite3_changegro
29390 75 70 20 2a 70 47 72 70 29 7b 0a 20 20 69 66 28  up *pGrp){.  if(
293a0 20 70 47 72 70 20 29 7b 0a 20 20 20 20 73 65 73   pGrp ){.    ses
293b0 73 69 6f 6e 44 65 6c 65 74 65 54 61 62 6c 65 28  sionDeleteTable(
293c0 70 47 72 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pGrp->pList);.  
293d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
293e0 47 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  Grp);.  }.}../* 
293f0 0a 2a 2a 20 43 6f 6d 62 69 6e 65 20 74 77 6f 20  .** Combine two 
29400 63 68 61 6e 67 65 73 65 74 73 20 74 6f 67 65 74  changesets toget
29410 68 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  her..*/.int sqli
29420 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
29430 63 61 74 28 0a 20 20 69 6e 74 20 6e 4c 65 66 74  cat(.  int nLeft
29440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29450 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29460 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6c 68 73   of bytes in lhs
29470 20 69 6e 70 75 74 20 2a 2f 0a 20 20 76 6f 69 64   input */.  void
29480 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
29490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
294a0 68 73 20 69 6e 70 75 74 20 63 68 61 6e 67 65 73  hs input changes
294b0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 69 67  et */.  int nRig
294c0 68 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ht              
294d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
294e0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 72 68  r of bytes in rh
294f0 73 20 69 6e 70 75 74 20 2a 2f 2c 0a 20 20 76 6f  s input */,.  vo
29500 69 64 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  id *pRight,     
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29520 20 52 68 73 20 69 6e 70 75 74 20 63 68 61 6e 67   Rhs input chang
29530 65 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  eset */.  int *p
29540 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  nOut,           
29550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
29560 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
29570 73 20 69 6e 20 6f 75 74 70 75 74 20 63 68 61 6e  s in output chan
29580 67 65 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64 20  geset */.  void 
29590 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
295a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
295b0 54 3a 20 63 68 61 6e 67 65 73 65 74 20 28 6c 65  T: changeset (le
295c0 66 74 20 3c 63 6f 6e 63 61 74 3e 20 72 69 67 68  ft <concat> righ
295d0 74 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  t) */.){.  sqlit
295e0 65 33 5f 63 68 61 6e 67 65 67 72 6f 75 70 20 2a  e3_changegroup *
295f0 70 47 72 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pGrp;.  int rc;.
29600 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63  .  rc = sqlite3c
29610 68 61 6e 67 65 67 72 6f 75 70 5f 6e 65 77 28 26  hangegroup_new(&
29620 70 47 72 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  pGrp);.  if( rc=
29630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68    rc = sqlite3ch
29650 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47  angegroup_add(pG
29660 72 70 2c 20 6e 4c 65 66 74 2c 20 70 4c 65 66 74  rp, nLeft, pLeft
29670 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
29680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68    rc = sqlite3ch
296a0 61 6e 67 65 67 72 6f 75 70 5f 61 64 64 28 70 47  angegroup_add(pG
296b0 72 70 2c 20 6e 52 69 67 68 74 2c 20 70 52 69 67  rp, nRight, pRig
296c0 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ht);.  }.  if( r
296d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
296e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
296f0 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75 74 70  changegroup_outp
29700 75 74 28 70 47 72 70 2c 20 70 6e 4f 75 74 2c 20  ut(pGrp, pnOut, 
29710 70 70 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ppOut);.  }.  sq
29720 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75 70  lite3changegroup
29730 5f 64 65 6c 65 74 65 28 70 47 72 70 29 3b 0a 0a  _delete(pGrp);..
29740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29750 2f 2a 0a 2a 2a 20 53 74 72 65 61 6d 69 6e 67 20  /*.** Streaming 
29760 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
29770 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63  e3changeset_conc
29780 61 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  at()..*/.int sql
29790 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f  ite3changeset_co
297a0 6e 63 61 74 5f 73 74 72 6d 28 0a 20 20 69 6e 74  ncat_strm(.  int
297b0 20 28 2a 78 49 6e 70 75 74 41 29 28 76 6f 69 64   (*xInputA)(void
297c0 20 2a 70 49 6e 2c 20 76 6f 69 64 20 2a 70 44 61   *pIn, void *pDa
297d0 74 61 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29  ta, int *pnData)
297e0 2c 0a 20 20 76 6f 69 64 20 2a 70 49 6e 41 2c 0a  ,.  void *pInA,.
297f0 20 20 69 6e 74 20 28 2a 78 49 6e 70 75 74 42 29    int (*xInputB)
29800 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f 69 64  (void *pIn, void
29810 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a 70 6e   *pData, int *pn
29820 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20 2a 70  Data),.  void *p
29830 49 6e 42 2c 0a 20 20 69 6e 74 20 28 2a 78 4f 75  InB,.  int (*xOu
29840 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75 74  tput)(void *pOut
29850 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44  , const void *pD
29860 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c  ata, int nData),
29870 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29 7b  .  void *pOut.){
29880 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
29890 65 67 72 6f 75 70 20 2a 70 47 72 70 3b 0a 20 20  egroup *pGrp;.  
298a0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
298b0 73 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f  sqlite3changegro
298c0 75 70 5f 6e 65 77 28 26 70 47 72 70 29 3b 0a 20  up_new(&pGrp);. 
298d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
298e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
298f0 71 6c 69 74 65 33 63 68 61 6e 67 65 67 72 6f 75  qlite3changegrou
29900 70 5f 61 64 64 5f 73 74 72 6d 28 70 47 72 70 2c  p_add_strm(pGrp,
29910 20 78 49 6e 70 75 74 41 2c 20 70 49 6e 41 29 3b   xInputA, pInA);
29920 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
29930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29940 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e  rc = sqlite3chan
29950 67 65 67 72 6f 75 70 5f 61 64 64 5f 73 74 72 6d  gegroup_add_strm
29960 28 70 47 72 70 2c 20 78 49 6e 70 75 74 42 2c 20  (pGrp, xInputB, 
29970 70 49 6e 42 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pInB);.  }.  if(
29980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29990 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
299a0 65 33 63 68 61 6e 67 65 67 72 6f 75 70 5f 6f 75  e3changegroup_ou
299b0 74 70 75 74 5f 73 74 72 6d 28 70 47 72 70 2c 20  tput_strm(pGrp, 
299c0 78 4f 75 74 70 75 74 2c 20 70 4f 75 74 29 3b 0a  xOutput, pOut);.
299d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 63 68 61    }.  sqlite3cha
299e0 6e 67 65 67 72 6f 75 70 5f 64 65 6c 65 74 65 28  ngegroup_delete(
299f0 70 47 72 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pGrp);..  return
29a00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
29a10 61 6e 67 65 73 65 74 20 72 65 62 61 73 65 72 20  angeset rebaser 
29a20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63  handle..*/.struc
29a30 74 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  t sqlite3_rebase
29a40 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68  r {.  sqlite3_ch
29a50 61 6e 67 65 67 72 6f 75 70 20 67 72 70 3b 20 20  angegroup grp;  
29a60 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
29a70 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ble */.};../*.**
29a80 20 42 75 66 66 65 72 73 20 61 31 20 61 6e 64 20   Buffers a1 and 
29a90 61 32 20 6d 75 73 74 20 62 6f 74 68 20 63 6f 6e  a2 must both con
29aa0 74 61 69 6e 20 61 20 73 65 73 73 69 6f 6e 73 20  tain a sessions 
29ab0 6d 6f 64 75 6c 65 20 72 65 63 6f 72 64 20 6e 43  module record nC
29ac0 6f 6c 0a 2a 2a 20 66 69 65 6c 64 73 20 69 6e 20  ol.** fields in 
29ad0 73 69 7a 65 2e 20 54 68 69 73 20 66 75 6e 63 74  size. This funct
29ae0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 6e  ion appends an n
29af0 43 6f 6c 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64  Col sessions mod
29b00 75 6c 65 20 0a 2a 2a 20 72 65 63 6f 72 64 20 74  ule .** record t
29b10 6f 20 62 75 66 66 65 72 20 70 42 75 66 20 74 68  o buffer pBuf th
29b20 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  at is a copy of 
29b30 61 31 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  a1, except that 
29b40 66 6f 72 0a 2a 2a 20 65 61 63 68 20 66 69 65 6c  for.** each fiel
29b50 64 20 74 68 61 74 20 69 73 20 75 6e 64 65 66 69  d that is undefi
29b60 6e 65 64 20 69 6e 20 61 31 5b 5d 2c 20 73 77 61  ned in a1[], swa
29b70 70 20 69 6e 20 74 68 65 20 66 69 65 6c 64 20 66  p in the field f
29b80 72 6f 6d 20 61 32 5b 5d 2e 0a 2a 2f 0a 73 74 61  rom a2[]..*/.sta
29b90 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
29ba0 41 70 70 65 6e 64 52 65 63 6f 72 64 4d 65 72 67  AppendRecordMerg
29bb0 65 28 0a 20 20 53 65 73 73 69 6f 6e 42 75 66 66  e(.  SessionBuff
29bc0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
29bd0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
29be0 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20  o append to */. 
29bf0 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
29c20 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 65  lumns in each re
29c30 63 6f 72 64 20 2a 2f 0a 20 20 75 38 20 2a 61 31  cord */.  u8 *a1
29c40 2c 20 69 6e 74 20 6e 31 2c 20 20 20 20 20 20 20  , int n1,       
29c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63            /* Rec
29c60 6f 72 64 20 31 20 2a 2f 0a 20 20 75 38 20 2a 61  ord 1 */.  u8 *a
29c70 32 2c 20 69 6e 74 20 6e 32 2c 20 20 20 20 20 20  2, int n2,      
29c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29c90 63 6f 72 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  cord 2 */.  int 
29ca0 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29cc0 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
29cd0 65 20 2a 2f 0a 29 7b 0a 20 20 73 65 73 73 69 6f  e */.){.  sessio
29ce0 6e 42 75 66 66 65 72 47 72 6f 77 28 70 42 75 66  nBufferGrow(pBuf
29cf0 2c 20 6e 31 2b 6e 32 2c 20 70 52 63 29 3b 0a 20  , n1+n2, pRc);. 
29d00 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
29d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
29d20 69 3b 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  i;.    u8 *pOut 
29d30 3d 20 26 70 42 75 66 2d 3e 61 42 75 66 5b 70 42  = &pBuf->aBuf[pB
29d40 75 66 2d 3e 6e 42 75 66 5d 3b 0a 20 20 20 20 66  uf->nBuf];.    f
29d50 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
29d60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
29d70 6e 6e 31 20 3d 20 73 65 73 73 69 6f 6e 53 65 72  nn1 = sessionSer
29d80 69 61 6c 4c 65 6e 28 61 31 29 3b 0a 20 20 20 20  ialLen(a1);.    
29d90 20 20 69 6e 74 20 6e 6e 32 20 3d 20 73 65 73 73    int nn2 = sess
29da0 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 32 29  ionSerialLen(a2)
29db0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 61 31 3d  ;.      if( *a1=
29dc0 3d 30 20 7c 7c 20 2a 61 31 3d 3d 30 78 46 46 20  =0 || *a1==0xFF 
29dd0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29de0 79 28 70 4f 75 74 2c 20 61 32 2c 20 6e 6e 32 29  y(pOut, a2, nn2)
29df0 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b  ;.        pOut +
29e00 3d 20 6e 6e 32 3b 0a 20 20 20 20 20 20 7d 65 6c  = nn2;.      }el
29e10 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
29e20 70 79 28 70 4f 75 74 2c 20 61 31 2c 20 6e 6e 31  py(pOut, a1, nn1
29e30 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20  );.        pOut 
29e40 2b 3d 20 6e 6e 31 3b 0a 20 20 20 20 20 20 7d 0a  += nn1;.      }.
29e50 20 20 20 20 20 20 61 31 20 2b 3d 20 6e 6e 31 3b        a1 += nn1;
29e60 0a 20 20 20 20 20 20 61 32 20 2b 3d 20 6e 6e 32  .      a2 += nn2
29e70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75  ;.    }..    pBu
29e80 66 2d 3e 6e 42 75 66 20 3d 20 70 4f 75 74 2d 70  f->nBuf = pOut-p
29e90 42 75 66 2d 3e 61 42 75 66 3b 0a 20 20 20 20 61  Buf->aBuf;.    a
29ea0 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 42 75  ssert( pBuf->nBu
29eb0 66 3c 3d 70 42 75 66 2d 3e 6e 41 6c 6c 6f 63 20  f<=pBuf->nAlloc 
29ec0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
29ed0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
29ee0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 72 65 62   called when reb
29ef0 61 73 69 6e 67 20 61 20 6c 6f 63 61 6c 20 55 50  asing a local UP
29f00 44 41 54 45 20 63 68 61 6e 67 65 20 61 67 61 69  DATE change agai
29f10 6e 73 74 20 6f 6e 65 20 0a 2a 2a 20 6f 72 20 6d  nst one .** or m
29f20 6f 72 65 20 72 65 6d 6f 74 65 20 55 50 44 41 54  ore remote UPDAT
29f30 45 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 61  E changes. The a
29f40 52 65 63 2f 6e 52 65 63 20 62 75 66 66 65 72 20  Rec/nRec buffer 
29f50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72  contains the cur
29f60 72 65 6e 74 0a 2a 2a 20 6f 6c 64 2e 2a 20 61 6e  rent.** old.* an
29f70 64 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 73 20  d new.* records 
29f80 66 6f 72 20 74 68 65 20 63 68 61 6e 67 65 2e 20  for the change. 
29f90 54 68 65 20 72 65 62 61 73 65 20 62 75 66 66 65  The rebase buffe
29fa0 72 20 28 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  r (a single.** r
29fb0 65 63 6f 72 64 29 20 69 73 20 69 6e 20 61 43 68  ecord) is in aCh
29fc0 61 6e 67 65 2f 6e 43 68 61 6e 67 65 2e 20 54 68  ange/nChange. Th
29fd0 65 20 72 65 62 61 73 65 64 20 63 68 61 6e 67 65  e rebased change
29fe0 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
29ff0 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 0a  buffer.** pBuf..
2a000 2a 2a 0a 2a 2a 20 52 65 62 61 73 69 6e 67 20 74  **.** Rebasing t
2a010 68 65 20 55 50 44 41 54 45 20 69 6e 76 6f 6c 76  he UPDATE involv
2a020 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 52  es: .**.**   * R
2a030 65 6d 6f 76 69 6e 67 20 61 6e 79 20 63 68 61 6e  emoving any chan
2a040 67 65 73 20 74 6f 20 66 69 65 6c 64 73 20 66 6f  ges to fields fo
2a050 72 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  r which the corr
2a060 65 73 70 6f 6e 64 69 6e 67 20 66 69 65 6c 64 0a  esponding field.
2a070 2a 2a 20 20 20 20 20 69 6e 20 74 68 65 20 72 65  **     in the re
2a080 62 61 73 65 20 62 75 66 66 65 72 20 69 73 20 73  base buffer is s
2a090 65 74 20 74 6f 20 22 72 65 70 6c 61 63 65 64 22  et to "replaced"
2a0a0 20 28 74 79 70 65 20 30 78 46 46 29 2e 20 49 66   (type 0xFF). If
2a0b0 20 74 68 69 73 0a 2a 2a 20 20 20 20 20 6d 65 61   this.**     mea
2a0c0 6e 73 20 74 68 65 20 55 50 44 41 54 45 20 63 68  ns the UPDATE ch
2a0d0 61 6e 67 65 20 75 70 64 61 74 65 73 20 6e 6f 20  ange updates no 
2a0e0 66 69 65 6c 64 73 2c 20 6e 6f 74 68 69 6e 67 20  fields, nothing 
2a0f0 69 73 20 61 70 70 65 6e 64 65 64 0a 2a 2a 20 20  is appended.**  
2a100 20 20 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74     to the output
2a110 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 20   buffer..**.**  
2a120 20 2a 20 46 6f 72 20 65 61 63 68 20 66 69 65 6c   * For each fiel
2a130 64 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  d modified by th
2a140 65 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 20 66  e local change f
2a150 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 2a 2a  or which the .**
2a160 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69       correspondi
2a170 6e 67 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ng field in the 
2a180 72 65 62 61 73 65 20 62 75 66 66 65 72 20 69 73  rebase buffer is
2a190 20 6e 6f 74 20 22 75 6e 64 65 66 69 6e 65 64 22   not "undefined"
2a1a0 20 28 30 78 30 30 29 0a 2a 2a 20 20 20 20 20 6f   (0x00).**     o
2a1b0 72 20 22 72 65 70 6c 61 63 65 64 22 20 28 30 78  r "replaced" (0x
2a1c0 46 46 29 2c 20 74 68 65 20 6f 6c 64 2e 2a 20 76  FF), the old.* v
2a1d0 61 6c 75 65 20 69 73 20 72 65 70 6c 61 63 65 64  alue is replaced
2a1e0 20 62 79 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   by the value.**
2a1f0 20 20 20 20 20 69 6e 20 74 68 65 20 72 65 62 61       in the reba
2a200 73 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  se buffer..*/.st
2a210 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
2a220 6e 41 70 70 65 6e 64 50 61 72 74 69 61 6c 55 70  nAppendPartialUp
2a230 64 61 74 65 28 0a 20 20 53 65 73 73 69 6f 6e 42  date(.  SessionB
2a240 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
2a250 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
2a260 64 20 72 65 63 6f 72 64 20 68 65 72 65 20 2a 2f  d record here */
2a270 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
2a280 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
2a290 2c 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 70  ,  /* Iterator p
2a2a0 6f 69 6e 74 65 64 20 61 74 20 6c 6f 63 61 6c 20  ointed at local 
2a2b0 63 68 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20 2a  change */.  u8 *
2a2c0 61 52 65 63 2c 20 69 6e 74 20 6e 52 65 63 2c 20  aRec, int nRec, 
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2a2e0 6f 63 61 6c 20 63 68 61 6e 67 65 20 2a 2f 0a 20  ocal change */. 
2a2f0 20 75 38 20 2a 61 43 68 61 6e 67 65 2c 20 69 6e   u8 *aChange, in
2a300 74 20 6e 43 68 61 6e 67 65 2c 20 20 20 20 20 20  t nChange,      
2a310 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 72 65   /* Record to re
2a320 62 61 73 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  base against */.
2a330 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a350 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 65 74    /* IN/OUT: Ret
2a360 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 29 7b 0a 20  urn Code */.){. 
2a370 20 73 65 73 73 69 6f 6e 42 75 66 66 65 72 47 72   sessionBufferGr
2a380 6f 77 28 70 42 75 66 2c 20 32 2b 6e 52 65 63 2b  ow(pBuf, 2+nRec+
2a390 6e 43 68 61 6e 67 65 2c 20 70 52 63 29 3b 0a 20  nChange, pRc);. 
2a3a0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
2a3b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2a3c0 62 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 75  bData = 0;.    u
2a3d0 38 20 2a 70 4f 75 74 20 3d 20 26 70 42 75 66 2d  8 *pOut = &pBuf-
2a3e0 3e 61 42 75 66 5b 70 42 75 66 2d 3e 6e 42 75 66  >aBuf[pBuf->nBuf
2a3f0 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ];.    int i;.  
2a400 20 20 75 38 20 2a 61 31 20 3d 20 61 52 65 63 3b    u8 *a1 = aRec;
2a410 0a 20 20 20 20 75 38 20 2a 61 32 20 3d 20 61 43  .    u8 *a2 = aC
2a420 68 61 6e 67 65 3b 0a 0a 20 20 20 20 2a 70 4f 75  hange;..    *pOu
2a430 74 2b 2b 20 3d 20 53 51 4c 49 54 45 5f 55 50 44  t++ = SQLITE_UPD
2a440 41 54 45 3b 0a 20 20 20 20 2a 70 4f 75 74 2b 2b  ATE;.    *pOut++
2a450 20 3d 20 70 49 74 65 72 2d 3e 62 49 6e 64 69 72   = pIter->bIndir
2a460 65 63 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ect;.    for(i=0
2a470 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b  ; i<pIter->nCol;
2a480 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
2a490 20 6e 31 20 3d 20 73 65 73 73 69 6f 6e 53 65 72   n1 = sessionSer
2a4a0 69 61 6c 4c 65 6e 28 61 31 29 3b 0a 20 20 20 20  ialLen(a1);.    
2a4b0 20 20 69 6e 74 20 6e 32 20 3d 20 73 65 73 73 69    int n2 = sessi
2a4c0 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 32 29 3b  onSerialLen(a2);
2a4d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
2a4e0 2d 3e 61 62 50 4b 5b 69 5d 20 7c 7c 20 61 32 5b  ->abPK[i] || a2[
2a4f0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
2a500 20 69 66 28 20 21 70 49 74 65 72 2d 3e 61 62 50   if( !pIter->abP
2a510 4b 5b 69 5d 20 29 20 62 44 61 74 61 20 3d 20 31  K[i] ) bData = 1
2a520 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2a530 28 70 4f 75 74 2c 20 61 31 2c 20 6e 31 29 3b 0a  (pOut, a1, n1);.
2a540 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d 20          pOut += 
2a550 6e 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n1;.      }else 
2a560 69 66 28 20 61 32 5b 30 5d 21 3d 30 78 46 46 20  if( a2[0]!=0xFF 
2a570 29 7b 0a 20 20 20 20 20 20 20 20 62 44 61 74 61  ){.        bData
2a580 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6d 65   = 1;.        me
2a590 6d 63 70 79 28 70 4f 75 74 2c 20 61 32 2c 20 6e  mcpy(pOut, a2, n
2a5a0 32 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  2);.        pOut
2a5b0 20 2b 3d 20 6e 32 3b 0a 20 20 20 20 20 20 7d 65   += n2;.      }e
2a5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4f  lse{.        *pO
2a5d0 75 74 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20  ut++ = '\0';.   
2a5e0 20 20 20 7d 0a 20 20 20 20 20 20 61 31 20 2b 3d     }.      a1 +=
2a5f0 20 6e 31 3b 0a 20 20 20 20 20 20 61 32 20 2b 3d   n1;.      a2 +=
2a600 20 6e 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   n2;.    }.    i
2a610 66 28 20 62 44 61 74 61 20 29 7b 0a 20 20 20 20  f( bData ){.    
2a620 20 20 61 32 20 3d 20 61 43 68 61 6e 67 65 3b 0a    a2 = aChange;.
2a630 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a640 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b  <pIter->nCol; i+
2a650 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2a660 6e 31 20 3d 20 73 65 73 73 69 6f 6e 53 65 72 69  n1 = sessionSeri
2a670 61 6c 4c 65 6e 28 61 31 29 3b 0a 20 20 20 20 20  alLen(a1);.     
2a680 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 65 73 73     int n2 = sess
2a690 69 6f 6e 53 65 72 69 61 6c 4c 65 6e 28 61 32 29  ionSerialLen(a2)
2a6a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2a6b0 74 65 72 2d 3e 61 62 50 4b 5b 69 5d 20 7c 7c 20  ter->abPK[i] || 
2a6c0 61 32 5b 30 5d 21 3d 30 78 46 46 20 29 7b 0a 20  a2[0]!=0xFF ){. 
2a6d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2a6e0 70 4f 75 74 2c 20 61 31 2c 20 6e 31 29 3b 0a 20  pOut, a1, n1);. 
2a6f0 20 20 20 20 20 20 20 20 20 70 4f 75 74 20 2b 3d           pOut +=
2a700 20 6e 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   n1;.        }el
2a710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
2a720 4f 75 74 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20  Out++ = '\0';.  
2a730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a740 61 31 20 2b 3d 20 6e 31 3b 0a 20 20 20 20 20 20  a1 += n1;.      
2a750 20 20 61 32 20 2b 3d 20 6e 32 3b 0a 20 20 20 20    a2 += n2;.    
2a760 20 20 7d 0a 20 20 20 20 20 20 70 42 75 66 2d 3e    }.      pBuf->
2a770 6e 42 75 66 20 3d 20 28 70 4f 75 74 20 2d 20 70  nBuf = (pOut - p
2a780 42 75 66 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20  Buf->aBuf);.    
2a790 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  }.  }.}../*.** p
2a7a0 49 74 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  Iter is configur
2a7b0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
2a7c0 72 6f 75 67 68 20 61 20 63 68 61 6e 67 65 73 65  rough a changese
2a7d0 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
2a7e0 20 72 65 62 61 73 65 73 20 0a 2a 2a 20 74 68 61   rebases .** tha
2a7f0 74 20 63 68 61 6e 67 65 73 65 74 20 61 63 63 6f  t changeset acco
2a800 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  rding to the cur
2a810 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69  rent configurati
2a820 6f 6e 20 6f 66 20 74 68 65 20 72 65 62 61 73 65  on of the rebase
2a830 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 70 61 73  r .** object pas
2a840 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2a850 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 6e 6f   argument. If no
2a860 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
2a870 64 20 61 72 67 75 6d 65 6e 74 20 78 4f 75 74 70  d argument xOutp
2a880 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  ut.** is not NUL
2a890 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  L, then the chan
2a8a0 67 65 73 65 74 20 69 73 20 72 65 74 75 72 6e 65  geset is returne
2a8b0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
2a8c0 62 79 20 69 6e 76 6f 6b 69 6e 67 0a 2a 2a 20 78  by invoking.** x
2a8d0 4f 75 74 70 75 74 20 7a 65 72 6f 20 6f 72 20 6d  Output zero or m
2a8e0 6f 72 65 20 74 69 6d 65 73 20 61 6e 64 20 53 51  ore times and SQ
2a8f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2a900 2e 20 4f 72 2c 20 69 66 20 78 4f 75 74 70 75 74  . Or, if xOutput
2a910 20 69 73 20 4e 55 4c 4c 2c 0a 2a 2a 20 74 68 65   is NULL,.** the
2a920 6e 20 28 2a 70 70 4f 75 74 29 20 69 73 20 73 65  n (*ppOut) is se
2a930 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
2a940 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2a950 67 20 74 68 65 20 72 65 62 61 73 65 64 20 63 68  g the rebased ch
2a960 61 6e 67 65 73 65 74 0a 2a 2a 20 62 65 66 6f 72  angeset.** befor
2a970 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2a980 72 65 74 75 72 6e 73 2e 20 49 6e 20 74 68 69 73  returns. In this
2a990 20 63 61 73 65 20 28 2a 70 6e 4f 75 74 29 20 69   case (*pnOut) i
2a9a0 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
2a9b0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 62 75 66 66  e of.** the buff
2a9c0 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 49 74  er in bytes.  It
2a9d0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2a9e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2a9f0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
2aa00 6c 79 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 28  ly.** free the (
2aa10 2a 70 70 4f 75 74 29 20 62 75 66 66 65 72 20 75  *ppOut) buffer u
2aa20 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
2aa30 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e(). .**.** If a
2aa40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2aa50 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2aa60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2aa70 2e 20 49 66 20 70 70 4f 75 74 20 61 6e 64 0a 2a  . If ppOut and.*
2aa80 2a 20 70 6e 4f 75 74 20 61 72 65 20 6e 6f 74 20  * pnOut are not 
2aa90 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74  NULL, then the t
2aaa0 77 6f 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  wo output parame
2aab0 74 65 72 73 20 61 72 65 20 73 65 74 20 74 6f 20  ters are set to 
2aac0 30 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  0 before.** retu
2aad0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
2aae0 20 69 6e 74 20 73 65 73 73 69 6f 6e 52 65 62 61   int sessionReba
2aaf0 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  se(.  sqlite3_re
2ab00 62 61 73 65 72 20 2a 70 2c 20 20 20 20 20 20 20  baser *p,       
2ab10 20 20 20 20 20 20 2f 2a 20 52 65 62 61 73 65 72        /* Rebaser
2ab20 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
2ab30 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
2ab40 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 20  et_iter *pIter, 
2ab50 20 2f 2a 20 49 6e 70 75 74 20 64 61 74 61 20 2a   /* Input data *
2ab60 2f 0a 20 20 69 6e 74 20 28 2a 78 4f 75 74 70 75  /.  int (*xOutpu
2ab70 74 29 28 76 6f 69 64 20 2a 70 4f 75 74 2c 20 63  t)(void *pOut, c
2ab80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2ab90 2c 20 69 6e 74 20 6e 44 61 74 61 29 2c 0a 20 20  , int nData),.  
2aba0 76 6f 69 64 20 2a 70 4f 75 74 2c 20 20 20 20 20  void *pOut,     
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 78  /* Context for x
2abd0 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20  Output callback 
2abe0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c  */.  int *pnOut,
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
2ac10 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ac20 6f 75 74 70 75 74 20 63 68 61 6e 67 65 73 65 74  output changeset
2ac30 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4f   */.  void **ppO
2ac40 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
2ac50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6e        /* OUT: In
2ac60 76 65 72 73 65 20 6f 66 20 70 43 68 61 6e 67 65  verse of pChange
2ac70 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
2ac80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ac90 20 20 75 38 20 2a 61 52 65 63 20 3d 20 30 3b 0a    u8 *aRec = 0;.
2aca0 20 20 69 6e 74 20 6e 52 65 63 20 3d 20 30 3b 0a    int nRec = 0;.
2acb0 20 20 69 6e 74 20 62 4e 65 77 20 3d 20 30 3b 0a    int bNew = 0;.
2acc0 20 20 53 65 73 73 69 6f 6e 54 61 62 6c 65 20 2a    SessionTable *
2acd0 70 54 61 62 20 3d 20 30 3b 0a 20 20 53 65 73 73  pTab = 0;.  Sess
2ace0 69 6f 6e 42 75 66 66 65 72 20 73 4f 75 74 20 3d  ionBuffer sOut =
2acf0 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 77 68 69   {0,0,0};..  whi
2ad00 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
2ad10 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 73 65 74  sessionChangeset
2ad20 4e 65 78 74 28 70 49 74 65 72 2c 20 26 61 52 65  Next(pIter, &aRe
2ad30 63 2c 20 26 6e 52 65 63 2c 20 26 62 4e 65 77 29  c, &nRec, &bNew)
2ad40 20 29 7b 0a 20 20 20 20 53 65 73 73 69 6f 6e 43   ){.    SessionC
2ad50 68 61 6e 67 65 20 2a 70 43 68 61 6e 67 65 20 3d  hange *pChange =
2ad60 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44 6f 6e   0;.    int bDon
2ad70 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
2ad80 62 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 63 6f  bNew ){.      co
2ad90 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
2ada0 20 70 49 74 65 72 2d 3e 7a 54 61 62 3b 0a 20 20   pIter->zTab;.  
2adb0 20 20 20 20 66 6f 72 28 70 54 61 62 3d 70 2d 3e      for(pTab=p->
2adc0 67 72 70 2e 70 4c 69 73 74 3b 20 70 54 61 62 3b  grp.pList; pTab;
2add0 20 70 54 61 62 3d 70 54 61 62 2d 3e 70 4e 65 78   pTab=pTab->pNex
2ade0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
2adf0 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
2ae00 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
2ae10 7a 54 61 62 29 20 29 20 62 72 65 61 6b 3b 0a 20  zTab) ) break;. 
2ae20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 4e 65       }.      bNe
2ae30 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
2ae40 20 41 20 70 61 74 63 68 73 65 74 20 6d 61 79 20   A patchset may 
2ae50 6e 6f 74 20 62 65 20 72 65 62 61 73 65 64 20 2a  not be rebased *
2ae60 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
2ae70 72 2d 3e 62 50 61 74 63 68 73 65 74 20 29 7b 0a  r->bPatchset ){.
2ae80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ae90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2aea0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70   }..      /* App
2aeb0 65 6e 64 20 61 20 74 61 62 6c 65 20 68 65 61 64  end a table head
2aec0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  er to the output
2aed0 20 66 6f 72 20 74 68 69 73 20 6e 65 77 20 74 61   for this new ta
2aee0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 65 73  ble */.      ses
2aef0 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26  sionAppendByte(&
2af00 73 4f 75 74 2c 20 70 49 74 65 72 2d 3e 62 50 61  sOut, pIter->bPa
2af10 74 63 68 73 65 74 20 3f 20 27 50 27 20 3a 20 27  tchset ? 'P' : '
2af20 54 27 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  T', &rc);.      
2af30 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 56 61 72  sessionAppendVar
2af40 69 6e 74 28 26 73 4f 75 74 2c 20 70 49 74 65 72  int(&sOut, pIter
2af50 2d 3e 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20  ->nCol, &rc);.  
2af60 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e      sessionAppen
2af70 64 42 6c 6f 62 28 26 73 4f 75 74 2c 20 70 49 74  dBlob(&sOut, pIt
2af80 65 72 2d 3e 61 62 50 4b 2c 20 70 49 74 65 72 2d  er->abPK, pIter-
2af90 3e 6e 43 6f 6c 2c 20 26 72 63 29 3b 0a 20 20 20  >nCol, &rc);.   
2afa0 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
2afb0 42 6c 6f 62 28 26 73 4f 75 74 2c 28 75 38 2a 29  Blob(&sOut,(u8*)
2afc0 70 49 74 65 72 2d 3e 7a 54 61 62 2c 28 69 6e 74  pIter->zTab,(int
2afd0 29 73 74 72 6c 65 6e 28 70 49 74 65 72 2d 3e 7a  )strlen(pIter->z
2afe0 54 61 62 29 2b 31 2c 26 72 63 29 3b 0a 20 20 20  Tab)+1,&rc);.   
2aff0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62   }..    if( pTab
2b000 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b010 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2b020 48 61 73 68 20 3d 20 73 65 73 73 69 6f 6e 43 68  Hash = sessionCh
2b030 61 6e 67 65 48 61 73 68 28 70 54 61 62 2c 20 30  angeHash(pTab, 0
2b040 2c 20 61 52 65 63 2c 20 70 54 61 62 2d 3e 6e 43  , aRec, pTab->nC
2b050 68 61 6e 67 65 29 3b 0a 0a 20 20 20 20 20 20 66  hange);..      f
2b060 6f 72 28 70 43 68 61 6e 67 65 3d 70 54 61 62 2d  or(pChange=pTab-
2b070 3e 61 70 43 68 61 6e 67 65 5b 69 48 61 73 68 5d  >apChange[iHash]
2b080 3b 20 70 43 68 61 6e 67 65 3b 20 70 43 68 61 6e  ; pChange; pChan
2b090 67 65 3d 70 43 68 61 6e 67 65 2d 3e 70 4e 65 78  ge=pChange->pNex
2b0a0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
2b0b0 73 65 73 73 69 6f 6e 43 68 61 6e 67 65 45 71 75  sessionChangeEqu
2b0c0 61 6c 28 70 54 61 62 2c 20 30 2c 20 61 52 65 63  al(pTab, 0, aRec
2b0d0 2c 20 30 2c 20 70 43 68 61 6e 67 65 2d 3e 61 52  , 0, pChange->aR
2b0e0 65 63 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20  ecord) ){.      
2b0f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b100 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b110 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 43 68 61   }..    if( pCha
2b120 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nge ){.      ass
2b130 65 72 74 28 20 70 43 68 61 6e 67 65 2d 3e 6f 70  ert( pChange->op
2b140 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
2b150 7c 7c 20 70 43 68 61 6e 67 65 2d 3e 6f 70 3d 3d  || pChange->op==
2b160 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 3b  SQLITE_INSERT );
2b170 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
2b180 49 74 65 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Iter->op ){.    
2b190 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2b1a0 49 4e 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20  INSERT:.        
2b1b0 20 20 69 66 28 20 70 43 68 61 6e 67 65 2d 3e 6f    if( pChange->o
2b1c0 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
2b1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b1e0 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
2b1f0 20 20 20 20 20 20 20 69 66 28 20 70 43 68 61 6e         if( pChan
2b200 67 65 2d 3e 62 49 6e 64 69 72 65 63 74 3d 3d 30  ge->bIndirect==0
2b210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b220 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42    sessionAppendB
2b230 79 74 65 28 26 73 4f 75 74 2c 20 53 51 4c 49 54  yte(&sOut, SQLIT
2b240 45 5f 55 50 44 41 54 45 2c 20 26 72 63 29 3b 0a  E_UPDATE, &rc);.
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2b260 73 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28  ssionAppendByte(
2b270 26 73 4f 75 74 2c 20 70 49 74 65 72 2d 3e 62 49  &sOut, pIter->bI
2b280 6e 64 69 72 65 63 74 2c 20 26 72 63 29 3b 0a 20  ndirect, &rc);. 
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 73               ses
2b2a0 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28 26  sionAppendBlob(&
2b2b0 73 4f 75 74 2c 20 70 43 68 61 6e 67 65 2d 3e 61  sOut, pChange->a
2b2c0 52 65 63 6f 72 64 2c 20 70 43 68 61 6e 67 65 2d  Record, pChange-
2b2d0 3e 6e 52 65 63 6f 72 64 2c 20 26 72 63 29 3b 0a  >nRecord, &rc);.
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2b2f0 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f 62 28  ssionAppendBlob(
2b300 26 73 4f 75 74 2c 20 61 52 65 63 2c 20 6e 52 65  &sOut, aRec, nRe
2b310 63 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  c, &rc);.       
2b320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b330 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2b340 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63 61 73  ak;..        cas
2b350 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 3a  e SQLITE_UPDATE:
2b360 0a 20 20 20 20 20 20 20 20 20 20 62 44 6f 6e 65  .          bDone
2b370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b380 69 66 28 20 70 43 68 61 6e 67 65 2d 3e 6f 70 3d  if( pChange->op=
2b390 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
2b3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2b3b0 28 20 70 43 68 61 6e 67 65 2d 3e 62 49 6e 64 69  ( pChange->bIndi
2b3c0 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rect==0 ){.     
2b3d0 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 73           u8 *pCs
2b3e0 72 20 3d 20 61 52 65 63 3b 0a 20 20 20 20 20 20  r = aRec;.      
2b3f0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 53          sessionS
2b400 6b 69 70 52 65 63 6f 72 64 28 26 70 43 73 72 2c  kipRecord(&pCsr,
2b410 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 29 3b 0a 20   pIter->nCol);. 
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 73               ses
2b430 73 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26  sionAppendByte(&
2b440 73 4f 75 74 2c 20 53 51 4c 49 54 45 5f 49 4e 53  sOut, SQLITE_INS
2b450 45 52 54 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ERT, &rc);.     
2b460 20 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e           session
2b470 41 70 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74  AppendByte(&sOut
2b480 2c 20 70 49 74 65 72 2d 3e 62 49 6e 64 69 72 65  , pIter->bIndire
2b490 63 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ct, &rc);.      
2b4a0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41          sessionA
2b4b0 70 70 65 6e 64 52 65 63 6f 72 64 4d 65 72 67 65  ppendRecordMerge
2b4c0 28 26 73 4f 75 74 2c 20 70 49 74 65 72 2d 3e 6e  (&sOut, pIter->n
2b4d0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
2b4e0 20 20 20 20 20 20 20 70 43 73 72 2c 20 6e 52 65         pCsr, nRe
2b4f0 63 2d 28 70 43 73 72 2d 61 52 65 63 29 2c 20 0a  c-(pCsr-aRec), .
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b510 20 20 70 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f    pChange->aReco
2b520 72 64 2c 20 70 43 68 61 6e 67 65 2d 3e 6e 52 65  rd, pChange->nRe
2b530 63 6f 72 64 2c 20 26 72 63 0a 20 20 20 20 20 20  cord, &rc.      
2b540 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2b550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b570 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
2b580 65 6e 64 50 61 72 74 69 61 6c 55 70 64 61 74 65  endPartialUpdate
2b590 28 26 73 4f 75 74 2c 20 70 49 74 65 72 2c 0a 20  (&sOut, pIter,. 
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2b5b0 52 65 63 2c 20 6e 52 65 63 2c 20 70 43 68 61 6e  Rec, nRec, pChan
2b5c0 67 65 2d 3e 61 52 65 63 6f 72 64 2c 20 70 43 68  ge->aRecord, pCh
2b5d0 61 6e 67 65 2d 3e 6e 52 65 63 6f 72 64 2c 20 26  ange->nRecord, &
2b5e0 72 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  rc.            )
2b5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2b610 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2b620 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b630 74 28 20 70 49 74 65 72 2d 3e 6f 70 3d 3d 53 51  t( pIter->op==SQ
2b640 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 20  LITE_DELETE );. 
2b650 20 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d           bDone =
2b660 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   1;.          if
2b670 28 20 70 43 68 61 6e 67 65 2d 3e 6f 70 3d 3d 53  ( pChange->op==S
2b680 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 7b 0a  QLITE_INSERT ){.
2b690 20 20 20 20 20 20 20 20 20 20 20 20 73 65 73 73              sess
2b6a0 69 6f 6e 41 70 70 65 6e 64 42 79 74 65 28 26 73  ionAppendByte(&s
2b6b0 4f 75 74 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  Out, SQLITE_DELE
2b6c0 54 45 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  TE, &rc);.      
2b6d0 20 20 20 20 20 20 73 65 73 73 69 6f 6e 41 70 70        sessionApp
2b6e0 65 6e 64 42 79 74 65 28 26 73 4f 75 74 2c 20 70  endByte(&sOut, p
2b6f0 49 74 65 72 2d 3e 62 49 6e 64 69 72 65 63 74 2c  Iter->bIndirect,
2b700 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
2b710 20 20 20 73 65 73 73 69 6f 6e 41 70 70 65 6e 64     sessionAppend
2b720 52 65 63 6f 72 64 4d 65 72 67 65 28 26 73 4f 75  RecordMerge(&sOu
2b730 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2c 0a  t, pIter->nCol,.
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b750 70 43 68 61 6e 67 65 2d 3e 61 52 65 63 6f 72 64  pChange->aRecord
2b760 2c 20 70 43 68 61 6e 67 65 2d 3e 6e 52 65 63 6f  , pChange->nReco
2b770 72 64 2c 20 61 52 65 63 2c 20 6e 52 65 63 2c 20  rd, aRec, nRec, 
2b780 26 72 63 0a 20 20 20 20 20 20 20 20 20 20 20 20  &rc.            
2b790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2b7a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2b7c0 20 20 20 69 66 28 20 62 44 6f 6e 65 3d 3d 30 20     if( bDone==0 
2b7d0 29 7b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e  ){.      session
2b7e0 41 70 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74  AppendByte(&sOut
2b7f0 2c 20 70 49 74 65 72 2d 3e 6f 70 2c 20 26 72 63  , pIter->op, &rc
2b800 29 3b 0a 20 20 20 20 20 20 73 65 73 73 69 6f 6e  );.      session
2b810 41 70 70 65 6e 64 42 79 74 65 28 26 73 4f 75 74  AppendByte(&sOut
2b820 2c 20 70 49 74 65 72 2d 3e 62 49 6e 64 69 72 65  , pIter->bIndire
2b830 63 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ct, &rc);.      
2b840 73 65 73 73 69 6f 6e 41 70 70 65 6e 64 42 6c 6f  sessionAppendBlo
2b850 62 28 26 73 4f 75 74 2c 20 61 52 65 63 2c 20 6e  b(&sOut, aRec, n
2b860 52 65 63 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  Rec, &rc);.    }
2b870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b880 49 54 45 5f 4f 4b 20 26 26 20 78 4f 75 74 70 75  ITE_OK && xOutpu
2b890 74 20 26 26 20 73 4f 75 74 2e 6e 42 75 66 3e 73  t && sOut.nBuf>s
2b8a0 65 73 73 69 6f 6e 73 5f 73 74 72 6d 5f 63 68 75  essions_strm_chu
2b8b0 6e 6b 5f 73 69 7a 65 20 29 7b 0a 20 20 20 20 20  nk_size ){.     
2b8c0 20 72 63 20 3d 20 78 4f 75 74 70 75 74 28 70 4f   rc = xOutput(pO
2b8d0 75 74 2c 20 73 4f 75 74 2e 61 42 75 66 2c 20 73  ut, sOut.aBuf, s
2b8e0 4f 75 74 2e 6e 42 75 66 29 3b 0a 20 20 20 20 20  Out.nBuf);.     
2b8f0 20 73 4f 75 74 2e 6e 42 75 66 20 3d 20 30 3b 0a   sOut.nBuf = 0;.
2b900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b910 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
2b920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b930 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2b940 33 5f 66 72 65 65 28 73 4f 75 74 2e 61 42 75 66  3_free(sOut.aBuf
2b950 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
2b960 4f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Out, 0, sizeof(s
2b970 4f 75 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Out));.  }..  if
2b980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b990 29 7b 0a 20 20 20 20 69 66 28 20 78 4f 75 74 70  ){.    if( xOutp
2b9a0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ut ){.      if( 
2b9b0 73 4f 75 74 2e 6e 42 75 66 3e 30 20 29 7b 0a 20  sOut.nBuf>0 ){. 
2b9c0 20 20 20 20 20 20 20 72 63 20 3d 20 78 4f 75 74         rc = xOut
2b9d0 70 75 74 28 70 4f 75 74 2c 20 73 4f 75 74 2e 61  put(pOut, sOut.a
2b9e0 42 75 66 2c 20 73 4f 75 74 2e 6e 42 75 66 29 3b  Buf, sOut.nBuf);
2b9f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ba00 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75 74  se{.      *ppOut
2ba10 20 3d 20 28 76 6f 69 64 2a 29 73 4f 75 74 2e 61   = (void*)sOut.a
2ba20 42 75 66 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 75  Buf;.      *pnOu
2ba30 74 20 3d 20 73 4f 75 74 2e 6e 42 75 66 3b 0a 20  t = sOut.nBuf;. 
2ba40 20 20 20 20 20 73 4f 75 74 2e 61 42 75 66 20 3d       sOut.aBuf =
2ba50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2ba60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 4f 75  sqlite3_free(sOu
2ba70 74 2e 61 42 75 66 29 3b 0a 20 20 72 65 74 75 72  t.aBuf);.  retur
2ba80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
2ba90 43 72 65 61 74 65 20 61 20 6e 65 77 20 72 65 62  Create a new reb
2baa0 61 73 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  aser object..*/.
2bab0 69 6e 74 20 73 71 6c 69 74 65 33 72 65 62 61 73  int sqlite3rebas
2bac0 65 72 5f 63 72 65 61 74 65 28 73 71 6c 69 74 65  er_create(sqlite
2bad0 33 5f 72 65 62 61 73 65 72 20 2a 2a 70 70 4e 65  3_rebaser **ppNe
2bae0 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  w){.  int rc = S
2baf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
2bb00 74 65 33 5f 72 65 62 61 73 65 72 20 2a 70 4e 65  te3_rebaser *pNe
2bb10 77 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  w;..  pNew = sql
2bb20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2bb30 6f 66 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73  of(sqlite3_rebas
2bb40 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  er));.  if( pNew
2bb50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2bb60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bb70 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
2bb80 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
2bb90 66 28 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65  f(sqlite3_rebase
2bba0 72 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 4e 65  r));.  }.  *ppNe
2bbb0 77 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  w = pNew;.  retu
2bbc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
2bbd0 20 43 61 6c 6c 20 74 68 69 73 20 6f 6e 65 20 6f   Call this one o
2bbe0 72 20 6d 6f 72 65 20 74 69 6d 65 73 20 74 6f 20  r more times to 
2bbf0 63 6f 6e 66 69 67 75 72 65 20 61 20 72 65 62 61  configure a reba
2bc00 73 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ser..*/.int sqli
2bc10 74 65 33 72 65 62 61 73 65 72 5f 63 6f 6e 66 69  te3rebaser_confi
2bc20 67 75 72 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  gure(.  sqlite3_
2bc30 72 65 62 61 73 65 72 20 2a 70 2c 20 0a 20 20 69  rebaser *p, .  i
2bc40 6e 74 20 6e 52 65 62 61 73 65 2c 20 63 6f 6e 73  nt nRebase, cons
2bc50 74 20 76 6f 69 64 20 2a 70 52 65 62 61 73 65 0a  t void *pRebase.
2bc60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61  ){.  sqlite3_cha
2bc70 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74  ngeset_iter *pIt
2bc80 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 49 74 65  er = 0;   /* Ite
2bc90 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20  rator opened on 
2bca0 70 44 61 74 61 2f 6e 44 61 74 61 20 2a 2f 0a 20  pData/nData */. 
2bcb0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcd0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bce0 63 6f 64 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73  code */.  rc = s
2bcf0 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
2bd00 73 74 61 72 74 28 26 70 49 74 65 72 2c 20 6e 52  start(&pIter, nR
2bd10 65 62 61 73 65 2c 20 28 76 6f 69 64 2a 29 70 52  ebase, (void*)pR
2bd20 65 62 61 73 65 29 3b 0a 20 20 69 66 28 20 72 63  ebase);.  if( rc
2bd30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bd40 20 20 20 72 63 20 3d 20 73 65 73 73 69 6f 6e 43     rc = sessionC
2bd50 68 61 6e 67 65 73 65 74 54 6f 48 61 73 68 28 70  hangesetToHash(p
2bd60 49 74 65 72 2c 20 26 70 2d 3e 67 72 70 2c 20 31  Iter, &p->grp, 1
2bd70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2bd80 63 68 61 6e 67 65 73 65 74 5f 66 69 6e 61 6c 69  changeset_finali
2bd90 7a 65 28 70 49 74 65 72 29 3b 0a 20 20 72 65 74  ze(pIter);.  ret
2bda0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
2bdb0 2a 20 52 65 62 61 73 65 20 61 20 63 68 61 6e 67  * Rebase a chang
2bdc0 65 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20 74  eset according t
2bdd0 6f 20 63 75 72 72 65 6e 74 20 72 65 62 61 73 65  o current rebase
2bde0 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
2bdf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
2be00 65 62 61 73 65 72 5f 72 65 62 61 73 65 28 0a 20  ebaser_rebase(. 
2be10 20 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72   sqlite3_rebaser
2be20 20 2a 70 2c 0a 20 20 69 6e 74 20 6e 49 6e 2c 20   *p,.  int nIn, 
2be30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 49 6e 2c  const void *pIn,
2be40 20 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20   .  int *pnOut, 
2be50 76 6f 69 64 20 2a 2a 70 70 4f 75 74 20 0a 29 7b  void **ppOut .){
2be60 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  .  sqlite3_chang
2be70 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72  eset_iter *pIter
2be80 20 3d 20 30 3b 20 20 20 2f 2a 20 49 74 65 72 61   = 0;   /* Itera
2be90 74 6f 72 20 74 6f 20 73 6b 69 70 20 74 68 72 6f  tor to skip thro
2bea0 75 67 68 20 69 6e 70 75 74 20 2a 2f 20 20 0a 20  ugh input */  . 
2beb0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2bec0 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72 74  3changeset_start
2bed0 28 26 70 49 74 65 72 2c 20 6e 49 6e 2c 20 28 76  (&pIter, nIn, (v
2bee0 6f 69 64 2a 29 70 49 6e 29 3b 0a 0a 20 20 69 66  oid*)pIn);..  if
2bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bf00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 73 73  ){.    rc = sess
2bf10 69 6f 6e 52 65 62 61 73 65 28 70 2c 20 70 49 74  ionRebase(p, pIt
2bf20 65 72 2c 20 30 2c 20 30 2c 20 70 6e 4f 75 74 2c  er, 0, 0, pnOut,
2bf30 20 70 70 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c   ppOut);.    sql
2bf40 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69  ite3changeset_fi
2bf50 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20  nalize(pIter);. 
2bf60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2bf70 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 62 61 73  .}../* .** Rebas
2bf80 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 61 63  e a changeset ac
2bf90 63 6f 72 64 69 6e 67 20 74 6f 20 63 75 72 72 65  cording to curre
2bfa0 6e 74 20 72 65 62 61 73 65 72 20 63 6f 6e 66 69  nt rebaser confi
2bfb0 67 75 72 61 74 69 6f 6e 20 0a 2a 2f 0a 69 6e 74  guration .*/.int
2bfc0 20 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f   sqlite3rebaser_
2bfd0 72 65 62 61 73 65 5f 73 74 72 6d 28 0a 20 20 73  rebase_strm(.  s
2bfe0 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 20 2a  qlite3_rebaser *
2bff0 70 2c 0a 20 20 69 6e 74 20 28 2a 78 49 6e 70 75  p,.  int (*xInpu
2c000 74 29 28 76 6f 69 64 20 2a 70 49 6e 2c 20 76 6f  t)(void *pIn, vo
2c010 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 2a  id *pData, int *
2c020 70 6e 44 61 74 61 29 2c 0a 20 20 76 6f 69 64 20  pnData),.  void 
2c030 2a 70 49 6e 2c 0a 20 20 69 6e 74 20 28 2a 78 4f  *pIn,.  int (*xO
2c040 75 74 70 75 74 29 28 76 6f 69 64 20 2a 70 4f 75  utput)(void *pOu
2c050 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
2c060 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
2c070 2c 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 0a 29  ,.  void *pOut.)
2c080 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  {.  sqlite3_chan
2c090 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74 65  geset_iter *pIte
2c0a0 72 20 3d 20 30 3b 20 20 20 2f 2a 20 49 74 65 72  r = 0;   /* Iter
2c0b0 61 74 6f 72 20 74 6f 20 73 6b 69 70 20 74 68 72  ator to skip thr
2c0c0 6f 75 67 68 20 69 6e 70 75 74 20 2a 2f 20 20 0a  ough input */  .
2c0d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2c0e0 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72  e3changeset_star
2c0f0 74 5f 73 74 72 6d 28 26 70 49 74 65 72 2c 20 78  t_strm(&pIter, x
2c100 49 6e 70 75 74 2c 20 70 49 6e 29 3b 0a 0a 20 20  Input, pIn);..  
2c110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c120 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  K ){.    rc = se
2c130 73 73 69 6f 6e 52 65 62 61 73 65 28 70 2c 20 70  ssionRebase(p, p
2c140 49 74 65 72 2c 20 78 4f 75 74 70 75 74 2c 20 70  Iter, xOutput, p
2c150 4f 75 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Out, 0, 0);.    
2c160 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
2c170 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29  _finalize(pIter)
2c180 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2c190 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 44 65  rc;.}../* .** De
2c1a0 73 74 72 6f 79 20 61 20 72 65 62 61 73 65 72 20  stroy a rebaser 
2c1b0 6f 62 6a 65 63 74 20 0a 2a 2f 0a 76 6f 69 64 20  object .*/.void 
2c1c0 73 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 64  sqlite3rebaser_d
2c1d0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 72 65  elete(sqlite3_re
2c1e0 62 61 73 65 72 20 2a 70 29 7b 0a 20 20 69 66 28  baser *p){.  if(
2c1f0 20 70 20 29 7b 0a 20 20 20 20 73 65 73 73 69 6f   p ){.    sessio
2c200 6e 44 65 6c 65 74 65 54 61 62 6c 65 28 70 2d 3e  nDeleteTable(p->
2c210 67 72 70 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  grp.pList);.    
2c220 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
2c230 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47  .  }.}../* .** G
2c240 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2c250 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
2c260 65 33 73 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67  e3session_config
2c270 28 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70  (int op, void *p
2c280 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
2c290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 77   SQLITE_OK;.  sw
2c2a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
2c2b0 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 53 53  case SQLITE_SESS
2c2c0 49 4f 4e 5f 43 4f 4e 46 49 47 5f 53 54 52 4d 53  ION_CONFIG_STRMS
2c2d0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
2c2e0 20 2a 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29 70   *pInt = (int*)p
2c2f0 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  Arg;.      if( *
2c300 70 49 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  pInt>0 ){.      
2c310 20 20 73 65 73 73 69 6f 6e 73 5f 73 74 72 6d 5f    sessions_strm_
2c320 63 68 75 6e 6b 5f 73 69 7a 65 20 3d 20 2a 70 49  chunk_size = *pI
2c330 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nt;.      }.    
2c340 20 20 2a 70 49 6e 74 20 3d 20 73 65 73 73 69 6f    *pInt = sessio
2c350 6e 73 5f 73 74 72 6d 5f 63 68 75 6e 6b 5f 73 69  ns_strm_chunk_si
2c360 7a 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ze;.      break;
2c370 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
2c380 6c 74 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lt:.      rc = S
2c390 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
2c3a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
2c3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2c3c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c3d0 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 20 26  ENABLE_SESSION &
2c3e0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2c3f0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
2c400 2f 0a                                            /.