/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d8656320f9299c70ee6a41deab5350d615ffa3b7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 33 30 37 20 32 30 30 35 2f 31 32  ,v 1.307 2005/12
0280: 2f 30 39 20 32 30 3a 30 32 3a 30 35 20 64 72 68  /09 20:02:05 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
02c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .h>../*.** The f
02e0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
02f0: 74 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  t value is used 
0300: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 42 49  by the SQLITE_BI
0310: 47 45 4e 44 49 41 4e 20 61 6e 64 0a 2a 2a 20 53  GENDIAN and.** S
0320: 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49  QLITE_LITTLEENDI
0330: 41 4e 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 63 6f  AN macros..*/.co
0340: 6e 73 74 20 69 6e 74 20 73 71 6c 69 74 65 33 6f  nst int sqlite3o
0350: 6e 65 20 3d 20 31 3b 0a 0a 23 69 66 6e 64 65 66  ne = 1;..#ifndef
0360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f   SQLITE_OMIT_GLO
0370: 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a 0a 2a 2a  BALRECOVER./*.**
0380: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
0390: 61 6c 6c 20 6f 70 65 6e 20 64 61 74 61 62 61 73  all open databas
03a0: 65 20 68 61 6e 64 6c 65 73 2e 20 54 68 69 73 20  e handles. This 
03b0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  is used by the .
03c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  ** sqlite3_globa
03d0: 6c 5f 72 65 63 6f 76 65 72 28 29 20 66 75 6e 63  l_recover() func
03e0: 74 69 6f 6e 2e 20 45 6e 74 72 69 65 73 20 61 72  tion. Entries ar
03f0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
0400: 69 73 74 0a 2a 2a 20 62 79 20 6f 70 65 6e 44 61  ist.** by openDa
0410: 74 61 62 61 73 65 28 29 20 61 6e 64 20 72 65 6d  tabase() and rem
0420: 6f 76 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  oved by sqlite3_
0430: 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
0440: 69 63 20 73 71 6c 69 74 65 33 20 2a 70 44 62 4c  ic sqlite3 *pDbL
0450: 69 73 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ist = 0;.#endif.
0460: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0470: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 20 0a 2a  OMIT_UTF16./* .*
0480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 61  * Return the tra
0490: 6e 73 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  nsient sqlite3_v
04a0: 61 6c 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64  alue object used
04b0: 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f   for encoding co
04c0: 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72  nversions.** dur
04d0: 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74  ing SQL compilat
04e0: 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
04f0: 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65  value *sqlite3Ge
0500: 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28  tTransientValue(
0510: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0520: 69 66 28 20 21 64 62 2d 3e 70 56 61 6c 75 65 20  if( !db->pValue 
0530: 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61 6c 75  ){.    db->pValu
0540: 65 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  e = sqlite3Value
0550: 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  New();.  }.  ret
0560: 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a  urn db->pValue;.
0570: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0580: 54 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  The version of t
0590: 68 65 20 6c 69 62 72 61 72 79 0a 2a 2f 0a 63 6f  he library.*/.co
05a0: 6e 73 74 20 63 68 61 72 20 72 63 73 69 64 33 5b  nst char rcsid3[
05b0: 5d 20 3d 20 22 40 28 23 29 20 5c 30 34 34 49 64  ] = "@(#) \044Id
05c0: 3a 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  : SQLite version
05d0: 20 22 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f   " SQLITE_VERSIO
05e0: 4e 20 22 20 24 22 3b 0a 63 6f 6e 73 74 20 63 68  N " $";.const ch
05f0: 61 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  ar sqlite3_versi
0600: 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45  on[] = SQLITE_VE
0610: 52 53 49 4f 4e 3b 0a 63 6f 6e 73 74 20 63 68 61  RSION;.const cha
0620: 72 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  r *sqlite3_libve
0630: 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74  rsion(void){ ret
0640: 75 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73  urn sqlite3_vers
0650: 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ion; }.int sqlit
0660: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
0670: 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75  mber(void){ retu
0680: 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  rn SQLITE_VERSIO
0690: 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 0a  N_NUMBER; }../*.
06a0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
06b0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
06c0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
06d0: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
06e0: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
06f0: 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lable..*/.static
0700: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
0710: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
0720: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
0730: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
0740: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
0750: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
0760: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
0770: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
0780: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
0790: 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  ey2;.  rc = memc
07a0: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
07b0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
07c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
07d0: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
07e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
07f0: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
0800: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
0810: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
0820: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
0830: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0840: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
0850: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
0860: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
0870: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
0880: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
0890: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
08a0: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
08b0: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
08c0: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
08d0: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
08e0: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
08f0: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
0900: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
0910: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
0920: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
0930: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
0940: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
0950: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
0960: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
0970: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
0980: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
0990: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
09a0: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
09b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
09c0: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
09d0: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
09e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
09f0: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
0a00: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
0a10: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
0a20: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
0a30: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
0a40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0a50: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
0a60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
0a70: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
0a80: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
0a90: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
0aa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0ab0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
0ac0: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
0ad0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0ae0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
0af0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
0b00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
0b10: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
0b20: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
0b30: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
0b40: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
0b50: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
0b60: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
0b70: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
0b80: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
0b90: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
0ba0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
0bb0: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
0bc0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
0bd0: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
0be0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
0bf0: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
0c00: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
0c10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
0c20: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
0c30: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
0c40: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  ;.  int j;..  if
0c50: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
0c60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
0c70: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
0c80: 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20  SafetyCheck(db) 
0c90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0ca0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
0cb0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0cc0: 53 53 45 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  SSE.  sqlite3_fi
0cd0: 6e 61 6c 69 7a 65 28 64 62 2d 3e 70 46 65 74 63  nalize(db->pFetc
0ce0: 68 29 3b 0a 23 65 6e 64 69 66 20 0a 0a 20 20 2f  h);.#endif ..  /
0cf0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
0d00: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56  ny outstanding V
0d10: 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Ms, return SQLIT
0d20: 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28  E_BUSY. */.  if(
0d30: 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20   db->pVdbe ){.  
0d40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
0d50: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
0d60: 0a 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65  .        "Unable
0d70: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
0d80: 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61   unfinalised sta
0d90: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 72  tements");.    r
0da0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
0db0: 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
0dc0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
0dd0: 68 65 63 6b 28 64 62 29 20 29 3b 0a 0a 20 20 2f  heck(db) );..  /
0de0: 2a 20 46 49 58 20 4d 45 3a 20 64 62 2d 3e 6d 61  * FIX ME: db->ma
0df0: 67 69 63 20 6d 61 79 20 62 65 20 73 65 74 20 74  gic may be set t
0e00: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  o SQLITE_MAGIC_C
0e10: 4c 4f 53 45 44 20 69 66 20 74 68 65 20 64 61 74  LOSED if the dat
0e20: 61 62 61 73 65 0a 20 20 2a 2a 20 63 61 6e 6e 6f  abase.  ** canno
0e30: 74 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20  t be opened for 
0e40: 73 6f 6d 65 20 72 65 61 73 6f 6e 2e 20 53 6f 20  some reason. So 
0e50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  this routine nee
0e60: 64 73 20 74 6f 20 72 75 6e 20 69 6e 0a 20 20 2a  ds to run in.  *
0e70: 2a 20 74 68 61 74 20 63 61 73 65 2e 20 42 75 74  * that case. But
0e80: 20 6d 61 79 62 65 20 74 68 65 72 65 20 73 68 6f   maybe there sho
0e90: 75 6c 64 20 62 65 20 61 6e 20 65 78 74 72 61 20  uld be an extra 
0ea0: 6d 61 67 69 63 20 76 61 6c 75 65 20 66 6f 72 20  magic value for 
0eb0: 74 68 65 0a 20 20 2a 2a 20 22 66 61 69 6c 65 64  the.  ** "failed
0ec0: 20 74 6f 20 6f 70 65 6e 22 20 73 74 61 74 65 2e   to open" state.
0ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
0ee0: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
0ef0: 47 49 43 5f 43 4c 4f 53 45 44 20 26 26 20 73 71  GIC_CLOSED && sq
0f00: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
0f10: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 70 72 69 6e  ) ){.    /* prin
0f20: 74 66 28 22 44 49 44 20 4e 4f 54 20 43 4c 4f 53  tf("DID NOT CLOS
0f30: 45 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74  E\n"); fflush(st
0f40: 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 72 65  dout); */.    re
0f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
0f60: 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6a 3d  R;.  }..  for(j=
0f70: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
0f80: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
0f90: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
0fa0: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
0fb0: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
0fc0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
0fd0: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
0fe0: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
0ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1000: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1010: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
1020: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
1030: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
1040: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
1050: 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f  DbStatic );.  fo
1060: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
1070: 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  rst(&db->aFunc);
1080: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
1090: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75  Next(i)){.    Fu
10a0: 6e 63 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a 70  ncDef *pFunc, *p
10b0: 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 46  Next;.    for(pF
10c0: 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  unc = (FuncDef*)
10d0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
10e0: 29 3b 20 70 46 75 6e 63 3b 20 70 46 75 6e 63 3d  ); pFunc; pFunc=
10f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1100: 65 78 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65  ext = pFunc->pNe
1110: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
1120: 46 72 65 65 28 70 46 75 6e 63 29 3b 0a 20 20 20  Free(pFunc);.   
1130: 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d   }.  }..  for(i=
1140: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1150: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
1160: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
1170: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
1180: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
1190: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
11a0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
11b0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 6c  sqliteFree(pColl
11c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11d0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
11e0: 43 6f 6c 6c 53 65 71 29 3b 0a 0a 20 20 73 71 6c  CollSeq);..  sql
11f0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
1200: 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 73 71 6c  b->aFunc);.  sql
1210: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
1220: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20  LITE_OK, 0); /* 
1230: 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20  Deallocates any 
1240: 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72  cached error str
1250: 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64  ings. */.  if( d
1260: 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
1270: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1280: 65 28 64 62 2d 3e 70 56 61 6c 75 65 29 3b 0a 20  e(db->pValue);. 
1290: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72   }.  if( db->pEr
12a0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
12b0: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
12c0: 72 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rr);.  }..#ifnde
12d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
12e0: 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 7b 0a  OBALRECOVER.  {.
12f0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 50 72      sqlite3 *pPr
1300: 65 76 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ev;.    sqlite3O
1310: 73 2e 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  s.xEnterMutex();
1320: 0a 20 20 20 20 70 50 72 65 76 20 3d 20 70 44 62  .    pPrev = pDb
1330: 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
1340: 20 70 50 72 65 76 20 26 26 20 70 50 72 65 76 2d   pPrev && pPrev-
1350: 3e 70 4e 65 78 74 21 3d 64 62 20 29 7b 0a 20 20  >pNext!=db ){.  
1360: 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65      pPrev = pPre
1370: 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  v->pNext;.    }.
1380: 20 20 20 20 69 66 28 20 70 50 72 65 76 20 29 7b      if( pPrev ){
1390: 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e  .      pPrev->pN
13a0: 65 78 74 20 3d 20 64 62 2d 3e 70 4e 65 78 74 3b  ext = db->pNext;
13b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13c0: 20 20 61 73 73 65 72 74 28 20 70 44 62 4c 69 73    assert( pDbLis
13d0: 74 3d 3d 64 62 20 29 3b 0a 20 20 20 20 20 20 70  t==db );.      p
13e0: 44 62 4c 69 73 74 20 3d 20 64 62 2d 3e 70 4e 65  DbList = db->pNe
13f0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
1400: 6c 69 74 65 33 4f 73 2e 78 4c 65 61 76 65 4d 75  lite3Os.xLeaveMu
1410: 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
1420: 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  f..  db->magic =
1430: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
1440: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ROR;.  sqliteFre
1450: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
1460: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1470: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
1480: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
1490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14a0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
14b0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
14c0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
14d0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
14e0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
14f0: 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ].pBt ){.      s
1500: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1510: 61 63 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ack(db->aDb[i].p
1520: 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61  Bt);.      db->a
1530: 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20  Db[i].inTrans = 
1540: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1550: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
1560: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
1570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1580: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
1590: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
15a0: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
15b0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
15c0: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
15d0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
15e0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e  sqlite3ErrStr(in
15f0: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
1600: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
1610: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
1620: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 0a 20 20 20   SQLITE_ROW:.   
1630: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
1640: 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1650: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a  TE_OK:         z
1660: 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72   = "not an error
1670: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
1680: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
16a0: 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 7a  TE_ERROR:      z
16b0: 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72   = "SQL logic er
16c0: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
16d0: 61 74 61 62 61 73 65 22 3b 20 20 20 62 72 65 61  atabase";   brea
16e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
16f0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a  TE_PERM:       z
1700: 20 3d 20 22 61 63 63 65 73 73 20 70 65 72 6d 69   = "access permi
1710: 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20  ssion denied";  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1730: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1740: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a  TE_ABORT:      z
1750: 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71   = "callback req
1760: 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f  uested query abo
1770: 72 74 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  rt";        brea
1780: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1790: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 7a  TE_BUSY:       z
17a0: 20 3d 20 22 64 61 74 61 62 61 73 65 20 69 73 20   = "database is 
17b0: 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20  locked";        
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
17e0: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 7a  TE_LOCKED:     z
17f0: 20 3d 20 22 64 61 74 61 62 61 73 65 20 74 61 62   = "database tab
1800: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20  le is locked";  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1820: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1830: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a  TE_NOMEM:      z
1840: 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   = "out of memor
1850: 79 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  y";             
1860: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1870: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1880: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a  TE_READONLY:   z
1890: 20 3d 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77   = "attempt to w
18a0: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
18b0: 64 61 74 61 62 61 73 65 22 3b 20 20 62 72 65 61  database";  brea
18c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
18d0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 7a  TE_INTERRUPT:  z
18e0: 20 3d 20 22 69 6e 74 65 72 72 75 70 74 65 64 22   = "interrupted"
18f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1900: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1910: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1920: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a  TE_IOERR:      z
1930: 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72   = "disk I/O err
1940: 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  or";            
1950: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1960: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1970: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a  TE_CORRUPT:    z
1980: 20 3d 20 22 64 61 74 61 62 61 73 65 20 64 69 73   = "database dis
1990: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
19a0: 72 6d 65 64 22 3b 20 20 20 20 20 20 62 72 65 61  rmed";      brea
19b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
19c0: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a  TE_FULL:       z
19d0: 20 3d 20 22 64 61 74 61 62 61 73 65 20 6f 72 20   = "database or 
19e0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 3b 20 20  disk is full";  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1a10: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a  TE_CANTOPEN:   z
1a20: 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70   = "unable to op
1a30: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1a40: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
1a50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1a60: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a  TE_PROTOCOL:   z
1a70: 20 3d 20 22 64 61 74 61 62 61 73 65 20 6c 6f 63   = "database loc
1a80: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 66 61  king protocol fa
1a90: 69 6c 75 72 65 22 3b 20 20 20 20 20 62 72 65 61  ilure";     brea
1aa0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1ab0: 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 7a  TE_EMPTY:      z
1ac0: 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69   = "table contai
1ad0: 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20 20 20 20  ns no data";    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1af0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1b00: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 7a  TE_SCHEMA:     z
1b10: 20 3d 20 22 64 61 74 61 62 61 73 65 20 73 63 68   = "database sch
1b20: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
1b30: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
1b40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1b50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a  TE_CONSTRAINT: z
1b60: 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66   = "constraint f
1b70: 61 69 6c 65 64 22 3b 20 20 20 20 20 20 20 20 20  ailed";         
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1b90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1ba0: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a  TE_MISMATCH:   z
1bb0: 20 3d 20 22 64 61 74 61 74 79 70 65 20 6d 69 73   = "datatype mis
1bc0: 6d 61 74 63 68 22 3b 20 20 20 20 20 20 20 20 20  match";         
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1be0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1bf0: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 7a  TE_MISUSE:     z
1c00: 20 3d 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74   = "library rout
1c10: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
1c20: 66 20 73 65 71 75 65 6e 63 65 22 3b 62 72 65 61  f sequence";brea
1c30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c40: 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a  TE_NOLFS:      z
1c50: 20 3d 20 22 6b 65 72 6e 65 6c 20 6c 61 63 6b 73   = "kernel lacks
1c60: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
1c70: 6f 72 74 22 3b 20 20 20 20 20 20 20 62 72 65 61  ort";       brea
1c80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c90: 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 7a  TE_AUTH:       z
1ca0: 20 3d 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f   = "authorizatio
1cb0: 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20 20  n denied";      
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1cd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1ce0: 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a  TE_FORMAT:     z
1cf0: 20 3d 20 22 61 75 78 69 6c 69 61 72 79 20 64 61   = "auxiliary da
1d00: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
1d10: 72 6f 72 22 3b 20 20 20 20 20 20 20 62 72 65 61  ror";       brea
1d20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1d30: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 7a  TE_RANGE:      z
1d40: 20 3d 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75   = "bind or colu
1d50: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
1d60: 72 61 6e 67 65 22 3b 20 20 20 20 20 62 72 65 61  range";     brea
1d70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1d80: 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a  TE_NOTADB:     z
1d90: 20 3d 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72   = "file is encr
1da0: 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20  ypted or is not 
1db0: 61 20 64 61 74 61 62 61 73 65 22 3b 62 72 65 61  a database";brea
1dc0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1de0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f   = "unknown erro
1df0: 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r";             
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1e10: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1e20: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  z;.}../*.** This
1e30: 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1e40: 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62  nts a busy callb
1e50: 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20  ack that sleeps 
1e60: 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61  and tries.** aga
1e70: 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f  in until a timeo
1e80: 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63  ut value is reac
1e90: 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75  hed.  The timeou
1ea0: 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e  t value is.** an
1eb0: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1ec0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
1ed0: 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65  passed in as the
1ee0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
1ef0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1f00: 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  t sqliteDefaultB
1f10: 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f  usyCallback(. vo
1f20: 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20  id *ptr,        
1f30: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1f50: 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20  . int count     
1f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f70: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61  mber of times ta
1f80: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73  ble has been bus
1f90: 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49  y */.){.#if SQLI
1fa0: 54 45 5f 4d 49 4e 5f 53 4c 45 45 50 5f 4d 53 3d  TE_MIN_SLEEP_MS=
1fb0: 3d 31 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  =1.  static cons
1fc0: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
1fd0: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
1fe0: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
1ff0: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
2000: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
2010: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
2020: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
2030: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
2040: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
2050: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
2060: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
2070: 20 28 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 29   (sizeof(delays)
2080: 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 5b 30  /sizeof(delays[0
2090: 5d 29 29 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  ])).  int timeou
20a0: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
20b0: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
20c0: 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20  t;.  int delay, 
20d0: 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74  prior;..  assert
20e0: 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20  ( count>=0 );.  
20f0: 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c  if( count < NDEL
2100: 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  AY ){.    delay 
2110: 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b  = delays[count];
2120: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
2130: 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65  als[count];.  }e
2140: 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  lse{.    delay =
2150: 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31   delays[NDELAY-1
2160: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
2170: 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20  otals[NDELAY-1] 
2180: 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28  + delay*(count-(
2190: 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a  NDELAY-1));.  }.
21a0: 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65    if( prior + de
21b0: 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  lay > timeout ){
21c0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d  .    delay = tim
21d0: 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20  eout - prior;.  
21e0: 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29    if( delay<=0 )
21f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2200: 20 73 71 6c 69 74 65 33 4f 73 2e 78 53 6c 65 65   sqlite3Os.xSlee
2210: 70 28 64 65 6c 61 79 29 3b 0a 20 20 72 65 74 75  p(delay);.  retu
2220: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  rn 1;.#else.  in
2230: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
2240: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
2250: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
2260: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
2270: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
2280: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2290: 20 73 71 6c 69 74 65 33 4f 73 2e 78 53 6c 65 65   sqlite3Os.xSlee
22a0: 70 28 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  p(1000);.  retur
22b0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
22c0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
22d0: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
22e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
22f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2300: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
2310: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
2320: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
2330: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2340: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
2350: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
2360: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
2370: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
2380: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
2390: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
23a0: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
23b0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
23c0: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
23d0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
23e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
23f0: 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d  ->xFunc==0 || p-
2400: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
2410: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78  n 0;.  rc = p->x
2420: 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d  Func(p->pArg, p-
2430: 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72  >nBusy);.  if( r
2440: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  c==0 ){.    p->n
2450: 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  Busy = -1;.  }el
2460: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79  se{.    p->nBusy
2470: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2480: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
2490: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
24a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
24b0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
24c0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
24d0: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
24e0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
24f0: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
2500: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2510: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
2520: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
2530: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
2540: 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  void*,int),.  vo
2550: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66  id *pArg.){.  if
2560: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
2570: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2590: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  SUSE;.  }.  db->
25a0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
25b0: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
25c0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
25d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
25e0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
25f0: 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  y = 0;.  return 
2600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
2610: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2620: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
2630: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
2640: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
2650: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
2660: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
2670: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
2680: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
2690: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
26a0: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
26b0: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
26c0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
26d0: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
26e0: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
26f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2700: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
2710: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
2720: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
2730: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
2740: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
2750: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66 28  d *pArg.){.  if(
2760: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
2770: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
2780: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
2790: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
27a0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
27b0: 20 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65       db->nProgre
27c0: 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20  ssOps = nOps;.  
27d0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
27e0: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 20  sArg = pArg;.   
27f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
2800: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
2810: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  .      db->nProg
2820: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
2830: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
2840: 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Arg = 0;.    }. 
2850: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
2860: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2870: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
2880: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
2890: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
28a0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
28b0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
28c0: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
28d0: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
28e0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
28f0: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
2900: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20  *db, int ms){.  
2910: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
2920: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
2930: 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  = ms;.    sqlite
2940: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
2950: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
2960: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
2970: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73  oid*)db);.  }els
2980: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
2990: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
29a0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
29b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29c0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
29d0: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
29e0: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
29f0: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
2a00: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
2a10: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
2a20: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
2a30: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
2a40: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 29  afetyCheck(db) )
2a50: 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  {.    db->flags 
2a60: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72  |= SQLITE_Interr
2a70: 75 70 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  upt;.  }.}../*.*
2a80: 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
2a90: 73 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  s should call th
2aa0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 72  is routine to fr
2ab0: 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a  ee memory that.*
2ac0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  * is returned in
2ad0: 20 74 68 65 20 69 6e 20 74 68 65 20 65 72 72 6d   the in the errm
2ae0: 73 67 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20  sg parameter of 
2af0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 77  sqlite3_open() w
2b00: 68 65 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 69 73  hen.** SQLite is
2b10: 20 61 20 44 4c 4c 2e 20 20 46 6f 72 20 73 6f 6d   a DLL.  For som
2b20: 65 20 72 65 61 73 6f 6e 2c 20 69 74 20 64 6f 65  e reason, it doe
2b30: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 20 63 61  s not work to ca
2b40: 6c 6c 20 66 72 65 65 28 29 0a 2a 2a 20 64 69 72  ll free().** dir
2b50: 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ectly..**.** Not
2b60: 65 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74  e that we need t
2b70: 6f 20 63 61 6c 6c 20 66 72 65 65 28 29 20 6e 6f  o call free() no
2b80: 74 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 68  t sqliteFree() h
2b90: 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ere..*/.void sql
2ba0: 69 74 65 33 5f 66 72 65 65 28 63 68 61 72 20 2a  ite3_free(char *
2bb0: 70 29 7b 20 66 72 65 65 28 70 29 3b 20 7d 0a 0a  p){ free(p); }..
2bc0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
2bd0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
2be0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2bf0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2c00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
2c10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2c20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
2c30: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
2c40: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
2c50: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
2c60: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
2c70: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
2c80: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
2c90: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
2ca0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
2cb0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
2cc0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
2cd0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
2ce0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 46  context*).){.  F
2cf0: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
2d00: 20 6e 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 73   nName;..  if( s
2d10: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
2d20: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
2d30: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2d40: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 75  E;.  }.  if( zFu
2d50: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
2d60: 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26  .      (xFunc &&
2d70: 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65   (xFinal || xSte
2d80: 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21  p)) || .      (!
2d90: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
2da0: 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a   && !xStep)) ||.
2db0: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
2dc0: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
2dd0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
2de0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 31  Arg<-1 || nArg>1
2df0: 32 37 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  27) ||.      (25
2e00: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  5<(nName = strle
2e10: 6e 28 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  n(zFunctionName)
2e20: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
2e30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2e40: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
2e50: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
2e60: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
2e70: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
2e80: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
2e90: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
2ea0: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
2eb0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
2ec0: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
2ed0: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
2ee0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
2ef0: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
2f00: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
2f10: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
2f20: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
2f30: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
2f40: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
2f50: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
2f60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
2f70: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
2f80: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
2f90: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
2fa0: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
2fb0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
2fc0: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
2fd0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
2fe0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
2ff0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
3000: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
3010: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
3020: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
3030: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70  UTF8,.         p
3040: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
3050: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
3060: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
3070: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
3080: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
3090: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
30a0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
30b0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
30c0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20  LITE_UTF16LE,.  
30d0: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
30e0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
30f0: 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  Final);.    if( 
3100: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3110: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 65  return rc;.    e
3120: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
3130: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
3140: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
3150: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
3160: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
3170: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
3180: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
3190: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
31a0: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
31b0: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
31c0: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
31d0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
31e0: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
31f0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
3200: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
3210: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
3220: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
3230: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
3240: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
3250: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
3260: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
3270: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
3280: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
3290: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
32a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
32b0: 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  ame, nArg, enc, 
32c0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
32d0: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20  ->iPrefEnc==enc 
32e0: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
32f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
3300: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
3310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3320: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
3330: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55  USY, .        "U
3340: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
3350: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
3360: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
3370: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
3380: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3390: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
33a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
33b0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
33c0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
33d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
33e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
33f0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
3400: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
3410: 6e 41 72 67 2c 20 65 6e 63 2c 20 31 29 3b 0a 20  nArg, enc, 1);. 
3420: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3430: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
3440: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  .  p->flags = 0;
3450: 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46  .  p->xFunc = xF
3460: 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20  unc;.  p->xStep 
3470: 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  = xStep;.  p->xF
3480: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
3490: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
34a0: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
34b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34c0: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
34d0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
34e0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
34f0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
3500: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
3510: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
3520: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
3530: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
3540: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  Rep,.  void *pUs
3550: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
3560: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
3570: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
3580: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
3590: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
35a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
35b0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
35c0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
35d0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
35e0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
35f0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 63 6f 6e  t rc;.  char con
3600: 73 74 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  st *zFunc8;.  sq
3610: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d  lite3_value *pTm
3620: 70 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p;..  if( sqlite
3630: 33 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29  3SafetyCheck(db)
3640: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3650: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
3660: 7d 0a 20 20 70 54 6d 70 20 3d 20 73 71 6c 69 74  }.  pTmp = sqlit
3670: 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61  e3GetTransientVa
3680: 6c 75 65 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  lue(db);.  sqlit
3690: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 54  e3ValueSetStr(pT
36a0: 6d 70 2c 20 2d 31 2c 20 7a 46 75 6e 63 74 69 6f  mp, -1, zFunctio
36b0: 6e 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  nName, SQLITE_UT
36c0: 46 31 36 4e 41 54 49 56 45 2c 53 51 4c 49 54 45  F16NATIVE,SQLITE
36d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 75 6e  _STATIC);.  zFun
36e0: 63 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  c8 = sqlite3Valu
36f0: 65 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49  eText(pTmp, SQLI
3700: 54 45 5f 55 54 46 38 29 3b 0a 0a 20 20 69 66 28  TE_UTF8);..  if(
3710: 20 21 7a 46 75 6e 63 38 20 29 7b 0a 20 20 20 20   !zFunc8 ){.    
3720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3730: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
3740: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
3750: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
3760: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
3770: 65 70 2c 20 0a 20 20 20 20 20 20 70 55 73 65 72  ep, .      pUser
3780: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
3790: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72  ep, xFinal);.  r
37a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
37b0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
37c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
37d0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
37e0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
37f0: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
3800: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
3810: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
3820: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
3830: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
3840: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
3850: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
3860: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
3870: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
3880: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
3890: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
38a0: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
38b0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
38c0: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
38d0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
38e0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
38f0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
3900: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
3910: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
3920: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
3930: 20 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72   *pOld = db->pTr
3940: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
3950: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
3960: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
3970: 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   pArg;.  return 
3980: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
3990: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
39a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
39b0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
39c0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
39d0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
39e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
39f0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
3a00: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
3a10: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
3a20: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
3a30: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
3a40: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
3a50: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
3a60: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
3a70: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
3a80: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
3a90: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
3aa0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
3ab0: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
3ac0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
3ad0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
3ae0: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
3af0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
3b00: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
3b10: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
3b20: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 20  ){.  void *pOld 
3b30: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
3b40: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
3b50: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
3b60: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
3b70: 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = pArg;.  return
3b80: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
3b90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
3ba0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58  RACE */../*** EX
3bb0: 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a  PERIMENTAL ***.*
3bc0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
3bd0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
3be0: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
3bf0: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e  ansaction commen
3c00: 74 73 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  ts..** If either
3c10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3c20: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
3c30: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
3c40: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
3c50: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
3c60: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
3c70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
3ca0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
3cb0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
3cc0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
3cd0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
3ce0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
3cf0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
3d00: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
3d10: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
3d20: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
3d30: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
3d40: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
3d50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
3d60: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
3d70: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
3d80: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
3d90: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
3da0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
3db0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3dc0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e   to create a con
3dd0: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
3de0: 61 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64  abase BTree.** d
3df0: 72 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65  river.  If zFile
3e00: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
3e10: 20 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e   of a file, then
3e20: 20 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a   that file is.**
3e30: 20 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64   opened and used
3e40: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
3e50: 69 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  is the magic nam
3e60: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  e ":memory:" the
3e70: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
3e80: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  e is stored in m
3e90: 65 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68  emory (and is th
3ea0: 75 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20  us forgotten as 
3eb0: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63  soon as.** the c
3ec0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  onnection is clo
3ed0: 73 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e  sed.)  If zFilen
3ee0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
3ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3f00: 20 69 73 20 61 20 22 76 69 72 74 75 61 6c 22 20   is a "virtual" 
3f10: 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 72 61  database for tra
3f20: 6e 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c 79 20  nsient use only 
3f30: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 20 61  and is deleted a
3f40: 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74 68 65  s.** soon as the
3f50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
3f60: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76  losed..**.** A v
3f70: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
3f80: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
3f90: 64 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20  disk file (that 
3fa0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
3fb0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
3fc0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
3fd0: 73 65 64 29 20 6f 72 20 69 74 20 61 6e 20 62 65  sed) or it an be
3fe0: 20 68 65 6c 64 20 65 6e 74 69 72 65 6c 79 20 69   held entirely i
3ff0: 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 64 65 70  n memory,.** dep
4000: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
4010: 6c 75 65 73 20 6f 66 20 74 68 65 20 54 45 4d 50  lues of the TEMP
4020: 5f 53 54 4f 52 45 20 63 6f 6d 70 69 6c 65 2d 74  _STORE compile-t
4030: 69 6d 65 20 6d 61 63 72 6f 20 61 6e 64 20 74 68  ime macro and th
4040: 65 0a 2a 2a 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e.** db->temp_st
4050: 6f 72 65 20 76 61 72 69 61 62 6c 65 2c 20 61 63  ore variable, ac
4060: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66  cording to the f
4070: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 3a 0a  ollowing chart:.
4080: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 45 4d 50  **.**       TEMP
4090: 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
40a0: 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
40b0: 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
40c0: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
40d0: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
40e0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
40f0: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 20  ------.**       
4120: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
4130: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
4140: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20      file.**     
4150: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
4160: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
4170: 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20        file.**   
4180: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
4190: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
41a0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
41b0: 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20  *           1   
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
41e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 32 20  .**           2 
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
4210: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
4220: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
4230: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
4240: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  memory.**       
4250: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
4260: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
4270: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20      memory.**   
4280: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
4290: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
42a0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
42b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
42c0: 65 65 46 61 63 74 6f 72 79 28 0a 20 20 63 6f 6e  eeFactory(.  con
42d0: 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  st sqlite3 *db, 
42e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64         /* Main d
42f0: 61 74 61 62 61 73 65 20 77 68 65 6e 20 6f 70 65  atabase when ope
4300: 6e 69 6e 67 20 61 75 78 20 6f 74 68 65 72 77 69  ning aux otherwi
4310: 73 65 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se 0 */.  const 
4320: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
4330: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4340: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
4350: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
4360: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f  abase */.  int o
4370: 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20  mitJournal,     
4380: 20 20 20 20 20 2f 2a 20 69 66 20 54 52 55 45 20       /* if TRUE 
4390: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75 72  then do not jour
43a0: 6e 61 6c 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  nal this file */
43b0: 0a 20 20 69 6e 74 20 6e 43 61 63 68 65 2c 20 20  .  int nCache,  
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43d0: 48 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20 69  How many pages i
43e0: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
43f0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
4400: 42 74 72 65 65 20 20 20 20 20 20 20 20 20 20 20  Btree           
4410: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
4420: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
4430: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
4440: 7b 0a 20 20 69 6e 74 20 62 74 72 65 65 5f 66 6c  {.  int btree_fl
4450: 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ags = 0;.  int r
4460: 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  c;.  .  assert( 
4470: 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20  ppBtree != 0);. 
4480: 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c   if( omitJournal
4490: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 5f 66 6c   ){.    btree_fl
44a0: 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d 49  ags |= BTREE_OMI
44b0: 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20  T_JOURNAL;.  }. 
44c0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
44d0: 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f   SQLITE_NoReadlo
44e0: 63 6b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 5f  ck ){.    btree_
44f0: 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e  flags |= BTREE_N
4500: 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a  O_READLOCK;.  }.
4510: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
4520: 3d 30 20 29 7b 0a 23 69 66 20 54 45 4d 50 5f 53  =0 ){.#if TEMP_S
4530: 54 4f 52 45 3d 3d 30 0a 20 20 20 20 2f 2a 20 44  TORE==0.    /* D
4540: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 23 65 6e  o nothing */.#en
4550: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
4560: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
4570: 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d  .#if TEMP_STORE=
4580: 3d 31 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 74  =1.    if( db->t
4590: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 20 7a  emp_store==2 ) z
45a0: 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
45b0: 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69  ory:";.#endif.#i
45c0: 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  f TEMP_STORE==2.
45d0: 20 20 20 20 69 66 28 20 64 62 2d 3e 74 65 6d 70      if( db->temp
45e0: 5f 73 74 6f 72 65 21 3d 31 20 29 20 7a 46 69 6c  _store!=1 ) zFil
45f0: 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
4600: 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 54  :";.#endif.#if T
4610: 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 20  EMP_STORE==3.   
4620: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d   zFilename = ":m
4630: 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a  emory:";.#endif.
4640: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4650: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 2a  _OMIT_MEMORYDB *
4660: 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  /.  }..  rc = sq
4670: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 7a  lite3BtreeOpen(z
4680: 46 69 6c 65 6e 61 6d 65 2c 20 70 70 42 74 72 65  Filename, ppBtre
4690: 65 2c 20 62 74 72 65 65 5f 66 6c 61 67 73 29 3b  e, btree_flags);
46a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
46b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
46c0: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
46d0: 61 6e 64 6c 65 72 28 2a 70 70 42 74 72 65 65 2c  andler(*ppBtree,
46e0: 20 28 76 6f 69 64 2a 29 26 64 62 2d 3e 62 75 73   (void*)&db->bus
46f0: 79 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 73  yHandler);.    s
4700: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
4710: 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65  cheSize(*ppBtree
4720: 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20  , nCache);.  }. 
4730: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4740: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
4750: 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
4760: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
4770: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
4780: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
4790: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
47a0: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
47b0: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
47c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
47d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73  .  if( sqlite3Ts
47e0: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
47f0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
4800: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
4810: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
4820: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61  .  if( sqlite3Sa
4830: 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 7c 7c  fetyCheck(db) ||
4840: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51   db->errCode==SQ
4850: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
4860: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
4870: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
4880: 49 53 55 53 45 29 3b 0a 20 20 7d 0a 20 20 7a 20  ISUSE);.  }.  z 
4890: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
48a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
48b0: 70 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  pErr);.  if( z==
48c0: 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  0 ){.    z = sql
48d0: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
48e0: 72 72 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72  rrCode);.  }.  r
48f0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
4900: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4910: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
4920: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
4930: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
4940: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
4950: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
4960: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
4970: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
4980: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
4990: 74 65 33 20 2a 64 62 29 7b 0a 20 20 2f 2a 20 42  te3 *db){.  /* B
49a0: 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 63  ecause all the c
49b0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
49c0: 20 73 74 72 69 6e 67 20 61 72 65 20 69 6e 20 74   string are in t
49d0: 68 65 20 75 6e 69 63 6f 64 65 0a 20 20 2a 2a 20  he unicode.  ** 
49e0: 72 61 6e 67 65 20 30 78 30 30 2d 30 78 46 46 2c  range 0x00-0xFF,
49f0: 20 69 66 20 77 65 20 70 61 64 20 74 68 65 20 62   if we pad the b
4a00: 69 67 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67  ig-endian string
4a10: 20 77 69 74 68 20 61 20 0a 20 20 2a 2a 20 7a 65   with a .  ** ze
4a20: 72 6f 20 62 79 74 65 2c 20 77 65 20 63 61 6e 20  ro byte, we can 
4a30: 6f 62 74 61 69 6e 20 74 68 65 20 6c 69 74 74 6c  obtain the littl
4a40: 65 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20  e-endian string 
4a50: 77 69 74 68 0a 20 20 2a 2a 20 26 62 69 67 5f 65  with.  ** &big_e
4a60: 6e 64 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20  ndian[1]..  */. 
4a70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
4a80: 61 72 20 6f 75 74 4f 66 4d 65 6d 42 65 5b 5d 20  ar outOfMemBe[] 
4a90: 3d 20 7b 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20  = {.    0, 'o', 
4aa0: 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20  0, 'u', 0, 't', 
4ab0: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
4ac0: 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20  'o', 0, 'f', 0, 
4ad0: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6d 27  ' ', .    0, 'm'
4ae0: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 6d 27  , 0, 'e', 0, 'm'
4af0: 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 72 27  , 0, 'o', 0, 'r'
4b00: 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 30 2c 20  , 0, 'y', 0, 0, 
4b10: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
4b20: 63 6f 6e 73 74 20 63 68 61 72 20 6d 69 73 75 73  const char misus
4b30: 65 42 65 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  eBe [] = {.    0
4b40: 2c 20 27 6c 27 2c 20 30 2c 20 27 69 27 2c 20 30  , 'l', 0, 'i', 0
4b50: 2c 20 27 62 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'b', 0, 'r', 0
4b60: 2c 20 27 61 27 2c 20 30 2c 20 27 72 27 2c 20 30  , 'a', 0, 'r', 0
4b70: 2c 20 27 79 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 'y', 0, ' ', .
4b80: 20 20 20 20 30 2c 20 27 72 27 2c 20 30 2c 20 27      0, 'r', 0, '
4b90: 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27  o', 0, 'u', 0, '
4ba0: 74 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27  t', 0, 'i', 0, '
4bb0: 6e 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27  n', 0, 'e', 0, '
4bc0: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 63 27 2c   ', .    0, 'c',
4bd0: 20 30 2c 20 27 61 27 2c 20 30 2c 20 27 6c 27 2c   0, 'a', 0, 'l',
4be0: 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 65 27 2c   0, 'l', 0, 'e',
4bf0: 20 30 2c 20 27 64 27 2c 20 30 2c 20 27 20 27 2c   0, 'd', 0, ' ',
4c00: 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c   .    0, 'o', 0,
4c10: 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c   'u', 0, 't', 0,
4c20: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f   ' ', .    0, 'o
4c30: 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20  ', 0, 'f', 0, ' 
4c40: 27 2c 20 0a 20 20 20 20 30 2c 20 27 73 27 2c 20  ', .    0, 's', 
4c50: 30 2c 20 27 65 27 2c 20 30 2c 20 27 71 27 2c 20  0, 'e', 0, 'q', 
4c60: 30 2c 20 27 75 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'u', 0, 'e', 
4c70: 30 2c 20 27 6e 27 2c 20 30 2c 20 27 63 27 2c 20  0, 'n', 0, 'c', 
4c80: 30 2c 20 27 65 27 2c 20 30 2c 20 30 2c 20 30 0a  0, 'e', 0, 0, 0.
4c90: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
4ca0: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 73 71 6c  id *z;.  if( sql
4cb0: 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
4cc0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
4cd0: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26  eturn (void *)(&
4ce0: 6f 75 74 4f 66 4d 65 6d 42 65 5b 53 51 4c 49 54  outOfMemBe[SQLIT
4cf0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53  E_UTF16NATIVE==S
4d00: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f 31 3a  QLITE_UTF16LE?1:
4d10: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  0]);.  }.  if( s
4d20: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
4d30: 6b 28 64 62 29 20 7c 7c 20 64 62 2d 3e 65 72 72  k(db) || db->err
4d40: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4d 49 53  Code==SQLITE_MIS
4d50: 55 53 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  USE ){.    retur
4d60: 6e 20 28 76 6f 69 64 20 2a 29 28 26 6d 69 73 75  n (void *)(&misu
4d70: 73 65 42 65 5b 53 51 4c 49 54 45 5f 55 54 46 31  seBe[SQLITE_UTF1
4d80: 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f  6NATIVE==SQLITE_
4d90: 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20  UTF16LE?1:0]);. 
4da0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
4db0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
4dc0: 2d 3e 70 45 72 72 29 3b 0a 20 20 69 66 28 20 7a  ->pErr);.  if( z
4dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4de0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
4df0: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69  ->pErr, -1, sqli
4e00: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
4e10: 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20  rCode),.        
4e20: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
4e30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
4e40: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
4e50: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
4e60: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Err);.  }.  retu
4e70: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
4e80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
4e90: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
4ea0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
4eb0: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
4ec0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
4ed0: 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 0a  SQLite routine..
4ee0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
4ef0: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
4f00: 64 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  db){.  if( sqlit
4f10: 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46  e3Tsd()->mallocF
4f20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
4f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
4f50: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64  te3SafetyCheck(d
4f60: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
4f70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
4f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
4f90: 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  >errCode;.}../*.
4fa0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4fb0: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
4fc0: 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
4fd0: 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
4fe0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
4ff0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
5000: 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
5010: 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
5020: 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
5030: 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
5040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5050: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
5060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
5070: 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
5080: 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
5090: 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
50a0: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 20 20  qlite3 **ppDb   
50b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
50c0: 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
50d0: 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  handle */.){.  s
50e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
50f0: 74 20 72 63 2c 20 69 3b 0a 20 20 43 6f 6c 6c 53  t rc, i;.  CollS
5100: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a  eq *pColl;..  /*
5110: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
5120: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
5130: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
5140: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5150: 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20  of(sqlite3) );. 
5160: 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74   if( db==0 ) got
5170: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
5180: 64 62 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69  db->priorNewRowi
5190: 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 61 67  d = 0;.  db->mag
51a0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
51b0: 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 6e 44  C_BUSY;.  db->nD
51c0: 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 61 44 62  b = 2;.  db->aDb
51d0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
51e0: 3b 0a 20 20 64 62 2d 3e 65 6e 63 20 3d 20 53 51  ;.  db->enc = SQ
51f0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 64 62 2d  LITE_UTF8;.  db-
5200: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
5210: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
5220: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
5230: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 48  ames;.  sqlite3H
5240: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 46 75  ashInit(&db->aFu
5250: 6e 63 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  nc, SQLITE_HASH_
5260: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71  STRING, 0);.  sq
5270: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
5280: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c  b->aCollSeq, SQL
5290: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
52a0: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
52b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
52c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
52d0: 49 6e 69 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d  Init(&db->aDb[i]
52e0: 2e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  .tblHash, SQLITE
52f0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
5300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
5310: 68 49 6e 69 74 28 26 64 62 2d 3e 61 44 62 5b 69  hInit(&db->aDb[i
5320: 5d 2e 69 64 78 48 61 73 68 2c 20 53 51 4c 49 54  ].idxHash, SQLIT
5330: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
5340: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
5350: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 44 62 5b  shInit(&db->aDb[
5360: 69 5d 2e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  i].trigHash, SQL
5370: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
5380: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5390: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 44  HashInit(&db->aD
53a0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 53 51 4c 49  b[i].aFKey, SQLI
53b0: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
53c0: 31 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  1);.  }.  .  /* 
53d0: 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
53e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
53f0: 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
5400: 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
5410: 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
5420: 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
5430: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
5440: 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
5450: 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
5460: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
5470: 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
5480: 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
5490: 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
54a0: 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ilure..  */.  if
54b0: 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  ( sqlite3_create
54c0: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
54d0: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
54e0: 55 54 46 38 2c 20 30 2c 62 69 6e 43 6f 6c 6c 46  UTF8, 0,binCollF
54f0: 75 6e 63 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  unc) ||.      sq
5500: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
5510: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
5520: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
5530: 36 2c 20 30 2c 62 69 6e 43 6f 6c 6c 46 75 6e 63  6, 0,binCollFunc
5540: 29 20 7c 7c 0a 20 20 20 20 20 20 28 64 62 2d 3e  ) ||.      (db->
5550: 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
5560: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
5570: 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 22 42 49 4e  b, db->enc, "BIN
5580: 41 52 59 22 2c 20 36 2c 20 30 29 29 3d 3d 30 20  ARY", 6, 0))==0 
5590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  ){.    assert(rc
55a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
55b0: 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c  qlite3Tsd()->mal
55c0: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 20 20  locFailed);.    
55d0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
55e0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
55f0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
5600: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
5610: 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
5620: 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
5630: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
5640: 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ence. */.  sqlit
5650: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
5660: 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
5670: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
5680: 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
5690: 67 46 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 53 65  gFunc);..  /* Se
56a0: 74 20 66 6c 61 67 73 20 6f 6e 20 74 68 65 20 62  t flags on the b
56b0: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
56c0: 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20  g sequences */. 
56d0: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e   db->pDfltColl->
56e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f  type = SQLITE_CO
56f0: 4c 4c 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43 6f  LL_BINARY;.  pCo
5700: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
5710: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
5720: 54 45 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53 45  TE_UTF8, "NOCASE
5730: 22 2c 20 36 2c 20 30 29 3b 0a 20 20 69 66 28 20  ", 6, 0);.  if( 
5740: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
5750: 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  ll->type = SQLIT
5760: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 3b 0a 20  E_COLL_NOCASE;. 
5770: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
5780: 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
5790: 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
57a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
57b0: 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c  Factory(db, zFil
57c0: 65 6e 61 6d 65 2c 20 30 2c 20 4d 41 58 5f 50 41  ename, 0, MAX_PA
57d0: 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d  GES, &db->aDb[0]
57e0: 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  .pBt);.  if( rc!
57f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5800: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5810: 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 64  b, rc, 0);.    d
5820: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
5830: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
5840: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
5850: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  out;.  }..  /* T
5860: 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
5870: 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
5880: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
5890: 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
58a0: 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
58b0: 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
58c0: 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
58d0: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
58e0: 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
58f0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
5900: 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
5910: 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
5920: 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e  _level = 3;.#ifn
5930: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5940: 54 45 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62  TEMPDB.  db->aDb
5950: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
5960: 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
5970: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
5980: 31 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a  1;.#endif...  /*
5990: 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
59a0: 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
59b0: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
59c0: 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
59d0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
59e0: 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
59f0: 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
5a00: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
5a10: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
5a20: 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
5a30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 65 67   */.  sqlite3Reg
5a40: 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
5a50: 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 73 71 6c  tions(db);.  sql
5a60: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
5a70: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 64  LITE_OK, 0);.  d
5a80: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
5a90: 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 0a 6f  E_MAGIC_OPEN;..o
5aa0: 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28  pendb_out:.  if(
5ab0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
5ac0: 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  (db)==SQLITE_OK 
5ad0: 26 26 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  && sqlite3Tsd()-
5ae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
5af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5b00: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  r(db, SQLITE_NOM
5b10: 45 4d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2a 70  EM, 0);.  }.  *p
5b20: 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  pDb = db;.#ifnde
5b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
5b40: 4f 42 41 4c 52 45 43 4f 56 45 52 0a 20 20 69 66  OBALRECOVER.  if
5b50: 28 20 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( db ){.    sqli
5b60: 74 65 33 4f 73 2e 78 45 6e 74 65 72 4d 75 74 65  te3Os.xEnterMute
5b70: 78 28 29 3b 0a 20 20 20 20 64 62 2d 3e 70 4e 65  x();.    db->pNe
5b80: 78 74 20 3d 20 70 44 62 4c 69 73 74 3b 0a 20 20  xt = pDbList;.  
5b90: 20 20 70 44 62 4c 69 73 74 20 3d 20 64 62 3b 0a    pDbList = db;.
5ba0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 4c      sqlite3Os.xL
5bb0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
5bc0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
5bd0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
5be0: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  (db);.}../*.** O
5bf0: 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
5c00: 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
5c10: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
5c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5c30: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
5c40: 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
5c50: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
5c60: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
5c70: 70 70 44 62 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ppDb);.}..#ifnde
5c80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
5c90: 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
5ca0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
5cb0: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
5cc0: 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
5cd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
5ce0: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
5cf0: 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
5d00: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
5d10: 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
5d20: 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
5d30: 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
5d40: 55 54 46 2d 31 36 20 2a 2f 0a 20 20 69 6e 74 20  UTF-16 */.  int 
5d50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5d60: 4d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  M;.  sqlite3_val
5d70: 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 61 73 73  ue *pVal;..  ass
5d80: 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a  ert( ppDb );.  *
5d90: 70 70 44 62 20 3d 20 30 3b 0a 20 20 70 56 61 6c  ppDb = 0;.  pVal
5da0: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
5db0: 65 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ew();.  sqlite3V
5dc0: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
5dd0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
5de0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
5df0: 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
5e00: 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
5e10: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
5e20: 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
5e30: 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
5e40: 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
5e50: 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
5e60: 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
5e70: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Db);.    if( rc=
5e80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70  =SQLITE_OK && *p
5e90: 70 44 62 20 29 7b 0a 20 20 20 20 20 20 72 63 20  pDb ){.      rc 
5ea0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 2a  = sqlite3_exec(*
5eb0: 70 70 44 62 2c 20 22 50 52 41 47 4d 41 20 65 6e  ppDb, "PRAGMA en
5ec0: 63 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 31 36  coding = 'UTF-16
5ed0: 27 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  '", 0, 0, 0);.  
5ee0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 56    }.  }.  if( pV
5ef0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
5f00: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
5f10: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5f20: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
5f30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
5f40: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  6 */../*.** The 
5f50: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
5f60: 65 20 64 65 73 74 72 6f 79 73 20 61 20 76 69 72  e destroys a vir
5f70: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 68 61  tual machine tha
5f80: 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79 0a  t is created by.
5f90: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ** the sqlite3_c
5fa0: 6f 6d 70 69 6c 65 28 29 20 72 6f 75 74 69 6e 65  ompile() routine
5fb0: 2e 20 54 68 65 20 69 6e 74 65 67 65 72 20 72 65  . The integer re
5fc0: 74 75 72 6e 65 64 20 69 73 20 61 6e 20 53 51 4c  turned is an SQL
5fd0: 49 54 45 5f 0a 2a 2a 20 73 75 63 63 65 73 73 2f  ITE_.** success/
5fe0: 66 61 69 6c 75 72 65 20 63 6f 64 65 20 74 68 61  failure code tha
5ff0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6000: 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63 75 74  result of execut
6010: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 0a  ing the virtual.
6020: 2a 2a 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  ** machine..**.*
6030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
6040: 65 74 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ets the error co
6050: 64 65 20 61 6e 64 20 73 74 72 69 6e 67 20 72 65  de and string re
6060: 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 73 71 6c  turned by.** sql
6070: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 2c 20  ite3_errcode(), 
6080: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
6090: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
60a0: 6d 73 67 31 36 28 29 2e 0a 2a 2f 0a 69 6e 74 20  msg16()..*/.int 
60b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
60c0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
60d0: 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Stmt){.  int rc;
60e0: 0a 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20  .  if( pStmt==0 
60f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6100: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
6110: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6120: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 28 56 64  VdbeFinalize((Vd
6130: 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  be*)pStmt);.  }.
6140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6150: 2f 2a 0a 2a 2a 20 54 65 72 6d 69 6e 61 74 65 20  /*.** Terminate 
6160: 74 68 65 20 63 75 72 72 65 6e 74 20 65 78 65 63  the current exec
6170: 75 74 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 20  ution of an SQL 
6180: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
6190: 73 65 74 20 69 74 0a 2a 2a 20 62 61 63 6b 20 74  set it.** back t
61a0: 6f 20 69 74 73 20 73 74 61 72 74 69 6e 67 20 73  o its starting s
61b0: 74 61 74 65 20 73 6f 20 74 68 61 74 20 69 74 20  tate so that it 
61c0: 63 61 6e 20 62 65 20 72 65 75 73 65 64 2e 20 41  can be reused. A
61d0: 20 73 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   success code fr
61e0: 6f 6d 0a 2a 2a 20 74 68 65 20 70 72 69 6f 72 20  om.** the prior 
61f0: 65 78 65 63 75 74 69 6f 6e 20 69 73 20 72 65 74  execution is ret
6200: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
6210: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6220: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
6230: 64 20 73 74 72 69 6e 67 20 72 65 74 75 72 6e 65  d string returne
6240: 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  d by.** sqlite3_
6250: 65 72 72 63 6f 64 65 28 29 2c 20 73 71 6c 69 74  errcode(), sqlit
6260: 65 33 5f 65 72 72 6d 73 67 28 29 20 61 6e 64 20  e3_errmsg() and 
6270: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
6280: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
6290: 65 33 5f 72 65 73 65 74 28 73 71 6c 69 74 65 33  e3_reset(sqlite3
62a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
62b0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
62c0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Stmt==0 ){.    r
62d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
62e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
62f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
6300: 74 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29 3b  t((Vdbe*)pStmt);
6310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6320: 4d 61 6b 65 52 65 61 64 79 28 28 56 64 62 65 2a  MakeReady((Vdbe*
6330: 29 70 53 74 6d 74 2c 20 2d 31 2c 20 30 2c 20 30  )pStmt, -1, 0, 0
6340: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
6350: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6360: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
6370: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6380: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
6390: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
63a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
63b0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
63c0: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
63d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
63e0: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
63f0: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
6400: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
6410: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
6420: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
6430: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c   void*).){.  Col
6440: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
6450: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6460: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  K;.  .  if( sqli
6470: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64  te3SafetyCheck(d
6480: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
6490: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
64a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c    }..  /* If SQL
64b0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
64c0: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
64d0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
64e0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
64f0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
6500: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
6510: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
6520: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
6530: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
6540: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
6550: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
6560: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
6570: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
6580: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
6590: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
65a0: 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69  NATIVE;.  }..  i
65b0: 66 28 20 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  f( enc!=SQLITE_U
65c0: 54 46 38 20 26 26 20 65 6e 63 21 3d 53 51 4c 49  TF8 && enc!=SQLI
65d0: 54 45 5f 55 54 46 31 36 4c 45 20 26 26 20 65 6e  TE_UTF16LE && en
65e0: 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c!=SQLITE_UTF16B
65f0: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
6600: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
6610: 5f 45 52 52 4f 52 2c 20 0a 20 20 20 20 20 20 20  _ERROR, .       
6620: 20 22 50 61 72 61 6d 20 33 20 74 6f 20 73 71 6c   "Param 3 to sql
6630: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
6640: 61 74 69 6f 6e 28 29 20 6d 75 73 74 20 62 65 20  ation() must be 
6650: 6f 6e 65 20 6f 66 20 22 0a 20 20 20 20 20 20 20  one of ".       
6660: 20 22 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53   "SQLITE_UTF8, S
6670: 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 53 51 4c  QLITE_UTF16, SQL
6680: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
6690: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 22 0a 20  QLITE_UTF16BE". 
66a0: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
66b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
66c0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
66d0: 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
66e0: 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
66f0: 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
6700: 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
6710: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
6720: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
6730: 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
6740: 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
6750: 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
6760: 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
6770: 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
6780: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
6790: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
67a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
67b0: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 2c  Seq(db, (u8)enc,
67c0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
67d0: 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66 28  Name), 0);.  if(
67e0: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
67f0: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
6800: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
6810: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
6820: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
6830: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
6840: 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 65     "Unable to de
6850: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
6860: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
6870: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
6880: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
6890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
68a0: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
68b0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
68c0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
68d0: 62 29 3b 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c  b);.  }..  pColl
68e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
68f0: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
6900: 63 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  c, zName, strlen
6910: 28 7a 4e 61 6d 65 29 2c 20 31 29 3b 0a 20 20 69  (zName), 1);.  i
6920: 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 29 7b 0a 20  f( 0==pColl ){. 
6930: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6940: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
6950: 20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d     pColl->xCmp =
6960: 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 70   xCompare;.    p
6970: 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
6980: 74 78 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65  tx;.    pColl->e
6990: 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 7d 0a 20 20  nc = enc;.  }.  
69a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
69b0: 20 72 63 2c 20 30 29 3b 0a 20 20 72 65 74 75 72   rc, 0);.  retur
69c0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
69d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69e0: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
69f0: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
6a00: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
6a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
6a20: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
6a30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
6a40: 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
6a50: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
6a60: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
6a70: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
6a80: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
6a90: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
6aa0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
6ab0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
6ac0: 2a 29 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  *).){.  char con
6ad0: 73 74 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71  st *zName8;.  sq
6ae0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d  lite3_value *pTm
6af0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
6b00: 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20  SafetyCheck(db) 
6b10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6b20: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
6b30: 0a 20 20 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  .  pTmp = sqlite
6b40: 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
6b50: 75 65 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ue(db);.  sqlite
6b60: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 54 6d  3ValueSetStr(pTm
6b70: 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51  p, -1, zName, SQ
6b80: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6b90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6ba0: 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
6bb0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54  ite3ValueText(pT
6bc0: 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  mp, SQLITE_UTF8)
6bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
6be0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
6bf0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20  ion(db, zName8, 
6c00: 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
6c10: 61 72 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  are);.}.#endif /
6c20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
6c30: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
6c40: 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
6c50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
6c60: 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
6c70: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
6c80: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
6c90: 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
6ca0: 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
6cb0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
6cc0: 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
6cd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
6ce0: 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
6cf0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
6d00: 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
6d10: 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
6d20: 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
6d30: 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
6d40: 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
6d50: 29 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ).){.  if( sqlit
6d60: 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64 62  e3SafetyCheck(db
6d70: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6d80: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
6d90: 20 7d 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   }.  db->xCollNe
6da0: 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
6db0: 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
6dc0: 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
6dd0: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
6de0: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
6df0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
6e00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
6e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6e20: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
6e30: 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
6e40: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
6e50: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
6e60: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
6e70: 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
6e80: 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
6e90: 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
6ea0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
6eb0: 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
6ec0: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
6ed0: 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
6ee0: 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
6ef0: 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
6f00: 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
6f10: 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
6f20: 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
6f30: 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
6f40: 2a 29 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  *).){.  if( sqli
6f50: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64  te3SafetyCheck(d
6f60: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
6f70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
6f80: 20 20 7d 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e    }.  db->xCollN
6f90: 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
6fa0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
6fb0: 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
6fc0: 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
6fd0: 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
6fe0: 65 64 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  edArg;.  return 
6ff0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
7000: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7010: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
7020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7030: 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f  _GLOBALRECOVER./
7040: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7050: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
7060: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 20 6d  recover from a m
7070: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 74 68  alloc failure th
7080: 61 74 20 6f 63 63 75 72 65 64 0a 2a 2a 20 77 69  at occured.** wi
7090: 74 68 69 6e 20 53 51 4c 69 74 65 2e 20 0a 2a 2a  thin SQLite. .**
70a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
70b0: 6e 20 69 73 20 2a 6e 6f 74 2a 20 74 68 72 65 61  n is *not* threa
70c0: 64 73 61 66 65 2e 20 43 61 6c 6c 69 6e 67 20 74  dsafe. Calling t
70d0: 68 69 73 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  his from within 
70e0: 61 20 74 68 72 65 61 64 65 64 0a 2a 2a 20 61 70  a threaded.** ap
70f0: 70 6c 69 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  plication when t
7100: 68 72 65 61 64 73 20 6f 74 68 65 72 20 74 68 61  hreads other tha
7110: 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 76  n the caller hav
7120: 65 20 75 73 65 64 20 53 51 4c 69 74 65 20 69 73  e used SQLite is
7130: 20 0a 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 61   .** dangerous a
7140: 6e 64 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63  nd will almost c
7150: 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20  ertainly result 
7160: 69 6e 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 73 2e  in malfunctions.
7170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7180: 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29  global_recover()
7190: 7b 0a 23 69 66 20 30 0a 20 20 69 6e 74 20 72 63  {.#if 0.  int rc
71a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
71b0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 73 64 28   if( sqlite3Tsd(
71c0: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
71d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
71e0: 64 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  db;.    int i;. 
71f0: 20 20 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d     sqlite3Tsd()-
7200: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7210: 30 3b 0a 20 20 20 20 66 6f 72 28 64 62 3d 70 44  0;.    for(db=pD
7220: 62 4c 69 73 74 3b 20 64 62 3b 20 64 62 3d 64 62  bList; db; db=db
7230: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7240: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
7250: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
7260: 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  (db);.      for(
7270: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7280: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 74  i++){.        Bt
7290: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
72a0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
72b0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 28 72     if( pBt && (r
72c0: 63 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  c=sqlite3BtreeRe
72d0: 73 65 74 28 70 42 74 29 29 21 3d 30 20 29 7b 0a  set(pBt))!=0 ){.
72e0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 72            goto r
72f0: 65 63 6f 76 65 72 5f 6f 75 74 3b 0a 20 20 20 20  ecover_out;.    
7300: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
7310: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
7320: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
7330: 20 7d 0a 0a 72 65 63 6f 76 65 72 5f 6f 75 74 3a   }..recover_out:
7340: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
7360: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
7370: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
7380: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
7390: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
73a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
73b0: 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
73c0: 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
73d0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
73e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
73f0: 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
7400: 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
7410: 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
7420: 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
7430: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
7440: 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
7450: 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
7460: 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
7470: 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
7480: 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
7490: 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
74a0: 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
74b0: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53  .**.******* THIS
74c0: 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e   IS AN EXPERIMEN
74d0: 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53  TAL API AND IS S
74e0: 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45  UBJECT TO CHANGE
74f0: 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73   ******.*/.int s
7500: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
7510: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
7520: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
7530: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
7540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7550: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  BUG./*.** The fo
7560: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
7570: 69 73 20 73 75 62 74 69 74 75 74 65 64 20 66 6f  is subtituted fo
7580: 72 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54  r constant SQLIT
7590: 45 5f 43 4f 52 52 55 50 54 20 69 6e 0a 2a 2a 20  E_CORRUPT in.** 
75a0: 64 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64 73  debugging builds
75b0: 2e 20 20 54 68 69 73 20 70 72 6f 76 69 64 65 73  .  This provides
75c0: 20 61 20 77 61 79 20 74 6f 20 73 65 74 20 61 20   a way to set a 
75d0: 62 72 65 61 6b 70 6f 69 6e 74 20 66 6f 72 20 77  breakpoint for w
75e0: 68 65 6e 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  hen.** corruptio
75f0: 6e 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  n is first detec
7600: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
7610: 74 65 33 43 6f 72 72 75 70 74 28 76 6f 69 64 29  te3Corrupt(void)
7620: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
7630: 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6e  E_CORRUPT;.}.#en
7640: 64 69 66 0a                                      dif.