System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 2c2747360293e112902492fd5071464130b47a44:


0000: 23 69 6e 63 6c 75 64 65 20 22 2e 2e 2f 63 6f 72  #include "../cor
0010: 65 2f 73 71 6c 69 74 65 33 2e 63 22 0a 23 69 6e  e/sqlite3.c".#in
0020: 63 6c 75 64 65 20 22 2e 2e 2f 63 6f 6e 74 72 69  clude "../contri
0030: 62 2f 65 78 74 65 6e 73 69 6f 6e 2d 66 75 6e 63  b/extension-func
0040: 74 69 6f 6e 73 2e 63 22 0a 23 69 6e 63 6c 75 64  tions.c".#includ
0050: 65 20 22 63 72 79 70 74 2e 63 22 0a 0a 65 78 74  e "crypt.c"..ext
0060: 65 72 6e 20 69 6e 74 20 52 65 67 69 73 74 65 72  ern int Register
0070: 45 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69 6f  ExtensionFunctio
0080: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 3b  ns(sqlite3 *db);
0090: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
00a0: 4f 53 5f 57 49 4e 0a 0a 2f 2f 20 41 64 64 69 74  OS_WIN..// Addit
00b0: 69 6f 6e 61 6c 20 6f 70 65 6e 20 66 6c 61 67 73  ional open flags
00c0: 2c 20 77 65 20 75 73 65 20 74 68 69 73 20 6f 6e  , we use this on
00d0: 65 20 70 72 69 76 61 74 65 6c 79 0a 2f 2f 23 64  e privately.//#d
00e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 50 45  efine SQLITE_OPE
00f0: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 20 20  N_SHAREDCACHE   
0100: 20 20 20 30 78 30 31 30 30 30 30 30 30 0a 0a 74     0x01000000..t
0110: 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 53 51  ypedef void (*SQ
0120: 4c 49 54 45 55 53 45 52 46 55 4e 43 29 28 73 71  LITEUSERFUNC)(sq
0130: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 2c  lite3_context *,
0140: 20 69 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61   int, sqlite3_va
0150: 6c 75 65 20 2a 2a 29 3b 0a 74 79 70 65 64 65 66  lue **);.typedef
0160: 20 76 6f 69 64 20 28 2a 53 51 4c 49 54 45 46 55   void (*SQLITEFU
0170: 4e 43 46 49 4e 41 4c 29 28 73 71 6c 69 74 65 33  NCFINAL)(sqlite3
0180: 5f 63 6f 6e 74 65 78 74 20 2a 29 3b 0a 0a 2f 2a  _context *);../*
0190: 0a 20 20 20 20 54 68 65 20 67 6f 61 6c 20 6f 66  .    The goal of
01a0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
01b0: 20 63 6c 6f 73 65 20 69 73 20 64 69 66 66 65 72   close is differ
01c0: 65 6e 74 20 74 68 61 6e 20 74 68 61 74 20 6f 66  ent than that of
01d0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
01e0: 2c 20 61 6e 64 20 69 73 20 64 65 73 69 67 6e 65  , and is designe
01f0: 64 20 74 6f 20 6c 65 6e 64 20 69 74 73 65 6c 66  d to lend itself
0200: 20 62 65 74 74 65 72 20 74 6f 20 2e 4e 45 54 27   better to .NET'
0210: 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  s non-determinis
0220: 74 69 63 20 66 69 6e 61 6c 69 7a 65 72 73 20 61  tic finalizers a
0230: 6e 64 0a 20 20 20 20 74 68 65 20 47 43 20 74 68  nd.    the GC th
0240: 72 65 61 64 2e 20 20 53 51 4c 69 74 65 20 77 69  read.  SQLite wi
0250: 6c 6c 20 6e 6f 74 20 63 6c 6f 73 65 20 61 20 64  ll not close a d
0260: 61 74 61 62 61 73 65 20 69 66 20 73 74 61 74 65  atabase if state
0270: 6d 65 6e 74 73 20 61 72 65 20 6f 70 65 6e 20 6f  ments are open o
0280: 6e 20 69 74 20 2d 2d 20 62 75 74 20 66 6f 72 20  n it -- but for 
0290: 6f 75 72 20 70 75 72 70 6f 73 65 73 2c 20 77 65  our purposes, we
02a0: 27 64 20 72 61 74 68 65 72 20 66 69 6e 61 6c 69  'd rather finali
02b0: 7a 65 20 61 6c 6c 20 61 63 74 69 76 65 20 73 74  ze all active st
02c0: 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 61 6e 64  atements.    and
02d0: 20 66 6f 72 63 69 62 6c 79 20 63 6c 6f 73 65 20   forcibly close 
02e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
02f0: 68 65 20 72 65 61 73 6f 6e 20 69 73 20 73 69 6d  he reason is sim
0300: 70 6c 65 20 2d 2d 20 61 20 6c 6f 74 20 6f 66 20  ple -- a lot of 
0310: 70 65 6f 70 6c 65 20 64 6f 6e 27 74 20 44 69 73  people don't Dis
0320: 70 6f 73 65 28 29 20 6f 66 20 74 68 65 69 72 20  pose() of their 
0330: 6f 62 6a 65 63 74 73 20 63 6f 72 72 65 63 74 6c  objects correctl
0340: 79 20 61 6e 64 20 6c 65 74 20 74 68 65 20 67 61  y and let the ga
0350: 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 6f 72 0a  rbage collector.
0360: 20 20 20 20 64 6f 20 69 74 2e 20 20 54 68 69 73      do it.  This
0370: 20 6c 65 61 64 73 20 74 6f 20 75 6e 65 78 70 65   leads to unexpe
0380: 63 74 65 64 20 62 65 68 61 76 69 6f 72 20 77 68  cted behavior wh
0390: 65 6e 20 61 20 75 73 65 72 20 74 68 69 6e 6b 73  en a user thinks
03a0: 20 74 68 65 79 27 76 65 20 63 6c 6f 73 65 64 20   they've closed 
03b0: 61 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20  a database, but 
03c0: 69 74 27 73 20 73 74 69 6c 6c 20 6f 70 65 6e 20  it's still open 
03d0: 62 65 63 61 75 73 65 20 6e 6f 74 20 61 6c 6c 20  because not all 
03e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 68  the statements h
03f0: 61 76 65 0a 20 20 20 20 68 69 74 20 74 68 65 20  ave.    hit the 
0400: 47 43 20 79 65 74 2e 0a 0a 20 20 20 20 53 6f 2c  GC yet...    So,
0410: 20 68 65 72 65 20 77 65 20 68 61 76 65 20 61 20   here we have a 
0420: 70 72 6f 62 6c 65 6d 20 2e 2e 2e 20 2e 4e 45 54  problem ... .NET
0430: 20 68 61 73 20 61 20 70 6f 69 6e 74 65 72 20 74   has a pointer t
0440: 6f 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  o any number of 
0450: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a  sqlite3_stmt obj
0460: 65 63 74 73 2e 20 20 57 65 20 63 61 6e 27 74 20  ects.  We can't 
0470: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6e  call sqlite3_fin
0480: 61 6c 69 7a 65 28 29 20 6f 6e 20 74 68 65 73 65  alize() on these
0490: 20 62 65 63 61 75 73 65 0a 20 20 20 20 74 68 65   because.    the
04a0: 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
04b0: 65 64 20 61 6e 64 20 63 61 6e 20 62 65 20 75 73  ed and can be us
04c0: 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67  ed for something
04d0: 20 65 6c 73 65 2e 20 20 54 68 65 20 47 43 20 74   else.  The GC t
04e0: 68 72 65 61 64 20 63 6f 75 6c 64 20 70 6f 74 65  hread could pote
04f0: 6e 74 69 61 6c 6c 79 20 74 72 79 20 61 6e 64 20  ntially try and 
0500: 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 20 61 67  call finalize ag
0510: 61 69 6e 20 6f 6e 20 74 68 65 20 73 74 61 74 65  ain on the state
0520: 6d 65 6e 74 20 61 66 74 65 72 0a 20 20 20 20 74  ment after.    t
0530: 68 61 74 20 6d 65 6d 6f 72 79 20 77 61 73 20 64  hat memory was d
0540: 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 42 41 44  eallocated.  BAD
0550: 2e 20 20 53 6f 2c 20 77 68 61 74 20 77 65 20 6e  .  So, what we n
0560: 65 65 64 20 74 6f 20 64 6f 20 69 73 20 6d 61 6b  eed to do is mak
0570: 65 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68  e a copy of each
0580: 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20   statement, and 
0590: 63 61 6c 6c 20 66 69 6e 61 6c 69 7a 65 28 29 20  call finalize() 
05a0: 6f 6e 20 74 68 65 20 63 6f 70 79 20 2d 2d 20 73  on the copy -- s
05b0: 6f 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  o that the origi
05c0: 6e 61 6c 0a 20 20 20 20 73 74 61 74 65 6d 65 6e  nal.    statemen
05d0: 74 27 73 20 6d 65 6d 6f 72 79 20 69 73 20 70 72  t's memory is pr
05e0: 65 73 65 72 76 65 64 2c 20 61 6e 64 20 6d 61 72  eserved, and mar
05f0: 6b 65 64 20 61 73 20 42 41 44 2c 20 62 75 74 20  ked as BAD, but 
0600: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 6d 61 6e  we can still man
0610: 61 67 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  age to finalize 
0620: 65 76 65 72 79 74 68 69 6e 67 20 61 6e 64 20 66  everything and f
0630: 6f 72 63 69 62 6c 79 20 63 6c 6f 73 65 20 74 68  orcibly close th
0640: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4c 61 74  e database.  Lat
0650: 65 72 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  er when the .   
0660: 20 47 43 20 67 65 74 73 20 61 72 6f 75 6e 64 20   GC gets around 
0670: 74 6f 20 63 61 6c 6c 69 6e 67 20 66 69 6e 61 6c  to calling final
0680: 69 7a 65 5f 69 6e 74 65 72 6f 70 28 29 20 6f 6e  ize_interop() on
0690: 20 74 68 65 20 22 62 61 64 22 20 73 74 61 74 65   the "bad" state
06a0: 6d 65 6e 74 2c 20 77 65 20 64 65 74 65 63 74 20  ment, we detect 
06b0: 74 68 61 74 20 61 6e 64 20 66 69 6e 69 73 68 20  that and finish 
06c0: 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  deallocating the
06d0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 5f 5f 64   pointer..*/.__d
06e0: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
06f0: 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  t) int WINAPI sq
0700: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 69 6e 74 65  lite3_close_inte
0710: 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62 29  rop(sqlite3 *db)
0720: 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .{.  int ret;.  
0730: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
0740: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 0a 20 20 69  _close(db);..  i
0750: 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45  f (ret == SQLITE
0760: 5f 42 55 53 59 20 26 26 20 64 62 2d 3e 70 56 64  _BUSY && db->pVd
0770: 62 65 29 0a 20 20 7b 0a 20 20 20 20 77 68 69 6c  be).  {.    whil
0780: 65 20 28 64 62 2d 3e 70 56 64 62 65 29 0a 20 20  e (db->pVdbe).  
0790: 20 20 7b 0a 20 20 20 20 20 20 2f 2f 20 4d 61 6b    {.      // Mak
07a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
07b0: 66 69 72 73 74 20 70 72 65 70 61 72 65 64 20 73  first prepared s
07c0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 56  tatement.      V
07d0: 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a  dbe *p = (Vdbe *
07e0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
07f0: 73 69 7a 65 6f 66 28 56 64 62 65 29 29 3b 0a 20  sizeof(Vdbe));. 
0800: 20 20 20 20 20 56 64 62 65 20 2a 70 6f 20 3d 20       Vdbe *po = 
0810: 64 62 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20  db->pVdbe;..    
0820: 20 20 69 66 20 28 21 70 29 20 0a 20 20 20 20 20    if (!p) .     
0830: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d   {.        ret =
0840: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
0850: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0860: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 43 6f 70      }..      Cop
0870: 79 4d 65 6d 6f 72 79 28 70 2c 20 70 6f 2c 20 73  yMemory(p, po, s
0880: 69 7a 65 6f 66 28 56 64 62 65 29 29 3b 0a 0a 20  izeof(Vdbe));.. 
0890: 20 20 20 20 20 2f 2f 20 50 75 74 20 69 74 20 6f       // Put it o
08a0: 6e 20 74 68 65 20 63 68 61 69 6e 20 73 6f 20 77  n the chain so w
08b0: 65 20 63 61 6e 20 66 72 65 65 20 69 74 0a 20 20  e can free it.  
08c0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
08d0: 70 3b 0a 20 20 20 20 20 20 72 65 74 20 3d 20 73  p;.      ret = s
08e0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
08f0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
0900: 70 29 3b 20 2f 2f 20 54 68 69 73 20 77 69 6c 6c  p); // This will
0910: 20 61 6c 73 6f 20 66 72 65 65 20 74 68 65 20 63   also free the c
0920: 6f 70 79 27 73 20 6d 65 6d 6f 72 79 0a 20 20 20  opy's memory.   
0930: 20 20 20 69 66 20 28 72 65 74 29 0a 20 20 20 20     if (ret).    
0940: 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 66    {.        // f
0950: 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 20 2d  inalize failed -
0960: 2d 20 73 6f 20 77 65 20 6d 75 73 74 20 70 75 74  - so we must put
0970: 20 62 61 63 6b 20 61 6e 79 74 68 69 6e 67 20 77   back anything w
0980: 65 20 6d 75 6e 67 65 64 0a 20 20 20 20 20 20 20  e munged.       
0990: 20 43 6f 70 79 4d 65 6d 6f 72 79 28 70 6f 2c 20   CopyMemory(po, 
09a0: 70 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 29  p, sizeof(Vdbe))
09b0: 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 56  ;.        db->pV
09c0: 64 62 65 20 3d 20 70 6f 3b 0a 20 20 20 20 20 20  dbe = po;.      
09d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
09e0: 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .      else.    
09f0: 20 20 7b 0a 20 20 20 20 20 20 20 20 5a 65 72 6f    {.        Zero
0a00: 4d 65 6d 6f 72 79 28 70 6f 2c 20 73 69 7a 65 6f  Memory(po, sizeo
0a10: 66 28 56 64 62 65 29 29 3b 0a 20 20 20 20 20 20  f(Vdbe));.      
0a20: 20 20 70 6f 2d 3e 6d 61 67 69 63 20 3d 20 56 44    po->magic = VD
0a30: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
0a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
0a50: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 63   ret = sqlite3_c
0a60: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  lose(db);.  }.. 
0a70: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
0a80: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
0a90: 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49  port) int WINAPI
0aa0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e   sqlite3_open_in
0ab0: 74 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61 72  terop(const char
0ac0: 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 66  *filename, int f
0ad0: 6c 61 67 73 2c 20 73 71 6c 69 74 65 33 20 2a 2a  lags, sqlite3 **
0ae0: 70 70 64 62 29 0a 7b 0a 20 20 69 6e 74 20 72 65  ppdb).{.  int re
0af0: 74 3b 0a 20 20 2f 2f 69 6e 74 20 73 68 61 72 65  t;.  //int share
0b00: 64 63 61 63 68 65 20 3d 20 28 28 66 6c 61 67 73  dcache = ((flags
0b10: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
0b20: 48 41 52 45 44 43 41 43 48 45 29 20 21 3d 20 30  HAREDCACHE) != 0
0b30: 29 3b 0a 20 20 2f 2f 66 6c 61 67 73 20 26 3d 20  );.  //flags &= 
0b40: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
0b50: 52 45 44 43 41 43 48 45 3b 0a 0a 20 20 2f 2f 73  REDCACHE;..  //s
0b60: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
0b70: 61 72 65 64 5f 63 61 63 68 65 28 73 68 61 72 65  ared_cache(share
0b80: 64 63 61 63 68 65 29 3b 0a 20 20 72 65 74 20 3d  dcache);.  ret =
0b90: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
0ba0: 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 64 62 2c  (filename, ppdb,
0bb0: 20 66 6c 61 67 73 2c 20 4e 55 4c 4c 29 3b 0a 20   flags, NULL);. 
0bc0: 20 2f 2f 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c   //sqlite3_enabl
0bd0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 30  e_shared_cache(0
0be0: 29 3b 0a 0a 20 20 69 66 20 28 72 65 74 20 3d 3d  );..  if (ret ==
0bf0: 20 30 29 0a 20 20 20 20 52 65 67 69 73 74 65 72   0).    Register
0c00: 45 78 74 65 6e 73 69 6f 6e 46 75 6e 63 74 69 6f  ExtensionFunctio
0c10: 6e 73 28 2a 70 70 64 62 29 3b 0a 0a 20 20 72 65  ns(*ppdb);..  re
0c20: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 5f 5f 64  turn ret;.}..__d
0c30: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
0c40: 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  t) int WINAPI sq
0c50: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 5f 69 6e 74  lite3_open16_int
0c60: 65 72 6f 70 28 63 6f 6e 73 74 20 63 68 61 72 20  erop(const char 
0c70: 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 66  *filename, int f
0c80: 6c 61 67 73 2c 20 73 71 6c 69 74 65 33 20 2a 2a  lags, sqlite3 **
0c90: 70 70 64 62 29 0a 7b 0a 20 20 69 6e 74 20 72 65  ppdb).{.  int re
0ca0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  t = sqlite3_open
0cb0: 5f 69 6e 74 65 72 6f 70 28 66 69 6c 65 6e 61 6d  _interop(filenam
0cc0: 65 2c 20 66 6c 61 67 73 2c 20 70 70 64 62 29 3b  e, flags, ppdb);
0cd0: 0a 20 20 69 66 20 28 21 72 65 74 29 0a 20 20 7b  .  if (!ret).  {
0ce0: 0a 20 20 20 20 69 66 28 21 44 62 48 61 73 50 72  .    if(!DbHasPr
0cf0: 6f 70 65 72 74 79 28 2a 70 70 64 62 2c 20 30 2c  operty(*ppdb, 0,
0d00: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
0d10: 29 29 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70  )).      ENC(*pp
0d20: 64 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  db) = SQLITE_UTF
0d30: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
0d40: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 5f  return ret;.}.._
0d50: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
0d60: 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61 72 20  ort) const char 
0d70: 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  * WINAPI sqlite3
0d80: 5f 65 72 72 6d 73 67 5f 69 6e 74 65 72 6f 70 28  _errmsg_interop(
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
0db0: 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73  t char *pval = s
0dc0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
0dd0: 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76  );.  *plen = (pv
0de0: 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65  al != 0) ? strle
0df0: 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0a 20 20 72  n(pval) : 0;.  r
0e00: 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f  eturn pval;.}.._
0e10: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
0e20: 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
0e30: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
0e40: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20  interop(sqlite3 
0e50: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
0e60: 2a 73 71 6c 2c 20 69 6e 74 20 6e 62 79 74 65 73  *sql, int nbytes
0e70: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
0e80: 2a 70 70 73 74 6d 74 2c 20 63 6f 6e 73 74 20 63  *ppstmt, const c
0e90: 68 61 72 20 2a 2a 70 7a 74 61 69 6c 2c 20 69 6e  har **pztail, in
0ea0: 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 69 6e 74  t *plen).{.  int
0eb0: 20 6e 3b 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74   n;..  n = sqlit
0ec0: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 73  e3_prepare(db, s
0ed0: 71 6c 2c 20 6e 62 79 74 65 73 2c 20 70 70 73 74  ql, nbytes, ppst
0ee0: 6d 74 2c 20 70 7a 74 61 69 6c 29 3b 0a 20 20 2a  mt, pztail);.  *
0ef0: 70 6c 65 6e 20 3d 20 28 2a 70 7a 74 61 69 6c 20  plen = (*pztail 
0f00: 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 2a  != 0) ? strlen(*
0f10: 70 7a 74 61 69 6c 29 20 3a 20 30 3b 0a 0a 20 20  pztail) : 0;..  
0f20: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 5f 5f 64  return n;.}..__d
0f30: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
0f40: 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  t) int WINAPI sq
0f50: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
0f60: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20  interop(sqlite3 
0f70: 2a 64 62 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  *db, const void 
0f80: 2a 73 71 6c 2c 20 69 6e 74 20 6e 63 68 61 72 73  *sql, int nchars
0f90: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
0fa0: 2a 70 70 73 74 6d 74 2c 20 63 6f 6e 73 74 20 76  *ppstmt, const v
0fb0: 6f 69 64 20 2a 2a 70 7a 74 61 69 6c 2c 20 69 6e  oid **pztail, in
0fc0: 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 69 6e 74  t *plen).{.  int
0fd0: 20 6e 3b 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74   n;..  n = sqlit
0fe0: 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c  e3_prepare16(db,
0ff0: 20 73 71 6c 2c 20 6e 63 68 61 72 73 20 2a 20 73   sql, nchars * s
1000: 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 2c 20  izeof(wchar_t), 
1010: 70 70 73 74 6d 74 2c 20 70 7a 74 61 69 6c 29 3b  ppstmt, pztail);
1020: 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 2a 70 7a 74  .  *plen = (*pzt
1030: 61 69 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c  ail != 0) ? wcsl
1040: 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 2a 70  en((wchar_t *)*p
1050: 7a 74 61 69 6c 29 20 2a 20 73 69 7a 65 6f 66 28  ztail) * sizeof(
1060: 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0a 0a 20  wchar_t) : 0;.. 
1070: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 5f 5f   return n;.}..__
1080: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
1090: 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73  rt) int WINAPI s
10a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
10b0: 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  le_interop(sqlit
10c0: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
10d0: 6e 74 20 69 43 6f 6c 2c 20 64 6f 75 62 6c 65 20  nt iCol, double 
10e0: 2a 76 61 6c 29 0a 7b 0a 09 72 65 74 75 72 6e 20  *val).{..return 
10f0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
1100: 62 6c 65 28 73 74 6d 74 2c 69 43 6f 6c 2c 2a 76  ble(stmt,iCol,*v
1110: 61 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70  al);.}..__declsp
1120: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e  ec(dllexport) in
1130: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
1140: 5f 62 69 6e 64 5f 69 6e 74 36 34 5f 69 6e 74 65  _bind_int64_inte
1150: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
1160: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
1170: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
1180: 76 61 6c 29 0a 7b 0a 09 72 65 74 75 72 6e 20 73  val).{..return s
1190: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
11a0: 34 28 73 74 6d 74 2c 69 43 6f 6c 2c 2a 76 61 6c  4(stmt,iCol,*val
11b0: 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  );.}..__declspec
11c0: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
11d0: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
11e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
11f0: 61 6d 65 74 65 72 5f 6e 61 6d 65 5f 69 6e 74 65  ameter_name_inte
1200: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
1210: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
1220: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20  , int *plen).{. 
1230: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61   const char *pva
1240: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  l = sqlite3_bind
1250: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
1260: 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a  stmt, iCol);.  *
1270: 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20  plen = (pval != 
1280: 30 29 20 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c  0) ? strlen(pval
1290: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
12a0: 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73  pval;.}..__decls
12b0: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63  pec(dllexport) c
12c0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e 41  onst char * WINA
12d0: 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  PI sqlite3_colum
12e0: 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73  n_name_interop(s
12f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
1300: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
1310: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
1320: 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73  t char *pval = s
1330: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
1340: 6d 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  me(stmt, iCol);.
1350: 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20    *plen = (pval 
1360: 21 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70  != 0) ? strlen(p
1370: 76 61 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  val) : 0;.  retu
1380: 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65  rn pval;.}..__de
1390: 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
13a0: 29 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57  ) const void * W
13b0: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f  INAPI sqlite3_co
13c0: 6c 75 6d 6e 5f 6e 61 6d 65 31 36 5f 69 6e 74 65  lumn_name16_inte
13d0: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
13e0: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
13f0: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20  , int *plen).{. 
1400: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61   const void *pva
1410: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1420: 6d 6e 5f 6e 61 6d 65 31 36 28 73 74 6d 74 2c 20  mn_name16(stmt, 
1430: 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d  iCol);.  *plen =
1440: 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77   (pval != 0) ? w
1450: 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a  cslen((wchar_t *
1460: 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28  )pval) * sizeof(
1470: 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0a 20 20  wchar_t) : 0;.  
1480: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a  return pval;.}..
1490: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
14a0: 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61 72  port) const char
14b0: 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65   * WINAPI sqlite
14c0: 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
14d0: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
14e0: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
14f0: 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65  t iCol, int *ple
1500: 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  n).{.  const cha
1510: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
1520: 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1530: 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  e(stmt, iCol);. 
1540: 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21   *plen = (pval !
1550: 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70 76  = 0) ? strlen(pv
1560: 61 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  al) : 0;.  retur
1570: 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63  n pval;.}..__dec
1580: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1590: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57 49   const void * WI
15a0: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
15b0: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 5f 69  umn_decltype16_i
15c0: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
15d0: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
15e0: 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a  Col, int *plen).
15f0: 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
1600: 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pval = sqlite3_c
1610: 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
1620: 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  (stmt, iCol);.  
1630: 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d  *plen = (pval !=
1640: 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77 63   0) ? wcslen((wc
1650: 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a 20  har_t *)pval) * 
1660: 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 20  sizeof(wchar_t) 
1670: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76  : 0;.  return pv
1680: 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65  al;.}..__declspe
1690: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 76 6f 69  c(dllexport) voi
16a0: 64 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  d WINAPI sqlite3
16b0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 5f 69  _column_double_i
16c0: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73  nterop(sqlite3_s
16d0: 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69  tmt *stmt, int i
16e0: 43 6f 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c  Col, double *val
16f0: 29 0a 7b 0a 09 2a 76 61 6c 20 3d 20 73 71 6c 69  ).{..*val = sqli
1700: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1710: 65 28 73 74 6d 74 2c 69 43 6f 6c 29 3b 0a 7d 0a  e(stmt,iCol);.}.
1720: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
1730: 78 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e 41  xport) void WINA
1740: 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  PI sqlite3_colum
1750: 6e 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28  n_int64_interop(
1760: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
1770: 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71  mt, int iCol, sq
1780: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29  lite_int64 *val)
1790: 0a 7b 0a 09 2a 76 61 6c 20 3d 20 73 71 6c 69 74  .{..*val = sqlit
17a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
17b0: 73 74 6d 74 2c 69 43 6f 6c 29 3b 0a 7d 0a 0a 5f  stmt,iCol);.}.._
17c0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
17d0: 6f 72 74 29 20 63 6f 6e 73 74 20 75 6e 73 69 67  ort) const unsig
17e0: 6e 65 64 20 63 68 61 72 20 2a 20 57 49 4e 41 50  ned char * WINAP
17f0: 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  I sqlite3_column
1800: 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 71  _text_interop(sq
1810: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
1820: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
1830: 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74  *plen).{.  const
1840: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1850: 70 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pval = sqlite3_c
1860: 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 74 6d 74 2c  olumn_text(stmt,
1870: 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20   iCol);.  *plen 
1880: 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20  = (pval != 0) ? 
1890: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
18a0: 76 61 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  val) : 0;.  retu
18b0: 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65  rn pval;.}..__de
18c0: 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
18d0: 29 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57  ) const void * W
18e0: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f  INAPI sqlite3_co
18f0: 6c 75 6d 6e 5f 74 65 78 74 31 36 5f 69 6e 74 65  lumn_text16_inte
1900: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
1910: 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c   *stmt, int iCol
1920: 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20  , int *plen).{. 
1930: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61   const void *pva
1940: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1950: 6d 6e 5f 74 65 78 74 31 36 28 73 74 6d 74 2c 20  mn_text16(stmt, 
1960: 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d  iCol);.  *plen =
1970: 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77   (pval != 0) ? w
1980: 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a  cslen((wchar_t *
1990: 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28  )pval) * sizeof(
19a0: 77 63 68 61 72 5f 74 29 3a 20 30 3b 0a 20 20 72  wchar_t): 0;.  r
19b0: 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f  eturn pval;.}.._
19c0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
19d0: 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
19e0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
19f0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
1a00: 5f 73 74 6d 74 20 2a 73 74 6d 74 29 0a 7b 0a 20  _stmt *stmt).{. 
1a10: 20 56 64 62 65 20 2a 70 3b 0a 20 20 73 71 6c 69   Vdbe *p;.  sqli
1a20: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1a30: 65 74 3b 0a 0a 20 20 70 20 3d 20 28 56 64 62 65  et;..  p = (Vdbe
1a40: 20 2a 29 73 74 6d 74 3b 0a 20 20 69 66 20 28 70   *)stmt;.  if (p
1a50: 20 26 26 20 70 2d 3e 6d 61 67 69 63 20 3d 3d 20   && p->magic == 
1a60: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 29  VDBE_MAGIC_DEAD)
1a70: 0a 20 20 7b 0a 20 20 20 20 64 62 20 3d 20 70 2d  .  {.    db = p-
1a80: 3e 64 62 3b 0a 20 20 20 20 69 66 20 28 64 62 20  >db;.    if (db 
1a90: 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 7b 0a 20  == NULL).    {. 
1aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ab0: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 20  e(p);.      ret 
1ac0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ad0: 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 0a 20 20   }.  }.  else.  
1ae0: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f    ret = sqlite3_
1af0: 66 69 6e 61 6c 69 7a 65 28 73 74 6d 74 29 3b 0a  finalize(stmt);.
1b00: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
1b10: 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
1b20: 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e 41  export) int WINA
1b30: 50 49 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  PI sqlite3_reset
1b40: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
1b50: 5f 73 74 6d 74 20 2a 73 74 6d 74 29 0a 7b 0a 20  _stmt *stmt).{. 
1b60: 20 69 6e 74 20 72 65 74 3b 0a 0a 20 20 69 66 20   int ret;..  if 
1b70: 28 28 28 56 64 62 65 20 2a 29 73 74 6d 74 29 2d  (((Vdbe *)stmt)-
1b80: 3e 6d 61 67 69 63 20 3d 3d 20 56 44 42 45 5f 4d  >magic == VDBE_M
1b90: 41 47 49 43 5f 44 45 41 44 29 20 72 65 74 75 72  AGIC_DEAD) retur
1ba0: 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b  n SQLITE_SCHEMA;
1bb0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
1bc0: 5f 72 65 73 65 74 28 73 74 6d 74 29 3b 0a 20 20  _reset(stmt);.  
1bd0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 5f  return ret;.}.._
1be0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
1bf0: 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
1c00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1c10: 75 6e 63 74 69 6f 6e 5f 69 6e 74 65 72 6f 70 28  unction_interop(
1c20: 73 71 6c 69 74 65 33 20 2a 70 73 71 6c 2c 20 63  sqlite3 *psql, c
1c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
1c40: 74 69 6f 6e 4e 61 6d 65 2c 20 69 6e 74 20 6e 41  tionName, int nA
1c50: 72 67 2c 20 69 6e 74 20 65 54 65 78 74 52 65 70  rg, int eTextRep
1c60: 2c 20 76 6f 69 64 20 2a 70 76 55 73 65 72 2c 20  , void *pvUser, 
1c70: 53 51 4c 49 54 45 55 53 45 52 46 55 4e 43 20 66  SQLITEUSERFUNC f
1c80: 75 6e 63 2c 20 53 51 4c 49 54 45 55 53 45 52 46  unc, SQLITEUSERF
1c90: 55 4e 43 20 66 75 6e 63 73 74 65 70 2c 20 53 51  UNC funcstep, SQ
1ca0: 4c 49 54 45 46 55 4e 43 46 49 4e 41 4c 20 66 75  LITEFUNCFINAL fu
1cb0: 6e 63 66 69 6e 61 6c 2c 20 69 6e 74 20 6e 65 65  ncfinal, int nee
1cc0: 64 43 6f 6c 6c 53 65 71 29 0a 7b 0a 20 20 69 6e  dCollSeq).{.  in
1cd0: 74 20 6e 3b 0a 0a 20 20 69 66 20 28 65 54 65 78  t n;..  if (eTex
1ce0: 74 52 65 70 20 3d 3d 20 53 51 4c 49 54 45 5f 55  tRep == SQLITE_U
1cf0: 54 46 31 36 29 0a 20 20 20 20 65 54 65 78 74 52  TF16).    eTextR
1d00: 65 70 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  ep = SQLITE_UTF1
1d10: 36 4e 41 54 49 56 45 3b 0a 0a 20 20 6e 20 3d 20  6NATIVE;..  n = 
1d20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1d30: 75 6e 63 74 69 6f 6e 28 70 73 71 6c 2c 20 7a 46  unction(psql, zF
1d40: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
1d50: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 30 2c 20  g, eTextRep, 0, 
1d60: 66 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20  func, funcstep, 
1d70: 66 75 6e 63 66 69 6e 61 6c 29 3b 0a 20 20 69 66  funcfinal);.  if
1d80: 20 28 6e 20 3d 3d 20 30 29 0a 20 20 7b 0a 20 20   (n == 0).  {.  
1d90: 20 20 69 66 20 28 6e 65 65 64 43 6f 6c 6c 53 65    if (needCollSe
1da0: 71 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 46  q).    {.      F
1db0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
1dc0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1dd0: 69 6f 6e 28 70 73 71 6c 2c 20 7a 46 75 6e 63 74  ion(psql, zFunct
1de0: 69 6f 6e 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ionName, strlen(
1df0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 2c 20  zFunctionName), 
1e00: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
1e10: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  0);.      if( pF
1e20: 75 6e 63 20 29 0a 20 20 20 20 20 20 7b 0a 20 20  unc ).      {.  
1e30: 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 66 6c 61        pFunc->fla
1e40: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 55 4e  gs |= SQLITE_FUN
1e50: 43 5f 4e 45 45 44 43 4f 4c 4c 3b 0a 20 20 20 20  C_NEEDCOLL;.    
1e60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e70: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 5f 5f   return n;.}..__
1e80: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
1e90: 72 74 29 20 76 6f 69 64 20 57 49 4e 41 50 49 20  rt) void WINAPI 
1ea0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
1eb0: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  uble_interop(sql
1ec0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 76 61 6c  ite3_value *pval
1ed0: 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29 0a 7b  , double *val).{
1ee0: 0a 20 20 2a 76 61 6c 20 3d 20 73 71 6c 69 74 65  .  *val = sqlite
1ef0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
1f00: 76 61 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73  val);.}..__decls
1f10: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 76  pec(dllexport) v
1f20: 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69 74  oid WINAPI sqlit
1f30: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 5f 69  e3_value_int64_i
1f40: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 76  nterop(sqlite3_v
1f50: 61 6c 75 65 20 2a 70 76 61 6c 2c 20 73 71 6c 69  alue *pval, sqli
1f60: 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0a 7b  te_int64 *val).{
1f70: 0a 20 20 2a 76 61 6c 20 3d 20 73 71 6c 69 74 65  .  *val = sqlite
1f80: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 76  3_value_int64(pv
1f90: 61 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70  al);.}..__declsp
1fa0: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f  ec(dllexport) co
1fb0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1fc0: 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  r * WINAPI sqlit
1fd0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 5f 69 6e  e3_value_text_in
1fe0: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 76 61  terop(sqlite3_va
1ff0: 6c 75 65 20 2a 76 61 6c 2c 20 69 6e 74 20 2a 70  lue *val, int *p
2000: 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 75  len).{.  const u
2010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 76  nsigned char *pv
2020: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
2030: 75 65 5f 74 65 78 74 28 76 61 6c 29 3b 0a 20 20  ue_text(val);.  
2040: 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d  *plen = (pval !=
2050: 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 28 63 68   0) ? strlen((ch
2060: 61 72 20 2a 29 70 76 61 6c 29 20 3a 20 30 3b 0a  ar *)pval) : 0;.
2070: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d    return pval;.}
2080: 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
2090: 65 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 76 6f  export) const vo
20a0: 69 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69  id * WINAPI sqli
20b0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
20c0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
20d0: 5f 76 61 6c 75 65 20 2a 76 61 6c 2c 20 69 6e 74  _value *val, int
20e0: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
20f0: 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73  t void *pval = s
2100: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2110: 74 31 36 28 76 61 6c 29 3b 0a 20 20 2a 70 6c 65  t16(val);.  *ple
2120: 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20  n = (pval != 0) 
2130: 3f 20 77 63 73 6c 65 6e 28 28 77 63 68 61 72 5f  ? wcslen((wchar_
2140: 74 20 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a 65  t *)pval) * size
2150: 6f 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b  of(wchar_t) : 0;
2160: 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a  .  return pval;.
2170: 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  }..__declspec(dl
2180: 6c 65 78 70 6f 72 74 29 20 76 6f 69 64 20 57 49  lexport) void WI
2190: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 72 65 73  NAPI sqlite3_res
21a0: 75 6c 74 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72  ult_double_inter
21b0: 6f 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  op(sqlite3_conte
21c0: 78 74 20 2a 70 63 74 78 2c 20 64 6f 75 62 6c 65  xt *pctx, double
21d0: 20 2a 76 61 6c 29 0a 7b 0a 20 20 73 71 6c 69 74   *val).{.  sqlit
21e0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
21f0: 28 70 63 74 78 2c 20 2a 76 61 6c 29 3b 0a 7d 0a  (pctx, *val);.}.
2200: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
2210: 78 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e 41  xport) void WINA
2220: 50 49 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  PI sqlite3_resul
2230: 74 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28  t_int64_interop(
2240: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2250: 2a 70 63 74 78 2c 20 73 71 6c 69 74 65 5f 69 6e  *pctx, sqlite_in
2260: 74 36 34 20 2a 76 61 6c 29 0a 7b 0a 20 20 73 71  t64 *val).{.  sq
2270: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2280: 36 34 28 70 63 74 78 2c 20 2a 76 61 6c 29 3b 0a  64(pctx, *val);.
2290: 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  }..__declspec(dl
22a0: 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e  lexport) int WIN
22b0: 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  API sqlite3_cont
22c0: 65 78 74 5f 63 6f 6c 6c 63 6f 6d 70 61 72 65 28  ext_collcompare(
22d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
22e0: 2a 63 74 78 2c 20 63 6f 6e 73 74 20 76 6f 69 64  *ctx, const void
22f0: 20 2a 70 31 2c 20 69 6e 74 20 70 31 6c 65 6e 2c   *p1, int p1len,
2300: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 2c   const void *p2,
2310: 20 69 6e 74 20 70 32 6c 65 6e 29 0a 7b 0a 20 20   int p2len).{.  
2320: 69 66 20 28 28 63 74 78 2d 3e 70 46 75 6e 63 2d  if ((ctx->pFunc-
2330: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2340: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 20 3d  FUNC_NEEDCOLL) =
2350: 3d 20 30 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  = 0) return 2;. 
2360: 20 72 65 74 75 72 6e 20 63 74 78 2d 3e 70 43 6f   return ctx->pCo
2370: 6c 6c 2d 3e 78 43 6d 70 28 63 74 78 2d 3e 70 43  ll->xCmp(ctx->pC
2380: 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 70 31 6c 65  oll->pUser, p1le
2390: 6e 2c 20 70 31 2c 20 70 32 6c 65 6e 2c 20 70 32  n, p1, p2len, p2
23a0: 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  );.}..__declspec
23b0: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
23c0: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
23d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
23e0: 63 6f 6c 6c 73 65 71 28 73 71 6c 69 74 65 33 5f  collseq(sqlite3_
23f0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
2400: 74 20 2a 70 74 79 70 65 2c 20 69 6e 74 20 2a 65  t *ptype, int *e
2410: 6e 63 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b  nc, int *plen).{
2420: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2430: 6c 20 3d 20 63 74 78 2d 3e 70 43 6f 6c 6c 3b 0a  l = ctx->pColl;.
2440: 20 20 2a 70 74 79 70 65 20 3d 20 30 3b 0a 20 20    *ptype = 0;.  
2450: 2a 70 6c 65 6e 20 3d 20 30 3b 0a 20 20 2a 65 6e  *plen = 0;.  *en
2460: 63 20 3d 20 30 3b 0a 0a 20 20 69 66 20 28 28 63  c = 0;..  if ((c
2470: 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  tx->pFunc->flags
2480: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2490: 45 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20 72  EEDCOLL) == 0) r
24a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 69  eturn NULL;..  i
24b0: 66 20 28 70 43 6f 6c 6c 29 0a 20 20 7b 0a 20 20  f (pColl).  {.  
24c0: 20 20 2a 65 6e 63 20 3d 20 70 43 6f 6c 6c 2d 3e    *enc = pColl->
24d0: 65 6e 63 3b 0a 20 20 20 20 2a 70 74 79 70 65 20  enc;.    *ptype 
24e0: 3d 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 3b 0a 20  = pColl->type;. 
24f0: 20 20 20 2a 70 6c 65 6e 20 3d 20 28 70 43 6f 6c     *plen = (pCol
2500: 6c 2d 3e 7a 4e 61 6d 65 20 21 3d 20 30 29 20 3f  l->zName != 0) ?
2510: 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a   strlen(pColl->z
2520: 4e 61 6d 65 29 20 3a 20 30 3b 0a 0a 20 20 20 20  Name) : 0;..    
2530: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 7a 4e  return pColl->zN
2540: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
2550: 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 5f 5f 64 65 63  n NULL;.}..__dec
2560: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
2570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49   const char * WI
2580: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
2590: 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
25a0: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
25b0: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
25c0: 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65  t iCol, int *ple
25d0: 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  n).{.  const cha
25e0: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
25f0: 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
2600: 65 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f  e_name(stmt, iCo
2610: 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70  l);.  *plen = (p
2620: 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c  val != 0) ? strl
2630: 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0a 20 20  en(pval) : 0;.  
2640: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a  return pval;.}..
2650: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2660: 70 6f 72 74 29 20 63 6f 6e 73 74 20 76 6f 69 64  port) const void
2670: 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65   * WINAPI sqlite
2680: 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
2690: 65 5f 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70  e_name16_interop
26a0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73  (sqlite3_stmt *s
26b0: 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  tmt, int iCol, i
26c0: 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f  nt *plen).{.  co
26d0: 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d  nst void *pval =
26e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26f0: 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 28  database_name16(
2700: 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a  stmt, iCol);.  *
2710: 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20  plen = (pval != 
2720: 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77 63 68  0) ? wcslen((wch
2730: 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a 20 73  ar_t *)pval) * s
2740: 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 20 3a  izeof(wchar_t) :
2750: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61   0;.  return pva
2760: 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  l;.}..__declspec
2770: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
2780: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
2790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27a0: 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  able_name_intero
27b0: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
27c0: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
27d0: 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63  int *plen).{.  c
27e0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20  onst char *pval 
27f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2800: 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74 6d 74  _table_name(stmt
2810: 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e  , iCol);.  *plen
2820: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
2830: 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20   strlen(pval) : 
2840: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  0;.  return pval
2850: 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28  ;.}..__declspec(
2860: 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74  dllexport) const
2870: 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20 73   void * WINAPI s
2880: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
2890: 62 6c 65 5f 6e 61 6d 65 31 36 5f 69 6e 74 65 72  ble_name16_inter
28a0: 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  op(sqlite3_stmt 
28b0: 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  *stmt, int iCol,
28c0: 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20   int *plen).{.  
28d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c  const void *pval
28e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
28f0: 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 28 73  n_table_name16(s
2900: 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70  tmt, iCol);.  *p
2910: 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30  len = (pval != 0
2920: 29 20 3f 20 77 63 73 6c 65 6e 28 28 77 63 68 61  ) ? wcslen((wcha
2930: 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a 20 73 69  r_t *)pval) * si
2940: 7a 65 6f 66 28 77 63 68 61 72 5f 74 29 20 3a 20  zeof(wchar_t) : 
2950: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c  0;.  return pval
2960: 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28  ;.}..__declspec(
2970: 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74  dllexport) const
2980: 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73   char * WINAPI s
2990: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
29a0: 69 67 69 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  igin_name_intero
29b0: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
29c0: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
29d0: 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63  int *plen).{.  c
29e0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 76 61 6c 20  onst char *pval 
29f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2a00: 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 73 74 6d  _origin_name(stm
2a10: 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65  t, iCol);.  *ple
2a20: 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20  n = (pval != 0) 
2a30: 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a  ? strlen(pval) :
2a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61   0;.  return pva
2a50: 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  l;.}..__declspec
2a60: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
2a70: 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20  t void * WINAPI 
2a80: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
2a90: 72 69 67 69 6e 5f 6e 61 6d 65 31 36 5f 69 6e 74  rigin_name16_int
2aa0: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
2ab0: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
2ac0: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a  l, int *plen).{.
2ad0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76    const void *pv
2ae0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
2af0: 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31  umn_origin_name1
2b00: 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  6(stmt, iCol);. 
2b10: 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21   *plen = (pval !
2b20: 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77  = 0) ? wcslen((w
2b30: 63 68 61 72 5f 74 20 2a 29 70 76 61 6c 29 20 2a  char_t *)pval) *
2b40: 20 73 69 7a 65 6f 66 28 77 63 68 61 72 5f 74 29   sizeof(wchar_t)
2b50: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
2b60: 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70  val;.}..__declsp
2b70: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e  ec(dllexport) in
2b80: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
2b90: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
2ba0: 74 61 64 61 74 61 5f 69 6e 74 65 72 6f 70 28 73  tadata_interop(s
2bb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
2bc0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
2bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2be0: 62 6c 65 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  bleName, const c
2bf0: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
2c00: 2c 20 63 68 61 72 20 2a 2a 70 7a 44 61 74 61 54  , char **pzDataT
2c10: 79 70 65 2c 20 63 68 61 72 20 2a 2a 70 7a 43 6f  ype, char **pzCo
2c20: 6c 6c 53 65 71 2c 20 69 6e 74 20 2a 70 4e 6f 74  llSeq, int *pNot
2c30: 4e 75 6c 6c 2c 20 69 6e 74 20 2a 70 50 72 69 6d  Null, int *pPrim
2c40: 61 72 79 4b 65 79 2c 20 69 6e 74 20 2a 70 41 75  aryKey, int *pAu
2c50: 74 6f 69 6e 63 2c 20 69 6e 74 20 2a 70 64 74 4c  toinc, int *pdtL
2c60: 65 6e 2c 20 69 6e 74 20 2a 70 63 73 4c 65 6e 29  en, int *pcsLen)
2c70: 0a 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 0a 20  .{.  int n;.  . 
2c80: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62   n = sqlite3_tab
2c90: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
2ca0: 74 61 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ta(db, zDbName, 
2cb0: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6f 6c  zTableName, zCol
2cc0: 75 6d 6e 4e 61 6d 65 2c 20 70 7a 44 61 74 61 54  umnName, pzDataT
2cd0: 79 70 65 2c 20 70 7a 43 6f 6c 6c 53 65 71 2c 20  ype, pzCollSeq, 
2ce0: 70 4e 6f 74 4e 75 6c 6c 2c 20 70 50 72 69 6d 61  pNotNull, pPrima
2cf0: 72 79 4b 65 79 2c 20 70 41 75 74 6f 69 6e 63 29  ryKey, pAutoinc)
2d00: 3b 0a 20 20 2a 70 64 74 4c 65 6e 20 3d 20 28 2a  ;.  *pdtLen = (*
2d10: 70 7a 44 61 74 61 54 79 70 65 20 21 3d 20 30 29  pzDataType != 0)
2d20: 20 3f 20 73 74 72 6c 65 6e 28 2a 70 7a 44 61 74   ? strlen(*pzDat
2d30: 61 54 79 70 65 29 20 3a 20 30 3b 0a 20 20 2a 70  aType) : 0;.  *p
2d40: 63 73 4c 65 6e 20 3d 20 28 2a 70 7a 43 6f 6c 6c  csLen = (*pzColl
2d50: 53 65 71 20 21 3d 20 30 29 20 3f 20 73 74 72 6c  Seq != 0) ? strl
2d60: 65 6e 28 2a 70 7a 43 6f 6c 6c 53 65 71 29 20 3a  en(*pzCollSeq) :
2d70: 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 3b   0;..  return n;
2d80: 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  .}..__declspec(d
2d90: 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49  llexport) int WI
2da0: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 69 6e 64  NAPI sqlite3_ind
2db0: 65 78 5f 63 6f 6c 75 6d 6e 5f 69 6e 66 6f 5f 69  ex_column_info_i
2dc0: 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a  nterop(sqlite3 *
2dd0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2de0: 7a 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  zDb, const char 
2df0: 2a 7a 49 6e 64 65 78 4e 61 6d 65 2c 20 63 6f 6e  *zIndexName, con
2e00: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
2e10: 4e 61 6d 65 2c 20 69 6e 74 20 2a 73 6f 72 74 4f  Name, int *sortO
2e20: 72 64 65 72 2c 20 69 6e 74 20 2a 6f 6e 45 72 72  rder, int *onErr
2e30: 6f 72 2c 20 63 68 61 72 20 2a 2a 70 7a 43 6f 6c  or, char **pzCol
2e40: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a  l, int *plen).{.
2e50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
2e60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2e70: 69 6e 74 20 6e 3b 0a 20 20 70 49 64 78 20 3d 20  int n;.  pIdx = 
2e80: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
2e90: 28 64 62 2c 20 7a 49 6e 64 65 78 4e 61 6d 65 2c  (db, zIndexName,
2ea0: 20 7a 44 62 29 3b 0a 20 20 69 66 20 28 21 70 49   zDb);.  if (!pI
2eb0: 64 78 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  dx) return SQLIT
2ec0: 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 54 61 62  E_ERROR;..  pTab
2ed0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
2ee0: 0a 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b 20 6e  .  for (n = 0; n
2ef0: 20 3c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   < pIdx->nColumn
2f00: 3b 20 6e 2b 2b 29 0a 20 20 7b 0a 20 20 20 20 69  ; n++).  {.    i
2f10: 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e  nt cnum = pIdx->
2f20: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 3b 0a 20 20 20  aiColumn[n];.   
2f30: 20 69 66 20 28 73 71 6c 69 74 65 33 53 74 72 49   if (sqlite3StrI
2f40: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 63  Cmp(pTab->aCol[c
2f50: 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  num].zName, zCol
2f60: 75 6d 6e 4e 61 6d 65 29 20 3d 3d 20 30 29 0a 20  umnName) == 0). 
2f70: 20 20 20 7b 0a 20 20 20 20 20 20 2a 73 6f 72 74     {.      *sort
2f80: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
2f90: 6f 72 74 4f 72 64 65 72 5b 6e 5d 3b 0a 20 20 20  ortOrder[n];.   
2fa0: 20 20 20 2a 70 7a 43 6f 6c 6c 20 3d 20 70 49 64     *pzColl = pId
2fb0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 3b 0a 20 20  x->azColl[n];.  
2fc0: 20 20 20 20 2a 70 6c 65 6e 20 3d 20 73 74 72 6c      *plen = strl
2fd0: 65 6e 28 2a 70 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en(*pzColl);.   
2fe0: 20 20 20 2a 6f 6e 45 72 72 6f 72 20 3d 20 70 49     *onError = pI
2ff0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20  dx->onError;..  
3000: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3010: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
3020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3030: 45 52 52 4f 52 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c  ERROR;.}..__decl
3040: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
3050: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
3060: 65 33 5f 74 61 62 6c 65 5f 63 75 72 73 6f 72 28  e3_table_cursor(
3070: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 73  sqlite3_stmt *ps
3080: 74 6d 74 2c 20 69 6e 74 20 69 44 62 2c 20 50 67  tmt, int iDb, Pg
3090: 6e 6f 20 74 61 62 6c 65 52 6f 6f 74 50 61 67 65  no tableRootPage
30a0: 29 0a 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20  ).{.  Vdbe *p = 
30b0: 28 56 64 62 65 20 2a 29 70 73 74 6d 74 3b 0a 20  (Vdbe *)pstmt;. 
30c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
30d0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 4e 55 4c  p == NULL) ? NUL
30e0: 4c 20 3a 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  L : p->db;.  int
30f0: 20 6e 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20   n;.  int ret = 
3100: 2d 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  -1;..  sqlite3_m
3110: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
3120: 75 74 65 78 29 3b 0a 20 20 66 6f 72 20 28 6e 20  utex);.  for (n 
3130: 3d 20 30 3b 20 6e 20 3c 20 70 2d 3e 6e 43 75 72  = 0; n < p->nCur
3140: 73 6f 72 20 26 26 20 70 2d 3e 61 70 43 73 72 5b  sor && p->apCsr[
3150: 6e 5d 20 21 3d 20 4e 55 4c 4c 3b 20 6e 2b 2b 29  n] != NULL; n++)
3160: 0a 20 20 7b 0a 20 20 20 20 69 66 20 28 70 2d 3e  .  {.    if (p->
3170: 61 70 43 73 72 5b 6e 5d 2d 3e 69 73 54 61 62 6c  apCsr[n]->isTabl
3180: 65 20 3d 3d 20 46 41 4c 53 45 29 20 63 6f 6e 74  e == FALSE) cont
3190: 69 6e 75 65 3b 0a 20 20 20 20 69 66 20 28 70 2d  inue;.    if (p-
31a0: 3e 61 70 43 73 72 5b 6e 5d 2d 3e 69 44 62 20 21  >apCsr[n]->iDb !
31b0: 3d 20 69 44 62 29 20 63 6f 6e 74 69 6e 75 65 3b  = iDb) continue;
31c0: 0a 20 20 20 20 69 66 20 28 70 2d 3e 61 70 43 73  .    if (p->apCs
31d0: 72 5b 6e 5d 2d 3e 70 43 75 72 73 6f 72 2d 3e 70  r[n]->pCursor->p
31e0: 67 6e 6f 52 6f 6f 74 20 3d 3d 20 74 61 62 6c 65  gnoRoot == table
31f0: 52 6f 6f 74 50 61 67 65 29 0a 20 20 20 20 7b 0a  RootPage).    {.
3200: 20 20 20 20 20 20 72 65 74 20 3d 20 6e 3b 0a 20        ret = n;. 
3210: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3220: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
3230: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
3240: 6d 75 74 65 78 29 3b 0a 0a 20 20 72 65 74 75 72  mutex);..  retur
3250: 6e 20 72 65 74 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c  n ret;.}..__decl
3260: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
3270: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
3280: 65 33 5f 63 75 72 73 6f 72 5f 72 6f 77 69 64 28  e3_cursor_rowid(
3290: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 73  sqlite3_stmt *ps
32a0: 74 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f 72 2c  tmt, int cursor,
32b0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
32c0: 72 6f 77 69 64 29 0a 7b 0a 20 20 56 64 62 65 20  rowid).{.  Vdbe 
32d0: 2a 70 20 3d 20 28 56 64 62 65 20 2a 29 70 73 74  *p = (Vdbe *)pst
32e0: 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  mt;.  sqlite3 *d
32f0: 62 20 3d 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20  b = (p == NULL) 
3300: 3f 20 4e 55 4c 4c 20 3a 20 70 2d 3e 64 62 3b 0a  ? NULL : p->db;.
3310: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
3320: 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b  ;.  int ret = 0;
3330: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
3340: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
3350: 78 29 3b 0a 20 20 77 68 69 6c 65 20 28 31 29 0a  x);.  while (1).
3360: 20 20 7b 0a 20 20 20 20 69 66 20 28 63 75 72 73    {.    if (curs
3370: 6f 72 20 3c 20 30 20 7c 7c 20 63 75 72 73 6f 72  or < 0 || cursor
3380: 20 3e 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 0a   >= p->nCursor).
3390: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 20      {.      ret 
33a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
33b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33c0: 20 7d 0a 20 20 20 20 69 66 20 28 70 2d 3e 61 70   }.    if (p->ap
33d0: 43 73 72 5b 63 75 72 73 6f 72 5d 20 3d 3d 20 4e  Csr[cursor] == N
33e0: 55 4c 4c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ULL).    {.     
33f0: 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 45 52   ret = SQLITE_ER
3400: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3410: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 20  ;.    }..    pC 
3420: 3d 20 70 2d 3e 61 70 43 73 72 5b 63 75 72 73 6f  = p->apCsr[curso
3430: 72 5d 3b 0a 0a 20 20 20 20 72 65 74 20 3d 20 73  r];..    ret = s
3440: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
3450: 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20  Moveto(pC);.    
3460: 69 66 28 72 65 74 29 0a 20 20 20 20 20 20 62 72  if(ret).      br
3470: 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 70 43 2d  eak;..    if(pC-
3480: 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 29 0a 20  >rowidIsValid). 
3490: 20 20 20 7b 0a 20 20 20 20 20 20 2a 70 72 6f 77     {.      *prow
34a0: 69 64 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77  id = pC->lastRow
34b0: 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  id;.    }.    el
34c0: 73 65 20 69 66 28 70 43 2d 3e 70 73 65 75 64 6f  se if(pC->pseudo
34d0: 54 61 62 6c 65 52 65 67 20 3e 20 30 29 0a 20 20  TableReg > 0).  
34e0: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 20 3d 20    {.      ret = 
34f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3510: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 70 43 2d  .    else if(pC-
3520: 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 43 2d 3e  >nullRow || pC->
3530: 70 43 75 72 73 6f 72 3d 3d 30 29 0a 20 20 20 20  pCursor==0).    
3540: 7b 0a 20 20 20 20 20 20 72 65 74 20 3d 20 53 51  {.      ret = SQ
3550: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3570: 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 20 20     else.    {.  
3580: 20 20 20 20 69 66 20 28 70 43 2d 3e 70 43 75 72      if (pC->pCur
3590: 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  sor == NULL).   
35a0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74     {.        ret
35b0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
35c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
35e0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
35f0: 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70  e(pC->pCursor, p
3600: 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2a 70  rowid);.      *p
3610: 72 6f 77 69 64 20 3d 20 2a 70 72 6f 77 69 64 3b  rowid = *prowid;
3620: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
3630: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
3640: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
3650: 6d 75 74 65 78 29 3b 0a 0a 20 20 72 65 74 75 72  mutex);..  retur
3660: 6e 20 72 65 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66  n ret;.}..#endif
3670: 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   // SQLITE_OS_WI
3680: 4e 0a 0a                                         N..