System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact caaa3cb274d613913171b504047d5e09b14df1cf:


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 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
0190: 42 4c 45 29 20 26 26 20 53 51 4c 49 54 45 5f 56  BLE) && SQLITE_V
01a0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
01b0: 20 33 30 30 34 30 30 31 0d 0a 23 69 6e 63 6c 75   3004001..#inclu
01c0: 64 65 20 22 2e 2e 2f 65 78 74 2f 76 74 73 68 69  de "../ext/vtshi
01d0: 6d 2e 63 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  m.c"..#endif....
01e0: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45  #if defined(INTE
01f0: 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e  ROP_TOTYPE_EXTEN
0200: 53 49 4f 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20  SION)..#include 
0210: 22 2e 2e 2f 65 78 74 2f 74 6f 74 79 70 65 2e 63  "../ext/totype.c
0220: 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66  "..#endif....#if
0230: 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50   defined(INTEROP
0240: 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f  _REGEXP_EXTENSIO
0250: 4e 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e  N)..#include "..
0260: 2f 65 78 74 2f 72 65 67 65 78 70 2e 63 22 0d 0a  /ext/regexp.c"..
0270: 23 65 6e 64 69 66 0d 0a 0d 0a 23 69 66 20 64 65  #endif....#if de
0280: 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 45 58  fined(INTEROP_EX
0290: 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
02a0: 53 29 0d 0a 23 69 6e 63 6c 75 64 65 20 22 2e 2e  S)..#include "..
02b0: 2f 63 6f 6e 74 72 69 62 2f 65 78 74 65 6e 73 69  /contrib/extensi
02c0: 6f 6e 2d 66 75 6e 63 74 69 6f 6e 73 2e 63 22 0d  on-functions.c".
02d0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 52 65 67 69  .extern int Regi
02e0: 73 74 65 72 45 78 74 65 6e 73 69 6f 6e 46 75 6e  sterExtensionFun
02f0: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
0300: 64 62 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  db);..#endif....
0310: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 53  #ifdef SQLITE_OS
0320: 5f 57 49 4e 0d 0a 23 69 66 20 64 65 66 69 6e 65  _WIN..#if define
0330: 64 28 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 29  d(INTEROP_CODEC)
0340: 0d 0a 23 69 6e 63 6c 75 64 65 20 22 63 72 79 70  ..#include "cryp
0350: 74 2e 63 22 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  t.c"..#endif....
0360: 23 69 6e 63 6c 75 64 65 20 22 69 6e 74 65 72 6f  #include "intero
0370: 70 2e 68 22 0d 0a 0d 0a 23 64 65 66 69 6e 65 20  p.h"....#define 
0380: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 4e 4f  INTEROP_DEBUG_NO
0390: 4e 45 20 20 20 20 20 20 20 20 20 20 20 28 30 78  NE           (0x
03a0: 30 30 30 30 29 0d 0a 23 64 65 66 69 6e 65 20 49  0000)..#define I
03b0: 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 43 4c 4f  NTEROP_DEBUG_CLO
03c0: 53 45 20 20 20 20 20 20 20 20 20 20 28 30 78 30  SE          (0x0
03d0: 30 30 31 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e  001)..#define IN
03e0: 54 45 52 4f 50 5f 44 45 42 55 47 5f 46 49 4e 41  TEROP_DEBUG_FINA
03f0: 4c 49 5a 45 20 20 20 20 20 20 20 28 30 78 30 30  LIZE       (0x00
0400: 30 32 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e 54  02)..#define INT
0410: 45 52 4f 50 5f 44 45 42 55 47 5f 42 41 43 4b 55  EROP_DEBUG_BACKU
0420: 50 5f 46 49 4e 49 53 48 20 20 28 30 78 30 30 30  P_FINISH  (0x000
0430: 34 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e 54 45  4)..#define INTE
0440: 52 4f 50 5f 44 45 42 55 47 5f 4f 50 45 4e 20 20  ROP_DEBUG_OPEN  
0450: 20 20 20 20 20 20 20 20 20 28 30 78 30 30 30 38           (0x0008
0460: 29 0d 0a 23 64 65 66 69 6e 65 20 49 4e 54 45 52  )..#define INTER
0470: 4f 50 5f 44 45 42 55 47 5f 4f 50 45 4e 31 36 20  OP_DEBUG_OPEN16 
0480: 20 20 20 20 20 20 20 20 28 30 78 30 30 31 30 29          (0x0010)
0490: 0d 0a 23 64 65 66 69 6e 65 20 49 4e 54 45 52 4f  ..#define INTERO
04a0: 50 5f 44 45 42 55 47 5f 50 52 45 50 41 52 45 20  P_DEBUG_PREPARE 
04b0: 20 20 20 20 20 20 20 28 30 78 30 30 32 30 29 0d         (0x0020).
04c0: 0a 23 64 65 66 69 6e 65 20 49 4e 54 45 52 4f 50  .#define INTEROP
04d0: 5f 44 45 42 55 47 5f 50 52 45 50 41 52 45 31 36  _DEBUG_PREPARE16
04e0: 20 20 20 20 20 20 28 30 78 30 30 34 30 29 0d 0a        (0x0040)..
04f0: 23 64 65 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f  #define INTEROP_
0500: 44 45 42 55 47 5f 52 45 53 45 54 20 20 20 20 20  DEBUG_RESET     
0510: 20 20 20 20 20 28 30 78 30 30 38 30 29 0d 0a 23       (0x0080)..#
0520: 64 65 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44  define INTEROP_D
0530: 45 42 55 47 5f 43 48 41 4e 47 45 53 20 20 20 20  EBUG_CHANGES    
0540: 20 20 20 20 28 30 78 30 31 30 30 29 0d 0a 23 64      (0x0100)..#d
0550: 65 66 69 6e 65 20 49 4e 54 45 52 4f 50 5f 44 45  efine INTEROP_DE
0560: 42 55 47 5f 42 52 45 41 4b 20 20 20 20 20 20 20  BUG_BREAK       
0570: 20 20 20 28 30 78 30 32 30 30 29 0d 0a 0d 0a 23     (0x0200)....#
0580: 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  if defined(_MSC_
0590: 56 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28  VER) && defined(
05a0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26  INTEROP_DEBUG) &
05b0: 26 20 5c 0d 0a 20 20 20 20 28 49 4e 54 45 52 4f  & \..    (INTERO
05c0: 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52 4f  P_DEBUG & INTERO
05d0: 50 5f 44 45 42 55 47 5f 42 52 45 41 4b 29 0d 0a  P_DEBUG_BREAK)..
05e0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 49  #define sqlite3I
05f0: 6e 74 65 72 6f 70 42 72 65 61 6b 28 61 29 20 7b  nteropBreak(a) {
0600: 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44   sqlite3InteropD
0610: 65 62 75 67 28 22 25 73 5c 6e 22 2c 20 28 61 29  ebug("%s\n", (a)
0620: 29 3b 20 5f 5f 64 65 62 75 67 62 72 65 61 6b 28  ); __debugbreak(
0630: 29 3b 20 7d 0d 0a 23 65 6c 73 65 0d 0a 23 64 65  ); }..#else..#de
0640: 66 69 6e 65 20 73 71 6c 69 74 65 33 49 6e 74 65  fine sqlite3Inte
0650: 72 6f 70 42 72 65 61 6b 28 61 29 0d 0a 23 65 6e  ropBreak(a)..#en
0660: 64 69 66 0d 0a 0d 0a 74 79 70 65 64 65 66 20 76  dif....typedef v
0670: 6f 69 64 20 28 2a 53 51 4c 49 54 45 55 53 45 52  oid (*SQLITEUSER
0680: 46 55 4e 43 29 28 73 71 6c 69 74 65 33 5f 63 6f  FUNC)(sqlite3_co
0690: 6e 74 65 78 74 20 2a 2c 20 69 6e 74 2c 20 73 71  ntext *, int, sq
06a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b  lite3_value **);
06b0: 0d 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 28  ..typedef void (
06c0: 2a 53 51 4c 49 54 45 46 55 4e 43 46 49 4e 41 4c  *SQLITEFUNCFINAL
06d0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
06e0: 74 20 2a 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66  t *);....#if def
06f0: 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42  ined(INTEROP_DEB
0700: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 49  UG) || defined(I
0710: 4e 54 45 52 4f 50 5f 4c 4f 47 29 0d 0a 53 51 4c  NTEROP_LOG)..SQL
0720: 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69 64  ITE_PRIVATE void
0730: 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44   sqlite3InteropD
0740: 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ebug(const char 
0750: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0d  *zFormat, ...){.
0760: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20 20  .  va_list ap;  
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 20 20 2f 2a 20 56 61 72 61 72 67         /* Vararg
0790: 20 6c 69 73 74 20 2a 2f 0d 0a 20 20 53 74 72 41   list */..  StrA
07a0: 63 63 75 6d 20 61 63 63 3b 20 20 20 20 20 20 20  ccum acc;       
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 2f 2a 20 53 74 72 69 6e 67 20 61 63 63 75 6d 75  /* String accumu
07d0: 6c 61 74 6f 72 20 2a 2f 0d 0a 20 20 63 68 61 72  lator */..  char
07e0: 20 7a 4d 73 67 5b 53 51 4c 49 54 45 5f 50 52 49   zMsg[SQLITE_PRI
07f0: 4e 54 5f 42 55 46 5f 53 49 5a 45 2a 33 5d 3b 20  NT_BUF_SIZE*3]; 
0800: 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 6c 6f 67 20  /* Complete log 
0810: 6d 65 73 73 61 67 65 20 2a 2f 0d 0a 20 20 76 61  message */..  va
0820: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
0830: 61 74 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 53  at);..  sqlite3S
0840: 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63  trAccumInit(&acc
0850: 2c 20 7a 4d 73 67 2c 20 73 69 7a 65 6f 66 28 7a  , zMsg, sizeof(z
0860: 4d 73 67 29 2c 20 30 29 3b 0d 0a 20 20 61 63 63  Msg), 0);..  acc
0870: 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0d  .useMalloc = 0;.
0880: 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
0890: 74 66 28 26 61 63 63 2c 20 30 2c 20 7a 46 6f 72  tf(&acc, 0, zFor
08a0: 6d 61 74 2c 20 61 70 29 3b 0d 0a 20 20 76 61 5f  mat, ap);..  va_
08b0: 65 6e 64 28 61 70 29 3b 0d 0a 23 69 66 20 53 51  end(ap);..#if SQ
08c0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
08d0: 42 45 52 20 3e 3d 20 33 30 30 37 30 31 33 0d 0a  BER >= 3007013..
08e0: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
08f0: 77 72 69 74 65 5f 64 65 62 75 67 28 73 71 6c 69  write_debug(sqli
0900: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
0910: 68 28 26 61 63 63 29 2c 20 2d 31 29 3b 0d 0a 23  h(&acc), -1);..#
0920: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
0930: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0940: 53 49 29 0d 0a 20 20 4f 75 74 70 75 74 44 65 62  SI)..  OutputDeb
0950: 75 67 53 74 72 69 6e 67 41 28 73 71 6c 69 74 65  ugStringA(sqlite
0960: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
0970: 26 61 63 63 29 29 3b 0d 0a 23 65 6c 69 66 20 64  &acc));..#elif d
0980: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
0990: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0d 0a 20  N32_HAS_WIDE).. 
09a0: 20 7b 0d 0a 20 20 20 20 4c 50 57 53 54 52 20 7a   {..    LPWSTR z
09b0: 57 69 64 65 4d 73 67 20 3d 20 75 74 66 38 54 6f  WideMsg = utf8To
09c0: 55 6e 69 63 6f 64 65 28 73 71 6c 69 74 65 33 53  Unicode(sqlite3S
09d0: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61  trAccumFinish(&a
09e0: 63 63 29 29 3b 0d 0a 20 20 20 20 69 66 28 20 7a  cc));..    if( z
09f0: 57 69 64 65 4d 73 67 20 29 7b 0d 0a 20 20 20 20  WideMsg ){..    
0a00: 20 20 4f 75 74 70 75 74 44 65 62 75 67 53 74 72    OutputDebugStr
0a10: 69 6e 67 57 28 7a 57 69 64 65 4d 73 67 29 3b 0d  ingW(zWideMsg);.
0a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
0a30: 72 65 65 28 7a 57 69 64 65 4d 73 67 29 3b 0d 0a  ree(zWideMsg);..
0a40: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 23 65 6c 73      }..  }..#els
0a50: 65 0d 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  e..  fprintf(std
0a60: 65 72 72 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  err, "%s", sqlit
0a70: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
0a80: 28 26 61 63 63 29 29 3b 0d 0a 23 65 6e 64 69 66  (&acc));..#endif
0a90: 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23  ..}..#endif....#
0aa0: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
0ab0: 4f 50 5f 4c 4f 47 29 0d 0a 53 51 4c 49 54 45 5f  OP_LOG)..SQLITE_
0ac0: 50 52 49 56 41 54 45 20 69 6e 74 20 6c 6f 67 43  PRIVATE int logC
0ad0: 6f 6e 66 69 67 75 72 65 64 20 3d 20 30 3b 0d 0a  onfigured = 0;..
0ae0: 0d 0a 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45  ..SQLITE_PRIVATE
0af0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 74   void sqlite3Int
0b00: 65 72 6f 70 4c 6f 67 43 61 6c 6c 62 61 63 6b 28  eropLogCallback(
0b10: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
0b20: 69 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  iCode, const cha
0b30: 72 20 2a 7a 4d 73 67 29 7b 0d 0a 20 20 73 71 6c  r *zMsg){..  sql
0b40: 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67  ite3InteropDebug
0b50: 28 22 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 28 25  ("INTEROP_LOG (%
0b60: 64 29 20 25 73 5c 6e 22 2c 20 69 43 6f 64 65 2c  d) %s\n", iCode,
0b70: 20 7a 4d 73 67 29 3b 0d 0a 7d 0d 0a 23 65 6e 64   zMsg);..}..#end
0b80: 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  if....SQLITE_API
0b90: 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69   int WINAPI sqli
0ba0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 73 69 7a 65 5f  te3_malloc_size_
0bb0: 69 6e 74 65 72 6f 70 28 76 6f 69 64 20 2a 70 29  interop(void *p)
0bc0: 7b 0d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  {..  return sqli
0bd0: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 29  te3MallocSize(p)
0be0: 3b 0d 0a 7d 0d 0a 0d 0a 23 69 66 20 64 65 66 69  ;..}....#if defi
0bf0: 6e 65 64 28 49 4e 54 45 52 4f 50 5f 4c 45 47 41  ned(INTEROP_LEGA
0c00: 43 59 5f 43 4c 4f 53 45 29 20 7c 7c 20 53 51 4c  CY_CLOSE) || SQL
0c10: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
0c20: 45 52 20 3c 20 33 30 30 37 30 31 34 0d 0a 53 51  ER < 3007014..SQ
0c30: 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76 6f 69  LITE_PRIVATE voi
0c40: 64 20 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  d * sqlite3DbMal
0c50: 6c 6f 63 5a 65 72 6f 5f 69 6e 74 65 72 6f 70 28  locZero_interop(
0c60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0c70: 20 6e 29 0d 0a 7b 0d 0a 20 20 76 6f 69 64 20 2a   n)..{..  void *
0c80: 70 3b 0d 0a 20 20 69 66 20 28 64 62 29 20 7b 0d  p;..  if (db) {.
0c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
0ca0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
0cb0: 65 78 29 3b 0d 0a 20 20 7d 0d 0a 20 20 70 20 3d  ex);..  }..  p =
0cc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
0cd0: 5a 65 72 6f 28 64 62 2c 6e 29 3b 0d 0a 20 20 69  Zero(db,n);..  i
0ce0: 66 20 28 64 62 29 20 7b 0d 0a 20 20 20 20 73 71  f (db) {..    sq
0cf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
0d00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20  e(db->mutex);.. 
0d10: 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0d   }..  return p;.
0d20: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 50 52 49  .}....SQLITE_PRI
0d30: 56 41 54 45 20 76 6f 69 64 20 73 71 6c 69 74 65  VATE void sqlite
0d40: 33 44 62 46 72 65 65 5f 69 6e 74 65 72 6f 70 28  3DbFree_interop(
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
0d60: 64 20 2a 70 29 0d 0a 7b 0d 0a 20 20 69 66 20 28  d *p)..{..  if (
0d70: 64 62 29 20 7b 0d 0a 20 20 20 20 73 71 6c 69 74  db) {..    sqlit
0d80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
0d90: 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d  b->mutex);..  }.
0da0: 0a 20 20 69 66 20 28 70 29 20 7b 0d 0a 20 20 20  .  if (p) {..   
0db0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
0dc0: 53 65 74 54 79 70 65 28 70 2c 20 4d 45 4d 54 59  SetType(p, MEMTY
0dd0: 50 45 5f 44 42 7c 4d 45 4d 54 59 50 45 5f 48 45  PE_DB|MEMTYPE_HE
0de0: 41 50 29 3b 0d 0a 20 20 7d 0d 0a 20 20 73 71 6c  AP);..  }..  sql
0df0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 70 29  ite3DbFree(db,p)
0e00: 3b 0d 0a 20 20 69 66 20 28 64 62 29 20 7b 0d 0a  ;..  if (db) {..
0e10: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
0e20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
0e30: 78 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 23 65 6e  x);..  }..}..#en
0e40: 64 69 66 0d 0a 0d 0a 2f 2a 0d 0a 20 20 20 20 54  dif..../*..    T
0e50: 68 65 20 67 6f 61 6c 20 6f 66 20 74 68 69 73 20  he goal of this 
0e60: 76 65 72 73 69 6f 6e 20 6f 66 20 63 6c 6f 73 65  version of close
0e70: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 68   is different th
0e80: 61 6e 20 74 68 61 74 20 6f 66 20 73 71 6c 69 74  an that of sqlit
0e90: 65 33 5f 63 6c 6f 73 65 28 29 2c 20 61 6e 64 20  e3_close(), and 
0ea0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 6c  is designed to l
0eb0: 65 6e 64 20 69 74 73 65 6c 66 20 62 65 74 74 65  end itself bette
0ec0: 72 20 74 6f 20 2e 4e 45 54 27 73 20 6e 6f 6e 2d  r to .NET's non-
0ed0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 69  deterministic fi
0ee0: 6e 61 6c 69 7a 65 72 73 20 61 6e 64 0d 0a 20 20  nalizers and..  
0ef0: 20 20 74 68 65 20 47 43 20 74 68 72 65 61 64 2e    the GC thread.
0f00: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f    SQLite will no
0f10: 74 20 63 6c 6f 73 65 20 61 20 64 61 74 61 62 61  t close a databa
0f20: 73 65 20 69 66 20 73 74 61 74 65 6d 65 6e 74 73  se if statements
0f30: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 69 74 20   are open on it 
0f40: 2d 2d 20 62 75 74 20 66 6f 72 20 6f 75 72 20 70  -- but for our p
0f50: 75 72 70 6f 73 65 73 2c 20 77 65 27 64 20 72 61  urposes, we'd ra
0f60: 74 68 65 72 20 66 69 6e 61 6c 69 7a 65 20 61 6c  ther finalize al
0f70: 6c 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  l active stateme
0f80: 6e 74 73 0d 0a 20 20 20 20 61 6e 64 20 66 6f 72  nts..    and for
0f90: 63 69 62 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  cibly close the 
0fa0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
0fb0: 65 61 73 6f 6e 20 69 73 20 73 69 6d 70 6c 65 20  eason is simple 
0fc0: 2d 2d 20 61 20 6c 6f 74 20 6f 66 20 70 65 6f 70  -- a lot of peop
0fd0: 6c 65 20 64 6f 6e 27 74 20 44 69 73 70 6f 73 65  le don't Dispose
0fe0: 28 29 20 6f 66 20 74 68 65 69 72 20 6f 62 6a 65  () of their obje
0ff0: 63 74 73 20 63 6f 72 72 65 63 74 6c 79 20 61 6e  cts correctly an
1000: 64 20 6c 65 74 20 74 68 65 20 67 61 72 62 61 67  d let the garbag
1010: 65 20 63 6f 6c 6c 65 63 74 6f 72 0d 0a 20 20 20  e collector..   
1020: 20 64 6f 20 69 74 2e 20 20 54 68 69 73 20 6c 65   do it.  This le
1030: 61 64 73 20 74 6f 20 75 6e 65 78 70 65 63 74 65  ads to unexpecte
1040: 64 20 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20  d behavior when 
1050: 61 20 75 73 65 72 20 74 68 69 6e 6b 73 20 74 68  a user thinks th
1060: 65 79 27 76 65 20 63 6c 6f 73 65 64 20 61 20 64  ey've closed a d
1070: 61 74 61 62 61 73 65 2c 20 62 75 74 20 69 74 27  atabase, but it'
1080: 73 20 73 74 69 6c 6c 20 6f 70 65 6e 20 62 65 63  s still open bec
1090: 61 75 73 65 20 6e 6f 74 20 61 6c 6c 20 74 68 65  ause not all the
10a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 68 61 76 65   statements have
10b0: 0d 0a 20 20 20 20 68 69 74 20 74 68 65 20 47 43  ..    hit the GC
10c0: 20 79 65 74 2e 0d 0a 0d 0a 20 20 20 20 53 6f 2c   yet.....    So,
10d0: 20 68 65 72 65 20 77 65 20 68 61 76 65 20 61 20   here we have a 
10e0: 70 72 6f 62 6c 65 6d 20 2e 2e 2e 20 2e 4e 45 54  problem ... .NET
10f0: 20 68 61 73 20 61 20 70 6f 69 6e 74 65 72 20 74   has a pointer t
1100: 6f 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  o any number of 
1110: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a  sqlite3_stmt obj
1120: 65 63 74 73 2e 20 20 57 65 20 63 61 6e 27 74 20  ects.  We can't 
1130: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6e  call sqlite3_fin
1140: 61 6c 69 7a 65 28 29 20 6f 6e 20 74 68 65 73 65  alize() on these
1150: 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 74 68   because..    th
1160: 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
1170: 65 65 64 20 61 6e 64 20 63 61 6e 20 62 65 20 75  eed and can be u
1180: 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e  sed for somethin
1190: 67 20 65 6c 73 65 2e 20 20 54 68 65 20 47 43 20  g else.  The GC 
11a0: 74 68 72 65 61 64 20 63 6f 75 6c 64 20 70 6f 74  thread could pot
11b0: 65 6e 74 69 61 6c 6c 79 20 74 72 79 20 61 6e 64  entially try and
11c0: 20 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 20 61   call finalize a
11d0: 67 61 69 6e 20 6f 6e 20 74 68 65 20 73 74 61 74  gain on the stat
11e0: 65 6d 65 6e 74 20 61 66 74 65 72 0d 0a 20 20 20  ement after..   
11f0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 77 61 73   that memory was
1200: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 42   deallocated.  B
1210: 41 44 2e 20 20 53 6f 2c 20 77 68 61 74 20 77 65  AD.  So, what we
1220: 20 6e 65 65 64 20 74 6f 20 64 6f 20 69 73 20 6d   need to do is m
1230: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 65 61  ake a copy of ea
1240: 63 68 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  ch statement, an
1250: 64 20 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 28  d call finalize(
1260: 29 20 6f 6e 20 74 68 65 20 63 6f 70 79 20 2d 2d  ) on the copy --
1270: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6f 72 69   so that the ori
1280: 67 69 6e 61 6c 0d 0a 20 20 20 20 73 74 61 74 65  ginal..    state
1290: 6d 65 6e 74 27 73 20 6d 65 6d 6f 72 79 20 69 73  ment's memory is
12a0: 20 70 72 65 73 65 72 76 65 64 2c 20 61 6e 64 20   preserved, and 
12b0: 6d 61 72 6b 65 64 20 61 73 20 42 41 44 2c 20 62  marked as BAD, b
12c0: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
12d0: 6d 61 6e 61 67 65 20 74 6f 20 66 69 6e 61 6c 69  manage to finali
12e0: 7a 65 20 65 76 65 72 79 74 68 69 6e 67 20 61 6e  ze everything an
12f0: 64 20 66 6f 72 63 69 62 6c 79 20 63 6c 6f 73 65  d forcibly close
1300: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1310: 4c 61 74 65 72 20 77 68 65 6e 20 74 68 65 0d 0a  Later when the..
1320: 20 20 20 20 47 43 20 67 65 74 73 20 61 72 6f 75      GC gets arou
1330: 6e 64 20 74 6f 20 63 61 6c 6c 69 6e 67 20 66 69  nd to calling fi
1340: 6e 61 6c 69 7a 65 5f 69 6e 74 65 72 6f 70 28 29  nalize_interop()
1350: 20 6f 6e 20 74 68 65 20 22 62 61 64 22 20 73 74   on the "bad" st
1360: 61 74 65 6d 65 6e 74 2c 20 77 65 20 64 65 74 65  atement, we dete
1370: 63 74 20 74 68 61 74 20 61 6e 64 20 66 69 6e 69  ct that and fini
1380: 73 68 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20  sh deallocating 
1390: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f  the pointer...*/
13a0: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74  ..SQLITE_API int
13b0: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
13c0: 63 6c 6f 73 65 5f 69 6e 74 65 72 6f 70 28 73 71  close_interop(sq
13d0: 6c 69 74 65 33 20 2a 64 62 29 0d 0a 7b 0d 0a 20  lite3 *db)..{.. 
13e0: 20 69 6e 74 20 72 65 74 3b 0d 0a 23 69 66 20 21   int ret;..#if !
13f0: 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f  defined(INTEROP_
1400: 4c 45 47 41 43 59 5f 43 4c 4f 53 45 29 20 26 26  LEGACY_CLOSE) &&
1410: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1420: 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 37 30 31  NUMBER >= 300701
1430: 34 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  4....#if defined
1440: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20  (INTEROP_DEBUG) 
1450: 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  && (INTEROP_DEBU
1460: 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  G & INTEROP_DEBU
1470: 47 5f 43 4c 4f 53 45 29 0d 0a 20 20 73 71 6c 69  G_CLOSE)..  sqli
1480: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
1490: 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 69  "sqlite3_close_i
14a0: 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c 69 6e  nterop(): callin
14b0: 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  g sqlite3_close_
14c0: 76 32 28 25 70 29 2e 2e 2e 5c 6e 22 2c 20 64 62  v2(%p)...\n", db
14d0: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20  );..#endif....  
14e0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c  ret = sqlite3_cl
14f0: 6f 73 65 5f 76 32 28 64 62 29 3b 0d 0a 0d 0a 23  ose_v2(db);....#
1500: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
1510: 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e  OP_DEBUG) && (IN
1520: 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e  TEROP_DEBUG & IN
1530: 54 45 52 4f 50 5f 44 45 42 55 47 5f 43 4c 4f 53  TEROP_DEBUG_CLOS
1540: 45 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74  E)..  sqlite3Int
1550: 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74  eropDebug("sqlit
1560: 65 33 5f 63 6c 6f 73 65 5f 69 6e 74 65 72 6f 70  e3_close_interop
1570: 28 29 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  (): sqlite3_clos
1580: 65 5f 76 32 28 25 70 29 20 72 65 74 75 72 6e 65  e_v2(%p) returne
1590: 64 20 25 64 2e 5c 6e 22 2c 20 64 62 2c 20 72 65  d %d.\n", db, re
15a0: 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20  t);..#endif.... 
15b0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 23 65   return ret;..#e
15c0: 6c 73 65 0d 0a 20 20 72 65 74 20 3d 20 73 71 6c  lse..  ret = sql
15d0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0d  ite3_close(db);.
15e0: 0a 0d 0a 20 20 69 66 20 28 72 65 74 20 3d 3d 20  ...  if (ret == 
15f0: 53 51 4c 49 54 45 5f 42 55 53 59 29 0d 0a 20 20  SQLITE_BUSY)..  
1600: 7b 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  {..    sqlite3_m
1610: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1620: 75 74 65 78 29 3b 0d 0a 0d 0a 20 20 20 20 69 66  utex);....    if
1630: 20 28 21 64 62 2d 3e 70 56 64 62 65 29 0d 0a 20   (!db->pVdbe).. 
1640: 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 71 6c 69     {..      sqli
1650: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1660: 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 20  db->mutex);..   
1670: 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a     return ret;..
1680: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 77 68 69      }....    whi
1690: 6c 65 20 28 64 62 2d 3e 70 56 64 62 65 29 0d 0a  le (db->pVdbe)..
16a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2a 20      {..      /* 
16b0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
16c0: 68 65 20 66 69 72 73 74 20 70 72 65 70 61 72 65  he first prepare
16d0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0d 0a  d statement */..
16e0: 20 20 20 20 20 20 56 64 62 65 20 2a 70 20 3d 20        Vdbe *p = 
16f0: 28 56 64 62 65 20 2a 29 73 71 6c 69 74 65 33 44  (Vdbe *)sqlite3D
1700: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 5f 69 6e 74 65  bMallocZero_inte
1710: 72 6f 70 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  rop(db, sizeof(V
1720: 64 62 65 29 29 3b 0d 0a 20 20 20 20 20 20 56 64  dbe));..      Vd
1730: 62 65 20 2a 70 6f 20 3d 20 64 62 2d 3e 70 56 64  be *po = db->pVd
1740: 62 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  be;....      if 
1750: 28 21 70 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  (!p)..      {.. 
1760: 20 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c         ret = SQL
1770: 49 54 45 5f 4e 4f 4d 45 4d 3b 0d 0a 20 20 20 20  ITE_NOMEM;..    
1780: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
1790: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 43 6f 70    }....      Cop
17a0: 79 4d 65 6d 6f 72 79 28 70 2c 20 70 6f 2c 20 73  yMemory(p, po, s
17b0: 69 7a 65 6f 66 28 56 64 62 65 29 29 3b 0d 0a 0d  izeof(Vdbe));...
17c0: 0a 20 20 20 20 20 20 2f 2a 20 50 75 74 20 69 74  .      /* Put it
17d0: 20 6f 6e 20 74 68 65 20 63 68 61 69 6e 20 73 6f   on the chain so
17e0: 20 77 65 20 63 61 6e 20 66 72 65 65 20 69 74 20   we can free it 
17f0: 2a 2f 0d 0a 20 20 20 20 20 20 64 62 2d 3e 70 56  */..      db->pV
1800: 64 62 65 20 3d 20 70 3b 0d 0a 20 20 20 20 20 20  dbe = p;..      
1810: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  ret = sqlite3_fi
1820: 6e 61 6c 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  nalize((sqlite3_
1830: 73 74 6d 74 20 2a 29 70 29 3b 20 2f 2a 20 54 68  stmt *)p); /* Th
1840: 69 73 20 77 69 6c 6c 20 61 6c 73 6f 20 66 72 65  is will also fre
1850: 65 20 74 68 65 20 63 6f 70 79 27 73 20 6d 65 6d  e the copy's mem
1860: 6f 72 79 20 2a 2f 0d 0a 20 20 20 20 20 20 69 66  ory */..      if
1870: 20 28 72 65 74 29 0d 0a 20 20 20 20 20 20 7b 0d   (ret)..      {.
1880: 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6e 61  .        /* fina
1890: 6c 69 7a 65 20 66 61 69 6c 65 64 20 2d 2d 20 73  lize failed -- s
18a0: 6f 20 77 65 20 6d 75 73 74 20 70 75 74 20 62 61  o we must put ba
18b0: 63 6b 20 61 6e 79 74 68 69 6e 67 20 77 65 20 6d  ck anything we m
18c0: 75 6e 67 65 64 20 2a 2f 0d 0a 20 20 20 20 20 20  unged */..      
18d0: 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28 70 6f 2c    CopyMemory(po,
18e0: 20 70 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29   p, sizeof(Vdbe)
18f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  );..        db->
1900: 70 56 64 62 65 20 3d 20 70 6f 3b 0d 0a 0d 0a 20  pVdbe = po;.... 
1910: 20 20 20 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20         /*..     
1920: 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 4f 6b 2c 20     ** NOTE: Ok, 
1930: 77 65 20 6d 75 73 74 20 66 72 65 65 20 74 68 69  we must free thi
1940: 73 20 62 6c 6f 63 6b 20 74 68 61 74 20 2a 77 65  s block that *we
1950: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 28 61 62 6f  * allocated (abo
1960: 76 65 29 20 73 69 6e 63 65 0d 0a 20 20 20 20 20  ve) since..     
1970: 20 20 20 2a 2a 20 20 20 20 20 20 20 66 69 6e 61     **       fina
1980: 6c 69 7a 65 20 64 69 64 20 6e 6f 74 20 64 6f 20  lize did not do 
1990: 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 2a 2f 0d  so...        */.
19a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19b0: 44 62 46 72 65 65 5f 69 6e 74 65 72 6f 70 28 64  DbFree_interop(d
19c0: 62 2c 20 70 29 3b 0d 0a 20 20 20 20 20 20 20 20  b, p);..        
19d0: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d  break;..      }.
19e0: 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20  .      else..   
19f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 5a 65     {..        Ze
1a00: 72 6f 4d 65 6d 6f 72 79 28 70 6f 2c 20 73 69 7a  roMemory(po, siz
1a10: 65 6f 66 28 56 64 62 65 29 29 3b 0d 0a 20 20 20  eof(Vdbe));..   
1a20: 20 20 20 20 20 70 6f 2d 3e 6d 61 67 69 63 20 3d       po->magic =
1a30: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
1a40: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
1a50: 7d 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  }..    sqlite3_m
1a60: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1a70: 75 74 65 78 29 3b 0d 0a 20 20 20 20 72 65 74 20  utex);..    ret 
1a80: 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  = sqlite3_close(
1a90: 64 62 29 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74  db);..  }..  ret
1aa0: 75 72 6e 20 72 65 74 3b 0d 0a 23 65 6e 64 69 66  urn ret;..#endif
1ab0: 0d 0a 7d 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e  ..}....#if defin
1ac0: 65 64 28 49 4e 54 45 52 4f 50 5f 4c 4f 47 29 0d  ed(INTEROP_LOG).
1ad0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20  .SQLITE_API int 
1ae0: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63  WINAPI sqlite3_c
1af0: 6f 6e 66 69 67 5f 6c 6f 67 5f 69 6e 74 65 72 6f  onfig_log_intero
1b00: 70 28 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65  p()..{..  int re
1b10: 74 3b 0d 0a 20 20 69 66 28 20 21 6c 6f 67 43 6f  t;..  if( !logCo
1b20: 6e 66 69 67 75 72 65 64 20 29 7b 0d 0a 20 20 20  nfigured ){..   
1b30: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 63   ret = sqlite3_c
1b40: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
1b50: 46 49 47 5f 4c 4f 47 2c 20 73 71 6c 69 74 65 33  FIG_LOG, sqlite3
1b60: 49 6e 74 65 72 6f 70 4c 6f 67 43 61 6c 6c 62 61  InteropLogCallba
1b70: 63 6b 2c 20 30 29 3b 0d 0a 20 20 20 20 69 66 28  ck, 0);..    if(
1b80: 20 72 65 74 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   ret==SQLITE_OK 
1b90: 29 7b 0d 0a 20 20 20 20 20 20 6c 6f 67 43 6f 6e  ){..      logCon
1ba0: 66 69 67 75 72 65 64 20 3d 20 31 3b 0d 0a 20 20  figured = 1;..  
1bb0: 20 20 7d 65 6c 73 65 7b 0d 0a 20 20 20 20 20 20    }else{..      
1bc0: 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65  sqlite3InteropDe
1bd0: 62 75 67 28 22 73 71 6c 69 74 65 33 5f 63 6f 6e  bug("sqlite3_con
1be0: 66 69 67 5f 6c 6f 67 5f 69 6e 74 65 72 6f 70 28  fig_log_interop(
1bf0: 29 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  ): sqlite3_confi
1c00: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1c10: 4c 4f 47 29 20 72 65 74 75 72 6e 65 64 20 25 64  LOG) returned %d
1c20: 2e 5c 6e 22 2c 20 72 65 74 29 3b 0d 0a 20 20 20  .\n", ret);..   
1c30: 20 7d 0d 0a 20 20 7d 65 6c 73 65 7b 0d 0a 20 20   }..  }else{..  
1c40: 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f    ret = SQLITE_O
1c50: 4b 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72  K;..  }..  retur
1c60: 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 23 65 6e 64 69  n ret;..}..#endi
1c70: 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  f....SQLITE_API 
1c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1c90: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 69  te3_libversion_i
1ca0: 6e 74 65 72 6f 70 28 76 6f 69 64 29 0d 0a 7b 0d  nterop(void)..{.
1cb0: 0a 20 20 72 65 74 75 72 6e 20 49 4e 54 45 52 4f  .  return INTERO
1cc0: 50 5f 56 45 52 53 49 4f 4e 3b 0d 0a 7d 0d 0a 0d  P_VERSION;..}...
1cd0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73  .SQLITE_API cons
1ce0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1cf0: 73 6f 75 72 63 65 69 64 5f 69 6e 74 65 72 6f 70  sourceid_interop
1d00: 28 76 6f 69 64 29 0d 0a 7b 0d 0a 20 20 72 65 74  (void)..{..  ret
1d10: 75 72 6e 20 49 4e 54 45 52 4f 50 5f 53 4f 55 52  urn INTEROP_SOUR
1d20: 43 45 5f 49 44 20 22 20 22 20 49 4e 54 45 52 4f  CE_ID " " INTERO
1d30: 50 5f 53 4f 55 52 43 45 5f 54 49 4d 45 53 54 41  P_SOURCE_TIMESTA
1d40: 4d 50 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  MP;..}....SQLITE
1d50: 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20  _API int WINAPI 
1d60: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e 74  sqlite3_open_int
1d70: 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61 72 20  erop(const char 
1d80: 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 66  *filename, int f
1d90: 6c 61 67 73 2c 20 73 71 6c 69 74 65 33 20 2a 2a  lags, sqlite3 **
1da0: 70 70 64 62 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20  ppdb)..{..  int 
1db0: 72 65 74 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69  ret;....#if defi
1dc0: 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  ned(INTEROP_DEBU
1dd0: 47 29 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44  G) && (INTEROP_D
1de0: 45 42 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44  EBUG & INTEROP_D
1df0: 45 42 55 47 5f 4f 50 45 4e 29 0d 0a 20 20 73 71  EBUG_OPEN)..  sq
1e00: 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75  lite3InteropDebu
1e10: 67 28 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  g("sqlite3_open_
1e20: 69 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c 69  interop(): calli
1e30: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  ng sqlite3_open_
1e40: 76 32 28 5c 22 25 73 5c 22 2c 20 25 64 2c 20 25  v2(\"%s\", %d, %
1e50: 70 29 2e 2e 2e 5c 6e 22 2c 20 66 69 6c 65 6e 61  p)...\n", filena
1e60: 6d 65 2c 20 66 6c 61 67 73 2c 20 70 70 64 62 29  me, flags, ppdb)
1e70: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72  ;..#endif....  r
1e80: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  et = sqlite3_ope
1e90: 6e 5f 76 32 28 66 69 6c 65 6e 61 6d 65 2c 20 70  n_v2(filename, p
1ea0: 70 64 62 2c 20 66 6c 61 67 73 2c 20 4e 55 4c 4c  pdb, flags, NULL
1eb0: 29 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65  );....#if define
1ec0: 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29  d(INTEROP_DEBUG)
1ed0: 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42   && (INTEROP_DEB
1ee0: 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42  UG & INTEROP_DEB
1ef0: 55 47 5f 4f 50 45 4e 29 0d 0a 20 20 73 71 6c 69  UG_OPEN)..  sqli
1f00: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
1f10: 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e  "sqlite3_open_in
1f20: 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33  terop(): sqlite3
1f30: 5f 6f 70 65 6e 5f 76 32 28 5c 22 25 73 5c 22 2c  _open_v2(\"%s\",
1f40: 20 25 64 2c 20 25 70 29 20 72 65 74 75 72 6e 65   %d, %p) returne
1f50: 64 20 25 64 2e 5c 6e 22 2c 20 66 69 6c 65 6e 61  d %d.\n", filena
1f60: 6d 65 2c 20 66 6c 61 67 73 2c 20 70 70 64 62 2c  me, flags, ppdb,
1f70: 20 72 65 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a   ret);..#endif..
1f80: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e  ..#if defined(IN
1f90: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
1fa0: 46 55 4e 43 54 49 4f 4e 53 29 0d 0a 20 20 69 66  FUNCTIONS)..  if
1fb0: 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f   (ret == SQLITE_
1fc0: 4f 4b 29 0d 0a 20 20 20 20 52 65 67 69 73 74 65  OK)..    Registe
1fd0: 72 45 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69  rExtensionFuncti
1fe0: 6f 6e 73 28 2a 70 70 64 62 29 3b 0d 0a 23 65 6e  ons(*ppdb);..#en
1ff0: 64 69 66 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20  dif....  return 
2000: 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  ret;..}....SQLIT
2010: 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49  E_API int WINAPI
2020: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f   sqlite3_open16_
2030: 69 6e 74 65 72 6f 70 28 63 6f 6e 73 74 20 63 68  interop(const ch
2040: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
2050: 74 20 66 6c 61 67 73 2c 20 73 71 6c 69 74 65 33  t flags, sqlite3
2060: 20 2a 2a 70 70 64 62 29 0d 0a 7b 0d 0a 20 20 69   **ppdb)..{..  i
2070: 6e 74 20 72 65 74 3b 0d 0a 0d 0a 23 69 66 20 64  nt ret;....#if d
2080: 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44  efined(INTEROP_D
2090: 45 42 55 47 29 20 26 26 20 28 49 4e 54 45 52 4f  EBUG) && (INTERO
20a0: 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52 4f  P_DEBUG & INTERO
20b0: 50 5f 44 45 42 55 47 5f 4f 50 45 4e 31 36 29 0d  P_DEBUG_OPEN16).
20c0: 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f  .  sqlite3Intero
20d0: 70 44 65 62 75 67 28 22 73 71 6c 69 74 65 33 5f  pDebug("sqlite3_
20e0: 6f 70 65 6e 31 36 5f 69 6e 74 65 72 6f 70 28 29  open16_interop()
20f0: 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  : calling sqlite
2100: 33 5f 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28 5c  3_open_interop(\
2110: 22 25 73 5c 22 2c 20 25 64 2c 20 25 70 29 2e 2e  "%s\", %d, %p)..
2120: 2e 5c 6e 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  .\n", filename, 
2130: 66 6c 61 67 73 2c 20 70 70 64 62 29 3b 0d 0a 23  flags, ppdb);..#
2140: 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74 20 3d  endif....  ret =
2150: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e   sqlite3_open_in
2160: 74 65 72 6f 70 28 66 69 6c 65 6e 61 6d 65 2c 20  terop(filename, 
2170: 66 6c 61 67 73 2c 20 70 70 64 62 29 3b 0d 0a 0d  flags, ppdb);...
2180: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54  .#if defined(INT
2190: 45 52 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28  EROP_DEBUG) && (
21a0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20  INTEROP_DEBUG & 
21b0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 4f 50  INTEROP_DEBUG_OP
21c0: 45 4e 31 36 29 0d 0a 20 20 73 71 6c 69 74 65 33  EN16)..  sqlite3
21d0: 49 6e 74 65 72 6f 70 44 65 62 75 67 28 22 73 71  InteropDebug("sq
21e0: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f 69 6e 74  lite3_open16_int
21f0: 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33 5f  erop(): sqlite3_
2200: 6f 70 65 6e 5f 69 6e 74 65 72 6f 70 28 5c 22 25  open_interop(\"%
2210: 73 5c 22 2c 20 25 64 2c 20 25 70 29 20 72 65 74  s\", %d, %p) ret
2220: 75 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 66 69  urned %d.\n", fi
2230: 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
2240: 70 64 62 2c 20 72 65 74 29 3b 0d 0a 23 65 6e 64  pdb, ret);..#end
2250: 69 66 0d 0a 0d 0a 20 20 69 66 20 28 28 72 65 74  if....  if ((ret
2260: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   == SQLITE_OK) &
2270: 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
2280: 28 2a 70 70 64 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppdb, 0, DB_Sc
2290: 68 65 6d 61 4c 6f 61 64 65 64 29 29 0d 0a 20 20  hemaLoaded))..  
22a0: 20 20 45 4e 43 28 2a 70 70 64 62 29 20 3d 20 53    ENC(*ppdb) = S
22b0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
22c0: 45 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72  E;....  return r
22d0: 65 74 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  et;..}....SQLITE
22e0: 5f 41 50 49 20 63 6f 6e 73 74 20 63 68 61 72 20  _API const char 
22f0: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
2300: 5f 65 72 72 6d 73 67 5f 69 6e 74 65 72 6f 70 28  _errmsg_interop(
2310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2320: 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f   *plen)..{..  co
2330: 6e 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d  nst char *pval =
2340: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2350: 64 62 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20  db);..  *plen = 
2360: 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74  (pval != 0) ? st
2370: 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0d  rlen(pval) : 0;.
2380: 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d  .  return pval;.
2390: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  .}....SQLITE_API
23a0: 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69   int WINAPI sqli
23b0: 74 65 33 5f 63 68 61 6e 67 65 73 5f 69 6e 74 65  te3_changes_inte
23c0: 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62 29  rop(sqlite3 *db)
23d0: 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65 73 75 6c  ..{..  int resul
23e0: 74 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65  t;....#if define
23f0: 64 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29  d(INTEROP_DEBUG)
2400: 20 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42   && (INTEROP_DEB
2410: 55 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42  UG & INTEROP_DEB
2420: 55 47 5f 43 48 41 4e 47 45 53 29 0d 0a 20 20 73  UG_CHANGES)..  s
2430: 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62  qlite3InteropDeb
2440: 75 67 28 22 73 71 6c 69 74 65 33 5f 63 68 61 6e  ug("sqlite3_chan
2450: 67 65 73 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63  ges_interop(): c
2460: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
2470: 68 61 6e 67 65 73 28 25 70 29 2e 2e 2e 5c 6e 22  hanges(%p)...\n"
2480: 2c 20 64 62 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a  , db);..#endif..
2490: 0d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
24a0: 0d 0a 20 20 69 66 20 28 21 64 62 29 0d 0a 20 20  ..  if (!db)..  
24b0: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72      sqlite3Inter
24c0: 6f 70 42 72 65 61 6b 28 22 6e 75 6c 6c 20 64 61  opBreak("null da
24d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 6f  tabase handle fo
24e0: 72 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  r sqlite3_change
24f0: 73 28 29 22 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a  s()");..#endif..
2500: 0d 0a 20 20 72 65 73 75 6c 74 20 3d 20 73 71 6c  ..  result = sql
2510: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29  ite3_changes(db)
2520: 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  ;....#if defined
2530: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20  (INTEROP_DEBUG) 
2540: 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  && (INTEROP_DEBU
2550: 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  G & INTEROP_DEBU
2560: 47 5f 43 48 41 4e 47 45 53 29 0d 0a 20 20 73 71  G_CHANGES)..  sq
2570: 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75  lite3InteropDebu
2580: 67 28 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  g("sqlite3_chang
2590: 65 73 5f 69 6e 74 65 72 6f 70 28 29 3a 20 73 71  es_interop(): sq
25a0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 25 70  lite3_changes(%p
25b0: 29 20 72 65 74 75 72 6e 65 64 20 25 64 2e 5c 6e  ) returned %d.\n
25c0: 22 2c 20 64 62 2c 20 72 65 73 75 6c 74 29 3b 0d  ", db, result);.
25d0: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74  .#endif....  ret
25e0: 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 7d 0d 0a  urn result;..}..
25f0: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74  ..SQLITE_API int
2600: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
2610: 70 72 65 70 61 72 65 5f 69 6e 74 65 72 6f 70 28  prepare_interop(
2620: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2630: 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 69 6e  st char *sql, in
2640: 74 20 6e 62 79 74 65 73 2c 20 73 71 6c 69 74 65  t nbytes, sqlite
2650: 33 5f 73 74 6d 74 20 2a 2a 70 70 73 74 6d 74 2c  3_stmt **ppstmt,
2660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
2670: 74 61 69 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29  tail, int *plen)
2680: 0d 0a 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 0d  ..{..  int n;...
2690: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54  .#if defined(INT
26a0: 45 52 4f 50 5f 44 45 42 55 47 29 20 26 26 20 28  EROP_DEBUG) && (
26b0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 26 20  INTEROP_DEBUG & 
26c0: 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 50 52  INTEROP_DEBUG_PR
26d0: 45 50 41 52 45 29 0d 0a 20 20 73 71 6c 69 74 65  EPARE)..  sqlite
26e0: 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28 22 73  3InteropDebug("s
26f0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 69  qlite3_prepare_i
2700: 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c 69 6e  nterop(): callin
2710: 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  g sqlite3_prepar
2720: 65 28 25 70 2c 20 5c 22 25 73 5c 22 2c 20 25 64  e(%p, \"%s\", %d
2730: 2c 20 25 70 29 2e 2e 2e 5c 6e 22 2c 20 64 62 2c  , %p)...\n", db,
2740: 20 73 71 6c 2c 20 6e 62 79 74 65 73 2c 20 70 70   sql, nbytes, pp
2750: 73 74 6d 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a  stmt);..#endif..
2760: 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52  ..#if SQLITE_VER
2770: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33  SION_NUMBER >= 3
2780: 30 30 33 30 30 39 0d 0a 20 20 6e 20 3d 20 73 71  003009..  n = sq
2790: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
27a0: 28 64 62 2c 20 73 71 6c 2c 20 6e 62 79 74 65 73  (db, sql, nbytes
27b0: 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61 69 6c  , ppstmt, pztail
27c0: 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 6e 20 3d  );..#else..  n =
27d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
27e0: 28 64 62 2c 20 73 71 6c 2c 20 6e 62 79 74 65 73  (db, sql, nbytes
27f0: 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61 69 6c  , ppstmt, pztail
2800: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23 69  );..#endif....#i
2810: 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f  f defined(INTERO
2820: 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e 54  P_DEBUG) && (INT
2830: 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e 54  EROP_DEBUG & INT
2840: 45 52 4f 50 5f 44 45 42 55 47 5f 50 52 45 50 41  EROP_DEBUG_PREPA
2850: 52 45 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e  RE)..  sqlite3In
2860: 74 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69  teropDebug("sqli
2870: 74 65 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65  te3_prepare_inte
2880: 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33 5f 70  rop(): sqlite3_p
2890: 72 65 70 61 72 65 28 25 70 2c 20 5c 22 25 73 5c  repare(%p, \"%s\
28a0: 22 2c 20 25 64 2c 20 25 70 29 20 72 65 74 75 72  ", %d, %p) retur
28b0: 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 64 62 2c 20  ned %d.\n", db, 
28c0: 73 71 6c 2c 20 6e 62 79 74 65 73 2c 20 70 70 73  sql, nbytes, pps
28d0: 74 6d 74 2c 20 6e 29 3b 0d 0a 23 65 6e 64 69 66  tmt, n);..#endif
28e0: 0d 0a 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 2a  ....  *plen = (*
28f0: 70 7a 74 61 69 6c 20 21 3d 20 30 29 20 3f 20 73  pztail != 0) ? s
2900: 74 72 6c 65 6e 28 2a 70 7a 74 61 69 6c 29 20 3a  trlen(*pztail) :
2910: 20 30 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20   0;....  return 
2920: 6e 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  n;..}....SQLITE_
2930: 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73  API int WINAPI s
2940: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
2950: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
2960: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 76 6f 69 64   *db, const void
2970: 20 2a 73 71 6c 2c 20 69 6e 74 20 6e 63 68 61 72   *sql, int nchar
2980: 73 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  s, sqlite3_stmt 
2990: 2a 2a 70 70 73 74 6d 74 2c 20 63 6f 6e 73 74 20  **ppstmt, const 
29a0: 76 6f 69 64 20 2a 2a 70 7a 74 61 69 6c 2c 20 69  void **pztail, i
29b0: 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20  nt *plen)..{..  
29c0: 69 6e 74 20 6e 3b 0d 0a 0d 0a 23 69 66 20 64 65  int n;....#if de
29d0: 66 69 6e 65 64 28 49 4e 54 45 52 4f 50 5f 44 45  fined(INTEROP_DE
29e0: 42 55 47 29 20 26 26 20 28 49 4e 54 45 52 4f 50  BUG) && (INTEROP
29f0: 5f 44 45 42 55 47 20 26 20 49 4e 54 45 52 4f 50  _DEBUG & INTEROP
2a00: 5f 44 45 42 55 47 5f 50 52 45 50 41 52 45 31 36  _DEBUG_PREPARE16
2a10: 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65  )..  sqlite3Inte
2a20: 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74 65  ropDebug("sqlite
2a30: 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65 72 6f  3_prepare_intero
2a40: 70 28 29 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c  p(): calling sql
2a50: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 25  ite3_prepare16(%
2a60: 70 2c 20 5c 22 25 73 5c 22 2c 20 25 64 2c 20 25  p, \"%s\", %d, %
2a70: 70 29 2e 2e 2e 5c 6e 22 2c 20 64 62 2c 20 73 71  p)...\n", db, sq
2a80: 6c 2c 20 6e 63 68 61 72 73 2c 20 70 70 73 74 6d  l, nchars, ppstm
2a90: 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 23  t);..#endif....#
2aa0: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
2ab0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 33  N_NUMBER >= 3003
2ac0: 30 30 39 0d 0a 20 20 6e 20 3d 20 73 71 6c 69 74  009..  n = sqlit
2ad0: 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  e3_prepare16_v2(
2ae0: 64 62 2c 20 73 71 6c 2c 20 6e 63 68 61 72 73 20  db, sql, nchars 
2af0: 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74  * sizeof(wchar_t
2b00: 29 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61 69  ), ppstmt, pztai
2b10: 6c 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 6e 20  l);..#else..  n 
2b20: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2b30: 65 31 36 28 64 62 2c 20 73 71 6c 2c 20 6e 63 68  e16(db, sql, nch
2b40: 61 72 73 20 2a 20 73 69 7a 65 6f 66 28 77 63 68  ars * sizeof(wch
2b50: 61 72 5f 74 29 2c 20 70 70 73 74 6d 74 2c 20 70  ar_t), ppstmt, p
2b60: 7a 74 61 69 6c 29 3b 0d 0a 23 65 6e 64 69 66 0d  ztail);..#endif.
2b70: 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49  ...#if defined(I
2b80: 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26 26  NTEROP_DEBUG) &&
2b90: 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20   (INTEROP_DEBUG 
2ba0: 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f  & INTEROP_DEBUG_
2bb0: 50 52 45 50 41 52 45 31 36 29 0d 0a 20 20 73 71  PREPARE16)..  sq
2bc0: 6c 69 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75  lite3InteropDebu
2bd0: 67 28 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  g("sqlite3_prepa
2be0: 72 65 5f 69 6e 74 65 72 6f 70 28 29 3a 20 73 71  re_interop(): sq
2bf0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28  lite3_prepare16(
2c00: 25 70 2c 20 5c 22 25 73 5c 22 2c 20 25 64 2c 20  %p, \"%s\", %d, 
2c10: 25 70 29 20 72 65 74 75 72 6e 65 64 20 25 64 2e  %p) returned %d.
2c20: 5c 6e 22 2c 20 64 62 2c 20 73 71 6c 2c 20 6e 63  \n", db, sql, nc
2c30: 68 61 72 73 2c 20 70 70 73 74 6d 74 2c 20 6e 29  hars, ppstmt, n)
2c40: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2a  ;..#endif....  *
2c50: 70 6c 65 6e 20 3d 20 28 2a 70 7a 74 61 69 6c 20  plen = (*pztail 
2c60: 21 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28  != 0) ? wcslen((
2c70: 77 63 68 61 72 5f 74 20 2a 29 2a 70 7a 74 61 69  wchar_t *)*pztai
2c80: 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61  l) * sizeof(wcha
2c90: 72 5f 74 29 20 3a 20 30 3b 0d 0a 0d 0a 20 20 72  r_t) : 0;....  r
2ca0: 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 23  eturn n;..}....#
2cb0: 69 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52  if defined(INTER
2cc0: 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
2cd0: 29 20 26 26 20 53 51 4c 49 54 45 5f 56 45 52 53  ) && SQLITE_VERS
2ce0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30  ION_NUMBER >= 30
2cf0: 30 34 30 30 31 0d 0a 53 51 4c 49 54 45 5f 41 50  04001..SQLITE_AP
2d00: 49 20 76 6f 69 64 20 2a 57 49 4e 41 50 49 20 73  I void *WINAPI s
2d10: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64 69  qlite3_create_di
2d20: 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65 5f  sposable_module_
2d30: 69 6e 74 65 72 6f 70 28 0d 0a 20 20 73 71 6c 69  interop(..  sqli
2d40: 74 65 33 20 2a 64 62 2c 0d 0a 20 20 63 6f 6e 73  te3 *db,..  cons
2d50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0d 0a  t char *zName,..
2d60: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
2d70: 20 2a 70 4d 6f 64 75 6c 65 2c 0d 0a 20 20 69 6e   *pModule,..  in
2d80: 74 20 69 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 69  t iVersion,..  i
2d90: 6e 74 20 28 2a 78 43 72 65 61 74 65 29 28 73 71  nt (*xCreate)(sq
2da0: 6c 69 74 65 33 2a 2c 20 76 6f 69 64 20 2a 2c 20  lite3*, void *, 
2db0: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  int, const char 
2dc0: 2a 63 6f 6e 73 74 2a 2c 20 73 71 6c 69 74 65 33  *const*, sqlite3
2dd0: 5f 76 74 61 62 20 2a 2a 2c 20 63 68 61 72 2a 2a  _vtab **, char**
2de0: 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e  ),..  int (*xCon
2df0: 6e 65 63 74 29 28 73 71 6c 69 74 65 33 2a 2c 20  nect)(sqlite3*, 
2e00: 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e  void *, int, con
2e10: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 2c  st char *const*,
2e20: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
2e30: 2c 20 63 68 61 72 2a 2a 29 2c 0d 0a 20 20 69 6e  , char**),..  in
2e40: 74 20 28 2a 78 42 65 73 74 49 6e 64 65 78 29 28  t (*xBestIndex)(
2e50: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c 20  sqlite3_vtab *, 
2e60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2e70: 66 6f 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78  fo*),..  int (*x
2e80: 44 69 73 63 6f 6e 6e 65 63 74 29 28 73 71 6c 69  Disconnect)(sqli
2e90: 74 65 33 5f 76 74 61 62 20 2a 29 2c 0d 0a 20 20  te3_vtab *),..  
2ea0: 69 6e 74 20 28 2a 78 44 65 73 74 72 6f 79 29 28  int (*xDestroy)(
2eb0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2c  sqlite3_vtab *),
2ec0: 0d 0a 20 20 69 6e 74 20 28 2a 78 4f 70 65 6e 29  ..  int (*xOpen)
2ed0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c  (sqlite3_vtab *,
2ee0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
2ef0: 72 73 6f 72 20 2a 2a 29 2c 0d 0a 20 20 69 6e 74  rsor **),..  int
2f00: 20 28 2a 78 43 6c 6f 73 65 29 28 73 71 6c 69 74   (*xClose)(sqlit
2f10: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
2f20: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 46 69 6c 74  ,..  int (*xFilt
2f30: 65 72 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  er)(sqlite3_vtab
2f40: 5f 63 75 72 73 6f 72 2a 2c 20 69 6e 74 2c 20 63  _cursor*, int, c
2f50: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
2f60: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
2f70: 2a 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 4e  **),..  int (*xN
2f80: 65 78 74 29 28 73 71 6c 69 74 65 33 5f 76 74 61  ext)(sqlite3_vta
2f90: 62 5f 63 75 72 73 6f 72 2a 29 2c 0d 0a 20 20 69  b_cursor*),..  i
2fa0: 6e 74 20 28 2a 78 45 6f 66 29 28 73 71 6c 69 74  nt (*xEof)(sqlit
2fb0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
2fc0: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6c 75  ,..  int (*xColu
2fd0: 6d 6e 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  mn)(sqlite3_vtab
2fe0: 5f 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69 74 65  _cursor*, sqlite
2ff0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 29  3_context*, int)
3000: 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 52 6f 77 69  ,..  int (*xRowi
3010: 64 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  d)(sqlite3_vtab_
3020: 63 75 72 73 6f 72 2a 2c 20 73 71 6c 69 74 65 33  cursor*, sqlite3
3030: 5f 69 6e 74 36 34 20 2a 29 2c 0d 0a 20 20 69 6e  _int64 *),..  in
3040: 74 20 28 2a 78 55 70 64 61 74 65 29 28 73 71 6c  t (*xUpdate)(sql
3050: 69 74 65 33 5f 76 74 61 62 20 2a 2c 20 69 6e 74  ite3_vtab *, int
3060: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3070: 2a 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  **, sqlite3_int6
3080: 34 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78  4 *),..  int (*x
3090: 42 65 67 69 6e 29 28 73 71 6c 69 74 65 33 5f 76  Begin)(sqlite3_v
30a0: 74 61 62 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28  tab *),..  int (
30b0: 2a 78 53 79 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xSync)(sqlite3_
30c0: 76 74 61 62 20 2a 29 2c 0d 0a 20 20 69 6e 74 20  vtab *),..  int 
30d0: 28 2a 78 43 6f 6d 6d 69 74 29 28 73 71 6c 69 74  (*xCommit)(sqlit
30e0: 65 33 5f 76 74 61 62 20 2a 29 2c 0d 0a 20 20 69  e3_vtab *),..  i
30f0: 6e 74 20 28 2a 78 52 6f 6c 6c 62 61 63 6b 29 28  nt (*xRollback)(
3100: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2c  sqlite3_vtab *),
3110: 0d 0a 20 20 69 6e 74 20 28 2a 78 46 69 6e 64 46  ..  int (*xFindF
3120: 75 6e 63 74 69 6f 6e 29 28 73 71 6c 69 74 65 33  unction)(sqlite3
3130: 5f 76 74 61 62 20 2a 2c 20 69 6e 74 2c 20 63 6f  _vtab *, int, co
3140: 6e 73 74 20 63 68 61 72 20 2a 2c 20 76 6f 69 64  nst char *, void
3150: 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69   (**pxFunc)(sqli
3160: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 20 69 6e  te3_context*, in
3170: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
3180: 2a 2a 29 2c 20 76 6f 69 64 20 2a 2a 70 70 41 72  **), void **ppAr
3190: 67 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 52 65  g),..  int (*xRe
31a0: 6e 61 6d 65 29 28 73 71 6c 69 74 65 33 5f 76 74  name)(sqlite3_vt
31b0: 61 62 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ab *, const char
31c0: 20 2a 29 2c 0d 0a 20 20 69 6e 74 20 28 2a 78 53   *),..  int (*xS
31d0: 61 76 65 70 6f 69 6e 74 29 28 73 71 6c 69 74 65  avepoint)(sqlite
31e0: 33 5f 76 74 61 62 20 2a 2c 20 69 6e 74 29 2c 0d  3_vtab *, int),.
31f0: 0a 20 20 69 6e 74 20 28 2a 78 52 65 6c 65 61 73  .  int (*xReleas
3200: 65 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  e)(sqlite3_vtab 
3210: 2a 2c 20 69 6e 74 29 2c 0d 0a 20 20 69 6e 74 20  *, int),..  int 
3220: 28 2a 78 52 6f 6c 6c 62 61 63 6b 54 6f 29 28 73  (*xRollbackTo)(s
3230: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c 20 69  qlite3_vtab *, i
3240: 6e 74 29 2c 0d 0a 20 20 76 6f 69 64 20 2a 70 43  nt),..  void *pC
3250: 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 76 6f  lientData,..  vo
3260: 69 64 28 2a 78 44 65 73 74 72 6f 79 4d 6f 64 75  id(*xDestroyModu
3270: 6c 65 29 28 76 6f 69 64 2a 29 0d 0a 29 7b 0d 0a  le)(void*)..){..
3280: 20 20 6d 65 6d 73 65 74 28 70 4d 6f 64 75 6c 65    memset(pModule
3290: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4d 6f  , 0, sizeof(*pMo
32a0: 64 75 6c 65 29 29 3b 0d 0a 20 20 70 4d 6f 64 75  dule));..  pModu
32b0: 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 20 3d 20 69  le->iVersion = i
32c0: 56 65 72 73 69 6f 6e 3b 0d 0a 20 20 70 4d 6f 64  Version;..  pMod
32d0: 75 6c 65 2d 3e 78 43 72 65 61 74 65 20 3d 20 78  ule->xCreate = x
32e0: 43 72 65 61 74 65 3b 0d 0a 20 20 70 4d 6f 64 75  Create;..  pModu
32f0: 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74 20 3d 20 78  le->xConnect = x
3300: 43 6f 6e 6e 65 63 74 3b 0d 0a 20 20 70 4d 6f 64  Connect;..  pMod
3310: 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 20  ule->xBestIndex 
3320: 3d 20 78 42 65 73 74 49 6e 64 65 78 3b 0d 0a 20  = xBestIndex;.. 
3330: 20 70 4d 6f 64 75 6c 65 2d 3e 78 44 69 73 63 6f   pModule->xDisco
3340: 6e 6e 65 63 74 20 3d 20 78 44 69 73 63 6f 6e 6e  nnect = xDisconn
3350: 65 63 74 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d  ect;..  pModule-
3360: 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
3370: 74 72 6f 79 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65  troy;..  pModule
3380: 2d 3e 78 4f 70 65 6e 20 3d 20 78 4f 70 65 6e 3b  ->xOpen = xOpen;
3390: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
33a0: 6f 73 65 20 3d 20 78 43 6c 6f 73 65 3b 0d 0a 20  ose = xClose;.. 
33b0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69 6c 74 65   pModule->xFilte
33c0: 72 20 3d 20 78 46 69 6c 74 65 72 3b 0d 0a 20 20  r = xFilter;..  
33d0: 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 20 3d  pModule->xNext =
33e0: 20 78 4e 65 78 74 3b 0d 0a 20 20 70 4d 6f 64 75   xNext;..  pModu
33f0: 6c 65 2d 3e 78 45 6f 66 20 3d 20 78 45 6f 66 3b  le->xEof = xEof;
3400: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  ..  pModule->xCo
3410: 6c 75 6d 6e 20 3d 20 78 43 6f 6c 75 6d 6e 3b 0d  lumn = xColumn;.
3420: 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77  .  pModule->xRow
3430: 69 64 20 3d 20 78 52 6f 77 69 64 3b 0d 0a 20 20  id = xRowid;..  
3440: 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74 65  pModule->xUpdate
3450: 20 3d 20 78 55 70 64 61 74 65 3b 0d 0a 20 20 70   = xUpdate;..  p
3460: 4d 6f 64 75 6c 65 2d 3e 78 42 65 67 69 6e 20 3d  Module->xBegin =
3470: 20 78 42 65 67 69 6e 3b 0d 0a 20 20 70 4d 6f 64   xBegin;..  pMod
3480: 75 6c 65 2d 3e 78 53 79 6e 63 20 3d 20 78 53 79  ule->xSync = xSy
3490: 6e 63 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e  nc;..  pModule->
34a0: 78 43 6f 6d 6d 69 74 20 3d 20 78 43 6f 6d 6d 69  xCommit = xCommi
34b0: 74 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  t;..  pModule->x
34c0: 52 6f 6c 6c 62 61 63 6b 20 3d 20 78 52 6f 6c 6c  Rollback = xRoll
34d0: 62 61 63 6b 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65  back;..  pModule
34e0: 2d 3e 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20  ->xFindFunction 
34f0: 3d 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 3b  = xFindFunction;
3500: 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 65  ..  pModule->xRe
3510: 6e 61 6d 65 20 3d 20 78 52 65 6e 61 6d 65 3b 0d  name = xRename;.
3520: 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 53 61 76  .  pModule->xSav
3530: 65 70 6f 69 6e 74 20 3d 20 78 53 61 76 65 70 6f  epoint = xSavepo
3540: 69 6e 74 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65 2d  int;..  pModule-
3550: 3e 78 52 65 6c 65 61 73 65 20 3d 20 78 52 65 6c  >xRelease = xRel
3560: 65 61 73 65 3b 0d 0a 20 20 70 4d 6f 64 75 6c 65  ease;..  pModule
3570: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 3d 20  ->xRollbackTo = 
3580: 78 52 6f 6c 6c 62 61 63 6b 54 6f 3b 0d 0a 20 20  xRollbackTo;..  
3590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
35a0: 72 65 61 74 65 5f 64 69 73 70 6f 73 61 62 6c 65  reate_disposable
35b0: 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d  _module(db, zNam
35c0: 65 2c 20 70 4d 6f 64 75 6c 65 2c 20 70 43 6c 69  e, pModule, pCli
35d0: 65 6e 74 44 61 74 61 2c 20 78 44 65 73 74 72 6f  entData, xDestro
35e0: 79 4d 6f 64 75 6c 65 29 3b 0d 0a 7d 0d 0a 23 65  yModule);..}..#e
35f0: 6e 64 69 66 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41  ndif....SQLITE_A
3600: 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  PI int WINAPI sq
3610: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
3620: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
3630: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
3640: 74 20 69 43 6f 6c 2c 20 64 6f 75 62 6c 65 20 2a  t iCol, double *
3650: 76 61 6c 29 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e  val)..{...return
3660: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
3670: 75 62 6c 65 28 73 74 6d 74 2c 69 43 6f 6c 2c 2a  uble(stmt,iCol,*
3680: 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  val);..}....SQLI
3690: 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50  TE_API int WINAP
36a0: 49 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  I sqlite3_bind_i
36b0: 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73 71 6c  nt64_interop(sql
36c0: 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c  ite3_stmt *stmt,
36d0: 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71 6c 69 74   int iCol, sqlit
36e0: 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0d 0a 7b  e_int64 *val)..{
36f0: 0d 0a 09 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ...return sqlite
3700: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 73 74 6d  3_bind_int64(stm
3710: 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b 0d 0a 7d  t,iCol,*val);..}
3720: 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63  ....SQLITE_API c
3730: 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41  onst char * WINA
3740: 50 49 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  PI sqlite3_bind_
3750: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 5f 69  parameter_name_i
3760: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
3770: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
3780: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d  Col, int *plen).
3790: 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .{..  const char
37a0: 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pval = sqlite3
37b0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
37c0: 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29  name(stmt, iCol)
37d0: 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76  ;..  *plen = (pv
37e0: 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65  al != 0) ? strle
37f0: 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20  n(pval) : 0;..  
3800: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d  return pval;..}.
3810: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f  ...SQLITE_API co
3820: 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50  nst char * WINAP
3830: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
3840: 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71  _name_interop(sq
3850: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
3860: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
3870: 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e  *plen)..{..  con
3880: 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20  st char *pval = 
3890: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
38a0: 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b  ame(stmt, iCol);
38b0: 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61  ..  *plen = (pva
38c0: 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e  l != 0) ? strlen
38d0: 28 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72  (pval) : 0;..  r
38e0: 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a  eturn pval;..}..
38f0: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e  ..SQLITE_API con
3900: 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49  st void * WINAPI
3910: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3920: 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28 73  name16_interop(s
3930: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
3940: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
3950: 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f   *plen)..{..  co
3960: 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d  nst void *pval =
3970: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3980: 6e 61 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f  name16(stmt, iCo
3990: 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  l);..  *plen = (
39a0: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73  pval != 0) ? wcs
39b0: 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70  len((wchar_t *)p
39c0: 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63  val) * sizeof(wc
39d0: 68 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72  har_t) : 0;..  r
39e0: 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a  eturn pval;..}..
39f0: 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e  ..SQLITE_API con
3a00: 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49  st char * WINAPI
3a10: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3a20: 64 65 63 6c 74 79 70 65 5f 69 6e 74 65 72 6f 70  decltype_interop
3a30: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73  (sqlite3_stmt *s
3a40: 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  tmt, int iCol, i
3a50: 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20  nt *plen)..{..  
3a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61 6c  const char *pval
3a70: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3a80: 6e 5f 64 65 63 6c 74 79 70 65 28 73 74 6d 74 2c  n_decltype(stmt,
3a90: 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e   iCol);..  *plen
3aa0: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
3ab0: 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20   strlen(pval) : 
3ac0: 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61  0;..  return pva
3ad0: 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  l;..}....SQLITE_
3ae0: 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  API const void *
3af0: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
3b00: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
3b10: 36 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  6_interop(sqlite
3b20: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
3b30: 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65  t iCol, int *ple
3b40: 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76  n)..{..  const v
3b50: 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69  oid *pval = sqli
3b60: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
3b70: 79 70 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c  ype16(stmt, iCol
3b80: 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70  );..  *plen = (p
3b90: 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c  val != 0) ? wcsl
3ba0: 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76  en((wchar_t *)pv
3bb0: 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68  al) * sizeof(wch
3bc0: 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65  ar_t) : 0;..  re
3bd0: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
3be0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64  .SQLITE_API void
3bf0: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
3c00: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e  column_double_in
3c10: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
3c20: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
3c30: 6f 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  ol, double *val)
3c40: 0d 0a 7b 0d 0a 09 2a 76 61 6c 20 3d 20 73 71 6c  ..{...*val = sql
3c50: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
3c60: 6c 65 28 73 74 6d 74 2c 69 43 6f 6c 29 3b 0d 0a  le(stmt,iCol);..
3c70: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
3c80: 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69  void WINAPI sqli
3c90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
3ca0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
3cb0: 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74  _stmt *stmt, int
3cc0: 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 5f 69 6e   iCol, sqlite_in
3cd0: 74 36 34 20 2a 76 61 6c 29 0d 0a 7b 0d 0a 09 2a  t64 *val)..{...*
3ce0: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
3cf0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 73 74 6d 74 2c  lumn_int64(stmt,
3d00: 69 43 6f 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  iCol);..}....SQL
3d10: 49 54 45 5f 41 50 49 20 76 6f 69 64 20 57 49 4e  ITE_API void WIN
3d20: 41 50 49 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  API sqlite3_last
3d30: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 5f 69 6e  _insert_rowid_in
3d40: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64  terop(sqlite3 *d
3d50: 62 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  b, sqlite_int64 
3d60: 2a 72 6f 77 49 64 29 0d 0a 7b 0d 0a 09 2a 72 6f  *rowId)..{...*ro
3d70: 77 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wId = sqlite3_la
3d80: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3d90: 64 62 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  db);..}....SQLIT
3da0: 45 5f 41 50 49 20 76 6f 69 64 20 57 49 4e 41 50  E_API void WINAP
3db0: 49 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  I sqlite3_memory
3dc0: 5f 75 73 65 64 5f 69 6e 74 65 72 6f 70 28 73 71  _used_interop(sq
3dd0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 6e 42 79 74  lite_int64 *nByt
3de0: 65 73 29 0d 0a 7b 0d 0a 09 2a 6e 42 79 74 65 73  es)..{...*nBytes
3df0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72   = sqlite3_memor
3e00: 79 5f 75 73 65 64 28 29 3b 0d 0a 7d 0d 0a 0d 0a  y_used();..}....
3e10: 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20  SQLITE_API void 
3e20: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  WINAPI sqlite3_m
3e30: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5f  emory_highwater_
3e40: 69 6e 74 65 72 6f 70 28 69 6e 74 20 72 65 73 65  interop(int rese
3e50: 74 46 6c 61 67 2c 20 73 71 6c 69 74 65 5f 69 6e  tFlag, sqlite_in
3e60: 74 36 34 20 2a 6e 42 79 74 65 73 29 0d 0a 7b 0d  t64 *nBytes)..{.
3e70: 0a 09 2a 6e 42 79 74 65 73 20 3d 20 73 71 6c 69  ..*nBytes = sqli
3e80: 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
3e90: 61 74 65 72 28 72 65 73 65 74 46 6c 61 67 29 3b  ater(resetFlag);
3ea0: 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50  ..}....SQLITE_AP
3eb0: 49 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  I const unsigned
3ec0: 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73   char * WINAPI s
3ed0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3ee0: 78 74 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  xt_interop(sqlit
3ef0: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
3f00: 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c  nt iCol, int *pl
3f10: 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20  en)..{..  const 
3f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3f30: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
3f40: 6c 75 6d 6e 5f 74 65 78 74 28 73 74 6d 74 2c 20  lumn_text(stmt, 
3f50: 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20  iCol);..  *plen 
3f60: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3f70: 5f 62 79 74 65 73 28 73 74 6d 74 2c 20 69 43 6f  _bytes(stmt, iCo
3f80: 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76  l);..  return pv
3f90: 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45  al;..}....SQLITE
3fa0: 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69 64 20  _API const void 
3fb0: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
3fc0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 5f 69  _column_text16_i
3fd0: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
3fe0: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
3ff0: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d  Col, int *plen).
4000: 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  .{..  const void
4010: 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pval = sqlite3
4020: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 73  _column_text16(s
4030: 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a  tmt, iCol);..  *
4040: 70 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  plen = sqlite3_c
4050: 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 73 74  olumn_bytes16(st
4060: 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 72 65  mt, iCol);..  re
4070: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
4080: 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20  .SQLITE_API int 
4090: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 66  WINAPI sqlite3_f
40a0: 69 6e 61 6c 69 7a 65 5f 69 6e 74 65 72 6f 70 28  inalize_interop(
40b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
40c0: 6d 74 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65  mt)..{..  int re
40d0: 74 3b 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t;..#if !defined
40e0: 28 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f  (INTEROP_LEGACY_
40f0: 43 4c 4f 53 45 29 20 26 26 20 53 51 4c 49 54 45  CLOSE) && SQLITE
4100: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
4110: 3e 3d 20 33 30 30 37 30 31 34 0d 0a 0d 0a 23 69  >= 3007014....#i
4120: 66 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f  f defined(INTERO
4130: 50 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e 54  P_DEBUG) && (INT
4140: 45 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e 54  EROP_DEBUG & INT
4150: 45 52 4f 50 5f 44 45 42 55 47 5f 46 49 4e 41 4c  EROP_DEBUG_FINAL
4160: 49 5a 45 29 0d 0a 20 20 56 64 62 65 20 2a 70 20  IZE)..  Vdbe *p 
4170: 3d 20 28 56 64 62 65 20 2a 29 73 74 6d 74 3b 0d  = (Vdbe *)stmt;.
4180: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4190: 20 70 2d 3e 64 62 3b 0d 0a 20 20 73 71 6c 69 74   p->db;..  sqlit
41a0: 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28 22  e3InteropDebug("
41b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
41c0: 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c  _interop(): call
41d0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ing sqlite3_fina
41e0: 6c 69 7a 65 28 25 70 2c 20 25 70 29 2e 2e 2e 5c  lize(%p, %p)...\
41f0: 6e 22 2c 20 64 62 2c 20 73 74 6d 74 29 3b 0d 0a  n", db, stmt);..
4200: 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72 65 74 20  #endif....  ret 
4210: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
4220: 7a 65 28 73 74 6d 74 29 3b 0d 0a 0d 0a 23 69 66  ze(stmt);....#if
4230: 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50   defined(INTEROP
4240: 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e 54 45  _DEBUG) && (INTE
4250: 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45  ROP_DEBUG & INTE
4260: 52 4f 50 5f 44 45 42 55 47 5f 46 49 4e 41 4c 49  ROP_DEBUG_FINALI
4270: 5a 45 29 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e  ZE)..  sqlite3In
4280: 74 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69  teropDebug("sqli
4290: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5f 69 6e 74  te3_finalize_int
42a0: 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33 5f  erop(): sqlite3_
42b0: 66 69 6e 61 6c 69 7a 65 28 25 70 2c 20 25 70 29  finalize(%p, %p)
42c0: 20 72 65 74 75 72 6e 65 64 20 25 64 2e 5c 6e 22   returned %d.\n"
42d0: 2c 20 64 62 2c 20 73 74 6d 74 2c 20 72 65 74 29  , db, stmt, ret)
42e0: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72  ;..#endif....  r
42f0: 65 74 75 72 6e 20 72 65 74 3b 0d 0a 23 65 6c 73  eturn ret;..#els
4300: 65 0d 0a 20 20 56 64 62 65 20 2a 70 3b 0d 0a 20  e..  Vdbe *p;.. 
4310: 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   ret = SQLITE_OK
4320: 3b 0d 0a 0d 0a 20 20 70 20 3d 20 28 56 64 62 65  ;....  p = (Vdbe
4330: 20 2a 29 73 74 6d 74 3b 0d 0a 20 20 69 66 20 28   *)stmt;..  if (
4340: 70 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 73 71 6c  p)..  {..    sql
4350: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4360: 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 28 64 62 20  ;....    if (db 
4370: 21 3d 20 4e 55 4c 4c 29 0d 0a 20 20 20 20 20 20  != NULL)..      
4380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4390: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d  ter(db->mutex);.
43a0: 0a 0d 0a 20 20 20 20 69 66 20 28 28 70 2d 3e 6d  ...    if ((p->m
43b0: 61 67 69 63 20 3d 3d 20 56 44 42 45 5f 4d 41 47  agic == VDBE_MAG
43c0: 49 43 5f 44 45 41 44 29 20 26 26 20 28 64 62 20  IC_DEAD) && (db 
43d0: 3d 3d 20 4e 55 4c 4c 29 29 0d 0a 20 20 20 20 7b  == NULL))..    {
43e0: 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ..      sqlite3D
43f0: 62 46 72 65 65 5f 69 6e 74 65 72 6f 70 28 64 62  bFree_interop(db
4400: 2c 20 70 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  , p);..    }..  
4410: 20 20 65 6c 73 65 0d 0a 20 20 20 20 7b 0d 0a 20    else..    {.. 
4420: 20 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74       ret = sqlit
4430: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 74 6d 74  e3_finalize(stmt
4440: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
4450: 20 69 66 20 28 64 62 20 21 3d 20 4e 55 4c 4c 29   if (db != NULL)
4460: 0d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
4470: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
4480: 6d 75 74 65 78 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a  mutex);..  }....
4490: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 23    return ret;..#
44a0: 65 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  endif..}....SQLI
44b0: 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50  TE_API int WINAP
44c0: 49 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  I sqlite3_backup
44d0: 5f 66 69 6e 69 73 68 5f 69 6e 74 65 72 6f 70 28  _finish_interop(
44e0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
44f0: 70 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65 74  p)..{..  int ret
4500: 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  ;....#if defined
4510: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20  (INTEROP_DEBUG) 
4520: 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  && (INTEROP_DEBU
4530: 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  G & INTEROP_DEBU
4540: 47 5f 42 41 43 4b 55 50 5f 46 49 4e 49 53 48 29  G_BACKUP_FINISH)
4550: 0d 0a 20 20 73 71 6c 69 74 65 33 2a 20 70 44 65  ..  sqlite3* pDe
4560: 73 74 44 62 20 3d 20 70 2d 3e 70 44 65 73 74 44  stDb = p->pDestD
4570: 62 3b 0d 0a 20 20 73 71 6c 69 74 65 33 2a 20 70  b;..  sqlite3* p
4580: 53 72 63 44 62 20 3d 20 70 2d 3e 70 53 72 63 44  SrcDb = p->pSrcD
4590: 62 3b 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74  b;..  sqlite3Int
45a0: 65 72 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74  eropDebug("sqlit
45b0: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
45c0: 5f 69 6e 74 65 72 6f 70 28 29 3a 20 63 61 6c 6c  _interop(): call
45d0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ing sqlite3_back
45e0: 75 70 5f 66 69 6e 69 73 68 28 25 70 2c 20 25 70  up_finish(%p, %p
45f0: 2c 20 25 70 29 2e 2e 2e 5c 6e 22 2c 20 70 44 65  , %p)...\n", pDe
4600: 73 74 44 62 2c 20 70 53 72 63 44 62 2c 20 70 29  stDb, pSrcDb, p)
4610: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 72  ;..#endif....  r
4620: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  et = sqlite3_bac
4630: 6b 75 70 5f 66 69 6e 69 73 68 28 70 29 3b 0d 0a  kup_finish(p);..
4640: 0d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e  ..#if defined(IN
4650: 54 45 52 4f 50 5f 44 45 42 55 47 29 20 26 26 20  TEROP_DEBUG) && 
4660: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 26  (INTEROP_DEBUG &
4670: 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 5f 42   INTEROP_DEBUG_B
4680: 41 43 4b 55 50 5f 46 49 4e 49 53 48 29 0d 0a 20  ACKUP_FINISH).. 
4690: 20 73 71 6c 69 74 65 33 49 6e 74 65 72 6f 70 44   sqlite3InteropD
46a0: 65 62 75 67 28 22 73 71 6c 69 74 65 33 5f 62 61  ebug("sqlite3_ba
46b0: 63 6b 75 70 5f 66 69 6e 69 73 68 5f 69 6e 74 65  ckup_finish_inte
46c0: 72 6f 70 28 29 3a 20 73 71 6c 69 74 65 33 5f 62  rop(): sqlite3_b
46d0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 25 70 2c  ackup_finish(%p,
46e0: 20 25 70 2c 20 25 70 29 20 72 65 74 75 72 6e 65   %p, %p) returne
46f0: 64 20 25 64 2e 5c 6e 22 2c 20 70 44 65 73 74 44  d %d.\n", pDestD
4700: 62 2c 20 70 53 72 63 44 62 2c 20 70 2c 20 72 65  b, pSrcDb, p, re
4710: 74 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20  t);..#endif.... 
4720: 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 7d 0d   return ret;..}.
4730: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e  ...SQLITE_API in
4740: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
4750: 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70 28 73  _reset_interop(s
4760: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
4770: 74 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 72 65 74  t)..{..  int ret
4780: 3b 0d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
4790: 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43  INTEROP_LEGACY_C
47a0: 4c 4f 53 45 29 20 26 26 20 53 51 4c 49 54 45 5f  LOSE) && SQLITE_
47b0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
47c0: 3d 20 33 30 30 37 30 31 34 0d 0a 0d 0a 23 69 66  = 3007014....#if
47d0: 20 64 65 66 69 6e 65 64 28 49 4e 54 45 52 4f 50   defined(INTEROP
47e0: 5f 44 45 42 55 47 29 20 26 26 20 28 49 4e 54 45  _DEBUG) && (INTE
47f0: 52 4f 50 5f 44 45 42 55 47 20 26 20 49 4e 54 45  ROP_DEBUG & INTE
4800: 52 4f 50 5f 44 45 42 55 47 5f 52 45 53 45 54 29  ROP_DEBUG_RESET)
4810: 0d 0a 20 20 73 71 6c 69 74 65 33 49 6e 74 65 72  ..  sqlite3Inter
4820: 6f 70 44 65 62 75 67 28 22 73 71 6c 69 74 65 33  opDebug("sqlite3
4830: 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70 28 29  _reset_interop()
4840: 3a 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  : calling sqlite
4850: 33 5f 72 65 73 65 74 28 25 70 29 2e 2e 2e 5c 6e  3_reset(%p)...\n
4860: 22 2c 20 73 74 6d 74 29 3b 0d 0a 23 65 6e 64 69  ", stmt);..#endi
4870: 66 0d 0a 0d 0a 20 20 72 65 74 20 3d 20 73 71 6c  f....  ret = sql
4880: 69 74 65 33 5f 72 65 73 65 74 28 73 74 6d 74 29  ite3_reset(stmt)
4890: 3b 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e 65 64  ;....#if defined
48a0: 28 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 29 20  (INTEROP_DEBUG) 
48b0: 26 26 20 28 49 4e 54 45 52 4f 50 5f 44 45 42 55  && (INTEROP_DEBU
48c0: 47 20 26 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  G & INTEROP_DEBU
48d0: 47 5f 52 45 53 45 54 29 0d 0a 20 20 73 71 6c 69  G_RESET)..  sqli
48e0: 74 65 33 49 6e 74 65 72 6f 70 44 65 62 75 67 28  te3InteropDebug(
48f0: 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 69  "sqlite3_reset_i
4900: 6e 74 65 72 6f 70 28 29 3a 20 73 71 6c 69 74 65  nterop(): sqlite
4910: 33 5f 72 65 73 65 74 28 25 70 29 20 72 65 74 75  3_reset(%p) retu
4920: 72 6e 65 64 20 25 64 2e 5c 6e 22 2c 20 73 74 6d  rned %d.\n", stm
4930: 74 2c 20 72 65 74 29 3b 0d 0a 23 65 6e 64 69 66  t, ret);..#endif
4940: 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 74  ....  return ret
4950: 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66 20 28  ;..#else..  if (
4960: 28 28 56 64 62 65 20 2a 29 73 74 6d 74 29 2d 3e  ((Vdbe *)stmt)->
4970: 6d 61 67 69 63 20 3d 3d 20 56 44 42 45 5f 4d 41  magic == VDBE_MA
4980: 47 49 43 5f 44 45 41 44 29 20 72 65 74 75 72 6e  GIC_DEAD) return
4990: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0d   SQLITE_SCHEMA;.
49a0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
49b0: 5f 72 65 73 65 74 28 73 74 6d 74 29 3b 0d 0a 20  _reset(stmt);.. 
49c0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 23 65   return ret;..#e
49d0: 6e 64 69 66 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  ndif..}....SQLIT
49e0: 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49  E_API int WINAPI
49f0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
4a00: 66 75 6e 63 74 69 6f 6e 5f 69 6e 74 65 72 6f 70  function_interop
4a10: 28 73 71 6c 69 74 65 33 20 2a 70 73 71 6c 2c 20  (sqlite3 *psql, 
4a20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
4a30: 63 74 69 6f 6e 4e 61 6d 65 2c 20 69 6e 74 20 6e  ctionName, int n
4a40: 41 72 67 2c 20 69 6e 74 20 65 54 65 78 74 52 65  Arg, int eTextRe
4a50: 70 2c 20 76 6f 69 64 20 2a 70 76 55 73 65 72 2c  p, void *pvUser,
4a60: 20 53 51 4c 49 54 45 55 53 45 52 46 55 4e 43 20   SQLITEUSERFUNC 
4a70: 66 75 6e 63 2c 20 53 51 4c 49 54 45 55 53 45 52  func, SQLITEUSER
4a80: 46 55 4e 43 20 66 75 6e 63 73 74 65 70 2c 20 53  FUNC funcstep, S
4a90: 51 4c 49 54 45 46 55 4e 43 46 49 4e 41 4c 20 66  QLITEFUNCFINAL f
4aa0: 75 6e 63 66 69 6e 61 6c 2c 20 69 6e 74 20 6e 65  uncfinal, int ne
4ab0: 65 64 43 6f 6c 6c 53 65 71 29 0d 0a 7b 0d 0a 20  edCollSeq)..{.. 
4ac0: 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 20 20 69 66 20   int n;....  if 
4ad0: 28 65 54 65 78 74 52 65 70 20 3d 3d 20 53 51 4c  (eTextRep == SQL
4ae0: 49 54 45 5f 55 54 46 31 36 29 0d 0a 20 20 20 20  ITE_UTF16)..    
4af0: 65 54 65 78 74 52 65 70 20 3d 20 53 51 4c 49 54  eTextRep = SQLIT
4b00: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0d 0a  E_UTF16NATIVE;..
4b10: 0d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ..  n = sqlite3_
4b20: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
4b30: 70 73 71 6c 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  psql, zFunctionN
4b40: 61 6d 65 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  ame, nArg, eText
4b50: 52 65 70 2c 20 30 2c 20 66 75 6e 63 2c 20 66 75  Rep, 0, func, fu
4b60: 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61  ncstep, funcfina
4b70: 6c 29 3b 0d 0a 20 20 69 66 20 28 6e 20 3d 3d 20  l);..  if (n == 
4b80: 53 51 4c 49 54 45 5f 4f 4b 29 0d 0a 20 20 7b 0d  SQLITE_OK)..  {.
4b90: 0a 20 20 20 20 69 66 20 28 6e 65 65 64 43 6f 6c  .    if (needCol
4ba0: 6c 53 65 71 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  lSeq)..    {..  
4bb0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
4bc0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
4bd0: 46 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c 20 7a  Function(psql, z
4be0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 73 74  FunctionName, st
4bf0: 72 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61  rlen(zFunctionNa
4c00: 6d 65 29 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  me), nArg, eText
4c10: 52 65 70 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20  Rep, 0);..      
4c20: 69 66 28 20 70 46 75 6e 63 20 29 0d 0a 20 20 20  if( pFunc )..   
4c30: 20 20 20 7b 0d 0a 23 69 66 20 53 51 4c 49 54 45     {..#if SQLITE
4c40: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
4c50: 3e 3d 20 33 30 30 38 30 30 31 0d 0a 20 20 20 20  >= 3008001..    
4c60: 20 20 20 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46      pFunc->funcF
4c70: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
4c80: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 3b 0d 0a 23  UNC_NEEDCOLL;..#
4c90: 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 70 46  else..        pF
4ca0: 75 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51  unc->flags |= SQ
4cb0: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
4cc0: 4c 4c 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20  LL;..#endif..   
4cd0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d     }..    }..  }
4ce0: 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d  ....  return n;.
4cf0: 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49  .}....SQLITE_API
4d00: 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c   void WINAPI sql
4d10: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
4d20: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
4d30: 33 5f 76 61 6c 75 65 20 2a 70 76 61 6c 2c 20 64  3_value *pval, d
4d40: 6f 75 62 6c 65 20 2a 76 61 6c 29 0d 0a 7b 0d 0a  ouble *val)..{..
4d50: 20 20 2a 76 61 6c 20 3d 20 73 71 6c 69 74 65 33    *val = sqlite3
4d60: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 76  _value_double(pv
4d70: 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54  al);..}....SQLIT
4d80: 45 5f 41 50 49 20 76 6f 69 64 20 57 49 4e 41 50  E_API void WINAP
4d90: 49 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  I sqlite3_value_
4da0: 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73 71  int64_interop(sq
4db0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 76 61  lite3_value *pva
4dc0: 6c 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  l, sqlite_int64 
4dd0: 2a 76 61 6c 29 0d 0a 7b 0d 0a 20 20 2a 76 61 6c  *val)..{..  *val
4de0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4df0: 5f 69 6e 74 36 34 28 70 76 61 6c 29 3b 0d 0a 7d  _int64(pval);..}
4e00: 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 63  ....SQLITE_API c
4e10: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4e20: 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69  ar * WINAPI sqli
4e30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 5f 69  te3_value_text_i
4e40: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 76  nterop(sqlite3_v
4e50: 61 6c 75 65 20 2a 76 61 6c 2c 20 69 6e 74 20 2a  alue *val, int *
4e60: 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73  plen)..{..  cons
4e70: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4e80: 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *pval = sqlite3_
4e90: 76 61 6c 75 65 5f 74 65 78 74 28 76 61 6c 29 3b  value_text(val);
4ea0: 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 73 71 6c 69  ..  *plen = sqli
4eb0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
4ec0: 76 61 6c 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20  val);..  return 
4ed0: 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  pval;..}....SQLI
4ee0: 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69  TE_API const voi
4ef0: 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  d * WINAPI sqlit
4f00: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 5f  e3_value_text16_
4f10: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f  interop(sqlite3_
4f20: 76 61 6c 75 65 20 2a 76 61 6c 2c 20 69 6e 74 20  value *val, int 
4f30: 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e  *plen)..{..  con
4f40: 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20  st void *pval = 
4f50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4f60: 78 74 31 36 28 76 61 6c 29 3b 0d 0a 20 20 2a 70  xt16(val);..  *p
4f70: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  len = sqlite3_va
4f80: 6c 75 65 5f 62 79 74 65 73 31 36 28 76 61 6c 29  lue_bytes16(val)
4f90: 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  ;..  return pval
4fa0: 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41  ;..}....SQLITE_A
4fb0: 50 49 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73  PI void WINAPI s
4fc0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
4fd0: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  uble_interop(sql
4fe0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 63  ite3_context *pc
4ff0: 74 78 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  tx, double *val)
5000: 0d 0a 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 72  ..{..  sqlite3_r
5010: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 63 74  esult_double(pct
5020: 78 2c 20 2a 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a  x, *val);..}....
5030: 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20  SQLITE_API void 
5040: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 72  WINAPI sqlite3_r
5050: 65 73 75 6c 74 5f 69 6e 74 36 34 5f 69 6e 74 65  esult_int64_inte
5060: 72 6f 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  rop(sqlite3_cont
5070: 65 78 74 20 2a 70 63 74 78 2c 20 73 71 6c 69 74  ext *pctx, sqlit
5080: 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0d 0a 7b  e_int64 *val)..{
5090: 0d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
50a0: 6c 74 5f 69 6e 74 36 34 28 70 63 74 78 2c 20 2a  lt_int64(pctx, *
50b0: 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  val);..}....SQLI
50c0: 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41 50  TE_API int WINAP
50d0: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  I sqlite3_contex
50e0: 74 5f 63 6f 6c 6c 63 6f 6d 70 61 72 65 5f 69 6e  t_collcompare_in
50f0: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 63 6f  terop(sqlite3_co
5100: 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
5110: 74 20 76 6f 69 64 20 2a 70 31 2c 20 69 6e 74 20  t void *p1, int 
5120: 70 31 6c 65 6e 2c 20 63 6f 6e 73 74 20 76 6f 69  p1len, const voi
5130: 64 20 2a 70 32 2c 20 69 6e 74 20 70 32 6c 65 6e  d *p2, int p2len
5140: 29 0d 0a 7b 0d 0a 23 69 66 20 53 51 4c 49 54 45  )..{..#if SQLITE
5150: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
5160: 3e 3d 20 33 30 30 38 30 30 31 0d 0a 20 20 69 66  >= 3008001..  if
5170: 20 28 28 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66   ((ctx->pFunc->f
5180: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5190: 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
51a0: 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 20 32 3b   == 0) return 2;
51b0: 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66 20 28 28  ..#else..  if ((
51c0: 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67  ctx->pFunc->flag
51d0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
51e0: 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20  NEEDCOLL) == 0) 
51f0: 72 65 74 75 72 6e 20 32 3b 0d 0a 23 65 6e 64 69  return 2;..#endi
5200: 66 0d 0a 20 20 72 65 74 75 72 6e 20 63 74 78 2d  f..  return ctx-
5210: 3e 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 63 74 78  >pColl->xCmp(ctx
5220: 2d 3e 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  ->pColl->pUser, 
5230: 70 31 6c 65 6e 2c 20 70 31 2c 20 70 32 6c 65 6e  p1len, p1, p2len
5240: 2c 20 70 32 29 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  , p2);..}....SQL
5250: 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 63 68  ITE_API const ch
5260: 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69  ar * WINAPI sqli
5270: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c  te3_context_coll
5280: 73 65 71 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  seq_interop(sqli
5290: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
52a0: 2c 20 69 6e 74 20 2a 70 74 79 70 65 2c 20 69 6e  , int *ptype, in
52b0: 74 20 2a 65 6e 63 2c 20 69 6e 74 20 2a 70 6c 65  t *enc, int *ple
52c0: 6e 29 0d 0a 7b 0d 0a 20 20 43 6f 6c 6c 53 65 71  n)..{..  CollSeq
52d0: 20 2a 70 43 6f 6c 6c 20 3d 20 63 74 78 2d 3e 70   *pColl = ctx->p
52e0: 43 6f 6c 6c 3b 0d 0a 20 20 2a 70 74 79 70 65 20  Coll;..  *ptype 
52f0: 3d 20 30 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20  = 0;..  *plen = 
5300: 30 3b 0d 0a 20 20 2a 65 6e 63 20 3d 20 30 3b 0d  0;..  *enc = 0;.
5310: 0a 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45  ...#if SQLITE_VE
5320: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
5330: 33 30 30 38 30 30 31 0d 0a 20 20 69 66 20 28 28  3008001..  if ((
5340: 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  ctx->pFunc->func
5350: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
5360: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d  UNC_NEEDCOLL) ==
5370: 20 30 29 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b   0) return NULL;
5380: 0d 0a 23 65 6c 73 65 0d 0a 20 20 69 66 20 28 28  ..#else..  if ((
5390: 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67  ctx->pFunc->flag
53a0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
53b0: 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20  NEEDCOLL) == 0) 
53c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 23 65  return NULL;..#e
53d0: 6e 64 69 66 0d 0a 0d 0a 20 20 69 66 20 28 70 43  ndif....  if (pC
53e0: 6f 6c 6c 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 2a  oll)..  {..    *
53f0: 65 6e 63 20 3d 20 70 43 6f 6c 6c 2d 3e 65 6e 63  enc = pColl->enc
5400: 3b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45  ;..#if SQLITE_VE
5410: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 33  RSION_NUMBER < 3
5420: 30 30 37 30 31 30 0d 0a 20 20 20 20 2a 70 74 79  007010..    *pty
5430: 70 65 20 3d 20 70 43 6f 6c 6c 2d 3e 74 79 70 65  pe = pColl->type
5440: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 2a  ;..#endif..    *
5450: 70 6c 65 6e 20 3d 20 28 70 43 6f 6c 6c 2d 3e 7a  plen = (pColl->z
5460: 4e 61 6d 65 20 21 3d 20 30 29 20 3f 20 73 74 72  Name != 0) ? str
5470: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
5480: 29 20 3a 20 30 3b 0d 0a 0d 0a 20 20 20 20 72 65  ) : 0;....    re
5490: 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  turn pColl->zNam
54a0: 65 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72  e;..  }..  retur
54b0: 6e 20 4e 55 4c 4c 3b 0d 0a 7d 0d 0a 0d 0a 53 51  n NULL;..}....SQ
54c0: 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 63  LITE_API const c
54d0: 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c  har * WINAPI sql
54e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
54f0: 62 61 73 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  base_name_intero
5500: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
5510: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
5520: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
5530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61   const char *pva
5540: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
5550: 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
5560: 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20  (stmt, iCol);.. 
5570: 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21   *plen = (pval !
5580: 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70 76  = 0) ? strlen(pv
5590: 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75  al) : 0;..  retu
55a0: 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53  rn pval;..}....S
55b0: 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73 74 20  QLITE_API const 
55c0: 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73 71  void * WINAPI sq
55d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
55e0: 61 62 61 73 65 5f 6e 61 6d 65 31 36 5f 69 6e 74  abase_name16_int
55f0: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
5600: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
5610: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b  l, int *plen)..{
5620: 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
5630: 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pval = sqlite3_c
5640: 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
5650: 61 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c  ame16(stmt, iCol
5660: 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70  );..  *plen = (p
5670: 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c  val != 0) ? wcsl
5680: 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76  en((wchar_t *)pv
5690: 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68  al) * sizeof(wch
56a0: 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65  ar_t) : 0;..  re
56b0: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
56c0: 0a 53 51 4c 49 54 45 5f 41 50 49 20 63 6f 6e 73  .SQLITE_API cons
56d0: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
56e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
56f0: 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  able_name_intero
5700: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
5710: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
5720: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
5730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61   const char *pva
5740: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
5750: 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74  mn_table_name(st
5760: 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70  mt, iCol);..  *p
5770: 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30  len = (pval != 0
5780: 29 20 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c 29  ) ? strlen(pval)
5790: 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20   : 0;..  return 
57a0: 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49  pval;..}....SQLI
57b0: 54 45 5f 41 50 49 20 63 6f 6e 73 74 20 76 6f 69  TE_API const voi
57c0: 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  d * WINAPI sqlit
57d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
57e0: 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28 73  name16_interop(s
57f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
5800: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
5810: 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f   *plen)..{..  co
5820: 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d  nst void *pval =
5830: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5840: 74 61 62 6c 65 5f 6e 61 6d 65 31 36 28 73 74 6d  table_name16(stm
5850: 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c  t, iCol);..  *pl
5860: 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29  en = (pval != 0)
5870: 20 3f 20 77 63 73 6c 65 6e 28 28 77 63 68 61 72   ? wcslen((wchar
5880: 5f 74 20 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a  _t *)pval) * siz
5890: 65 6f 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30  eof(wchar_t) : 0
58a0: 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  ;..  return pval
58b0: 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41  ;..}....SQLITE_A
58c0: 50 49 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  PI const char * 
58d0: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63  WINAPI sqlite3_c
58e0: 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
58f0: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
5900: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
5910: 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65  t iCol, int *ple
5920: 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 63  n)..{..  const c
5930: 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69  har *pval = sqli
5940: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
5950: 6e 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f  n_name(stmt, iCo
5960: 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  l);..  *plen = (
5970: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72  pval != 0) ? str
5980: 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0d 0a  len(pval) : 0;..
5990: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a    return pval;..
59a0: 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20  }....SQLITE_API 
59b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57 49 4e  const void * WIN
59c0: 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  API sqlite3_colu
59d0: 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
59e0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
59f0: 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74  _stmt *stmt, int
5a00: 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e   iCol, int *plen
5a10: 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f  )..{..  const vo
5a20: 69 64 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74  id *pval = sqlit
5a30: 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
5a40: 5f 6e 61 6d 65 31 36 28 73 74 6d 74 2c 20 69 43  _name16(stmt, iC
5a50: 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20  ol);..  *plen = 
5a60: 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63  (pval != 0) ? wc
5a70: 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29  slen((wchar_t *)
5a80: 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77  pval) * sizeof(w
5a90: 63 68 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20  char_t) : 0;..  
5aa0: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d  return pval;..}.
5ab0: 0a 0d 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e  ...SQLITE_API in
5ac0: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
5ad0: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
5ae0: 74 61 64 61 74 61 5f 69 6e 74 65 72 6f 70 28 73  tadata_interop(s
5af0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5b00: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
5b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
5b20: 62 6c 65 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  bleName, const c
5b30: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
5b40: 2c 20 63 68 61 72 20 2a 2a 70 7a 44 61 74 61 54  , char **pzDataT
5b50: 79 70 65 2c 20 63 68 61 72 20 2a 2a 70 7a 43 6f  ype, char **pzCo
5b60: 6c 6c 53 65 71 2c 20 69 6e 74 20 2a 70 4e 6f 74  llSeq, int *pNot
5b70: 4e 75 6c 6c 2c 20 69 6e 74 20 2a 70 50 72 69 6d  Null, int *pPrim
5b80: 61 72 79 4b 65 79 2c 20 69 6e 74 20 2a 70 41 75  aryKey, int *pAu
5b90: 74 6f 69 6e 63 2c 20 69 6e 74 20 2a 70 64 74 4c  toinc, int *pdtL
5ba0: 65 6e 2c 20 69 6e 74 20 2a 70 63 73 4c 65 6e 29  en, int *pcsLen)
5bb0: 0d 0a 7b 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 0d  ..{..  int n;...
5bc0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 74  .  n = sqlite3_t
5bd0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
5be0: 64 61 74 61 28 64 62 2c 20 7a 44 62 4e 61 6d 65  data(db, zDbName
5bf0: 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43  , zTableName, zC
5c00: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 70 7a 44 61 74  olumnName, pzDat
5c10: 61 54 79 70 65 2c 20 70 7a 43 6f 6c 6c 53 65 71  aType, pzCollSeq
5c20: 2c 20 70 4e 6f 74 4e 75 6c 6c 2c 20 70 50 72 69  , pNotNull, pPri
5c30: 6d 61 72 79 4b 65 79 2c 20 70 41 75 74 6f 69 6e  maryKey, pAutoin
5c40: 63 29 3b 0d 0a 20 20 2a 70 64 74 4c 65 6e 20 3d  c);..  *pdtLen =
5c50: 20 28 2a 70 7a 44 61 74 61 54 79 70 65 20 21 3d   (*pzDataType !=
5c60: 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 2a 70 7a   0) ? strlen(*pz
5c70: 44 61 74 61 54 79 70 65 29 20 3a 20 30 3b 0d 0a  DataType) : 0;..
5c80: 20 20 2a 70 63 73 4c 65 6e 20 3d 20 28 2a 70 7a    *pcsLen = (*pz
5c90: 43 6f 6c 6c 53 65 71 20 21 3d 20 30 29 20 3f 20  CollSeq != 0) ? 
5ca0: 73 74 72 6c 65 6e 28 2a 70 7a 43 6f 6c 6c 53 65  strlen(*pzCollSe
5cb0: 71 29 20 3a 20 30 3b 0d 0a 0d 0a 20 20 72 65 74  q) : 0;....  ret
5cc0: 75 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  urn n;..}....SQL
5cd0: 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41  ITE_API int WINA
5ce0: 50 49 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  PI sqlite3_index
5cf0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 66 6f 5f 69 6e 74  _column_info_int
5d00: 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62  erop(sqlite3 *db
5d10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
5d20: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5d30: 49 6e 64 65 78 4e 61 6d 65 2c 20 63 6f 6e 73 74  IndexName, const
5d40: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
5d50: 6d 65 2c 20 69 6e 74 20 2a 73 6f 72 74 4f 72 64  me, int *sortOrd
5d60: 65 72 2c 20 69 6e 74 20 2a 6f 6e 45 72 72 6f 72  er, int *onError
5d70: 2c 20 63 68 61 72 20 2a 2a 70 7a 43 6f 6c 6c 2c  , char **pzColl,
5d80: 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a   int *plen)..{..
5d90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0d 0a    Index *pIdx;..
5da0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0d 0a    Table *pTab;..
5db0: 20 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 20 20 73 71    int n;....  sq
5dc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5dd0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20  r(db->mutex);.. 
5de0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
5df0: 65 72 41 6c 6c 28 64 62 29 3b 0d 0a 0d 0a 20 20  erAll(db);....  
5e00: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
5e10: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e 64  ndIndex(db, zInd
5e20: 65 78 4e 61 6d 65 2c 20 7a 44 62 29 3b 0d 0a 0d  exName, zDb);...
5e30: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
5e40: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0d 0a 20 20  eaveAll(db);..  
5e50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5e60: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d  ave(db->mutex);.
5e70: 0a 0d 0a 20 20 69 66 20 28 21 70 49 64 78 29 20  ...  if (!pIdx) 
5e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5e90: 52 4f 52 3b 0d 0a 0d 0a 20 20 70 54 61 62 20 3d  ROR;....  pTab =
5ea0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0d 0a   pIdx->pTable;..
5eb0: 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b 20 6e 20    for (n = 0; n 
5ec0: 3c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  < pIdx->nColumn;
5ed0: 20 6e 2b 2b 29 0d 0a 20 20 7b 0d 0a 20 20 20 20   n++)..  {..    
5ee0: 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  int cnum = pIdx-
5ef0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 3b 0d 0a 20  >aiColumn[n];.. 
5f00: 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 53 74     if (sqlite3St
5f10: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
5f20: 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  [cnum].zName, zC
5f30: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 3d 3d 20 30 29  olumnName) == 0)
5f40: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 2a  ..    {..      *
5f50: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  sortOrder = pIdx
5f60: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 5d 3b  ->aSortOrder[n];
5f70: 0d 0a 20 20 20 20 20 20 2a 70 7a 43 6f 6c 6c 20  ..      *pzColl 
5f80: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  = pIdx->azColl[n
5f90: 5d 3b 0d 0a 20 20 20 20 20 20 2a 70 6c 65 6e 20  ];..      *plen 
5fa0: 3d 20 73 74 72 6c 65 6e 28 2a 70 7a 43 6f 6c 6c  = strlen(*pzColl
5fb0: 29 3b 0d 0a 20 20 20 20 20 20 2a 6f 6e 45 72 72  );..      *onErr
5fc0: 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72  or = pIdx->onErr
5fd0: 6f 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74  or;....      ret
5fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a  urn SQLITE_OK;..
5ff0: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65      }..  }..  re
6000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6010: 52 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c 49 54 45 5f  R;..}....SQLITE_
6020: 41 50 49 20 69 6e 74 20 57 49 4e 41 50 49 20 73  API int WINAPI s
6030: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 75 72  qlite3_table_cur
6040: 73 6f 72 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  sor_interop(sqli
6050: 74 65 33 5f 73 74 6d 74 20 2a 70 73 74 6d 74 2c  te3_stmt *pstmt,
6060: 20 69 6e 74 20 69 44 62 2c 20 50 67 6e 6f 20 74   int iDb, Pgno t
6070: 61 62 6c 65 52 6f 6f 74 50 61 67 65 29 0d 0a 7b  ableRootPage)..{
6080: 0d 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28 56  ..  Vdbe *p = (V
6090: 64 62 65 20 2a 29 70 73 74 6d 74 3b 0d 0a 20 20  dbe *)pstmt;..  
60a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 70  sqlite3 *db = (p
60b0: 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 4e 55 4c 4c   == NULL) ? NULL
60c0: 20 3a 20 70 2d 3e 64 62 3b 0d 0a 20 20 69 6e 74   : p->db;..  int
60d0: 20 6e 3b 0d 0a 20 20 69 6e 74 20 72 65 74 20 3d   n;..  int ret =
60e0: 20 2d 31 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65   -1;....  sqlite
60f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6100: 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 66 6f 72  ->mutex);..  for
6110: 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70 2d 3e   (n = 0; n < p->
6120: 6e 43 75 72 73 6f 72 20 26 26 20 70 2d 3e 61 70  nCursor && p->ap
6130: 43 73 72 5b 6e 5d 20 21 3d 20 4e 55 4c 4c 3b 20  Csr[n] != NULL; 
6140: 6e 2b 2b 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 69  n++)..  {..    i
6150: 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d 3e  f (p->apCsr[n]->
6160: 69 73 54 61 62 6c 65 20 3d 3d 20 46 41 4c 53 45  isTable == FALSE
6170: 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20  ) continue;..   
6180: 20 69 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d   if (p->apCsr[n]
6190: 2d 3e 69 44 62 20 21 3d 20 69 44 62 29 20 63 6f  ->iDb != iDb) co
61a0: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69 66 20  ntinue;..    if 
61b0: 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d 3e 70 43  (p->apCsr[n]->pC
61c0: 75 72 73 6f 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  ursor->pgnoRoot 
61d0: 3d 3d 20 74 61 62 6c 65 52 6f 6f 74 50 61 67 65  == tableRootPage
61e0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
61f0: 72 65 74 20 3d 20 6e 3b 0d 0a 20 20 20 20 20 20  ret = n;..      
6200: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20  break;..    }.. 
6210: 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
6220: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6230: 74 65 78 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 72  tex);....  retur
6240: 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 53 51 4c  n ret;..}....SQL
6250: 49 54 45 5f 41 50 49 20 69 6e 74 20 57 49 4e 41  ITE_API int WINA
6260: 50 49 20 73 71 6c 69 74 65 33 5f 63 75 72 73 6f  PI sqlite3_curso
6270: 72 5f 72 6f 77 69 64 5f 69 6e 74 65 72 6f 70 28  r_rowid_interop(
6280: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 73  sqlite3_stmt *ps
6290: 74 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f 72 2c  tmt, int cursor,
62a0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
62b0: 72 6f 77 69 64 29 0d 0a 7b 0d 0a 20 20 56 64 62  rowid)..{..  Vdb
62c0: 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29 70  e *p = (Vdbe *)p
62d0: 73 74 6d 74 3b 0d 0a 20 20 73 71 6c 69 74 65 33  stmt;..  sqlite3
62e0: 20 2a 64 62 20 3d 20 28 70 20 3d 3d 20 4e 55 4c   *db = (p == NUL
62f0: 4c 29 20 3f 20 4e 55 4c 4c 20 3a 20 70 2d 3e 64  L) ? NULL : p->d
6300: 62 3b 0d 0a 20 20 56 64 62 65 43 75 72 73 6f 72  b;..  VdbeCursor
6310: 20 2a 70 43 3b 0d 0a 20 20 69 6e 74 20 72 65 74   *pC;..  int ret
6320: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 0d   = SQLITE_OK;...
6330: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6340: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6350: 29 3b 0d 0a 20 20 77 68 69 6c 65 20 28 31 29 0d  );..  while (1).
6360: 0a 20 20 7b 0d 0a 20 20 20 20 69 66 20 28 63 75  .  {..    if (cu
6370: 72 73 6f 72 20 3c 20 30 20 7c 7c 20 63 75 72 73  rsor < 0 || curs
6380: 6f 72 20 3e 3d 20 70 2d 3e 6e 43 75 72 73 6f 72  or >= p->nCursor
6390: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
63a0: 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  ret = SQLITE_ERR
63b0: 4f 52 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b  OR;..      break
63c0: 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  ;..    }..    if
63d0: 20 28 70 2d 3e 61 70 43 73 72 5b 63 75 72 73 6f   (p->apCsr[curso
63e0: 72 5d 20 3d 3d 20 4e 55 4c 4c 29 0d 0a 20 20 20  r] == NULL)..   
63f0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 20 3d 20   {..      ret = 
6400: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a 20  SQLITE_ERROR;.. 
6410: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
6420: 20 7d 0d 0a 0d 0a 20 20 20 20 70 43 20 3d 20 70   }....    pC = p
6430: 2d 3e 61 70 43 73 72 5b 63 75 72 73 6f 72 5d 3b  ->apCsr[cursor];
6440: 0d 0a 0d 0a 20 20 20 20 72 65 74 20 3d 20 73 71  ....    ret = sq
6450: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
6460: 6f 76 65 74 6f 28 70 43 29 3b 0d 0a 20 20 20 20  oveto(pC);..    
6470: 69 66 28 72 65 74 29 0d 0a 20 20 20 20 20 20 62  if(ret)..      b
6480: 72 65 61 6b 3b 0d 0a 0d 0a 20 20 20 20 69 66 28  reak;....    if(
6490: 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
64a0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
64b0: 2a 70 72 6f 77 69 64 20 3d 20 70 43 2d 3e 6c 61  *prowid = pC->la
64c0: 73 74 52 6f 77 69 64 3b 0d 0a 20 20 20 20 7d 0d  stRowid;..    }.
64d0: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 70 43 2d  .    else if(pC-
64e0: 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20  >pseudoTableReg 
64f0: 3e 20 30 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  > 0)..    {..   
6500: 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f     ret = SQLITE_
6510: 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 62 72  ERROR;..      br
6520: 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  eak;..    }..   
6530: 20 65 6c 73 65 20 69 66 28 70 43 2d 3e 6e 75 6c   else if(pC->nul
6540: 6c 52 6f 77 20 7c 7c 20 70 43 2d 3e 70 43 75 72  lRow || pC->pCur
6550: 73 6f 72 3d 3d 30 29 0d 0a 20 20 20 20 7b 0d 0a  sor==0)..    {..
6560: 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c 49        ret = SQLI
6570: 54 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20  TE_ERROR;..     
6580: 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a   break;..    }..
6590: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 7b 0d      else..    {.
65a0: 0a 20 20 20 20 20 20 69 66 20 28 70 43 2d 3e 70  .      if (pC->p
65b0: 43 75 72 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0d  Cursor == NULL).
65c0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
65d0: 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 45    ret = SQLITE_E
65e0: 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20 20 20 62  RROR;..        b
65f0: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  reak;..      }..
6600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6610: 65 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43  eeKeySize(pC->pC
6620: 75 72 73 6f 72 2c 20 70 72 6f 77 69 64 29 3b 0d  ursor, prowid);.
6630: 0a 20 20 20 20 20 20 2a 70 72 6f 77 69 64 20 3d  .      *prowid =
6640: 20 2a 70 72 6f 77 69 64 3b 0d 0a 20 20 20 20 7d   *prowid;..    }
6650: 0d 0a 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20  ..    break;..  
6660: 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
6670: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6680: 65 78 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  ex);....  return
6690: 20 72 65 74 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66   ret;..}..#endif
66a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
66b0: 4e 20 2a 2f 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a  N */..../*******
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6700: 2a 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 2f 2a 0d 0a 2a  ******/..../*..*
6710: 2a 20 54 68 65 20 49 4e 54 45 52 4f 50 5f 54 45  * The INTEROP_TE
6720: 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 62 6c 6f  ST_EXTENSION blo
6730: 63 6b 20 6d 75 73 74 20 62 65 20 61 74 20 74 68  ck must be at th
6740: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 73 6f  e end of this so
6750: 75 72 63 65 20 66 69 6c 65 0d 0a 2a 2a 20 62 65  urce file..** be
6760: 63 61 75 73 65 20 69 74 20 69 6e 63 6c 75 64 65  cause it include
6770: 73 20 74 68 65 20 22 73 71 6c 69 74 65 33 65 78  s the "sqlite3ex
6780: 74 2e 68 22 20 66 69 6c 65 2c 20 77 68 69 63 68  t.h" file, which
6790: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 71 6c   defines the sql
67a0: 69 74 65 33 0d 0a 2a 2a 20 70 75 62 6c 69 63 20  ite3..** public 
67b0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  API function nam
67c0: 65 73 20 74 6f 20 62 65 20 6d 61 63 72 6f 73 20  es to be macros 
67d0: 61 6e 64 20 74 68 61 74 20 77 6f 75 6c 64 20 63  and that would c
67e0: 61 75 73 65 20 74 68 65 20 63 6f 64 65 0d 0a 2a  ause the code..*
67f0: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f 69  * above this poi
6800: 6e 74 20 74 6f 20 6d 61 6c 66 75 6e 63 74 69 6f  nt to malfunctio
6810: 6e 2e 0d 0a 2a 2f 0d 0a 23 69 66 20 64 65 66 69  n...*/..#if defi
6820: 6e 65 64 28 49 4e 54 45 52 4f 50 5f 54 45 53 54  ned(INTEROP_TEST
6830: 5f 45 58 54 45 4e 53 49 4f 4e 29 0d 0a 23 69 6e  _EXTENSION)..#in
6840: 63 6c 75 64 65 20 22 2e 2e 2f 63 6f 72 65 2f 73  clude "../core/s
6850: 71 6c 69 74 65 33 65 78 74 2e 68 22 0d 0a 53 51  qlite3ext.h"..SQ
6860: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6870: 4e 49 54 31 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54  NIT1..../*..** T
6880: 68 65 20 69 6e 74 65 72 6f 70 54 65 73 74 28 29  he interopTest()
6890: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 65   SQL function re
68a0: 74 75 72 6e 73 20 69 74 73 20 66 69 72 73 74 20  turns its first 
68b0: 61 72 67 75 6d 65 6e 74 20 6f 72 20 72 61 69 73  argument or rais
68c0: 65 73 20 61 6e 0d 0a 2a 2a 20 65 72 72 6f 72 20  es an..** error 
68d0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 74  if there are not
68e0: 20 65 6e 6f 75 67 68 20 61 72 67 75 6d 65 6e 74   enough argument
68f0: 73 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 50  s...*/..SQLITE_P
6900: 52 49 56 41 54 45 20 76 6f 69 64 20 69 6e 74 65  RIVATE void inte
6910: 72 6f 70 54 65 73 74 46 75 6e 63 28 0d 0a 20 20  ropTestFunc(..  
6920: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6930: 2a 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 69 6e 74  *context,..  int
6940: 20 61 72 67 63 2c 0d 0a 20 20 73 71 6c 69 74 65   argc,..  sqlite
6950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0d 0a  3_value **argv..
6960: 29 7b 0d 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ){..  const unsi
6970: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0d 0a 20  gned char *z;.. 
6980: 20 69 66 28 20 61 72 67 63 21 3d 31 20 29 7b 0d   if( argc!=1 ){.
6990: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
69a0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
69b0: 74 2c 20 22 6e 65 65 64 20 65 78 61 63 74 6c 79  t, "need exactly
69c0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 22 2c 20   one argument", 
69d0: 2d 31 29 3b 0d 0a 20 20 20 20 72 65 74 75 72 6e  -1);..    return
69e0: 3b 0d 0a 20 20 7d 0d 0a 20 20 7a 20 3d 20 73 71  ;..  }..  z = sq
69f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6a00: 28 61 72 67 76 5b 30 5d 29 3b 0d 0a 20 20 69 66  (argv[0]);..  if
6a10: 28 20 7a 20 29 7b 0d 0a 20 20 20 20 73 71 6c 69  ( z ){..    sqli
6a20: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6a30: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
6a40: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  z, -1, SQLITE_ST
6a50: 41 54 49 43 29 3b 0d 0a 20 20 7d 65 6c 73 65 7b  ATIC);..  }else{
6a60: 0d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ..    sqlite3_re
6a70: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
6a80: 74 29 3b 0d 0a 20 20 7d 0d 0a 7d 0d 0a 0d 0a 2f  t);..  }..}..../
6a90: 2a 0d 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 6f  *..** The intero
6aa0: 70 53 6c 65 65 70 28 29 20 53 51 4c 20 66 75 6e  pSleep() SQL fun
6ab0: 63 74 69 6f 6e 20 77 61 69 74 73 20 74 68 65 20  ction waits the 
6ac0: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
6ad0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
6ae0: 0d 0a 2a 2a 20 6f 72 20 72 61 69 73 65 73 20 61  ..** or raises a
6af0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 72 65  n error if there
6b00: 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20   are not enough 
6b10: 61 72 67 75 6d 65 6e 74 73 2e 0d 0a 2a 2f 0d 0a  arguments...*/..
6b20: 53 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 76  SQLITE_PRIVATE v
6b30: 6f 69 64 20 69 6e 74 65 72 6f 70 53 6c 65 65 70  oid interopSleep
6b40: 46 75 6e 63 28 0d 0a 20 20 73 71 6c 69 74 65 33  Func(..  sqlite3
6b50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6b60: 74 2c 0d 0a 20 20 69 6e 74 20 61 72 67 63 2c 0d  t,..  int argc,.
6b70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6b80: 20 2a 2a 61 72 67 76 0d 0a 29 7b 0d 0a 20 20 69   **argv..){..  i
6b90: 6e 74 20 6d 3b 0d 0a 20 20 69 66 28 20 61 72 67  nt m;..  if( arg
6ba0: 63 21 3d 31 20 29 7b 0d 0a 20 20 20 20 73 71 6c  c!=1 ){..    sql
6bb0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6bc0: 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 65 65 64  r(context, "need
6bd0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 61 72 67   exactly one arg
6be0: 75 6d 65 6e 74 22 2c 20 2d 31 29 3b 0d 0a 20 20  ument", -1);..  
6bf0: 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 7d 0d 0a    return;..  }..
6c00: 20 20 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    m = sqlite3_va
6c10: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
6c20: 3b 0d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
6c30: 5f 57 49 4e 43 45 0d 0a 20 20 53 6c 65 65 70 28  _WINCE..  Sleep(
6c40: 6d 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 72  m);..  sqlite3_r
6c50: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
6c60: 74 2c 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  t, WAIT_OBJECT_0
6c70: 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 73 71 6c  );..#else..  sql
6c80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
6c90: 63 6f 6e 74 65 78 74 2c 20 53 6c 65 65 70 45 78  context, SleepEx
6ca0: 28 6d 2c 20 54 52 55 45 29 29 3b 0d 0a 23 65 6e  (m, TRUE));..#en
6cb0: 64 69 66 0d 0a 7d 0d 0a 0d 0a 2f 2a 20 53 51 4c  dif..}..../* SQL
6cc0: 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 69 73  ite invokes this
6cd0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 77 68   routine once wh
6ce0: 65 6e 20 69 74 20 6c 6f 61 64 73 20 74 68 65 20  en it loads the 
6cf0: 65 78 74 65 6e 73 69 6f 6e 2e 0d 0a 2a 2a 20 43  extension...** C
6d00: 72 65 61 74 65 20 6e 65 77 20 66 75 6e 63 74 69  reate new functi
6d10: 6f 6e 73 2c 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ons, collating s
6d20: 65 71 75 65 6e 63 65 73 2c 20 61 6e 64 20 76 69  equences, and vi
6d30: 72 74 75 61 6c 20 74 61 62 6c 65 0d 0a 2a 2a 20  rtual table..** 
6d40: 6d 6f 64 75 6c 65 73 20 68 65 72 65 2e 20 20 54  modules here.  T
6d50: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74  his is usually t
6d60: 68 65 20 6f 6e 6c 79 20 65 78 70 6f 72 74 65 64  he only exported
6d70: 20 73 79 6d 62 6f 6c 20 69 6e 0d 0a 2a 2a 20 74   symbol in..** t
6d80: 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
6d90: 79 2e 0d 0a 2a 2f 0d 0a 53 51 4c 49 54 45 5f 41  y...*/..SQLITE_A
6da0: 50 49 20 69 6e 74 20 69 6e 74 65 72 6f 70 5f 74  PI int interop_t
6db0: 65 73 74 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e  est_extension_in
6dc0: 69 74 28 0d 0a 20 20 73 71 6c 69 74 65 33 20 2a  it(..  sqlite3 *
6dd0: 64 62 2c 0d 0a 20 20 63 68 61 72 20 2a 2a 70 7a  db,..  char **pz
6de0: 45 72 72 4d 73 67 2c 0d 0a 20 20 63 6f 6e 73 74  ErrMsg,..  const
6df0: 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
6e00: 74 69 6e 65 73 20 2a 70 41 70 69 0d 0a 29 7b 0d  tines *pApi..){.
6e10: 0a 20 20 69 6e 74 20 72 63 3b 0d 0a 20 20 53 51  .  int rc;..  SQ
6e20: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6e30: 4e 49 54 32 28 70 41 70 69 29 0d 0a 20 20 72 63  NIT2(pApi)..  rc
6e40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
6e50: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6e60: 69 6e 74 65 72 6f 70 54 65 73 74 22 2c 20 2d 31  interopTest", -1
6e70: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
6e80: 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6f 70 54  ..      interopT
6e90: 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0d  estFunc, 0, 0);.
6ea0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6eb0: 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20 20 72 63 20  E_OK ){..    rc 
6ec0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ed0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 69  _function(db, "i
6ee0: 6e 74 65 72 6f 70 53 6c 65 65 70 22 2c 20 31 2c  nteropSleep", 1,
6ef0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 0d   SQLITE_ANY, 0,.
6f00: 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 6f 70  .        interop
6f10: 53 6c 65 65 70 46 75 6e 63 2c 20 30 2c 20 30 29  SleepFunc, 0, 0)
6f20: 3b 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e  ;..  }..  return
6f30: 20 72 63 3b 0d 0a 7d 0d 0a 23 65 6e 64 69 66 0d   rc;..}..#endif.
6f40: 0a                                               .