System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1ae2d2c9dd522c41d2853a9f0eefd3f10ded102d:


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 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
0d70: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
0d80: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 5f 69 6e  _result_codes_in
0d90: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 20 2a 64  terop(sqlite3 *d
0da0: 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 0a 7b 0a  b, int onoff).{.
0db0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
0dc0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
0dd0: 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 6f 6e 6f  lt_codes(db, ono
0de0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
0df0: 3b 0a 7d 0a 0d 0a 5f 5f 64 65 63 6c 73 70 65 63  ;.}...__declspec
0e00: 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20  (dllexport) int 
0e10: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 65  WINAPI sqlite3_e
0e20: 72 72 63 6f 64 65 5f 69 6e 74 65 72 6f 70 28 73  rrcode_interop(s
0e30: 71 6c 69 74 65 33 20 2a 64 62 29 0a 7b 0a 20 20  qlite3 *db).{.  
0e40: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
0e50: 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
0e60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0d 0a 5f  return rc;.}..._
0e70: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
0e80: 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
0e90: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
0ea0: 5f 65 72 72 63 6f 64 65 5f 69 6e 74 65 72 6f 70  _errcode_interop
0eb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 0a 7b 0a  (sqlite3 *db).{.
0ec0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
0ed0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
0ee0: 6f 64 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ode(db);.  retur
0ef0: 6e 20 72 63 3b 0a 7d 0a 0d 0a 5f 5f 64 65 63 6c  n rc;.}...__decl
0f00: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
0f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49 4e  const char * WIN
0f20: 41 50 49 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  API sqlite3_errm
0f30: 73 67 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  sg_interop(sqlit
0f40: 65 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70 6c 65  e3 *db, int *ple
0f50: 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  n).{.  const cha
0f60: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
0f70: 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
0f80: 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d  *plen = (pval !=
0f90: 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70 76 61   0) ? strlen(pva
0fa0: 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  l) : 0;.  return
0fb0: 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c   pval;.}..__decl
0fc0: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
0fd0: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
0fe0: 65 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65 72  e3_prepare_inter
0ff0: 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  op(sqlite3 *db, 
1000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c  const char *sql,
1010: 20 69 6e 74 20 6e 62 79 74 65 73 2c 20 73 71 6c   int nbytes, sql
1020: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 73 74  ite3_stmt **ppst
1030: 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  mt, const char *
1040: 2a 70 7a 74 61 69 6c 2c 20 69 6e 74 20 2a 70 6c  *pztail, int *pl
1050: 65 6e 29 0a 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  en).{.  int n;..
1060: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 70 72    n = sqlite3_pr
1070: 65 70 61 72 65 28 64 62 2c 20 73 71 6c 2c 20 6e  epare(db, sql, n
1080: 62 79 74 65 73 2c 20 70 70 73 74 6d 74 2c 20 70  bytes, ppstmt, p
1090: 7a 74 61 69 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20  ztail);.  *plen 
10a0: 3d 20 28 2a 70 7a 74 61 69 6c 20 21 3d 20 30 29  = (*pztail != 0)
10b0: 20 3f 20 73 74 72 6c 65 6e 28 2a 70 7a 74 61 69   ? strlen(*pztai
10c0: 6c 29 20 3a 20 30 3b 0a 0a 20 20 72 65 74 75 72  l) : 0;..  retur
10d0: 6e 20 6e 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70  n n;.}..__declsp
10e0: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e  ec(dllexport) in
10f0: 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33  t WINAPI sqlite3
1100: 5f 70 72 65 70 61 72 65 31 36 5f 69 6e 74 65 72  _prepare16_inter
1110: 6f 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  op(sqlite3 *db, 
1120: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 2c  const void *sql,
1130: 20 69 6e 74 20 6e 63 68 61 72 73 2c 20 73 71 6c   int nchars, sql
1140: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 73 74  ite3_stmt **ppst
1150: 6d 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  mt, const void *
1160: 2a 70 7a 74 61 69 6c 2c 20 69 6e 74 20 2a 70 6c  *pztail, int *pl
1170: 65 6e 29 0a 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  en).{.  int n;..
1180: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 70 72    n = sqlite3_pr
1190: 65 70 61 72 65 31 36 28 64 62 2c 20 73 71 6c 2c  epare16(db, sql,
11a0: 20 6e 63 68 61 72 73 20 2a 20 73 69 7a 65 6f 66   nchars * sizeof
11b0: 28 77 63 68 61 72 5f 74 29 2c 20 70 70 73 74 6d  (wchar_t), ppstm
11c0: 74 2c 20 70 7a 74 61 69 6c 29 3b 0a 20 20 2a 70  t, pztail);.  *p
11d0: 6c 65 6e 20 3d 20 28 2a 70 7a 74 61 69 6c 20 21  len = (*pztail !
11e0: 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e 28 28 77  = 0) ? wcslen((w
11f0: 63 68 61 72 5f 74 20 2a 29 2a 70 7a 74 61 69 6c  char_t *)*pztail
1200: 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72  ) * sizeof(wchar
1210: 5f 74 29 20 3a 20 30 3b 0a 0a 20 20 72 65 74 75  _t) : 0;..  retu
1220: 72 6e 20 6e 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73  rn n;.}..__decls
1230: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 69  pec(dllexport) i
1240: 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65  nt WINAPI sqlite
1250: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 5f 69 6e  3_bind_double_in
1260: 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74  terop(sqlite3_st
1270: 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43  mt *stmt, int iC
1280: 6f 6c 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c 29  ol, double *val)
1290: 0a 7b 0a 09 72 65 74 75 72 6e 20 73 71 6c 69 74  .{..return sqlit
12a0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 73  e3_bind_double(s
12b0: 74 6d 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b 0a  tmt,iCol,*val);.
12c0: 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  }..__declspec(dl
12d0: 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e  lexport) int WIN
12e0: 41 50 49 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  API sqlite3_bind
12f0: 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73  _int64_interop(s
1300: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
1310: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 73 71 6c  t, int iCol, sql
1320: 69 74 65 5f 69 6e 74 36 34 20 2a 76 61 6c 29 0a  ite_int64 *val).
1330: 7b 0a 09 72 65 74 75 72 6e 20 73 71 6c 69 74 65  {..return sqlite
1340: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 73 74 6d  3_bind_int64(stm
1350: 74 2c 69 43 6f 6c 2c 2a 76 61 6c 29 3b 0a 7d 0a  t,iCol,*val);.}.
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 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
13a0: 72 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73  r_name_interop(s
13b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
13c0: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
13d0: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
13e0: 74 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73  t char *pval = s
13f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1400: 6d 65 74 65 72 5f 6e 61 6d 65 28 73 74 6d 74 2c  meter_name(stmt,
1410: 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20   iCol);.  *plen 
1420: 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20  = (pval != 0) ? 
1430: 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30  strlen(pval) : 0
1440: 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b  ;.  return pval;
1450: 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  .}..__declspec(d
1460: 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74 20  llexport) const 
1470: 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71  char * WINAPI sq
1480: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
1490: 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  e_interop(sqlite
14a0: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e  3_stmt *stmt, in
14b0: 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65  t iCol, int *ple
14c0: 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  n).{.  const cha
14d0: 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  r *pval = sqlite
14e0: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 73 74  3_column_name(st
14f0: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c  mt, iCol);.  *pl
1500: 65 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29  en = (pval != 0)
1510: 20 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20   ? strlen(pval) 
1520: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76  : 0;.  return pv
1530: 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65  al;.}..__declspe
1540: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e  c(dllexport) con
1550: 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49  st void * WINAPI
1560: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1570: 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28 73  name16_interop(s
1580: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
1590: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
15a0: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
15b0: 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73  t void *pval = s
15c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
15d0: 6d 65 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29  me16(stmt, iCol)
15e0: 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61  ;.  *plen = (pva
15f0: 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e  l != 0) ? wcslen
1600: 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76 61 6c  ((wchar_t *)pval
1610: 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72  ) * sizeof(wchar
1620: 5f 74 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  _t) : 0;.  retur
1630: 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63  n pval;.}..__dec
1640: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 57 49   const char * WI
1660: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
1670: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 5f 69 6e 74  umn_decltype_int
1680: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
1690: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
16a0: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a  l, int *plen).{.
16b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76    const char *pv
16c0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
16d0: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 73 74 6d  umn_decltype(stm
16e0: 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65  t, iCol);.  *ple
16f0: 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20  n = (pval != 0) 
1700: 3f 20 73 74 72 6c 65 6e 28 70 76 61 6c 29 20 3a  ? strlen(pval) :
1710: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76 61   0;.  return pva
1720: 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  l;.}..__declspec
1730: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
1740: 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49 20  t void * WINAPI 
1750: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1760: 65 63 6c 74 79 70 65 31 36 5f 69 6e 74 65 72 6f  ecltype16_intero
1770: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
1780: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
1790: 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63  int *plen).{.  c
17a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20  onst void *pval 
17b0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17c0: 5f 64 65 63 6c 74 79 70 65 31 36 28 73 74 6d 74  _decltype16(stmt
17d0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e  , iCol);.  *plen
17e0: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
17f0: 20 77 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74   wcslen((wchar_t
1800: 20 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f   *)pval) * sizeo
1810: 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0a  f(wchar_t) : 0;.
1820: 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d    return pval;.}
1830: 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  ..__declspec(dll
1840: 65 78 70 6f 72 74 29 20 76 6f 69 64 20 57 49 4e  export) void WIN
1850: 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  API sqlite3_colu
1860: 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f  mn_double_intero
1870: 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  p(sqlite3_stmt *
1880: 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  stmt, int iCol, 
1890: 64 6f 75 62 6c 65 20 2a 76 61 6c 29 0a 7b 0a 09  double *val).{..
18a0: 2a 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  *val = sqlite3_c
18b0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 73 74 6d  olumn_double(stm
18c0: 74 2c 69 43 6f 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65  t,iCol);.}..__de
18d0: 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
18e0: 29 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71  ) void WINAPI sq
18f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1900: 36 34 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  64_interop(sqlit
1910: 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69  e3_stmt *stmt, i
1920: 6e 74 20 69 43 6f 6c 2c 20 73 71 6c 69 74 65 5f  nt iCol, sqlite_
1930: 69 6e 74 36 34 20 2a 76 61 6c 29 0a 7b 0a 09 2a  int64 *val).{..*
1940: 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
1950: 6c 75 6d 6e 5f 69 6e 74 36 34 28 73 74 6d 74 2c  lumn_int64(stmt,
1960: 69 43 6f 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c  iCol);.}..__decl
1970: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
1980: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1990: 68 61 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c  har * WINAPI sql
19a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
19b0: 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33  _interop(sqlite3
19c0: 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20 69 6e 74  _stmt *stmt, int
19d0: 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e   iCol, int *plen
19e0: 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ).{.  const unsi
19f0: 67 6e 65 64 20 63 68 61 72 20 2a 70 76 61 6c 20  gned char *pval 
1a00: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1a10: 5f 74 65 78 74 28 73 74 6d 74 2c 20 69 43 6f 6c  _text(stmt, iCol
1a20: 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76  );.  *plen = (pv
1a30: 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c 65  al != 0) ? strle
1a40: 6e 28 28 63 68 61 72 20 2a 29 70 76 61 6c 29 20  n((char *)pval) 
1a50: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 76  : 0;.  return pv
1a60: 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65  al;.}..__declspe
1a70: 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e  c(dllexport) con
1a80: 73 74 20 76 6f 69 64 20 2a 20 57 49 4e 41 50 49  st void * WINAPI
1a90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1aa0: 74 65 78 74 31 36 5f 69 6e 74 65 72 6f 70 28 73  text16_interop(s
1ab0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d  qlite3_stmt *stm
1ac0: 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  t, int iCol, int
1ad0: 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73   *plen).{.  cons
1ae0: 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73  t void *pval = s
1af0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1b00: 78 74 31 36 28 73 74 6d 74 2c 20 69 43 6f 6c 29  xt16(stmt, iCol)
1b10: 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61  ;.  *plen = (pva
1b20: 6c 20 21 3d 20 30 29 20 3f 20 77 63 73 6c 65 6e  l != 0) ? wcslen
1b30: 28 28 77 63 68 61 72 5f 74 20 2a 29 70 76 61 6c  ((wchar_t *)pval
1b40: 29 20 2a 20 73 69 7a 65 6f 66 28 77 63 68 61 72  ) * sizeof(wchar
1b50: 5f 74 29 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  _t): 0;.  return
1b60: 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c   pval;.}..__decl
1b70: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
1b80: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
1b90: 65 33 5f 66 69 6e 61 6c 69 7a 65 5f 69 6e 74 65  e3_finalize_inte
1ba0: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
1bb0: 20 2a 73 74 6d 74 29 0a 7b 0a 20 20 56 64 62 65   *stmt).{.  Vdbe
1bc0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
1bd0: 64 62 3b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 0a  db;.  int ret;..
1be0: 20 20 70 20 3d 20 28 56 64 62 65 20 2a 29 73 74    p = (Vdbe *)st
1bf0: 6d 74 3b 0a 20 20 69 66 20 28 70 20 26 26 20 70  mt;.  if (p && p
1c00: 2d 3e 6d 61 67 69 63 20 3d 3d 20 56 44 42 45 5f  ->magic == VDBE_
1c10: 4d 41 47 49 43 5f 44 45 41 44 29 0a 20 20 7b 0a  MAGIC_DEAD).  {.
1c20: 20 20 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a      db = p->db;.
1c30: 20 20 20 20 69 66 20 28 64 62 20 3d 3d 20 4e 55      if (db == NU
1c40: 4c 4c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  LL).    {.      
1c50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1c60: 0a 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c  .      ret = SQL
1c70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c80: 7d 0a 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74  }.  else.    ret
1c90: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1ca0: 69 7a 65 28 73 74 6d 74 29 3b 0a 0a 20 20 72 65  ize(stmt);..  re
1cb0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 5f 5f 64  turn ret;.}..__d
1cc0: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
1cd0: 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73 71  t) int WINAPI sq
1ce0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 69 6e 74 65  lite3_reset_inte
1cf0: 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  rop(sqlite3_stmt
1d00: 20 2a 73 74 6d 74 29 0a 7b 0a 20 20 69 6e 74 20   *stmt).{.  int 
1d10: 72 65 74 3b 0a 0a 20 20 69 66 20 28 28 28 56 64  ret;..  if (((Vd
1d20: 62 65 20 2a 29 73 74 6d 74 29 2d 3e 6d 61 67 69  be *)stmt)->magi
1d30: 63 20 3d 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  c == VDBE_MAGIC_
1d40: 44 45 41 44 29 20 72 65 74 75 72 6e 20 53 51 4c  DEAD) return SQL
1d50: 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 72 65  ITE_SCHEMA;.  re
1d60: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  t = sqlite3_rese
1d70: 74 28 73 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  t(stmt);.  retur
1d80: 6e 20 72 65 74 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c  n ret;.}..__decl
1d90: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20  spec(dllexport) 
1da0: 69 6e 74 20 57 49 4e 41 50 49 20 73 71 6c 69 74  int WINAPI sqlit
1db0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1dc0: 6f 6e 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  on_interop(sqlit
1dd0: 65 33 20 2a 70 73 71 6c 2c 20 63 6f 6e 73 74 20  e3 *psql, const 
1de0: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
1df0: 61 6d 65 2c 20 69 6e 74 20 6e 41 72 67 2c 20 69  ame, int nArg, i
1e00: 6e 74 20 65 54 65 78 74 52 65 70 2c 20 76 6f 69  nt eTextRep, voi
1e10: 64 20 2a 70 76 55 73 65 72 2c 20 53 51 4c 49 54  d *pvUser, SQLIT
1e20: 45 55 53 45 52 46 55 4e 43 20 66 75 6e 63 2c 20  EUSERFUNC func, 
1e30: 53 51 4c 49 54 45 55 53 45 52 46 55 4e 43 20 66  SQLITEUSERFUNC f
1e40: 75 6e 63 73 74 65 70 2c 20 53 51 4c 49 54 45 46  uncstep, SQLITEF
1e50: 55 4e 43 46 49 4e 41 4c 20 66 75 6e 63 66 69 6e  UNCFINAL funcfin
1e60: 61 6c 2c 20 69 6e 74 20 6e 65 65 64 43 6f 6c 6c  al, int needColl
1e70: 53 65 71 29 0a 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Seq).{.  int n;.
1e80: 0a 20 20 69 66 20 28 65 54 65 78 74 52 65 70 20  .  if (eTextRep 
1e90: 3d 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 29  == SQLITE_UTF16)
1ea0: 0a 20 20 20 20 65 54 65 78 74 52 65 70 20 3d 20  .    eTextRep = 
1eb0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
1ec0: 56 45 3b 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74  VE;..  n = sqlit
1ed0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1ee0: 6f 6e 28 70 73 71 6c 2c 20 7a 46 75 6e 63 74 69  on(psql, zFuncti
1ef0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 54  onName, nArg, eT
1f00: 65 78 74 52 65 70 2c 20 30 2c 20 66 75 6e 63 2c  extRep, 0, func,
1f10: 20 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63 66   funcstep, funcf
1f20: 69 6e 61 6c 29 3b 0a 20 20 69 66 20 28 6e 20 3d  inal);.  if (n =
1f30: 3d 20 30 29 0a 20 20 7b 0a 20 20 20 20 69 66 20  = 0).  {.    if 
1f40: 28 6e 65 65 64 43 6f 6c 6c 53 65 71 29 0a 20 20  (needCollSeq).  
1f50: 20 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65    {.      FuncDe
1f60: 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  f *pFunc = sqlit
1f70: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
1f80: 73 71 6c 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  sql, zFunctionNa
1f90: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 46 75 6e 63  me, strlen(zFunc
1fa0: 74 69 6f 6e 4e 61 6d 65 29 2c 20 6e 41 72 67 2c  tionName), nArg,
1fb0: 20 65 54 65 78 74 52 65 70 2c 20 30 29 3b 0a 20   eTextRep, 0);. 
1fc0: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 20 29       if( pFunc )
1fd0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1fe0: 20 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 7c 3d   pFunc->flags |=
1ff0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
2000: 44 43 4f 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  DCOLL;.      }. 
2010: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2020: 72 6e 20 6e 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73  rn n;.}..__decls
2030: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 20 76  pec(dllexport) v
2040: 6f 69 64 20 57 49 4e 41 50 49 20 73 71 6c 69 74  oid WINAPI sqlit
2050: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 5f  e3_value_double_
2060: 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65 33 5f  interop(sqlite3_
2070: 76 61 6c 75 65 20 2a 70 76 61 6c 2c 20 64 6f 75  value *pval, dou
2080: 62 6c 65 20 2a 76 61 6c 29 0a 7b 0a 20 20 2a 76  ble *val).{.  *v
2090: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
20a0: 75 65 5f 64 6f 75 62 6c 65 28 70 76 61 6c 29 3b  ue_double(pval);
20b0: 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  .}..__declspec(d
20c0: 6c 6c 65 78 70 6f 72 74 29 20 76 6f 69 64 20 57  llexport) void W
20d0: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76 61  INAPI sqlite3_va
20e0: 6c 75 65 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f  lue_int64_intero
20f0: 70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  p(sqlite3_value 
2100: 2a 70 76 61 6c 2c 20 73 71 6c 69 74 65 5f 69 6e  *pval, sqlite_in
2110: 74 36 34 20 2a 76 61 6c 29 0a 7b 0a 20 20 2a 76  t64 *val).{.  *v
2120: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
2130: 75 65 5f 69 6e 74 36 34 28 70 76 61 6c 29 3b 0a  ue_int64(pval);.
2140: 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  }..__declspec(dl
2150: 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 75  lexport) const u
2160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 57  nsigned char * W
2170: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76 61  INAPI sqlite3_va
2180: 6c 75 65 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70  lue_text_interop
2190: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
21a0: 76 61 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a  val, int *plen).
21b0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
21c0: 65 64 20 63 68 61 72 20 2a 70 76 61 6c 20 3d 20  ed char *pval = 
21d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
21e0: 78 74 28 76 61 6c 29 3b 0a 20 20 2a 70 6c 65 6e  xt(val);.  *plen
21f0: 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f   = (pval != 0) ?
2200: 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29   strlen((char *)
2210: 70 76 61 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74  pval) : 0;.  ret
2220: 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64  urn pval;.}..__d
2230: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
2240: 74 29 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20  t) const void * 
2250: 57 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 76  WINAPI sqlite3_v
2260: 61 6c 75 65 5f 74 65 78 74 31 36 5f 69 6e 74 65  alue_text16_inte
2270: 72 6f 70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  rop(sqlite3_valu
2280: 65 20 2a 76 61 6c 2c 20 69 6e 74 20 2a 70 6c 65  e *val, int *ple
2290: 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n).{.  const voi
22a0: 64 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69 74 65  d *pval = sqlite
22b0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 76  3_value_text16(v
22c0: 61 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  al);.  *plen = (
22d0: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77 63 73  pval != 0) ? wcs
22e0: 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a 29 70  len((wchar_t *)p
22f0: 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28 77 63  val) * sizeof(wc
2300: 68 61 72 5f 74 29 20 3a 20 30 3b 0a 20 20 72 65  har_t) : 0;.  re
2310: 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f  turn pval;.}..__
2320: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
2330: 72 74 29 20 76 6f 69 64 20 57 49 4e 41 50 49 20  rt) void WINAPI 
2340: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
2350: 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 71  ouble_interop(sq
2360: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2370: 63 74 78 2c 20 64 6f 75 62 6c 65 20 2a 76 61 6c  ctx, double *val
2380: 29 0a 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ).{.  sqlite3_re
2390: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 63 74 78  sult_double(pctx
23a0: 2c 20 2a 76 61 6c 29 3b 0a 7d 0a 0a 5f 5f 64 65  , *val);.}..__de
23b0: 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
23c0: 29 20 76 6f 69 64 20 57 49 4e 41 50 49 20 73 71  ) void WINAPI sq
23d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
23e0: 36 34 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74  64_interop(sqlit
23f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 63 74 78  e3_context *pctx
2400: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
2410: 76 61 6c 29 0a 7b 0a 20 20 73 71 6c 69 74 65 33  val).{.  sqlite3
2420: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 63  _result_int64(pc
2430: 74 78 2c 20 2a 76 61 6c 29 3b 0a 7d 0a 0a 5f 5f  tx, *val);.}..__
2440: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
2450: 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20 73  rt) int WINAPI s
2460: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 63  qlite3_context_c
2470: 6f 6c 6c 63 6f 6d 70 61 72 65 28 73 71 6c 69 74  ollcompare(sqlit
2480: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
2490: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c   const void *p1,
24a0: 20 69 6e 74 20 70 31 6c 65 6e 2c 20 63 6f 6e 73   int p1len, cons
24b0: 74 20 76 6f 69 64 20 2a 70 32 2c 20 69 6e 74 20  t void *p2, int 
24c0: 70 32 6c 65 6e 29 0a 7b 0a 20 20 69 66 20 28 28  p2len).{.  if ((
24d0: 63 74 78 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67  ctx->pFunc->flag
24e0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
24f0: 4e 45 45 44 43 4f 4c 4c 29 20 3d 3d 20 30 29 20  NEEDCOLL) == 0) 
2500: 72 65 74 75 72 6e 20 32 3b 0a 20 20 72 65 74 75  return 2;.  retu
2510: 72 6e 20 63 74 78 2d 3e 70 43 6f 6c 6c 2d 3e 78  rn ctx->pColl->x
2520: 43 6d 70 28 63 74 78 2d 3e 70 43 6f 6c 6c 2d 3e  Cmp(ctx->pColl->
2530: 70 55 73 65 72 2c 20 70 31 6c 65 6e 2c 20 70 31  pUser, p1len, p1
2540: 2c 20 70 32 6c 65 6e 2c 20 70 32 29 3b 0a 7d 0a  , p2len, p2);.}.
2550: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
2560: 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61  xport) const cha
2570: 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  r * WINAPI sqlit
2580: 65 33 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 73  e3_context_colls
2590: 65 71 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  eq(sqlite3_conte
25a0: 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 2a 70 74  xt *ctx, int *pt
25b0: 79 70 65 2c 20 69 6e 74 20 2a 65 6e 63 2c 20 69  ype, int *enc, i
25c0: 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 43 6f  nt *plen).{.  Co
25d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 63  llSeq *pColl = c
25e0: 74 78 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 2a 70 74  tx->pColl;.  *pt
25f0: 79 70 65 20 3d 20 30 3b 0a 20 20 2a 70 6c 65 6e  ype = 0;.  *plen
2600: 20 3d 20 30 3b 0a 20 20 2a 65 6e 63 20 3d 20 30   = 0;.  *enc = 0
2610: 3b 0a 0a 20 20 69 66 20 28 28 63 74 78 2d 3e 70  ;..  if ((ctx->p
2620: 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
2630: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
2640: 4c 4c 29 20 3d 3d 20 30 29 20 72 65 74 75 72 6e  LL) == 0) return
2650: 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 70 43   NULL;..  if (pC
2660: 6f 6c 6c 29 0a 20 20 7b 0a 20 20 20 20 2a 65 6e  oll).  {.    *en
2670: 63 20 3d 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3b 0a  c = pColl->enc;.
2680: 20 20 20 20 2a 70 74 79 70 65 20 3d 20 70 43 6f      *ptype = pCo
2690: 6c 6c 2d 3e 74 79 70 65 3b 0a 20 20 20 20 2a 70  ll->type;.    *p
26a0: 6c 65 6e 20 3d 20 28 70 43 6f 6c 6c 2d 3e 7a 4e  len = (pColl->zN
26b0: 61 6d 65 20 21 3d 20 30 29 20 3f 20 73 74 72 6c  ame != 0) ? strl
26c0: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
26d0: 20 3a 20 30 3b 0a 0a 20 20 20 20 72 65 74 75 72   : 0;..    retur
26e0: 6e 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  n pColl->zName;.
26f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 55 4c    }.  return NUL
2700: 4c 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63  L;.}..__declspec
2710: 28 64 6c 6c 65 78 70 6f 72 74 29 20 63 6f 6e 73  (dllexport) cons
2720: 74 20 63 68 61 72 20 2a 20 57 49 4e 41 50 49 20  t char * WINAPI 
2730: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
2740: 61 74 61 62 61 73 65 5f 6e 61 6d 65 5f 69 6e 74  atabase_name_int
2750: 65 72 6f 70 28 73 71 6c 69 74 65 33 5f 73 74 6d  erop(sqlite3_stm
2760: 74 20 2a 73 74 6d 74 2c 20 69 6e 74 20 69 43 6f  t *stmt, int iCo
2770: 6c 2c 20 69 6e 74 20 2a 70 6c 65 6e 29 0a 7b 0a  l, int *plen).{.
2780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 76    const char *pv
2790: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
27a0: 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
27b0: 65 28 73 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  e(stmt, iCol);. 
27c0: 20 2a 70 6c 65 6e 20 3d 20 28 70 76 61 6c 20 21   *plen = (pval !
27d0: 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 70 76  = 0) ? strlen(pv
27e0: 61 6c 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  al) : 0;.  retur
27f0: 6e 20 70 76 61 6c 3b 0a 7d 0a 0a 5f 5f 64 65 63  n pval;.}..__dec
2800: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
2810: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 20 57 49   const void * WI
2820: 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 6f 6c  NAPI sqlite3_col
2830: 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2840: 65 31 36 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69  e16_interop(sqli
2850: 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c 20  te3_stmt *stmt, 
2860: 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  int iCol, int *p
2870: 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 76  len).{.  const v
2880: 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73 71 6c 69  oid *pval = sqli
2890: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
28a0: 61 73 65 5f 6e 61 6d 65 31 36 28 73 74 6d 74 2c  ase_name16(stmt,
28b0: 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20   iCol);.  *plen 
28c0: 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20  = (pval != 0) ? 
28d0: 77 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20  wcslen((wchar_t 
28e0: 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66  *)pval) * sizeof
28f0: 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0a 20  (wchar_t) : 0;. 
2900: 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a   return pval;.}.
2910: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
2920: 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61  xport) const cha
2930: 72 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  r * WINAPI sqlit
2940: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
2950: 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  name_interop(sql
2960: 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c  ite3_stmt *stmt,
2970: 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a   int iCol, int *
2980: 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  plen).{.  const 
2990: 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c  char *pval = sql
29a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
29b0: 65 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43 6f  e_name(stmt, iCo
29c0: 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28 70  l);.  *plen = (p
29d0: 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72 6c  val != 0) ? strl
29e0: 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0a 20 20  en(pval) : 0;.  
29f0: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a  return pval;.}..
2a00: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2a10: 70 6f 72 74 29 20 63 6f 6e 73 74 20 76 6f 69 64  port) const void
2a20: 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65   * WINAPI sqlite
2a30: 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
2a40: 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28 73 71  ame16_interop(sq
2a50: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74  lite3_stmt *stmt
2a60: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
2a70: 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74  *plen).{.  const
2a80: 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20 73 71   void *pval = sq
2a90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2aa0: 6c 65 5f 6e 61 6d 65 31 36 28 73 74 6d 74 2c 20  le_name16(stmt, 
2ab0: 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d  iCol);.  *plen =
2ac0: 20 28 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 77   (pval != 0) ? w
2ad0: 63 73 6c 65 6e 28 28 77 63 68 61 72 5f 74 20 2a  cslen((wchar_t *
2ae0: 29 70 76 61 6c 29 20 2a 20 73 69 7a 65 6f 66 28  )pval) * sizeof(
2af0: 77 63 68 61 72 5f 74 29 20 3a 20 30 3b 0a 20 20  wchar_t) : 0;.  
2b00: 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a 0a  return pval;.}..
2b10: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
2b20: 70 6f 72 74 29 20 63 6f 6e 73 74 20 63 68 61 72  port) const char
2b30: 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74 65   * WINAPI sqlite
2b40: 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
2b50: 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 71 6c  name_interop(sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 2c  ite3_stmt *stmt,
2b70: 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a   int iCol, int *
2b80: 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  plen).{.  const 
2b90: 63 68 61 72 20 2a 70 76 61 6c 20 3d 20 73 71 6c  char *pval = sql
2ba0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2bb0: 69 6e 5f 6e 61 6d 65 28 73 74 6d 74 2c 20 69 43  in_name(stmt, iC
2bc0: 6f 6c 29 3b 0a 20 20 2a 70 6c 65 6e 20 3d 20 28  ol);.  *plen = (
2bd0: 70 76 61 6c 20 21 3d 20 30 29 20 3f 20 73 74 72  pval != 0) ? str
2be0: 6c 65 6e 28 70 76 61 6c 29 20 3a 20 30 3b 0a 20  len(pval) : 0;. 
2bf0: 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a 7d 0a   return pval;.}.
2c00: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
2c10: 78 70 6f 72 74 29 20 63 6f 6e 73 74 20 76 6f 69  xport) const voi
2c20: 64 20 2a 20 57 49 4e 41 50 49 20 73 71 6c 69 74  d * WINAPI sqlit
2c30: 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
2c40: 5f 6e 61 6d 65 31 36 5f 69 6e 74 65 72 6f 70 28  _name16_interop(
2c50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74  sqlite3_stmt *st
2c60: 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  mt, int iCol, in
2c70: 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 63 6f 6e  t *plen).{.  con
2c80: 73 74 20 76 6f 69 64 20 2a 70 76 61 6c 20 3d 20  st void *pval = 
2c90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
2ca0: 72 69 67 69 6e 5f 6e 61 6d 65 31 36 28 73 74 6d  rigin_name16(stm
2cb0: 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 2a 70 6c 65  t, iCol);.  *ple
2cc0: 6e 20 3d 20 28 70 76 61 6c 20 21 3d 20 30 29 20  n = (pval != 0) 
2cd0: 3f 20 77 63 73 6c 65 6e 28 28 77 63 68 61 72 5f  ? wcslen((wchar_
2ce0: 74 20 2a 29 70 76 61 6c 29 20 2a 20 73 69 7a 65  t *)pval) * size
2cf0: 6f 66 28 77 63 68 61 72 5f 74 29 20 3a 20 30 3b  of(wchar_t) : 0;
2d00: 0a 20 20 72 65 74 75 72 6e 20 70 76 61 6c 3b 0a  .  return pval;.
2d10: 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  }..__declspec(dl
2d20: 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57 49 4e  lexport) int WIN
2d30: 41 50 49 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  API sqlite3_tabl
2d40: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2d50: 61 5f 69 6e 74 65 72 6f 70 28 73 71 6c 69 74 65  a_interop(sqlite
2d60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2d70: 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73  r *zDbName, cons
2d80: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
2d90: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
2da0: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 63 68 61  zColumnName, cha
2db0: 72 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20  r **pzDataType, 
2dc0: 63 68 61 72 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  char **pzCollSeq
2dd0: 2c 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c  , int *pNotNull,
2de0: 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
2df0: 79 2c 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  y, int *pAutoinc
2e00: 2c 20 69 6e 74 20 2a 70 64 74 4c 65 6e 2c 20 69  , int *pdtLen, i
2e10: 6e 74 20 2a 70 63 73 4c 65 6e 29 0a 7b 0a 20 20  nt *pcsLen).{.  
2e20: 69 6e 74 20 6e 3b 0a 20 20 0a 20 20 6e 20 3d 20  int n;.  .  n = 
2e30: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2e40: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62  lumn_metadata(db
2e50: 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c  , zDbName, zTabl
2e60: 65 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  eName, zColumnNa
2e70: 6d 65 2c 20 70 7a 44 61 74 61 54 79 70 65 2c 20  me, pzDataType, 
2e80: 70 7a 43 6f 6c 6c 53 65 71 2c 20 70 4e 6f 74 4e  pzCollSeq, pNotN
2e90: 75 6c 6c 2c 20 70 50 72 69 6d 61 72 79 4b 65 79  ull, pPrimaryKey
2ea0: 2c 20 70 41 75 74 6f 69 6e 63 29 3b 0a 20 20 2a  , pAutoinc);.  *
2eb0: 70 64 74 4c 65 6e 20 3d 20 28 2a 70 7a 44 61 74  pdtLen = (*pzDat
2ec0: 61 54 79 70 65 20 21 3d 20 30 29 20 3f 20 73 74  aType != 0) ? st
2ed0: 72 6c 65 6e 28 2a 70 7a 44 61 74 61 54 79 70 65  rlen(*pzDataType
2ee0: 29 20 3a 20 30 3b 0a 20 20 2a 70 63 73 4c 65 6e  ) : 0;.  *pcsLen
2ef0: 20 3d 20 28 2a 70 7a 43 6f 6c 6c 53 65 71 20 21   = (*pzCollSeq !
2f00: 3d 20 30 29 20 3f 20 73 74 72 6c 65 6e 28 2a 70  = 0) ? strlen(*p
2f10: 7a 43 6f 6c 6c 53 65 71 29 20 3a 20 30 3b 0a 0a  zCollSeq) : 0;..
2f20: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 5f    return n;.}.._
2f30: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
2f40: 6f 72 74 29 20 69 6e 74 20 57 49 4e 41 50 49 20  ort) int WINAPI 
2f50: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2f60: 6c 75 6d 6e 5f 69 6e 66 6f 5f 69 6e 74 65 72 6f  lumn_info_intero
2f70: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  p(sqlite3 *db, c
2f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
2f90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64  const char *zInd
2fa0: 65 78 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  exName, const ch
2fb0: 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
2fc0: 20 69 6e 74 20 2a 73 6f 72 74 4f 72 64 65 72 2c   int *sortOrder,
2fd0: 20 69 6e 74 20 2a 6f 6e 45 72 72 6f 72 2c 20 63   int *onError, c
2fe0: 68 61 72 20 2a 2a 70 7a 43 6f 6c 6c 2c 20 69 6e  har **pzColl, in
2ff0: 74 20 2a 70 6c 65 6e 29 0a 7b 0a 20 20 49 6e 64  t *plen).{.  Ind
3000: 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 61 62 6c  ex *pIdx;.  Tabl
3010: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 6e  e *pTab;.  int n
3020: 3b 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  ;.  pIdx = sqlit
3030: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
3040: 7a 49 6e 64 65 78 4e 61 6d 65 2c 20 7a 44 62 29  zIndexName, zDb)
3050: 3b 0a 20 20 69 66 20 28 21 70 49 64 78 29 20 72  ;.  if (!pIdx) r
3060: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
3070: 4f 52 3b 0a 0a 20 20 70 54 61 62 20 3d 20 70 49  OR;..  pTab = pI
3080: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 66 6f  dx->pTable;.  fo
3090: 72 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 70 49  r (n = 0; n < pI
30a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 2b 2b  dx->nColumn; n++
30b0: 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6e  ).  {.    int cn
30c0: 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  um = pIdx->aiCol
30d0: 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 69 66 20 28  umn[n];.    if (
30e0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
30f0: 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e  Tab->aCol[cnum].
3100: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
3110: 6d 65 29 20 3d 3d 20 30 29 0a 20 20 20 20 7b 0a  me) == 0).    {.
3120: 20 20 20 20 20 20 2a 73 6f 72 74 4f 72 64 65 72        *sortOrder
3130: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
3140: 64 65 72 5b 6e 5d 3b 0a 20 20 20 20 20 20 2a 70  der[n];.      *p
3150: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
3160: 43 6f 6c 6c 5b 6e 5d 3b 0a 20 20 20 20 20 20 2a  Coll[n];.      *
3170: 70 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 2a 70  plen = strlen(*p
3180: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 2a 6f  zColl);.      *o
3190: 6e 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f  nError = pIdx->o
31a0: 6e 45 72 72 6f 72 3b 0a 0a 20 20 20 20 20 20 72  nError;..      r
31b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
31d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
31e0: 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28  ;.}..__declspec(
31f0: 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57  dllexport) int W
3200: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 74 61  INAPI sqlite3_ta
3210: 62 6c 65 5f 63 75 72 73 6f 72 28 73 71 6c 69 74  ble_cursor(sqlit
3220: 65 33 5f 73 74 6d 74 20 2a 70 73 74 6d 74 2c 20  e3_stmt *pstmt, 
3230: 69 6e 74 20 69 44 62 2c 20 50 67 6e 6f 20 74 61  int iDb, Pgno ta
3240: 62 6c 65 52 6f 6f 74 50 61 67 65 29 0a 7b 0a 20  bleRootPage).{. 
3250: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
3260: 20 2a 29 70 73 74 6d 74 3b 0a 20 20 73 71 6c 69   *)pstmt;.  sqli
3270: 74 65 33 20 2a 64 62 20 3d 20 28 70 20 3d 3d 20  te3 *db = (p == 
3280: 4e 55 4c 4c 29 20 3f 20 4e 55 4c 4c 20 3a 20 70  NULL) ? NULL : p
3290: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ->db;.  int n;. 
32a0: 20 69 6e 74 20 72 65 74 20 3d 20 2d 31 3b 0a 0a   int ret = -1;..
32b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
32c0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
32d0: 3b 0a 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b 20  ;.  for (n = 0; 
32e0: 6e 20 3c 20 70 2d 3e 6e 43 75 72 73 6f 72 20 26  n < p->nCursor &
32f0: 26 20 70 2d 3e 61 70 43 73 72 5b 6e 5d 20 21 3d  & p->apCsr[n] !=
3300: 20 4e 55 4c 4c 3b 20 6e 2b 2b 29 0a 20 20 7b 0a   NULL; n++).  {.
3310: 20 20 20 20 69 66 20 28 70 2d 3e 61 70 43 73 72      if (p->apCsr
3320: 5b 6e 5d 2d 3e 69 73 54 61 62 6c 65 20 3d 3d 20  [n]->isTable == 
3330: 46 41 4c 53 45 29 20 63 6f 6e 74 69 6e 75 65 3b  FALSE) continue;
3340: 0a 20 20 20 20 69 66 20 28 70 2d 3e 61 70 43 73  .    if (p->apCs
3350: 72 5b 6e 5d 2d 3e 69 44 62 20 21 3d 20 69 44 62  r[n]->iDb != iDb
3360: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3370: 69 66 20 28 70 2d 3e 61 70 43 73 72 5b 6e 5d 2d  if (p->apCsr[n]-
3380: 3e 70 43 75 72 73 6f 72 2d 3e 70 67 6e 6f 52 6f  >pCursor->pgnoRo
3390: 6f 74 20 3d 3d 20 74 61 62 6c 65 52 6f 6f 74 50  ot == tableRootP
33a0: 61 67 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  age).    {.     
33b0: 20 72 65 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20   ret = n;.      
33c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
33d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
33e0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
33f0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  );..  return ret
3400: 3b 0a 7d 0a 0a 5f 5f 64 65 63 6c 73 70 65 63 28  ;.}..__declspec(
3410: 64 6c 6c 65 78 70 6f 72 74 29 20 69 6e 74 20 57  dllexport) int W
3420: 49 4e 41 50 49 20 73 71 6c 69 74 65 33 5f 63 75  INAPI sqlite3_cu
3430: 72 73 6f 72 5f 72 6f 77 69 64 28 73 71 6c 69 74  rsor_rowid(sqlit
3440: 65 33 5f 73 74 6d 74 20 2a 70 73 74 6d 74 2c 20  e3_stmt *pstmt, 
3450: 69 6e 74 20 63 75 72 73 6f 72 2c 20 73 71 6c 69  int cursor, sqli
3460: 74 65 5f 69 6e 74 36 34 20 2a 70 72 6f 77 69 64  te_int64 *prowid
3470: 29 0a 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20  ).{.  Vdbe *p = 
3480: 28 56 64 62 65 20 2a 29 70 73 74 6d 74 3b 0a 20  (Vdbe *)pstmt;. 
3490: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
34a0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 4e 55 4c  p == NULL) ? NUL
34b0: 4c 20 3a 20 70 2d 3e 64 62 3b 0a 20 20 56 64 62  L : p->db;.  Vdb
34c0: 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
34d0: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 73  nt ret = 0;..  s
34e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
34f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
3500: 20 77 68 69 6c 65 20 28 31 29 0a 20 20 7b 0a 20   while (1).  {. 
3510: 20 20 20 69 66 20 28 63 75 72 73 6f 72 20 3c 20     if (cursor < 
3520: 30 20 7c 7c 20 63 75 72 73 6f 72 20 3e 3d 20 70  0 || cursor >= p
3530: 2d 3e 6e 43 75 72 73 6f 72 29 0a 20 20 20 20 7b  ->nCursor).    {
3540: 0a 20 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c  .      ret = SQL
3550: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3570: 20 20 69 66 20 28 70 2d 3e 61 70 43 73 72 5b 63    if (p->apCsr[c
3580: 75 72 73 6f 72 5d 20 3d 3d 20 4e 55 4c 4c 29 0a  ursor] == NULL).
3590: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 20      {.      ret 
35a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
35b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35c0: 20 7d 0a 0a 20 20 20 20 70 43 20 3d 20 70 2d 3e   }..    pC = p->
35d0: 61 70 43 73 72 5b 63 75 72 73 6f 72 5d 3b 0a 0a  apCsr[cursor];..
35e0: 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
35f0: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
3600: 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 72 65  o(pC);.    if(re
3610: 74 29 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t).      break;.
3620: 0a 20 20 20 20 69 66 28 70 43 2d 3e 72 6f 77 69  .    if(pC->rowi
3630: 64 49 73 56 61 6c 69 64 29 0a 20 20 20 20 7b 0a  dIsValid).    {.
3640: 20 20 20 20 20 20 2a 70 72 6f 77 69 64 20 3d 20        *prowid = 
3650: 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  pC->lastRowid;. 
3660: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
3670: 28 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65  (pC->pseudoTable
3680: 52 65 67 20 3e 20 30 29 0a 20 20 20 20 7b 0a 20  Reg > 0).    {. 
3690: 20 20 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54       ret = SQLIT
36a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
36b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
36c0: 65 6c 73 65 20 69 66 28 70 43 2d 3e 6e 75 6c 6c  else if(pC->null
36d0: 52 6f 77 20 7c 7c 20 70 43 2d 3e 70 43 75 72 73  Row || pC->pCurs
36e0: 6f 72 3d 3d 30 29 0a 20 20 20 20 7b 0a 20 20 20  or==0).    {.   
36f0: 20 20 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f     ret = SQLITE_
3700: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3710: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  ak;.    }.    el
3720: 73 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  se.    {.      i
3730: 66 20 28 70 43 2d 3e 70 43 75 72 73 6f 72 20 3d  f (pC->pCursor =
3740: 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a  = NULL).      {.
3750: 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 53 51          ret = SQ
3760: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3780: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
3790: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d  BtreeKeySize(pC-
37a0: 3e 70 43 75 72 73 6f 72 2c 20 70 72 6f 77 69 64  >pCursor, prowid
37b0: 29 3b 0a 20 20 20 20 20 20 2a 70 72 6f 77 69 64  );.      *prowid
37c0: 20 3d 20 2a 70 72 6f 77 69 64 3b 0a 20 20 20 20   = *prowid;.    
37d0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
37e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
37f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
3800: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  );..  return ret
3810: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2f 20 53  ;.}..#endif // S
3820: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 0a        QLITE_OS_WIN..