/ Hex Artifact Content
Login

Artifact 9447482597c7569e49b3db152a300920a4b634d5de86508a94e4338df99b3fda:


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 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
0020: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0030: 4c 45 5f 53 45 53 53 49 4f 4e 29 20 5c 0a 20 26  LE_SESSION) \. &
0040: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
0050: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
0060: 45 5f 48 4f 4f 4b 29 0a 0a 23 69 6e 63 6c 75 64  E_HOOK)..#includ
0070: 65 20 22 73 71 6c 69 74 65 33 73 65 73 73 69 6f  e "sqlite3sessio
0080: 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  n.h".#include <a
0090: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
00a0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 66  e <string.h>.#if
00b0: 20 64 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45   defined(INCLUDE
00c0: 5f 53 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23  _SQLITE_TCL_H).#
00d0: 20 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74    include "sqlit
00e0: 65 5f 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23  e_tcl.h".#else.#
00f0: 20 20 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68    include "tcl.h
0100: 22 0a 23 20 20 69 66 6e 64 65 66 20 53 51 4c 49  ".#  ifndef SQLI
0110: 54 45 5f 54 43 4c 41 50 49 0a 23 20 20 20 20 64  TE_TCLAPI.#    d
0120: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c  efine SQLITE_TCL
0130: 41 50 49 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  API.#  endif.#en
0140: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
0150: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
0160: 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 67  .  typedef unsig
0170: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65 6e  ned char u8;.#en
0180: 64 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72  dif..typedef str
0190: 75 63 74 20 54 65 73 74 53 65 73 73 69 6f 6e 20  uct TestSession 
01a0: 54 65 73 74 53 65 73 73 69 6f 6e 3b 0a 73 74 72  TestSession;.str
01b0: 75 63 74 20 54 65 73 74 53 65 73 73 69 6f 6e 20  uct TestSession 
01c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  {.  sqlite3_sess
01d0: 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 3b 0a 20  ion *pSession;. 
01e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
01f0: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
0200: 70 46 69 6c 74 65 72 53 63 72 69 70 74 3b 0a 7d  pFilterScript;.}
0210: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
0220: 74 20 54 65 73 74 53 74 72 65 61 6d 49 6e 70 75  t TestStreamInpu
0230: 74 20 54 65 73 74 53 74 72 65 61 6d 49 6e 70 75  t TestStreamInpu
0240: 74 3b 0a 73 74 72 75 63 74 20 54 65 73 74 53 74  t;.struct TestSt
0250: 72 65 61 6d 49 6e 70 75 74 20 7b 0a 20 20 69 6e  reamInput {.  in
0260: 74 20 6e 53 74 72 65 61 6d 3b 20 20 20 20 20 20  t nStream;      
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0280: 20 4d 61 78 69 6d 75 6d 20 63 68 75 6e 6b 20 73   Maximum chunk s
0290: 69 7a 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ize */.  unsigne
02a0: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20  d char *aData;  
02b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
02c0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
02d0: 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20 2a 2f  ntaining data */
02e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
0310: 66 66 65 72 20 61 44 61 74 61 20 69 6e 20 62 79  ffer aData in by
0320: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  tes */.  int iDa
0330: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
0340: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
0350: 73 20 6f 66 20 64 61 74 61 20 61 6c 72 65 61 64  s of data alread
0360: 79 20 72 65 61 64 20 62 79 20 73 65 73 73 69 6f  y read by sessio
0370: 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ns */.};../*.** 
0380: 45 78 74 72 61 63 74 20 61 6e 20 73 71 6c 69 74  Extract an sqlit
0390: 65 33 2a 20 64 62 20 68 61 6e 64 6c 65 20 66 72  e3* db handle fr
03a0: 6f 6d 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  om the object pa
03b0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
03c0: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  nd.** argument. 
03d0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
03e0: 65 74 20 2a 70 44 62 20 74 6f 20 70 6f 69 6e 74  et *pDb to point
03f0: 20 74 6f 20 74 68 65 20 64 62 20 68 61 6e 64 6c   to the db handl
0400: 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
0410: 54 43 4c 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  TCL_OK. Otherwis
0420: 65 2c 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  e, return TCL_ER
0430: 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
0440: 6e 74 20 64 62 48 61 6e 64 6c 65 46 72 6f 6d 4f  nt dbHandleFromO
0450: 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  bj(Tcl_Interp *i
0460: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a  nterp, Tcl_Obj *
0470: 70 4f 62 6a 2c 20 73 71 6c 69 74 65 33 20 2a 2a  pObj, sqlite3 **
0480: 70 44 62 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  pDb){.  Tcl_CmdI
0490: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
04a0: 30 3d 3d 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  0==Tcl_GetComman
04b0: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
04c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 4f 62 6a  l_GetString(pObj
04d0: 29 2c 20 26 69 6e 66 6f 29 20 29 7b 0a 20 20 20  ), &info) ){.   
04e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
04f0: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75  t(interp, "no su
0500: 63 68 20 68 61 6e 64 6c 65 3a 20 22 2c 20 54 63  ch handle: ", Tc
0510: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 4f 62 6a  l_GetString(pObj
0520: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
0530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0540: 0a 0a 20 20 2a 70 44 62 20 3d 20 2a 28 73 71 6c  ..  *pDb = *(sql
0550: 69 74 65 33 20 2a 2a 29 69 6e 66 6f 2e 6f 62 6a  ite3 **)info.obj
0560: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 72 65  ClientData;.  re
0570: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0580: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
05d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
05e0: 20 69 73 20 63 6f 70 69 65 64 20 62 79 74 65 2d   is copied byte-
05f0: 66 6f 72 2d 62 79 74 65 20 66 72 6f 6d 20 74 68  for-byte from th
0600: 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c  e sessions modul
0610: 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69  e.** documentati
0620: 6f 6e 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  on.  It is used 
0630: 62 79 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73  by some of the s
0640: 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c 65 73 20  essions modules 
0650: 74 65 73 74 73 20 74 6f 0a 2a 2a 20 65 6e 73 75  tests to.** ensu
0660: 72 65 20 74 68 61 74 20 74 68 65 20 65 78 61 6d  re that the exam
0670: 70 6c 65 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ple in the docum
0680: 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 61 63  entation does ac
0690: 74 75 61 6c 6c 79 20 77 6f 72 6b 2e 0a 2a 2f 20  tually work..*/ 
06a0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
06b0: 7a 53 71 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61  zSql points to a
06c0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
06d0: 6e 67 20 61 6e 20 53 51 4c 20 73 63 72 69 70 74  ng an SQL script
06e0: 20 74 6f 20 65 78 65 63 75 74 65 20 0a 2a 2a 20   to execute .** 
06f0: 61 67 61 69 6e 73 74 20 74 68 65 20 64 61 74 61  against the data
0700: 62 61 73 65 20 68 61 6e 64 6c 65 20 70 61 73 73  base handle pass
0710: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
0720: 61 72 67 75 6d 65 6e 74 2e 20 41 73 20 77 65 6c  argument. As wel
0730: 6c 20 61 73 0a 2a 2a 20 65 78 65 63 75 74 69 6e  l as.** executin
0740: 67 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74  g the SQL script
0750: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
0760: 63 6f 6c 6c 65 63 74 73 20 61 20 63 68 61 6e 67  collects a chang
0770: 65 73 65 74 20 72 65 63 6f 72 64 69 6e 67 0a 2a  eset recording.*
0780: 2a 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 6d 61  * all changes ma
0790: 64 65 20 74 6f 20 74 68 65 20 22 6d 61 69 6e 22  de to the "main"
07a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
07b0: 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
07c0: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 6f 75 74  r occurs,.** out
07d0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 28 2a  put variables (*
07e0: 70 70 43 68 61 6e 67 65 73 65 74 29 20 61 6e 64  ppChangeset) and
07f0: 20 28 2a 70 6e 43 68 61 6e 67 65 73 65 74 29 20   (*pnChangeset) 
0800: 61 72 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  are set to point
0810: 0a 2a 2a 20 74 6f 20 61 20 62 75 66 66 65 72 20  .** to a buffer 
0820: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
0830: 68 61 6e 67 65 73 65 74 20 61 6e 64 20 74 68 65  hangeset and the
0840: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 68 61   size of the cha
0850: 6e 67 65 73 65 74 20 69 6e 0a 2a 2a 20 62 79 74  ngeset in.** byt
0860: 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  es before return
0870: 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
0880: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
0890: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
08a0: 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63  lity.** of the c
08b0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
08c0: 6c 6c 79 20 66 72 65 65 20 74 68 65 20 63 68 61  lly free the cha
08d0: 6e 67 65 73 65 74 20 62 6c 6f 62 20 62 79 20 70  ngeset blob by p
08e0: 61 73 73 69 6e 67 20 69 74 20 74 6f 0a 2a 2a 20  assing it to.** 
08f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65  the sqlite3_free
0900: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
0910: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
0920: 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
0930: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
0940: 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
0950: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
0960: 28 2a 70 43 68 61 6e 67 65 73 65 74 29 20 61 6e  (*pChangeset) an
0970: 64 20 28 2a 70 6e 43 68 61 6e 67 65 73 65 74 29  d (*pnChangeset)
0980: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
0990: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
09a0: 69 6e 74 20 73 71 6c 5f 65 78 65 63 5f 63 68 61  int sql_exec_cha
09b0: 6e 67 65 73 65 74 28 0a 20 20 73 71 6c 69 74 65  ngeset(.  sqlite
09c0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
09d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
09e0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
09f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
0a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
0a10: 20 53 51 4c 20 73 63 72 69 70 74 20 74 6f 20 65   SQL script to e
0a20: 78 65 63 75 74 65 20 2a 2f 0a 20 20 69 6e 74 20  xecute */.  int 
0a30: 2a 70 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20  *pnChangeset,   
0a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
0a50: 3a 20 53 69 7a 65 20 6f 66 20 63 68 61 6e 67 65  : Size of change
0a60: 73 65 74 20 62 6c 6f 62 20 69 6e 20 62 79 74 65  set blob in byte
0a70: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  s */.  void **pp
0a80: 43 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20  Changeset       
0a90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
0aa0: 6e 74 65 72 20 74 6f 20 63 68 61 6e 67 65 73 65  nter to changese
0ab0: 74 20 62 6c 6f 62 20 2a 2f 0a 29 7b 0a 20 20 73  t blob */.){.  s
0ac0: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
0ad0: 70 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 20 20  pSession = 0;.  
0ae0: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 43 72  int rc;..  /* Cr
0af0: 65 61 74 65 20 61 20 6e 65 77 20 73 65 73 73 69  eate a new sessi
0b00: 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 72  on object */.  r
0b10: 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
0b20: 6f 6e 5f 63 72 65 61 74 65 28 64 62 2c 20 22 6d  on_create(db, "m
0b30: 61 69 6e 22 2c 20 26 70 53 65 73 73 69 6f 6e 29  ain", &pSession)
0b40: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;..  /* Configur
0b50: 65 20 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 62  e the session ob
0b60: 6a 65 63 74 20 74 6f 20 72 65 63 6f 72 64 20 63  ject to record c
0b70: 68 61 6e 67 65 73 20 74 6f 20 61 6c 6c 20 74 61  hanges to all ta
0b80: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 72 63  bles */.  if( rc
0b90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
0ba0: 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
0bb0: 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
0bc0: 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  n, NULL);..  /* 
0bd0: 45 78 65 63 75 74 65 20 74 68 65 20 53 51 4c 20  Execute the SQL 
0be0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 66 28 20  script */.  if( 
0bf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
0c00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
0c10: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  c(db, zSql, 0, 0
0c20: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6c 6c  , 0);..  /* Coll
0c30: 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 65  ect the changese
0c40: 74 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  t */.  if( rc==S
0c50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0c60: 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  rc = sqlite3sess
0c70: 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53  ion_changeset(pS
0c80: 65 73 73 69 6f 6e 2c 20 70 6e 43 68 61 6e 67 65  ession, pnChange
0c90: 73 65 74 2c 20 70 70 43 68 61 6e 67 65 73 65 74  set, ppChangeset
0ca0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
0cb0: 65 74 65 20 74 68 65 20 73 65 73 73 69 6f 6e 20  ete the session 
0cc0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
0cd0: 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74  te3session_delet
0ce0: 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 0a 20 20  e(pSession);..  
0cf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d40: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
0d50: 63 6c 63 6d 64 3a 20 73 71 6c 5f 65 78 65 63 5f  clcmd: sql_exec_
0d60: 63 68 61 6e 67 65 73 65 74 20 44 42 20 53 51 4c  changeset DB SQL
0d70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
0d80: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
0d90: 74 5f 73 71 6c 5f 65 78 65 63 5f 63 68 61 6e 67  t_sql_exec_chang
0da0: 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
0db0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0dc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0dd0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0de0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0df0: 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
0e00: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71  char *zSql;.  sq
0e10: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 76 6f 69  lite3 *db;.  voi
0e20: 64 20 2a 70 43 68 61 6e 67 65 73 65 74 3b 0a 20  d *pChangeset;. 
0e30: 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 3b   int nChangeset;
0e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
0e50: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
0e60: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
0e70: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
0e80: 76 2c 20 22 44 42 20 53 51 4c 22 29 3b 0a 20 20  v, "DB SQL");.  
0e90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0ea0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  OR;.  }.  if( db
0eb0: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
0ec0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
0ed0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
0ee0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
0ef0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 54 63   (const char*)Tc
0f00: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
0f10: 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [2]);..  rc = sq
0f20: 6c 5f 65 78 65 63 5f 63 68 61 6e 67 65 73 65 74  l_exec_changeset
0f30: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 6e 43 68 61  (db, zSql, &nCha
0f40: 6e 67 65 73 65 74 2c 20 26 70 43 68 61 6e 67 65  ngeset, &pChange
0f50: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  set);.  if( rc!=
0f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
0f70: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
0f80: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
0f90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0fa0: 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20 69 6e  nterp, "error in
0fb0: 20 73 71 6c 5f 65 78 65 63 5f 63 68 61 6e 67 65   sql_exec_change
0fc0: 73 65 74 28 29 22 2c 20 30 29 3b 0a 20 20 20 20  set()", 0);.    
0fd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0fe0: 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 53 65 74  ;.  }..  Tcl_Set
0ff0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1000: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
1010: 61 79 4f 62 6a 28 70 43 68 61 6e 67 65 73 65 74  ayObj(pChangeset
1020: 2c 20 6e 43 68 61 6e 67 65 73 65 74 29 29 3b 0a  , nChangeset));.
1030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1040: 43 68 61 6e 67 65 73 65 74 29 3b 0a 20 20 72 65  Changeset);.  re
1050: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1060: 0a 0a 23 64 65 66 69 6e 65 20 53 45 53 53 49 4f  ..#define SESSIO
1070: 4e 5f 53 54 52 45 41 4d 5f 54 43 4c 5f 56 41 52  N_STREAM_TCL_VAR
1080: 20 22 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   "sqlite3session
1090: 5f 73 74 72 65 61 6d 73 22 0a 0a 2f 2a 0a 2a 2a  _streams"../*.**
10a0: 20 41 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64   Attempt to find
10b0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
10c0: 61 62 6c 65 20 7a 56 61 72 20 77 69 74 68 69 6e  able zVar within
10d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 74   interpreter int
10e0: 65 72 70 0a 2a 2a 20 61 6e 64 20 65 78 74 72 61  erp.** and extra
10f0: 63 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ct an integer va
1100: 6c 75 65 20 66 72 6f 6d 20 69 74 2e 20 52 65 74  lue from it. Ret
1110: 75 72 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 0a  urn this value..
1120: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
1130: 65 64 20 76 61 72 69 61 62 6c 65 20 63 61 6e 6e  ed variable cann
1140: 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 6f 72 20  ot be found, or 
1150: 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  if it cannot be 
1160: 69 6e 74 65 72 70 72 65 74 65 64 0a 2a 2a 20 61  interpreted.** a
1170: 73 20 61 20 69 6e 74 65 67 65 72 2c 20 72 65 74  s a integer, ret
1180: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
1190: 20 69 6e 74 20 74 65 73 74 5f 74 63 6c 5f 69 6e   int test_tcl_in
11a0: 74 65 67 65 72 28 54 63 6c 5f 49 6e 74 65 72 70  teger(Tcl_Interp
11b0: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
11c0: 63 68 61 72 20 2a 7a 56 61 72 29 7b 0a 20 20 54  char *zVar){.  T
11d0: 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20  cl_Obj *pObj;.  
11e0: 69 6e 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  int iVal = 0;.  
11f0: 70 4f 62 6a 20 3d 20 54 63 6c 5f 4f 62 6a 47 65  pObj = Tcl_ObjGe
1200: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 54 63  tVar2(interp, Tc
1210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1220: 56 61 72 2c 20 2d 31 29 2c 20 30 2c 20 54 43 4c  Var, -1), 0, TCL
1230: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1240: 20 69 66 28 20 70 4f 62 6a 20 29 20 54 63 6c 5f   if( pObj ) Tcl_
1250: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
1260: 20 70 4f 62 6a 2c 20 26 69 56 61 6c 29 3b 0a 20   pObj, &iVal);. 
1270: 20 72 65 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a   return iVal;.}.
1280: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1290: 5f 73 65 73 73 69 6f 6e 5f 65 72 72 6f 72 28 54  _session_error(T
12a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12b0: 70 2c 20 69 6e 74 20 72 63 2c 20 63 68 61 72 20  p, int rc, char 
12c0: 2a 7a 45 72 72 29 7b 0a 20 20 65 78 74 65 72 6e  *zErr){.  extern
12d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
12e0: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29  ite3ErrName(int)
12f0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
1320: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1330: 2c 20 2d 31 29 29 3b 0a 20 20 69 66 28 20 7a 45  , -1));.  if( zE
1340: 72 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  rr ){.    Tcl_Ap
1350: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1360: 70 2c 20 22 20 2d 20 22 2c 20 7a 45 72 72 2c 20  p, " - ", zErr, 
1370: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1380: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 7d 0a  free(zErr);.  }.
1390: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13a0: 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OR;.}..static in
13b0: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 66 69 6c  t test_table_fil
13c0: 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ter(void *pCtx, 
13d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
13e0: 29 7b 0a 20 20 54 65 73 74 53 65 73 73 69 6f 6e  ){.  TestSession
13f0: 20 2a 70 20 3d 20 28 54 65 73 74 53 65 73 73 69   *p = (TestSessi
1400: 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f  on*)pCtx;.  Tcl_
1410: 4f 62 6a 20 2a 70 45 76 61 6c 3b 0a 20 20 69 6e  Obj *pEval;.  in
1420: 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 52 65 73  t rc;.  int bRes
1430: 20 3d 20 30 3b 0a 0a 20 20 70 45 76 61 6c 20 3d   = 0;..  pEval =
1440: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1450: 6a 28 70 2d 3e 70 46 69 6c 74 65 72 53 63 72 69  j(p->pFilterScri
1460: 70 74 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  pt);.  Tcl_IncrR
1470: 65 66 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b 0a  efCount(pEval);.
1480: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
1490: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76 61 6c  p->interp, pEval
14b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14c0: 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zTbl, -1));. 
14d0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
14e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  ){.    rc = Tcl_
14f0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
1500: 65 72 70 2c 20 70 45 76 61 6c 2c 20 54 43 4c 5f  erp, pEval, TCL_
1510: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
1520: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  }.  if( rc==TCL_
1530: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 54  OK ){.    rc = T
1540: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1550: 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20  mObj(p->interp, 
1560: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
1570: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 62 52  (p->interp), &bR
1580: 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  es);.  }.  if( r
1590: 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c!=TCL_OK ){.   
15a0: 20 2f 2a 20 70 72 69 6e 74 66 28 22 65 72 72 6f   /* printf("erro
15b0: 72 3a 20 25 73 5c 6e 22 2c 20 54 63 6c 5f 47 65  r: %s\n", Tcl_Ge
15c0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
15d0: 3e 69 6e 74 65 72 70 29 29 3b 20 2a 2f 0a 20 20  >interp)); */.  
15e0: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
15f0: 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29  Error(p->interp)
1600: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72  ;.  }.  Tcl_Decr
1610: 52 65 66 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b  RefCount(pEval);
1620: 0a 0a 20 20 72 65 74 75 72 6e 20 62 52 65 73 3b  ..  return bRes;
1630: 0a 7d 0a 0a 73 74 72 75 63 74 20 54 65 73 74 53  .}..struct TestS
1640: 65 73 73 69 6f 6e 73 42 6c 6f 62 20 7b 0a 20 20  essionsBlob {.  
1650: 76 6f 69 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  void *p;.  int n
1660: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
1670: 75 63 74 20 54 65 73 74 53 65 73 73 69 6f 6e 73  uct TestSessions
1680: 42 6c 6f 62 20 54 65 73 74 53 65 73 73 69 6f 6e  Blob TestSession
1690: 73 42 6c 6f 62 3b 0a 0a 73 74 61 74 69 63 20 69  sBlob;..static i
16a0: 6e 74 20 74 65 73 74 53 74 72 65 61 6d 4f 75 74  nt testStreamOut
16b0: 70 75 74 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  put(.  void *pCt
16c0: 78 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  x,.  const void 
16d0: 2a 70 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 44  *pData,.  int nD
16e0: 61 74 61 0a 29 7b 0a 20 20 54 65 73 74 53 65 73  ata.){.  TestSes
16f0: 73 69 6f 6e 73 42 6c 6f 62 20 2a 70 42 6c 6f 62  sionsBlob *pBlob
1700: 20 3d 20 28 54 65 73 74 53 65 73 73 69 6f 6e 73   = (TestSessions
1710: 42 6c 6f 62 2a 29 70 43 74 78 3b 0a 20 20 63 68  Blob*)pCtx;.  ch
1720: 61 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73  ar *pNew;..  ass
1730: 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a  ert( nData>0 );.
1740: 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 29    pNew = (char*)
1750: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1760: 70 42 6c 6f 62 2d 3e 70 2c 20 70 42 6c 6f 62 2d  pBlob->p, pBlob-
1770: 3e 6e 20 2b 20 6e 44 61 74 61 29 3b 0a 20 20 69  >n + nData);.  i
1780: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17a0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 42 6c  NOMEM;.  }.  pBl
17b0: 6f 62 2d 3e 70 20 3d 20 28 76 6f 69 64 2a 29 70  ob->p = (void*)p
17c0: 4e 65 77 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  New;.  memcpy(&p
17d0: 4e 65 77 5b 70 42 6c 6f 62 2d 3e 6e 5d 2c 20 70  New[pBlob->n], p
17e0: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
17f0: 70 42 6c 6f 62 2d 3e 6e 20 2b 3d 20 6e 44 61 74  pBlob->n += nDat
1800: 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  a;.  return SQLI
1810: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1820: 54 63 6c 63 6d 64 3a 20 20 24 73 65 73 73 69 6f  Tclcmd:  $sessio
1830: 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a 2a  n attach TABLE.*
1840: 2a 20 20 20 20 20 20 20 20 20 20 24 73 65 73 73  *          $sess
1850: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 0a 2a 2a  ion changeset.**
1860: 20 20 20 20 20 20 20 20 20 20 24 73 65 73 73 69            $sessi
1870: 6f 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 20 20 20  on delete.**    
1880: 20 20 20 20 20 20 24 73 65 73 73 69 6f 6e 20 65        $session e
1890: 6e 61 62 6c 65 20 42 4f 4f 4c 0a 2a 2a 20 20 20  nable BOOL.**   
18a0: 20 20 20 20 20 20 20 24 73 65 73 73 69 6f 6e 20         $session 
18b0: 69 6e 64 69 72 65 63 74 20 49 4e 54 45 47 45 52  indirect INTEGER
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 24 73 65  .**          $se
18d0: 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 0a 2a  ssion patchset.*
18e0: 2a 20 20 20 20 20 20 20 20 20 20 24 73 65 73 73  *          $sess
18f0: 69 6f 6e 20 74 61 62 6c 65 5f 66 69 6c 74 65 72  ion table_filter
1900: 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69   SCRIPT.*/.stati
1910: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1920: 41 50 49 20 74 65 73 74 5f 73 65 73 73 69 6f 6e  API test_session
1930: 5f 63 6d 64 28 0a 20 20 76 6f 69 64 20 2a 63 6c  _cmd(.  void *cl
1940: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1950: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1960: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1970: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1980: 76 5b 5d 0a 29 7b 0a 20 20 54 65 73 74 53 65 73  v[].){.  TestSes
1990: 73 69 6f 6e 20 2a 70 20 3d 20 28 54 65 73 74 53  sion *p = (TestS
19a0: 65 73 73 69 6f 6e 2a 29 63 6c 69 65 6e 74 44 61  ession*)clientDa
19b0: 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  ta;.  sqlite3_se
19c0: 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
19d0: 3d 20 70 2d 3e 70 53 65 73 73 69 6f 6e 3b 0a 20  = p->pSession;. 
19e0: 20 73 74 72 75 63 74 20 53 65 73 73 69 6f 6e 53   struct SessionS
19f0: 75 62 63 6d 64 20 7b 0a 20 20 20 20 63 6f 6e 73  ubcmd {.    cons
1a00: 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 0a 20 20  t char *zSub;.  
1a10: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
1a20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
1a30: 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b 0a  ;.    int iSub;.
1a40: 20 20 7d 20 61 53 75 62 5b 5d 20 3d 20 7b 0a 20    } aSub[] = {. 
1a50: 20 20 20 7b 20 22 61 74 74 61 63 68 22 2c 20 20     { "attach",  
1a60: 20 20 20 20 20 31 2c 20 22 54 41 42 4c 45 22 2c       1, "TABLE",
1a70: 20 20 20 20 20 20 7d 2c 20 2f 2a 20 30 20 2a 2f        }, /* 0 */
1a80: 0a 20 20 20 20 7b 20 22 63 68 61 6e 67 65 73 65  .    { "changese
1a90: 74 22 2c 20 20 20 20 30 2c 20 22 22 2c 20 20 20  t",    0, "",   
1aa0: 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 31 20          }, /* 1 
1ab0: 2a 2f 0a 20 20 20 20 7b 20 22 64 65 6c 65 74 65  */.    { "delete
1ac0: 22 2c 20 20 20 20 20 20 20 30 2c 20 22 22 2c 20  ",       0, "", 
1ad0: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
1ae0: 32 20 2a 2f 0a 20 20 20 20 7b 20 22 65 6e 61 62  2 */.    { "enab
1af0: 6c 65 22 2c 20 20 20 20 20 20 20 31 2c 20 22 42  le",       1, "B
1b00: 4f 4f 4c 22 2c 20 20 20 20 20 20 20 7d 2c 20 2f  OOL",       }, /
1b10: 2a 20 33 20 2a 2f 0a 20 20 20 20 7b 20 22 69 6e  * 3 */.    { "in
1b20: 64 69 72 65 63 74 22 2c 20 20 20 20 20 31 2c 20  direct",     1, 
1b30: 22 42 4f 4f 4c 22 2c 20 20 20 20 20 20 20 7d 2c  "BOOL",       },
1b40: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 7b 20 22   /* 4 */.    { "
1b50: 69 73 65 6d 70 74 79 22 2c 20 20 20 20 20 20 30  isempty",      0
1b60: 2c 20 22 22 2c 20 20 20 20 20 20 20 20 20 20 20  , "",           
1b70: 7d 2c 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 7b  }, /* 5 */.    {
1b80: 20 22 74 61 62 6c 65 5f 66 69 6c 74 65 72 22 2c   "table_filter",
1b90: 20 31 2c 20 22 53 43 52 49 50 54 22 2c 20 20 20   1, "SCRIPT",   
1ba0: 20 20 7d 2c 20 2f 2a 20 36 20 2a 2f 0a 20 20 20    }, /* 6 */.   
1bb0: 20 7b 20 22 70 61 74 63 68 73 65 74 22 2c 20 20   { "patchset",  
1bc0: 20 20 20 30 2c 20 22 22 2c 20 20 20 20 20 20 20     0, "",       
1bd0: 20 20 20 20 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20      }, /* 7 */. 
1be0: 20 20 20 7b 20 22 64 69 66 66 22 2c 20 20 20 20     { "diff",    
1bf0: 20 20 20 20 20 32 2c 20 22 46 52 4f 4d 44 42 20       2, "FROMDB 
1c00: 54 42 4c 22 2c 20 7d 2c 20 2f 2a 20 38 20 2a 2f  TBL", }, /* 8 */
1c10: 0a 20 20 20 20 7b 20 30 20 7d 0a 20 20 7d 3b 0a  .    { 0 }.  };.
1c20: 20 20 69 6e 74 20 69 53 75 62 3b 0a 20 20 69 6e    int iSub;.  in
1c30: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1c40: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
1c50: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1c60: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
1c70: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
1c80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c90: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
1ca0: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
1cb0: 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72  mObjStruct(inter
1cc0: 70 2c 20 0a 20 20 20 20 20 20 6f 62 6a 76 5b 31  p, .      objv[1
1cd0: 5d 2c 20 61 53 75 62 2c 20 73 69 7a 65 6f 66 28  ], aSub, sizeof(
1ce0: 61 53 75 62 5b 30 5d 29 2c 20 22 73 75 62 2d 63  aSub[0]), "sub-c
1cf0: 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 53 75  ommand", 0, &iSu
1d00: 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  b.  );.  if( rc!
1d10: 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1d20: 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
1d30: 3d 32 2b 61 53 75 62 5b 69 53 75 62 5d 2e 6e 41  =2+aSub[iSub].nA
1d40: 72 67 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  rg ){.    Tcl_Wr
1d50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1d60: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 61 53 75 62  p, 2, objv, aSub
1d70: 5b 69 53 75 62 5d 2e 7a 4d 73 67 29 3b 0a 20 20  [iSub].zMsg);.  
1d80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d90: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  OR;.  }..  switc
1da0: 68 28 20 69 53 75 62 20 29 7b 0a 20 20 20 20 63  h( iSub ){.    c
1db0: 61 73 65 20 30 3a 20 7b 20 20 20 20 20 20 2f 2a  ase 0: {      /*
1dc0: 20 61 74 74 61 63 68 20 2a 2f 0a 20 20 20 20 20   attach */.     
1dd0: 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 54 63   char *zArg = Tc
1de0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1df0: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [2]);.      if( 
1e00: 7a 41 72 67 5b 30 5d 3d 3d 27 2a 27 20 26 26 20  zArg[0]=='*' && 
1e10: 7a 41 72 67 5b 31 5d 3d 3d 27 5c 30 27 20 29 20  zArg[1]=='\0' ) 
1e20: 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
1e30: 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  rc = sqlite3sess
1e40: 69 6f 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73  ion_attach(pSess
1e50: 69 6f 6e 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20  ion, zArg);.    
1e60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e80: 65 74 75 72 6e 20 74 65 73 74 5f 73 65 73 73 69  eturn test_sessi
1e90: 6f 6e 5f 65 72 72 6f 72 28 69 6e 74 65 72 70 2c  on_error(interp,
1ea0: 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d   rc, 0);.      }
1eb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 37 3a    }..    case 7:
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 63 68          /* patch
1ee0: 73 65 74 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  set */.    case 
1ef0: 31 3a 20 7b 20 20 20 20 20 20 2f 2a 20 63 68 61  1: {      /* cha
1f00: 6e 67 65 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  ngeset */.      
1f10: 54 65 73 74 53 65 73 73 69 6f 6e 73 42 6c 6f 62  TestSessionsBlob
1f20: 20 6f 20 3d 20 7b 30 2c 20 30 7d 3b 0a 20 20 20   o = {0, 0};.   
1f30: 20 20 20 69 66 28 20 74 65 73 74 5f 74 63 6c 5f     if( test_tcl_
1f40: 69 6e 74 65 67 65 72 28 69 6e 74 65 72 70 2c 20  integer(interp, 
1f50: 53 45 53 53 49 4f 4e 5f 53 54 52 45 41 4d 5f 54  SESSION_STREAM_T
1f60: 43 4c 5f 56 41 52 29 20 29 7b 0a 20 20 20 20 20  CL_VAR) ){.     
1f70: 20 20 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20     void *pCtx = 
1f80: 28 76 6f 69 64 2a 29 26 6f 3b 0a 20 20 20 20 20  (void*)&o;.     
1f90: 20 20 20 69 66 28 20 69 53 75 62 3d 3d 37 20 29     if( iSub==7 )
1fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fb0: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
1fc0: 70 61 74 63 68 73 65 74 5f 73 74 72 6d 28 70 53  patchset_strm(pS
1fd0: 65 73 73 69 6f 6e 2c 20 74 65 73 74 53 74 72 65  ession, testStre
1fe0: 61 6d 4f 75 74 70 75 74 2c 20 70 43 74 78 29 3b  amOutput, pCtx);
1ff0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2000: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2010: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68  qlite3session_ch
2020: 61 6e 67 65 73 65 74 5f 73 74 72 6d 28 70 53 65  angeset_strm(pSe
2030: 73 73 69 6f 6e 2c 20 74 65 73 74 53 74 72 65 61  ssion, testStrea
2040: 6d 4f 75 74 70 75 74 2c 20 70 43 74 78 29 3b 0a  mOutput, pCtx);.
2050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2070: 66 28 20 69 53 75 62 3d 3d 37 20 29 7b 0a 20 20  f( iSub==7 ){.  
2080: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2090: 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63  ite3session_patc
20a0: 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 26  hset(pSession, &
20b0: 6f 2e 6e 2c 20 26 6f 2e 70 29 3b 0a 20 20 20 20  o.n, &o.p);.    
20c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20e0: 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73  3session_changes
20f0: 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 26 6f 2e  et(pSession, &o.
2100: 6e 2c 20 26 6f 2e 70 29 3b 0a 20 20 20 20 20 20  n, &o.p);.      
2110: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2120: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2130: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
2140: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2150: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
2160: 79 74 65 41 72 72 61 79 4f 62 6a 28 6f 2e 70 2c  yteArrayObj(o.p,
2170: 20 6f 2e 6e 29 29 3b 20 0a 20 20 20 20 20 20 7d   o.n)); .      }
2180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2190: 72 65 65 28 6f 2e 70 29 3b 0a 20 20 20 20 20 20  ree(o.p);.      
21a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21b0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
21c0: 75 72 6e 20 74 65 73 74 5f 73 65 73 73 69 6f 6e  urn test_session
21d0: 5f 65 72 72 6f 72 28 69 6e 74 65 72 70 2c 20 72  _error(interp, r
21e0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  c, 0);.      }. 
21f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2200: 7d 0a 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20  }..    case 2:  
2210: 20 20 20 20 20 20 2f 2a 20 64 65 6c 65 74 65 20        /* delete 
2220: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 6c  */.      Tcl_Del
2230: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
2240: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2250: 28 6f 62 6a 76 5b 30 5d 29 29 3b 0a 20 20 20 20  (objv[0]));.    
2260: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
2270: 73 65 20 33 3a 20 7b 20 20 20 20 20 20 2f 2a 20  se 3: {      /* 
2280: 65 6e 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  enable */.      
2290: 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69  int val;.      i
22a0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
22b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
22c0: 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
22d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22e0: 20 20 20 20 20 20 76 61 6c 20 3d 20 73 71 6c 69        val = sqli
22f0: 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c  te3session_enabl
2300: 65 28 70 53 65 73 73 69 6f 6e 2c 20 76 61 6c 29  e(pSession, val)
2310: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
2320: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2330: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
2340: 62 6a 28 76 61 6c 29 29 3b 0a 20 20 20 20 20 20  bj(val));.      
2350: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2360: 20 20 63 61 73 65 20 34 3a 20 7b 20 20 20 20 20    case 4: {     
2370: 20 2f 2a 20 69 6e 64 69 72 65 63 74 20 2a 2f 0a   /* indirect */.
2380: 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
2390: 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
23a0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
23b0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
23c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
23d0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 76 61 6c 20  RROR;.      val 
23e0: 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
23f0: 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73 69  _indirect(pSessi
2400: 6f 6e 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20  on, val);.      
2410: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2420: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2430: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 76 61 6c 29 29  BooleanObj(val))
2440: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2450: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 35     }..    case 5
2460: 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 73 65 6d  : {      /* isem
2470: 70 74 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  pty */.      int
2480: 20 76 61 6c 3b 0a 20 20 20 20 20 20 76 61 6c 20   val;.      val 
2490: 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
24a0: 5f 69 73 65 6d 70 74 79 28 70 53 65 73 73 69 6f  _isempty(pSessio
24b0: 6e 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  n);.      Tcl_Se
24c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24d0: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
24e0: 6e 4f 62 6a 28 76 61 6c 29 29 3b 0a 20 20 20 20  nObj(val));.    
24f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2500: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
2510: 63 61 73 65 20 36 3a 20 7b 20 20 20 20 20 20 2f  case 6: {      /
2520: 2a 20 74 61 62 6c 65 5f 66 69 6c 74 65 72 20 2a  * table_filter *
2530: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  /.      if( p->p
2540: 46 69 6c 74 65 72 53 63 72 69 70 74 20 29 20 54  FilterScript ) T
2550: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2560: 70 2d 3e 70 46 69 6c 74 65 72 53 63 72 69 70 74  p->pFilterScript
2570: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 74 65  );.      p->inte
2580: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
2590: 20 20 20 70 2d 3e 70 46 69 6c 74 65 72 53 63 72     p->pFilterScr
25a0: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
25b0: 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b  ateObj(objv[2]);
25c0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
25d0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6c 74  efCount(p->pFilt
25e0: 65 72 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20  erScript);.     
25f0: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2600: 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65  table_filter(pSe
2610: 73 73 69 6f 6e 2c 20 74 65 73 74 5f 74 61 62 6c  ssion, test_tabl
2620: 65 5f 66 69 6c 74 65 72 2c 20 63 6c 69 65 6e 74  e_filter, client
2630: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 62 72 65  Data);.      bre
2640: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2650: 61 73 65 20 38 3a 20 7b 20 20 20 20 20 20 2f 2a  ase 8: {      /*
2660: 20 64 69 66 66 20 2a 2f 0a 20 20 20 20 20 20 63   diff */.      c
2670: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2680: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2690: 33 73 65 73 73 69 6f 6e 5f 64 69 66 66 28 70 53  3session_diff(pS
26a0: 65 73 73 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20  ession, .       
26b0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
26c0: 28 6f 62 6a 76 5b 32 5d 29 2c 0a 20 20 20 20 20  (objv[2]),.     
26d0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
26e0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 2c 0a 20 20 20  ng(objv[3]),.   
26f0: 20 20 20 20 20 20 20 26 7a 45 72 72 0a 20 20 20         &zErr.   
2700: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
2710: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2720: 4b 20 7c 7c 20 7a 45 72 72 3d 3d 30 20 29 3b 0a  K || zErr==0 );.
2730: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2740: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
2750: 65 73 74 5f 73 65 73 73 69 6f 6e 5f 65 72 72 6f  est_session_erro
2760: 72 28 69 6e 74 65 72 70 2c 20 72 63 2c 20 7a 45  r(interp, rc, zE
2770: 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rr);.      }.   
2780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2790: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
27a0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
27b0: 76 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41  void SQLITE_TCLA
27c0: 50 49 20 74 65 73 74 5f 73 65 73 73 69 6f 6e 5f  PI test_session_
27d0: 64 65 6c 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  del(void *client
27e0: 44 61 74 61 29 7b 0a 20 20 54 65 73 74 53 65 73  Data){.  TestSes
27f0: 73 69 6f 6e 20 2a 70 20 3d 20 28 54 65 73 74 53  sion *p = (TestS
2800: 65 73 73 69 6f 6e 2a 29 63 6c 69 65 6e 74 44 61  ession*)clientDa
2810: 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  ta;.  if( p->pFi
2820: 6c 74 65 72 53 63 72 69 70 74 20 29 20 54 63 6c  lterScript ) Tcl
2830: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
2840: 3e 70 46 69 6c 74 65 72 53 63 72 69 70 74 29 3b  >pFilterScript);
2850: 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
2860: 6e 5f 64 65 6c 65 74 65 28 70 2d 3e 70 53 65 73  n_delete(p->pSes
2870: 73 69 6f 6e 29 3b 0a 20 20 63 6b 66 72 65 65 28  sion);.  ckfree(
2880: 28 63 68 61 72 2a 29 70 29 3b 0a 7d 0a 0a 2f 2a  (char*)p);.}../*
2890: 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 20 73 71 6c  .** Tclcmd:  sql
28a0: 69 74 65 33 73 65 73 73 69 6f 6e 20 43 4d 44 20  ite3session CMD 
28b0: 44 42 2d 48 41 4e 44 4c 45 20 44 42 2d 4e 41 4d  DB-HANDLE DB-NAM
28c0: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
28d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
28e0: 73 74 5f 73 71 6c 69 74 65 33 73 65 73 73 69 6f  st_sqlite3sessio
28f0: 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
2900: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2910: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2920: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2930: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2940: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
2950: 64 62 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  db;.  Tcl_CmdInf
2960: 6f 20 69 6e 66 6f 3b 0a 20 20 69 6e 74 20 72 63  o info;.  int rc
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2990: 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61  ite3session_crea
29a0: 74 65 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  te() return code
29b0: 20 2a 2f 0a 20 20 54 65 73 74 53 65 73 73 69 6f   */.  TestSessio
29c0: 6e 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  n *p;           
29d0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 77 72 61        /* New wra
29e0: 70 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  pper object */..
29f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2a00: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2a10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2a20: 20 6f 62 6a 76 2c 20 22 43 4d 44 20 44 42 2d 48   objv, "CMD DB-H
2a30: 41 4e 44 4c 45 20 44 42 2d 4e 41 4d 45 22 29 3b  ANDLE DB-NAME");
2a40: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2a60: 28 20 30 3d 3d 54 63 6c 5f 47 65 74 43 6f 6d 6d  ( 0==Tcl_GetComm
2a70: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
2a80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2a90: 6a 76 5b 32 5d 29 2c 20 26 69 6e 66 6f 29 20 29  jv[2]), &info) )
2aa0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2ab0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ac0: 6e 6f 20 73 75 63 68 20 68 61 6e 64 6c 65 3a 20  no such handle: 
2ad0: 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
2ae0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20  (objv[2]), 0);. 
2af0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
2b10: 2a 28 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e 66  *(sqlite3 **)inf
2b20: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b  o.objClientData;
2b30: 0a 0a 20 20 70 20 3d 20 28 54 65 73 74 53 65 73  ..  p = (TestSes
2b40: 73 69 6f 6e 2a 29 63 6b 61 6c 6c 6f 63 28 73 69  sion*)ckalloc(si
2b50: 7a 65 6f 66 28 54 65 73 74 53 65 73 73 69 6f 6e  zeof(TestSession
2b60: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  ));.  memset(p, 
2b70: 30 2c 20 73 69 7a 65 6f 66 28 54 65 73 74 53 65  0, sizeof(TestSe
2b80: 73 73 69 6f 6e 29 29 3b 0a 20 20 72 63 20 3d 20  ssion));.  rc = 
2b90: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
2ba0: 72 65 61 74 65 28 64 62 2c 20 54 63 6c 5f 47 65  reate(db, Tcl_Ge
2bb0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
2bc0: 2c 20 26 70 2d 3e 70 53 65 73 73 69 6f 6e 29 3b  , &p->pSession);
2bd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2be0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6b 66 72  E_OK ){.    ckfr
2bf0: 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
2c00: 20 20 72 65 74 75 72 6e 20 74 65 73 74 5f 73 65    return test_se
2c10: 73 73 69 6f 6e 5f 65 72 72 6f 72 28 69 6e 74 65  ssion_error(inte
2c20: 72 70 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a  rp, rc, 0);.  }.
2c30: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
2c40: 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 69  Command(.      i
2c50: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2c60: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 74  ring(objv[1]), t
2c70: 65 73 74 5f 73 65 73 73 69 6f 6e 5f 63 6d 64 2c  est_session_cmd,
2c80: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 70 2c 0a   (ClientData)p,.
2c90: 20 20 20 20 20 20 74 65 73 74 5f 73 65 73 73 69        test_sessi
2ca0: 6f 6e 5f 64 65 6c 0a 20 20 29 3b 0a 20 20 54 63  on_del.  );.  Tc
2cb0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2cc0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b  nterp, objv[1]);
2cd0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2ce0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2cf0: 20 74 65 73 74 5f 61 70 70 65 6e 64 5f 76 61 6c   test_append_val
2d00: 75 65 28 54 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73  ue(Tcl_Obj *pLis
2d10: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
2d20: 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66 28 20 70   *pVal){.  if( p
2d30: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  Val==0 ){.    Tc
2d40: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2d50: 6c 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74 2c  lement(0, pList,
2d60: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 29 3b 0a   Tcl_NewObj());.
2d70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2d80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
2d90: 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 4f 62  pList, Tcl_NewOb
2da0: 6a 28 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  j());.  }else{. 
2db0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a     Tcl_Obj *pObj
2dc0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71  ;.    switch( sq
2dd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2de0: 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pVal) ){.      
2df0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
2e00: 3a 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69  :.        Tcl_Li
2e10: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2e20: 6e 74 28 30 2c 20 70 4c 69 73 74 2c 20 54 63 6c  nt(0, pList, Tcl
2e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
2e40: 22 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ", 1));.        
2e50: 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pObj = Tcl_NewOb
2e60: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  j();.        bre
2e70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
2e80: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
2e90: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
2ea0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2eb0: 30 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65  0, pList, Tcl_Ne
2ec0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 22 2c 20  wStringObj("i", 
2ed0: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 62  1));.        pOb
2ee0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
2ef0: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ntObj(sqlite3_va
2f00: 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 29  lue_int64(pVal))
2f10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2f20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
2f30: 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
2f40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2f50: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4c  endElement(0, pL
2f60: 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ist, Tcl_NewStri
2f70: 6e 67 4f 62 6a 28 22 66 22 2c 20 31 29 29 3b 0a  ngObj("f", 1));.
2f80: 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54          pObj = T
2f90: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
2fa0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
2fb0: 75 62 6c 65 28 70 56 61 6c 29 29 3b 0a 20 20 20  uble(pVal));.   
2fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
2fe0: 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 6f  XT: {.        co
2ff0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
3000: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
3010: 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
3020: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
3030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
3040: 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  es(pVal);.      
3050: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3060: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4c  endElement(0, pL
3070: 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ist, Tcl_NewStri
3080: 6e 67 4f 62 6a 28 22 74 22 2c 20 31 29 29 3b 0a  ngObj("t", 1));.
3090: 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54          pObj = T
30a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
30b0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  z, n);.        b
30c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
30e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
30f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
3100: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  pVal)==SQLITE_BL
3110: 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 54 63  OB );.        Tc
3120: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3130: 6c 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74 2c  lement(0, pList,
3140: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3150: 6a 28 22 62 22 2c 20 31 29 29 3b 0a 20 20 20 20  j("b", 1));.    
3160: 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e      pObj = Tcl_N
3170: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 0a  ewByteArrayObj(.
3180: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
3190: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
31a0: 56 61 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Val),.          
31b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
31c0: 62 79 74 65 73 28 70 56 61 6c 29 0a 20 20 20 20  bytes(pVal).    
31d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62      );.        b
31e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
31f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3200: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73  dElement(0, pLis
3210: 74 2c 20 70 4f 62 6a 29 3b 0a 20 20 7d 0a 7d 0a  t, pObj);.  }.}.
3220: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3230: 54 65 73 74 43 6f 6e 66 6c 69 63 74 48 61 6e 64  TestConflictHand
3240: 6c 65 72 20 54 65 73 74 43 6f 6e 66 6c 69 63 74  ler TestConflict
3250: 48 61 6e 64 6c 65 72 3b 0a 73 74 72 75 63 74 20  Handler;.struct 
3260: 54 65 73 74 43 6f 6e 66 6c 69 63 74 48 61 6e 64  TestConflictHand
3270: 6c 65 72 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ler {.  Tcl_Inte
3280: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
3290: 6c 5f 4f 62 6a 20 2a 70 43 6f 6e 66 6c 69 63 74  l_Obj *pConflict
32a0: 53 63 72 69 70 74 3b 0a 20 20 54 63 6c 5f 4f 62  Script;.  Tcl_Ob
32b0: 6a 20 2a 70 46 69 6c 74 65 72 53 63 72 69 70 74  j *pFilterScript
32c0: 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.};..static int
32d0: 20 74 65 73 74 5f 6f 62 6a 5f 65 71 5f 73 74 72   test_obj_eq_str
32e0: 69 6e 67 28 54 63 6c 5f 4f 62 6a 20 2a 70 2c 20  ing(Tcl_Obj *p, 
32f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3300: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
3310: 4f 62 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 62  Obj;.  char *zOb
3320: 6a 3b 0a 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73  j;..  n = (int)s
3330: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 7a 4f 62 6a  trlen(z);.  zObj
3340: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
3350: 46 72 6f 6d 4f 62 6a 28 70 2c 20 26 6e 4f 62 6a  FromObj(p, &nObj
3360: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 6e 4f  );..  return (nO
3370: 62 6a 3d 3d 6e 20 26 26 20 28 6e 3d 3d 30 20 7c  bj==n && (n==0 |
3380: 7c 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4f 62 6a  | 0==memcmp(zObj
3390: 2c 20 7a 2c 20 6e 29 29 29 3b 0a 7d 0a 0a 73 74  , z, n)));.}..st
33a0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69  atic int test_fi
33b0: 6c 74 65 72 5f 68 61 6e 64 6c 65 72 28 0a 20 20  lter_handler(.  
33c0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 65  /* Pointer to Te
33f0: 73 74 43 6f 6e 66 6c 69 63 74 48 61 6e 64 6c 65  stConflictHandle
3400: 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
3410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
3420: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
3430: 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
3440: 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6e 66 6c  /.){.  TestConfl
3450: 69 63 74 48 61 6e 64 6c 65 72 20 2a 70 20 3d 20  ictHandler *p = 
3460: 28 54 65 73 74 43 6f 6e 66 6c 69 63 74 48 61 6e  (TestConflictHan
3470: 64 6c 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 69  dler *)pCtx;.  i
3480: 6e 74 20 72 65 73 20 3d 20 31 3b 0a 20 20 54 63  nt res = 1;.  Tc
3490: 6c 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b 0a 20 20  l_Obj *pEval;.  
34a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34b0: 72 70 20 3d 20 70 2d 3e 69 6e 74 65 72 70 3b 0a  rp = p->interp;.
34c0: 0a 20 20 70 45 76 61 6c 20 3d 20 54 63 6c 5f 44  .  pEval = Tcl_D
34d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
34e0: 46 69 6c 74 65 72 53 63 72 69 70 74 29 3b 0a 20  FilterScript);. 
34f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3500: 74 28 70 45 76 61 6c 29 3b 0a 0a 20 20 69 66 28  t(pEval);..  if(
3510: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73   TCL_OK!=Tcl_Lis
3520: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3530: 74 28 30 2c 20 70 45 76 61 6c 2c 20 54 63 6c 5f  t(0, pEval, Tcl_
3540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
3550: 62 2c 20 2d 31 29 29 0a 20 20 20 7c 7c 20 54 43  b, -1)).   || TC
3560: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
3570: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 45 76 61  jEx(interp, pEva
3580: 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  l, TCL_EVAL_GLOB
3590: 41 4c 29 20 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f  AL) .   || TCL_O
35a0: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
35b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 54 63 6c  mObj(interp, Tcl
35c0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
35d0: 74 65 72 70 29 2c 20 26 72 65 73 29 0a 20 20 29  terp), &res).  )
35e0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
35f0: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
3600: 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65  );.  }..  Tcl_De
3610: 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76 61 6c  crRefCount(pEval
3620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
3630: 0a 7d 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74  .}  ..static int
3640: 20 74 65 73 74 5f 63 6f 6e 66 6c 69 63 74 5f 68   test_conflict_h
3650: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
3660: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3680: 6e 74 65 72 20 74 6f 20 54 65 73 74 43 6f 6e 66  nter to TestConf
3690: 6c 69 63 74 48 61 6e 64 6c 65 72 20 73 74 72 75  lictHandler stru
36a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 65  cture */.  int e
36b0: 43 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 20  Conf,           
36c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 41             /* DA
36d0: 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f 4e  TA, MISSING, CON
36e0: 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49 4e  FLICT, CONSTRAIN
36f0: 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  T */.  sqlite3_c
3700: 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70  hangeset_iter *p
3710: 49 74 65 72 20 20 20 2f 2a 20 48 61 6e 64 6c 65  Iter   /* Handle
3720: 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61 6e   describing chan
3730: 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74 20  ge and conflict 
3740: 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6e 66  */.){.  TestConf
3750: 6c 69 63 74 48 61 6e 64 6c 65 72 20 2a 70 20 3d  lictHandler *p =
3760: 20 28 54 65 73 74 43 6f 6e 66 6c 69 63 74 48 61   (TestConflictHa
3770: 6e 64 6c 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  ndler *)pCtx;.  
3780: 54 63 6c 5f 4f 62 6a 20 2a 70 45 76 61 6c 3b 0a  Tcl_Obj *pEval;.
3790: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
37a0: 74 65 72 70 20 3d 20 70 2d 3e 69 6e 74 65 72 70  terp = p->interp
37b0: 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b  ;.  int ret = 0;
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
37e0: 6c 75 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f 70  lue */..  int op
37f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
3810: 49 54 45 5f 55 50 44 41 54 45 2c 20 44 45 4c 45  ITE_UPDATE, DELE
3820: 54 45 20 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a  TE or INSERT */.
3830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3840: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
3850: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
3860: 6c 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 6f  le conflict is o
3870: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  n */.  int nCol;
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
38b0: 61 62 6c 65 20 7a 54 61 62 20 2a 2f 0a 0a 20 20  able zTab */..  
38c0: 70 45 76 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  pEval = Tcl_Dupl
38d0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6f 6e  icateObj(p->pCon
38e0: 66 6c 69 63 74 53 63 72 69 70 74 29 3b 0a 20 20  flictScript);.  
38f0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3900: 28 70 45 76 61 6c 29 3b 0a 0a 20 20 73 71 6c 69  (pEval);..  sqli
3910: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f 70 28  te3changeset_op(
3920: 70 49 74 65 72 2c 20 26 7a 54 61 62 2c 20 26 6e  pIter, &zTab, &n
3930: 43 6f 6c 2c 20 26 6f 70 2c 20 30 29 3b 0a 0a 20  Col, &op, 0);.. 
3940: 20 69 66 28 20 65 43 6f 6e 66 3d 3d 53 51 4c 49   if( eConf==SQLI
3950: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 46 4f 52  TE_CHANGESET_FOR
3960: 45 49 47 4e 5f 4b 45 59 20 29 7b 0a 20 20 20 20  EIGN_KEY ){.    
3970: 69 6e 74 20 6e 46 6b 3b 0a 20 20 20 20 73 71 6c  int nFk;.    sql
3980: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 6b  ite3changeset_fk
3990: 5f 63 6f 6e 66 6c 69 63 74 73 28 70 49 74 65 72  _conflicts(pIter
39a0: 2c 20 26 6e 46 6b 29 3b 0a 20 20 20 20 54 63 6c  , &nFk);.    Tcl
39b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
39c0: 65 6d 65 6e 74 28 30 2c 20 70 45 76 61 6c 2c 20  ement(0, pEval, 
39d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
39e0: 28 22 46 4f 52 45 49 47 4e 5f 4b 45 59 22 2c 20  ("FOREIGN_KEY", 
39f0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
3a00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3a10: 6e 74 28 30 2c 20 70 45 76 61 6c 2c 20 54 63 6c  nt(0, pEval, Tcl
3a20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 46 6b 29 29  _NewIntObj(nFk))
3a30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
3a40: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6f 70  /* Append the op
3a50: 65 72 61 74 69 6f 6e 20 74 79 70 65 2e 20 2a 2f  eration type. */
3a60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3a70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
3a80: 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77 53   pEval, Tcl_NewS
3a90: 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 20 20  tringObj(.      
3aa0: 20 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53    op==SQLITE_INS
3ab0: 45 52 54 20 3f 20 22 49 4e 53 45 52 54 22 20 3a  ERT ? "INSERT" :
3ac0: 0a 20 20 20 20 20 20 20 20 6f 70 3d 3d 53 51 4c  .        op==SQL
3ad0: 49 54 45 5f 55 50 44 41 54 45 20 3f 20 22 55 50  ITE_UPDATE ? "UP
3ae0: 44 41 54 45 22 20 3a 20 0a 20 20 20 20 20 20 20  DATE" : .       
3af0: 20 22 44 45 4c 45 54 45 22 2c 20 2d 31 0a 20 20   "DELETE", -1.  
3b00: 20 20 29 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20    ));.  .    /* 
3b10: 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
3b20: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 63   name. */.    Tc
3b30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3b40: 6c 65 6d 65 6e 74 28 30 2c 20 70 45 76 61 6c 2c  lement(0, pEval,
3b50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3b60: 6a 28 7a 54 61 62 2c 20 2d 31 29 29 3b 0a 20 20  j(zTab, -1));.  
3b70: 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
3b80: 68 65 20 63 6f 6e 66 6c 69 63 74 20 74 79 70 65  he conflict type
3b90: 2e 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28  . */.    switch(
3ba0: 20 65 43 6f 6e 66 20 29 7b 0a 20 20 20 20 20 20   eConf ){.      
3bb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 48 41 4e  case SQLITE_CHAN
3bc0: 47 45 53 45 54 5f 44 41 54 41 3a 0a 20 20 20 20  GESET_DATA:.    
3bd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3be0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3bf0: 65 72 70 2c 20 70 45 76 61 6c 2c 54 63 6c 5f 4e  erp, pEval,Tcl_N
3c00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 44 41 54  ewStringObj("DAT
3c10: 41 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  A",-1));.       
3c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
3c30: 73 65 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  se SQLITE_CHANGE
3c40: 53 45 54 5f 4e 4f 54 46 4f 55 4e 44 3a 0a 20 20  SET_NOTFOUND:.  
3c50: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
3c60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3c70: 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 54 63 6c  nterp, pEval,Tcl
3c80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e  _NewStringObj("N
3c90: 4f 54 46 4f 55 4e 44 22 2c 2d 31 29 29 3b 0a 20  OTFOUND",-1));. 
3ca0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3cb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3cc0: 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49  CHANGESET_CONFLI
3cd0: 43 54 3a 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  CT:.        Tcl_
3ce0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3cf0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 45 76  ment(interp, pEv
3d00: 61 6c 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  al,Tcl_NewString
3d10: 4f 62 6a 28 22 43 4f 4e 46 4c 49 43 54 22 2c 2d  Obj("CONFLICT",-
3d20: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1));.        bre
3d30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
3d40: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
3d50: 43 4f 4e 53 54 52 41 49 4e 54 3a 0a 20 20 20 20  CONSTRAINT:.    
3d60: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3d70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3d80: 65 72 70 2c 20 70 45 76 61 6c 2c 54 63 6c 5f 4e  erp, pEval,Tcl_N
3d90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 43 4f 4e  ewStringObj("CON
3da0: 53 54 52 41 49 4e 54 22 2c 2d 31 29 29 3b 0a 20  STRAINT",-1));. 
3db0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3dc0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
3dd0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   this is not an 
3de0: 49 4e 53 45 52 54 2c 20 61 70 70 65 6e 64 20 74  INSERT, append t
3df0: 68 65 20 6f 6c 64 20 72 6f 77 20 2a 2f 0a 20 20  he old row */.  
3e00: 20 20 69 66 28 20 6f 70 21 3d 53 51 4c 49 54 45    if( op!=SQLITE
3e10: 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20  _INSERT ){.     
3e20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 54 63   int i;.      Tc
3e30: 6c 5f 4f 62 6a 20 2a 70 4f 6c 64 20 3d 20 54 63  l_Obj *pOld = Tc
3e40: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
3e50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
3e60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
3e70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3e80: 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 73 71  pVal;.        sq
3e90: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 6f  lite3changeset_o
3ea0: 6c 64 28 70 49 74 65 72 2c 20 69 2c 20 26 70 56  ld(pIter, i, &pV
3eb0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  al);.        tes
3ec0: 74 5f 61 70 70 65 6e 64 5f 76 61 6c 75 65 28 70  t_append_value(p
3ed0: 4f 6c 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Old, pVal);.    
3ee0: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69    }.      Tcl_Li
3ef0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3f00: 6e 74 28 30 2c 20 70 45 76 61 6c 2c 20 70 4f 6c  nt(0, pEval, pOl
3f10: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
3f20: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
3f30: 20 61 20 44 45 4c 45 54 45 2c 20 61 70 70 65 6e   a DELETE, appen
3f40: 64 20 74 68 65 20 6e 65 77 20 72 6f 77 20 2a 2f  d the new row */
3f50: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 53 51 4c  .    if( op!=SQL
3f60: 49 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  ITE_DELETE ){.  
3f70: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3f80: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d   Tcl_Obj *pNew =
3f90: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
3fa0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
3fb0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
3fd0: 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  e *pVal;.       
3fe0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
3ff0: 74 5f 6e 65 77 28 70 49 74 65 72 2c 20 69 2c 20  t_new(pIter, i, 
4000: 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  &pVal);.        
4010: 74 65 73 74 5f 61 70 70 65 6e 64 5f 76 61 6c 75  test_append_valu
4020: 65 28 70 4e 65 77 2c 20 70 56 61 6c 29 3b 0a 20  e(pNew, pVal);. 
4030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
4040: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4050: 65 6d 65 6e 74 28 30 2c 20 70 45 76 61 6c 2c 20  ement(0, pEval, 
4060: 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pNew);.    }..  
4070: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
4080: 61 20 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41  a CHANGESET_DATA
4090: 20 6f 72 20 43 48 41 4e 47 45 53 45 54 5f 43 4f   or CHANGESET_CO
40a0: 4e 46 4c 49 43 54 20 63 6f 6e 66 6c 69 63 74 2c  NFLICT conflict,
40b0: 20 61 70 70 65 6e 64 0a 20 20 20 20 20 2a 2a 20   append.     ** 
40c0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  the conflicting 
40d0: 72 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  row.  */.    if(
40e0: 20 65 43 6f 6e 66 3d 3d 53 51 4c 49 54 45 5f 43   eConf==SQLITE_C
40f0: 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20 7c 7c  HANGESET_DATA ||
4100: 20 65 43 6f 6e 66 3d 3d 53 51 4c 49 54 45 5f 43   eConf==SQLITE_C
4110: 48 41 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43  HANGESET_CONFLIC
4120: 54 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  T ){.      int i
4130: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
4140: 2a 70 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c  *pConflict = Tcl
4150: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
4160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
4170: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4180: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20  int rc;.        
4190: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
41a0: 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Val;.        rc 
41b0: 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  = sqlite3changes
41c0: 65 74 5f 63 6f 6e 66 6c 69 63 74 28 70 49 74 65  et_conflict(pIte
41d0: 72 2c 20 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20  r, i, &pVal);.  
41e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
41f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
4200: 20 20 20 20 20 20 20 74 65 73 74 5f 61 70 70 65         test_appe
4210: 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e 66 6c 69  nd_value(pConfli
4220: 63 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  ct, pVal);.     
4230: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73   }.      Tcl_Lis
4240: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4250: 74 28 30 2c 20 70 45 76 61 6c 2c 20 70 43 6f 6e  t(0, pEval, pCon
4260: 66 6c 69 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  flict);.    }.. 
4270: 20 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a     /************
4280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 20 20  ***********.    
42c0: 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   ** This block i
42d0: 73 20 70 75 72 65 6c 79 20 66 6f 72 20 74 65 73  s purely for tes
42e0: 74 69 6e 67 20 73 6f 6d 65 20 65 72 72 6f 72 20  ting some error 
42f0: 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
4300: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 43 6f 6e   */.    if( eCon
4310: 66 3d 3d 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  f==SQLITE_CHANGE
4320: 53 45 54 5f 43 4f 4e 53 54 52 41 49 4e 54 20 0a  SET_CONSTRAINT .
4330: 20 20 20 20 20 7c 7c 20 65 43 6f 6e 66 3d 3d 53       || eConf==S
4340: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
4350: 4e 4f 54 46 4f 55 4e 44 20 0a 20 20 20 20 29 7b  NOTFOUND .    ){
4360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
4370: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20  alue *pVal;.    
4380: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4390: 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66  e3changeset_conf
43a0: 6c 69 63 74 28 70 49 74 65 72 2c 20 30 2c 20 26  lict(pIter, 0, &
43b0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  pVal);.      ass
43c0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
43d0: 4d 49 53 55 53 45 20 29 3b 0a 20 20 20 20 7d 65  MISUSE );.    }e
43e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
43f0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
4400: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
4410: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4420: 63 6f 6e 66 6c 69 63 74 28 70 49 74 65 72 2c 20  conflict(pIter, 
4430: 2d 31 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20  -1, &pVal);.    
4440: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4450: 4c 49 54 45 5f 52 41 4e 47 45 20 29 3b 0a 20 20  LITE_RANGE );.  
4460: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4470: 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 66 6c 69  changeset_confli
4480: 63 74 28 70 49 74 65 72 2c 20 6e 43 6f 6c 2c 20  ct(pIter, nCol, 
4490: 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  &pVal);.      as
44a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
44b0: 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 7d 0a  _RANGE );.    }.
44c0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
44d0: 54 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  TE_DELETE ){.   
44e0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
44f0: 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 69 6e   *pVal;.      in
4500: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68  t rc = sqlite3ch
4510: 61 6e 67 65 73 65 74 5f 6e 65 77 28 70 49 74 65  angeset_new(pIte
4520: 72 2c 20 30 2c 20 26 70 56 61 6c 29 3b 0a 20 20  r, 0, &pVal);.  
4530: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
4540: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 3b  SQLITE_MISUSE );
4550: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4560: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4570: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *pVal;.      int
4580: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
4590: 6e 67 65 73 65 74 5f 6e 65 77 28 70 49 74 65 72  ngeset_new(pIter
45a0: 2c 20 2d 31 2c 20 26 70 56 61 6c 29 3b 0a 20 20  , -1, &pVal);.  
45b0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
45c0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 29 3b 0a  SQLITE_RANGE );.
45d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
45e0: 65 33 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28  e3changeset_new(
45f0: 70 49 74 65 72 2c 20 6e 43 6f 6c 2c 20 26 70 56  pIter, nCol, &pV
4600: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
4610: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 41  t( rc==SQLITE_RA
4620: 4e 47 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NGE );.    }.   
4630: 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
4640: 49 4e 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20  INSERT ){.      
4650: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
4660: 56 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Val;.      int r
4670: 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67  c = sqlite3chang
4680: 65 73 65 74 5f 6f 6c 64 28 70 49 74 65 72 2c 20  eset_old(pIter, 
4690: 30 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  0, &pVal);.     
46a0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
46b0: 49 54 45 5f 4d 49 53 55 53 45 20 29 3b 0a 20 20  ITE_MISUSE );.  
46c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
46d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
46e0: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  al;.      int rc
46f0: 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65   = sqlite3change
4700: 73 65 74 5f 6f 6c 64 28 70 49 74 65 72 2c 20 2d  set_old(pIter, -
4710: 31 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20  1, &pVal);.     
4720: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
4730: 49 54 45 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20  ITE_RANGE );.   
4740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63     rc = sqlite3c
4750: 68 61 6e 67 65 73 65 74 5f 6f 6c 64 28 70 49 74  hangeset_old(pIt
4760: 65 72 2c 20 6e 43 6f 6c 2c 20 26 70 56 61 6c 29  er, nCol, &pVal)
4770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4780: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 41 4e 47 45  rc==SQLITE_RANGE
4790: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
47a0: 28 20 65 43 6f 6e 66 21 3d 53 51 4c 49 54 45 5f  ( eConf!=SQLITE_
47b0: 43 48 41 4e 47 45 53 45 54 5f 46 4f 52 45 49 47  CHANGESET_FOREIG
47c0: 4e 5f 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 2f  N_KEY ){.      /
47d0: 2a 20 65 43 6f 6e 66 21 3d 46 4f 52 45 49 47 4e  * eConf!=FOREIGN
47e0: 5f 4b 45 59 20 69 73 20 61 6c 77 61 79 73 20 74  _KEY is always t
47f0: 72 75 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  rue at this poin
4800: 74 2e 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  t. The condition
4810: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 6a 75   is .      ** ju
4820: 73 74 20 74 68 65 72 65 20 74 6f 20 6d 61 6b 65  st there to make
4830: 20 69 74 20 63 6c 65 61 72 65 72 20 77 68 61 74   it clearer what
4840: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
4850: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
4860: 6e 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 6e  nDummy;.      in
4870: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68  t rc = sqlite3ch
4880: 61 6e 67 65 73 65 74 5f 66 6b 5f 63 6f 6e 66 6c  angeset_fk_confl
4890: 69 63 74 73 28 70 49 74 65 72 2c 20 26 6e 44 75  icts(pIter, &nDu
48a0: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 61 73 73 65  mmy);.      asse
48b0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4d  rt( rc==SQLITE_M
48c0: 49 53 55 53 45 20 29 3b 0a 20 20 20 20 7d 0a 20  ISUSE );.    }. 
48d0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 65 73     /* End of tes
48e0: 74 69 6e 67 20 62 6c 6f 63 6b 0a 20 20 20 20 2a  ting block.    *
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2f 0a 20 20 7d 0a 0a 20 20 69  ******/.  }..  i
4940: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4950: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4960: 20 70 45 76 61 6c 2c 20 54 43 4c 5f 45 56 41 4c   pEval, TCL_EVAL
4970: 5f 47 4c 4f 42 41 4c 29 20 29 7b 0a 20 20 20 20  _GLOBAL) ){.    
4980: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
4990: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d  ror(interp);.  }
49a0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
49b0: 6a 20 2a 70 52 65 73 20 3d 20 54 63 6c 5f 47 65  j *pRes = Tcl_Ge
49c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
49d0: 70 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74  p);.    if( test
49e0: 5f 6f 62 6a 5f 65 71 5f 73 74 72 69 6e 67 28 70  _obj_eq_string(p
49f0: 52 65 73 2c 20 22 4f 4d 49 54 22 29 20 7c 7c 20  Res, "OMIT") || 
4a00: 74 65 73 74 5f 6f 62 6a 5f 65 71 5f 73 74 72 69  test_obj_eq_stri
4a10: 6e 67 28 70 52 65 73 2c 20 22 22 29 20 29 7b 0a  ng(pRes, "") ){.
4a20: 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c 49        ret = SQLI
4a30: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
4a40: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
4a50: 20 74 65 73 74 5f 6f 62 6a 5f 65 71 5f 73 74 72   test_obj_eq_str
4a60: 69 6e 67 28 70 52 65 73 2c 20 22 52 45 50 4c 41  ing(pRes, "REPLA
4a70: 43 45 22 29 20 29 7b 0a 20 20 20 20 20 20 72 65  CE") ){.      re
4a80: 74 20 3d 20 53 51 4c 49 54 45 5f 43 48 41 4e 47  t = SQLITE_CHANG
4a90: 45 53 45 54 5f 52 45 50 4c 41 43 45 3b 0a 20 20  ESET_REPLACE;.  
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74    }else if( test
4ab0: 5f 6f 62 6a 5f 65 71 5f 73 74 72 69 6e 67 28 70  _obj_eq_string(p
4ac0: 52 65 73 2c 20 22 41 42 4f 52 54 22 29 20 29 7b  Res, "ABORT") ){
4ad0: 0a 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c  .      ret = SQL
4ae0: 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 41 42  ITE_CHANGESET_AB
4af0: 4f 52 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ORT;.    }else{.
4b00: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
4b10: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 52 65 73 2c  FromObj(0, pRes,
4b20: 20 26 72 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20   &ret);.    }.  
4b30: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
4b40: 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b 0a 20 20  Count(pEval);.  
4b50: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
4b60: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63  *.** The conflic
4b70: 74 20 68 61 6e 64 6c 65 72 20 75 73 65 64 20 62  t handler used b
4b80: 79 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  y sqlite3changes
4b90: 65 74 5f 61 70 70 6c 79 5f 72 65 70 6c 61 63 65  et_apply_replace
4ba0: 5f 61 6c 6c 28 29 2e 20 0a 2a 2a 20 54 68 69 73  _all(). .** This
4bb0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
4bc0: 72 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  r calls sqlite3_
4bd0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 20 6f  value_text16() o
4be0: 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 0a  n all available.
4bf0: 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ** sqlite3_value
4c00: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 74 68 65   objects and the
4c10: 6e 20 72 65 74 75 72 6e 73 20 43 48 41 4e 47 45  n returns CHANGE
4c20: 53 45 54 5f 52 45 50 4c 41 43 45 2c 20 6f 72 20  SET_REPLACE, or 
4c30: 0a 2a 2a 20 43 48 41 4e 47 45 53 45 54 5f 4f 4d  .** CHANGESET_OM
4c40: 49 54 20 69 66 20 52 45 50 4c 41 43 45 20 69 73  IT if REPLACE is
4c50: 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 2e   not applicable.
4c60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
4c70: 20 74 65 73 74 20 74 68 65 0a 2a 2a 20 65 66 66   test the.** eff
4c80: 65 63 74 20 6f 66 20 61 20 6d 61 6c 6c 6f 63 20  ect of a malloc 
4c90: 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 61  failure within a
4ca0: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  n sqlite3_value_
4cb0: 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  xxx() function.*
4cc0: 2a 20 69 6e 76 6f 6b 65 64 20 62 79 20 61 20 63  * invoked by a c
4cd0: 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20  onflict-handler 
4ce0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
4cf0: 74 69 63 20 69 6e 74 20 72 65 70 6c 61 63 65 5f  tic int replace_
4d00: 68 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20  handler(.  void 
4d10: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
4d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
4d30: 69 6e 74 65 72 20 74 6f 20 54 65 73 74 43 6f 6e  inter to TestCon
4d40: 66 6c 69 63 74 48 61 6e 64 6c 65 72 20 73 74 72  flictHandler str
4d50: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
4d60: 65 43 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  eConf,          
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4d80: 41 54 41 2c 20 4d 49 53 53 49 4e 47 2c 20 43 4f  ATA, MISSING, CO
4d90: 4e 46 4c 49 43 54 2c 20 43 4f 4e 53 54 52 41 49  NFLICT, CONSTRAI
4da0: 4e 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  NT */.  sqlite3_
4db0: 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20 2a  changeset_iter *
4dc0: 70 49 74 65 72 20 20 20 2f 2a 20 48 61 6e 64 6c  pIter   /* Handl
4dd0: 65 20 64 65 73 63 72 69 62 69 6e 67 20 63 68 61  e describing cha
4de0: 6e 67 65 20 61 6e 64 20 63 6f 6e 66 6c 69 63 74  nge and conflict
4df0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6f 70 3b   */.){.  int op;
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
4e20: 54 45 5f 55 50 44 41 54 45 2c 20 44 45 4c 45 54  TE_UPDATE, DELET
4e30: 45 20 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20  E or INSERT */. 
4e40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4e50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4e60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
4e70: 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 6f 6e  e conflict is on
4e80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4eb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  of columns in ta
4ec0: 62 6c 65 20 7a 54 61 62 20 2a 2f 0a 20 20 69 6e  ble zTab */.  in
4ed0: 74 20 69 3b 0a 20 20 69 6e 74 20 78 20 3d 20 30  t i;.  int x = 0
4ee0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e  ;..  sqlite3chan
4ef0: 67 65 73 65 74 5f 6f 70 28 70 49 74 65 72 2c 20  geset_op(pIter, 
4f00: 26 7a 54 61 62 2c 20 26 6e 43 6f 6c 2c 20 26 6f  &zTab, &nCol, &o
4f10: 70 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 6f 70  p, 0);..  if( op
4f20: 21 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  !=SQLITE_INSERT 
4f30: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4f40: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
4f50: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
4f60: 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 73  e *pVal;.      s
4f70: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
4f80: 6f 6c 64 28 70 49 74 65 72 2c 20 69 2c 20 26 70  old(pIter, i, &p
4f90: 56 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Val);.      sqli
4fa0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
4fb0: 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 78 2b  (pVal);.      x+
4fc0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
4fd0: 69 66 28 20 6f 70 21 3d 53 51 4c 49 54 45 5f 44  if( op!=SQLITE_D
4fe0: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 66 6f 72  ELETE ){.    for
4ff0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
5000: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
5010: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
5020: 20 20 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e       sqlite3chan
5030: 67 65 73 65 74 5f 6e 65 77 28 70 49 74 65 72 2c  geset_new(pIter,
5040: 20 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20   i, &pVal);.    
5050: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
5060: 74 65 78 74 31 36 28 70 56 61 6c 29 3b 0a 20 20  text16(pVal);.  
5070: 20 20 20 20 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20      x++;.    }. 
5080: 20 7d 0a 0a 20 20 69 66 28 20 65 43 6f 6e 66 3d   }..  if( eConf=
5090: 3d 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45  =SQLITE_CHANGESE
50a0: 54 5f 44 41 54 41 20 29 7b 0a 20 20 20 20 72 65  T_DATA ){.    re
50b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 48 41 4e  turn SQLITE_CHAN
50c0: 47 45 53 45 54 5f 52 45 50 4c 41 43 45 3b 0a 20  GESET_REPLACE;. 
50d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
50e0: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 4f 4d 49  TE_CHANGESET_OMI
50f0: 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  T;.}..static int
5100: 20 74 65 73 74 53 74 72 65 61 6d 49 6e 70 75 74   testStreamInput
5110: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70      /* Context p
5140: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f 69 64  ointer */.  void
5150: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
5160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5170: 75 66 66 65 72 20 74 6f 20 70 6f 70 75 6c 61 74  uffer to populat
5180: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 44 61  e */.  int *pnDa
5190: 74 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ta              
51a0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
51b0: 3a 20 42 79 74 65 73 20 72 65 71 75 65 73 74 65  : Bytes requeste
51c0: 64 2f 73 75 70 70 6c 69 65 64 20 2a 2f 0a 29 7b  d/supplied */.){
51d0: 0a 20 20 54 65 73 74 53 74 72 65 61 6d 49 6e 70  .  TestStreamInp
51e0: 75 74 20 2a 70 20 3d 20 28 54 65 73 74 53 74 72  ut *p = (TestStr
51f0: 65 61 6d 49 6e 70 75 74 2a 29 70 43 74 78 3b 0a  eamInput*)pCtx;.
5200: 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 2a 70 6e    int nReq = *pn
5210: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
5220: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
5230: 74 61 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ta requested */.
5240: 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 2d 3e    int nRem = p->
5250: 6e 44 61 74 61 20 2d 20 70 2d 3e 69 44 61 74 61  nData - p->iData
5260: 3b 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61  ; /* Bytes of da
5270: 74 61 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ta available */.
5280: 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 70 2d 3e    int nRet = p->
5290: 6e 53 74 72 65 61 6d 3b 20 20 20 20 20 20 20 20  nStream;        
52a0: 20 20 2f 2a 20 42 79 74 65 73 20 61 63 74 75 61    /* Bytes actua
52b0: 6c 6c 79 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a  lly returned */.
52c0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
52d0: 6e 64 20 66 72 65 65 20 73 6f 6d 65 20 73 70 61  nd free some spa
52e0: 63 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ce. There is no 
52f0: 70 6f 69 6e 74 20 74 6f 20 74 68 69 73 2c 20 6f  point to this, o
5300: 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74  ther than.  ** t
5310: 68 61 74 20 69 74 20 61 6c 6c 6f 77 73 20 74 68  hat it allows th
5320: 65 20 72 65 67 75 6c 61 72 20 4f 4f 4d 20 66 61  e regular OOM fa
5330: 75 6c 74 2d 69 6e 6a 65 63 74 69 6f 6e 20 74 65  ult-injection te
5340: 73 74 73 20 74 6f 20 63 61 75 73 65 20 61 6e 20  sts to cause an 
5350: 65 72 72 6f 72 0a 20 20 2a 2a 20 69 6e 20 74 68  error.  ** in th
5360: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f  is function.  */
5370: 0a 20 20 76 6f 69 64 20 2a 70 41 6c 6c 6f 63 20  .  void *pAlloc 
5380: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5390: 28 31 30 29 3b 0a 20 20 69 66 28 20 70 41 6c 6c  (10);.  if( pAll
53a0: 6f 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  oc==0 ) return S
53b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
53c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 6c 6c  qlite3_free(pAll
53d0: 6f 63 29 3b 0a 0a 20 20 69 66 28 20 6e 52 65 74  oc);..  if( nRet
53e0: 3e 6e 52 65 71 20 29 20 6e 52 65 74 20 3d 20 6e  >nReq ) nRet = n
53f0: 52 65 71 3b 0a 20 20 69 66 28 20 6e 52 65 74 3e  Req;.  if( nRet>
5400: 6e 52 65 6d 20 29 20 6e 52 65 74 20 3d 20 6e 52  nRem ) nRet = nR
5410: 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  em;..  assert( n
5420: 52 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  Ret>=0 );.  if( 
5430: 6e 52 65 74 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nRet>0 ){.    me
5440: 6d 63 70 79 28 70 44 61 74 61 2c 20 26 70 2d 3e  mcpy(pData, &p->
5450: 61 44 61 74 61 5b 70 2d 3e 69 44 61 74 61 5d 2c  aData[p->iData],
5460: 20 6e 52 65 74 29 3b 0a 20 20 20 20 70 2d 3e 69   nRet);.    p->i
5470: 44 61 74 61 20 2b 3d 20 6e 52 65 74 3b 0a 20 20  Data += nRet;.  
5480: 7d 0a 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e  }..  *pnData = n
5490: 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Ret;.  return SQ
54a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61  LITE_OK;.}...sta
54b0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
54c0: 43 4c 41 50 49 20 74 65 73 74 53 71 6c 69 74 65  CLAPI testSqlite
54d0: 33 63 68 61 6e 67 65 73 65 74 41 70 70 6c 79 28  3changesetApply(
54e0: 0a 20 20 69 6e 74 20 62 56 32 2c 0a 20 20 76 6f  .  int bV2,.  vo
54f0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
5500: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
5510: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
5520: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
5530: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
5540: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
5570: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 43 6d 64 49  le */.  Tcl_CmdI
5580: 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20 20  nfo info;       
5590: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
55a0: 61 73 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  ase Tcl command 
55b0: 28 6f 62 6a 76 5b 31 5d 29 20 69 6e 66 6f 20 2a  (objv[1]) info *
55c0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
55f0: 64 65 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65  de from changese
5600: 74 5f 69 6e 76 65 72 74 28 29 20 2a 2f 0a 20 20  t_invert() */.  
5610: 76 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74  void *pChangeset
5620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5630: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
5640: 6e 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 2a  ning changeset *
5650: 2f 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73  /.  int nChanges
5660: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
5670: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
5680: 75 66 66 65 72 20 61 43 68 61 6e 67 65 73 65 74  uffer aChangeset
5690: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 54   in bytes */.  T
56a0: 65 73 74 43 6f 6e 66 6c 69 63 74 48 61 6e 64 6c  estConflictHandl
56b0: 65 72 20 63 74 78 3b 0a 20 20 54 65 73 74 53 74  er ctx;.  TestSt
56c0: 72 65 61 6d 49 6e 70 75 74 20 73 53 74 72 3b 0a  reamInput sStr;.
56d0: 20 20 76 6f 69 64 20 2a 70 52 65 62 61 73 65 20    void *pRebase 
56e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 62 61  = 0;.  int nReba
56f0: 73 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c  se = 0;.  int fl
5700: 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
5710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
5720: 67 73 20 66 6f 72 20 61 70 70 6c 79 5f 76 32 28  gs for apply_v2(
5730: 29 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ) */..  memset(&
5740: 73 53 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sStr, 0, sizeof(
5750: 73 53 74 72 29 29 3b 0a 20 20 73 53 74 72 2e 6e  sStr));.  sStr.n
5760: 53 74 72 65 61 6d 20 3d 20 74 65 73 74 5f 74 63  Stream = test_tc
5770: 6c 5f 69 6e 74 65 67 65 72 28 69 6e 74 65 72 70  l_integer(interp
5780: 2c 20 53 45 53 53 49 4f 4e 5f 53 54 52 45 41 4d  , SESSION_STREAM
5790: 5f 54 43 4c 5f 56 41 52 29 3b 0a 0a 20 20 2f 2a  _TCL_VAR);..  /*
57a0: 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d   Check for the -
57b0: 6e 6f 73 61 76 65 70 6f 69 6e 74 20 66 6c 61 67  nosavepoint flag
57c0: 20 2a 2f 0a 20 20 69 66 28 20 62 56 32 20 29 7b   */.  if( bV2 ){
57d0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  .    if( objc>1 
57e0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
57f0: 68 61 72 20 2a 7a 31 20 3d 20 54 63 6c 5f 47 65  har *z1 = Tcl_Ge
5800: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
5810: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
5820: 73 74 72 6c 65 6e 28 7a 31 29 3b 0a 20 20 20 20  strlen(z1);.    
5830: 20 20 69 66 28 20 6e 3e 31 20 26 26 20 6e 3c 3d    if( n>1 && n<=
5840: 31 32 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  12 && 0==sqlite3
5850: 5f 73 74 72 6e 69 63 6d 70 28 22 2d 6e 6f 73 61  _strnicmp("-nosa
5860: 76 65 70 6f 69 6e 74 22 2c 20 7a 31 2c 20 6e 29  vepoint", z1, n)
5870: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
5880: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 48 41 4e  s |= SQLITE_CHAN
5890: 47 45 53 45 54 41 50 50 4c 59 5f 4e 4f 53 41 56  GESETAPPLY_NOSAV
58a0: 45 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  EPOINT;.        
58b0: 6f 62 6a 63 2d 2d 3b 0a 20 20 20 20 20 20 20 20  objc--;.        
58c0: 6f 62 6a 76 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  objv++;.      }.
58d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
58e0: 6a 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 6f  jc>1 ){.      co
58f0: 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 54  nst char *z1 = T
5900: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
5910: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  v[1]);.      int
5920: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 31 29 3b   n = strlen(z1);
5930: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31 20 26  .      if( n>1 &
5940: 26 20 6e 3c 3d 37 20 26 26 20 30 3d 3d 73 71 6c  & n<=7 && 0==sql
5950: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
5960: 69 6e 76 65 72 74 22 2c 20 7a 31 2c 20 6e 29 20  invert", z1, n) 
5970: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
5980: 20 7c 3d 20 53 51 4c 49 54 45 5f 43 48 41 4e 47   |= SQLITE_CHANG
5990: 45 53 45 54 41 50 50 4c 59 5f 49 4e 56 45 52 54  ESETAPPLY_INVERT
59a0: 3b 0a 20 20 20 20 20 20 20 20 6f 62 6a 63 2d 2d  ;.        objc--
59b0: 3b 0a 20 20 20 20 20 20 20 20 6f 62 6a 76 2b 2b  ;.        objv++
59c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
59d0: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21    }..  if( objc!
59e0: 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35 20 29 7b  =4 && objc!=5 ){
59f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5a00: 2a 7a 4d 73 67 3b 0a 20 20 20 20 69 66 28 20 62  *zMsg;.    if( b
5a10: 56 32 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  V2 ){.      zMsg
5a20: 20 3d 20 22 3f 2d 6e 6f 73 61 76 65 70 6f 69 6e   = "?-nosavepoin
5a30: 74 3f 20 3f 2d 69 6e 76 65 72 73 65 3f 20 22 0a  t? ?-inverse? ".
5a40: 20 20 20 20 20 20 20 20 22 44 42 20 43 48 41 4e          "DB CHAN
5a50: 47 45 53 45 54 20 43 4f 4e 46 4c 49 43 54 2d 53  GESET CONFLICT-S
5a60: 43 52 49 50 54 20 3f 46 49 4c 54 45 52 2d 53 43  CRIPT ?FILTER-SC
5a70: 52 49 50 54 3f 22 3b 0a 20 20 20 20 7d 65 6c 73  RIPT?";.    }els
5a80: 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  e{.      zMsg = 
5a90: 22 44 42 20 43 48 41 4e 47 45 53 45 54 20 43 4f  "DB CHANGESET CO
5aa0: 4e 46 4c 49 43 54 2d 53 43 52 49 50 54 20 3f 46  NFLICT-SCRIPT ?F
5ab0: 49 4c 54 45 52 2d 53 43 52 49 50 54 3f 22 3b 0a  ILTER-SCRIPT?";.
5ac0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 57 72      }.    Tcl_Wr
5ad0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
5ae0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 7a 4d 73 67  p, 1, objv, zMsg
5af0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5b00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5b10: 66 28 20 30 3d 3d 54 63 6c 5f 47 65 74 43 6f 6d  f( 0==Tcl_GetCom
5b20: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
5b30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5b40: 62 6a 76 5b 31 5d 29 2c 20 26 69 6e 66 6f 29 20  bjv[1]), &info) 
5b50: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
5b60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5b70: 22 6e 6f 20 73 75 63 68 20 68 61 6e 64 6c 65 3a  "no such handle:
5b80: 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
5b90: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 29 3b 0a  g(objv[1]), 0);.
5ba0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5bb0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
5bc0: 20 2a 28 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e   *(sqlite3 **)in
5bd0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
5be0: 3b 0a 20 20 70 43 68 61 6e 67 65 73 65 74 20 3d  ;.  pChangeset =
5bf0: 20 28 76 6f 69 64 20 2a 29 54 63 6c 5f 47 65 74   (void *)Tcl_Get
5c00: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
5c10: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 43 68 61 6e  (objv[2], &nChan
5c20: 67 65 73 65 74 29 3b 0a 20 20 63 74 78 2e 70 43  geset);.  ctx.pC
5c30: 6f 6e 66 6c 69 63 74 53 63 72 69 70 74 20 3d 20  onflictScript = 
5c40: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 63 74 78 2e 70  objv[3];.  ctx.p
5c50: 46 69 6c 74 65 72 53 63 72 69 70 74 20 3d 20 6f  FilterScript = o
5c60: 62 6a 63 3d 3d 35 20 3f 20 6f 62 6a 76 5b 34 5d  bjc==5 ? objv[4]
5c70: 20 3a 20 30 3b 0a 20 20 63 74 78 2e 69 6e 74 65   : 0;.  ctx.inte
5c80: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20  rp = interp;..  
5c90: 69 66 28 20 73 53 74 72 2e 6e 53 74 72 65 61 6d  if( sStr.nStream
5ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ==0 ){.    if( b
5cb0: 56 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  V2==0 ){.      r
5cc0: 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61 6e 67  c = sqlite3chang
5cd0: 65 73 65 74 5f 61 70 70 6c 79 28 64 62 2c 20 6e  eset_apply(db, n
5ce0: 43 68 61 6e 67 65 73 65 74 2c 20 70 43 68 61 6e  Changeset, pChan
5cf0: 67 65 73 65 74 2c 20 0a 20 20 20 20 20 20 20 20  geset, .        
5d00: 20 20 28 6f 62 6a 63 3d 3d 35 29 3f 74 65 73 74    (objc==5)?test
5d10: 5f 66 69 6c 74 65 72 5f 68 61 6e 64 6c 65 72 3a  _filter_handler:
5d20: 30 2c 20 74 65 73 74 5f 63 6f 6e 66 6c 69 63 74  0, test_conflict
5d30: 5f 68 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20  _handler, (void 
5d40: 2a 29 26 63 74 78 0a 20 20 20 20 20 20 29 3b 0a  *)&ctx.      );.
5d50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
5d70: 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28  ngeset_apply_v2(
5d80: 64 62 2c 20 6e 43 68 61 6e 67 65 73 65 74 2c 20  db, nChangeset, 
5d90: 70 43 68 61 6e 67 65 73 65 74 2c 20 0a 20 20 20  pChangeset, .   
5da0: 20 20 20 20 20 20 20 28 6f 62 6a 63 3d 3d 35 29         (objc==5)
5db0: 3f 74 65 73 74 5f 66 69 6c 74 65 72 5f 68 61 6e  ?test_filter_han
5dc0: 64 6c 65 72 3a 30 2c 20 74 65 73 74 5f 63 6f 6e  dler:0, test_con
5dd0: 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 2c 20 28  flict_handler, (
5de0: 76 6f 69 64 20 2a 29 26 63 74 78 2c 0a 20 20 20  void *)&ctx,.   
5df0: 20 20 20 20 20 20 20 26 70 52 65 62 61 73 65 2c         &pRebase,
5e00: 20 26 6e 52 65 62 61 73 65 2c 20 66 6c 61 67 73   &nRebase, flags
5e10: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
5e20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 74    }else{.    sSt
5e30: 72 2e 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67  r.aData = (unsig
5e40: 6e 65 64 20 63 68 61 72 2a 29 70 43 68 61 6e 67  ned char*)pChang
5e50: 65 73 65 74 3b 0a 20 20 20 20 73 53 74 72 2e 6e  eset;.    sStr.n
5e60: 44 61 74 61 20 3d 20 6e 43 68 61 6e 67 65 73 65  Data = nChangese
5e70: 74 3b 0a 20 20 20 20 69 66 28 20 62 56 32 3d 3d  t;.    if( bV2==
5e80: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
5e90: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
5ea0: 5f 61 70 70 6c 79 5f 73 74 72 6d 28 64 62 2c 20  _apply_strm(db, 
5eb0: 74 65 73 74 53 74 72 65 61 6d 49 6e 70 75 74 2c  testStreamInput,
5ec0: 20 28 76 6f 69 64 2a 29 26 73 53 74 72 2c 0a 20   (void*)&sStr,. 
5ed0: 20 20 20 20 20 20 20 20 20 28 6f 62 6a 63 3d 3d           (objc==
5ee0: 35 29 20 3f 20 74 65 73 74 5f 66 69 6c 74 65 72  5) ? test_filter
5ef0: 5f 68 61 6e 64 6c 65 72 20 3a 20 30 2c 20 0a 20  _handler : 0, . 
5f00: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
5f10: 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 2c 20  nflict_handler, 
5f20: 28 76 6f 69 64 20 2a 29 26 63 74 78 0a 20 20 20  (void *)&ctx.   
5f30: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
5f40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5f50: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
5f60: 6c 79 5f 76 32 5f 73 74 72 6d 28 64 62 2c 20 74  ly_v2_strm(db, t
5f70: 65 73 74 53 74 72 65 61 6d 49 6e 70 75 74 2c 20  estStreamInput, 
5f80: 28 76 6f 69 64 2a 29 26 73 53 74 72 2c 0a 20 20  (void*)&sStr,.  
5f90: 20 20 20 20 20 20 20 20 28 6f 62 6a 63 3d 3d 35          (objc==5
5fa0: 29 20 3f 20 74 65 73 74 5f 66 69 6c 74 65 72 5f  ) ? test_filter_
5fb0: 68 61 6e 64 6c 65 72 20 3a 20 30 2c 20 0a 20 20  handler : 0, .  
5fc0: 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6e          test_con
5fd0: 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 2c 20 28  flict_handler, (
5fe0: 76 6f 69 64 20 2a 29 26 63 74 78 2c 0a 20 20 20  void *)&ctx,.   
5ff0: 20 20 20 20 20 20 20 26 70 52 65 62 61 73 65 2c         &pRebase,
6000: 20 26 6e 52 65 62 61 73 65 2c 20 66 6c 61 67 73   &nRebase, flags
6010: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
6020: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
6030: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6040: 72 65 74 75 72 6e 20 74 65 73 74 5f 73 65 73 73  return test_sess
6050: 69 6f 6e 5f 65 72 72 6f 72 28 69 6e 74 65 72 70  ion_error(interp
6060: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , rc, 0);.  }els
6070: 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  e{.    Tcl_Reset
6080: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
6090: 20 20 20 20 69 66 28 20 62 56 32 20 26 26 20 70      if( bV2 && p
60a0: 52 65 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  Rebase ){.      
60b0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
60c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
60d0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 52 65  ByteArrayObj(pRe
60e0: 62 61 73 65 2c 20 6e 52 65 62 61 73 65 29 29 3b  base, nRebase));
60f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
6100: 69 74 65 33 5f 66 72 65 65 28 70 52 65 62 61 73  ite3_free(pRebas
6110: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
6120: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  _OK;.}../*.** sq
6130: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
6140: 70 70 6c 79 20 44 42 20 43 48 41 4e 47 45 53 45  pply DB CHANGESE
6150: 54 20 43 4f 4e 46 4c 49 43 54 2d 53 43 52 49 50  T CONFLICT-SCRIP
6160: 54 20 3f 46 49 4c 54 45 52 2d 53 43 52 49 50 54  T ?FILTER-SCRIPT
6170: 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
6180: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
6190: 73 74 5f 73 71 6c 69 74 65 33 63 68 61 6e 67 65  st_sqlite3change
61a0: 73 65 74 5f 61 70 70 6c 79 28 0a 20 20 76 6f 69  set_apply(.  voi
61b0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
61c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
61d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
61e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
61f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 72  ST objv[].){.  r
6200: 65 74 75 72 6e 20 74 65 73 74 53 71 6c 69 74 65  eturn testSqlite
6210: 33 63 68 61 6e 67 65 73 65 74 41 70 70 6c 79 28  3changesetApply(
6220: 30 2c 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  0, clientData, i
6230: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
6240: 76 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  v);.}./*.** sqli
6250: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
6260: 6c 79 5f 76 32 20 44 42 20 43 48 41 4e 47 45 53  ly_v2 DB CHANGES
6270: 45 54 20 43 4f 4e 46 4c 49 43 54 2d 53 43 52 49  ET CONFLICT-SCRI
6280: 50 54 20 3f 46 49 4c 54 45 52 2d 53 43 52 49 50  PT ?FILTER-SCRIP
6290: 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T?.*/.static int
62a0: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
62b0: 65 73 74 5f 73 71 6c 69 74 65 33 63 68 61 6e 67  est_sqlite3chang
62c0: 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 28 0a 20  eset_apply_v2(. 
62d0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
62e0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
62f0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
6300: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
6310: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
6320: 0a 20 20 72 65 74 75 72 6e 20 74 65 73 74 53 71  .  return testSq
6330: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 41 70  lite3changesetAp
6340: 70 6c 79 28 31 2c 20 63 6c 69 65 6e 74 44 61 74  ply(1, clientDat
6350: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  a, interp, objc,
6360: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   objv);.}../*.**
6370: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
6380: 74 5f 61 70 70 6c 79 5f 72 65 70 6c 61 63 65 5f  t_apply_replace_
6390: 61 6c 6c 20 44 42 20 43 48 41 4e 47 45 53 45 54  all DB CHANGESET
63a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
63b0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
63c0: 73 74 5f 73 71 6c 69 74 65 33 63 68 61 6e 67 65  st_sqlite3change
63d0: 73 65 74 5f 61 70 70 6c 79 5f 72 65 70 6c 61 63  set_apply_replac
63e0: 65 5f 61 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  e_all(.  void * 
63f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
6400: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6410: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
6420: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
6430: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
6440: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
6450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6460: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
6470: 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69  .  Tcl_CmdInfo i
6480: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
6490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 54     /* Database T
64a0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 28 6f 62 6a 76  cl command (objv
64b0: 5b 31 5d 29 20 69 6e 66 6f 20 2a 2f 0a 20 20 69  [1]) info */.  i
64c0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
64e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
64f0: 6f 6d 20 63 68 61 6e 67 65 73 65 74 5f 69 6e 76  om changeset_inv
6500: 65 72 74 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  ert() */.  void 
6510: 2a 70 43 68 61 6e 67 65 73 65 74 3b 20 20 20 20  *pChangeset;    
6520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
6530: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
6540: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 20 20 69  changeset */.  i
6550: 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 3b 20 20  nt nChangeset;  
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6570: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
6580: 20 61 43 68 61 6e 67 65 73 65 74 20 69 6e 20 62   aChangeset in b
6590: 79 74 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  ytes */..  if( o
65a0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
65b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
65c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
65d0: 22 44 42 20 43 48 41 4e 47 45 53 45 54 22 29 3b  "DB CHANGESET");
65e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
65f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
6600: 20 30 3d 3d 54 63 6c 5f 47 65 74 43 6f 6d 6d 61   0==Tcl_GetComma
6610: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
6620: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
6630: 76 5b 31 5d 29 2c 20 26 69 6e 66 6f 29 20 29 7b  v[1]), &info) ){
6640: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6650: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
6660: 6f 20 73 75 63 68 20 68 61 6e 64 6c 65 3a 20 22  o such handle: "
6670: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
6680: 6f 62 6a 76 5b 32 5d 29 2c 20 30 29 3b 0a 20 20  objv[2]), 0);.  
6690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
66a0: 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 2a  OR;.  }.  db = *
66b0: 28 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e 66 6f  (sqlite3 **)info
66c0: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a  .objClientData;.
66d0: 20 20 70 43 68 61 6e 67 65 73 65 74 20 3d 20 28    pChangeset = (
66e0: 76 6f 69 64 20 2a 29 54 63 6c 5f 47 65 74 42 79  void *)Tcl_GetBy
66f0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
6700: 62 6a 76 5b 32 5d 2c 20 26 6e 43 68 61 6e 67 65  bjv[2], &nChange
6710: 73 65 74 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  set);..  rc = sq
6720: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61  lite3changeset_a
6730: 70 70 6c 79 28 64 62 2c 20 6e 43 68 61 6e 67 65  pply(db, nChange
6740: 73 65 74 2c 20 70 43 68 61 6e 67 65 73 65 74 2c  set, pChangeset,
6750: 20 30 2c 20 72 65 70 6c 61 63 65 5f 68 61 6e 64   0, replace_hand
6760: 6c 65 72 2c 30 29 3b 0a 20 20 69 66 28 20 72 63  ler,0);.  if( rc
6770: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6780: 20 20 20 72 65 74 75 72 6e 20 74 65 73 74 5f 73     return test_s
6790: 65 73 73 69 6f 6e 5f 65 72 72 6f 72 28 69 6e 74  ession_error(int
67a0: 65 72 70 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d  erp, rc, 0);.  }
67b0: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
67c0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
67d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
67e0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 63 68  ./*.** sqlite3ch
67f0: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 20 43  angeset_invert C
6800: 48 41 4e 47 45 53 45 54 0a 2a 2f 0a 73 74 61 74  HANGESET.*/.stat
6810: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
6820: 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 69 74 65  LAPI test_sqlite
6830: 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72  3changeset_inver
6840: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
6850: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
6860: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
6870: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
6880: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
6890: 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ].){.  int rc;  
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
68c0: 20 63 6f 64 65 20 66 72 6f 6d 20 63 68 61 6e 67   code from chang
68d0: 65 73 65 74 5f 69 6e 76 65 72 74 28 29 20 2a 2f  eset_invert() */
68e0: 0a 20 20 54 65 73 74 53 74 72 65 61 6d 49 6e 70  .  TestStreamInp
68f0: 75 74 20 73 49 6e 3b 20 20 20 20 20 20 20 20 20  ut sIn;         
6900: 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 65     /* Input stre
6910: 61 6d 20 2a 2f 0a 20 20 54 65 73 74 53 65 73 73  am */.  TestSess
6920: 69 6f 6e 73 42 6c 6f 62 20 73 4f 75 74 3b 20 20  ionsBlob sOut;  
6930: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6940: 74 20 62 6c 6f 62 20 2a 2f 0a 0a 20 20 69 66 28  t blob */..  if(
6950: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
6960: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6970: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
6980: 2c 20 22 43 48 41 4e 47 45 53 45 54 22 29 3b 0a  , "CHANGESET");.
6990: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
69a0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  RROR;.  }..  mem
69b0: 73 65 74 28 26 73 49 6e 2c 20 30 2c 20 73 69 7a  set(&sIn, 0, siz
69c0: 65 6f 66 28 73 49 6e 29 29 3b 0a 20 20 6d 65 6d  eof(sIn));.  mem
69d0: 73 65 74 28 26 73 4f 75 74 2c 20 30 2c 20 73 69  set(&sOut, 0, si
69e0: 7a 65 6f 66 28 73 4f 75 74 29 29 3b 0a 20 20 73  zeof(sOut));.  s
69f0: 49 6e 2e 6e 53 74 72 65 61 6d 20 3d 20 74 65 73  In.nStream = tes
6a00: 74 5f 74 63 6c 5f 69 6e 74 65 67 65 72 28 69 6e  t_tcl_integer(in
6a10: 74 65 72 70 2c 20 53 45 53 53 49 4f 4e 5f 53 54  terp, SESSION_ST
6a20: 52 45 41 4d 5f 54 43 4c 5f 56 41 52 29 3b 0a 20  REAM_TCL_VAR);. 
6a30: 20 73 49 6e 2e 61 44 61 74 61 20 3d 20 54 63 6c   sIn.aData = Tcl
6a40: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
6a50: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 73  mObj(objv[1], &s
6a60: 49 6e 2e 6e 44 61 74 61 29 3b 0a 0a 20 20 69 66  In.nData);..  if
6a70: 28 20 73 49 6e 2e 6e 53 74 72 65 61 6d 20 29 7b  ( sIn.nStream ){
6a80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6a90: 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72  3changeset_inver
6aa0: 74 5f 73 74 72 6d 28 0a 20 20 20 20 20 20 20 20  t_strm(.        
6ab0: 74 65 73 74 53 74 72 65 61 6d 49 6e 70 75 74 2c  testStreamInput,
6ac0: 20 28 76 6f 69 64 2a 29 26 73 49 6e 2c 20 74 65   (void*)&sIn, te
6ad0: 73 74 53 74 72 65 61 6d 4f 75 74 70 75 74 2c 20  stStreamOutput, 
6ae0: 28 76 6f 69 64 2a 29 26 73 4f 75 74 0a 20 20 20  (void*)&sOut.   
6af0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
6b00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 63 68 61   rc = sqlite3cha
6b10: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 73 49  ngeset_invert(sI
6b20: 6e 2e 6e 44 61 74 61 2c 20 73 49 6e 2e 61 44 61  n.nData, sIn.aDa
6b30: 74 61 2c 20 26 73 4f 75 74 2e 6e 2c 20 26 73 4f  ta, &sOut.n, &sO
6b40: 75 74 2e 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ut.p);.  }.  if(
6b50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6b60: 7b 0a 20 20 20 20 72 63 20 3d 20 74 65 73 74 5f  {.    rc = test_
6b70: 73 65 73 73 69 6f 6e 5f 65 72 72 6f 72 28 69 6e  session_error(in
6b80: 74 65 72 70 2c 20 72 63 2c 20 30 29 3b 0a 20 20  terp, rc, 0);.  
6b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53  }else{.    Tcl_S
6ba0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6bb0: 72 70 2c 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  rp,Tcl_NewByteAr
6bc0: 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e 65 64  rayObj((unsigned
6bd0: 20 63 68 61 72 2a 29 73 4f 75 74 2e 70 2c 73 4f   char*)sOut.p,sO
6be0: 75 74 2e 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ut.n));.  }.  sq
6bf0: 6c 69 74 65 33 5f 66 72 65 65 28 73 4f 75 74 2e  lite3_free(sOut.
6c00: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
6c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  .}../*.** sqlite
6c20: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
6c30: 74 20 4c 45 46 54 20 52 49 47 48 54 0a 2a 2f 0a  t LEFT RIGHT.*/.
6c40: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
6c50: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71  E_TCLAPI test_sq
6c60: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63  lite3changeset_c
6c70: 6f 6e 63 61 74 28 0a 20 20 76 6f 69 64 20 2a 20  oncat(.  void * 
6c80: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
6c90: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6ca0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
6cb0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
6cc0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
6cd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6cf0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 63  turn code from c
6d00: 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28  hangeset_invert(
6d10: 29 20 2a 2f 0a 0a 20 20 54 65 73 74 53 74 72 65  ) */..  TestStre
6d20: 61 6d 49 6e 70 75 74 20 73 4c 65 66 74 3b 20 20  amInput sLeft;  
6d30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
6d40: 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 54 65 73   stream */.  Tes
6d50: 74 53 74 72 65 61 6d 49 6e 70 75 74 20 73 52 69  tStreamInput sRi
6d60: 67 68 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ght;         /* 
6d70: 49 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  Input stream */.
6d80: 20 20 54 65 73 74 53 65 73 73 69 6f 6e 73 42 6c    TestSessionsBl
6d90: 6f 62 20 73 4f 75 74 20 3d 20 7b 30 2c 30 7d 3b  ob sOut = {0,0};
6da0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 6c 6f 62    /* Output blob
6db0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
6dc0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
6dd0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6de0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4c 45 46  p, 1, objv, "LEF
6df0: 54 20 52 49 47 48 54 22 29 3b 0a 20 20 20 20 72  T RIGHT");.    r
6e00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6e10: 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26  .  }..  memset(&
6e20: 73 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sLeft, 0, sizeof
6e30: 28 73 4c 65 66 74 29 29 3b 0a 20 20 6d 65 6d 73  (sLeft));.  mems
6e40: 65 74 28 26 73 52 69 67 68 74 2c 20 30 2c 20 73  et(&sRight, 0, s
6e50: 69 7a 65 6f 66 28 73 52 69 67 68 74 29 29 3b 0a  izeof(sRight));.
6e60: 20 20 73 4c 65 66 74 2e 61 44 61 74 61 20 3d 20    sLeft.aData = 
6e70: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
6e80: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
6e90: 20 26 73 4c 65 66 74 2e 6e 44 61 74 61 29 3b 0a   &sLeft.nData);.
6ea0: 20 20 73 52 69 67 68 74 2e 61 44 61 74 61 20 3d    sRight.aData =
6eb0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6ec0: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
6ed0: 2c 20 26 73 52 69 67 68 74 2e 6e 44 61 74 61 29  , &sRight.nData)
6ee0: 3b 0a 20 20 73 4c 65 66 74 2e 6e 53 74 72 65 61  ;.  sLeft.nStrea
6ef0: 6d 20 3d 20 74 65 73 74 5f 74 63 6c 5f 69 6e 74  m = test_tcl_int
6f00: 65 67 65 72 28 69 6e 74 65 72 70 2c 20 53 45 53  eger(interp, SES
6f10: 53 49 4f 4e 5f 53 54 52 45 41 4d 5f 54 43 4c 5f  SION_STREAM_TCL_
6f20: 56 41 52 29 3b 0a 20 20 73 52 69 67 68 74 2e 6e  VAR);.  sRight.n
6f30: 53 74 72 65 61 6d 20 3d 20 73 4c 65 66 74 2e 6e  Stream = sLeft.n
6f40: 53 74 72 65 61 6d 3b 0a 0a 20 20 69 66 28 20 73  Stream;..  if( s
6f50: 4c 65 66 74 2e 6e 53 74 72 65 61 6d 3e 30 20 29  Left.nStream>0 )
6f60: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6f70: 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63  e3changeset_conc
6f80: 61 74 5f 73 74 72 6d 28 0a 20 20 20 20 20 20 20  at_strm(.       
6f90: 20 74 65 73 74 53 74 72 65 61 6d 49 6e 70 75 74   testStreamInput
6fa0: 2c 20 28 76 6f 69 64 2a 29 26 73 4c 65 66 74 2c  , (void*)&sLeft,
6fb0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 53 74 72  .        testStr
6fc0: 65 61 6d 49 6e 70 75 74 2c 20 28 76 6f 69 64 2a  eamInput, (void*
6fd0: 29 26 73 52 69 67 68 74 2c 0a 20 20 20 20 20 20  )&sRight,.      
6fe0: 20 20 74 65 73 74 53 74 72 65 61 6d 4f 75 74 70    testStreamOutp
6ff0: 75 74 2c 20 28 76 6f 69 64 2a 29 26 73 4f 75 74  ut, (void*)&sOut
7000: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
7010: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7020: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
7030: 74 28 0a 20 20 20 20 20 20 20 20 73 4c 65 66 74  t(.        sLeft
7040: 2e 6e 44 61 74 61 2c 20 73 4c 65 66 74 2e 61 44  .nData, sLeft.aD
7050: 61 74 61 2c 20 73 52 69 67 68 74 2e 6e 44 61 74  ata, sRight.nDat
7060: 61 2c 20 73 52 69 67 68 74 2e 61 44 61 74 61 2c  a, sRight.aData,
7070: 20 26 73 4f 75 74 2e 6e 2c 20 26 73 4f 75 74 2e   &sOut.n, &sOut.
7080: 70 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  p.    );.  }..  
7090: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
70a0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 65  K ){.    rc = te
70b0: 73 74 5f 73 65 73 73 69 6f 6e 5f 65 72 72 6f 72  st_session_error
70c0: 28 69 6e 74 65 72 70 2c 20 72 63 2c 20 30 29 3b  (interp, rc, 0);
70d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
70e0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
70f0: 6e 74 65 72 70 2c 54 63 6c 5f 4e 65 77 42 79 74  nterp,Tcl_NewByt
7100: 65 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67  eArrayObj((unsig
7110: 6e 65 64 20 63 68 61 72 2a 29 73 4f 75 74 2e 70  ned char*)sOut.p
7120: 2c 73 4f 75 74 2e 6e 29 29 3b 0a 20 20 7d 0a 20  ,sOut.n));.  }. 
7130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 4f   sqlite3_free(sO
7140: 75 74 2e 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ut.p);.  return 
7150: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  rc;.}../*.** sql
7160: 69 74 65 33 73 65 73 73 69 6f 6e 5f 66 6f 72 65  ite3session_fore
7170: 61 63 68 20 56 41 52 4e 41 4d 45 20 43 48 41 4e  ach VARNAME CHAN
7180: 47 45 53 45 54 20 53 43 52 49 50 54 0a 2a 2f 0a  GESET SCRIPT.*/.
7190: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
71a0: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71  E_TCLAPI test_sq
71b0: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 66 6f 72  lite3session_for
71c0: 65 61 63 68 28 0a 20 20 76 6f 69 64 20 2a 20 63  each(.  void * c
71d0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
71e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
71f0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
7200: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
7210: 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  jv[].){.  void *
7220: 70 43 68 61 6e 67 65 73 65 74 3b 0a 20 20 69 6e  pChangeset;.  in
7230: 74 20 6e 43 68 61 6e 67 65 73 65 74 3b 0a 20 20  t nChangeset;.  
7240: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65  sqlite3_changese
7250: 74 5f 69 74 65 72 20 2a 70 49 74 65 72 3b 0a 20  t_iter *pIter;. 
7260: 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f   int rc;.  Tcl_O
7270: 62 6a 20 2a 70 56 61 72 6e 61 6d 65 3b 0a 20 20  bj *pVarname;.  
7280: 54 63 6c 5f 4f 62 6a 20 2a 70 43 53 3b 0a 20 20  Tcl_Obj *pCS;.  
7290: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
72a0: 3b 0a 20 20 69 6e 74 20 69 73 43 68 65 63 6b 4e  ;.  int isCheckN
72b0: 65 78 74 20 3d 20 30 3b 0a 0a 20 20 54 65 73 74  ext = 0;..  Test
72c0: 53 74 72 65 61 6d 49 6e 70 75 74 20 73 53 74 72  StreamInput sStr
72d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 74 72  ;.  memset(&sStr
72e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 74 72  , 0, sizeof(sStr
72f0: 29 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e  ));..  if( objc>
7300: 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  1 ){.    char *z
7310: 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Opt = Tcl_GetStr
7320: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
7330: 20 20 69 73 43 68 65 63 6b 4e 65 78 74 20 3d 20    isCheckNext = 
7340: 28 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 22 2d  (strcmp(zOpt, "-
7350: 6e 65 78 74 22 29 3d 3d 30 29 3b 0a 20 20 7d 0a  next")==0);.  }.
7360: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 2b 69 73    if( objc!=4+is
7370: 43 68 65 63 6b 4e 65 78 74 20 29 7b 0a 20 20 20  CheckNext ){.   
7380: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7390: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
73a0: 76 2c 20 22 3f 2d 6e 65 78 74 3f 20 56 41 52 4e  v, "?-next? VARN
73b0: 41 4d 45 20 43 48 41 4e 47 45 53 45 54 20 53 43  AME CHANGESET SC
73c0: 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
73d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
73e0: 7d 0a 0a 20 20 70 56 61 72 6e 61 6d 65 20 3d 20  }..  pVarname = 
73f0: 6f 62 6a 76 5b 31 2b 69 73 43 68 65 63 6b 4e 65  objv[1+isCheckNe
7400: 78 74 5d 3b 0a 20 20 70 43 53 20 3d 20 6f 62 6a  xt];.  pCS = obj
7410: 76 5b 32 2b 69 73 43 68 65 63 6b 4e 65 78 74 5d  v[2+isCheckNext]
7420: 3b 0a 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62  ;.  pScript = ob
7430: 6a 76 5b 33 2b 69 73 43 68 65 63 6b 4e 65 78 74  jv[3+isCheckNext
7440: 5d 3b 0a 0a 20 20 70 43 68 61 6e 67 65 73 65 74  ];..  pChangeset
7450: 20 3d 20 28 76 6f 69 64 20 2a 29 54 63 6c 5f 47   = (void *)Tcl_G
7460: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
7470: 62 6a 28 70 43 53 2c 20 26 6e 43 68 61 6e 67 65  bj(pCS, &nChange
7480: 73 65 74 29 3b 0a 20 20 73 53 74 72 2e 6e 53 74  set);.  sStr.nSt
7490: 72 65 61 6d 20 3d 20 74 65 73 74 5f 74 63 6c 5f  ream = test_tcl_
74a0: 69 6e 74 65 67 65 72 28 69 6e 74 65 72 70 2c 20  integer(interp, 
74b0: 53 45 53 53 49 4f 4e 5f 53 54 52 45 41 4d 5f 54  SESSION_STREAM_T
74c0: 43 4c 5f 56 41 52 29 3b 0a 20 20 69 66 28 20 73  CL_VAR);.  if( s
74d0: 53 74 72 2e 6e 53 74 72 65 61 6d 3d 3d 30 20 29  Str.nStream==0 )
74e0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
74f0: 65 33 63 68 61 6e 67 65 73 65 74 5f 73 74 61 72  e3changeset_star
7500: 74 28 26 70 49 74 65 72 2c 20 6e 43 68 61 6e 67  t(&pIter, nChang
7510: 65 73 65 74 2c 20 70 43 68 61 6e 67 65 73 65 74  eset, pChangeset
7520: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7530: 73 53 74 72 2e 61 44 61 74 61 20 3d 20 28 75 6e  sStr.aData = (un
7540: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 68  signed char*)pCh
7550: 61 6e 67 65 73 65 74 3b 0a 20 20 20 20 73 53 74  angeset;.    sSt
7560: 72 2e 6e 44 61 74 61 20 3d 20 6e 43 68 61 6e 67  r.nData = nChang
7570: 65 73 65 74 3b 0a 20 20 20 20 72 63 20 3d 20 73  eset;.    rc = s
7580: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7590: 73 74 61 72 74 5f 73 74 72 6d 28 26 70 49 74 65  start_strm(&pIte
75a0: 72 2c 20 74 65 73 74 53 74 72 65 61 6d 49 6e 70  r, testStreamInp
75b0: 75 74 2c 20 28 76 6f 69 64 2a 29 26 73 53 74 72  ut, (void*)&sStr
75c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
75d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
75e0: 20 20 72 65 74 75 72 6e 20 74 65 73 74 5f 73 65    return test_se
75f0: 73 73 69 6f 6e 5f 65 72 72 6f 72 28 69 6e 74 65  ssion_error(inte
7600: 72 70 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a  rp, rc, 0);.  }.
7610: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
7620: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 63 68 61  _ROW==sqlite3cha
7630: 6e 67 65 73 65 74 5f 6e 65 78 74 28 70 49 74 65  ngeset_next(pIte
7640: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  r) ){.    int nC
7650: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7660: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7670: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
7680: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
7690: 20 6e 43 6f 6c 32 3b 20 20 20 20 20 20 20 20 20   nCol2;         
76a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
76b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
76c0: 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  in table */.    
76d0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
76f0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
7700: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
7710: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
7720: 61 72 20 2a 7a 54 61 62 3b 20 20 20 20 20 20 20  ar *zTab;       
7730: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7740: 20 74 61 62 6c 65 20 63 68 61 6e 67 65 20 61 70   table change ap
7750: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20  plies to */.    
7760: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 20 20  Tcl_Obj *pVar;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7780: 20 54 63 6c 20 76 61 6c 75 65 20 74 6f 20 73 65   Tcl value to se
7790: 74 20 24 56 41 52 4e 41 4d 45 20 74 6f 20 2a 2f  t $VARNAME to */
77a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  .    Tcl_Obj *pO
77b0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
77c0: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
77d0: 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  old.* values */.
77e0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65      Tcl_Obj *pNe
77f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
7800: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 6e    /* Vector of n
7810: 65 77 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ew.* values */. 
7820: 20 20 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74     int bIndirect
7830: 3b 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 4b  ;..    char *zPK
7840: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
7850: 68 61 72 20 2a 61 62 50 4b 3b 0a 20 20 20 20 69  har *abPK;.    i
7860: 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 65  nt i;..    /* Te
7870: 73 74 20 74 68 61 74 20 5f 66 6b 5f 63 6f 6e 66  st that _fk_conf
7880: 6c 69 63 74 73 28 29 20 72 65 74 75 72 6e 73 20  licts() returns 
7890: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
78a0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 0a   called on this.
78b0: 20 20 20 20 2a 2a 20 69 74 65 72 61 74 6f 72 2e      ** iterator.
78c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 75 6d   */.    int nDum
78d0: 6d 79 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  my;.    if( SQLI
78e0: 54 45 5f 4d 49 53 55 53 45 21 3d 73 71 6c 69 74  TE_MISUSE!=sqlit
78f0: 65 33 63 68 61 6e 67 65 73 65 74 5f 66 6b 5f 63  e3changeset_fk_c
7900: 6f 6e 66 6c 69 63 74 73 28 70 49 74 65 72 2c 20  onflicts(pIter, 
7910: 26 6e 44 75 6d 6d 79 29 20 29 7b 0a 20 20 20 20  &nDummy) ){.    
7920: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
7930: 65 74 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65  et_finalize(pIte
7940: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
7950: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7960: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 63 68  }..    sqlite3ch
7970: 61 6e 67 65 73 65 74 5f 6f 70 28 70 49 74 65 72  angeset_op(pIter
7980: 2c 20 26 7a 54 61 62 2c 20 26 6e 43 6f 6c 2c 20  , &zTab, &nCol, 
7990: 26 6f 70 2c 20 26 62 49 6e 64 69 72 65 63 74 29  &op, &bIndirect)
79a0: 3b 0a 20 20 20 20 70 56 61 72 20 3d 20 54 63 6c  ;.    pVar = Tcl
79b0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54  _NewObj();.    T
79c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
79d0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 56 61 72 2c  Element(0, pVar,
79e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
79f0: 6a 28 0a 20 20 20 20 20 20 20 20 20 20 6f 70 3d  j(.          op=
7a00: 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 3f  =SQLITE_INSERT ?
7a10: 20 22 49 4e 53 45 52 54 22 20 3a 0a 20 20 20 20   "INSERT" :.    
7a20: 20 20 20 20 20 20 6f 70 3d 3d 53 51 4c 49 54 45        op==SQLITE
7a30: 5f 55 50 44 41 54 45 20 3f 20 22 55 50 44 41 54  _UPDATE ? "UPDAT
7a40: 45 22 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  E" : .          
7a50: 22 44 45 4c 45 54 45 22 2c 20 2d 31 0a 20 20 20  "DELETE", -1.   
7a60: 20 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69   ));..    Tcl_Li
7a70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
7a80: 6e 74 28 30 2c 20 70 56 61 72 2c 20 54 63 6c 5f  nt(0, pVar, Tcl_
7a90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
7aa0: 62 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  b, -1));.    Tcl
7ab0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7ac0: 65 6d 65 6e 74 28 30 2c 20 70 56 61 72 2c 20 54  ement(0, pVar, T
7ad0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
7ae0: 28 62 49 6e 64 69 72 65 63 74 29 29 3b 0a 0a 20  (bIndirect));.. 
7af0: 20 20 20 7a 50 4b 20 3d 20 63 6b 61 6c 6c 6f 63     zPK = ckalloc
7b00: 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 6d 65  (nCol+1);.    me
7b10: 6d 73 65 74 28 7a 50 4b 2c 20 30 2c 20 6e 43 6f  mset(zPK, 0, nCo
7b20: 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
7b30: 33 63 68 61 6e 67 65 73 65 74 5f 70 6b 28 70 49  3changeset_pk(pI
7b40: 74 65 72 2c 20 26 61 62 50 4b 2c 20 26 6e 43 6f  ter, &abPK, &nCo
7b50: 6c 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l2);.    assert(
7b60: 20 6e 43 6f 6c 3d 3d 6e 43 6f 6c 32 20 29 3b 0a   nCol==nCol2 );.
7b70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7b80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
7b90: 20 7a 50 4b 5b 69 5d 20 3d 20 28 61 62 50 4b 5b   zPK[i] = (abPK[
7ba0: 69 5d 20 3f 20 27 58 27 20 3a 20 27 2e 27 29 3b  i] ? 'X' : '.');
7bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c  .    }.    Tcl_L
7bc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7bd0: 65 6e 74 28 30 2c 20 70 56 61 72 2c 20 54 63 6c  ent(0, pVar, Tcl
7be0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 50  _NewStringObj(zP
7bf0: 4b 2c 20 2d 31 29 29 3b 0a 20 20 20 20 63 6b 66  K, -1));.    ckf
7c00: 72 65 65 28 7a 50 4b 29 3b 0a 0a 20 20 20 20 70  ree(zPK);..    p
7c10: 4f 6c 64 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Old = Tcl_NewObj
7c20: 28 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d  ();.    if( op!=
7c30: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 29 7b  SQLITE_INSERT ){
7c40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7c50: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
7c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
7c70: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  lue *pVal;.     
7c80: 20 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65     sqlite3change
7c90: 73 65 74 5f 6f 6c 64 28 70 49 74 65 72 2c 20 69  set_old(pIter, i
7ca0: 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &pVal);.      
7cb0: 20 20 74 65 73 74 5f 61 70 70 65 6e 64 5f 76 61    test_append_va
7cc0: 6c 75 65 28 70 4f 6c 64 2c 20 70 56 61 6c 29 3b  lue(pOld, pVal);
7cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7ce0: 20 20 20 70 4e 65 77 20 3d 20 54 63 6c 5f 4e 65     pNew = Tcl_Ne
7cf0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 69 66 28 20  wObj();.    if( 
7d00: 6f 70 21 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op!=SQLITE_DELET
7d10: 45 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  E ){.      for(i
7d20: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
7d30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7d40: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
7d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 63 68         sqlite3ch
7d60: 61 6e 67 65 73 65 74 5f 6e 65 77 28 70 49 74 65  angeset_new(pIte
7d70: 72 2c 20 69 2c 20 26 70 56 61 6c 29 3b 0a 20 20  r, i, &pVal);.  
7d80: 20 20 20 20 20 20 74 65 73 74 5f 61 70 70 65 6e        test_appen
7d90: 64 5f 76 61 6c 75 65 28 70 4e 65 77 2c 20 70 56  d_value(pNew, pV
7da0: 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  al);.      }.   
7db0: 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
7dc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7dd0: 30 2c 20 70 56 61 72 2c 20 70 4f 6c 64 29 3b 0a  0, pVar, pOld);.
7de0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7df0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
7e00: 70 56 61 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  pVar, pNew);..  
7e10: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
7e20: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 6e 61 6d  (interp, pVarnam
7e30: 65 2c 20 30 2c 20 70 56 61 72 2c 20 30 29 3b 0a  e, 0, pVar, 0);.
7e40: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
7e50: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
7e60: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
7e70: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 26  if( rc!=TCL_OK &
7e80: 26 20 72 63 21 3d 54 43 4c 5f 43 4f 4e 54 49 4e  & rc!=TCL_CONTIN
7e90: 55 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  UE ){.      sqli
7ea0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69 6e  te3changeset_fin
7eb0: 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20 20  alize(pIter);.  
7ec0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3d 3d 54      return rc==T
7ed0: 43 4c 5f 42 52 45 41 4b 20 3f 20 54 43 4c 5f 4f  CL_BREAK ? TCL_O
7ee0: 4b 20 3a 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  K : rc;.    }.  
7ef0: 7d 0a 0a 20 20 69 66 28 20 69 73 43 68 65 63 6b  }..  if( isCheck
7f00: 4e 65 78 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Next ){.    int 
7f10: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 63 68 61  rc2 = sqlite3cha
7f20: 6e 67 65 73 65 74 5f 6e 65 78 74 28 70 49 74 65  ngeset_next(pIte
7f30: 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
7f40: 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 66 69  ite3changeset_fi
7f50: 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20  nalize(pIter);. 
7f60: 20 20 20 61 73 73 65 72 74 28 20 28 72 63 32 3d     assert( (rc2=
7f70: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
7f80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c  rc==SQLITE_OK) |
7f90: 7c 20 72 63 32 3d 3d 72 63 20 29 3b 0a 20 20 7d  | rc2==rc );.  }
7fa0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
7fb0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
7fc0: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b  finalize(pIter);
7fd0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
7fe0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ff0: 72 65 74 75 72 6e 20 74 65 73 74 5f 73 65 73 73  return test_sess
8000: 69 6f 6e 5f 65 72 72 6f 72 28 69 6e 74 65 72 70  ion_error(interp
8010: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  , rc, 0);.  }.. 
8020: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8030: 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
8040: 20 43 4d 44 20 63 6f 6e 66 69 67 75 72 65 20 52   CMD configure R
8050: 45 42 41 53 45 2d 42 4c 4f 42 0a 2a 2a 20 74 63  EBASE-BLOB.** tc
8060: 6c 63 6d 64 3a 20 43 4d 44 20 72 65 62 61 73 65  lcmd: CMD rebase
8070: 20 43 48 41 4e 47 45 53 45 54 0a 2a 2a 20 74 63   CHANGESET.** tc
8080: 6c 63 6d 64 3a 20 43 4d 44 20 64 65 6c 65 74 65  lcmd: CMD delete
8090: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
80a0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
80b0: 74 5f 72 65 62 61 73 65 72 5f 63 6d 64 28 0a 20  t_rebaser_cmd(. 
80c0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
80d0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
80e0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
80f0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
8100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
8110: 0a 20 20 73 74 72 75 63 74 20 52 65 62 61 73 65  .  struct Rebase
8120: 53 75 62 63 6d 64 20 7b 0a 20 20 20 20 63 6f 6e  Subcmd {.    con
8130: 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 0a 20  st char *zSub;. 
8140: 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
8150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
8160: 67 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b  g;.    int iSub;
8170: 0a 20 20 7d 20 61 53 75 62 5b 5d 20 3d 20 7b 0a  .  } aSub[] = {.
8180: 20 20 20 20 7b 20 22 63 6f 6e 66 69 67 75 72 65      { "configure
8190: 22 2c 20 20 20 20 31 2c 20 22 52 45 42 41 53 45  ",    1, "REBASE
81a0: 2d 42 4c 4f 42 22 20 7d 2c 20 2f 2a 20 30 20 2a  -BLOB" }, /* 0 *
81b0: 2f 0a 20 20 20 20 7b 20 22 64 65 6c 65 74 65 22  /.    { "delete"
81c0: 2c 20 20 20 20 20 20 20 30 2c 20 22 22 20 20 20  ,       0, ""   
81d0: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 31           }, /* 1
81e0: 20 2a 2f 0a 20 20 20 20 7b 20 22 72 65 62 61 73   */.    { "rebas
81f0: 65 22 2c 20 20 20 20 20 20 20 31 2c 20 22 43 48  e",       1, "CH
8200: 41 4e 47 45 53 45 54 22 20 20 20 7d 2c 20 2f 2a  ANGESET"   }, /*
8210: 20 32 20 2a 2f 0a 20 20 20 20 7b 20 30 20 7d 0a   2 */.    { 0 }.
8220: 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f    };..  sqlite3_
8230: 72 65 62 61 73 65 72 20 2a 70 20 3d 20 28 73 71  rebaser *p = (sq
8240: 6c 69 74 65 33 5f 72 65 62 61 73 65 72 2a 29 63  lite3_rebaser*)c
8250: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e 74  lientData;.  int
8260: 20 69 53 75 62 3b 0a 20 20 69 6e 74 20 72 63 3b   iSub;.  int rc;
8270: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
8280: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
8290: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
82a0: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
82b0: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
82c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
82d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f  .  }.  rc = Tcl_
82e0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53  GetIndexFromObjS
82f0: 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 0a 20  truct(interp, . 
8300: 20 20 20 20 20 6f 62 6a 76 5b 31 5d 2c 20 61 53       objv[1], aS
8310: 75 62 2c 20 73 69 7a 65 6f 66 28 61 53 75 62 5b  ub, sizeof(aSub[
8320: 30 5d 29 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e  0]), "sub-comman
8330: 64 22 2c 20 30 2c 20 26 69 53 75 62 0a 20 20 29  d", 0, &iSub.  )
8340: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
8350: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8360: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 2b 61 53    if( objc!=2+aS
8370: 75 62 5b 69 53 75 62 5d 2e 6e 41 72 67 20 29 7b  ub[iSub].nArg ){
8380: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
8390: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
83a0: 20 6f 62 6a 76 2c 20 61 53 75 62 5b 69 53 75 62   objv, aSub[iSub
83b0: 5d 2e 7a 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ].zMsg);.    ret
83c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
83d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 53   }..  assert( iS
83e0: 75 62 3d 3d 30 20 7c 7c 20 69 53 75 62 3d 3d 31  ub==0 || iSub==1
83f0: 20 7c 7c 20 69 53 75 62 3d 3d 32 20 29 3b 0a 20   || iSub==2 );. 
8400: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
8410: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 77 69 74  ITE_OK );.  swit
8420: 63 68 28 20 69 53 75 62 20 29 7b 0a 20 20 20 20  ch( iSub ){.    
8430: 63 61 73 65 20 30 3a 20 7b 20 20 20 2f 2a 20 63  case 0: {   /* c
8440: 6f 6e 66 69 67 75 72 65 20 2a 2f 0a 20 20 20 20  onfigure */.    
8450: 20 20 69 6e 74 20 6e 52 65 62 61 73 65 20 3d 20    int nRebase = 
8460: 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  0;.      unsigne
8470: 64 20 63 68 61 72 20 2a 70 52 65 62 61 73 65 20  d char *pRebase 
8480: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
8490: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
84a0: 5d 2c 20 26 6e 52 65 62 61 73 65 29 3b 0a 20 20  ], &nRebase);.  
84b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84c0: 72 65 62 61 73 65 72 5f 63 6f 6e 66 69 67 75 72  rebaser_configur
84d0: 65 28 70 2c 20 6e 52 65 62 61 73 65 2c 20 70 52  e(p, nRebase, pR
84e0: 65 62 61 73 65 29 3b 0a 20 20 20 20 20 20 62 72  ebase);.      br
84f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
8500: 63 61 73 65 20 31 3a 20 20 20 20 20 2f 2a 20 64  case 1:     /* d
8510: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 20 20 54  elete */.      T
8520: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
8530: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
8540: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 29  String(objv[0]))
8550: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
8560: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 20 20      default: {  
8570: 2f 2a 20 72 65 62 61 73 65 20 2a 2f 0a 20 20 20  /* rebase */.   
8580: 20 20 20 54 65 73 74 53 74 72 65 61 6d 49 6e 70     TestStreamInp
8590: 75 74 20 73 53 74 72 3b 20 20 20 20 20 20 20 20  ut sStr;        
85a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
85b0: 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20  t stream */.    
85c0: 20 20 54 65 73 74 53 65 73 73 69 6f 6e 73 42 6c    TestSessionsBl
85d0: 6f 62 20 73 4f 75 74 3b 20 20 20 20 20 20 20 20  ob sOut;        
85e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
85f0: 74 20 62 6c 6f 62 20 2a 2f 0a 0a 20 20 20 20 20  t blob */..     
8600: 20 6d 65 6d 73 65 74 28 26 73 53 74 72 2c 20 30   memset(&sStr, 0
8610: 2c 20 73 69 7a 65 6f 66 28 73 53 74 72 29 29 3b  , sizeof(sStr));
8620: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
8630: 4f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Out, 0, sizeof(s
8640: 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 73 53 74  Out));.      sSt
8650: 72 2e 61 44 61 74 61 20 3d 20 54 63 6c 5f 47 65  r.aData = Tcl_Ge
8660: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
8670: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 73 53 74 72  j(objv[2], &sStr
8680: 2e 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  .nData);.      s
8690: 53 74 72 2e 6e 53 74 72 65 61 6d 20 3d 20 74 65  Str.nStream = te
86a0: 73 74 5f 74 63 6c 5f 69 6e 74 65 67 65 72 28 69  st_tcl_integer(i
86b0: 6e 74 65 72 70 2c 20 53 45 53 53 49 4f 4e 5f 53  nterp, SESSION_S
86c0: 54 52 45 41 4d 5f 54 43 4c 5f 56 41 52 29 3b 0a  TREAM_TCL_VAR);.
86d0: 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 72 2e  .      if( sStr.
86e0: 6e 53 74 72 65 61 6d 20 29 7b 0a 20 20 20 20 20  nStream ){.     
86f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 72     rc = sqlite3r
8700: 65 62 61 73 65 72 5f 72 65 62 61 73 65 5f 73 74  ebaser_rebase_st
8710: 72 6d 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  rm(p, .         
8720: 20 20 20 74 65 73 74 53 74 72 65 61 6d 49 6e 70     testStreamInp
8730: 75 74 2c 20 28 76 6f 69 64 2a 29 26 73 53 74 72  ut, (void*)&sStr
8740: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,.            te
8750: 73 74 53 74 72 65 61 6d 4f 75 74 70 75 74 2c 20  stStreamOutput, 
8760: 28 76 6f 69 64 2a 29 26 73 4f 75 74 0a 20 20 20  (void*)&sOut.   
8770: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
8780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
8790: 3d 20 73 71 6c 69 74 65 33 72 65 62 61 73 65 72  = sqlite3rebaser
87a0: 5f 72 65 62 61 73 65 28 70 2c 20 73 53 74 72 2e  _rebase(p, sStr.
87b0: 6e 44 61 74 61 2c 20 73 53 74 72 2e 61 44 61 74  nData, sStr.aDat
87c0: 61 2c 20 26 73 4f 75 74 2e 6e 2c 20 26 73 4f 75  a, &sOut.n, &sOu
87d0: 74 2e 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  t.p);.      }.. 
87e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
87f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8800: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
8810: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
8820: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
8830: 4f 75 74 2e 70 2c 20 73 4f 75 74 2e 6e 29 29 3b  Out.p, sOut.n));
8840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8850: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 4f 75 74  qlite3_free(sOut
8860: 2e 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .p);.      break
8870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
8880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 74   ){.    return t
88a0: 65 73 74 5f 73 65 73 73 69 6f 6e 5f 65 72 72 6f  est_session_erro
88b0: 72 28 69 6e 74 65 72 70 2c 20 72 63 2c 20 30 29  r(interp, rc, 0)
88c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
88d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
88e0: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c   void SQLITE_TCL
88f0: 41 50 49 20 74 65 73 74 5f 72 65 62 61 73 65 72  API test_rebaser
8900: 5f 64 65 6c 28 76 6f 69 64 20 2a 63 6c 69 65 6e  _del(void *clien
8910: 74 44 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65  tData){.  sqlite
8920: 33 5f 72 65 62 61 73 65 72 20 2a 70 20 3d 20 28  3_rebaser *p = (
8930: 73 71 6c 69 74 65 33 5f 72 65 62 61 73 65 72 2a  sqlite3_rebaser*
8940: 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73  )clientData;.  s
8950: 71 6c 69 74 65 33 72 65 62 61 73 65 72 5f 64 65  qlite3rebaser_de
8960: 6c 65 74 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  lete(p);.}../*.*
8970: 2a 20 74 63 6c 63 6d 64 3a 20 73 71 6c 69 74 65  * tclcmd: sqlite
8980: 33 72 65 62 61 73 65 72 5f 63 72 65 61 74 65 20  3rebaser_create 
8990: 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
89a0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
89b0: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 72 65 62   test_sqlite3reb
89c0: 61 73 65 72 5f 63 72 65 61 74 65 28 0a 20 20 76  aser_create(.  v
89d0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
89e0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
89f0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
8a00: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
8a10: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
8a20: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
8a30: 65 33 5f 72 65 62 61 73 65 72 20 2a 70 4e 65 77  e3_rebaser *pNew
8a40: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
8a50: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
8a60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8a70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 1, objv, "NA
8a80: 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
8a90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8aa0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
8ab0: 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74 65  e3rebaser_create
8ac0: 28 26 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  (&pNew);.  if( r
8ad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 74 65 73 74 5f      return test_
8af0: 73 65 73 73 69 6f 6e 5f 65 72 72 6f 72 28 69 6e  session_error(in
8b00: 74 65 72 70 2c 20 72 63 2c 20 30 29 3b 0a 20 20  terp, rc, 0);.  
8b10: 7d 0a 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  }..  Tcl_CreateO
8b20: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
8b30: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
8b40: 6f 62 6a 76 5b 31 5d 29 2c 20 74 65 73 74 5f 72  objv[1]), test_r
8b50: 65 62 61 73 65 72 5f 63 6d 64 2c 0a 20 20 20 20  ebaser_cmd,.    
8b60: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 70 4e    (ClientData)pN
8b70: 65 77 2c 20 74 65 73 74 5f 72 65 62 61 73 65 72  ew, test_rebaser
8b80: 5f 64 65 6c 0a 20 20 29 3b 0a 20 20 54 63 6c 5f  _del.  );.  Tcl_
8b90: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
8ba0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a 20  erp, objv[1]);. 
8bb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8bc0: 7d 0a 0a 69 6e 74 20 54 65 73 74 53 65 73 73 69  }..int TestSessi
8bd0: 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  on_Init(Tcl_Inte
8be0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73  rp *interp){.  s
8bf0: 74 72 75 63 74 20 43 6d 64 20 7b 0a 20 20 20 20  truct Cmd {.    
8c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
8c10: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  ;.    Tcl_ObjCmd
8c20: 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
8c30: 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20   aCmd[] = {.    
8c40: 7b 20 22 73 71 6c 69 74 65 33 73 65 73 73 69 6f  { "sqlite3sessio
8c50: 6e 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33  n", test_sqlite3
8c60: 73 65 73 73 69 6f 6e 20 7d 2c 0a 20 20 20 20 7b  session },.    {
8c70: 20 22 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e   "sqlite3session
8c80: 5f 66 6f 72 65 61 63 68 22 2c 20 74 65 73 74 5f  _foreach", test_
8c90: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 66  sqlite3session_f
8ca0: 6f 72 65 61 63 68 20 7d 2c 0a 20 20 20 20 7b 20  oreach },.    { 
8cb0: 22 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  "sqlite3changese
8cc0: 74 5f 69 6e 76 65 72 74 22 2c 20 74 65 73 74 5f  t_invert", test_
8cd0: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
8ce0: 5f 69 6e 76 65 72 74 20 7d 2c 0a 20 20 20 20 7b  _invert },.    {
8cf0: 20 22 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   "sqlite3changes
8d00: 65 74 5f 63 6f 6e 63 61 74 22 2c 20 74 65 73 74  et_concat", test
8d10: 5f 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  _sqlite3changese
8d20: 74 5f 63 6f 6e 63 61 74 20 7d 2c 0a 20 20 20 20  t_concat },.    
8d30: 7b 20 22 73 71 6c 69 74 65 33 63 68 61 6e 67 65  { "sqlite3change
8d40: 73 65 74 5f 61 70 70 6c 79 22 2c 20 74 65 73 74  set_apply", test
8d50: 5f 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65  _sqlite3changese
8d60: 74 5f 61 70 70 6c 79 20 7d 2c 0a 20 20 20 20 7b  t_apply },.    {
8d70: 20 22 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   "sqlite3changes
8d80: 65 74 5f 61 70 70 6c 79 5f 76 32 22 2c 20 74 65  et_apply_v2", te
8d90: 73 74 5f 73 71 6c 69 74 65 33 63 68 61 6e 67 65  st_sqlite3change
8da0: 73 65 74 5f 61 70 70 6c 79 5f 76 32 20 7d 2c 0a  set_apply_v2 },.
8db0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 63 68      { "sqlite3ch
8dc0: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 72 65  angeset_apply_re
8dd0: 70 6c 61 63 65 5f 61 6c 6c 22 2c 20 0a 20 20 20  place_all", .   
8de0: 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 63     test_sqlite3c
8df0: 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 5f 72  hangeset_apply_r
8e00: 65 70 6c 61 63 65 5f 61 6c 6c 20 7d 2c 0a 20 20  eplace_all },.  
8e10: 20 20 7b 20 22 73 71 6c 5f 65 78 65 63 5f 63 68    { "sql_exec_ch
8e20: 61 6e 67 65 73 65 74 22 2c 20 74 65 73 74 5f 73  angeset", test_s
8e30: 71 6c 5f 65 78 65 63 5f 63 68 61 6e 67 65 73 65  ql_exec_changese
8e40: 74 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69  t },.    { "sqli
8e50: 74 65 33 72 65 62 61 73 65 72 5f 63 72 65 61 74  te3rebaser_creat
8e60: 65 22 2c 20 74 65 73 74 5f 73 71 6c 69 74 65 33  e", test_sqlite3
8e70: 72 65 62 61 73 65 72 5f 63 72 65 61 74 65 20 7d  rebaser_create }
8e80: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
8e90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
8ea0: 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
8eb0: 66 28 73 74 72 75 63 74 20 43 6d 64 29 3b 20 69  f(struct Cmd); i
8ec0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8ed0: 43 6d 64 20 2a 70 20 3d 20 26 61 43 6d 64 5b 69  Cmd *p = &aCmd[i
8ee0: 5d 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ];.    Tcl_Creat
8ef0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
8f00: 72 70 2c 20 70 2d 3e 7a 43 6d 64 2c 20 70 2d 3e  rp, p->zCmd, p->
8f10: 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
8f20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
8f30: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
8f40: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 26 26 20   SQLITE_TEST && 
8f50: 53 51 4c 49 54 45 5f 53 45 53 53 49 4f 4e 20 26  SQLITE_SESSION &
8f60: 26 20 53 51 4c 49 54 45 5f 50 52 45 55 50 44 41  & SQLITE_PREUPDA
8f70: 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.