System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b032793bf1c0853d7b600151267c4e5e618ef101:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 0d 0a 20  soft.com).. *.. 
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00e0: 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a 2a   risk!.. *******
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2f 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 53 51  */....#define SQ
0130: 4c 49 54 45 5f 41 50 49 20 5f 5f 64 65 63 6c 73  LITE_API __decls
0140: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0d 0a  pec(dllexport)..
0150: 0d 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 63  ..#include "../c
0160: 6f 72 65 2f 73 71 6c 69 74 65 33 2e 63 22 0d 0a  ore/sqlite3.c"..
0170: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e  ..#if defined(IN
0180: 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58  TEROP_INCLUDE_EX
0190: 54 52 41 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22  TRA)..#include "
01a0: 2e 2e 2f 65 78 74 2f 65 78 74 72 61 2e 63 22 0d  ../ext/extra.c".
01b0: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64  .#endif....#if d
01c0: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 49  efined(INTEROP_I
01d0: 4e 43 4c 55 44 45 5f 43 45 52 4f 44 29 0d 0a 23  NCLUDE_CEROD)..#
01e0: 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 65 78 74 2f  include "../ext/
01f0: 63 65 72 6f 64 2e 63 22 0d 0a 23 65 6e 64 69 66  cerod.c"..#endif
0200: 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ....#if defined(
0210: 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
0220: 53 45 45 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22  SEE)..#include "
0230: 2e 2e 2f 65 78 74 2f 73 65 65 2e 63 22 0d 0a 23  ../ext/see.c"..#
0240: 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64 65 66  endif....#if def
0250: 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 49 4e 43  ined(INTEROP_INC
0260: 4c 55 44 45 5f 5a 49 50 56 46 53 29 0d 0a 23 69  LUDE_ZIPVFS)..#i
0270: 6e 63 6c 75 64 65 20 22 2e 2e 2f 65 78 74 2f 7a  nclude "../ext/z
0280: 69 70 76 66 73 2e 63 22 0d 0a 23 69 6e 63 6c 75  ipvfs.c"..#inclu
0290: 64 65 20 22 2e 2e 2f 65 78 74 2f 61 6c 67 6f 72  de "../ext/algor
02a0: 69 74 68 6d 73 2e 63 22 0d 0a 23 65 6e 64 69 66  ithms.c"..#endif
02b0: 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ....#if defined(
02c0: 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
02d0: 54 41 42 4c 45 29 20 26 26 20 53 51 4c 49 54 45  TABLE) && SQLITE
02e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
02f0: 3e 3d 20 33 30 30 34 30 30 31 0d 0a 23 69 6e 63  >= 3004001..#inc
0300: 6c 75 64 65 20 22 2e 2e 2f 65 78 74 2f 76 74 73  lude "../ext/vts
0310: 68 69 6d 2e 63 22 0d 0a 23 65 6e 64 69 66 0d 0a  him.c"..#endif..
0320: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e  ..#if defined(IN
0330: 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e  TEROP_FTS5_EXTEN
0340: 53 49 4f 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20  SION)..#include 
0350: 22 2e 2e 2f 65 78 74 2f 66 74 73 35 2e 63 22 0d  "../ext/fts5.c".
0360: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64  .#endif....#if d
0370: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 50  efined(INTEROP_P
0380: 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53  ERCENTILE_EXTENS
0390: 49 4f 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22  ION)..#include "
03a0: 2e 2e 2f 65 78 74 2f 70 65 72 63 65 6e 74 69 6c  ../ext/percentil
03b0: 65 2e 63 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  e.c"..#endif....
03c0: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45  #if defined(INTE
03d0: 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e  ROP_TOTYPE_EXTEN
03e0: 53 49 4f 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20  SION)..#include 
03f0: 22 2e 2e 2f 65 78 74 2f 74 6f 74 79 70 65 2e 63  "../ext/totype.c
0400: 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66  "..#endif....#if
0410: 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50   defined(INTEROP
0420: 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f  _REGEXP_EXTENSIO
0430: 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e  N)..#include "..
0440: 2f 65 78 74 2f 72 65 67 65 78 70 2e 63 22 0d 0a  /ext/regexp.c"..
0450: 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64 65  #endif....#if de
0460: 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 45 58  fined(INTEROP_EX
0470: 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
0480: 53 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e  S)..#include "..
0490: 2f 63 6f 6e 74 72 69 62 2f 65 78 74 65 6e 73 69  /contrib/extensi
04a0: 6f 6e 2d 66 75 6e 63 74 69 6f 6e 73 2e 63 22 0d  on-functions.c".
04b0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 52 65 67 69  .extern int Regi
04c0: 73 74 65 72 45 78 74 65 6e 73 69 6f 6e 46 75 6e  sterExtensionFun
04d0: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
04e0: 64 62 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  db);..#endif....
04f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0500: 54 45 5f 4f 53 5f 57 49 4e 29 0d 0a 23 69 66 20  TE_OS_WIN)..#if 
0510: 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f  defined(INTEROP_
0520: 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
0530: 65 64 28 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  ed(INTEROP_INCLU
0540: 44 45 5f 53 45 45 29 0d 0a 23 69 6e 63 6c 75 64  DE_SEE)..#includ
0550: 65 20 22 63 72 79 70 74 2e 63 22 0d 0a 23 65 6e  e "crypt.c"..#en
0560: 64 69 66 0d 0a 0d 0a 23 69 6e 63 6c 75 64 65 20  dif....#include 
0570: 22 69 6e 74 65 72 6f 70 2e 68 22 0d 0a 0d 0a 23  "interop.h"....#
0580: 64 65 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44  define INTEROP_D
0590: 45 42 55 47 5f 4e 4f 4e 45 20 20 20 20 20 20 20  EBUG_NONE       
05a0: 20 20 20 20 28 30 78 30 30 30 30 29 0d 0a 23 64      (0x0000)..#d
05b0: 65 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44 45  efine INTEROP_DE
05c0: 42 55 47 5f 43 4c 4f 53 45 20 20 20 20 20 20 20  BUG_CLOSE       
05d0: 20 20 20 28 30 78 30 30 30 31 29 0d 0a 23 64 65     (0x0001)..#de
05e0: 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44 45 42  fine INTEROP_DEB
05f0: 55 47 5f 46 49 4e 41 4c 49 5a 45 20 20 20 20 20  UG_FINALIZE     
0600: 20 20 28 30 78 30 30 30 32 29 0d 0a 23 64 65 66    (0x0002)..#def
0610: 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  ine INTEROP_DEBU
0620: 47 5f 42 41 43 4b 55 50 5f 46 49 4e 49 53 48 20  G_BACKUP_FINISH 
0630: 20 28 30 78 30 30 30 34 29 0d 0a 23 64 65 66 69   (0x0004)..#defi
0640: 6e 65 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  ne INTEROP_DEBUG
0650: 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20  _OPEN           
0660: 28 30 78 30 30 30 38 29 0d 0a 23 64 65 66 69 6e  (0x0008)..#defin
0670: 65 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f  e INTEROP_DEBUG_
0680: 4f 50 45 4e 31 36 20 20 20 20 20 20 20 20 20 28  OPEN16         (
0690: 30 78 30 30 31 30 29 0d 0a 23 64 65 66 69 6e 65  0x0010)..#define
06a0: 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 50   INTEROP_DEBUG_P
06b0: 52 45 50 41 52 45 20 20 20 20 20 20 20 20 28 30  REPARE        (0
06c0: 78 30 30 32 30 29 0d 0a 23 64 65 66 69 6e 65 20  x0020)..#define 
06d0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 50 52  INTEROP_DEBUG_PR
06e0: 45 50 41 52 45 31 36 20 20 20 20 20 20 28 30 78  EPARE16      (0x
06f0: 30 30 34 30 29 0d 0a 23 64 65 66 69 6e 65 20 49  0040)..#define I
0700: 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 52 45 53  NTEROP_DEBUG_RES
0710: 45 54 20 20 20 20 20 20 20 20 20 20 28 30 78 30  ET          (0x0
0720: 30 38 30 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e  080)..#define IN
0730: 54 45 52 4f 50 5f 44 45 42 55 47 5f 43 48 41 4e  TEROP_DEBUG_CHAN
0740: 47 45 53 20 20 20 20 20 20 20 20 28 30 78 30 31  GES        (0x01
0750: 30 30 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e 54  00)..#define INT
0760: 45 52 4f 50 5f 44 45 42 55 47 5f 42 52 45 41 4b  EROP_DEBUG_BREAK
0770: 20 20 20 20 20 20 20 20 20 20 28 30 78 30 32 30            (0x020
0780: 30 29 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65  0)....#if define
0790: 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 64  d(_MSC_VER) && d
07a0: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44  efined(INTEROP_D
07b0: 45 42 55 47 29 20 26 26 20 5c 0d 0a 20 20 20 20  EBUG) && \..    
07c0: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 26  (INTEROP_DEBUG &
07d0: 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 42   INTEROP_DEBUG_B
07e0: 52 45 41 4b 29 0d 0a 23 64 65 66 69 6e 65 20 73  REAK)..#define s
07f0: 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 42 72 65  qlite3InteropBre
0800: 61 6b 28 61 29 20 7b 20 73 71 6c 69 74 65 33 49  ak(a) { sqlite3I
0810: 6e 74 65 72 6f 70 44 65 62 75 67 28 22 25 73 5c  nteropDebug("%s\
0820: 6e 22 2c 20 28 61 29 29 3b 20 5f 5f 64 65 62 75  n", (a)); __debu
0830: 67 62 72 65 61 6b 28 29 3b 20 7d 0d 0a 23 65 6c  gbreak(); }..#el
0840: 73 65 0d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  se..#define sqli
0850: 74 65 33 49 6e 74 65 72 6f 70 42 72 65 61 6b 28  te3InteropBreak(
0860: 61 29 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 74 79  a)..#endif....ty
0870: 70 65 64 65 66 20 76 6f 69 64 20 28 2a 53 51 4c  pedef void (*SQL
0880: 49 54 45 55 53 45 52 46 55 4e 43 29 28 73 71 6c  ITEUSERFUNC)(sql
0890: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 2c 20  ite3_context *, 
08a0: 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  int, sqlite3_val
08b0: 75 65 20 2a 2a 29 3b 0d 0a 74 79 70 65 64 65 66  ue **);..typedef
08c0: 20 76 6f 69 64 20 28 2a 53 51 4c 49 54 45 46 55   void (*SQLITEFU
08d0: 4e 43 46 49 4e 41 4c 29 28 73 71 6c 69 74 65 33  NCFINAL)(sqlite3
08e0: 5f 63 6f 6e 74 65 78 74 20 2a 29 3b 0d 0a 0d 0a  _context *);....
08f0: 2f 2a 0d 0a 2a 2a 20 41 6e 20 61 72 72 61 79 20  /*..** An array 
0900: 6f 66 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  of names of all 
0910: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0920: 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 72 72 61  ions.  This arra
0930: 79 20 73 68 6f 75 6c 64 0d 0a 2a 2a 20 62 65 20  y should..** be 
0940: 73 6f 72 74 65 64 20 41 2d 5a 2e 0d 0a 2a 2a 0d  sorted A-Z...**.
0950: 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 6c  .** This array l
0960: 6f 6f 6b 73 20 6c 61 72 67 65 2c 20 62 75 74 20  ooks large, but 
0970: 69 6e 20 61 20 74 79 70 69 63 61 6c 20 69 6e 73  in a typical ins
0980: 74 61 6c 6c 61 74 69 6f 6e 20 61 63 74 75 61 6c  tallation actual
0990: 6c 79 20 75 73 65 73 0d 0a 2a 2a 20 6f 6e 6c 79  ly uses..** only
09a0: 20 61 20 68 61 6e 64 66 75 6c 20 6f 66 20 63 6f   a handful of co
09b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
09c0: 6e 73 2c 20 73 6f 20 6d 6f 73 74 20 74 69 6d 65  ns, so most time
09d0: 73 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  s this array is 
09e0: 75 73 75 61 6c 6c 79 0d 0a 2a 2a 20 72 61 74 68  usually..** rath
09f0: 65 72 20 73 68 6f 72 74 20 61 6e 64 20 75 73 65  er short and use
0a00: 73 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 20  s little memory 
0a10: 73 70 61 63 65 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  space...*/..stat
0a20: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
0a30: 63 6f 6e 73 74 20 61 7a 49 6e 74 65 72 6f 70 43  const azInteropC
0a40: 6f 6d 70 69 6c 65 4f 70 74 5b 5d 20 3d 20 7b 0d  ompileOpt[] = {.
0a50: 0a 0d 0a 2f 2a 20 54 68 65 73 65 20 6d 61 63 72  .../* These macr
0a60: 6f 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 20  os are provided 
0a70: 74 6f 20 22 73 74 72 69 6e 67 69 66 79 22 20 74  to "stringify" t
0a80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0a90: 64 65 66 69 6e 65 0d 0a 2a 2a 20 66 6f 72 20 74  define..** for t
0aa0: 68 6f 73 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  hose options in 
0ab0: 77 68 69 63 68 20 74 68 65 20 76 61 6c 75 65 20  which the value 
0ac0: 69 73 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 20 2a  is meaningful. *
0ad0: 2f 0d 0a 23 69 66 6e 64 65 66 20 43 54 49 4d 45  /..#ifndef CTIME
0ae0: 4f 50 54 5f 56 41 4c 5f 0d 0a 23 64 65 66 69 6e  OPT_VAL_..#defin
0af0: 65 20 43 54 49 4d 45 4f 50 54 5f 56 41 4c 5f 28  e CTIMEOPT_VAL_(
0b00: 6f 70 74 29 20 23 6f 70 74 0d 0a 23 65 6e 64 69  opt) #opt..#endi
0b10: 66 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 43 54 49  f....#ifndef CTI
0b20: 4d 45 4f 50 54 5f 56 41 4c 0d 0a 23 64 65 66 69  MEOPT_VAL..#defi
0b30: 6e 65 20 43 54 49 4d 45 4f 50 54 5f 56 41 4c 28  ne CTIMEOPT_VAL(
0b40: 6f 70 74 29 20 43 54 49 4d 45 4f 50 54 5f 56 41  opt) CTIMEOPT_VA
0b50: 4c 5f 28 6f 70 74 29 0d 0a 23 65 6e 64 69 66 0d  L_(opt)..#endif.
0b60: 0a 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52 4f  ...#ifdef INTERO
0b70: 50 5f 43 4f 44 45 43 0d 0a 20 20 22 43 4f 44 45  P_CODEC..  "CODE
0b80: 43 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66  C",..#endif..#if
0b90: 64 65 66 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  def INTEROP_DEBU
0ba0: 47 0d 0a 20 20 22 44 45 42 55 47 3d 22 20 43 54  G..  "DEBUG=" CT
0bb0: 49 4d 45 4f 50 54 5f 56 41 4c 28 49 4e 54 45 52  IMEOPT_VAL(INTER
0bc0: 4f 50 5f 44 45 42 55 47 29 2c 0d 0a 23 65 6e 64  OP_DEBUG),..#end
0bd0: 69 66 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52  if..#ifdef INTER
0be0: 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
0bf0: 43 54 49 4f 4e 53 0d 0a 20 20 22 45 58 54 45 4e  CTIONS..  "EXTEN
0c00: 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 22 2c  SION_FUNCTIONS",
0c10: 0d 0a 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66  ..#endif..#ifdef
0c20: 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
0c30: 5f 43 45 52 4f 44 0d 0a 20 20 22 49 4e 43 4c 55  _CEROD..  "INCLU
0c40: 44 45 5f 43 45 52 4f 44 22 2c 0d 0a 23 65 6e 64  DE_CEROD",..#end
0c50: 69 66 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52  if..#ifdef INTER
0c60: 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OP_INCLUDE_EXTRA
0c70: 0d 0a 20 20 22 49 4e 43 4c 55 44 45 5f 45 58 54  ..  "INCLUDE_EXT
0c80: 52 41 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69  RA",..#endif..#i
0c90: 66 64 65 66 20 49 4e 54 45 52 4f 50 5f 49 4e 43  fdef INTEROP_INC
0ca0: 4c 55 44 45 5f 53 45 45 0d 0a 20 20 22 49 4e 43  LUDE_SEE..  "INC
0cb0: 4c 55 44 45 5f 53 45 45 22 2c 0d 0a 23 65 6e 64  LUDE_SEE",..#end
0cc0: 69 66 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52  if..#ifdef INTER
0cd0: 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46  OP_INCLUDE_ZIPVF
0ce0: 53 0d 0a 20 20 22 49 4e 43 4c 55 44 45 5f 5a 49  S..  "INCLUDE_ZI
0cf0: 50 56 46 53 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a  PVFS",..#endif..
0d00: 23 69 66 64 65 66 20 49 4e 54 45 52 4f 50 5f 4c  #ifdef INTEROP_L
0d10: 45 47 41 43 59 5f 43 4c 4f 53 45 0d 0a 20 20 22  EGACY_CLOSE..  "
0d20: 4c 45 47 41 43 59 5f 43 4c 4f 53 45 22 2c 0d 0a  LEGACY_CLOSE",..
0d30: 23 65 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 49  #endif..#ifdef I
0d40: 4e 54 45 52 4f 50 5f 4c 4f 47 0d 0a 20 20 22 4c  NTEROP_LOG..  "L
0d50: 4f 47 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 23 69  OG",..#endif..#i
0d60: 66 64 65 66 20 49 4e 54 45 52 4f 50 5f 50 45 52  fdef INTEROP_PER
0d70: 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
0d80: 4e 0d 0a 20 20 22 50 45 52 43 45 4e 54 49 4c 45  N..  "PERCENTILE
0d90: 5f 45 58 54 45 4e 53 49 4f 4e 22 2c 0d 0a 23 65  _EXTENSION",..#e
0da0: 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 49 4e 54  ndif..#ifdef INT
0db0: 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45  EROP_REGEXP_EXTE
0dc0: 4e 53 49 4f 4e 0d 0a 20 20 22 52 45 47 45 58 50  NSION..  "REGEXP
0dd0: 5f 45 58 54 45 4e 53 49 4f 4e 22 2c 0d 0a 23 65  _EXTENSION",..#e
0de0: 6e 64 69 66 0d 0a 23 69 66 64 65 66 20 49 4e 54  ndif..#ifdef INT
0df0: 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
0e00: 49 4f 4e 0d 0a 20 20 22 54 45 53 54 5f 45 58 54  ION..  "TEST_EXT
0e10: 45 4e 53 49 4f 4e 22 2c 0d 0a 23 65 6e 64 69 66  ENSION",..#endif
0e20: 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52 4f 50  ..#ifdef INTEROP
0e30: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
0e40: 4e 0d 0a 20 20 22 54 4f 54 59 50 45 5f 45 58 54  N..  "TOTYPE_EXT
0e50: 45 4e 53 49 4f 4e 22 2c 0d 0a 23 65 6e 64 69 66  ENSION",..#endif
0e60: 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0e70: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 0d 0a  VERSION_NUMBER..
0e80: 20 20 22 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45    "VERSION_NUMBE
0e90: 52 3d 22 20 43 54 49 4d 45 4f 50 54 5f 56 41 4c  R=" CTIMEOPT_VAL
0ea0: 28 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f  (SQLITE_VERSION_
0eb0: 4e 55 4d 42 45 52 29 2c 0d 0a 23 65 6e 64 69 66  NUMBER),..#endif
0ec0: 0d 0a 23 69 66 64 65 66 20 49 4e 54 45 52 4f 50  ..#ifdef INTEROP
0ed0: 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 0d 0a  _VIRTUAL_TABLE..
0ee0: 20 20 22 56 49 52 54 55 41 4c 5f 54 41 42 4c 45    "VIRTUAL_TABLE
0ef0: 22 2c 0d 0a 23 65 6e 64 69 66 0d 0a 7d 3b 0d 0a  ",..#endif..};..
0f00: 0d 0a 2f 2a 0d 0a 2a 2a 20 47 69 76 65 6e 20 74  ../*..** Given t
0f10: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6d  he name of a com
0f20: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
0f30: 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  , return true if
0f40: 20 74 68 61 74 20 6f 70 74 69 6f 6e 0d 0a 2a 2a   that option..**
0f50: 20 77 61 73 20 75 73 65 64 20 61 6e 64 20 66 61   was used and fa
0f60: 6c 73 65 20 69 66 20 6e 6f 74 2e 0d 0a 2a 2a 0d  lse if not...**.
0f70: 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e  .** The name can
0f80: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69   optionally begi
0f90: 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22  n with "SQLITE_"
0fa0: 20 6f 72 20 22 49 4e 54 45 52 4f 50 5f 22 20 62   or "INTEROP_" b
0fb0: 75 74 20 74 68 6f 73 65 0d 0a 2a 2a 20 70 72 65  ut those..** pre
0fc0: 66 69 78 65 73 20 61 72 65 20 6e 6f 74 20 72 65  fixes are not re
0fd0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74  quired for a mat
0fe0: 63 68 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f  ch...*/..SQLITE_
0ff0: 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 69  API int WINAPI i
1000: 6e 74 65 72 6f 70 5f 63 6f 6d 70 69 6c 65 6f 70  nterop_compileop
1010: 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20  tion_used(const 
1020: 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b  char *zOptName){
1030: 0d 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0d 0a 20  ..  int i, n;.. 
1040: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
1050: 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 22  ICmp(zOptName, "
1060: 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d 30 20  SQLITE_", 7)==0 
1070: 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20 37 3b  ) zOptName += 7;
1080: 0d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ..  if( sqlite3S
1090: 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65  trNICmp(zOptName
10a0: 2c 20 22 49 4e 54 45 52 4f 50 5f 22 2c 20 38 29  , "INTEROP_", 8)
10b0: 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b  ==0 ) zOptName +
10c0: 3d 20 38 3b 0d 0a 20 20 6e 20 3d 20 73 71 6c 69  = 8;..  n = sqli
10d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
10e0: 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 53  Name);....  /* S
10f0: 69 6e 63 65 20 41 72 72 61 79 53 69 7a 65 28 61  ince ArraySize(a
1100: 7a 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f  zInteropCompileO
1110: 70 74 29 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  pt) is normally 
1120: 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74 73  in single digits
1130: 2c 20 61 0d 0a 20 20 2a 2a 20 6c 69 6e 65 61 72  , a..  ** linear
1140: 20 73 65 61 72 63 68 20 69 73 20 61 64 65 71 75   search is adequ
1150: 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f  ate.  No need fo
1160: 72 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  r a binary searc
1170: 68 2e 20 2a 2f 0d 0a 20 20 66 6f 72 28 69 3d 30  h. */..  for(i=0
1180: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1190: 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
11a0: 74 29 3b 20 69 2b 2b 29 7b 0d 0a 20 20 20 20 69  t); i++){..    i
11b0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
11c0: 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 49  mp(zOptName, azI
11d0: 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74  nteropCompileOpt
11e0: 5b 69 5d 2c 20 6e 29 3d 3d 30 0d 0a 20 20 20 20  [i], n)==0..    
11f0: 20 26 26 20 73 71 6c 69 74 65 33 43 74 79 70 65   && sqlite3Ctype
1200: 4d 61 70 5b 28 75 6e 73 69 67 6e 65 64 20 63 68  Map[(unsigned ch
1210: 61 72 29 61 7a 49 6e 74 65 72 6f 70 43 6f 6d 70  ar)azInteropComp
1220: 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 5d 3d 3d 30  ileOpt[i][n]]==0
1230: 0d 0a 20 20 20 20 29 7b 0d 0a 20 20 20 20 20 20  ..    ){..      
1240: 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 7d  return 1;..    }
1250: 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20  ..  }..  return 
1260: 30 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  0;..}..../*..** 
1270: 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20  Return the N-th 
1280: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1290: 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20  ion string.  If 
12a0: 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
12b0: 65 2c 0d 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  e,..** return a 
12c0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a  NULL pointer...*
12d0: 2f 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f  /..SQLITE_API co
12e0: 6e 73 74 20 63 68 61 72 20 2a 57 49 4e 41 50 49  nst char *WINAPI
12f0: 20 69 6e 74 65 72 6f 70 5f 63 6f 6d 70 69 6c 65   interop_compile
1300: 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e  option_get(int N
1310: 29 7b 0d 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26  ){..  if( N>=0 &
1320: 26 20 4e 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  & N<ArraySize(az
1330: 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
1340: 74 29 20 29 7b 0d 0a 20 20 20 20 72 65 74 75 72  t) ){..    retur
1350: 6e 20 61 7a 49 6e 74 65 72 6f 70 43 6f 6d 70 69  n azInteropCompi
1360: 6c 65 4f 70 74 5b 4e 5d 3b 0d 0a 20 20 7d 0d 0a  leOpt[N];..  }..
1370: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d 0a    return 0;..}..
1380: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e  ..#if defined(IN
1390: 54 45 52 4f 50 5f 44 45 42 55 47 29 20 7c 7c 20  TEROP_DEBUG) || 
13a0: 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f  defined(INTEROP_
13b0: 4c 4f 47 29 0d 0a 53 51 4c 49 54 45 5f 50 52 49  LOG)..SQLITE_PRI
13c0: 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65  VATE void sqlite
13d0: 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28 63 6f  3InteropDebug(co
13e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
13f0: 74 2c 20 2e 2e 2e 29 7b 0d 0a 20 20 76 61 5f 6c  t, ...){..  va_l
1400: 69 73 74 20 61 70 3b 20 20 20 20 20 20 20 20 20  ist ap;         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 2f 2a 20 56 61 72 61 72 67 20 6c 69 73 74 20 2a  /* Vararg list *
1430: 2f 0d 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  /..  StrAccum ac
1440: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1450: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
1460: 6e 67 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  ng accumulator *
1470: 2f 0d 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 53  /..  char zMsg[S
1480: 51 4c 49 54 45 5f 50 52 49 4e 54 5f 42 55 46 5f  QLITE_PRINT_BUF_
1490: 53 49 5a 45 2a 33 5d 3b 20 2f 2a 20 43 6f 6d 70  SIZE*3]; /* Comp
14a0: 6c 65 74 65 20 6c 6f 67 20 6d 65 73 73 61 67 65  lete log message
14b0: 20 2a 2f 0d 0a 20 20 76 61 5f 73 74 61 72 74 28   */..  va_start(
14c0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0d 0a 23  ap, zFormat);..#
14d0: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
14e0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 38  N_NUMBER >= 3008
14f0: 30 31 30 0d 0a 20 20 73 71 6c 69 74 65 33 53 74  010..  sqlite3St
1500: 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c  rAccumInit(&acc,
1510: 20 30 2c 20 7a 4d 73 67 2c 20 73 69 7a 65 6f 66   0, zMsg, sizeof
1520: 28 7a 4d 73 67 29 2c 20 30 29 3b 0d 0a 23 65 6c  (zMsg), 0);..#el
1530: 73 65 0d 0a 20 20 73 71 6c 69 74 65 33 53 74 72  se..  sqlite3Str
1540: 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20  AccumInit(&acc, 
1550: 7a 4d 73 67 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  zMsg, sizeof(zMs
1560: 67 29 2c 20 30 29 3b 0d 0a 20 20 61 63 63 2e 75  g), 0);..  acc.u
1570: 73 65 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d 0a 23  seMalloc = 0;..#
1580: 65 6e 64 69 66 0d 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
1590: 56 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 30  VXPrintf(&acc, 0
15a0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0d  , zFormat, ap);.
15b0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0d 0a  .  va_end(ap);..
15c0: 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49  #if SQLITE_VERSI
15d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30  ON_NUMBER >= 300
15e0: 37 30 31 33 0d 0a 20 20 73 71 6c 69 74 65 33 5f  7013..  sqlite3_
15f0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1600: 67 28 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  g(sqlite3StrAccu
1610: 6d 46 69 6e 69 73 68 28 26 61 63 63 29 2c 20 2d  mFinish(&acc), -
1620: 31 29 3b 0d 0a 23 65 6c 69 66 20 64 65 66 69 6e  1);..#elif defin
1630: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1640: 48 41 53 5f 41 4e 53 49 29 0d 0a 20 20 4f 75 74  HAS_ANSI)..  Out
1650: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
1660: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1670: 69 6e 69 73 68 28 26 61 63 63 29 29 3b 0d 0a 23  inish(&acc));..#
1680: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1690: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
16a0: 44 45 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 4c 50  DE)..  {..    LP
16b0: 57 53 54 52 20 7a 57 69 64 65 4d 73 67 20 3d 20  WSTR zWideMsg = 
16c0: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 73 71  utf8ToUnicode(sq
16d0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
16e0: 69 73 68 28 26 61 63 63 29 29 3b 0d 0a 20 20 20  ish(&acc));..   
16f0: 20 69 66 28 20 7a 57 69 64 65 4d 73 67 20 29 7b   if( zWideMsg ){
1700: 0d 0a 20 20 20 20 20 20 4f 75 74 70 75 74 44 65  ..      OutputDe
1710: 62 75 67 53 74 72 69 6e 67 57 28 7a 57 69 64 65  bugStringW(zWide
1720: 4d 73 67 29 3b 0d 0a 20 20 20 20 20 20 73 71 6c  Msg);..      sql
1730: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 4d  ite3_free(zWideM
1740: 73 67 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  sg);..    }..  }
1750: 0d 0a 23 65 6c 73 65 0d 0a 20 20 66 70 72 69 6e  ..#else..  fprin
1760: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c  tf(stderr, "%s",
1770: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1780: 46 69 6e 69 73 68 28 26 61 63 63 29 29 3b 0d 0a  Finish(&acc));..
1790: 23 65 6e 64 69 66 0d 0a 7d 0d 0a 23 65 6e 64 69  #endif..}..#endi
17a0: 66 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  f....#if defined
17b0: 28 49 4e 54 45 52 4f 50 5f 4c 4f 47 29 0d 0a 53  (INTEROP_LOG)..S
17c0: 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e  QLITE_PRIVATE in
17d0: 74 20 6c 6f 67 43 6f 6e 66 69 67 75 72 65 64 20  t logConfigured 
17e0: 3d 20 30 3b 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50  = 0;....SQLITE_P
17f0: 52 49 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69  RIVATE void sqli
1800: 74 65 33 49 6e 74 65 72 6f 70 4c 6f 67 43 61 6c  te3InteropLogCal
1810: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
1820: 2c 20 69 6e 74 20 69 43 6f 64 65 2c 20 63 6f 6e  , int iCode, con
1830: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0d  st char *zMsg){.
1840: 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f  .  sqlite3Intero
1850: 70 44 65 62 75 67 28 22 49 4e 54 45 52 4f 50 5f  pDebug("INTEROP_
1860: 4c 4f 47 20 28 25 64 29 20 25 73 5c 6e 22 2c 20  LOG (%d) %s\n", 
1870: 69 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0d 0a 7d  iCode, zMsg);..}
1880: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49  ..#endif....SQLI
1890: 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50  TE_API int WINAP
18a0: 49 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  I sqlite3_malloc
18b0: 5f 73 69 7a 65 5f 69 6e 74 65 72 6f 70 28 76 6f  _size_interop(vo
18c0: 69 64 20 2a 70 29 7b 0d 0a 20 20 72 65 74 75 72  id *p){..  retur
18d0: 6e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  n sqlite3MallocS
18e0: 69 7a 65 28 70 29 3b 0d 0a 7d 0d 0a 0d 0a 23 69  ize(p);..}....#i
18f0: 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f  f defined(INTERO
1900: 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 29 20  P_LEGACY_CLOSE) 
1910: 7c 7c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  || SQLITE_VERSIO
1920: 4e 5f 4e 55 4d 42 45 52 20 3c 20 33 30 30 37 30  N_NUMBER < 30070
1930: 31 34 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41  14..SQLITE_PRIVA
1940: 54 45 20 76 6f 69 64 20 2a 20 73 71 6c 69 74 65  TE void * sqlite
1950: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 5f 69 6e  3DbMallocZero_in
1960: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64  terop(sqlite3 *d
1970: 62 2c 20 69 6e 74 20 6e 29 0d 0a 7b 0d 0a 20 20  b, int n)..{..  
1980: 76 6f 69 64 20 2a 70 3b 0d 0a 20 20 69 66 20 28  void *p;..  if (
1990: 64 62 29 20 7b 0d 0a 20 20 20 20 73 71 6c 69 74  db) {..    sqlit
19a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19b0: 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d  b->mutex);..  }.
19c0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
19d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 6e 29  MallocZero(db,n)
19e0: 3b 0d 0a 20 20 69 66 20 28 64 62 29 20 7b 0d 0a  ;..  if (db) {..
19f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a00: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a10: 78 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75  x);..  }..  retu
1a20: 72 6e 20 70 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  rn p;..}....SQLI
1a30: 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20  TE_PRIVATE void 
1a40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 5f 69 6e  sqlite3DbFree_in
1a50: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64  terop(sqlite3 *d
1a60: 62 2c 20 76 6f 69 64 20 2a 70 29 0d 0a 7b 0d 0a  b, void *p)..{..
1a70: 20 20 69 66 20 28 64 62 29 20 7b 0d 0a 20 20 20    if (db) {..   
1a80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a90: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1aa0: 0d 0a 20 20 7d 0d 0a 20 20 69 66 20 28 70 29 20  ..  }..  if (p) 
1ab0: 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65  {..    sqlite3Me
1ac0: 6d 64 65 62 75 67 53 65 74 54 79 70 65 28 70 2c  mdebugSetType(p,
1ad0: 20 4d 45 4d 54 59 50 45 5f 44 42 7c 4d 45 4d 54   MEMTYPE_DB|MEMT
1ae0: 59 50 45 5f 48 45 41 50 29 3b 0d 0a 20 20 7d 0d  YPE_HEAP);..  }.
1af0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1b00: 28 64 62 2c 70 29 3b 0d 0a 20 20 69 66 20 28 64  (db,p);..  if (d
1b10: 62 29 20 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65  b) {..    sqlite
1b20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b30: 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a  ->mutex);..  }..
1b40: 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 2f 2a 0d  }..#endif..../*.
1b50: 0a 20 20 20 20 54 68 65 20 67 6f 61 6c 20 6f 66  .    The goal of
1b60: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
1b70: 20 63 6c 6f 73 65 20 69 73 20 64 69 66 66 65 72   close is differ
1b80: 65 6e 74 20 74 68 61 6e 20 74 68 61 74 20 6f 66  ent than that of
1b90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
1ba0: 2c 20 61 6e 64 20 69 73 20 64 65 73 69 67 6e 65  , and is designe
1bb0: 64 20 74 6f 20 6c 65 6e 64 20 69 74 73 65 6c 66  d to lend itself
1bc0: 20 62 65 74 74 65 72 20 74 6f 20 2e 4e 45 54 27   better to .NET'
1bd0: 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  s non-determinis
1be0: 74 69 63 20 66 69 6e 61 6c 69 7a 65 72 73 20 61  tic finalizers a
1bf0: 6e 64 0d 0a 20 20 20 20 74 68 65 20 47 43 20 74  nd..    the GC t
1c00: 68 72 65 61 64 2e 20 20 53 51 4c 69 74 65 20 77  hread.  SQLite w
1c10: 69 6c 6c 20 6e 6f 74 20 63 6c 6f 73 65 20 61 20  ill not close a 
1c20: 64 61 74 61 62 61 73 65 20 69 66 20 73 74 61 74  database if stat
1c30: 65 6d 65 6e 74 73 20 61 72 65 20 6f 70 65 6e 20  ements are open 
1c40: 6f 6e 20 69 74 20 2d 2d 20 62 75 74 20 66 6f 72  on it -- but for
1c50: 20 6f 75 72 20 70 75 72 70 6f 73 65 73 2c 20 77   our purposes, w
1c60: 65 27 64 20 72 61 74 68 65 72 20 66 69 6e 61 6c  e'd rather final
1c70: 69 7a 65 20 61 6c 6c 20 61 63 74 69 76 65 20 73  ize all active s
1c80: 74 61 74 65 6d 65 6e 74 73 0d 0a 20 20 20 20 61  tatements..    a
1c90: 6e 64 20 66 6f 72 63 69 62 6c 79 20 63 6c 6f 73  nd forcibly clos
1ca0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
1cb0: 20 54 68 65 20 72 65 61 73 6f 6e 20 69 73 20 73   The reason is s
1cc0: 69 6d 70 6c 65 20 2d 2d 20 61 20 6c 6f 74 20 6f  imple -- a lot o
1cd0: 66 20 70 65 6f 70 6c 65 20 64 6f 6e 27 74 20 44  f people don't D
1ce0: 69 73 70 6f 73 65 28 29 20 6f 66 20 74 68 65 69  ispose() of thei
1cf0: 72 20 6f 62 6a 65 63 74 73 20 63 6f 72 72 65 63  r objects correc
1d00: 74 6c 79 20 61 6e 64 20 6c 65 74 20 74 68 65 20  tly and let the 
1d10: 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 6f  garbage collecto
1d20: 72 0d 0a 20 20 20 20 64 6f 20 69 74 2e 20 20 54  r..    do it.  T
1d30: 68 69 73 20 6c 65 61 64 73 20 74 6f 20 75 6e 65  his leads to une
1d40: 78 70 65 63 74 65 64 20 62 65 68 61 76 69 6f 72  xpected behavior
1d50: 20 77 68 65 6e 20 61 20 75 73 65 72 20 74 68 69   when a user thi
1d60: 6e 6b 73 20 74 68 65 79 27 76 65 20 63 6c 6f 73  nks they've clos
1d70: 65 64 20 61 20 64 61 74 61 62 61 73 65 2c 20 62  ed a database, b
1d80: 75 74 20 69 74 27 73 20 73 74 69 6c 6c 20 6f 70  ut it's still op
1d90: 65 6e 20 62 65 63 61 75 73 65 20 6e 6f 74 20 61  en because not a
1da0: 6c 6c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ll the statement
1db0: 73 20 68 61 76 65 0d 0a 20 20 20 20 68 69 74 20  s have..    hit 
1dc0: 74 68 65 20 47 43 20 79 65 74 2e 0d 0a 0d 0a 20  the GC yet..... 
1dd0: 20 20 20 53 6f 2c 20 68 65 72 65 20 77 65 20 68     So, here we h
1de0: 61 76 65 20 61 20 70 72 6f 62 6c 65 6d 20 2e 2e  ave a problem ..
1df0: 2e 20 2e 4e 45 54 20 68 61 73 20 61 20 70 6f 69  . .NET has a poi
1e00: 6e 74 65 72 20 74 6f 20 61 6e 79 20 6e 75 6d 62  nter to any numb
1e10: 65 72 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 74  er of sqlite3_st
1e20: 6d 74 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  mt objects.  We 
1e30: 63 61 6e 27 74 20 63 61 6c 6c 20 73 71 6c 69 74  can't call sqlit
1e40: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 6f 6e  e3_finalize() on
1e50: 20 74 68 65 73 65 20 62 65 63 61 75 73 65 0d 0a   these because..
1e60: 20 20 20 20 74 68 65 69 72 20 6d 65 6d 6f 72 79      their memory
1e70: 20 69 73 20 66 72 65 65 64 20 61 6e 64 20 63 61   is freed and ca
1e80: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
1e90: 6d 65 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  mething else.  T
1ea0: 68 65 20 47 43 20 74 68 72 65 61 64 20 63 6f 75  he GC thread cou
1eb0: 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 74  ld potentially t
1ec0: 72 79 20 61 6e 64 20 63 61 6c 6c 20 66 69 6e 61  ry and call fina
1ed0: 6c 69 7a 65 20 61 67 61 69 6e 20 6f 6e 20 74 68  lize again on th
1ee0: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  e statement afte
1ef0: 72 0d 0a 20 20 20 20 74 68 61 74 20 6d 65 6d 6f  r..    that memo
1f00: 72 79 20 77 61 73 20 64 65 61 6c 6c 6f 63 61 74  ry was deallocat
1f10: 65 64 2e 20 20 42 41 44 2e 20 20 53 6f 2c 20 77  ed.  BAD.  So, w
1f20: 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20 64  hat we need to d
1f30: 6f 20 69 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  o is make a copy
1f40: 20 6f 66 20 65 61 63 68 20 73 74 61 74 65 6d 65   of each stateme
1f50: 6e 74 2c 20 61 6e 64 20 63 61 6c 6c 20 66 69 6e  nt, and call fin
1f60: 61 6c 69 7a 65 28 29 20 6f 6e 20 74 68 65 20 63  alize() on the c
1f70: 6f 70 79 20 2d 2d 20 73 6f 20 74 68 61 74 20 74  opy -- so that t
1f80: 68 65 20 6f 72 69 67 69 6e 61 6c 0d 0a 20 20 20  he original..   
1f90: 20 73 74 61 74 65 6d 65 6e 74 27 73 20 6d 65 6d   statement's mem
1fa0: 6f 72 79 20 69 73 20 70 72 65 73 65 72 76 65 64  ory is preserved
1fb0: 2c 20 61 6e 64 20 6d 61 72 6b 65 64 20 61 73 20  , and marked as 
1fc0: 42 41 44 2c 20 62 75 74 20 77 65 20 63 61 6e 20  BAD, but we can 
1fd0: 73 74 69 6c 6c 20 6d 61 6e 61 67 65 20 74 6f 20  still manage to 
1fe0: 66 69 6e 61 6c 69 7a 65 20 65 76 65 72 79 74 68  finalize everyth
1ff0: 69 6e 67 20 61 6e 64 20 66 6f 72 63 69 62 6c 79  ing and forcibly
2000: 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
2010: 61 73 65 2e 20 20 4c 61 74 65 72 20 77 68 65 6e  ase.  Later when
2020: 20 74 68 65 0d 0a 20 20 20 20 47 43 20 67 65 74   the..    GC get
2030: 73 20 61 72 6f 75 6e 64 20 74 6f 20 63 61 6c 6c  s around to call
2040: 69 6e 67 20 66 69 6e 61 6c 69 7a 65 5f 69 6e 74  ing finalize_int
2050: 65 72 6f 70 28 29 20 6f 6e 20 74 68 65 20 22 62  erop() on the "b
2060: 61 64 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 77  ad" statement, w
2070: 65 20 64 65 74 65 63 74 20 74 68 61 74 20 61 6e  e detect that an
2080: 64 20 66 69 6e 69 73 68 20 64 65 61 6c 6c 6f 63  d finish dealloc
2090: 61 74 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ating the pointe
20a0: 72 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41  r...*/..SQLITE_A
20b0: 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  PI int WINAPI sq
20c0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 69 6e 74 65  lite3_close_inte
20d0: 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62 29  rop(sqlite3 *db)
20e0: 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65 74 3b 0d  ..{..  int ret;.
20f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 49 4e  .#if !defined(IN
2100: 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f  TEROP_LEGACY_CLO
2110: 53 45 29 20 26 26 20 53 51 4c 49 54 45 5f 56 45  SE) && SQLITE_VE
2120: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
2130: 33 30 30 37 30 31 34 0d 0a 0d 0a 23 69 66 20 64  3007014....#if d
2140: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44  efined(INTEROP_D
2150: 45 42 55 47 29 20 26 26 20 28 49 4e 54 45 52 4f  EBUG) && (INTERO
2160: 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52 4f  P_DEBUG & INTERO
2170: 50 5f 44 45 42 55 47 5f 43 4c 4f 53 45 29 0d 0a  P_DEBUG_CLOSE)..
2180: 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70    sqlite3Interop
2190: 44 65 62 75 67 28 22 73 71 6c 69 74 65 33 5f 63  Debug("sqlite3_c
21a0: 6c 6f 73 65 5f 69 6e 74 65 72 6f 70 28 29 3a 20  lose_interop(): 
21b0: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
21c0: 63 6c 6f 73 65 5f 76 32 28 25 70 29 2e 2e 2e 5c  close_v2(%p)...\
21d0: 6e 22 2c 20 64 62 29 3b 0d 0a 23 65 6e 64 69 66  n", db);..#endif
21e0: 0d 0a 0d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69  ....  ret = sqli
21f0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
2200: 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  ;....#if defined
2210: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20  (INTEROP_DEBUG) 
2220: 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  && (INTEROP_DEBU
2230: 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  G & INTEROP_DEBU
2240: 47 5f 43 4c 4f 53 45 29 0d 0a 20 20 73 71 6c 69  G_CLOSE)..  sqli
2250: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
2260: 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 69  "sqlite3_close_i
2270: 6e 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65  nterop(): sqlite
2280: 33 5f 63 6c 6f 73 65 5f 76 32 28 25 70 29 20 72  3_close_v2(%p) r
2290: 65 74 75 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20  eturned %d.\n", 
22a0: 64 62 2c 20 72 65 74 29 3b 0d 0a 23 65 6e 64 69  db, ret);..#endi
22b0: 66 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 65  f....  return re
22c0: 74 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 72 65 74  t;..#else..  ret
22d0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
22e0: 28 64 62 29 3b 0d 0a 0d 0a 20 20 69 66 20 28 72  (db);....  if (r
22f0: 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 42 55 53  et == SQLITE_BUS
2300: 59 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 73 71 6c  Y)..  {..    sql
2310: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2320: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 0d 0a  (db->mutex);....
2330: 20 20 20 20 69 66 20 28 21 64 62 2d 3e 70 56 64      if (!db->pVd
2340: 62 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  be)..    {..    
2350: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2360: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
2370: 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
2380: 72 65 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ret;..    }.... 
2390: 20 20 20 77 68 69 6c 65 20 28 64 62 2d 3e 70 56     while (db->pV
23a0: 64 62 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  dbe)..    {..   
23b0: 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70     /* Make a cop
23c0: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  y of the first p
23d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
23e0: 74 20 2a 2f 0d 0a 20 20 20 20 20 20 56 64 62 65  t */..      Vdbe
23f0: 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29 73 71   *p = (Vdbe *)sq
2400: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2410: 6f 5f 69 6e 74 65 72 6f 70 28 64 62 2c 20 73 69  o_interop(db, si
2420: 7a 65 6f 66 28 56 64 62 65 29 29 3b 0d 0a 20 20  zeof(Vdbe));..  
2430: 20 20 20 20 56 64 62 65 20 2a 70 6f 20 3d 20 64      Vdbe *po = d
2440: 62 2d 3e 70 56 64 62 65 3b 0d 0a 0d 0a 20 20 20  b->pVdbe;....   
2450: 20 20 20 69 66 20 28 21 70 29 0d 0a 20 20 20 20     if (!p)..    
2460: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74    {..        ret
2470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2480: 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
2490: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
24a0: 20 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28 70 2c     CopyMemory(p,
24b0: 20 70 6f 2c 20 73 69 7a 65 6f 66 28 56 64 62 65   po, sizeof(Vdbe
24c0: 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2a 20  ));....      /* 
24d0: 50 75 74 20 69 74 20 6f 6e 20 74 68 65 20 63 68  Put it on the ch
24e0: 61 69 6e 20 73 6f 20 77 65 20 63 61 6e 20 66 72  ain so we can fr
24f0: 65 65 20 69 74 20 2a 2f 0d 0a 20 20 20 20 20 20  ee it */..      
2500: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0d 0a  db->pVdbe = p;..
2510: 20 20 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69        ret = sqli
2520: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 28 73 71  te3_finalize((sq
2530: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 29 3b  lite3_stmt *)p);
2540: 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   /* This will al
2550: 73 6f 20 66 72 65 65 20 74 68 65 20 63 6f 70 79  so free the copy
2560: 27 73 20 6d 65 6d 6f 72 79 20 2a 2f 0d 0a 20 20  's memory */..  
2570: 20 20 20 20 69 66 20 28 72 65 74 29 0d 0a 20 20      if (ret)..  
2580: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f      {..        /
2590: 2a 20 66 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65  * finalize faile
25a0: 64 20 2d 2d 20 73 6f 20 77 65 20 6d 75 73 74 20  d -- so we must 
25b0: 70 75 74 20 62 61 63 6b 20 61 6e 79 74 68 69 6e  put back anythin
25c0: 67 20 77 65 20 6d 75 6e 67 65 64 20 2a 2f 0d 0a  g we munged */..
25d0: 20 20 20 20 20 20 20 20 43 6f 70 79 4d 65 6d 6f          CopyMemo
25e0: 72 79 28 70 6f 2c 20 70 2c 20 73 69 7a 65 6f 66  ry(po, p, sizeof
25f0: 28 56 64 62 65 29 29 3b 0d 0a 20 20 20 20 20 20  (Vdbe));..      
2600: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 6f    db->pVdbe = po
2610: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2a 0d  ;....        /*.
2620: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 4f 54 45  .        ** NOTE
2630: 3a 20 4f 6b 2c 20 77 65 20 6d 75 73 74 20 66 72  : Ok, we must fr
2640: 65 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 74 68  ee this block th
2650: 61 74 20 2a 77 65 2a 20 61 6c 6c 6f 63 61 74 65  at *we* allocate
2660: 64 20 28 61 62 6f 76 65 29 20 73 69 6e 63 65 0d  d (above) since.
2670: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2680: 20 20 66 69 6e 61 6c 69 7a 65 20 64 69 64 20 6e    finalize did n
2690: 6f 74 20 64 6f 20 73 6f 2e 0d 0a 20 20 20 20 20  ot do so...     
26a0: 20 20 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 73     */..        s
26b0: 71 6c 69 74 65 33 44 62 46 72 65 65 5f 69 6e 74  qlite3DbFree_int
26c0: 65 72 6f 70 28 64 62 2c 20 70 29 3b 0d 0a 20 20  erop(db, p);..  
26d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
26e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73      }..      els
26f0: 65 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  e..      {..    
2700: 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70      ZeroMemory(p
2710: 6f 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 29  o, sizeof(Vdbe))
2720: 3b 0d 0a 20 20 20 20 20 20 20 20 70 6f 2d 3e 6d  ;..        po->m
2730: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
2740: 43 5f 44 45 41 44 3b 0d 0a 20 20 20 20 20 20 7d  C_DEAD;..      }
2750: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 71 6c  ..    }..    sql
2760: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2770: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20  (db->mutex);..  
2780: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
2790: 63 6c 6f 73 65 28 64 62 29 3b 0d 0a 20 20 7d 0d  close(db);..  }.
27a0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a  .  return ret;..
27b0: 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 23 69 66  #endif..}....#if
27c0: 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50   defined(INTEROP
27d0: 5f 4c 4f 47 29 0d 0a 53 51 4c 49 54 45 5f 41 50  _LOG)..SQLITE_AP
27e0: 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c  I int WINAPI sql
27f0: 69 74 65 33 5f 63 6f 6e 66 69 67 5f 6c 6f 67 5f  ite3_config_log_
2800: 69 6e 74 65 72 6f 70 28 29 0d 0a 7b 0d 0a 20 20  interop()..{..  
2810: 69 6e 74 20 72 65 74 3b 0d 0a 20 20 69 66 28 20  int ret;..  if( 
2820: 21 6c 6f 67 43 6f 6e 66 69 67 75 72 65 64 20 29  !logConfigured )
2830: 7b 0d 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c  {..    ret = sql
2840: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
2850: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 73  TE_CONFIG_LOG, s
2860: 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 4c 6f 67  qlite3InteropLog
2870: 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0d 0a 20  Callback, 0);.. 
2880: 20 20 20 69 66 28 20 72 65 74 3d 3d 53 51 4c 49     if( ret==SQLI
2890: 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 20 20  TE_OK ){..      
28a0: 6c 6f 67 43 6f 6e 66 69 67 75 72 65 64 20 3d 20  logConfigured = 
28b0: 31 3b 0d 0a 20 20 20 20 7d 65 6c 73 65 7b 0d 0a  1;..    }else{..
28c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 74        sqlite3Int
28d0: 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74  eropDebug("sqlit
28e0: 65 33 5f 63 6f 6e 66 69 67 5f 6c 6f 67 5f 69 6e  e3_config_log_in
28f0: 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33  terop(): sqlite3
2900: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
2910: 4f 4e 46 49 47 5f 4c 4f 47 29 20 72 65 74 75 72  ONFIG_LOG) retur
2920: 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 72 65 74 29  ned %d.\n", ret)
2930: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 65 6c 73  ;..    }..  }els
2940: 65 7b 0d 0a 20 20 20 20 72 65 74 20 3d 20 53 51  e{..    ret = SQ
2950: 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 7d 0d 0a 20  LITE_OK;..  }.. 
2960: 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 7d 0d   return ret;..}.
2970: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54  .#endif....SQLIT
2980: 45 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 61 72  E_API const char
2990: 20 2a 57 49 4e 41 50 49 20 69 6e 74 65 72 6f 70   *WINAPI interop
29a0: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64  _libversion(void
29b0: 29 0d 0a 7b 0d 0a 20 20 72 65 74 75 72 6e 20 49  )..{..  return I
29c0: 4e 54 45 52 4f 50 5f 56 45 52 53 49 4f 4e 3b 0d  NTEROP_VERSION;.
29d0: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  .}....SQLITE_API
29e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 57 49 4e   const char *WIN
29f0: 41 50 49 20 69 6e 74 65 72 6f 70 5f 73 6f 75 72  API interop_sour
2a00: 63 65 69 64 28 76 6f 69 64 29 0d 0a 7b 0d 0a 20  ceid(void)..{.. 
2a10: 20 72 65 74 75 72 6e 20 49 4e 54 45 52 4f 50 5f   return INTEROP_
2a20: 53 4f 55 52 43 45 5f 49 44 20 22 20 22 20 49 4e  SOURCE_ID " " IN
2a30: 54 45 52 4f 50 5f 53 4f 55 52 43 45 5f 54 49 4d  TEROP_SOURCE_TIM
2a40: 45 53 54 41 4d 50 3b 0d 0a 7d 0d 0a 0d 0a 53 51  ESTAMP;..}....SQ
2a50: 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e  LITE_API int WIN
2a60: 41 50 49 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  API sqlite3_open
2a70: 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 73 74 20 63  _interop(const c
2a80: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63  har *filename, c
2a90: 6f 6e 73 74 20 63 68 61 72 20 2a 76 66 73 4e 61  onst char *vfsNa
2aa0: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
2ab0: 6e 74 20 65 78 74 46 75 6e 63 73 2c 20 73 71 6c  nt extFuncs, sql
2ac0: 69 74 65 33 20 2a 2a 70 70 64 62 29 0d 0a 7b 0d  ite3 **ppdb)..{.
2ad0: 0a 20 20 69 6e 74 20 72 65 74 3b 0d 0a 0d 0a 23  .  int ret;....#
2ae0: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
2af0: 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e  OP_DEBUG) && (IN
2b00: 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e  TEROP_DEBUG & IN
2b10: 54 45 52 4f 50 5f 44 45 42 55 47 5f 4f 50 45 4e  TEROP_DEBUG_OPEN
2b20: 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65  )..  sqlite3Inte
2b30: 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74 65  ropDebug("sqlite
2b40: 33 5f 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28 29  3_open_interop()
2b50: 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  : calling sqlite
2b60: 33 5f 6f 70 65 6e 5f 76 32 28 5c 22 25 73 5c 22  3_open_v2(\"%s\"
2b70: 2c 20 5c 22 25 73 5c 22 2c 20 25 64 2c 20 25 64  , \"%s\", %d, %d
2b80: 2c 20 25 70 29 2e 2e 2e 5c 6e 22 2c 20 66 69 6c  , %p)...\n", fil
2b90: 65 6e 61 6d 65 2c 20 76 66 73 4e 61 6d 65 2c 20  ename, vfsName, 
2ba0: 66 6c 61 67 73 2c 20 65 78 74 46 75 6e 63 73 2c  flags, extFuncs,
2bb0: 20 70 70 64 62 29 3b 0d 0a 23 65 6e 64 69 66 0d   ppdb);..#endif.
2bc0: 0a 0d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74  ...  ret = sqlit
2bd0: 65 33 5f 6f 70 65 6e 5f 76 32 28 66 69 6c 65 6e  e3_open_v2(filen
2be0: 61 6d 65 2c 20 70 70 64 62 2c 20 66 6c 61 67 73  ame, ppdb, flags
2bf0: 2c 20 76 66 73 4e 61 6d 65 29 3b 0d 0a 0d 0a 23  , vfsName);....#
2c00: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
2c10: 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e  OP_DEBUG) && (IN
2c20: 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e  TEROP_DEBUG & IN
2c30: 54 45 52 4f 50 5f 44 45 42 55 47 5f 4f 50 45 4e  TEROP_DEBUG_OPEN
2c40: 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65  )..  sqlite3Inte
2c50: 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74 65  ropDebug("sqlite
2c60: 33 5f 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28 29  3_open_interop()
2c70: 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  : sqlite3_open_v
2c80: 32 28 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c 22  2(\"%s\", \"%s\"
2c90: 2c 20 25 64 2c 20 25 64 2c 20 25 70 29 20 72 65  , %d, %d, %p) re
2ca0: 74 75 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 66  turned %d.\n", f
2cb0: 69 6c 65 6e 61 6d 65 2c 20 76 66 73 4e 61 6d 65  ilename, vfsName
2cc0: 2c 20 66 6c 61 67 73 2c 20 65 78 74 46 75 6e 63  , flags, extFunc
2cd0: 73 2c 20 70 70 64 62 2c 20 72 65 74 29 3b 0d 0a  s, ppdb, ret);..
2ce0: 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64 65  #endif....#if de
2cf0: 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 45 58  fined(INTEROP_EX
2d00: 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
2d10: 53 29 0d 0a 20 20 69 66 20 28 28 72 65 74 20 3d  S)..  if ((ret =
2d20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  = SQLITE_OK) && 
2d30: 70 70 64 62 20 26 26 20 65 78 74 46 75 6e 63 73  ppdb && extFuncs
2d40: 29 0d 0a 20 20 20 20 52 65 67 69 73 74 65 72 45  )..    RegisterE
2d50: 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69 6f 6e  xtensionFunction
2d60: 73 28 2a 70 70 64 62 29 3b 0d 0a 23 65 6e 64 69  s(*ppdb);..#endi
2d70: 66 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 65  f....  return re
2d80: 74 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  t;..}....SQLITE_
2d90: 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73  API int WINAPI s
2da0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f 69 6e  qlite3_open16_in
2db0: 74 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61 72  terop(const char
2dc0: 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73   *filename, cons
2dd0: 74 20 63 68 61 72 20 2a 76 66 73 4e 61 6d 65 2c  t char *vfsName,
2de0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20   int flags, int 
2df0: 65 78 74 46 75 6e 63 73 2c 20 73 71 6c 69 74 65  extFuncs, sqlite
2e00: 33 20 2a 2a 70 70 64 62 29 0d 0a 7b 0d 0a 20 20  3 **ppdb)..{..  
2e10: 69 6e 74 20 72 65 74 3b 0d 0a 0d 0a 23 69 66 20  int ret;....#if 
2e20: 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f  defined(INTEROP_
2e30: 44 45 42 55 47 29 20 26 26 20 28 49 4e 54 45 52  DEBUG) && (INTER
2e40: 4f 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52  OP_DEBUG & INTER
2e50: 4f 50 5f 44 45 42 55 47 5f 4f 50 45 4e 31 36 29  OP_DEBUG_OPEN16)
2e60: 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72  ..  sqlite3Inter
2e70: 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74 65 33  opDebug("sqlite3
2e80: 5f 6f 70 65 6e 31 36 5f 69 6e 74 65 72 6f 70 28  _open16_interop(
2e90: 29 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ): calling sqlit
2ea0: 65 33 5f 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28  e3_open_interop(
2eb0: 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c 22 2c 20  \"%s\", \"%s\", 
2ec0: 25 64 2c 20 25 64 2c 20 25 70 29 2e 2e 2e 5c 6e  %d, %d, %p)...\n
2ed0: 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 76 66 73  ", filename, vfs
2ee0: 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 65 78 74  Name, flags, ext
2ef0: 46 75 6e 63 73 2c 20 70 70 64 62 29 3b 0d 0a 23  Funcs, ppdb);..#
2f00: 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74 20 3d  endif....  ret =
2f10: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e   sqlite3_open_in
2f20: 74 65 72 6f 70 28 66 69 6c 65 6e 61 6d 65 2c 20  terop(filename, 
2f30: 76 66 73 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  vfsName, flags, 
2f40: 65 78 74 46 75 6e 63 73 2c 20 70 70 64 62 29 3b  extFuncs, ppdb);
2f50: 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ....#if defined(
2f60: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26  INTEROP_DEBUG) &
2f70: 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  & (INTEROP_DEBUG
2f80: 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47   & INTEROP_DEBUG
2f90: 5f 4f 50 45 4e 31 36 29 0d 0a 20 20 73 71 6c 69  _OPEN16)..  sqli
2fa0: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
2fb0: 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f  "sqlite3_open16_
2fc0: 69 6e 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74  interop(): sqlit
2fd0: 65 33 5f 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28  e3_open_interop(
2fe0: 5c 22 25 73 5c 22 2c 20 5c 22 25 73 5c 22 2c 20  \"%s\", \"%s\", 
2ff0: 25 64 2c 20 25 64 2c 20 25 70 29 20 72 65 74 75  %d, %d, %p) retu
3000: 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 66 69 6c  rned %d.\n", fil
3010: 65 6e 61 6d 65 2c 20 76 66 73 4e 61 6d 65 2c 20  ename, vfsName, 
3020: 66 6c 61 67 73 2c 20 65 78 74 46 75 6e 63 73 2c  flags, extFuncs,
3030: 20 70 70 64 62 2c 20 72 65 74 29 3b 0d 0a 23 65   ppdb, ret);..#e
3040: 6e 64 69 66 0d 0a 0d 0a 20 20 69 66 20 28 28 72  ndif....  if ((r
3050: 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  et == SQLITE_OK)
3060: 20 26 26 20 70 70 64 62 20 26 26 20 21 44 62 48   && ppdb && !DbH
3070: 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 64 62  asProperty(*ppdb
3080: 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
3090: 61 64 65 64 29 29 0d 0a 20 20 7b 0d 0a 20 20 20  aded))..  {..   
30a0: 20 45 4e 43 28 2a 70 70 64 62 29 20 3d 20 53 51   ENC(*ppdb) = SQ
30b0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
30c0: 3b 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;....#if SQLITE_
30d0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
30e0: 3d 20 33 30 30 38 30 30 38 0d 0a 20 20 20 20 2f  = 3008008..    /
30f0: 2f 0d 0a 20 20 20 20 2f 2f 20 42 55 47 46 49 58  /..    // BUGFIX
3100: 3a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 37 63  : See ticket [7c
3110: 31 35 31 61 32 66 30 65 32 32 38 30 34 63 5d 2e  151a2f0e22804c].
3120: 0d 0a 20 20 20 20 2f 2f 0d 0a 20 20 20 20 53 43  ..    //..    SC
3130: 48 45 4d 41 5f 45 4e 43 28 2a 70 70 64 62 29 20  HEMA_ENC(*ppdb) 
3140: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
3150: 54 49 56 45 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20  TIVE;..#endif.. 
3160: 20 7d 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72   }....  return r
3170: 65 74 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  et;..}....SQLITE
3180: 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 61 72 20  _API const char 
3190: 2a 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f  *WINAPI sqlite3_
31a0: 65 72 72 6d 73 67 5f 69 6e 74 65 72 6f 70 28 73  errmsg_interop(s
31b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
31c0: 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e  *plen)..{..  con
31d0: 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20  st char *pval = 
31e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
31f0: 62 29 3b 0d 0a 20 20 69 66 20 28 70 6c 65 6e 29  b);..  if (plen)
3200: 20 2a 70 6c 65 6e 20 3d 20 70 76 61 6c 20 3f 20   *plen = pval ? 
3210: 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30  strlen(pval) : 0
3220: 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  ;..  return pval
3230: 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41  ;..}....SQLITE_A
3240: 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  PI int WINAPI sq
3250: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 5f 69 6e  lite3_changes_in
3260: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64  terop(sqlite3 *d
3270: 62 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65 73  b)..{..  int res
3280: 75 6c 74 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69  ult;....#if defi
3290: 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  ned(INTEROP_DEBU
32a0: 47 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44  G) && (INTEROP_D
32b0: 45 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44  EBUG & INTEROP_D
32c0: 45 42 55 47 5f 43 48 41 4e 47 45 53 29 0d 0a 20  EBUG_CHANGES).. 
32d0: 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44   sqlite3InteropD
32e0: 65 62 75 67 28 22 73 71 6c 69 74 65 33 5f 63 68  ebug("sqlite3_ch
32f0: 61 6e 67 65 73 5f 69 6e 74 65 72 6f 70 28 29 3a  anges_interop():
3300: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
3310: 5f 63 68 61 6e 67 65 73 28 25 70 29 2e 2e 2e 5c  _changes(%p)...\
3320: 6e 22 2c 20 64 62 29 3b 0d 0a 23 65 6e 64 69 66  n", db);..#endif
3330: 0d 0a 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ....#ifndef NDEB
3340: 55 47 0d 0a 20 20 69 66 20 28 21 64 62 29 0d 0a  UG..  if (!db)..
3350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e 74        sqlite3Int
3360: 65 72 6f 70 42 72 65 61 6b 28 22 6e 75 6c 6c 20  eropBreak("null 
3370: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
3380: 66 6f 72 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  for sqlite3_chan
3390: 67 65 73 28 29 22 29 3b 0d 0a 23 65 6e 64 69 66  ges()");..#endif
33a0: 0d 0a 0d 0a 20 20 72 65 73 75 6c 74 20 3d 20 73  ....  result = s
33b0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
33c0: 62 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e  b);....#if defin
33d0: 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  ed(INTEROP_DEBUG
33e0: 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45  ) && (INTEROP_DE
33f0: 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45  BUG & INTEROP_DE
3400: 42 55 47 5f 43 48 41 4e 47 45 53 29 0d 0a 20 20  BUG_CHANGES)..  
3410: 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65  sqlite3InteropDe
3420: 62 75 67 28 22 73 71 6c 69 74 65 33 5f 63 68 61  bug("sqlite3_cha
3430: 6e 67 65 73 5f 69 6e 74 65 72 6f 70 28 29 3a 20  nges_interop(): 
3440: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
3450: 25 70 29 20 72 65 74 75 72 6e 65 64 20 25 64 2e  %p) returned %d.
3460: 5c 6e 22 2c 20 64 62 2c 20 72 65 73 75 6c 74 29  \n", db, result)
3470: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72  ;..#endif....  r
3480: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 7d  eturn result;..}
3490: 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69  ....SQLITE_API i
34a0: 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65  nt WINAPI sqlite
34b0: 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65 72 6f  3_prepare_intero
34c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  p(sqlite3 *db, c
34d0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20  onst char *sql, 
34e0: 69 6e 74 20 6e 62 79 74 65 73 2c 20 73 71 6c 69  int nbytes, sqli
34f0: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 73 74 6d  te3_stmt **ppstm
3500: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  t, const char **
3510: 70 7a 74 61 69 6c 2c 20 69 6e 74 20 2a 70 6c 65  pztail, int *ple
3520: 6e 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d  n)..{..  int n;.
3530: 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49  ...#if defined(I
3540: 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26 26  NTEROP_DEBUG) &&
3550: 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20   (INTEROP_DEBUG 
3560: 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f  & INTEROP_DEBUG_
3570: 50 52 45 50 41 52 45 29 0d 0a 20 20 73 71 6c 69  PREPARE)..  sqli
3580: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
3590: 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
35a0: 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c  _interop(): call
35b0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ing sqlite3_prep
35c0: 61 72 65 28 25 70 2c 20 5c 22 25 73 5c 22 2c 20  are(%p, \"%s\", 
35d0: 25 64 2c 20 25 70 29 2e 2e 2e 5c 6e 22 2c 20 64  %d, %p)...\n", d
35e0: 62 2c 20 73 71 6c 2c 20 6e 62 79 74 65 73 2c 20  b, sql, nbytes, 
35f0: 70 70 73 74 6d 74 29 3b 0d 0a 23 65 6e 64 69 66  ppstmt);..#endif
3600: 0d 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 56  ....#if SQLITE_V
3610: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
3620: 20 33 30 30 33 30 30 39 0d 0a 20 20 6e 20 3d 20   3003009..  n = 
3630: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
3640: 76 32 28 64 62 2c 20 73 71 6c 2c 20 6e 62 79 74  v2(db, sql, nbyt
3650: 65 73 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61  es, ppstmt, pzta
3660: 69 6c 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 6e  il);..#else..  n
3670: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
3680: 72 65 28 64 62 2c 20 73 71 6c 2c 20 6e 62 79 74  re(db, sql, nbyt
3690: 65 73 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61  es, ppstmt, pzta
36a0: 69 6c 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  il);..#endif....
36b0: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45  #if defined(INTE
36c0: 52 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49  ROP_DEBUG) && (I
36d0: 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49  NTEROP_DEBUG & I
36e0: 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 50 52 45  NTEROP_DEBUG_PRE
36f0: 50 41 52 45 29 0d 0a 20 20 73 71 6c 69 74 65 33  PARE)..  sqlite3
3700: 49 6e 74 65 72 6f 70 44 65 62 75 67 28 22 73 71  InteropDebug("sq
3710: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 69 6e  lite3_prepare_in
3720: 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33  terop(): sqlite3
3730: 5f 70 72 65 70 61 72 65 28 25 70 2c 20 5c 22 25  _prepare(%p, \"%
3740: 73 5c 22 2c 20 25 64 2c 20 25 70 29 20 72 65 74  s\", %d, %p) ret
3750: 75 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 64 62  urned %d.\n", db
3760: 2c 20 73 71 6c 2c 20 6e 62 79 74 65 73 2c 20 70  , sql, nbytes, p
3770: 70 73 74 6d 74 2c 20 6e 29 3b 0d 0a 23 65 6e 64  pstmt, n);..#end
3780: 69 66 0d 0a 0d 0a 20 20 69 66 20 28 70 6c 65 6e  if....  if (plen
3790: 29 20 2a 70 6c 65 6e 20 3d 20 28 70 7a 74 61 69  ) *plen = (pztai
37a0: 6c 20 26 26 20 2a 70 7a 74 61 69 6c 29 20 3f 20  l && *pztail) ? 
37b0: 73 74 72 6c 65 6e 28 2a 70 7a 74 61 69 6c 29 20  strlen(*pztail) 
37c0: 3a 20 30 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  : 0;....  return
37d0: 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45   n;..}....SQLITE
37e0: 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20  _API int WINAPI 
37f0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
3800: 36 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  6_interop(sqlite
3810: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 76 6f 69  3 *db, const voi
3820: 64 20 2a 73 71 6c 2c 20 69 6e 74 20 6e 63 68 61  d *sql, int ncha
3830: 72 73 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  rs, sqlite3_stmt
3840: 20 2a 2a 70 70 73 74 6d 74 2c 20 63 6f 6e 73 74   **ppstmt, const
3850: 20 76 6f 69 64 20 2a 2a 70 7a 74 61 69 6c 2c 20   void **pztail, 
3860: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
3870: 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 23 69 66 20 64   int n;....#if d
3880: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44  efined(INTEROP_D
3890: 45 42 55 47 29 20 26 26 20 28 49 4e 54 45 52 4f  EBUG) && (INTERO
38a0: 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52 4f  P_DEBUG & INTERO
38b0: 50 5f 44 45 42 55 47 5f 50 52 45 50 41 52 45 31  P_DEBUG_PREPARE1
38c0: 36 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74  6)..  sqlite3Int
38d0: 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74  eropDebug("sqlit
38e0: 65 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65 72  e3_prepare_inter
38f0: 6f 70 28 29 3a 20 63 61 6c 6c 69 6e 67 20 73 71  op(): calling sq
3900: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28  lite3_prepare16(
3910: 25 70 2c 20 5c 22 25 73 5c 22 2c 20 25 64 2c 20  %p, \"%s\", %d, 
3920: 25 70 29 2e 2e 2e 5c 6e 22 2c 20 64 62 2c 20 73  %p)...\n", db, s
3930: 71 6c 2c 20 6e 63 68 61 72 73 2c 20 70 70 73 74  ql, nchars, ppst
3940: 6d 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  mt);..#endif....
3950: 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49  #if SQLITE_VERSI
3960: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30  ON_NUMBER >= 300
3970: 33 30 30 39 0d 0a 20 20 6e 20 3d 20 73 71 6c 69  3009..  n = sqli
3980: 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
3990: 28 64 62 2c 20 73 71 6c 2c 20 6e 63 68 61 72 73  (db, sql, nchars
39a0: 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f   * sizeof(wchar_
39b0: 74 29 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61  t), ppstmt, pzta
39c0: 69 6c 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 6e  il);..#else..  n
39d0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
39e0: 72 65 31 36 28 64 62 2c 20 73 71 6c 2c 20 6e 63  re16(db, sql, nc
39f0: 68 61 72 73 20 2a 20 73 69 7a 65 6f 66 28 77 63  hars * sizeof(wc
3a00: 68 61 72 5f 74 29 2c 20 70 70 73 74 6d 74 2c 20  har_t), ppstmt, 
3a10: 70 7a 74 61 69 6c 29 3b 0d 0a 23 65 6e 64 69 66  pztail);..#endif
3a20: 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ....#if defined(
3a30: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26  INTEROP_DEBUG) &
3a40: 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  & (INTEROP_DEBUG
3a50: 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47   & INTEROP_DEBUG
3a60: 5f 50 52 45 50 41 52 45 31 36 29 0d 0a 20 20 73  _PREPARE16)..  s
3a70: 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62  qlite3InteropDeb
3a80: 75 67 28 22 73 71 6c 69 74 65 33 5f 70 72 65 70  ug("sqlite3_prep
3a90: 61 72 65 5f 69 6e 74 65 72 6f 70 28 29 3a 20 73  are_interop(): s
3aa0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
3ab0: 28 25 70 2c 20 5c 22 25 73 5c 22 2c 20 25 64 2c  (%p, \"%s\", %d,
3ac0: 20 25 70 29 20 72 65 74 75 72 6e 65 64 20 25 64   %p) returned %d
3ad0: 2e 5c 6e 22 2c 20 64 62 2c 20 73 71 6c 2c 20 6e  .\n", db, sql, n
3ae0: 63 68 61 72 73 2c 20 70 70 73 74 6d 74 2c 20 6e  chars, ppstmt, n
3af0: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20  );..#endif....  
3b00: 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20  if (plen) *plen 
3b10: 3d 20 28 70 7a 74 61 69 6c 20 26 26 20 2a 70 7a  = (pztail && *pz
3b20: 74 61 69 6c 29 20 3f 20 77 63 73 6c 65 6e 28 28  tail) ? wcslen((
3b30: 77 63 68 61 72 5f 74 20 2a 29 2a 70 7a 74 61 69  wchar_t *)*pztai
3b40: 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61  l) * sizeof(wcha
3b50: 72 5f 74 29 20 3a 20 30 3b 0d 0a 0d 0a 20 20 72  r_t) : 0;....  r
3b60: 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 23  eturn n;..}....#
3b70: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
3b80: 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
3b90: 29 20 26 26 20 53 51 4c 49 54 45 5f 56 45 52 53  ) && SQLITE_VERS
3ba0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30  ION_NUMBER >= 30
3bb0: 30 34 30 30 31 0d 0a 53 51 4c 49 54 45 5f 41 50  04001..SQLITE_AP
3bc0: 49 20 76 6f 69 64 20 2a 57 49 4e 41 50 49 20 73  I void *WINAPI s
3bd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64 69  qlite3_create_di
3be0: 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65 5f  sposable_module_
3bf0: 69 6e 74 65 72 6f 70 28 0d 0a 20 20 73 71 6c 69  interop(..  sqli
3c00: 74 65 33 20 2a 64 62 2c 0d 0a 20 20 63 6f 6e 73  te3 *db,..  cons
3c10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a  t char *zName,..
3c20: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
3c30: 20 2a 70 4d 6f 64 75 6c 65 2c 0d 0a 20 20 69 6e   *pModule,..  in
3c40: 74 20 69 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 69  t iVersion,..  i
3c50: 6e 74 20 28 2a 78 43 72 65 61 74 65 29 28 73 71  nt (*xCreate)(sq
3c60: 6c 69 74 65 33 2a 2c 20 76 6f 69 64 20 2a 2c 20  lite3*, void *, 
3c70: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  int, const char 
3c80: 2a 63 6f 6e 73 74 2a 2c 20 73 71 6c 69 74 65 33  *const*, sqlite3
3c90: 5f 76 74 61 62 20 2a 2a 2c 20 63 68 61 72 2a 2a  _vtab **, char**
3ca0: 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e  ),..  int (*xCon
3cb0: 6e 65 63 74 29 28 73 71 6c 69 74 65 33 2a 2c 20  nect)(sqlite3*, 
3cc0: 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e  void *, int, con
3cd0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 2c  st char *const*,
3ce0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
3cf0: 2c 20 63 68 61 72 2a 2a 29 2c 0d 0a 20 20 69 6e  , char**),..  in
3d00: 74 20 28 2a 78 42 65 73 74 49 6e 64 65 78 29 28  t (*xBestIndex)(
3d10: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c 20  sqlite3_vtab *, 
3d20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3d30: 66 6f 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78  fo*),..  int (*x
3d40: 44 69 73 63 6f 6e 6e 65 63 74 29 28 73 71 6c 69  Disconnect)(sqli
3d50: 74 65 33 5f 76 74 61 62 20 2a 29 2c 0d 0a 20 20  te3_vtab *),..  
3d60: 69 6e 74 20 28 2a 78 44 65 73 74 72 6f 79 29 28  int (*xDestroy)(
3d70: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2c  sqlite3_vtab *),
3d80: 0d 0a 20 20 69 6e 74 20 28 2a 78 4f 70 65 6e 29  ..  int (*xOpen)
3d90: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c  (sqlite3_vtab *,
3da0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
3db0: 72 73 6f 72 20 2a 2a 29 2c 0d 0a 20 20 69 6e 74  rsor **),..  int
3dc0: 20 28 2a 78 43 6c 6f 73 65 29 28 73 71 6c 69 74   (*xClose)(sqlit
3dd0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
3de0: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 46 69 6c 74  ,..  int (*xFilt
3df0: 65 72 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  er)(sqlite3_vtab
3e00: 5f 63 75 72 73 6f 72 2a 2c 20 69 6e 74 2c 20 63  _cursor*, int, c
3e10: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
3e20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3e30: 2a 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 4e  **),..  int (*xN
3e40: 65 78 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61  ext)(sqlite3_vta
3e50: 62 5f 63 75 72 73 6f 72 2a 29 2c 0d 0a 20 20 69  b_cursor*),..  i
3e60: 6e 74 20 28 2a 78 45 6f 66 29 28 73 71 6c 69 74  nt (*xEof)(sqlit
3e70: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
3e80: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6c 75  ,..  int (*xColu
3e90: 6d 6e 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  mn)(sqlite3_vtab
3ea0: 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69 74 65  _cursor*, sqlite
3eb0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 29  3_context*, int)
3ec0: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 52 6f 77 69  ,..  int (*xRowi
3ed0: 64 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  d)(sqlite3_vtab_
3ee0: 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69 74 65 33  cursor*, sqlite3
3ef0: 5f 69 6e 74 36 34 20 2a 29 2c 0d 0a 20 20 69 6e  _int64 *),..  in
3f00: 74 20 28 2a 78 55 70 64 61 74 65 29 28 73 71 6c  t (*xUpdate)(sql
3f10: 69 74 65 33 5f 76 74 61 62 20 2a 2c 20 69 6e 74  ite3_vtab *, int
3f20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3f30: 2a 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  **, sqlite3_int6
3f40: 34 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78  4 *),..  int (*x
3f50: 42 65 67 69 6e 29 28 73 71 6c 69 74 65 33 5f 76  Begin)(sqlite3_v
3f60: 74 61 62 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28  tab *),..  int (
3f70: 2a 78 53 79 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xSync)(sqlite3_
3f80: 76 74 61 62 20 2a 29 2c 0d 0a 20 20 69 6e 74 20  vtab *),..  int 
3f90: 28 2a 78 43 6f 6d 6d 69 74 29 28 73 71 6c 69 74  (*xCommit)(sqlit
3fa0: 65 33 5f 76 74 61 62 20 2a 29 2c 0d 0a 20 20 69  e3_vtab *),..  i
3fb0: 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 29 28  nt (*xRollback)(
3fc0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2c  sqlite3_vtab *),
3fd0: 0d 0a 20 20 69 6e 74 20 28 2a 78 46 69 6e 64 46  ..  int (*xFindF
3fe0: 75 6e 63 74 69 6f 6e 29 28 73 71 6c 69 74 65 33  unction)(sqlite3
3ff0: 5f 76 74 61 62 20 2a 2c 20 69 6e 74 2c 20 63 6f  _vtab *, int, co
4000: 6e 73 74 20 63 68 61 72 20 2a 2c 20 76 6f 69 64  nst char *, void
4010: 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69   (**pxFunc)(sqli
4020: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e  te3_context*, in
4030: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
4040: 2a 2a 29 2c 20 76 6f 69 64 20 2a 2a 70 70 41 72  **), void **ppAr
4050: 67 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 52 65  g),..  int (*xRe
4060: 6e 61 6d 65 29 28 73 71 6c 69 74 65 33 5f 76 74  name)(sqlite3_vt
4070: 61 62 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ab *, const char
4080: 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 53   *),..  int (*xS
4090: 61 76 65 70 6f 69 6e 74 29 28 73 71 6c 69 74 65  avepoint)(sqlite
40a0: 33 5f 76 74 61 62 20 2a 2c 20 69 6e 74 29 2c 0d  3_vtab *, int),.
40b0: 0a 20 20 69 6e 74 20 28 2a 78 52 65 6c 65 61 73  .  int (*xReleas
40c0: 65 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  e)(sqlite3_vtab 
40d0: 2a 2c 20 69 6e 74 29 2c 0d 0a 20 20 69 6e 74 20  *, int),..  int 
40e0: 28 2a 78 52 6f 6c 6c 62 61 63 6b 54 6f 29 28 73  (*xRollbackTo)(s
40f0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c 20 69  qlite3_vtab *, i
4100: 6e 74 29 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 43  nt),..  void *pC
4110: 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 76 6f  lientData,..  vo
4120: 69 64 28 2a 78 44 65 73 74 72 6f 79 4d 6f 64 75  id(*xDestroyModu
4130: 6c 65 29 28 76 6f 69 64 2a 29 0d 0a 29 7b 0d 0a  le)(void*)..){..
4140: 20 20 69 66 20 28 21 70 4d 6f 64 75 6c 65 29 20    if (!pModule) 
4150: 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 6d 65 6d  return 0;..  mem
4160: 73 65 74 28 70 4d 6f 64 75 6c 65 2c 20 30 2c 20  set(pModule, 0, 
4170: 73 69 7a 65 6f 66 28 2a 70 4d 6f 64 75 6c 65 29  sizeof(*pModule)
4180: 29 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 69  );..  pModule->i
4190: 56 65 72 73 69 6f 6e 20 3d 20 69 56 65 72 73 69  Version = iVersi
41a0: 6f 6e 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e  on;..  pModule->
41b0: 78 43 72 65 61 74 65 20 3d 20 78 43 72 65 61 74  xCreate = xCreat
41c0: 65 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  e;..  pModule->x
41d0: 43 6f 6e 6e 65 63 74 20 3d 20 78 43 6f 6e 6e 65  Connect = xConne
41e0: 63 74 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e  ct;..  pModule->
41f0: 78 42 65 73 74 49 6e 64 65 78 20 3d 20 78 42 65  xBestIndex = xBe
4200: 73 74 49 6e 64 65 78 3b 0d 0a 20 20 70 4d 6f 64  stIndex;..  pMod
4210: 75 6c 65 2d 3e 78 44 69 73 63 6f 6e 6e 65 63 74  ule->xDisconnect
4220: 20 3d 20 78 44 69 73 63 6f 6e 6e 65 63 74 3b 0d   = xDisconnect;.
4230: 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73  .  pModule->xDes
4240: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
4250: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70  ..  pModule->xOp
4260: 65 6e 20 3d 20 78 4f 70 65 6e 3b 0d 0a 20 20 70  en = xOpen;..  p
4270: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 20 3d  Module->xClose =
4280: 20 78 43 6c 6f 73 65 3b 0d 0a 20 20 70 4d 6f 64   xClose;..  pMod
4290: 75 6c 65 2d 3e 78 46 69 6c 74 65 72 20 3d 20 78  ule->xFilter = x
42a0: 46 69 6c 74 65 72 3b 0d 0a 20 20 70 4d 6f 64 75  Filter;..  pModu
42b0: 6c 65 2d 3e 78 4e 65 78 74 20 3d 20 78 4e 65 78  le->xNext = xNex
42c0: 74 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  t;..  pModule->x
42d0: 45 6f 66 20 3d 20 78 45 6f 66 3b 0d 0a 20 20 70  Eof = xEof;..  p
42e0: 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20  Module->xColumn 
42f0: 3d 20 78 43 6f 6c 75 6d 6e 3b 0d 0a 20 20 70 4d  = xColumn;..  pM
4300: 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 3d 20  odule->xRowid = 
4310: 78 52 6f 77 69 64 3b 0d 0a 20 20 70 4d 6f 64 75  xRowid;..  pModu
4320: 6c 65 2d 3e 78 55 70 64 61 74 65 20 3d 20 78 55  le->xUpdate = xU
4330: 70 64 61 74 65 3b 0d 0a 20 20 70 4d 6f 64 75 6c  pdate;..  pModul
4340: 65 2d 3e 78 42 65 67 69 6e 20 3d 20 78 42 65 67  e->xBegin = xBeg
4350: 69 6e 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e  in;..  pModule->
4360: 78 53 79 6e 63 20 3d 20 78 53 79 6e 63 3b 0d 0a  xSync = xSync;..
4370: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6d 6d    pModule->xComm
4380: 69 74 20 3d 20 78 43 6f 6d 6d 69 74 3b 0d 0a 20  it = xCommit;.. 
4390: 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 6c 6c 62   pModule->xRollb
43a0: 61 63 6b 20 3d 20 78 52 6f 6c 6c 62 61 63 6b 3b  ack = xRollback;
43b0: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69  ..  pModule->xFi
43c0: 6e 64 46 75 6e 63 74 69 6f 6e 20 3d 20 78 46 69  ndFunction = xFi
43d0: 6e 64 46 75 6e 63 74 69 6f 6e 3b 0d 0a 20 20 70  ndFunction;..  p
43e0: 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20  Module->xRename 
43f0: 3d 20 78 52 65 6e 61 6d 65 3b 0d 0a 20 20 70 4d  = xRename;..  pM
4400: 6f 64 75 6c 65 2d 3e 78 53 61 76 65 70 6f 69 6e  odule->xSavepoin
4410: 74 20 3d 20 78 53 61 76 65 70 6f 69 6e 74 3b 0d  t = xSavepoint;.
4420: 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6c  .  pModule->xRel
4430: 65 61 73 65 20 3d 20 78 52 65 6c 65 61 73 65 3b  ease = xRelease;
4440: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f  ..  pModule->xRo
4450: 6c 6c 62 61 63 6b 54 6f 20 3d 20 78 52 6f 6c 6c  llbackTo = xRoll
4460: 62 61 63 6b 54 6f 3b 0d 0a 20 20 72 65 74 75 72  backTo;..  retur
4470: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
4480: 5f 64 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75  _disposable_modu
4490: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 4d  le(db, zName, pM
44a0: 6f 64 75 6c 65 2c 20 70 43 6c 69 65 6e 74 44 61  odule, pClientDa
44b0: 74 61 2c 20 78 44 65 73 74 72 6f 79 4d 6f 64 75  ta, xDestroyModu
44c0: 6c 65 29 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d  le);..}..#endif.
44d0: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e  ...SQLITE_API in
44e0: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
44f0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 5f 69 6e 74  _bind_double_int
4500: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
4510: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
4520: 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29 0d  l, double *val).
4530: 0a 7b 0d 0a 20 20 69 66 20 28 21 76 61 6c 29 20  .{..  if (!val) 
4540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
4550: 52 4f 52 3b 0d 0a 20 20 72 65 74 75 72 6e 20 73  ROR;..  return s
4560: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
4570: 6c 65 28 73 74 6d 74 2c 69 43 6f 6c 2c 2a 76 61  le(stmt,iCol,*va
4580: 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  l);..}....SQLITE
4590: 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20  _API int WINAPI 
45a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
45b0: 36 34 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  64_interop(sqlit
45c0: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
45d0: 6e 74 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 5f  nt iCol, sqlite_
45e0: 69 6e 74 36 34 20 2a 76 61 6c 29 0d 0a 7b 0d 0a  int64 *val)..{..
45f0: 20 20 69 66 20 28 21 76 61 6c 29 20 72 65 74 75    if (!val) retu
4600: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
4610: 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
4620: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 73 74  e3_bind_int64(st
4630: 6d 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b 0d 0a  mt,iCol,*val);..
4640: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
4650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e  const char * WIN
4660: 41 50 49 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  API sqlite3_bind
4670: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 5f  _parameter_name_
4680: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f  interop(sqlite3_
4690: 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20  stmt *stmt, int 
46a0: 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29  iCol, int *plen)
46b0: 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61  ..{..  const cha
46c0: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
46d0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
46e0: 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f 6c  _name(stmt, iCol
46f0: 29 3b 0d 0a 20 20 69 66 20 28 70 6c 65 6e 29 20  );..  if (plen) 
4700: 2a 70 6c 65 6e 20 3d 20 70 76 61 6c 20 3f 20 73  *plen = pval ? s
4710: 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b  trlen(pval) : 0;
4720: 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b  ..  return pval;
4730: 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50  ..}....SQLITE_AP
4740: 49 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57  I const char * W
4750: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f  INAPI sqlite3_co
4760: 6c 75 6d 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  lumn_name_intero
4770: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
4780: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
4790: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
47a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61   const char *pva
47b0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
47c0: 6d 6e 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43  mn_name(stmt, iC
47d0: 6f 6c 29 3b 0d 0a 20 20 69 66 20 28 70 6c 65 6e  ol);..  if (plen
47e0: 29 20 2a 70 6c 65 6e 20 3d 20 70 76 61 6c 20 3f  ) *plen = pval ?
47f0: 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20   strlen(pval) : 
4800: 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61  0;..  return pva
4810: 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  l;..}....SQLITE_
4820: 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  API const void *
4830: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
4840: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 5f 69 6e  column_name16_in
4850: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
4860: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
4870: 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a  ol, int *plen)..
4880: 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  {..  const void 
4890: 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *pval = sqlite3_
48a0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 28 73 74  column_name16(st
48b0: 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 69 66  mt, iCol);..  if
48c0: 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20 3d 20   (plen) *plen = 
48d0: 70 76 61 6c 20 3f 20 77 63 73 6c 65 6e 28 28 77  pval ? wcslen((w
48e0: 63 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a  char_t *)pval) *
48f0: 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29   sizeof(wchar_t)
4900: 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20   : 0;..  return 
4910: 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  pval;..}....SQLI
4920: 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 61  TE_API const cha
4930: 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  r * WINAPI sqlit
4940: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
4950: 70 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  pe_interop(sqlit
4960: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
4970: 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c  nt iCol, int *pl
4980: 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20  en)..{..  const 
4990: 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c  char *pval = sql
49a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
49b0: 74 79 70 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29  type(stmt, iCol)
49c0: 3b 0d 0a 20 20 69 66 20 28 70 6c 65 6e 29 20 2a  ;..  if (plen) *
49d0: 70 6c 65 6e 20 3d 20 70 76 61 6c 20 3f 20 73 74  plen = pval ? st
49e0: 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0d  rlen(pval) : 0;.
49f0: 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d  .  return pval;.
4a00: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  .}....SQLITE_API
4a10: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57 49   const void * WI
4a20: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
4a30: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 5f 69  umn_decltype16_i
4a40: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
4a50: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
4a60: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d  Col, int *plen).
4a70: 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  .{..  const void
4a80: 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pval = sqlite3
4a90: 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
4aa0: 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d  16(stmt, iCol);.
4ab0: 0a 20 20 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c  .  if (plen) *pl
4ac0: 65 6e 20 3d 20 70 76 61 6c 20 3f 20 77 63 73 6c  en = pval ? wcsl
4ad0: 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76  en((wchar_t *)pv
4ae0: 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68  al) * sizeof(wch
4af0: 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65  ar_t) : 0;..  re
4b00: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
4b10: 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64  .SQLITE_API void
4b20: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
4b30: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e  column_double_in
4b40: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
4b50: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
4b60: 6f 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  ol, double *val)
4b70: 0d 0a 7b 0d 0a 20 20 69 66 20 28 21 76 61 6c 29  ..{..  if (!val)
4b80: 20 72 65 74 75 72 6e 3b 0d 0a 20 20 2a 76 61 6c   return;..  *val
4b90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
4ba0: 6e 5f 64 6f 75 62 6c 65 28 73 74 6d 74 2c 69 43  n_double(stmt,iC
4bb0: 6f 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  ol);..}....SQLIT
4bc0: 45 5f 41 50 49 20 76 6f 69 64 20 57 49 4e 41 50  E_API void WINAP
4bd0: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
4be0: 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73  _int64_interop(s
4bf0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
4c00: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71 6c  t, int iCol, sql
4c10: 69 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0d  ite_int64 *val).
4c20: 0a 7b 0d 0a 20 20 69 66 20 28 21 76 61 6c 29 20  .{..  if (!val) 
4c30: 72 65 74 75 72 6e 3b 0d 0a 20 20 2a 76 61 6c 20  return;..  *val 
4c40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
4c50: 5f 69 6e 74 36 34 28 73 74 6d 74 2c 69 43 6f 6c  _int64(stmt,iCol
4c60: 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  );..}....SQLITE_
4c70: 41 50 49 20 76 6f 69 64 20 57 49 4e 41 50 49 20  API void WINAPI 
4c80: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
4c90: 65 72 74 5f 72 6f 77 69 64 5f 69 6e 74 65 72 6f  ert_rowid_intero
4ca0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  p(sqlite3 *db, s
4cb0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 72 6f 77  qlite_int64 *row
4cc0: 49 64 29 0d 0a 7b 0d 0a 20 20 69 66 20 28 21 72  Id)..{..  if (!r
4cd0: 6f 77 49 64 29 20 72 65 74 75 72 6e 3b 0d 0a 20  owId) return;.. 
4ce0: 20 2a 72 6f 77 49 64 20 3d 20 73 71 6c 69 74 65   *rowId = sqlite
4cf0: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4d00: 77 69 64 28 64 62 29 3b 0d 0a 7d 0d 0a 0d 0a 53  wid(db);..}....S
4d10: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 57  QLITE_API void W
4d20: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 65  INAPI sqlite3_me
4d30: 6d 6f 72 79 5f 75 73 65 64 5f 69 6e 74 65 72 6f  mory_used_intero
4d40: 70 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  p(sqlite_int64 *
4d50: 6e 42 79 74 65 73 29 0d 0a 7b 0d 0a 20 20 69 66  nBytes)..{..  if
4d60: 20 28 21 6e 42 79 74 65 73 29 20 72 65 74 75 72   (!nBytes) retur
4d70: 6e 3b 0d 0a 20 20 2a 6e 42 79 74 65 73 20 3d 20  n;..  *nBytes = 
4d80: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
4d90: 73 65 64 28 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  sed();..}....SQL
4da0: 49 54 45 5f 41 50 49 20 76 6f 69 64 20 57 49 4e  ITE_API void WIN
4db0: 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  API sqlite3_memo
4dc0: 72 79 5f 68 69 67 68 77 61 74 65 72 5f 69 6e 74  ry_highwater_int
4dd0: 65 72 6f 70 28 69 6e 74 20 72 65 73 65 74 46 6c  erop(int resetFl
4de0: 61 67 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ag, sqlite_int64
4df0: 20 2a 6e 42 79 74 65 73 29 0d 0a 7b 0d 0a 20 20   *nBytes)..{..  
4e00: 69 66 20 28 21 6e 42 79 74 65 73 29 20 72 65 74  if (!nBytes) ret
4e10: 75 72 6e 3b 0d 0a 20 20 2a 6e 42 79 74 65 73 20  urn;..  *nBytes 
4e20: 3d 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  = sqlite3_memory
4e30: 5f 68 69 67 68 77 61 74 65 72 28 72 65 73 65 74  _highwater(reset
4e40: 46 6c 61 67 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  Flag);..}....SQL
4e50: 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 75 6e  ITE_API const un
4e60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 57 49  signed char * WI
4e70: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
4e80: 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70  umn_text_interop
4e90: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73  (sqlite3_stmt *s
4ea0: 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  tmt, int iCol, i
4eb0: 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20  nt *plen)..{..  
4ec0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4ed0: 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69  har *pval = sqli
4ee0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
4ef0: 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20  stmt, iCol);..  
4f00: 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20  if (plen) *plen 
4f10: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
4f20: 5f 62 79 74 65 73 28 73 74 6d 74 2c 20 69 43 6f  _bytes(stmt, iCo
4f30: 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76  l);..  return pv
4f40: 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  al;..}....SQLITE
4f50: 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20  _API const void 
4f60: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
4f70: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 5f 69  _column_text16_i
4f80: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
4f90: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
4fa0: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d  Col, int *plen).
4fb0: 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  .{..  const void
4fc0: 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pval = sqlite3
4fd0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 73  _column_text16(s
4fe0: 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 69  tmt, iCol);..  i
4ff0: 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20 3d  f (plen) *plen =
5000: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5010: 62 79 74 65 73 31 36 28 73 74 6d 74 2c 20 69 43  bytes16(stmt, iC
5020: 6f 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70  ol);..  return p
5030: 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  val;..}....SQLIT
5040: 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49  E_API int WINAPI
5050: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5060: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
5070: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 29 0d 0a 7b  3_stmt *stmt)..{
5080: 0d 0a 20 20 69 6e 74 20 72 65 74 3b 0d 0a 23 69  ..  int ret;..#i
5090: 66 20 21 64 65 66 69 6e 65 64 28 49 4e 54 45 52  f !defined(INTER
50a0: 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 29  OP_LEGACY_CLOSE)
50b0: 20 26 26 20 53 51 4c 49 54 45 5f 56 45 52 53 49   && SQLITE_VERSI
50c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30  ON_NUMBER >= 300
50d0: 37 30 31 34 0d 0a 0d 0a 23 69 66 20 64 65 66 69  7014....#if defi
50e0: 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  ned(INTEROP_DEBU
50f0: 47 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44  G) && (INTEROP_D
5100: 45 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44  EBUG & INTEROP_D
5110: 45 42 55 47 5f 46 49 4e 41 4c 49 5a 45 29 0d 0a  EBUG_FINALIZE)..
5120: 20 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62    Vdbe *p = (Vdb
5130: 65 20 2a 29 73 74 6d 74 3b 0d 0a 20 20 73 71 6c  e *)stmt;..  sql
5140: 69 74 65 33 20 2a 64 62 20 3d 20 70 20 3f 20 70  ite3 *db = p ? p
5150: 2d 3e 64 62 20 3a 20 30 3b 0d 0a 20 20 73 71 6c  ->db : 0;..  sql
5160: 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67  ite3InteropDebug
5170: 28 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ("sqlite3_finali
5180: 7a 65 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63 61  ze_interop(): ca
5190: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  lling sqlite3_fi
51a0: 6e 61 6c 69 7a 65 28 25 70 2c 20 25 70 29 2e 2e  nalize(%p, %p)..
51b0: 2e 5c 6e 22 2c 20 64 62 2c 20 73 74 6d 74 29 3b  .\n", db, stmt);
51c0: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65  ..#endif....  re
51d0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  t = sqlite3_fina
51e0: 6c 69 7a 65 28 73 74 6d 74 29 3b 0d 0a 0d 0a 23  lize(stmt);....#
51f0: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
5200: 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e  OP_DEBUG) && (IN
5210: 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e  TEROP_DEBUG & IN
5220: 54 45 52 4f 50 5f 44 45 42 55 47 5f 46 49 4e 41  TEROP_DEBUG_FINA
5230: 4c 49 5a 45 29 0d 0a 20 20 73 71 6c 69 74 65 33  LIZE)..  sqlite3
5240: 49 6e 74 65 72 6f 70 44 65 62 75 67 28 22 73 71  InteropDebug("sq
5250: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5f 69  lite3_finalize_i
5260: 6e 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65  nterop(): sqlite
5270: 33 5f 66 69 6e 61 6c 69 7a 65 28 25 70 2c 20 25  3_finalize(%p, %
5280: 70 29 20 72 65 74 75 72 6e 65 64 20 25 64 2e 5c  p) returned %d.\
5290: 6e 22 2c 20 64 62 2c 20 73 74 6d 74 2c 20 72 65  n", db, stmt, re
52a0: 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20  t);..#endif.... 
52b0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 23 65   return ret;..#e
52c0: 6c 73 65 0d 0a 20 20 56 64 62 65 20 2a 70 3b 0d  lse..  Vdbe *p;.
52d0: 0a 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f  .  ret = SQLITE_
52e0: 4f 4b 3b 0d 0a 0d 0a 20 20 70 20 3d 20 28 56 64  OK;....  p = (Vd
52f0: 62 65 20 2a 29 73 74 6d 74 3b 0d 0a 20 20 69 66  be *)stmt;..  if
5300: 20 28 70 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 73   (p)..  {..    s
5310: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
5320: 64 62 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 64  db;....    if (d
5330: 62 20 21 3d 20 4e 55 4c 4c 29 0d 0a 20 20 20 20  b != NULL)..    
5340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5350: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
5360: 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 28 70 2d  ;....    if ((p-
5370: 3e 6d 61 67 69 63 20 3d 3d 20 56 44 42 45 5f 4d  >magic == VDBE_M
5380: 41 47 49 43 5f 44 45 41 44 29 20 26 26 20 28 64  AGIC_DEAD) && (d
5390: 62 20 3d 3d 20 4e 55 4c 4c 29 29 0d 0a 20 20 20  b == NULL))..   
53a0: 20 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65   {..      sqlite
53b0: 33 44 62 46 72 65 65 5f 69 6e 74 65 72 6f 70 28  3DbFree_interop(
53c0: 64 62 2c 20 70 29 3b 0d 0a 20 20 20 20 7d 0d 0a  db, p);..    }..
53d0: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 7b 0d      else..    {.
53e0: 0a 20 20 20 20 20 20 72 65 74 20 3d 20 73 71 6c  .      ret = sql
53f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 74  ite3_finalize(st
5400: 6d 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  mt);..    }.... 
5410: 20 20 20 69 66 20 28 64 62 20 21 3d 20 4e 55 4c     if (db != NUL
5420: 4c 29 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L)..      sqlite
5430: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
5440: 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a  ->mutex);..  }..
5450: 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d  ..  return ret;.
5460: 0a 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 53 51  .#endif..}....SQ
5470: 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e  LITE_API int WIN
5480: 41 50 49 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  API sqlite3_back
5490: 75 70 5f 66 69 6e 69 73 68 5f 69 6e 74 65 72 6f  up_finish_intero
54a0: 70 28 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  p(sqlite3_backup
54b0: 20 2a 70 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72   *p)..{..  int r
54c0: 65 74 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e  et;....#if defin
54d0: 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  ed(INTEROP_DEBUG
54e0: 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45  ) && (INTEROP_DE
54f0: 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45  BUG & INTEROP_DE
5500: 42 55 47 5f 42 41 43 4b 55 50 5f 46 49 4e 49 53  BUG_BACKUP_FINIS
5510: 48 29 0d 0a 20 20 73 71 6c 69 74 65 33 2a 20 70  H)..  sqlite3* p
5520: 44 65 73 74 44 62 20 3d 20 70 20 3f 20 70 2d 3e  DestDb = p ? p->
5530: 70 44 65 73 74 44 62 20 3a 20 30 3b 0d 0a 20 20  pDestDb : 0;..  
5540: 73 71 6c 69 74 65 33 2a 20 70 53 72 63 44 62 20  sqlite3* pSrcDb 
5550: 3d 20 70 20 3f 20 70 2d 3e 70 53 72 63 44 62 20  = p ? p->pSrcDb 
5560: 3a 20 30 3b 0d 0a 20 20 73 71 6c 69 74 65 33 49  : 0;..  sqlite3I
5570: 6e 74 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c  nteropDebug("sql
5580: 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
5590: 73 68 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63 61  sh_interop(): ca
55a0: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 61  lling sqlite3_ba
55b0: 63 6b 75 70 5f 66 69 6e 69 73 68 28 25 70 2c 20  ckup_finish(%p, 
55c0: 25 70 2c 20 25 70 29 2e 2e 2e 5c 6e 22 2c 20 70  %p, %p)...\n", p
55d0: 44 65 73 74 44 62 2c 20 70 53 72 63 44 62 2c 20  DestDb, pSrcDb, 
55e0: 70 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20  p);..#endif.... 
55f0: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 62   ret = sqlite3_b
5600: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 29 3b  ackup_finish(p);
5610: 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ....#if defined(
5620: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26  INTEROP_DEBUG) &
5630: 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  & (INTEROP_DEBUG
5640: 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47   & INTEROP_DEBUG
5650: 5f 42 41 43 4b 55 50 5f 46 49 4e 49 53 48 29 0d  _BACKUP_FINISH).
5660: 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f  .  sqlite3Intero
5670: 70 44 65 62 75 67 28 22 73 71 6c 69 74 65 33 5f  pDebug("sqlite3_
5680: 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 5f 69 6e  backup_finish_in
5690: 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33  terop(): sqlite3
56a0: 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 25  _backup_finish(%
56b0: 70 2c 20 25 70 2c 20 25 70 29 20 72 65 74 75 72  p, %p, %p) retur
56c0: 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 70 44 65 73  ned %d.\n", pDes
56d0: 74 44 62 2c 20 70 53 72 63 44 62 2c 20 70 2c 20  tDb, pSrcDb, p, 
56e0: 72 65 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ret);..#endif...
56f0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a  .  return ret;..
5700: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
5710: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
5720: 65 33 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70  e3_reset_interop
5730: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73  (sqlite3_stmt *s
5740: 74 6d 74 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72  tmt)..{..  int r
5750: 65 74 3b 0d 0a 23 69 66 20 21 64 65 66 69 6e 65  et;..#if !define
5760: 64 28 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59  d(INTEROP_LEGACY
5770: 5f 43 4c 4f 53 45 29 20 26 26 20 53 51 4c 49 54  _CLOSE) && SQLIT
5780: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
5790: 20 3e 3d 20 33 30 30 37 30 31 34 0d 0a 0d 0a 23   >= 3007014....#
57a0: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
57b0: 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e  OP_DEBUG) && (IN
57c0: 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e  TEROP_DEBUG & IN
57d0: 54 45 52 4f 50 5f 44 45 42 55 47 5f 52 45 53 45  TEROP_DEBUG_RESE
57e0: 54 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74  T)..  sqlite3Int
57f0: 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74  eropDebug("sqlit
5800: 65 33 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70  e3_reset_interop
5810: 28 29 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  (): calling sqli
5820: 74 65 33 5f 72 65 73 65 74 28 25 70 29 2e 2e 2e  te3_reset(%p)...
5830: 5c 6e 22 2c 20 73 74 6d 74 29 3b 0d 0a 23 65 6e  \n", stmt);..#en
5840: 64 69 66 0d 0a 0d 0a 20 20 72 65 74 20 3d 20 73  dif....  ret = s
5850: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 73 74 6d  qlite3_reset(stm
5860: 74 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e  t);....#if defin
5870: 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  ed(INTEROP_DEBUG
5880: 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45  ) && (INTEROP_DE
5890: 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45  BUG & INTEROP_DE
58a0: 42 55 47 5f 52 45 53 45 54 29 0d 0a 20 20 73 71  BUG_RESET)..  sq
58b0: 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75  lite3InteropDebu
58c0: 67 28 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  g("sqlite3_reset
58d0: 5f 69 6e 74 65 72 6f 70 28 29 3a 20 73 71 6c 69  _interop(): sqli
58e0: 74 65 33 5f 72 65 73 65 74 28 25 70 29 20 72 65  te3_reset(%p) re
58f0: 74 75 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 73  turned %d.\n", s
5900: 74 6d 74 2c 20 72 65 74 29 3b 0d 0a 23 65 6e 64  tmt, ret);..#end
5910: 69 66 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72  if....  return r
5920: 65 74 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66  et;..#else..  if
5930: 20 28 73 74 6d 74 20 26 26 20 28 28 56 64 62 65   (stmt && ((Vdbe
5940: 20 2a 29 73 74 6d 74 29 2d 3e 6d 61 67 69 63 20   *)stmt)->magic 
5950: 3d 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45  == VDBE_MAGIC_DE
5960: 41 44 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  AD) return SQLIT
5970: 45 5f 53 43 48 45 4d 41 3b 0d 0a 20 20 72 65 74  E_SCHEMA;..  ret
5980: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
5990: 28 73 74 6d 74 29 3b 0d 0a 20 20 72 65 74 75 72  (stmt);..  retur
59a0: 6e 20 72 65 74 3b 0d 0a 23 65 6e 64 69 66 0d 0a  n ret;..#endif..
59b0: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
59c0: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
59d0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
59e0: 6f 6e 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  on_interop(sqlit
59f0: 65 33 20 2a 70 73 71 6c 2c 20 63 6f 6e 73 74 20  e3 *psql, const 
5a00: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
5a10: 61 6d 65 2c 20 69 6e 74 20 6e 41 72 67 2c 20 69  ame, int nArg, i
5a20: 6e 74 20 65 54 65 78 74 52 65 70 2c 20 76 6f 69  nt eTextRep, voi
5a30: 64 20 2a 70 76 55 73 65 72 2c 20 53 51 4c 49 54  d *pvUser, SQLIT
5a40: 45 55 53 45 52 46 55 4e 43 20 66 75 6e 63 2c 20  EUSERFUNC func, 
5a50: 53 51 4c 49 54 45 55 53 45 52 46 55 4e 43 20 66  SQLITEUSERFUNC f
5a60: 75 6e 63 73 74 65 70 2c 20 53 51 4c 49 54 45 46  uncstep, SQLITEF
5a70: 55 4e 43 46 49 4e 41 4c 20 66 75 6e 63 66 69 6e  UNCFINAL funcfin
5a80: 61 6c 2c 20 69 6e 74 20 6e 65 65 64 43 6f 6c 6c  al, int needColl
5a90: 53 65 71 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 6e  Seq)..{..  int n
5aa0: 3b 0d 0a 0d 0a 20 20 69 66 20 28 65 54 65 78 74  ;....  if (eText
5ab0: 52 65 70 20 3d 3d 20 53 51 4c 49 54 45 5f 55 54  Rep == SQLITE_UT
5ac0: 46 31 36 29 0d 0a 20 20 20 20 65 54 65 78 74 52  F16)..    eTextR
5ad0: 65 70 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  ep = SQLITE_UTF1
5ae0: 36 4e 41 54 49 56 45 3b 0d 0a 0d 0a 20 20 6e 20  6NATIVE;....  n 
5af0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
5b00: 5f 66 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c 20  _function(psql, 
5b10: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
5b20: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
5b30: 76 55 73 65 72 2c 20 66 75 6e 63 2c 20 66 75 6e  vUser, func, fun
5b40: 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61 6c  cstep, funcfinal
5b50: 29 3b 0d 0a 20 20 69 66 20 28 6e 20 3d 3d 20 53  );..  if (n == S
5b60: 51 4c 49 54 45 5f 4f 4b 29 0d 0a 20 20 7b 0d 0a  QLITE_OK)..  {..
5b70: 20 20 20 20 69 66 20 28 6e 65 65 64 43 6f 6c 6c      if (needColl
5b80: 53 65 71 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  Seq)..    {..   
5b90: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
5ba0: 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
5bb0: 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c 20 7a 46  unction(psql, zF
5bc0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 73 74 72  unctionName, str
5bd0: 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  len(zFunctionNam
5be0: 65 29 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  e), nArg, eTextR
5bf0: 65 70 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 69  ep, 0);..      i
5c00: 66 28 20 70 46 75 6e 63 20 29 0d 0a 20 20 20 20  f( pFunc )..    
5c10: 20 20 7b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f    {..#if SQLITE_
5c20: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
5c30: 3d 20 33 30 30 38 30 30 31 0d 0a 20 20 20 20 20  = 3008001..     
5c40: 20 20 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c     pFunc->funcFl
5c50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 55  ags |= SQLITE_FU
5c60: 4e 43 5f 4e 45 45 44 43 4f 4c 4c 3b 0d 0a 23 65  NC_NEEDCOLL;..#e
5c70: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 70 46 75  lse..        pFu
5c80: 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  nc->flags |= SQL
5c90: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
5ca0: 4c 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20  L;..#endif..    
5cb0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
5cc0: 0a 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a  ...  return n;..
5cd0: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
5ce0: 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69  void WINAPI sqli
5cf0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
5d00: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
5d10: 5f 76 61 6c 75 65 20 2a 70 76 61 6c 2c 20 64 6f  _value *pval, do
5d20: 75 62 6c 65 20 2a 76 61 6c 29 0d 0a 7b 0d 0a 20  uble *val)..{.. 
5d30: 20 69 66 20 28 21 76 61 6c 29 20 72 65 74 75 72   if (!val) retur
5d40: 6e 3b 0d 0a 20 20 2a 76 61 6c 20 3d 20 73 71 6c  n;..  *val = sql
5d50: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
5d60: 65 28 70 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53  e(pval);..}....S
5d70: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 57  QLITE_API void W
5d80: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76 61  INAPI sqlite3_va
5d90: 6c 75 65 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f  lue_int64_intero
5da0: 70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  p(sqlite3_value 
5db0: 2a 70 76 61 6c 2c 20 73 71 6c 69 74 65 5f 69 6e  *pval, sqlite_in
5dc0: 74 36 34 20 2a 76 61 6c 29 0d 0a 7b 0d 0a 20 20  t64 *val)..{..  
5dd0: 69 66 20 28 21 76 61 6c 29 20 72 65 74 75 72 6e  if (!val) return
5de0: 3b 0d 0a 20 20 2a 76 61 6c 20 3d 20 73 71 6c 69  ;..  *val = sqli
5df0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
5e00: 70 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  pval);..}....SQL
5e10: 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 75 6e  ITE_API const un
5e20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 57 49  signed char * WI
5e30: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76 61 6c  NAPI sqlite3_val
5e40: 75 65 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70 28  ue_text_interop(
5e50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 76  sqlite3_value *v
5e60: 61 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a  al, int *plen)..
5e70: 7b 0d 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  {..  const unsig
5e80: 6e 65 64 20 63 68 61 72 20 2a 70 76 61 6c 20 3d  ned char *pval =
5e90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5ea0: 65 78 74 28 76 61 6c 29 3b 0d 0a 20 20 69 66 20  ext(val);..  if 
5eb0: 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20 3d 20 73  (plen) *plen = s
5ec0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
5ed0: 65 73 28 76 61 6c 29 3b 0d 0a 20 20 72 65 74 75  es(val);..  retu
5ee0: 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53  rn pval;..}....S
5ef0: 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20  QLITE_API const 
5f00: 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73 71  void * WINAPI sq
5f10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5f20: 31 36 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  16_interop(sqlit
5f30: 65 33 5f 76 61 6c 75 65 20 2a 76 61 6c 2c 20 69  e3_value *val, i
5f40: 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20  nt *plen)..{..  
5f50: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c  const void *pval
5f60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f70: 5f 74 65 78 74 31 36 28 76 61 6c 29 3b 0d 0a 20  _text16(val);.. 
5f80: 20 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e   if (plen) *plen
5f90: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5fa0: 5f 62 79 74 65 73 31 36 28 76 61 6c 29 3b 0d 0a  _bytes16(val);..
5fb0: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a    return pval;..
5fc0: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
5fd0: 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69  void WINAPI sqli
5fe0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
5ff0: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
6000: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 63 74 78 2c  3_context *pctx,
6010: 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29 0d 0a 7b   double *val)..{
6020: 0d 0a 20 20 69 66 20 28 21 76 61 6c 29 20 72 65  ..  if (!val) re
6030: 74 75 72 6e 3b 0d 0a 20 20 73 71 6c 69 74 65 33  turn;..  sqlite3
6040: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70  _result_double(p
6050: 63 74 78 2c 20 2a 76 61 6c 29 3b 0d 0a 7d 0d 0a  ctx, *val);..}..
6060: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69  ..SQLITE_API voi
6070: 64 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  d WINAPI sqlite3
6080: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 5f 69 6e  _result_int64_in
6090: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 63 6f  terop(sqlite3_co
60a0: 6e 74 65 78 74 20 2a 70 63 74 78 2c 20 73 71 6c  ntext *pctx, sql
60b0: 69 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0d  ite_int64 *val).
60c0: 0a 7b 0d 0a 20 20 69 66 20 28 21 76 61 6c 29 20  .{..  if (!val) 
60d0: 72 65 74 75 72 6e 3b 0d 0a 20 20 73 71 6c 69 74  return;..  sqlit
60e0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
60f0: 70 63 74 78 2c 20 2a 76 61 6c 29 3b 0d 0a 7d 0d  pctx, *val);..}.
6100: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e  ...SQLITE_API in
6110: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
6120: 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d  _context_collcom
6130: 70 61 72 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  pare_interop(sql
6140: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
6150: 78 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  x, const void *p
6160: 31 2c 20 69 6e 74 20 70 31 6c 65 6e 2c 20 63 6f  1, int p1len, co
6170: 6e 73 74 20 76 6f 69 64 20 2a 70 32 2c 20 69 6e  nst void *p2, in
6180: 74 20 70 32 6c 65 6e 29 0d 0a 7b 0d 0a 23 69 66  t p2len)..{..#if
6190: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
61a0: 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30  NUMBER >= 300800
61b0: 37 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  7..  CollSeq *pC
61c0: 6f 6c 6c 20 3d 20 63 74 78 20 3f 20 73 71 6c 69  oll = ctx ? sqli
61d0: 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65  te3GetFuncCollSe
61e0: 71 28 63 74 78 29 20 3a 20 30 3b 0d 0a 23 65 6c  q(ctx) : 0;..#el
61f0: 73 65 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  se..  CollSeq *p
6200: 43 6f 6c 6c 20 3d 20 63 74 78 20 3f 20 63 74 78  Coll = ctx ? ctx
6210: 2d 3e 70 43 6f 6c 6c 20 3a 20 30 3b 0d 0a 23 65  ->pColl : 0;..#e
6220: 6e 64 69 66 0d 0a 20 20 69 66 20 28 21 63 74 78  ndif..  if (!ctx
6230: 20 7c 7c 20 21 63 74 78 2d 3e 70 46 75 6e 63 29   || !ctx->pFunc)
6240: 20 72 65 74 75 72 6e 20 34 3b 20 2f 2a 20 45 52   return 4; /* ER
6250: 52 4f 52 20 2a 2f 0d 0a 20 20 69 66 20 28 21 70  ROR */..  if (!p
6260: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
6270: 78 43 6d 70 29 20 72 65 74 75 72 6e 20 33 3b 20  xCmp) return 3; 
6280: 2f 2a 20 45 52 52 4f 52 20 2a 2f 0d 0a 23 69 66  /* ERROR */..#if
6290: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
62a0: 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30  NUMBER >= 300800
62b0: 31 0d 0a 20 20 69 66 20 28 28 63 74 78 2d 3e 70  1..  if ((ctx->p
62c0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
62d0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
62e0: 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20 72 65  EDCOLL) == 0) re
62f0: 74 75 72 6e 20 32 3b 20 2f 2a 20 45 52 52 4f 52  turn 2; /* ERROR
6300: 20 2a 2f 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66   */..#else..  if
6310: 20 28 28 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66   ((ctx->pFunc->f
6320: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
6330: 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d 20  NC_NEEDCOLL) == 
6340: 30 29 20 72 65 74 75 72 6e 20 32 3b 20 2f 2a 20  0) return 2; /* 
6350: 45 52 52 4f 52 20 2a 2f 0d 0a 23 65 6e 64 69 66  ERROR */..#endif
6360: 0d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
6370: 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
6380: 73 65 72 2c 20 70 31 6c 65 6e 2c 20 70 31 2c 20  ser, p1len, p1, 
6390: 70 32 6c 65 6e 2c 20 70 32 29 3b 0d 0a 7d 0d 0a  p2len, p2);..}..
63a0: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e  ..SQLITE_API con
63b0: 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49  st char * WINAPI
63c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
63d0: 5f 63 6f 6c 6c 73 65 71 5f 69 6e 74 65 72 6f 70  _collseq_interop
63e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
63f0: 20 2a 63 74 78 2c 20 69 6e 74 20 2a 70 74 79 70   *ctx, int *ptyp
6400: 65 2c 20 69 6e 74 20 2a 65 6e 63 2c 20 69 6e 74  e, int *enc, int
6410: 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 23 69 66 20   *plen)..{..#if 
6420: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
6430: 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30 37  UMBER >= 3008007
6440: 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ..  CollSeq *pCo
6450: 6c 6c 20 3d 20 63 74 78 20 3f 20 73 71 6c 69 74  ll = ctx ? sqlit
6460: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
6470: 28 63 74 78 29 20 3a 20 30 3b 0d 0a 23 65 6c 73  (ctx) : 0;..#els
6480: 65 0d 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  e..  CollSeq *pC
6490: 6f 6c 6c 20 3d 20 63 74 78 20 3f 20 63 74 78 2d  oll = ctx ? ctx-
64a0: 3e 70 43 6f 6c 6c 20 3a 20 30 3b 0d 0a 23 65 6e  >pColl : 0;..#en
64b0: 64 69 66 0d 0a 20 20 69 66 20 28 70 74 79 70 65  dif..  if (ptype
64c0: 29 20 2a 70 74 79 70 65 20 3d 20 30 3b 0d 0a 20  ) *ptype = 0;.. 
64d0: 20 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e   if (plen) *plen
64e0: 20 3d 20 30 3b 0d 0a 20 20 69 66 20 28 65 6e 63   = 0;..  if (enc
64f0: 29 20 2a 65 6e 63 20 3d 20 30 3b 0d 0a 0d 0a 20  ) *enc = 0;.... 
6500: 20 69 66 20 28 21 63 74 78 20 7c 7c 20 21 63 74   if (!ctx || !ct
6510: 78 2d 3e 70 46 75 6e 63 29 20 72 65 74 75 72 6e  x->pFunc) return
6520: 20 4e 55 4c 4c 3b 0d 0a 23 69 66 20 53 51 4c 49   NULL;..#if SQLI
6530: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
6540: 52 20 3e 3d 20 33 30 30 38 30 30 31 0d 0a 20 20  R >= 3008001..  
6550: 69 66 20 28 28 63 74 78 2d 3e 70 46 75 6e 63 2d  if ((ctx->pFunc-
6560: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
6570: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
6580: 4c 29 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 20  L) == 0) return 
6590: 4e 55 4c 4c 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  NULL;..#else..  
65a0: 69 66 20 28 28 63 74 78 2d 3e 70 46 75 6e 63 2d  if ((ctx->pFunc-
65b0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
65c0: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 20 3d  FUNC_NEEDCOLL) =
65d0: 3d 20 30 29 20 72 65 74 75 72 6e 20 4e 55 4c 4c  = 0) return NULL
65e0: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 69  ;..#endif....  i
65f0: 66 20 28 70 43 6f 6c 6c 29 0d 0a 20 20 7b 0d 0a  f (pColl)..  {..
6600: 20 20 20 20 69 66 20 28 65 6e 63 29 20 2a 65 6e      if (enc) *en
6610: 63 20 3d 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3b 0d  c = pColl->enc;.
6620: 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53  .#if SQLITE_VERS
6630: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 33 30 30  ION_NUMBER < 300
6640: 37 30 31 30 0d 0a 20 20 20 20 69 66 20 28 70 74  7010..    if (pt
6650: 79 70 65 29 20 2a 70 74 79 70 65 20 3d 20 70 43  ype) *ptype = pC
6660: 6f 6c 6c 2d 3e 74 79 70 65 3b 0d 0a 23 65 6e 64  oll->type;..#end
6670: 69 66 0d 0a 20 20 20 20 69 66 20 28 70 6c 65 6e  if..    if (plen
6680: 29 20 2a 70 6c 65 6e 20 3d 20 70 43 6f 6c 6c 2d  ) *plen = pColl-
6690: 3e 7a 4e 61 6d 65 20 3f 20 73 74 72 6c 65 6e 28  >zName ? strlen(
66a0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 3a 20  pColl->zName) : 
66b0: 30 3b 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e  0;....    return
66c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0d 0a   pColl->zName;..
66d0: 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 4e 55    }..  return NU
66e0: 4c 4c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  LL;..}....SQLITE
66f0: 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 61 72 20  _API const char 
6700: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
6710: 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
6720: 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71  _name_interop(sq
6730: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
6740: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
6750: 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e  *plen)..{..  con
6760: 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20  st char *pval = 
6770: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
6780: 61 74 61 62 61 73 65 5f 6e 61 6d 65 28 73 74 6d  atabase_name(stm
6790: 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 69 66 20  t, iCol);..  if 
67a0: 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20 3d 20 70  (plen) *plen = p
67b0: 76 61 6c 20 3f 20 73 74 72 6c 65 6e 28 70 76 61  val ? strlen(pva
67c0: 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72  l) : 0;..  retur
67d0: 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51  n pval;..}....SQ
67e0: 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 76  LITE_API const v
67f0: 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c  oid * WINAPI sql
6800: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
6810: 62 61 73 65 5f 6e 61 6d 65 31 36 5f 69 6e 74 65  base_name16_inte
6820: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
6830: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
6840: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d  , int *plen)..{.
6850: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
6860: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
6870: 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
6880: 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29  me16(stmt, iCol)
6890: 3b 0d 0a 20 20 69 66 20 28 70 6c 65 6e 29 20 2a  ;..  if (plen) *
68a0: 70 6c 65 6e 20 3d 20 70 76 61 6c 20 3f 20 77 63  plen = pval ? wc
68b0: 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29  slen((wchar_t *)
68c0: 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77  pval) * sizeof(w
68d0: 63 68 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20  char_t) : 0;..  
68e0: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d  return pval;..}.
68f0: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f  ...SQLITE_API co
6900: 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50  nst char * WINAP
6910: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
6920: 5f 74 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e 74 65  _table_name_inte
6930: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
6940: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
6950: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d  , int *plen)..{.
6960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
6970: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
6980: 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28  lumn_table_name(
6990: 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20  stmt, iCol);..  
69a0: 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20  if (plen) *plen 
69b0: 3d 20 70 76 61 6c 20 3f 20 73 74 72 6c 65 6e 28  = pval ? strlen(
69c0: 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65  pval) : 0;..  re
69d0: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
69e0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73  .SQLITE_API cons
69f0: 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20  t void * WINAPI 
6a00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
6a10: 61 62 6c 65 5f 6e 61 6d 65 31 36 5f 69 6e 74 65  able_name16_inte
6a20: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
6a30: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
6a40: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d  , int *plen)..{.
6a50: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
6a60: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
6a70: 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
6a80: 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a  6(stmt, iCol);..
6a90: 20 20 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65    if (plen) *ple
6aa0: 6e 20 3d 20 70 76 61 6c 20 3f 20 77 63 73 6c 65  n = pval ? wcsle
6ab0: 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76 61  n((wchar_t *)pva
6ac0: 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61  l) * sizeof(wcha
6ad0: 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74  r_t) : 0;..  ret
6ae0: 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a  urn pval;..}....
6af0: 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74  SQLITE_API const
6b00: 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73   char * WINAPI s
6b10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
6b20: 69 67 69 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  igin_name_intero
6b30: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
6b40: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
6b50: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
6b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61   const char *pva
6b70: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
6b80: 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 73  mn_origin_name(s
6b90: 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 69  tmt, iCol);..  i
6ba0: 66 20 28 70 6c 65 6e 29 20 2a 70 6c 65 6e 20 3d  f (plen) *plen =
6bb0: 20 70 76 61 6c 20 3f 20 73 74 72 6c 65 6e 28 70   pval ? strlen(p
6bc0: 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74  val) : 0;..  ret
6bd0: 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a  urn pval;..}....
6be0: 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74  SQLITE_API const
6bf0: 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73   void * WINAPI s
6c00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
6c10: 69 67 69 6e 5f 6e 61 6d 65 31 36 5f 69 6e 74 65  igin_name16_inte
6c20: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
6c30: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
6c40: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d  , int *plen)..{.
6c50: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
6c60: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
6c70: 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
6c80: 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d  16(stmt, iCol);.
6c90: 0a 20 20 69 66 20 28 70 6c 65 6e 29 20 2a 70 6c  .  if (plen) *pl
6ca0: 65 6e 20 3d 20 70 76 61 6c 20 3f 20 77 63 73 6c  en = pval ? wcsl
6cb0: 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76  en((wchar_t *)pv
6cc0: 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68  al) * sizeof(wch
6cd0: 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65  ar_t) : 0;..  re
6ce0: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
6cf0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20  .SQLITE_API int 
6d00: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 74  WINAPI sqlite3_t
6d10: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
6d20: 64 61 74 61 5f 69 6e 74 65 72 6f 70 28 73 71 6c  data_interop(sql
6d30: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
6d40: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 63  char *zDbName, c
6d50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
6d60: 65 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  eName, const cha
6d70: 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20  r *zColumnName, 
6d80: 63 68 61 72 20 2a 2a 70 7a 44 61 74 61 54 79 70  char **pzDataTyp
6d90: 65 2c 20 63 68 61 72 20 2a 2a 70 7a 43 6f 6c 6c  e, char **pzColl
6da0: 53 65 71 2c 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  Seq, int *pNotNu
6db0: 6c 6c 2c 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  ll, int *pPrimar
6dc0: 79 4b 65 79 2c 20 69 6e 74 20 2a 70 41 75 74 6f  yKey, int *pAuto
6dd0: 69 6e 63 2c 20 69 6e 74 20 2a 70 64 74 4c 65 6e  inc, int *pdtLen
6de0: 2c 20 69 6e 74 20 2a 70 63 73 4c 65 6e 29 0d 0a  , int *pcsLen)..
6df0: 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 20  {..  int n;.... 
6e00: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62   n = sqlite3_tab
6e10: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
6e20: 74 61 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ta(db, zDbName, 
6e30: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6f 6c  zTableName, zCol
6e40: 75 6d 6e 4e 61 6d 65 2c 20 70 7a 44 61 74 61 54  umnName, pzDataT
6e50: 79 70 65 2c 20 70 7a 43 6f 6c 6c 53 65 71 2c 20  ype, pzCollSeq, 
6e60: 70 4e 6f 74 4e 75 6c 6c 2c 20 70 50 72 69 6d 61  pNotNull, pPrima
6e70: 72 79 4b 65 79 2c 20 70 41 75 74 6f 69 6e 63 29  ryKey, pAutoinc)
6e80: 3b 0d 0a 0d 0a 20 20 69 66 20 28 70 64 74 4c 65  ;....  if (pdtLe
6e90: 6e 29 20 2a 70 64 74 4c 65 6e 20 3d 20 28 70 7a  n) *pdtLen = (pz
6ea0: 44 61 74 61 54 79 70 65 20 26 26 20 2a 70 7a 44  DataType && *pzD
6eb0: 61 74 61 54 79 70 65 29 20 3f 20 73 74 72 6c 65  ataType) ? strle
6ec0: 6e 28 2a 70 7a 44 61 74 61 54 79 70 65 29 20 3a  n(*pzDataType) :
6ed0: 20 30 3b 0d 0a 20 20 69 66 20 28 70 63 73 4c 65   0;..  if (pcsLe
6ee0: 6e 29 20 2a 70 63 73 4c 65 6e 20 3d 20 28 70 7a  n) *pcsLen = (pz
6ef0: 43 6f 6c 6c 53 65 71 20 26 26 20 2a 70 7a 43 6f  CollSeq && *pzCo
6f00: 6c 6c 53 65 71 29 20 3f 20 73 74 72 6c 65 6e 28  llSeq) ? strlen(
6f10: 2a 70 7a 43 6f 6c 6c 53 65 71 29 20 3a 20 30 3b  *pzCollSeq) : 0;
6f20: 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d  ....  return n;.
6f30: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  .}....SQLITE_API
6f40: 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69   int WINAPI sqli
6f50: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6c 75 6d 6e  te3_index_column
6f60: 5f 69 6e 66 6f 5f 69 6e 74 65 72 6f 70 28 73 71  _info_interop(sq
6f70: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
6f80: 20 63 68 61 72 20 2a 7a 44 62 2c 20 63 6f 6e 73   char *zDb, cons
6f90: 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 4e 61  t char *zIndexNa
6fa0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
6fb0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 6e 74  zColumnName, int
6fc0: 20 2a 73 6f 72 74 4f 72 64 65 72 2c 20 69 6e 74   *sortOrder, int
6fd0: 20 2a 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72 20   *onError, char 
6fe0: 2a 2a 70 7a 43 6f 6c 6c 2c 20 69 6e 74 20 2a 70  **pzColl, int *p
6ff0: 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 49 6e 64 65 78  len)..{..  Index
7000: 20 2a 70 49 64 78 3b 0d 0a 20 20 54 61 62 6c 65   *pIdx;..  Table
7010: 20 2a 70 54 61 62 3b 0d 0a 20 20 69 6e 74 20 6e   *pTab;..  int n
7020: 3b 0d 0a 0d 0a 20 20 69 66 20 28 21 64 62 29 20  ;....  if (!db) 
7030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7040: 52 4f 52 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f  ROR;..  sqlite3_
7050: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7060: 6d 75 74 65 78 29 3b 0d 0a 20 20 73 71 6c 69 74  mutex);..  sqlit
7070: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
7080: 64 62 29 3b 0d 0a 0d 0a 20 20 70 49 64 78 20 3d  db);....  pIdx =
7090: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
70a0: 78 28 64 62 2c 20 7a 49 6e 64 65 78 4e 61 6d 65  x(db, zIndexName
70b0: 2c 20 7a 44 62 29 3b 0d 0a 0d 0a 20 20 73 71 6c  , zDb);....  sql
70c0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
70d0: 6c 28 64 62 29 3b 0d 0a 20 20 73 71 6c 69 74 65  l(db);..  sqlite
70e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
70f0: 2d 3e 6d 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 69  ->mutex);....  i
7100: 66 20 28 21 70 49 64 78 29 20 72 65 74 75 72 6e  f (!pIdx) return
7110: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
7120: 0d 0a 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d  ..  pTab = pIdx-
7130: 3e 70 54 61 62 6c 65 3b 0d 0a 20 20 66 6f 72 20  >pTable;..  for 
7140: 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70 49 64 78  (n = 0; n < pIdx
7150: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 2b 2b 29 0d  ->nColumn; n++).
7160: 0a 20 20 7b 0d 0a 20 20 20 20 69 6e 74 20 63 6e  .  {..    int cn
7170: 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  um = pIdx->aiCol
7180: 75 6d 6e 5b 6e 5d 3b 0d 0a 20 20 20 20 69 66 20  umn[n];..    if 
7190: 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  (sqlite3StrICmp(
71a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
71b0: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  .zName, zColumnN
71c0: 61 6d 65 29 20 3d 3d 20 30 29 0d 0a 20 20 20 20  ame) == 0)..    
71d0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 20 73 6f  {..      if ( so
71e0: 72 74 4f 72 64 65 72 20 29 20 2a 73 6f 72 74 4f  rtOrder ) *sortO
71f0: 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
7200: 72 74 4f 72 64 65 72 5b 6e 5d 3b 0d 0a 20 20 20  rtOrder[n];..   
7210: 20 20 20 69 66 20 28 20 70 7a 43 6f 6c 6c 20 29     if ( pzColl )
7220: 20 2a 70 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d   *pzColl = pIdx-
7230: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 3b 0d 0a 20 20 20  >azColl[n];..   
7240: 20 20 20 69 66 20 28 20 70 6c 65 6e 20 29 20 2a     if ( plen ) *
7250: 70 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 2a 70  plen = strlen(*p
7260: 7a 43 6f 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 69  zColl);..      i
7270: 66 20 28 20 6f 6e 45 72 72 6f 72 20 29 20 2a 6f  f ( onError ) *o
7280: 6e 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f  nError = pIdx->o
7290: 6e 45 72 72 6f 72 3b 0d 0a 0d 0a 20 20 20 20 20  nError;....     
72a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
72b0: 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  K;..    }..  }..
72c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
72d0: 45 52 52 4f 52 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  ERROR;..}....SQL
72e0: 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41  ITE_API int WINA
72f0: 50 49 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  PI sqlite3_table
7300: 5f 63 75 72 73 6f 72 5f 69 6e 74 65 72 6f 70 28  _cursor_interop(
7310: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 73  sqlite3_stmt *ps
7320: 74 6d 74 2c 20 69 6e 74 20 69 44 62 2c 20 50 67  tmt, int iDb, Pg
7330: 6e 6f 20 74 61 62 6c 65 52 6f 6f 74 50 61 67 65  no tableRootPage
7340: 29 0d 0a 7b 0d 0a 20 20 56 64 62 65 20 2a 70 20  )..{..  Vdbe *p 
7350: 3d 20 28 56 64 62 65 20 2a 29 70 73 74 6d 74 3b  = (Vdbe *)pstmt;
7360: 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ..  sqlite3 *db 
7370: 3d 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20  = (p == NULL) ? 
7380: 4e 55 4c 4c 20 3a 20 70 2d 3e 64 62 3b 0d 0a 20  NULL : p->db;.. 
7390: 20 69 6e 74 20 6e 3b 0d 0a 20 20 69 6e 74 20 72   int n;..  int r
73a0: 65 74 20 3d 20 2d 31 3b 20 2f 2a 20 4e 4f 54 20  et = -1; /* NOT 
73b0: 46 4f 55 4e 44 20 2a 2f 0d 0a 0d 0a 20 20 69 66  FOUND */....  if
73c0: 20 28 21 70 20 7c 7c 20 21 64 62 29 20 72 65 74   (!p || !db) ret
73d0: 75 72 6e 20 72 65 74 3b 0d 0a 20 20 73 71 6c 69  urn ret;..  sqli
73e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
73f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 66  db->mutex);..  f
7400: 6f 72 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70  or (n = 0; n < p
7410: 2d 3e 6e 43 75 72 73 6f 72 20 26 26 20 70 2d 3e  ->nCursor && p->
7420: 61 70 43 73 72 5b 6e 5d 20 21 3d 20 4e 55 4c 4c  apCsr[n] != NULL
7430: 3b 20 6e 2b 2b 29 0d 0a 20 20 7b 0d 0a 20 20 20  ; n++)..  {..   
7440: 20 69 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d   if (p->apCsr[n]
7450: 2d 3e 69 73 54 61 62 6c 65 20 3d 3d 20 46 41 4c  ->isTable == FAL
7460: 53 45 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20  SE) continue;.. 
7470: 20 20 20 69 66 20 28 70 2d 3e 61 70 43 73 72 5b     if (p->apCsr[
7480: 6e 5d 2d 3e 69 44 62 20 21 3d 20 69 44 62 29 20  n]->iDb != iDb) 
7490: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69  continue;..    i
74a0: 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d 3e  f (p->apCsr[n]->
74b0: 70 43 75 72 73 6f 72 2d 3e 70 67 6e 6f 52 6f 6f  pCursor->pgnoRoo
74c0: 74 20 3d 3d 20 74 61 62 6c 65 52 6f 6f 74 50 61  t == tableRootPa
74d0: 67 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ge)..    {..    
74e0: 20 20 72 65 74 20 3d 20 6e 3b 0d 0a 20 20 20 20    ret = n;..    
74f0: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d    break;..    }.
7500: 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
7510: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7520: 6d 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 72 65 74  mutex);....  ret
7530: 75 72 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 53  urn ret;..}....S
7540: 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49  QLITE_API int WI
7550: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 75 72  NAPI sqlite3_cur
7560: 73 6f 72 5f 72 6f 77 69 64 5f 69 6e 74 65 72 6f  sor_rowid_intero
7570: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
7580: 70 73 74 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f  pstmt, int curso
7590: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
75a0: 2a 70 72 6f 77 69 64 29 0d 0a 7b 0d 0a 20 20 56  *prowid)..{..  V
75b0: 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a  dbe *p = (Vdbe *
75c0: 29 70 73 74 6d 74 3b 0d 0a 20 20 73 71 6c 69 74  )pstmt;..  sqlit
75d0: 65 33 20 2a 64 62 20 3d 20 28 70 20 3d 3d 20 4e  e3 *db = (p == N
75e0: 55 4c 4c 29 20 3f 20 4e 55 4c 4c 20 3a 20 70 2d  ULL) ? NULL : p-
75f0: 3e 64 62 3b 0d 0a 20 20 56 64 62 65 43 75 72 73  >db;..  VdbeCurs
7600: 6f 72 20 2a 70 43 3b 0d 0a 20 20 69 6e 74 20 72  or *pC;..  int r
7610: 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d  et = SQLITE_OK;.
7620: 0a 0d 0a 20 20 69 66 20 28 21 70 20 7c 7c 20 21  ...  if (!p || !
7630: 64 62 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  db) return SQLIT
7640: 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 73 71 6c 69  E_ERROR;..  sqli
7650: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7660: 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 77  db->mutex);..  w
7670: 68 69 6c 65 20 28 31 29 0d 0a 20 20 7b 0d 0a 20  hile (1)..  {.. 
7680: 20 20 20 69 66 20 28 63 75 72 73 6f 72 20 3c 20     if (cursor < 
7690: 30 20 7c 7c 20 63 75 72 73 6f 72 20 3e 3d 20 70  0 || cursor >= p
76a0: 2d 3e 6e 43 75 72 73 6f 72 29 0d 0a 20 20 20 20  ->nCursor)..    
76b0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 20 3d 20 53  {..      ret = S
76c0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
76d0: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
76e0: 7d 0d 0a 20 20 20 20 69 66 20 28 70 2d 3e 61 70  }..    if (p->ap
76f0: 43 73 72 5b 63 75 72 73 6f 72 5d 20 3d 3d 20 4e  Csr[cursor] == N
7700: 55 4c 4c 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ULL)..    {..   
7710: 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f     ret = SQLITE_
7720: 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 62 72  ERROR;..      br
7730: 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  eak;..    }.... 
7740: 20 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72     pC = p->apCsr
7750: 5b 63 75 72 73 6f 72 5d 3b 0d 0a 0d 0a 20 20 20  [cursor];....   
7760: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64   ret = sqlite3Vd
7770: 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70  beCursorMoveto(p
7780: 43 29 3b 0d 0a 20 20 20 20 69 66 28 72 65 74 29  C);..    if(ret)
7790: 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a  ..      break;..
77a0: 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52  ..#if SQLITE_VER
77b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 33 30  SION_NUMBER < 30
77c0: 30 38 30 30 37 0d 0a 20 20 20 20 69 66 28 70 43  08007..    if(pC
77d0: 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 29 0d  ->rowidIsValid).
77e0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66  .    {..      if
77f0: 20 28 70 72 6f 77 69 64 29 20 2a 70 72 6f 77 69   (prowid) *prowi
7800: 64 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69  d = pC->lastRowi
7810: 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 65  d;..    }..    e
7820: 6c 73 65 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20  lse..#endif..   
7830: 20 69 66 28 70 43 2d 3e 70 73 65 75 64 6f 54 61   if(pC->pseudoTa
7840: 62 6c 65 52 65 67 20 3e 20 30 29 0d 0a 20 20 20  bleReg > 0)..   
7850: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 20 3d 20   {..      ret = 
7860: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
7870: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
7880: 20 7d 0d 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
7890: 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70  pC->nullRow || p
78a0: 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 29 0d 0a  C->pCursor==0)..
78b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
78c0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
78d0: 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a  ..      break;..
78e0: 20 20 20 20 7d 0d 0a 20 20 20 20 65 6c 73 65 0d      }..    else.
78f0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66  .    {..      if
7900: 20 28 70 43 2d 3e 70 43 75 72 73 6f 72 20 3d 3d   (pC->pCursor ==
7910: 20 4e 55 4c 4c 29 0d 0a 20 20 20 20 20 20 7b 0d   NULL)..      {.
7920: 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 53  .        ret = S
7930: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20  QLITE_ERROR;..  
7940: 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
7950: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 71 6c      }..      sql
7960: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
7970: 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70 72  (pC->pCursor, pr
7980: 6f 77 69 64 29 3b 0d 0a 20 20 20 20 20 20 69 66  owid);..      if
7990: 20 28 70 72 6f 77 69 64 29 20 2a 70 72 6f 77 69   (prowid) *prowi
79a0: 64 20 3d 20 2a 70 72 6f 77 69 64 3b 0d 0a 20 20  d = *prowid;..  
79b0: 20 20 7d 0d 0a 20 20 20 20 62 72 65 61 6b 3b 0d    }..    break;.
79c0: 0a 20 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
79d0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
79e0: 6d 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 72 65 74  mutex);....  ret
79f0: 75 72 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 23 65 6e  urn ret;..}..#en
7a00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
7a10: 5f 57 49 4e 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a  _WIN */..../****
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a  *********/..../*
7a70: 0d 0a 2a 2a 20 54 68 65 20 49 4e 54 45 52 4f 50  ..** The INTEROP
7a80: 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20  _TEST_EXTENSION 
7a90: 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61 74  block must be at
7aa0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
7ab0: 20 73 6f 75 72 63 65 20 66 69 6c 65 0d 0a 2a 2a   source file..**
7ac0: 20 62 65 63 61 75 73 65 20 69 74 20 69 6e 63 6c   because it incl
7ad0: 75 64 65 73 20 74 68 65 20 22 73 71 6c 69 74 65  udes the "sqlite
7ae0: 33 65 78 74 2e 68 22 20 66 69 6c 65 2c 20 77 68  3ext.h" file, wh
7af0: 69 63 68 20 64 65 66 69 6e 65 73 20 74 68 65 20  ich defines the 
7b00: 73 71 6c 69 74 65 33 0d 0a 2a 2a 20 70 75 62 6c  sqlite3..** publ
7b10: 69 63 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  ic API function 
7b20: 6e 61 6d 65 73 20 74 6f 20 62 65 20 6d 61 63 72  names to be macr
7b30: 6f 73 20 61 6e 64 20 74 68 61 74 20 77 6f 75 6c  os and that woul
7b40: 64 20 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  d cause the code
7b50: 0d 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  ..** above this 
7b60: 70 6f 69 6e 74 20 74 6f 20 6d 61 6c 66 75 6e 63  point to malfunc
7b70: 74 69 6f 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64  tion...*/..#if d
7b80: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 54  efined(INTEROP_T
7b90: 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 29 0d 0a  EST_EXTENSION)..
7ba0: 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 63 6f 72  #include "../cor
7bb0: 65 2f 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0d  e/sqlite3ext.h".
7bc0: 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
7bd0: 4e 5f 49 4e 49 54 31 0d 0a 0d 0a 2f 2a 0d 0a 2a  N_INIT1..../*..*
7be0: 2a 20 54 68 65 20 69 6e 74 65 72 6f 70 54 65 73  * The interopTes
7bf0: 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  t() SQL function
7c00: 20 72 65 74 75 72 6e 73 20 69 74 73 20 66 69 72   returns its fir
7c10: 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 72  st argument or r
7c20: 61 69 73 65 73 20 61 6e 0d 0a 2a 2a 20 65 72 72  aises an..** err
7c30: 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20  or if there are 
7c40: 6e 6f 74 20 65 6e 6f 75 67 68 20 61 72 67 75 6d  not enough argum
7c50: 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54  ents...*/..SQLIT
7c60: 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64 20 69  E_PRIVATE void i
7c70: 6e 74 65 72 6f 70 54 65 73 74 46 75 6e 63 28 0d  nteropTestFunc(.
7c80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7c90: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20  xt *context,..  
7ca0: 69 6e 74 20 61 72 67 63 2c 0d 0a 20 20 73 71 6c  int argc,..  sql
7cb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7cc0: 76 0d 0a 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 75  v..){..  const u
7cd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
7ce0: 0d 0a 20 20 69 66 28 20 61 72 67 63 21 3d 31 20  ..  if( argc!=1 
7cf0: 29 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){..    sqlite3_
7d00: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
7d10: 74 65 78 74 2c 20 22 6e 65 65 64 20 65 78 61 63  text, "need exac
7d20: 74 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  tly one argument
7d30: 22 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 72 65 74  ", -1);..    ret
7d40: 75 72 6e 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 20 3d  urn;..  }..  z =
7d50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7d60: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0d 0a 20  ext(argv[0]);.. 
7d70: 20 69 66 28 20 7a 20 29 7b 0d 0a 20 20 20 20 73   if( z ){..    s
7d80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7d90: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
7da0: 72 2a 29 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  r*)z, -1, SQLITE
7db0: 5f 53 54 41 54 49 43 29 3b 0d 0a 20 20 7d 65 6c  _STATIC);..  }el
7dc0: 73 65 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33  se{..    sqlite3
7dd0: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
7de0: 74 65 78 74 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a  text);..  }..}..
7df0: 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 74  ../*..** The int
7e00: 65 72 6f 70 53 6c 65 65 70 28 29 20 53 51 4c 20  eropSleep() SQL 
7e10: 66 75 6e 63 74 69 6f 6e 20 77 61 69 74 73 20 74  function waits t
7e20: 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  he specified num
7e30: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
7e40: 6e 64 73 0d 0a 2a 2a 20 6f 72 20 72 61 69 73 65  nds..** or raise
7e50: 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
7e60: 65 72 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75  ere are not enou
7e70: 67 68 20 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a  gh arguments...*
7e80: 2f 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54  /..SQLITE_PRIVAT
7e90: 45 20 76 6f 69 64 20 69 6e 74 65 72 6f 70 53 6c  E void interopSl
7ea0: 65 65 70 46 75 6e 63 28 0d 0a 20 20 73 71 6c 69  eepFunc(..  sqli
7eb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7ec0: 74 65 78 74 2c 0d 0a 20 20 69 6e 74 20 61 72 67  text,..  int arg
7ed0: 63 2c 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c,..  sqlite3_va
7ee0: 6c 75 65 20 2a 2a 61 72 67 76 0d 0a 29 7b 0d 0a  lue **argv..){..
7ef0: 20 20 69 6e 74 20 6d 3b 0d 0a 20 20 69 66 28 20    int m;..  if( 
7f00: 61 72 67 63 21 3d 31 20 29 7b 0d 0a 20 20 20 20  argc!=1 ){..    
7f10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7f20: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e  rror(context, "n
7f30: 65 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  eed exactly one 
7f40: 61 72 67 75 6d 65 6e 74 22 2c 20 2d 31 29 3b 0d  argument", -1);.
7f50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20  .    return;..  
7f60: 7d 0d 0a 20 20 6d 20 3d 20 73 71 6c 69 74 65 33  }..  m = sqlite3
7f70: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7f80: 30 5d 29 3b 0d 0a 23 69 66 20 53 51 4c 49 54 45  0]);..#if SQLITE
7f90: 5f 4f 53 5f 57 49 4e 43 45 0d 0a 20 20 53 6c 65  _OS_WINCE..  Sle
7fa0: 65 70 28 6d 29 3b 0d 0a 20 20 73 71 6c 69 74 65  ep(m);..  sqlite
7fb0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7fc0: 74 65 78 74 2c 20 57 41 49 54 5f 4f 42 4a 45 43  text, WAIT_OBJEC
7fd0: 54 5f 30 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  T_0);..#else..  
7fe0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
7ff0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 53 6c 65 65  nt(context, Slee
8000: 70 45 78 28 6d 2c 20 54 52 55 45 29 29 3b 0d 0a  pEx(m, TRUE));..
8010: 23 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 20  #endif..}..../* 
8020: 53 51 4c 69 74 65 20 69 6e 76 6f 6b 65 73 20 74  SQLite invokes t
8030: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
8040: 20 77 68 65 6e 20 69 74 20 6c 6f 61 64 73 20 74   when it loads t
8050: 68 65 20 65 78 74 65 6e 73 69 6f 6e 2e 0d 0a 2a  he extension...*
8060: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 66 75 6e  * Create new fun
8070: 63 74 69 6f 6e 73 2c 20 63 6f 6c 6c 61 74 69 6e  ctions, collatin
8080: 67 20 73 65 71 75 65 6e 63 65 73 2c 20 61 6e 64  g sequences, and
8090: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a   virtual table..
80a0: 2a 2a 20 6d 6f 64 75 6c 65 73 20 68 65 72 65 2e  ** modules here.
80b0: 20 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c    This is usuall
80c0: 79 20 74 68 65 20 6f 6e 6c 79 20 65 78 70 6f 72  y the only expor
80d0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 0d 0a 2a  ted symbol in..*
80e0: 2a 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  * the shared lib
80f0: 72 61 72 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54  rary...*/..SQLIT
8100: 45 5f 41 50 49 20 69 6e 74 20 69 6e 74 65 72 6f  E_API int intero
8110: 70 5f 74 65 73 74 5f 65 78 74 65 6e 73 69 6f 6e  p_test_extension
8120: 5f 69 6e 69 74 28 0d 0a 20 20 73 71 6c 69 74 65  _init(..  sqlite
8130: 33 20 2a 64 62 2c 0d 0a 20 20 63 68 61 72 20 2a  3 *db,..  char *
8140: 2a 70 7a 45 72 72 4d 73 67 2c 0d 0a 20 20 63 6f  *pzErrMsg,..  co
8150: 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
8160: 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0d 0a  routines *pApi..
8170: 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20  ){..  int rc;.. 
8180: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
8190: 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 0d 0a 20  N_INIT2(pApi).. 
81a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
81b0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
81c0: 2c 20 22 69 6e 74 65 72 6f 70 54 65 73 74 22 2c  , "interopTest",
81d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
81e0: 20 30 2c 0d 0a 20 20 20 20 20 20 69 6e 74 65 72   0,..      inter
81f0: 6f 70 54 65 73 74 46 75 6e 63 2c 20 30 2c 20 30  opTestFunc, 0, 0
8200: 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
8210: 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20  LITE_OK ){..    
8220: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
8230: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
8240: 20 22 69 6e 74 65 72 6f 70 53 6c 65 65 70 22 2c   "interopSleep",
8250: 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   1, SQLITE_ANY, 
8260: 30 2c 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 65  0,..        inte
8270: 72 6f 70 53 6c 65 65 70 46 75 6e 63 2c 20 30 2c  ropSleepFunc, 0,
8280: 20 30 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74   0);..  }..  ret
8290: 75 72 6e 20 72 63 3b 0d 0a 7d 0d 0a 23 65 6e 64  urn rc;..}..#end
82a0: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
82b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20 2a 2f 0d  LITE_OS_WIN) */.
82c0: 0a                                               .