System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a1812596650ab01f321b1869b4331337fe559599:


0000: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41  #define SQLITE_A
0010: 50 49 20 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  PI __declspec(dl
0020: 6c 65 78 70 6f 72 74 29 0d 0a 23 69 6e 63 6c 75  lexport)..#inclu
0030: 64 65 20 22 2e 2e 2f 63 6f 72 65 2f 73 71 6c 69  de "../core/sqli
0040: 74 65 33 2e 63 22 0d 0a 23 69 6e 63 6c 75 64 65  te3.c"..#include
0050: 20 22 2e 2e 2f 63 6f 6e 74 72 69 62 2f 65 78 74   "../contrib/ext
0060: 65 6e 73 69 6f 6e 2d 66 75 6e 63 74 69 6f 6e 73  ension-functions
0070: 2e 63 22 0d 0a 23 69 6e 63 6c 75 64 65 20 22 63  .c"..#include "c
0080: 72 79 70 74 2e 63 22 0d 0a 0d 0a 65 78 74 65 72  rypt.c"....exter
0090: 6e 20 69 6e 74 20 52 65 67 69 73 74 65 72 45 78  n int RegisterEx
00a0: 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69 6f 6e 73  tensionFunctions
00b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 3b 0d 0a  (sqlite3 *db);..
00c0: 0d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
00d0: 4f 53 5f 57 49 4e 0d 0a 0d 0a 2f 2f 20 41 64 64  OS_WIN....// Add
00e0: 69 74 69 6f 6e 61 6c 20 6f 70 65 6e 20 66 6c 61  itional open fla
00f0: 67 73 2c 20 77 65 20 75 73 65 20 74 68 69 73 20  gs, we use this 
0100: 6f 6e 65 20 70 72 69 76 61 74 65 6c 79 0d 0a 2f  one privately../
0110: 2f 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  /#define SQLITE_
0120: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
0130: 20 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30        0x01000000
0140: 0d 0a 0d 0a 74 79 70 65 64 65 66 20 76 6f 69 64  ....typedef void
0150: 20 28 2a 53 51 4c 49 54 45 55 53 45 52 46 55 4e   (*SQLITEUSERFUN
0160: 43 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  C)(sqlite3_conte
0170: 78 74 20 2a 2c 20 69 6e 74 2c 20 73 71 6c 69 74  xt *, int, sqlit
0180: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0d 0a 74  e3_value **);..t
0190: 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 53 51  ypedef void (*SQ
01a0: 4c 49 54 45 46 55 4e 43 46 49 4e 41 4c 29 28 73  LITEFUNCFINAL)(s
01b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
01c0: 29 3b 0d 0a 0d 0a 2f 2a 0d 0a 20 20 20 20 54 68  );..../*..    Th
01d0: 65 20 67 6f 61 6c 20 6f 66 20 74 68 69 73 20 76  e goal of this v
01e0: 65 72 73 69 6f 6e 20 6f 66 20 63 6c 6f 73 65 20  ersion of close 
01f0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 68 61  is different tha
0200: 6e 20 74 68 61 74 20 6f 66 20 73 71 6c 69 74 65  n that of sqlite
0210: 33 5f 63 6c 6f 73 65 28 29 2c 20 61 6e 64 20 69  3_close(), and i
0220: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 6c 65  s designed to le
0230: 6e 64 20 69 74 73 65 6c 66 20 62 65 74 74 65 72  nd itself better
0240: 20 74 6f 20 2e 4e 45 54 27 73 20 6e 6f 6e 2d 64   to .NET's non-d
0250: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 69 6e  eterministic fin
0260: 61 6c 69 7a 65 72 73 20 61 6e 64 0d 0a 20 20 20  alizers and..   
0270: 20 74 68 65 20 47 43 20 74 68 72 65 61 64 2e 20   the GC thread. 
0280: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
0290: 20 63 6c 6f 73 65 20 61 20 64 61 74 61 62 61 73   close a databas
02a0: 65 20 69 66 20 73 74 61 74 65 6d 65 6e 74 73 20  e if statements 
02b0: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 69 74 20 2d  are open on it -
02c0: 2d 20 62 75 74 20 66 6f 72 20 6f 75 72 20 70 75  - but for our pu
02d0: 72 70 6f 73 65 73 2c 20 77 65 27 64 20 72 61 74  rposes, we'd rat
02e0: 68 65 72 20 66 69 6e 61 6c 69 7a 65 20 61 6c 6c  her finalize all
02f0: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
0300: 74 73 0d 0a 20 20 20 20 61 6e 64 20 66 6f 72 63  ts..    and forc
0310: 69 62 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 64  ibly close the d
0320: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
0330: 61 73 6f 6e 20 69 73 20 73 69 6d 70 6c 65 20 2d  ason is simple -
0340: 2d 20 61 20 6c 6f 74 20 6f 66 20 70 65 6f 70 6c  - a lot of peopl
0350: 65 20 64 6f 6e 27 74 20 44 69 73 70 6f 73 65 28  e don't Dispose(
0360: 29 20 6f 66 20 74 68 65 69 72 20 6f 62 6a 65 63  ) of their objec
0370: 74 73 20 63 6f 72 72 65 63 74 6c 79 20 61 6e 64  ts correctly and
0380: 20 6c 65 74 20 74 68 65 20 67 61 72 62 61 67 65   let the garbage
0390: 20 63 6f 6c 6c 65 63 74 6f 72 0d 0a 20 20 20 20   collector..    
03a0: 64 6f 20 69 74 2e 20 20 54 68 69 73 20 6c 65 61  do it.  This lea
03b0: 64 73 20 74 6f 20 75 6e 65 78 70 65 63 74 65 64  ds to unexpected
03c0: 20 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 61   behavior when a
03d0: 20 75 73 65 72 20 74 68 69 6e 6b 73 20 74 68 65   user thinks the
03e0: 79 27 76 65 20 63 6c 6f 73 65 64 20 61 20 64 61  y've closed a da
03f0: 74 61 62 61 73 65 2c 20 62 75 74 20 69 74 27 73  tabase, but it's
0400: 20 73 74 69 6c 6c 20 6f 70 65 6e 20 62 65 63 61   still open beca
0410: 75 73 65 20 6e 6f 74 20 61 6c 6c 20 74 68 65 20  use not all the 
0420: 73 74 61 74 65 6d 65 6e 74 73 20 68 61 76 65 0d  statements have.
0430: 0a 20 20 20 20 68 69 74 20 74 68 65 20 47 43 20  .    hit the GC 
0440: 79 65 74 2e 0d 0a 0d 0a 20 20 20 20 53 6f 2c 20  yet.....    So, 
0450: 68 65 72 65 20 77 65 20 68 61 76 65 20 61 20 70  here we have a p
0460: 72 6f 62 6c 65 6d 20 2e 2e 2e 20 2e 4e 45 54 20  roblem ... .NET 
0470: 68 61 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  has a pointer to
0480: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 73   any number of s
0490: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65  qlite3_stmt obje
04a0: 63 74 73 2e 20 20 57 65 20 63 61 6e 27 74 20 63  cts.  We can't c
04b0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  all sqlite3_fina
04c0: 6c 69 7a 65 28 29 20 6f 6e 20 74 68 65 73 65 20  lize() on these 
04d0: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 74 68 65  because..    the
04e0: 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
04f0: 65 64 20 61 6e 64 20 63 61 6e 20 62 65 20 75 73  ed and can be us
0500: 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67  ed for something
0510: 20 65 6c 73 65 2e 20 20 54 68 65 20 47 43 20 74   else.  The GC t
0520: 68 72 65 61 64 20 63 6f 75 6c 64 20 70 6f 74 65  hread could pote
0530: 6e 74 69 61 6c 6c 79 20 74 72 79 20 61 6e 64 20  ntially try and 
0540: 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 20 61 67  call finalize ag
0550: 61 69 6e 20 6f 6e 20 74 68 65 20 73 74 61 74 65  ain on the state
0560: 6d 65 6e 74 20 61 66 74 65 72 0d 0a 20 20 20 20  ment after..    
0570: 74 68 61 74 20 6d 65 6d 6f 72 79 20 77 61 73 20  that memory was 
0580: 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 42 41  deallocated.  BA
0590: 44 2e 20 20 53 6f 2c 20 77 68 61 74 20 77 65 20  D.  So, what we 
05a0: 6e 65 65 64 20 74 6f 20 64 6f 20 69 73 20 6d 61  need to do is ma
05b0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63  ke a copy of eac
05c0: 68 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  h statement, and
05d0: 20 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 28 29   call finalize()
05e0: 20 6f 6e 20 74 68 65 20 63 6f 70 79 20 2d 2d 20   on the copy -- 
05f0: 73 6f 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  so that the orig
0600: 69 6e 61 6c 0d 0a 20 20 20 20 73 74 61 74 65 6d  inal..    statem
0610: 65 6e 74 27 73 20 6d 65 6d 6f 72 79 20 69 73 20  ent's memory is 
0620: 70 72 65 73 65 72 76 65 64 2c 20 61 6e 64 20 6d  preserved, and m
0630: 61 72 6b 65 64 20 61 73 20 42 41 44 2c 20 62 75  arked as BAD, bu
0640: 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 6d  t we can still m
0650: 61 6e 61 67 65 20 74 6f 20 66 69 6e 61 6c 69 7a  anage to finaliz
0660: 65 20 65 76 65 72 79 74 68 69 6e 67 20 61 6e 64  e everything and
0670: 20 66 6f 72 63 69 62 6c 79 20 63 6c 6f 73 65 20   forcibly close 
0680: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4c  the database.  L
0690: 61 74 65 72 20 77 68 65 6e 20 74 68 65 20 0d 0a  ater when the ..
06a0: 20 20 20 20 47 43 20 67 65 74 73 20 61 72 6f 75      GC gets arou
06b0: 6e 64 20 74 6f 20 63 61 6c 6c 69 6e 67 20 66 69  nd to calling fi
06c0: 6e 61 6c 69 7a 65 5f 69 6e 74 65 72 6f 70 28 29  nalize_interop()
06d0: 20 6f 6e 20 74 68 65 20 22 62 61 64 22 20 73 74   on the "bad" st
06e0: 61 74 65 6d 65 6e 74 2c 20 77 65 20 64 65 74 65  atement, we dete
06f0: 63 74 20 74 68 61 74 20 61 6e 64 20 66 69 6e 69  ct that and fini
0700: 73 68 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20  sh deallocating 
0710: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0d 0a 2a 2f  the pointer...*/
0720: 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
0730: 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41  export) int WINA
0740: 50 49 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  PI sqlite3_close
0750: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
0760: 20 2a 64 62 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20   *db)..{..  int 
0770: 72 65 74 3b 0d 0a 20 20 0d 0a 20 20 72 65 74 20  ret;..  ..  ret 
0780: 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  = sqlite3_close(
0790: 64 62 29 3b 0d 0a 0d 0a 20 20 69 66 20 28 72 65  db);....  if (re
07a0: 74 20 3d 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  t == SQLITE_BUSY
07b0: 20 26 26 20 64 62 2d 3e 70 56 64 62 65 29 0d 0a   && db->pVdbe)..
07c0: 20 20 7b 0d 0a 20 20 20 20 77 68 69 6c 65 20 28    {..    while (
07d0: 64 62 2d 3e 70 56 64 62 65 29 0d 0a 20 20 20 20  db->pVdbe)..    
07e0: 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65  {..      // Make
07f0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66   a copy of the f
0800: 69 72 73 74 20 70 72 65 70 61 72 65 64 20 73 74  irst prepared st
0810: 61 74 65 6d 65 6e 74 0d 0a 20 20 20 20 20 20 56  atement..      V
0820: 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a  dbe *p = (Vdbe *
0830: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
0840: 73 69 7a 65 6f 66 28 56 64 62 65 29 29 3b 0d 0a  sizeof(Vdbe));..
0850: 20 20 20 20 20 20 56 64 62 65 20 2a 70 6f 20 3d        Vdbe *po =
0860: 20 64 62 2d 3e 70 56 64 62 65 3b 0d 0a 0d 0a 20   db->pVdbe;.... 
0870: 20 20 20 20 20 69 66 20 28 21 70 29 20 0d 0a 20       if (!p) .. 
0880: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0890: 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  ret = SQLITE_NOM
08a0: 45 4d 3b 0d 0a 20 20 20 20 20 20 20 20 62 72 65  EM;..        bre
08b0: 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ak;..      }....
08c0: 20 20 20 20 20 20 43 6f 70 79 4d 65 6d 6f 72 79        CopyMemory
08d0: 28 70 2c 20 70 6f 2c 20 73 69 7a 65 6f 66 28 56  (p, po, sizeof(V
08e0: 64 62 65 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  dbe));....      
08f0: 2f 2f 20 50 75 74 20 69 74 20 6f 6e 20 74 68 65  // Put it on the
0900: 20 63 68 61 69 6e 20 73 6f 20 77 65 20 63 61 6e   chain so we can
0910: 20 66 72 65 65 20 69 74 0d 0a 20 20 20 20 20 20   free it..      
0920: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0d 0a  db->pVdbe = p;..
0930: 20 20 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69        ret = sqli
0940: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 28 73 71  te3_finalize((sq
0950: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 29 3b  lite3_stmt *)p);
0960: 20 2f 2f 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   // This will al
0970: 73 6f 20 66 72 65 65 20 74 68 65 20 63 6f 70 79  so free the copy
0980: 27 73 20 6d 65 6d 6f 72 79 0d 0a 20 20 20 20 20  's memory..     
0990: 20 69 66 20 28 72 65 74 29 0d 0a 20 20 20 20 20   if (ret)..     
09a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 66   {..        // f
09b0: 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 20 2d  inalize failed -
09c0: 2d 20 73 6f 20 77 65 20 6d 75 73 74 20 70 75 74  - so we must put
09d0: 20 62 61 63 6b 20 61 6e 79 74 68 69 6e 67 20 77   back anything w
09e0: 65 20 6d 75 6e 67 65 64 0d 0a 20 20 20 20 20 20  e munged..      
09f0: 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28 70 6f 2c    CopyMemory(po,
0a00: 20 70 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29   p, sizeof(Vdbe)
0a10: 29 3b 0d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  );..        db->
0a20: 70 56 64 62 65 20 3d 20 70 6f 3b 0d 0a 20 20 20  pVdbe = po;..   
0a30: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
0a40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65     }..      else
0a50: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
0a60: 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 6f     ZeroMemory(po
0a70: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 29 3b  , sizeof(Vdbe));
0a80: 0d 0a 20 20 20 20 20 20 20 20 70 6f 2d 3e 6d 61  ..        po->ma
0a90: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
0aa0: 5f 44 45 41 44 3b 0d 0a 20 20 20 20 20 20 7d 0d  _DEAD;..      }.
0ab0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 20  .    }..    ret 
0ac0: 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  = sqlite3_close(
0ad0: 64 62 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72  db);..  }....  r
0ae0: 65 74 75 72 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 0d  eturn ret;..}...
0af0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
0b00: 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50  xport) int WINAP
0b10: 49 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69  I sqlite3_open_i
0b20: 6e 74 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61  nterop(const cha
0b30: 72 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  r*filename, int 
0b40: 66 6c 61 67 73 2c 20 73 71 6c 69 74 65 33 20 2a  flags, sqlite3 *
0b50: 2a 70 70 64 62 29 0d 0a 7b 0d 0a 20 20 69 6e 74  *ppdb)..{..  int
0b60: 20 72 65 74 3b 0d 0a 20 20 2f 2f 69 6e 74 20 73   ret;..  //int s
0b70: 68 61 72 65 64 63 61 63 68 65 20 3d 20 28 28 66  haredcache = ((f
0b80: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
0b90: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 29 20  EN_SHAREDCACHE) 
0ba0: 21 3d 20 30 29 3b 0d 0a 20 20 2f 2f 66 6c 61 67  != 0);..  //flag
0bb0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
0bc0: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0d 0a  N_SHAREDCACHE;..
0bd0: 0d 0a 20 20 2f 2f 73 71 6c 69 74 65 33 5f 65 6e  ..  //sqlite3_en
0be0: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
0bf0: 65 28 73 68 61 72 65 64 63 61 63 68 65 29 3b 0d  e(sharedcache);.
0c00: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
0c10: 5f 6f 70 65 6e 5f 76 32 28 66 69 6c 65 6e 61 6d  _open_v2(filenam
0c20: 65 2c 20 70 70 64 62 2c 20 66 6c 61 67 73 2c 20  e, ppdb, flags, 
0c30: 4e 55 4c 4c 29 3b 0d 0a 20 20 2f 2f 73 71 6c 69  NULL);..  //sqli
0c40: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0c50: 64 5f 63 61 63 68 65 28 30 29 3b 0d 0a 0d 0a 20  d_cache(0);.... 
0c60: 20 69 66 20 28 72 65 74 20 3d 3d 20 30 29 0d 0a   if (ret == 0)..
0c70: 20 20 20 20 52 65 67 69 73 74 65 72 45 78 74 65      RegisterExte
0c80: 6e 73 69 6f 6e 46 75 6e 63 74 69 6f 6e 73 28 2a  nsionFunctions(*
0c90: 70 70 64 62 29 3b 0d 0a 0d 0a 20 20 72 65 74 75  ppdb);....  retu
0ca0: 72 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f  rn ret;..}....__
0cb0: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
0cc0: 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73  rt) int WINAPI s
0cd0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f 69 6e  qlite3_open16_in
0ce0: 74 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61 72  terop(const char
0cf0: 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20   *filename, int 
0d00: 66 6c 61 67 73 2c 20 73 71 6c 69 74 65 33 20 2a  flags, sqlite3 *
0d10: 2a 70 70 64 62 29 0d 0a 7b 0d 0a 20 20 69 6e 74  *ppdb)..{..  int
0d20: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6f   ret = sqlite3_o
0d30: 70 65 6e 5f 69 6e 74 65 72 6f 70 28 66 69 6c 65  pen_interop(file
0d40: 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 70 64  name, flags, ppd
0d50: 62 29 3b 0d 0a 20 20 69 66 20 28 21 72 65 74 29  b);..  if (!ret)
0d60: 0d 0a 20 20 7b 0d 0a 20 20 20 20 69 66 28 21 44  ..  {..    if(!D
0d70: 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
0d80: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
0d90: 4c 6f 61 64 65 64 29 29 0d 0a 20 20 20 20 20 20  Loaded))..      
0da0: 45 4e 43 28 2a 70 70 64 62 29 20 3d 20 53 51 4c  ENC(*ppdb) = SQL
0db0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
0dc0: 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20  ..  }..  return 
0dd0: 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63  ret;..}....__dec
0de0: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
0df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49   const char * WI
0e00: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 65 72 72  NAPI sqlite3_err
0e10: 6d 73 67 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  msg_interop(sqli
0e20: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70 6c  te3 *db, int *pl
0e30: 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20  en)..{..  const 
0e40: 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c  char *pval = sql
0e50: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b  ite3_errmsg(db);
0e60: 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61  ..  *plen = (pva
0e70: 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e  l != 0) ? strlen
0e80: 28 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72  (pval) : 0;..  r
0e90: 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a  eturn pval;..}..
0ea0: 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
0eb0: 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41  export) int WINA
0ec0: 50 49 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  PI sqlite3_prepa
0ed0: 72 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  re_interop(sqlit
0ee0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
0ef0: 61 72 20 2a 73 71 6c 2c 20 69 6e 74 20 6e 62 79  ar *sql, int nby
0f00: 74 65 73 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  tes, sqlite3_stm
0f10: 74 20 2a 2a 70 70 73 74 6d 74 2c 20 63 6f 6e 73  t **ppstmt, cons
0f20: 74 20 63 68 61 72 20 2a 2a 70 7a 74 61 69 6c 2c  t char **pztail,
0f30: 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a   int *plen)..{..
0f40: 20 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 20 20 6e 20    int n;....  n 
0f50: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
0f60: 65 28 64 62 2c 20 73 71 6c 2c 20 6e 62 79 74 65  e(db, sql, nbyte
0f70: 73 2c 20 70 70 73 74 6d 74 2c 20 70 7a 74 61 69  s, ppstmt, pztai
0f80: 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  l);..  *plen = (
0f90: 2a 70 7a 74 61 69 6c 20 21 3d 20 30 29 20 3f 20  *pztail != 0) ? 
0fa0: 73 74 72 6c 65 6e 28 2a 70 7a 74 61 69 6c 29 20  strlen(*pztail) 
0fb0: 3a 20 30 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e  : 0;....  return
0fc0: 20 6e 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c   n;..}....__decl
0fd0: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
0fe0: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
0ff0: 65 33 5f 70 72 65 70 61 72 65 31 36 5f 69 6e 74  e3_prepare16_int
1000: 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62  erop(sqlite3 *db
1010: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  , const void *sq
1020: 6c 2c 20 69 6e 74 20 6e 63 68 61 72 73 2c 20 73  l, int nchars, s
1030: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
1040: 73 74 6d 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  stmt, const void
1050: 20 2a 2a 70 7a 74 61 69 6c 2c 20 69 6e 74 20 2a   **pztail, int *
1060: 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20  plen)..{..  int 
1070: 6e 3b 0d 0a 0d 0a 20 20 6e 20 3d 20 73 71 6c 69  n;....  n = sqli
1080: 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62  te3_prepare16(db
1090: 2c 20 73 71 6c 2c 20 6e 63 68 61 72 73 20 2a 20  , sql, nchars * 
10a0: 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 2c  sizeof(wchar_t),
10b0: 20 70 70 73 74 6d 74 2c 20 70 7a 74 61 69 6c 29   ppstmt, pztail)
10c0: 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 2a 70  ;..  *plen = (*p
10d0: 7a 74 61 69 6c 20 21 3d 20 30 29 20 3f 20 77 63  ztail != 0) ? wc
10e0: 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29  slen((wchar_t *)
10f0: 2a 70 7a 74 61 69 6c 29 20 2a 20 73 69 7a 65 6f  *pztail) * sizeo
1100: 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0d  f(wchar_t) : 0;.
1110: 0a 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0d 0a  ...  return n;..
1120: 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28  }....__declspec(
1130: 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57  dllexport) int W
1140: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 62 69  INAPI sqlite3_bi
1150: 6e 64 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f  nd_double_intero
1160: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
1170: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
1180: 64 6f 75 62 6c 65 20 2a 76 61 6c 29 0d 0a 7b 0d  double *val)..{.
1190: 0a 09 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ..return sqlite3
11a0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 73 74 6d  _bind_double(stm
11b0: 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b 0d 0a 7d  t,iCol,*val);..}
11c0: 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  ....__declspec(d
11d0: 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49  llexport) int WI
11e0: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 62 69 6e  NAPI sqlite3_bin
11f0: 64 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28  d_int64_interop(
1200: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
1210: 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71  mt, int iCol, sq
1220: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29  lite_int64 *val)
1230: 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 73 71 6c  ..{...return sql
1240: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1250: 73 74 6d 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b  stmt,iCol,*val);
1260: 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65  ..}....__declspe
1270: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e  c(dllexport) con
1280: 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49  st char * WINAPI
1290: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
12a0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 5f 69 6e 74  rameter_name_int
12b0: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
12c0: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
12d0: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b  l, int *plen)..{
12e0: 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
12f0: 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 62  pval = sqlite3_b
1300: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
1310: 6d 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d  me(stmt, iCol);.
1320: 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c  .  *plen = (pval
1330: 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28   != 0) ? strlen(
1340: 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65  pval) : 0;..  re
1350: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
1360: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
1370: 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61  xport) const cha
1380: 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  r * WINAPI sqlit
1390: 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5f 69  e3_column_name_i
13a0: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
13b0: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
13c0: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d  Col, int *plen).
13d0: 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .{..  const char
13e0: 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pval = sqlite3
13f0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 73 74 6d  _column_name(stm
1400: 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c  t, iCol);..  *pl
1410: 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29  en = (pval != 0)
1420: 20 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20   ? strlen(pval) 
1430: 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70  : 0;..  return p
1440: 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63  val;..}....__dec
1450: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1460: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57 49   const void * WI
1470: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
1480: 75 6d 6e 5f 6e 61 6d 65 31 36 5f 69 6e 74 65 72  umn_name16_inter
1490: 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  op(sqlite3_stmt 
14a0: 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  *stmt, int iCol,
14b0: 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a   int *plen)..{..
14c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76    const void *pv
14d0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
14e0: 75 6d 6e 5f 6e 61 6d 65 31 36 28 73 74 6d 74 2c  umn_name16(stmt,
14f0: 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e   iCol);..  *plen
1500: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
1510: 20 77 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74   wcslen((wchar_t
1520: 20 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f   *)pval) * sizeo
1530: 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0d  f(wchar_t) : 0;.
1540: 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d  .  return pval;.
1550: 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63  .}....__declspec
1560: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
1570: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
1580: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1590: 65 63 6c 74 79 70 65 5f 69 6e 74 65 72 6f 70 28  ecltype_interop(
15a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
15b0: 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  mt, int iCol, in
15c0: 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63  t *plen)..{..  c
15d0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20  onst char *pval 
15e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
15f0: 5f 64 65 63 6c 74 79 70 65 28 73 74 6d 74 2c 20  _decltype(stmt, 
1600: 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20  iCol);..  *plen 
1610: 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20  = (pval != 0) ? 
1620: 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30  strlen(pval) : 0
1630: 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  ;..  return pval
1640: 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70  ;..}....__declsp
1650: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f  ec(dllexport) co
1660: 6e 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50  nst void * WINAP
1670: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
1680: 5f 64 65 63 6c 74 79 70 65 31 36 5f 69 6e 74 65  _decltype16_inte
1690: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
16a0: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
16b0: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d  , int *plen)..{.
16c0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
16d0: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
16e0: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 28  lumn_decltype16(
16f0: 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20 20  stmt, iCol);..  
1700: 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d  *plen = (pval !=
1710: 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77 63   0) ? wcslen((wc
1720: 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a 20  har_t *)pval) * 
1730: 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 20  sizeof(wchar_t) 
1740: 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70  : 0;..  return p
1750: 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63  val;..}....__dec
1760: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1770: 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c   void WINAPI sql
1780: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
1790: 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  le_interop(sqlit
17a0: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
17b0: 6e 74 20 69 43 6f 6c 2c 20 64 6f 75 62 6c 65 20  nt iCol, double 
17c0: 2a 76 61 6c 29 0d 0a 7b 0d 0a 09 2a 76 61 6c 20  *val)..{...*val 
17d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17e0: 5f 64 6f 75 62 6c 65 28 73 74 6d 74 2c 69 43 6f  _double(stmt,iCo
17f0: 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c  l);..}....__decl
1800: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
1810: 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69  void WINAPI sqli
1820: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1830: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
1840: 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74  _stmt *stmt, int
1850: 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 5f 69 6e   iCol, sqlite_in
1860: 74 36 34 20 2a 76 61 6c 29 0d 0a 7b 0d 0a 09 2a  t64 *val)..{...*
1870: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
1880: 6c 75 6d 6e 5f 69 6e 74 36 34 28 73 74 6d 74 2c  lumn_int64(stmt,
1890: 69 43 6f 6c 29 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64  iCol);..}....__d
18a0: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
18b0: 74 29 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  t) const unsigne
18c0: 64 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  d char * WINAPI 
18d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18e0: 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  ext_interop(sqli
18f0: 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20  te3_stmt *stmt, 
1900: 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  int iCol, int *p
1910: 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74  len)..{..  const
1920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1930: 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pval = sqlite3_c
1940: 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 74 6d 74 2c  olumn_text(stmt,
1950: 20 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e   iCol);..  *plen
1960: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
1970: 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
1980: 70 76 61 6c 29 20 3a 20 30 3b 0d 0a 20 20 72 65  pval) : 0;..  re
1990: 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d  turn pval;..}...
19a0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
19b0: 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 76 6f 69  xport) const voi
19c0: 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  d * WINAPI sqlit
19d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
19e0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
19f0: 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74  _stmt *stmt, int
1a00: 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e   iCol, int *plen
1a10: 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f  )..{..  const vo
1a20: 69 64 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74  id *pval = sqlit
1a30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
1a40: 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0d 0a 20  (stmt, iCol);.. 
1a50: 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21   *plen = (pval !
1a60: 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77  = 0) ? wcslen((w
1a70: 63 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a  char_t *)pval) *
1a80: 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29   sizeof(wchar_t)
1a90: 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70  : 0;..  return p
1aa0: 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63  val;..}....__dec
1ab0: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1ac0: 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69   int WINAPI sqli
1ad0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5f 69 6e 74  te3_finalize_int
1ae0: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
1af0: 74 20 2a 73 74 6d 74 29 0d 0a 7b 0d 0a 20 20 56  t *stmt)..{..  V
1b00: 64 62 65 20 2a 70 3b 0d 0a 20 20 73 71 6c 69 74  dbe *p;..  sqlit
1b10: 65 33 20 2a 64 62 3b 0d 0a 20 20 69 6e 74 20 72  e3 *db;..  int r
1b20: 65 74 3b 0d 0a 0d 0a 20 20 70 20 3d 20 28 56 64  et;....  p = (Vd
1b30: 62 65 20 2a 29 73 74 6d 74 3b 0d 0a 20 20 69 66  be *)stmt;..  if
1b40: 20 28 70 20 26 26 20 70 2d 3e 6d 61 67 69 63 20   (p && p->magic 
1b50: 3d 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45  == VDBE_MAGIC_DE
1b60: 41 44 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 64 62  AD)..  {..    db
1b70: 20 3d 20 70 2d 3e 64 62 3b 0d 0a 20 20 20 20 69   = p->db;..    i
1b80: 66 20 28 64 62 20 3d 3d 20 4e 55 4c 4c 29 0d 0a  f (db == NULL)..
1b90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 71 6c      {..      sql
1ba0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0d 0a 20  ite3_free(p);.. 
1bb0: 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54       ret = SQLIT
1bc0: 45 5f 4f 4b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  E_OK;..    }..  
1bd0: 7d 0d 0a 20 20 65 6c 73 65 0d 0a 20 20 20 20 72  }..  else..    r
1be0: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  et = sqlite3_fin
1bf0: 61 6c 69 7a 65 28 73 74 6d 74 29 3b 0d 0a 0d 0a  alize(stmt);....
1c00: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0d 0a 7d    return ret;..}
1c10: 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  ....__declspec(d
1c20: 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49  llexport) int WI
1c30: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 72 65 73  NAPI sqlite3_res
1c40: 65 74 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  et_interop(sqlit
1c50: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 29 0d 0a  e3_stmt *stmt)..
1c60: 7b 0d 0a 20 20 69 6e 74 20 72 65 74 3b 0d 0a 0d  {..  int ret;...
1c70: 0a 20 20 69 66 20 28 28 28 56 64 62 65 20 2a 29  .  if (((Vdbe *)
1c80: 73 74 6d 74 29 2d 3e 6d 61 67 69 63 20 3d 3d 20  stmt)->magic == 
1c90: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 29  VDBE_MAGIC_DEAD)
1ca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
1cb0: 43 48 45 4d 41 3b 0d 0a 20 20 72 65 74 20 3d 20  CHEMA;..  ret = 
1cc0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 73 74  sqlite3_reset(st
1cd0: 6d 74 29 3b 0d 0a 20 20 72 65 74 75 72 6e 20 72  mt);..  return r
1ce0: 65 74 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c  et;..}....__decl
1cf0: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
1d00: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
1d10: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1d20: 6f 6e 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  on_interop(sqlit
1d30: 65 33 20 2a 70 73 71 6c 2c 20 63 6f 6e 73 74 20  e3 *psql, const 
1d40: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
1d50: 61 6d 65 2c 20 69 6e 74 20 6e 41 72 67 2c 20 69  ame, int nArg, i
1d60: 6e 74 20 65 54 65 78 74 52 65 70 2c 20 76 6f 69  nt eTextRep, voi
1d70: 64 20 2a 70 76 55 73 65 72 2c 20 53 51 4c 49 54  d *pvUser, SQLIT
1d80: 45 55 53 45 52 46 55 4e 43 20 66 75 6e 63 2c 20  EUSERFUNC func, 
1d90: 53 51 4c 49 54 45 55 53 45 52 46 55 4e 43 20 66  SQLITEUSERFUNC f
1da0: 75 6e 63 73 74 65 70 2c 20 53 51 4c 49 54 45 46  uncstep, SQLITEF
1db0: 55 4e 43 46 49 4e 41 4c 20 66 75 6e 63 66 69 6e  UNCFINAL funcfin
1dc0: 61 6c 2c 20 69 6e 74 20 6e 65 65 64 43 6f 6c 6c  al, int needColl
1dd0: 53 65 71 29 0d 0a 7b 0d 0a 20 20 69 6e 74 20 6e  Seq)..{..  int n
1de0: 3b 0d 0a 0d 0a 20 20 69 66 20 28 65 54 65 78 74  ;....  if (eText
1df0: 52 65 70 20 3d 3d 20 53 51 4c 49 54 45 5f 55 54  Rep == SQLITE_UT
1e00: 46 31 36 29 0d 0a 20 20 20 20 65 54 65 78 74 52  F16)..    eTextR
1e10: 65 70 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  ep = SQLITE_UTF1
1e20: 36 4e 41 54 49 56 45 3b 0d 0a 0d 0a 20 20 6e 20  6NATIVE;....  n 
1e30: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1e40: 5f 66 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c 20  _function(psql, 
1e50: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
1e60: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 30  Arg, eTextRep, 0
1e70: 2c 20 66 75 6e 63 2c 20 66 75 6e 63 73 74 65 70  , func, funcstep
1e80: 2c 20 66 75 6e 63 66 69 6e 61 6c 29 3b 0d 0a 20  , funcfinal);.. 
1e90: 20 69 66 20 28 6e 20 3d 3d 20 30 29 0d 0a 20 20   if (n == 0)..  
1ea0: 7b 0d 0a 20 20 20 20 69 66 20 28 6e 65 65 64 43  {..    if (needC
1eb0: 6f 6c 6c 53 65 71 29 0d 0a 20 20 20 20 7b 0d 0a  ollSeq)..    {..
1ec0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1ed0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
1ee0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c  ndFunction(psql,
1ef0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
1f00: 73 74 72 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e  strlen(zFunction
1f10: 4e 61 6d 65 29 2c 20 6e 41 72 67 2c 20 65 54 65  Name), nArg, eTe
1f20: 78 74 52 65 70 2c 20 30 29 3b 0d 0a 20 20 20 20  xtRep, 0);..    
1f30: 20 20 69 66 28 20 70 46 75 6e 63 20 29 0d 0a 20    if( pFunc ).. 
1f40: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1f50: 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d 20  pFunc->flags |= 
1f60: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
1f70: 43 4f 4c 4c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  COLL;..      }..
1f80: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
1f90: 72 65 74 75 72 6e 20 6e 3b 0d 0a 7d 0d 0a 0d 0a  return n;..}....
1fa0: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
1fb0: 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e 41 50  port) void WINAP
1fc0: 49 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  I sqlite3_value_
1fd0: 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73  double_interop(s
1fe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 76  qlite3_value *pv
1ff0: 61 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  al, double *val)
2000: 0d 0a 7b 0d 0a 20 20 2a 76 61 6c 20 3d 20 73 71  ..{..  *val = sq
2010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
2020: 6c 65 28 70 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a  le(pval);..}....
2030: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2040: 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e 41 50  port) void WINAP
2050: 49 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  I sqlite3_value_
2060: 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73 71  int64_interop(sq
2070: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 76 61  lite3_value *pva
2080: 6c 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  l, sqlite_int64 
2090: 2a 76 61 6c 29 0d 0a 7b 0d 0a 20 20 2a 76 61 6c  *val)..{..  *val
20a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
20b0: 5f 69 6e 74 36 34 28 70 76 61 6c 29 3b 0d 0a 7d  _int64(pval);..}
20c0: 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  ....__declspec(d
20d0: 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74 20  llexport) const 
20e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
20f0: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76  WINAPI sqlite3_v
2100: 61 6c 75 65 5f 74 65 78 74 5f 69 6e 74 65 72 6f  alue_text_intero
2110: 70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  p(sqlite3_value 
2120: 2a 76 61 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29  *val, int *plen)
2130: 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ..{..  const uns
2140: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 76 61 6c  igned char *pval
2150: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2160: 5f 74 65 78 74 28 76 61 6c 29 3b 0d 0a 20 20 2a  _text(val);..  *
2170: 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20  plen = (pval != 
2180: 30 29 20 3f 20 73 74 72 6c 65 6e 28 28 63 68 61  0) ? strlen((cha
2190: 72 20 2a 29 70 76 61 6c 29 20 3a 20 30 3b 0d 0a  r *)pval) : 0;..
21a0: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a    return pval;..
21b0: 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28  }....__declspec(
21c0: 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74  dllexport) const
21d0: 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73   void * WINAPI s
21e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
21f0: 74 31 36 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  t16_interop(sqli
2200: 74 65 33 5f 76 61 6c 75 65 20 2a 76 61 6c 2c 20  te3_value *val, 
2210: 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20  int *plen)..{.. 
2220: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61   const void *pva
2230: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
2240: 65 5f 74 65 78 74 31 36 28 76 61 6c 29 3b 0d 0a  e_text16(val);..
2250: 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20    *plen = (pval 
2260: 21 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28  != 0) ? wcslen((
2270: 77 63 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20  wchar_t *)pval) 
2280: 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74  * sizeof(wchar_t
2290: 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75 72 6e  ) : 0;..  return
22a0: 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64   pval;..}....__d
22b0: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
22c0: 74 29 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73  t) void WINAPI s
22d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
22e0: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  uble_interop(sql
22f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 63  ite3_context *pc
2300: 74 78 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  tx, double *val)
2310: 0d 0a 7b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 72  ..{..  sqlite3_r
2320: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 63 74  esult_double(pct
2330: 78 2c 20 2a 76 61 6c 29 3b 0d 0a 7d 0d 0a 0d 0a  x, *val);..}....
2340: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2350: 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e 41 50  port) void WINAP
2360: 49 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  I sqlite3_result
2370: 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73  _int64_interop(s
2380: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2390: 70 63 74 78 2c 20 73 71 6c 69 74 65 5f 69 6e 74  pctx, sqlite_int
23a0: 36 34 20 2a 76 61 6c 29 0d 0a 7b 0d 0a 20 20 73  64 *val)..{..  s
23b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
23c0: 74 36 34 28 70 63 74 78 2c 20 2a 76 61 6c 29 3b  t64(pctx, *val);
23d0: 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65  ..}....__declspe
23e0: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74  c(dllexport) int
23f0: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
2400: 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d 70  context_collcomp
2410: 61 72 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  are(sqlite3_cont
2420: 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20  ext *ctx, const 
2430: 76 6f 69 64 20 2a 70 31 2c 20 69 6e 74 20 70 31  void *p1, int p1
2440: 6c 65 6e 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  len, const void 
2450: 2a 70 32 2c 20 69 6e 74 20 70 32 6c 65 6e 29 0d  *p2, int p2len).
2460: 0a 7b 0d 0a 20 20 69 66 20 28 28 63 74 78 2d 3e  .{..  if ((ctx->
2470: 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53  pFunc->flags & S
2480: 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
2490: 4f 4c 4c 29 20 3d 3d 20 30 29 20 72 65 74 75 72  OLL) == 0) retur
24a0: 6e 20 32 3b 0d 0a 20 20 72 65 74 75 72 6e 20 63  n 2;..  return c
24b0: 74 78 2d 3e 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  tx->pColl->xCmp(
24c0: 63 74 78 2d 3e 70 43 6f 6c 6c 2d 3e 70 55 73 65  ctx->pColl->pUse
24d0: 72 2c 20 70 31 6c 65 6e 2c 20 70 31 2c 20 70 32  r, p1len, p1, p2
24e0: 6c 65 6e 2c 20 70 32 29 3b 0d 0a 7d 0d 0a 0d 0a  len, p2);..}....
24f0: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2500: 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61 72  port) const char
2510: 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65   * WINAPI sqlite
2520: 33 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 73 65  3_context_collse
2530: 71 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  q(sqlite3_contex
2540: 74 20 2a 63 74 78 2c 20 69 6e 74 20 2a 70 74 79  t *ctx, int *pty
2550: 70 65 2c 20 69 6e 74 20 2a 65 6e 63 2c 20 69 6e  pe, int *enc, in
2560: 74 20 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 43  t *plen)..{..  C
2570: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
2580: 63 74 78 2d 3e 70 43 6f 6c 6c 3b 0d 0a 20 20 2a  ctx->pColl;..  *
2590: 70 74 79 70 65 20 3d 20 30 3b 0d 0a 20 20 2a 70  ptype = 0;..  *p
25a0: 6c 65 6e 20 3d 20 30 3b 0d 0a 20 20 2a 65 6e 63  len = 0;..  *enc
25b0: 20 3d 20 30 3b 0d 0a 0d 0a 20 20 69 66 20 28 28   = 0;....  if ((
25c0: 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67  ctx->pFunc->flag
25d0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
25e0: 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20  NEEDCOLL) == 0) 
25f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 0d 0a  return NULL;....
2600: 20 20 69 66 20 28 70 43 6f 6c 6c 29 0d 0a 20 20    if (pColl)..  
2610: 7b 0d 0a 20 20 20 20 2a 65 6e 63 20 3d 20 70 43  {..    *enc = pC
2620: 6f 6c 6c 2d 3e 65 6e 63 3b 0d 0a 20 20 20 20 2a  oll->enc;..    *
2630: 70 74 79 70 65 20 3d 20 70 43 6f 6c 6c 2d 3e 74  ptype = pColl->t
2640: 79 70 65 3b 0d 0a 20 20 20 20 2a 70 6c 65 6e 20  ype;..    *plen 
2650: 3d 20 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20  = (pColl->zName 
2660: 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70  != 0) ? strlen(p
2670: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 20 3a 20 30  Coll->zName) : 0
2680: 3b 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  ;....    return 
2690: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0d 0a 20  pColl->zName;.. 
26a0: 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c   }..  return NUL
26b0: 4c 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73  L;..}....__decls
26c0: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63  pec(dllexport) c
26d0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41  onst char * WINA
26e0: 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  PI sqlite3_colum
26f0: 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 5f  n_database_name_
2700: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f  interop(sqlite3_
2710: 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20  stmt *stmt, int 
2720: 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29  iCol, int *plen)
2730: 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74 20 63 68 61  ..{..  const cha
2740: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
2750: 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
2760: 65 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f  e_name(stmt, iCo
2770: 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  l);..  *plen = (
2780: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72  pval != 0) ? str
2790: 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0d 0a  len(pval) : 0;..
27a0: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a    return pval;..
27b0: 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28  }....__declspec(
27c0: 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74  dllexport) const
27d0: 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73   void * WINAPI s
27e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
27f0: 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 5f 69 6e  tabase_name16_in
2800: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
2810: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
2820: 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a  ol, int *plen)..
2830: 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  {..  const void 
2840: 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *pval = sqlite3_
2850: 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
2860: 6e 61 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f  name16(stmt, iCo
2870: 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  l);..  *plen = (
2880: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73  pval != 0) ? wcs
2890: 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70  len((wchar_t *)p
28a0: 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63  val) * sizeof(wc
28b0: 68 61 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72  har_t) : 0;..  r
28c0: 65 74 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a  eturn pval;..}..
28d0: 0d 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
28e0: 65 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68  export) const ch
28f0: 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69  ar * WINAPI sqli
2900: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2910: 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71  _name_interop(sq
2920: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
2930: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
2940: 2a 70 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e  *plen)..{..  con
2950: 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20  st char *pval = 
2960: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2970: 61 62 6c 65 5f 6e 61 6d 65 28 73 74 6d 74 2c 20  able_name(stmt, 
2980: 69 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20  iCol);..  *plen 
2990: 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20  = (pval != 0) ? 
29a0: 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30  strlen(pval) : 0
29b0: 3b 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  ;..  return pval
29c0: 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70  ;..}....__declsp
29d0: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f  ec(dllexport) co
29e0: 6e 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50  nst void * WINAP
29f0: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
2a00: 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 5f 69 6e  _table_name16_in
2a10: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
2a20: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
2a30: 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a  ol, int *plen)..
2a40: 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  {..  const void 
2a50: 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *pval = sqlite3_
2a60: 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2a70: 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b  e16(stmt, iCol);
2a80: 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61  ..  *plen = (pva
2a90: 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e  l != 0) ? wcslen
2aa0: 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76 61 6c  ((wchar_t *)pval
2ab0: 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72  ) * sizeof(wchar
2ac0: 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74 75  _t) : 0;..  retu
2ad0: 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a 5f  rn pval;..}...._
2ae0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
2af0: 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61 72 20  ort) const char 
2b00: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
2b10: 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
2b20: 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  ame_interop(sqli
2b30: 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20  te3_stmt *stmt, 
2b40: 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  int iCol, int *p
2b50: 6c 65 6e 29 0d 0a 7b 0d 0a 20 20 63 6f 6e 73 74  len)..{..  const
2b60: 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71   char *pval = sq
2b70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2b80: 67 69 6e 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69  gin_name(stmt, i
2b90: 43 6f 6c 29 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d  Col);..  *plen =
2ba0: 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 73   (pval != 0) ? s
2bb0: 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b  trlen(pval) : 0;
2bc0: 0d 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b  ..  return pval;
2bd0: 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65  ..}....__declspe
2be0: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e  c(dllexport) con
2bf0: 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49  st void * WINAPI
2c00: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c10: 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 5f 69 6e  origin_name16_in
2c20: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
2c30: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
2c40: 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0d 0a  ol, int *plen)..
2c50: 7b 0d 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  {..  const void 
2c60: 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *pval = sqlite3_
2c70: 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2c80: 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29  me16(stmt, iCol)
2c90: 3b 0d 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76  ;..  *plen = (pv
2ca0: 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c 65  al != 0) ? wcsle
2cb0: 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76 61  n((wchar_t *)pva
2cc0: 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61  l) * sizeof(wcha
2cd0: 72 5f 74 29 20 3a 20 30 3b 0d 0a 20 20 72 65 74  r_t) : 0;..  ret
2ce0: 75 72 6e 20 70 76 61 6c 3b 0d 0a 7d 0d 0a 0d 0a  urn pval;..}....
2cf0: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2d00: 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49  port) int WINAPI
2d10: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
2d20: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 5f 69  olumn_metadata_i
2d30: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a  nterop(sqlite3 *
2d40: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2d50: 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  zDbName, const c
2d60: 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
2d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2d80: 6c 75 6d 6e 4e 61 6d 65 2c 20 63 68 61 72 20 2a  lumnName, char *
2d90: 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 63 68 61  *pzDataType, cha
2da0: 72 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 69  r **pzCollSeq, i
2db0: 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 69 6e  nt *pNotNull, in
2dc0: 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
2dd0: 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 2c 20 69  int *pAutoinc, i
2de0: 6e 74 20 2a 70 64 74 4c 65 6e 2c 20 69 6e 74 20  nt *pdtLen, int 
2df0: 2a 70 63 73 4c 65 6e 29 0d 0a 7b 0d 0a 20 20 69  *pcsLen)..{..  i
2e00: 6e 74 20 6e 3b 0d 0a 20 20 0d 0a 20 20 6e 20 3d  nt n;..  ..  n =
2e10: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
2e20: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64  olumn_metadata(d
2e30: 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62  b, zDbName, zTab
2e40: 6c 65 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  leName, zColumnN
2e50: 61 6d 65 2c 20 70 7a 44 61 74 61 54 79 70 65 2c  ame, pzDataType,
2e60: 20 70 7a 43 6f 6c 6c 53 65 71 2c 20 70 4e 6f 74   pzCollSeq, pNot
2e70: 4e 75 6c 6c 2c 20 70 50 72 69 6d 61 72 79 4b 65  Null, pPrimaryKe
2e80: 79 2c 20 70 41 75 74 6f 69 6e 63 29 3b 0d 0a 20  y, pAutoinc);.. 
2e90: 20 2a 70 64 74 4c 65 6e 20 3d 20 28 2a 70 7a 44   *pdtLen = (*pzD
2ea0: 61 74 61 54 79 70 65 20 21 3d 20 30 29 20 3f 20  ataType != 0) ? 
2eb0: 73 74 72 6c 65 6e 28 2a 70 7a 44 61 74 61 54 79  strlen(*pzDataTy
2ec0: 70 65 29 20 3a 20 30 3b 0d 0a 20 20 2a 70 63 73  pe) : 0;..  *pcs
2ed0: 4c 65 6e 20 3d 20 28 2a 70 7a 43 6f 6c 6c 53 65  Len = (*pzCollSe
2ee0: 71 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e  q != 0) ? strlen
2ef0: 28 2a 70 7a 43 6f 6c 6c 53 65 71 29 20 3a 20 30  (*pzCollSeq) : 0
2f00: 3b 0d 0a 0d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ;....  return n;
2f10: 0d 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65  ..}....__declspe
2f20: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74  c(dllexport) int
2f30: 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f   WINAPI sqlite3_
2f40: 69 6e 64 65 78 5f 63 6f 6c 75 6d 6e 5f 69 6e 66  index_column_inf
2f50: 6f 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  o_interop(sqlite
2f60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2f70: 72 20 2a 7a 44 62 2c 20 63 6f 6e 73 74 20 63 68  r *zDb, const ch
2f80: 61 72 20 2a 7a 49 6e 64 65 78 4e 61 6d 65 2c 20  ar *zIndexName, 
2f90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2fa0: 75 6d 6e 4e 61 6d 65 2c 20 69 6e 74 20 2a 73 6f  umnName, int *so
2fb0: 72 74 4f 72 64 65 72 2c 20 69 6e 74 20 2a 6f 6e  rtOrder, int *on
2fc0: 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 2a 70 7a  Error, char **pz
2fd0: 43 6f 6c 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29  Coll, int *plen)
2fe0: 0d 0a 7b 0d 0a 20 20 49 6e 64 65 78 20 2a 70 49  ..{..  Index *pI
2ff0: 64 78 3b 0d 0a 20 20 54 61 62 6c 65 20 2a 70 54  dx;..  Table *pT
3000: 61 62 3b 0d 0a 20 20 69 6e 74 20 6e 3b 0d 0a 20  ab;..  int n;.. 
3010: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46   pIdx = sqlite3F
3020: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e  indIndex(db, zIn
3030: 64 65 78 4e 61 6d 65 2c 20 7a 44 62 29 3b 0d 0a  dexName, zDb);..
3040: 20 20 69 66 20 28 21 70 49 64 78 29 20 72 65 74    if (!pIdx) ret
3050: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
3060: 3b 0d 0a 0d 0a 20 20 70 54 61 62 20 3d 20 70 49  ;....  pTab = pI
3070: 64 78 2d 3e 70 54 61 62 6c 65 3b 0d 0a 20 20 66  dx->pTable;..  f
3080: 6f 72 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70  or (n = 0; n < p
3090: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 2b  Idx->nColumn; n+
30a0: 2b 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 69 6e 74  +)..  {..    int
30b0: 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69   cnum = pIdx->ai
30c0: 43 6f 6c 75 6d 6e 5b 6e 5d 3b 0d 0a 20 20 20 20  Column[n];..    
30d0: 69 66 20 28 73 71 6c 69 74 65 33 53 74 72 49 43  if (sqlite3StrIC
30e0: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e  mp(pTab->aCol[cn
30f0: 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  um].zName, zColu
3100: 6d 6e 4e 61 6d 65 29 20 3d 3d 20 30 29 0d 0a 20  mnName) == 0).. 
3110: 20 20 20 7b 0d 0a 20 20 20 20 20 20 2a 73 6f 72     {..      *sor
3120: 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
3130: 53 6f 72 74 4f 72 64 65 72 5b 6e 5d 3b 0d 0a 20  SortOrder[n];.. 
3140: 20 20 20 20 20 2a 70 7a 43 6f 6c 6c 20 3d 20 70       *pzColl = p
3150: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 3b 0d  Idx->azColl[n];.
3160: 0a 20 20 20 20 20 20 2a 70 6c 65 6e 20 3d 20 73  .      *plen = s
3170: 74 72 6c 65 6e 28 2a 70 7a 43 6f 6c 6c 29 3b 0d  trlen(*pzColl);.
3180: 0a 20 20 20 20 20 20 2a 6f 6e 45 72 72 6f 72 20  .      *onError 
3190: 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b  = pIdx->onError;
31a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
31b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a 20 20 20   SQLITE_OK;..   
31c0: 20 7d 0d 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72   }..  }..  retur
31d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d  n SQLITE_ERROR;.
31e0: 0a 7d 0d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63  .}....__declspec
31f0: 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20  (dllexport) int 
3200: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 74  WINAPI sqlite3_t
3210: 61 62 6c 65 5f 63 75 72 73 6f 72 28 73 71 6c 69  able_cursor(sqli
3220: 74 65 33 5f 73 74 6d 74 20 2a 70 73 74 6d 74 2c  te3_stmt *pstmt,
3230: 20 69 6e 74 20 69 44 62 2c 20 50 67 6e 6f 20 74   int iDb, Pgno t
3240: 61 62 6c 65 52 6f 6f 74 50 61 67 65 29 0d 0a 7b  ableRootPage)..{
3250: 0d 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28 56  ..  Vdbe *p = (V
3260: 64 62 65 20 2a 29 70 73 74 6d 74 3b 0d 0a 20 20  dbe *)pstmt;..  
3270: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 70  sqlite3 *db = (p
3280: 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 4e 55 4c 4c   == NULL) ? NULL
3290: 20 3a 20 70 2d 3e 64 62 3b 0d 0a 20 20 69 6e 74   : p->db;..  int
32a0: 20 6e 3b 0d 0a 20 20 69 6e 74 20 72 65 74 20 3d   n;..  int ret =
32b0: 20 2d 31 3b 0d 0a 0d 0a 20 20 73 71 6c 69 74 65   -1;....  sqlite
32c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
32d0: 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20 20 66 6f 72  ->mutex);..  for
32e0: 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70 2d 3e   (n = 0; n < p->
32f0: 6e 43 75 72 73 6f 72 20 26 26 20 70 2d 3e 61 70  nCursor && p->ap
3300: 43 73 72 5b 6e 5d 20 21 3d 20 4e 55 4c 4c 3b 20  Csr[n] != NULL; 
3310: 6e 2b 2b 29 0d 0a 20 20 7b 0d 0a 20 20 20 20 69  n++)..  {..    i
3320: 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d 3e  f (p->apCsr[n]->
3330: 69 73 54 61 62 6c 65 20 3d 3d 20 46 41 4c 53 45  isTable == FALSE
3340: 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20  ) continue;..   
3350: 20 69 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d   if (p->apCsr[n]
3360: 2d 3e 69 44 62 20 21 3d 20 69 44 62 29 20 63 6f  ->iDb != iDb) co
3370: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 69 66 20  ntinue;..    if 
3380: 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d 3e 70 43  (p->apCsr[n]->pC
3390: 75 72 73 6f 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  ursor->pgnoRoot 
33a0: 3d 3d 20 74 61 62 6c 65 52 6f 6f 74 50 61 67 65  == tableRootPage
33b0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
33c0: 72 65 74 20 3d 20 6e 3b 0d 0a 20 20 20 20 20 20  ret = n;..      
33d0: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20  break;..    }.. 
33e0: 20 7d 0d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
33f0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
3400: 74 65 78 29 3b 0d 0a 0d 0a 20 20 72 65 74 75 72  tex);....  retur
3410: 6e 20 72 65 74 3b 0d 0a 7d 0d 0a 0d 0a 5f 5f 64  n ret;..}....__d
3420: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
3430: 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  t) int WINAPI sq
3440: 6c 69 74 65 33 5f 63 75 72 73 6f 72 5f 72 6f 77  lite3_cursor_row
3450: 69 64 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  id(sqlite3_stmt 
3460: 2a 70 73 74 6d 74 2c 20 69 6e 74 20 63 75 72 73  *pstmt, int curs
3470: 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
3480: 20 2a 70 72 6f 77 69 64 29 0d 0a 7b 0d 0a 20 20   *prowid)..{..  
3490: 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20  Vdbe *p = (Vdbe 
34a0: 2a 29 70 73 74 6d 74 3b 0d 0a 20 20 73 71 6c 69  *)pstmt;..  sqli
34b0: 74 65 33 20 2a 64 62 20 3d 20 28 70 20 3d 3d 20  te3 *db = (p == 
34c0: 4e 55 4c 4c 29 20 3f 20 4e 55 4c 4c 20 3a 20 70  NULL) ? NULL : p
34d0: 2d 3e 64 62 3b 0d 0a 20 20 56 64 62 65 43 75 72  ->db;..  VdbeCur
34e0: 73 6f 72 20 2a 70 43 3b 0d 0a 20 20 69 6e 74 20  sor *pC;..  int 
34f0: 72 65 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 73 71  ret = 0;....  sq
3500: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
3510: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d 0a 20  r(db->mutex);.. 
3520: 20 77 68 69 6c 65 20 28 31 29 0d 0a 20 20 7b 0d   while (1)..  {.
3530: 0a 20 20 20 20 69 66 20 28 63 75 72 73 6f 72 20  .    if (cursor 
3540: 3c 20 30 20 7c 7c 20 63 75 72 73 6f 72 20 3e 3d  < 0 || cursor >=
3550: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 0d 0a 20 20   p->nCursor)..  
3560: 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 20 3d    {..      ret =
3570: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0d 0a   SQLITE_ERROR;..
3580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20        break;..  
3590: 20 20 7d 0d 0a 20 20 20 20 69 66 20 28 70 2d 3e    }..    if (p->
35a0: 61 70 43 73 72 5b 63 75 72 73 6f 72 5d 20 3d 3d  apCsr[cursor] ==
35b0: 20 4e 55 4c 4c 29 0d 0a 20 20 20 20 7b 0d 0a 20   NULL)..    {.. 
35c0: 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54       ret = SQLIT
35d0: 45 5f 45 52 52 4f 52 3b 0d 0a 20 20 20 20 20 20  E_ERROR;..      
35e0: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  break;..    }...
35f0: 0a 20 20 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  .    pC = p->apC
3600: 73 72 5b 63 75 72 73 6f 72 5d 3b 0d 0a 0d 0a 20  sr[cursor];.... 
3610: 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
3620: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
3630: 28 70 43 29 3b 0d 0a 20 20 20 20 69 66 28 72 65  (pC);..    if(re
3640: 74 29 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t)..      break;
3650: 0d 0a 0d 0a 20 20 20 20 69 66 28 70 43 2d 3e 72  ....    if(pC->r
3660: 6f 77 69 64 49 73 56 61 6c 69 64 29 0d 0a 20 20  owidIsValid)..  
3670: 20 20 7b 0d 0a 20 20 20 20 20 20 2a 70 72 6f 77    {..      *prow
3680: 69 64 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77  id = pC->lastRow
3690: 69 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  id;..    }..    
36a0: 65 6c 73 65 20 69 66 28 70 43 2d 3e 70 73 65 75  else if(pC->pseu
36b0: 64 6f 54 61 62 6c 65 52 65 67 20 3e 20 30 29 0d  doTableReg > 0).
36c0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
36d0: 74 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  t = SQLITE_ERROR
36e0: 3b 0d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0d  ;..      break;.
36f0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 65 6c 73 65  .    }..    else
3700: 20 69 66 28 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20   if(pC->nullRow 
3710: 7c 7c 20 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d  || pC->pCursor==
3720: 30 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  0)..    {..     
3730: 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 45 52   ret = SQLITE_ER
3740: 52 4f 52 3b 0d 0a 20 20 20 20 20 20 62 72 65 61  ROR;..      brea
3750: 6b 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 65  k;..    }..    e
3760: 6c 73 65 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  lse..    {..    
3770: 20 20 69 66 20 28 70 43 2d 3e 70 43 75 72 73 6f    if (pC->pCurso
3780: 72 20 3d 3d 20 4e 55 4c 4c 29 0d 0a 20 20 20 20  r == NULL)..    
3790: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74    {..        ret
37a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
37b0: 0d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
37c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
37d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
37e0: 53 69 7a 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  Size(pC->pCursor
37f0: 2c 20 70 72 6f 77 69 64 29 3b 0d 0a 20 20 20 20  , prowid);..    
3800: 20 20 2a 70 72 6f 77 69 64 20 3d 20 2a 70 72 6f    *prowid = *pro
3810: 77 69 64 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  wid;..    }..   
3820: 20 62 72 65 61 6b 3b 0d 0a 20 20 7d 0d 0a 20 20   break;..  }..  
3830: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
3840: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0d  ave(db->mutex);.
3850: 0a 0d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ...  return ret;
3860: 0d 0a 7d 0d 0a 0d 0a 23 65 6e 64 69 66 20 2f 2f  ..}....#endif //
3870: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0d 0a   SQLITE_OS_WIN..
3880: 0d 0a                                            ..