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

Artifact 65fc7de0b3c2e5b637c000ecf419c35de2525ef9:


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 37 37 20 32 30 30 37 2f 30 36  ,v 1.377 2007/06
0280: 2f 32 32 20 31 35 3a 32 31 3a 31 36 20 64 61 6e  /22 15:21:16 dan
0290: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02d0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a  e <ctype.h>../*.
02e0: 2a 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6f  ** The version o
02f0: 66 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2f  f the library.*/
0300: 0a 63 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69  .const char sqli
0310: 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20  te3_version[] = 
0320: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a  SQLITE_VERSION;.
0330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
0340: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76  te3_libversion(v
0350: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  oid){ return sql
0360: 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a  ite3_version; }.
0370: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
0380: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
0390: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
03a0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
03b0: 52 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  R; }../*.** If t
03c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
03d0: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73  ction pointer is
03e0: 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66   not NULL and if
03f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  .** SQLITE_ENABL
0400: 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61  E_IOTRACE is ena
0410: 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61  bled, then messa
0420: 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a  ges describing.*
0430: 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65  * I/O active are
0440: 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74   written using t
0450: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  his function.  T
0460: 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a  hese messages.**
0470: 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f   are intended fo
0480: 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69  r debugging acti
0490: 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  vity only..*/.vo
04a0: 69 64 20 28 2a 73 71 6c 69 74 65 33 5f 69 6f 5f  id (*sqlite3_io_
04b0: 74 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  trace)(const cha
04c0: 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 0a 2f  r*, ...) = 0;../
04d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c  *.** If the foll
04e0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
04f0: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
0500: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69  a string which i
0510: 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
0520: 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68   a directory, th
0530: 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  en that director
0540: 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  y will be used t
0550: 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f  o store.** tempo
0560: 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rary files..**.*
0570: 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22  * See also the "
0580: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
0590: 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c  e_directory" SQL
05a0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61   command..*/.cha
05b0: 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  r *sqlite3_temp_
05c0: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a  directory = 0;..
05d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
05e0: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
05f0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ting function na
0600: 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69  med "BINARY" whi
0610: 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  ch is always.** 
0620: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74  available..*/.st
0630: 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c  atic int binColl
0640: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
0650: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
0660: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
0670: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
0680: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
0690: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
06a0: 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79  c, n;.  n = nKey
06b0: 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20  1<nKey2 ? nKey1 
06c0: 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20  : nKey2;.  rc = 
06d0: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
06e0: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
06f0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
0700: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
0710: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
0720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .}../*.** Anothe
0730: 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  r built-in colla
0740: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e  ting sequence: N
0750: 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  OCASE. .**.** Th
0760: 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  is collating seq
0770: 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65  uence is intende
0780: 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  d to be used for
0790: 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61   "case independa
07a0: 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  nt.** comparison
07b0: 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77  ". SQLite's know
07c0: 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61  ledge of upper a
07d0: 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71  nd lower case eq
07e0: 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74  uivalents.** ext
07f0: 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65  ends only to the
0800: 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75   26 characters u
0810: 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69  sed in the Engli
0820: 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a  sh language..**.
0830: 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74  ** At the moment
0840: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
0850: 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74   UTF-8 implement
0860: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
0870: 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61   int nocaseColla
0880: 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64  tingFunc(.  void
0890: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74   *NotUsed,.  int
08a0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
08b0: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
08c0: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
08d0: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
08e0: 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74  nt r = sqlite3St
08f0: 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63  rNICmp(.      (c
0900: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
0910: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
0920: 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e  )pKey2, (nKey1<n
0930: 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79  Key2)?nKey1:nKey
0940: 32 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  2);.  if( 0==r )
0950: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
0960: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
0970: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
0980: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
0990: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
09a0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
09b0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
09c0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
09d0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
09e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
09f0: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
0a00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0a10: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
0a20: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
0a30: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
0a40: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
0a50: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
0a60: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
0a70: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
0a80: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
0a90: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0aa0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
0ab0: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
0ac0: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
0ad0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0ae0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
0af0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0b00: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
0b10: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
0b20: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
0b30: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
0b40: 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ase.*/.int sqlit
0b50: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
0b60: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   *db){.  HashEle
0b70: 6d 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a  m *i;.  int j;..
0b80: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
0b90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0ba0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  K;.  }.  if( sql
0bb0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28  ite3SafetyCheck(
0bc0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
0bd0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
0be0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
0bf0: 49 54 45 5f 53 53 45 0a 20 20 7b 0a 20 20 20 20  ITE_SSE.  {.    
0c00: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
0c10: 74 65 33 53 73 65 43 6c 65 61 6e 75 70 28 73 71  te3SseCleanup(sq
0c20: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 73 71 6c  lite3*);.    sql
0c30: 69 74 65 33 53 73 65 43 6c 65 61 6e 75 70 28 64  ite3SseCleanup(d
0c40: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 0a  b);.  }.#endif .
0c50: 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  .  sqlite3ResetI
0c60: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
0c70: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  , 0);..  /* If a
0c80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
0c90: 6f 70 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49  open, the ResetI
0ca0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20  nternalSchema() 
0cb0: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
0cc0: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
0cd0: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
0ce0: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
0cf0: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
0d00: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
0d10: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
0d20: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
0d30: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
0d40: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
0d50: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
0d60: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
0d70: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
0d80: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
0d90: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
0da0: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
0db0: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
0dc0: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
0dd0: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
0de0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0df0: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
0e00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
0e10: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
0e20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
0e30: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
0e40: 6e 67 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53  ng VMs, return S
0e50: 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20  QLITE_BUSY. */. 
0e60: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0e80: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
0e90: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55 6e  SY, .        "Un
0ea0: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
0eb0: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64  e to unfinalised
0ec0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
0ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0ee0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73  _BUSY;.  }.  ass
0ef0: 65 72 74 28 20 21 73 71 6c 69 74 65 33 53 61 66  ert( !sqlite3Saf
0f00: 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 3b 0a  etyCheck(db) );.
0f10: 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 64 62  .  /* FIX ME: db
0f20: 2d 3e 6d 61 67 69 63 20 6d 61 79 20 62 65 20 73  ->magic may be s
0f30: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  et to SQLITE_MAG
0f40: 49 43 5f 43 4c 4f 53 45 44 20 69 66 20 74 68 65  IC_CLOSED if the
0f50: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63   database.  ** c
0f60: 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20  annot be opened 
0f70: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 2e  for some reason.
0f80: 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
0f90: 20 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e   needs to run in
0fa0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2e  .  ** that case.
0fb0: 20 42 75 74 20 6d 61 79 62 65 20 74 68 65 72 65   But maybe there
0fc0: 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 65 78   should be an ex
0fd0: 74 72 61 20 6d 61 67 69 63 20 76 61 6c 75 65 20  tra magic value 
0fe0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 22 66 61  for the.  ** "fa
0ff0: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 22 20 73 74  iled to open" st
1000: 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
1010: 4f 44 4f 3a 20 43 6f 76 65 72 61 67 65 20 74 65  ODO: Coverage te
1020: 73 74 73 20 64 6f 20 6e 6f 74 20 74 65 73 74 20  sts do not test 
1030: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74  the case where t
1040: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
1050: 0a 20 20 2a 2a 20 74 72 75 65 2e 20 49 74 27 73  .  ** true. It's
1060: 20 68 61 72 64 20 74 6f 20 73 65 65 20 68 6f 77   hard to see how
1070: 20 74 6f 20 63 61 75 73 65 20 69 74 20 77 69 74   to cause it wit
1080: 68 6f 75 74 20 6d 65 73 73 69 6e 67 20 77 69 74  hout messing wit
1090: 68 20 74 68 72 65 61 64 73 2e 0a 20 20 2a 2f 0a  h threads..  */.
10a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21    if( db->magic!
10b0: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c  =SQLITE_MAGIC_CL
10c0: 4f 53 45 44 20 26 26 20 73 71 6c 69 74 65 33 53  OSED && sqlite3S
10d0: 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b 0a 20  afetyOn(db) ){. 
10e0: 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 44 49     /* printf("DI
10f0: 44 20 4e 4f 54 20 43 4c 4f 53 45 5c 6e 22 29 3b  D NOT CLOSE\n");
1100: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
1110: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1120: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1130: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ..  for(j=0; j<d
1140: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
1150: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
1160: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
1170: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
1180: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1190: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
11a0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
11b0: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
11c0: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
11d0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
11e0: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
11f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1200: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
1210: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
1220: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
1230: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
1240: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
1250: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
1260: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
1270: 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69  t(&db->aFunc); i
1280: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
1290: 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63  xt(i)){.    Func
12a0: 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a 70 4e 65  Def *pFunc, *pNe
12b0: 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 46 75 6e  xt;.    for(pFun
12c0: 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71  c = (FuncDef*)sq
12d0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
12e0: 20 70 46 75 6e 63 3b 20 70 46 75 6e 63 3d 70 4e   pFunc; pFunc=pN
12f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
1300: 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  t = pFunc->pNext
1310: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
1320: 65 65 28 70 46 75 6e 63 29 3b 0a 20 20 20 20 7d  ee(pFunc);.    }
1330: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71  .  }..  for(i=sq
1340: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
1350: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b  b->aCollSeq); i;
1360: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
1370: 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53  t(i)){.    CollS
1380: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
1390: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
13a0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a  hData(i);.    /*
13b0: 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74   Invoke any dest
13c0: 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72  ructors register
13d0: 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  ed for collation
13e0: 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64   sequence user d
13f0: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ata. */.    for(
1400: 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
1410: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b        if( pColl[
1420: 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  j].xDel ){.     
1430: 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c     pColl[j].xDel
1440: 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29  (pColl[j].pUser)
1450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1460: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1470: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
1480: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
1490: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
14a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14b0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14c0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
14d0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
14e0: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
14f0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
1500: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
1510: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
1520: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
1530: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
1540: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
1550: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
1560: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
1570: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1580: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
1590: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
15a0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
15b0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 48 61  dif..  sqlite3Ha
15c0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
15d0: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  nc);.  sqlite3Er
15e0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
15f0: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
1600: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
1610: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
1620: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
1630: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1640: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
1650: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
1660: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
1670: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
1680: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1690: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
16a0: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
16b0: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
16c0: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
16d0: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
16e0: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
16f0: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
1700: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
1710: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
1720: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
1730: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
1740: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1750: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
1760: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
1770: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
1780: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
1790: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
17a0: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
17b0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
17c0: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
17d0: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
17e0: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
17f0: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
1800: 73 71 6c 69 74 65 46 72 65 65 28 64 62 29 3b 0a  sqliteFree(db);.
1810: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1820: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
1830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1850: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
1860: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   files..*/.void 
1870: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
1880: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ll(sqlite3 *db){
1890: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
18a0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 66  inTrans = 0;.  f
18b0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
18c0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
18d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20   db->aDb[i].pBt 
18e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
18f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
1900: 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  ns(db->aDb[i].pB
1910: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  t) ){.        in
1920: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
1930: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1940: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62  BtreeRollback(db
1950: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
1960: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
1970: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20  inTrans = 0;.   
1980: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1990: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
19a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
19b0: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
19c0: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
19d0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
19e0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
19f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1a00: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
1a10: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
1a20: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
1a30: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
1a40: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
1a50: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
1a60: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
1a70: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
1a80: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
1a90: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
1aa0: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
1ab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
1ac0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
1ad0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
1ae0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
1af0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
1b00: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
1b10: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1b20: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
1b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b40: 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 26  ;.  switch( rc &
1b50: 20 30 78 66 66 20 29 7b 0a 20 20 20 20 63 61 73   0xff ){.    cas
1b60: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 0a 20 20  e SQLITE_ROW:.  
1b70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1b80: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  NE:.    case SQL
1b90: 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20  ITE_OK:         
1ba0: 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f  z = "not an erro
1bb0: 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r";             
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1bd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1be0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
1bf0: 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20 65  z = "SQL logic e
1c00: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
1c10: 64 61 74 61 62 61 73 65 22 3b 20 20 20 62 72 65  database";   bre
1c20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1c30: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
1c40: 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65 72 6d  z = "access perm
1c50: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20  ission denied"; 
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1c70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1c80: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
1c90: 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72 65  z = "callback re
1ca0: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
1cb0: 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62 72 65  ort";        bre
1cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1cd0: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
1ce0: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 69 73  z = "database is
1cf0: 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20   locked";       
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1d10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1d20: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
1d30: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 74 61  z = "database ta
1d40: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20  ble is locked"; 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1d60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1d70: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
1d80: 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  z = "out of memo
1d90: 72 79 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ry";            
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1db0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1dc0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
1dd0: 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74 6f 20  z = "attempt to 
1de0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
1df0: 20 64 61 74 61 62 61 73 65 22 3b 20 20 62 72 65   database";  bre
1e00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1e10: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
1e20: 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74 65 64  z = "interrupted
1e30: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1e50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1e60: 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20  ITE_IOERR:      
1e70: 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65 72  z = "disk I/O er
1e80: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1ea0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1eb0: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
1ec0: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 64 69  z = "database di
1ed0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
1ee0: 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62 72 65  ormed";      bre
1ef0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1f00: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
1f10: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 6f 72  z = "database or
1f20: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 3b 20   disk is full"; 
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1f40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1f50: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
1f60: 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  z = "unable to o
1f70: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1f80: 65 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  e";          bre
1f90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1fa0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
1fb0: 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74 61  z = "table conta
1fc0: 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20 20 20  ins no data";   
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1fe0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1ff0: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
2000: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 73 63  z = "database sc
2010: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
2020: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
2030: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2040: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
2050: 7a 20 3d 20 22 53 74 72 69 6e 67 20 6f 72 20 42  z = "String or B
2060: 4c 4f 42 20 65 78 63 65 65 64 65 64 20 73 69 7a  LOB exceeded siz
2070: 65 20 6c 69 6d 69 74 22 3b 20 20 20 20 62 72 65  e limit";    bre
2080: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2090: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20  ITE_CONSTRAINT: 
20a0: 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74 20  z = "constraint 
20b0: 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20 20 20  failed";        
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
20d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
20e0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
20f0: 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20 6d 69  z = "datatype mi
2100: 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20 20 20  smatch";        
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2120: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2130: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
2140: 7a 20 3d 20 22 6c 69 62 72 61 72 79 20 72 6f 75  z = "library rou
2150: 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20  tine called out 
2160: 6f 66 20 73 65 71 75 65 6e 63 65 22 3b 62 72 65  of sequence";bre
2170: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2180: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
2190: 7a 20 3d 20 22 6b 65 72 6e 65 6c 20 6c 61 63 6b  z = "kernel lack
21a0: 73 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70  s large file sup
21b0: 70 6f 72 74 22 3b 20 20 20 20 20 20 20 62 72 65  port";       bre
21c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
21d0: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
21e0: 7a 20 3d 20 22 61 75 74 68 6f 72 69 7a 61 74 69  z = "authorizati
21f0: 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20  on denied";     
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2210: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2220: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
2230: 7a 20 3d 20 22 61 75 78 69 6c 69 61 72 79 20 64  z = "auxiliary d
2240: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
2250: 72 72 6f 72 22 3b 20 20 20 20 20 20 20 62 72 65  rror";       bre
2260: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
2270: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
2280: 7a 20 3d 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c  z = "bind or col
2290: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
22a0: 20 72 61 6e 67 65 22 3b 20 20 20 20 20 62 72 65   range";     bre
22b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
22c0: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
22d0: 7a 20 3d 20 22 66 69 6c 65 20 69 73 20 65 6e 63  z = "file is enc
22e0: 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74  rypted or is not
22f0: 20 61 20 64 61 74 61 62 61 73 65 22 3b 62 72 65   a database";bre
2300: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  z = "unknown err
2330: 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  or";            
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2350: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2360: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   z;.}../*.** Thi
2370: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
2380: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
2390: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
23a0: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
23b0: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
23c0: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
23d0: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
23e0: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
23f0: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
2400: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2410: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
2420: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
2430: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
2440: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
2450: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
2460: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
2470: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2480: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2490: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24b0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
24c0: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
24d0: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 4f 53 5f  sy */.){.#if OS_
24e0: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
24f0: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
2500: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
2510: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
2520: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
2530: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
2540: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
2550: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
2560: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
2570: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
2580: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
2590: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
25a0: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
25b0: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
25c0: 69 6e 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65  ine NDELAY (size
25d0: 6f 66 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f  of(delays)/sizeo
25e0: 66 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20  f(delays[0])).  
25f0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
2600: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
2610: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
2620: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
2630: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
2640: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
2650: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
2660: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
2670: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
2680: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
2690: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
26a0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
26b0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
26c0: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
26d0: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
26e0: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
26f0: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
2700: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
2710: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
2720: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
2730: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
2740: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
2750: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
2760: 65 33 4f 73 53 6c 65 65 70 28 64 65 6c 61 79 29  e3OsSleep(delay)
2770: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
2780: 6c 73 65 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  lse.  int timeou
2790: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
27a0: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
27b0: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
27c0: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
27d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
27e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
27f0: 4f 73 53 6c 65 65 70 28 31 30 30 30 29 3b 0a 20  OsSleep(1000);. 
2800: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
2810: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
2820: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
2830: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
2840: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2850: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
2860: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
2870: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
2880: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
2890: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
28a0: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
28b0: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
28c0: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
28d0: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
28e0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
28f0: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
2900: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
2910: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
2920: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
2930: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 3d 3d  nt rc;.  if( p==
2940: 30 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30  0 || p->xFunc==0
2950: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
2960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
2970: 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41  = p->xFunc(p->pA
2980: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20  rg, p->nBusy);. 
2990: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
29a0: 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b    p->nBusy = -1;
29b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
29c0: 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20  >nBusy++;.  }.  
29d0: 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f  return rc; .}../
29e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29f0: 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20  e sets the busy 
2a00: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
2a10: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
2a20: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
2a30: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
2a40: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
2a50: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
2a60: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68  t sqlite3_busy_h
2a70: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
2a80: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78  3 *db,.  int (*x
2a90: 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Busy)(void*,int)
2aa0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
2ab0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
2ac0: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 29  afetyCheck(db) )
2ad0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ae0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
2af0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
2b00: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
2b10: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
2b20: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
2b30: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
2b40: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72  r.nBusy = 0;.  r
2b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2b70: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
2b80: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
2b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2ba0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
2bb0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
2bc0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
2bd0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
2be0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
2bf0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2c00: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
2c10: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
2c20: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
2c30: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
2c40: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
2c50: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
2c60: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
2c70: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
2c80: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
2c90: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
2ca0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
2cb0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
2cc0: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 29  afetyCheck(db) )
2cd0: 7b 0a 20 20 20 20 69 66 28 20 6e 4f 70 73 3e 30  {.    if( nOps>0
2ce0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 50   ){.      db->xP
2cf0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
2d00: 65 73 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  ess;.      db->n
2d10: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
2d20: 70 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 50  ps;.      db->pP
2d30: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
2d40: 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
2d50: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
2d60: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 62 2d  s = 0;.      db-
2d70: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
2d80: 30 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 50 72  0;.      db->pPr
2d90: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
2da0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
2db0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
2dc0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
2dd0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
2de0: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
2df0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
2e00: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
2e10: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
2e20: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
2e30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e40: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
2e50: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
2e60: 73 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  s){.  if( sqlite
2e70: 33 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29  3SafetyCheck(db)
2e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e90: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
2ea0: 7d 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  }.  if( ms>0 ){.
2eb0: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
2ec0: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71  out = ms;.    sq
2ed0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
2ee0: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
2ef0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
2f00: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
2f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
2f20: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
2f30: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
2f40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
2f60: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
2f70: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
2f80: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
2f90: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
2fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
2fb0: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
2fc0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
2fd0: 20 28 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c   (db->magic==SQL
2fe0: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 7c  ITE_MAGIC_OPEN |
2ff0: 7c 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  | db->magic==SQL
3000: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 29 20  ITE_MAGIC_BUSY) 
3010: 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73  ){.    db->u1.is
3020: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
3030: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  .  }.}../*.** Me
3040: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3050: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 75 73  routines that us
3060: 65 20 53 51 4c 69 74 65 73 20 69 6e 74 65 72 6e  e SQLites intern
3070: 61 6c 20 6d 65 6d 6f 72 79 0a 2a 2a 20 6d 65 6d  al memory.** mem
3080: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 2e 20 20  ory allocator.  
3090: 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77  Depending on how
30a0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
30b0: 6c 65 64 2c 20 74 68 65 0a 2a 2a 20 69 6e 74 65  led, the.** inte
30c0: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  rnal memory allo
30d0: 63 61 74 6f 72 20 6d 69 67 68 74 20 62 65 20 6a  cator might be j
30e0: 75 73 74 20 61 6e 20 61 6c 69 61 73 20 66 6f 72  ust an alias for
30f0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 64   the.** system d
3100: 65 66 61 75 6c 74 20 6d 61 6c 6c 6f 63 2f 72 65  efault malloc/re
3110: 61 6c 6c 6f 63 2f 66 72 65 65 2e 20 20 4f 72 20  alloc/free.  Or 
3120: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 61 6c 6c  the built-in all
3130: 6f 63 61 74 6f 72 0a 2a 2a 20 6d 69 67 68 74 20  ocator.** might 
3140: 64 6f 20 65 78 74 72 61 20 73 74 75 66 66 20 6c  do extra stuff l
3150: 69 6b 65 20 70 75 74 20 73 65 6e 74 69 6e 61 6c  ike put sentinal
3160: 73 20 61 72 6f 75 6e 64 20 62 75 66 66 65 72 73  s around buffers
3170: 20 74 6f 20 0a 2a 2a 20 63 68 65 63 6b 20 66 6f   to .** check fo
3180: 72 20 6f 76 65 72 72 75 6e 73 20 6f 72 20 6c 6f  r overruns or lo
3190: 6f 6b 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c 65  ok for memory le
31a0: 61 6b 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73  aks..**.** Use s
31b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
31c0: 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 72 65 74   free memory ret
31d0: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
31e0: 5f 6d 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 76  _mprintf()..*/.v
31f0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 66 72 65 65  oid sqlite3_free
3200: 28 76 6f 69 64 20 2a 70 29 7b 20 69 66 28 20 70  (void *p){ if( p
3210: 20 29 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65   ) sqlite3OsFree
3220: 28 70 29 3b 20 7d 0a 76 6f 69 64 20 2a 73 71 6c  (p); }.void *sql
3230: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20  ite3_malloc(int 
3240: 6e 42 79 74 65 29 7b 20 72 65 74 75 72 6e 20 6e  nByte){ return n
3250: 42 79 74 65 3e 30 20 3f 20 73 71 6c 69 74 65 33  Byte>0 ? sqlite3
3260: 4f 73 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 20  OsMalloc(nByte) 
3270: 3a 20 30 3b 20 7d 0a 76 6f 69 64 20 2a 73 71 6c  : 0; }.void *sql
3280: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 76 6f 69  ite3_realloc(voi
3290: 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79  d *pOld, int nBy
32a0: 74 65 29 7b 20 0a 20 20 69 66 28 20 70 4f 6c 64  te){ .  if( pOld
32b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74   ){.    if( nByt
32c0: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e>0 ){.      ret
32d0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 52 65 61  urn sqlite3OsRea
32e0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79 74 65  lloc(pOld, nByte
32f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3300: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65      sqlite3OsFre
3310: 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20 72  e(pOld);.      r
3320: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
3330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
3340: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  rn sqlite3_mallo
3350: 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 7d 0a  c(nByte);.  }.}.
3360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3370: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
3380: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
3390: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
33a0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
33b0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
33c0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
33d0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
33e0: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
33f0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
3400: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
3410: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
3420: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
3430: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
3440: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
3450: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
3460: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
3470: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
3480: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
3490: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
34a0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
34b0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
34c0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
34d0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
34e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
34f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3500: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
3510: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
3520: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
3530: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
3540: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
3550: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
3560: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
3570: 74 2a 29 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66  t*).){.  FuncDef
3580: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65   *p;.  int nName
3590: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
35a0: 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20  SafetyCheck(db) 
35b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35c0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
35d0: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
35e0: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
35f0: 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e   (xFunc && (xFin
3600: 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c  al || xStep)) ||
3610: 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20   .      (!xFunc 
3620: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
3630: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
3640: 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69  (!xFunc && (!xFi
3650: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
3660: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
3670: 20 7c 7c 20 6e 41 72 67 3e 31 32 37 29 20 7c 7c   || nArg>127) ||
3680: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
3690: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6e  me = strlen(zFun
36a0: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
36b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
36c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
36d0: 52 2c 20 22 62 61 64 20 70 61 72 61 6d 65 74 65  R, "bad paramete
36e0: 72 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rs");.    return
36f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3700: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
3710: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
3720: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
3730: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
3740: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
3750: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
3760: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
3770: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
3780: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
3790: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
37a0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
37b0: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
37c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
37d0: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
37e0: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
37f0: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
3800: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
3810: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
3820: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
3830: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
3840: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
3850: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
3860: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
3870: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
3880: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
3890: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
38a0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
38b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
38c0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
38d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
38e0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
38f0: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
3900: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
3910: 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69  , xFinal);.    i
3920: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3930: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
3940: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
3950: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
3960: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
3970: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
3980: 2c 0a 20 20 20 20 20 20 20 20 70 55 73 65 72 44  ,.        pUserD
3990: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
39a0: 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20  p, xFinal);.    
39b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
39c0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
39d0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
39e0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
39f0: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
3a00: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
3a10: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
3a20: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
3a30: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
3a40: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
3a50: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
3a60: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
3a70: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
3a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
3a90: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
3aa0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
3ab0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
3ac0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
3ad0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
3ae0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
3af0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
3b00: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
3b10: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
3b20: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
3b30: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
3b40: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
3b50: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
3b60: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65  , nName, nArg, e
3b70: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
3b80: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
3b90: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
3ba0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
3bb0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
3bc0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
3bd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
3be0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
3bf0: 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "Unable to del
3c00: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
3c10: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
3c20: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
3c30: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
3c40: 74 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t( !sqlite3Mallo
3c50: 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 20  cFailed() );.   
3c60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3c70: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
3c80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3c90: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
3ca0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
3cb0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
3cc0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
3cd0: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
3ce0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
3cf0: 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20 69 66 28  , enc, 1);.  if(
3d00: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61   p ){.    p->fla
3d10: 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 78  gs = 0;.    p->x
3d20: 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20  Func = xFunc;.  
3d30: 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74    p->xStep = xSt
3d40: 65 70 3b 0a 20 20 20 20 70 2d 3e 78 46 69 6e 61  ep;.    p->xFina
3d50: 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20  lize = xFinal;. 
3d60: 20 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20     p->pUserData 
3d70: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 20  = pUserData;.   
3d80: 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b   p->nArg = nArg;
3d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3da0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3db0: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
3dc0: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
3dd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
3de0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
3df0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
3e00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
3e10: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
3e20: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
3e30: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
3e40: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
3e50: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
3e60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3e70: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
3e80: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
3e90: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
3ea0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
3eb0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
3ec0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
3ed0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
3ee0: 65 72 74 28 20 21 73 71 6c 69 74 65 33 4d 61 6c  ert( !sqlite3Mal
3ef0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3f00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
3f10: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
3f20: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
3f30: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
3f40: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a  xStep, xFinal);.
3f50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3f60: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
3f70: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69  ITE_OMIT_UTF16.i
3f90: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
3fa0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20  e_function16(.  
3fb0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
3fc0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63  onst void *zFunc
3fd0: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
3fe0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78  nArg,.  int eTex
3ff0: 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c  tRep,.  void *p,
4000: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
4010: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
4020: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
4030: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
4040: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
4050: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
4060: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
4070: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
4080: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
4090: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
40a0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20   char *zFunc8;. 
40b0: 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
40c0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
40d0: 29 3b 0a 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73  );..  zFunc8 = s
40e0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 7a  qlite3Utf16to8(z
40f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
4100: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
4110: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
4120: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
4130: 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63  extRep, p, xFunc
4140: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29  , xStep, xFinal)
4150: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
4160: 46 75 6e 63 38 29 3b 0a 0a 20 20 72 65 74 75 72  Func8);..  retur
4170: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
4180: 28 64 62 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  (db, rc);.}.#end
4190: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
41a0: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
41b0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
41c0: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
41d0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
41e0: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
41f0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
4200: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
4210: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
4220: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
4230: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
4240: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
4250: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
4260: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
4270: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
4280: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
4290: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
42a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
42b0: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
42c0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
42d0: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
42e0: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
42f0: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
4300: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
4310: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
4320: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
4330: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
4340: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
4350: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
4360: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
4370: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
4380: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
4390: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
43a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
43b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
43c0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
43d0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  .){.  int nName 
43e0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
43f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
4400: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
4410: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
4420: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
4430: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  0)==0 ){.    sql
4440: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
4450: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
4460: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
4490: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
44a0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
44b0: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
44c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
44d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
44e0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
44f0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
4500: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
4510: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
4520: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
4530: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
4540: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
4550: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
4560: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
4570: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
4580: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
4590: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
45a0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
45b0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
45c0: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
45d0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
45e0: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
45f0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
4600: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
4610: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
4620: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
4630: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
4640: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
4650: 20 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72   *pOld = db->pTr
4660: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
4670: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
4680: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
4690: 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   pArg;.  return 
46a0: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
46b0: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
46c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
46d0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
46e0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
46f0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
4700: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
4710: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
4720: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
4730: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
4740: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
4750: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
4760: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
4770: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
4780: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
4790: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
47a0: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
47b0: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
47c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
47d0: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
47e0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
47f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4800: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
4810: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
4820: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
4830: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
4840: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 20  ){.  void *pOld 
4850: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
4860: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
4870: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
4880: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
4890: 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = pArg;.  return
48a0: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
48b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
48c0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58  RACE */../*** EX
48d0: 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a  PERIMENTAL ***.*
48e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
48f0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
4900: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
4910: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e  ansaction commen
4920: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
4930: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
4940: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
4950: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
4960: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
4970: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
4980: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
4990: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
49a0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
49b0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
49c0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
49d0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
49e0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
49f0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
4a00: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
4a10: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
4a20: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
4a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
4a40: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
4a50: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
4a60: 64 20 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  d *pOld = db->pC
4a70: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
4a80: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
4a90: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
4aa0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
4ab0: 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  pArg;.  return p
4ac0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
4ad0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
4ae0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
4af0: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
4b00: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
4b10: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
4b20: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
4b30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4b40: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
4b50: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
4b60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b80: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
4b90: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
4ba0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
4bb0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
4bc0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
4bd0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
4be0: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
4bf0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
4c00: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
4c10: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
4c20: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
4c30: 2a 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64  *pRet = db->pUpd
4c40: 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
4c50: 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
4c60: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
4c70: 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
4c80: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  rg;.  return pRe
4c90: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
4ca0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
4cb0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
4cc0: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
4cd0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
4ce0: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
4cf0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4d00: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
4d10: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
4d20: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
4d30: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4d40: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
4d50: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
4d60: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
4d70: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
4d80: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
4d90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
4da0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
4db0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
4dc0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
4dd0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
4de0: 20 2a 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f   *pRet = db->pRo
4df0: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
4e00: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
4e10: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
4e20: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
4e30: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74  rg = pArg;.  ret
4e40: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
4e50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e60: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
4e70: 61 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ate a connection
4e80: 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 42   to a database B
4e90: 54 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20  Tree.** driver. 
4ea0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
4eb0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
4ec0: 69 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66  ile, then that f
4ed0: 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64  ile is.** opened
4ee0: 20 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a   and used.  If z
4ef0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
4f00: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
4f10: 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68  ory:" then.** th
4f20: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
4f30: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28  ored in memory (
4f40: 61 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72 67  and is thus forg
4f50: 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73  otten as soon as
4f60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
4f70: 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20  on is closed.)  
4f80: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
4f90: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61  NULL then the da
4fa0: 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22  tabase.** is a "
4fb0: 76 69 72 74 75 61 6c 22 20 64 61 74 61 62 61 73  virtual" databas
4fc0: 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
4fd0: 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20  use only and is 
4fe0: 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f  deleted as.** so
4ff0: 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63  on as the connec
5000: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
5010: 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20  **.** A virtual 
5020: 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
5030: 65 69 74 68 65 72 20 61 20 64 69 73 6b 20 66 69  either a disk fi
5040: 6c 65 20 28 74 68 61 74 20 69 73 20 61 75 74 6f  le (that is auto
5050: 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c  matically.** del
5060: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  eted when the fi
5070: 6c 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72  le is closed) or
5080: 20 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65   it an be held e
5090: 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72  ntirely in memor
50a0: 79 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20  y,.** depending 
50b0: 6f 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  on the values of
50c0: 20 74 68 65 20 54 45 4d 50 5f 53 54 4f 52 45 20   the TEMP_STORE 
50d0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63  compile-time mac
50e0: 72 6f 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62  ro and the.** db
50f0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 76 61 72  ->temp_store var
5100: 69 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67  iable, according
5110: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
5120: 67 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20  g chart:.**.**  
5130: 20 20 20 20 20 54 45 4d 50 5f 53 54 4f 52 45 20       TEMP_STORE 
5140: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
5150: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
5160: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
5170: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 2d  abase.**       -
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
51a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
51c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30 20 20  **           0  
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
51f0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31  e.**           1
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  1              f
5220: 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ile.**          
5230: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
5240: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
5250: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20   memory.**      
5260: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
5270: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
5280: 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20       file.**    
5290: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
52a0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
52b0: 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20         file.**  
52c0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
52d0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
52e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a           memory.
52f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 32 20 20  **           2  
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
5320: 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
5330: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
5340: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
5350: 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73   memory.*/.int s
5360: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
5370: 72 79 28 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ry(.  const sqli
5380: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
5390: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
53a0: 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75   when opening au
53b0: 78 20 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f  x otherwise 0 */
53c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
53d0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
53e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
53f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5400: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
5410: 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72  /.  int omitJour
5420: 6e 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nal,          /*
5430: 20 69 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f   if TRUE then do
5440: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69   not journal thi
5450: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
5460: 6e 43 61 63 68 65 2c 20 20 20 20 20 20 20 20 20  nCache,         
5470: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e        /* How man
5480: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
5490: 61 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 42  age cache */.  B
54a0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20  tree **ppBtree  
54b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
54c0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
54d0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
54e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
54f0: 20 62 74 72 65 65 5f 66 6c 61 67 73 20 3d 20 30   btree_flags = 0
5500: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  ;.  int rc;.  . 
5510: 20 61 73 73 65 72 74 28 20 70 70 42 74 72 65 65   assert( ppBtree
5520: 20 21 3d 20 30 29 3b 0a 20 20 69 66 28 20 6f 6d   != 0);.  if( om
5530: 69 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  itJournal ){.   
5540: 20 62 74 72 65 65 5f 66 6c 61 67 73 20 7c 3d 20   btree_flags |= 
5550: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
5560: 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  AL;.  }.  if( db
5570: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5580: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
5590: 20 20 20 62 74 72 65 65 5f 66 6c 61 67 73 20 7c     btree_flags |
55a0: 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c  = BTREE_NO_READL
55b0: 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  OCK;.  }.  if( z
55c0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23  Filename==0 ){.#
55d0: 69 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30  if TEMP_STORE==0
55e0: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  .    /* Do nothi
55f0: 6e 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ng */.#endif.#if
5600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5610: 5f 4d 45 4d 4f 52 59 44 42 0a 23 69 66 20 54 45  _MEMORYDB.#if TE
5620: 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 20 20  MP_STORE==1.    
5630: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
5640: 72 65 3d 3d 32 20 29 20 7a 46 69 6c 65 6e 61 6d  re==2 ) zFilenam
5650: 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a  e = ":memory:";.
5660: 23 65 6e 64 69 66 0a 23 69 66 20 54 45 4d 50 5f  #endif.#if TEMP_
5670: 53 54 4f 52 45 3d 3d 32 0a 20 20 20 20 69 66 28  STORE==2.    if(
5680: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
5690: 3d 31 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =1 ) zFilename =
56a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e   ":memory:";.#en
56b0: 64 69 66 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f  dif.#if TEMP_STO
56c0: 52 45 3d 3d 33 0a 20 20 20 20 7a 46 69 6c 65 6e  RE==3.    zFilen
56d0: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
56e0: 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  ;.#endif.#endif 
56f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  /* SQLITE_OMIT_M
5700: 45 4d 4f 52 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a  EMORYDB */.  }..
5710: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5720: 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  reeOpen(zFilenam
5730: 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 64 62  e, (sqlite3 *)db
5740: 2c 20 70 70 42 74 72 65 65 2c 20 62 74 72 65 65  , ppBtree, btree
5750: 5f 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72  _flags);.  if( r
5760: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5770: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5780: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 2a  SetBusyHandler(*
5790: 70 70 42 74 72 65 65 2c 20 28 76 6f 69 64 2a 29  ppBtree, (void*)
57a0: 26 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  &db->busyHandler
57b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
57c0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
57d0: 2a 70 70 42 74 72 65 65 2c 20 6e 43 61 63 68 65  *ppBtree, nCache
57e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
57f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
5800: 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
5810: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
5820: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
5830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5840: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
5850: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
5860: 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
5870: 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
5880: 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65 72  char *z;.  asser
5890: 74 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t( !sqlite3Mallo
58a0: 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 69  cFailed() );.  i
58b0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
58c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
58d0: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
58e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
58f0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64  te3SafetyCheck(d
5900: 62 29 20 7c 7c 20 64 62 2d 3e 65 72 72 43 6f 64  b) || db->errCod
5910: 65 3d 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  e==SQLITE_MISUSE
5920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
5930: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
5940: 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20 20 7d  ITE_MISUSE);.  }
5950: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  .  z = (char*)sq
5960: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5970: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 69 66  (db->pErr);.  if
5980: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 20  ( z==0 ){.    z 
5990: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
59a0: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
59b0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
59c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
59d0: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
59e0: 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65   Return UTF-16 e
59f0: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
5a00: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
5a10: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
5a20: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
5a30: 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
5a40: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
5a50: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5a60: 20 2f 2a 20 42 65 63 61 75 73 65 20 61 6c 6c 20   /* Because all 
5a70: 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20 69  the characters i
5a80: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61 72 65  n the string are
5a90: 20 69 6e 20 74 68 65 20 75 6e 69 63 6f 64 65 0a   in the unicode.
5aa0: 20 20 2a 2a 20 72 61 6e 67 65 20 30 78 30 30 2d    ** range 0x00-
5ab0: 30 78 46 46 2c 20 69 66 20 77 65 20 70 61 64 20  0xFF, if we pad 
5ac0: 74 68 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 73  the big-endian s
5ad0: 74 72 69 6e 67 20 77 69 74 68 20 61 20 0a 20 20  tring with a .  
5ae0: 2a 2a 20 7a 65 72 6f 20 62 79 74 65 2c 20 77 65  ** zero byte, we
5af0: 20 63 61 6e 20 6f 62 74 61 69 6e 20 74 68 65 20   can obtain the 
5b00: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 74  little-endian st
5b10: 72 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 26  ring with.  ** &
5b20: 62 69 67 5f 65 6e 64 69 61 6e 5b 31 5d 2e 0a 20  big_endian[1].. 
5b30: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
5b40: 73 74 20 63 68 61 72 20 6f 75 74 4f 66 4d 65 6d  st char outOfMem
5b50: 42 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  Be[] = {.    0, 
5b60: 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20  'o', 0, 'u', 0, 
5b70: 27 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  't', 0, ' ', .  
5b80: 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27    0, 'o', 0, 'f'
5b90: 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30  , 0, ' ', .    0
5ba0: 2c 20 27 6d 27 2c 20 30 2c 20 27 65 27 2c 20 30  , 'm', 0, 'e', 0
5bb0: 2c 20 27 6d 27 2c 20 30 2c 20 27 6f 27 2c 20 30  , 'm', 0, 'o', 0
5bc0: 2c 20 27 72 27 2c 20 30 2c 20 27 79 27 2c 20 30  , 'r', 0, 'y', 0
5bd0: 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  , 0, 0.  };.  st
5be0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5bf0: 6d 69 73 75 73 65 42 65 20 5b 5d 20 3d 20 7b 0a  misuseBe [] = {.
5c00: 20 20 20 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27      0, 'l', 0, '
5c10: 69 27 2c 20 30 2c 20 27 62 27 2c 20 30 2c 20 27  i', 0, 'b', 0, '
5c20: 72 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c 20 27  r', 0, 'a', 0, '
5c30: 72 27 2c 20 30 2c 20 27 79 27 2c 20 30 2c 20 27  r', 0, 'y', 0, '
5c40: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 72 27 2c   ', .    0, 'r',
5c50: 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c   0, 'o', 0, 'u',
5c60: 20 30 2c 20 27 74 27 2c 20 30 2c 20 27 69 27 2c   0, 't', 0, 'i',
5c70: 20 30 2c 20 27 6e 27 2c 20 30 2c 20 27 65 27 2c   0, 'n', 0, 'e',
5c80: 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c   0, ' ', .    0,
5c90: 20 27 63 27 2c 20 30 2c 20 27 61 27 2c 20 30 2c   'c', 0, 'a', 0,
5ca0: 20 27 6c 27 2c 20 30 2c 20 27 6c 27 2c 20 30 2c   'l', 0, 'l', 0,
5cb0: 20 27 65 27 2c 20 30 2c 20 27 64 27 2c 20 30 2c   'e', 0, 'd', 0,
5cc0: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f   ' ', .    0, 'o
5cd0: 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 74  ', 0, 'u', 0, 't
5ce0: 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20  ', 0, ' ', .    
5cf0: 30 2c 20 27 6f 27 2c 20 30 2c 20 27 66 27 2c 20  0, 'o', 0, 'f', 
5d00: 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20  0, ' ', .    0, 
5d10: 27 73 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20  's', 0, 'e', 0, 
5d20: 27 71 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20  'q', 0, 'u', 0, 
5d30: 27 65 27 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20  'e', 0, 'n', 0, 
5d40: 27 63 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20  'c', 0, 'e', 0, 
5d50: 30 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  0, 0.  };..  con
5d60: 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 61 73  st void *z;.  as
5d70: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4d 61  sert( !sqlite3Ma
5d80: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a  llocFailed() );.
5d90: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
5da0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
5db0: 28 26 6f 75 74 4f 66 4d 65 6d 42 65 5b 53 51 4c  (&outOfMemBe[SQL
5dc0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d  ITE_UTF16NATIVE=
5dd0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f  =SQLITE_UTF16LE?
5de0: 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1:0]);.  }.  if(
5df0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
5e00: 65 63 6b 28 64 62 29 20 7c 7c 20 64 62 2d 3e 65  eck(db) || db->e
5e10: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4d  rrCode==SQLITE_M
5e20: 49 53 55 53 45 20 29 7b 0a 20 20 20 20 72 65 74  ISUSE ){.    ret
5e30: 75 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 6d 69  urn (void *)(&mi
5e40: 73 75 73 65 42 65 5b 53 51 4c 49 54 45 5f 55 54  suseBe[SQLITE_UT
5e50: 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54  F16NATIVE==SQLIT
5e60: 45 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b  E_UTF16LE?1:0]);
5e70: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
5e80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
5e90: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 69 66 28  db->pErr);.  if(
5ea0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   z==0 ){.    sql
5eb0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
5ec0: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71  db->pErr, -1, sq
5ed0: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
5ee0: 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20  errCode),.      
5ef0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
5f00: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
5f10: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
5f20: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
5f30: 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71  >pErr);.  }.  sq
5f40: 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
5f50: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  0);.  return z;.
5f60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5f70: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
5f80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5f90: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
5fa0: 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
5fb0: 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
5fc0: 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
5fd0: 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
5fe0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
5ff0: 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
6000: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
6010: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
6020: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
6030: 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
6040: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21  e3 *db){.  if( !
6050: 64 62 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  db || sqlite3Mal
6060: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
6070: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6080: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
6090: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
60a0: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
60b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
60c0: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SUSE;.  }.  retu
60d0: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26  rn db->errCode &
60e0: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
60f0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
6100: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
6110: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
6120: 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
6130: 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
6140: 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
6150: 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
6160: 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
6170: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
6180: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
6190: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
61a0: 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
61b0: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
61c0: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
61d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
61e0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
61f0: 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
6200: 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
6210: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
6220: 20 65 6e 63 32 3b 0a 20 20 0a 20 20 69 66 28 20   enc2;.  .  if( 
6230: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6240: 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  ck(db) ){.    re
6250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
6260: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  SE;.  }..  /* If
6270: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
6280: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
6290: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
62a0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
62b0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
62c0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
62d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
62e0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
62f0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
6300: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
6310: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
6320: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
6330: 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 20  */.  enc2 = enc 
6340: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
6350: 41 4c 49 47 4e 45 44 3b 0a 20 20 69 66 28 20 65  ALIGNED;.  if( e
6360: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
6370: 36 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  6 ){.    enc2 = 
6380: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
6390: 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28  VE;.  }..  if( (
63a0: 65 6e 63 32 26 7e 33 29 21 3d 30 20 29 7b 0a 20  enc2&~3)!=0 ){. 
63b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
63c0: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
63d0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64  , "unknown encod
63e0: 69 6e 67 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ing");.    retur
63f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6400: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
6410: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
6420: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
6430: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
6440: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
6450: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
6460: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
6470: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
6480: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
6490: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
64a0: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
64b0: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
64c0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
64d0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
64e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
64f0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
6500: 32 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  2, zName, strlen
6510: 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69  (zName), 0);.  i
6520: 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
6530: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
6540: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
6550: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
6560: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
6570: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
6580: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
6590: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
65a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
65b0: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
65c0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
65d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
65e0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
65f0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
6600: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
6610: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
6620: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6630: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
6640: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
6650: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
6660: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
6670: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
6680: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
6690: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
66a0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
66b0: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
66c0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
66d0: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
66e0: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
66f0: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
6700: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
6710: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
6720: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
6730: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
6740: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
6750: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
6760: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
6770: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
6780: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6790: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
67a0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
67b0: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 73  ollSeq, zName, s
67c0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
67d0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
67e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
67f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6800: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
6810: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
6820: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
6830: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
6840: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
6850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
6860: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
6870: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6880: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
6890: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
68a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
68b0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
68c0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
68d0: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
68e0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c  , strlen(zName),
68f0: 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
6900: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78   ){.    pColl->x
6910: 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a  Cmp = xCompare;.
6920: 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72      pColl->pUser
6930: 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f   = pCtx;.    pCo
6940: 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
6950: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  .    pColl->enc 
6960: 3d 20 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  = enc2 | (enc & 
6970: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
6980: 47 4e 45 44 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  GNED);.  }.  sql
6990: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
69a0: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72  LITE_OK, 0);.  r
69b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
69d0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
69e0: 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
69f0: 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
6a00: 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
6a10: 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
6a20: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
6a30: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
6a40: 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
6a50: 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
6a60: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
6a70: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
6a80: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
6a90: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
6aa0: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
6ab0: 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
6ac0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
6ad0: 2a 70 70 44 62 20 20 20 20 20 20 20 20 20 2f 2a  *ppDb         /*
6ae0: 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
6af0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
6b00: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
6b10: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
6b20: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6b30: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
6b40: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
6b50: 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
6b60: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
6b70: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
6b80: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 4d 61  .  db = sqliteMa
6b90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 71 6c  lloc( sizeof(sql
6ba0: 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64  ite3) );.  if( d
6bb0: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e  b==0 ) goto open
6bc0: 64 62 5f 6f 75 74 3b 0a 20 20 64 62 2d 3e 65 72  db_out;.  db->er
6bd0: 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
6be0: 64 62 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69  db->priorNewRowi
6bf0: 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 61 67  d = 0;.  db->mag
6c00: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
6c10: 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 6e 44  C_BUSY;.  db->nD
6c20: 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 61 44 62  b = 2;.  db->aDb
6c30: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
6c40: 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
6c50: 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 66 6c  it = 1;.  db->fl
6c60: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
6c70: 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20  ortColNames.#if 
6c80: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
6c90: 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
6cb0: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
6cc0: 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
6cd0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6ce0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
6d10: 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 20  tension.#endif. 
6d20: 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
6d30: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 46  HashInit(&db->aF
6d40: 75 6e 63 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  unc, SQLITE_HASH
6d50: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73  _STRING, 0);.  s
6d60: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
6d70: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51  db->aCollSeq, SQ
6d80: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
6d90: 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
6da0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6db0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
6dc0: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
6dd0: 6f 64 75 6c 65 2c 20 53 51 4c 49 54 45 5f 48 41  odule, SQLITE_HA
6de0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23  SH_STRING, 0);.#
6df0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
6e00: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
6e10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
6e20: 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
6e30: 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
6e40: 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
6e50: 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
6e60: 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
6e70: 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
6e80: 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
6e90: 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
6ea0: 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
6eb0: 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
6ec0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
6ed0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72  e..  */.  if( cr
6ee0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
6ef0: 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
6f00: 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
6f10: 6f 6c 6c 46 75 6e 63 2c 20 30 29 20 7c 7c 0a 20  ollFunc, 0) ||. 
6f20: 20 20 20 20 20 63 72 65 61 74 65 43 6f 6c 6c 61       createColla
6f30: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
6f40: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
6f50: 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
6f60: 63 2c 20 30 29 20 7c 7c 0a 20 20 20 20 20 20 63  c, 0) ||.      c
6f70: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
6f80: 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
6f90: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
6fa0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 20  binCollFunc, 0) 
6fb0: 7c 7c 0a 20 20 20 20 20 20 28 64 62 2d 3e 70 44  ||.      (db->pD
6fc0: 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
6fd0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
6fe0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
6ff0: 49 4e 41 52 59 22 2c 20 36 2c 20 30 29 29 3d 3d  INARY", 6, 0))==
7000: 30 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  0 .  ){.    asse
7010: 72 74 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  rt( sqlite3Mallo
7020: 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 20  cFailed() );.   
7030: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
7040: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
7050: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
7060: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
7070: 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d   Also add a UTF-
7080: 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  8 case-insensiti
7090: 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ve collation seq
70a0: 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61  uence. */.  crea
70b0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
70c0: 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
70d0: 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
70e0: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
70f0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 66 6c 61  );..  /* Set fla
7100: 67 73 20 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d  gs on the built-
7110: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
7120: 75 65 6e 63 65 73 20 2a 2f 0a 20 20 64 62 2d 3e  uences */.  db->
7130: 70 44 66 6c 74 43 6f 6c 6c 2d 3e 74 79 70 65 20  pDfltColl->type 
7140: 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  = SQLITE_COLL_BI
7150: 4e 41 52 59 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20  NARY;.  pColl = 
7160: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
7170: 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
7180: 46 38 2c 20 22 4e 4f 43 41 53 45 22 2c 20 36 2c  F8, "NOCASE", 6,
7190: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
71a0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74   ){.    pColl->t
71b0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c  ype = SQLITE_COL
71c0: 4c 5f 4e 4f 43 41 53 45 3b 0a 20 20 7d 0a 0a 20  L_NOCASE;.  }.. 
71d0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
71e0: 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
71f0: 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
7200: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
7210: 72 79 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  ry(db, zFilename
7220: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  , 0, SQLITE_DEFA
7230: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 0a  ULT_CACHE_SIZE,.
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e             &db->
7260: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69  aDb[0].pBt);.  i
7270: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7280: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7290: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
72a0: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
72b0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
72c0: 4f 53 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  OSED;.    goto o
72d0: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
72e0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
72f0: 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
7300: 65 6d 61 47 65 74 28 64 62 2d 3e 61 44 62 5b 30  emaGet(db->aDb[0
7310: 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
7320: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
7330: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
7340: 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64  0);...  /* The d
7350: 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
7360: 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
7370: 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75   database is 'fu
7380: 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ll'; for the tem
7390: 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
73a0: 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68  it is 'NONE'. Th
73b0: 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
73c0: 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
73d0: 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
73e0: 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[0].zName =
73f0: 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
7400: 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
7410: 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65 66 20  el = 3;.#ifndef 
7420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
7430: 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  DB.  db->aDb[1].
7440: 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
7450: 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
7460: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 23  ety_level = 1;.#
7470: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67  endif..  db->mag
7480: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7490: 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 73 71  C_OPEN;.  if( sq
74a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
74b0: 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
74c0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
74d0: 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
74e0: 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
74f0: 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
7500: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
7510: 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
7520: 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
7530: 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
7540: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
7550: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
7560: 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
7570: 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
7580: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
7590: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
75a0: 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
75b0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
75c0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  ;..  /* Load aut
75d0: 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
75e0: 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
75f0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
7600: 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
7610: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
7620: 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
7630: 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
7640: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 41    (void)sqlite3A
7650: 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
7660: 73 28 64 62 29 3b 0a 20 20 69 66 28 20 73 71 6c  s(db);.  if( sql
7670: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
7680: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7690: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
76a0: 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  ut;.  }..#ifdef 
76b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
76c0: 53 31 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  S1.  if( !sqlite
76d0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
76e0: 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
76f0: 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
7700: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
7710: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7720: 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
7730: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
7740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
7750: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d  .  if( !sqlite3M
7760: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 26 26  allocFailed() &&
7770: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7780: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
7790: 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
77a0: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
77b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
77c0: 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
77d0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
77e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
77f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c   if( !sqlite3Mal
7800: 6c 6f 63 46 61 69 6c 65 64 28 29 20 26 26 20 72  locFailed() && r
7810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7820: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
7830: 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 73 71  qlite3IcuInit(sq
7840: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
7850: 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
7860: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
7870: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
7880: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f  db, rc, 0);..  /
7890: 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
78a0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
78b0: 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
78c0: 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
78d0: 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
78e0: 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
78f0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
7900: 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
7910: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
7920: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
7930: 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
7940: 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
7950: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
7960: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
7970: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
7980: 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
7990: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
79a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
79b0: 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
79c0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
79d0: 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
79e0: 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
79f0: 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
7a20: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
7a30: 0a 23 65 6e 64 69 66 0a 0a 6f 70 65 6e 64 62 5f  .#endif..opendb_
7a40: 6f 75 74 3a 0a 20 20 69 66 28 20 53 51 4c 49 54  out:.  if( SQLIT
7a50: 45 5f 4e 4f 4d 45 4d 3d 3d 28 72 63 20 3d 20 73  E_NOMEM==(rc = s
7a60: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
7a70: 62 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  b)) ){.    sqlit
7a80: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
7a90: 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    db = 0;.  }.  
7aa0: 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65  *ppDb = db;.  re
7ab0: 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
7ac0: 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  xit(0, rc);.}../
7ad0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
7ae0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
7af0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7b00: 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
7b10: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
7b20: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
7b30: 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
7b40: 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
7b50: 6e 61 6d 65 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a  name, ppDb);.}..
7b60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7b70: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
7b80: 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
7b90: 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
7ba0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
7bb0: 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
7bc0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
7bd0: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
7be0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7bf0: 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
7c00: 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
7c10: 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
7c20: 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
7c30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7c40: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
7c50: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20  value *pVal;..  
7c60: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
7c70: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
7c80: 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
7c90: 20 30 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c   0;.  pVal = sql
7ca0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
7cb0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
7cc0: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
7cd0: 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
7ce0: 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
7cf0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7d00: 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
7d10: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
7d20: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
7d30: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
7d40: 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
7d50: 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
7d60: 65 6e 61 6d 65 38 2c 20 70 70 44 62 29 3b 0a 20  ename8, ppDb);. 
7d70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7d80: 45 5f 4f 4b 20 26 26 20 2a 70 70 44 62 20 29 7b  E_OK && *ppDb ){
7d90: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7da0: 74 65 33 5f 65 78 65 63 28 2a 70 70 44 62 2c 20  te3_exec(*ppDb, 
7db0: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
7dc0: 20 3d 20 27 55 54 46 2d 31 36 27 22 2c 20 30 2c   = 'UTF-16'", 0,
7dd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
7de0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7e00: 65 33 5f 63 6c 6f 73 65 28 2a 70 70 44 62 29 3b  e3_close(*ppDb);
7e10: 0a 20 20 20 20 20 20 20 20 2a 70 70 44 62 20 3d  .        *ppDb =
7e20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7e30: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
7e40: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
7e50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
7e60: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
7e70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
7e90: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
7ea0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 64  lowing routine d
7eb0: 65 73 74 72 6f 79 73 20 61 20 76 69 72 74 75 61  estroys a virtua
7ec0: 6c 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 69  l machine that i
7ed0: 73 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  s created by.** 
7ee0: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  the sqlite3_comp
7ef0: 69 6c 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 54  ile() routine. T
7f00: 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
7f10: 6e 65 64 20 69 73 20 61 6e 20 53 51 4c 49 54 45  ned is an SQLITE
7f20: 5f 0a 2a 2a 20 73 75 63 63 65 73 73 2f 66 61 69  _.** success/fai
7f30: 6c 75 72 65 20 63 6f 64 65 20 74 68 61 74 20 64  lure code that d
7f40: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 73  escribes the res
7f50: 75 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67  ult of executing
7f60: 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
7f70: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
7f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
7f90: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
7fa0: 61 6e 64 20 73 74 72 69 6e 67 20 72 65 74 75 72  and string retur
7fb0: 6e 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ned by.** sqlite
7fc0: 33 5f 65 72 72 63 6f 64 65 28 29 2c 20 73 71 6c  3_errcode(), sql
7fd0: 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20 61 6e  ite3_errmsg() an
7fe0: 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
7ff0: 31 36 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  16()..*/.int sql
8000: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 71  ite3_finalize(sq
8010: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8020: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
8030: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
8040: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8050: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
8060: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
8070: 65 46 69 6e 61 6c 69 7a 65 28 28 56 64 62 65 2a  eFinalize((Vdbe*
8080: 29 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  )pStmt);.  }.  r
8090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
80a0: 2a 2a 20 54 65 72 6d 69 6e 61 74 65 20 74 68 65  ** Terminate the
80b0: 20 63 75 72 72 65 6e 74 20 65 78 65 63 75 74 69   current executi
80c0: 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61  on of an SQL sta
80d0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 73 65 74  tement and reset
80e0: 20 69 74 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 69   it.** back to i
80f0: 74 73 20 73 74 61 72 74 69 6e 67 20 73 74 61 74  ts starting stat
8100: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  e so that it can
8110: 20 62 65 20 72 65 75 73 65 64 2e 20 41 20 73 75   be reused. A su
8120: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 0a  ccess code from.
8130: 2a 2a 20 74 68 65 20 70 72 69 6f 72 20 65 78 65  ** the prior exe
8140: 63 75 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  cution is return
8150: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
8160: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
8170: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
8180: 74 72 69 6e 67 20 72 65 74 75 72 6e 65 64 20 62  tring returned b
8190: 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  y.** sqlite3_err
81a0: 63 6f 64 65 28 29 2c 20 73 71 6c 69 74 65 33 5f  code(), sqlite3_
81b0: 65 72 72 6d 73 67 28 29 20 61 6e 64 20 73 71 6c  errmsg() and sql
81c0: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 29 2e  ite3_errmsg16().
81d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
81e0: 72 65 73 65 74 28 73 71 6c 69 74 65 33 5f 73 74  reset(sqlite3_st
81f0: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e  mt *pStmt){.  in
8200: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 53 74 6d  t rc;.  if( pStm
8210: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
8220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8230: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
8240: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 28  lite3VdbeReset((
8250: 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20  Vdbe*)pStmt);.  
8260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
8270: 65 52 65 61 64 79 28 28 56 64 62 65 2a 29 70 53  eReady((Vdbe*)pS
8280: 74 6d 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  tmt, -1, 0, 0, 0
8290: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
82a0: 72 63 20 26 20 28 73 71 6c 69 74 65 33 5f 64 62  rc & (sqlite3_db
82b0: 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2d 3e  _handle(pStmt)->
82c0: 65 72 72 4d 61 73 6b 29 29 3d 3d 72 63 20 29 3b  errMask))==rc );
82d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
82e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
82f0: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
8300: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
8310: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
8320: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
8330: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8340: 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  collation(.  sql
8350: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
8360: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
8370: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
8380: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
8390: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
83a0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
83b0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
83c0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
83d0: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
83e0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
83f0: 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
8400: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
8410: 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c  Name, enc, pCtx,
8420: 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
8430: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
8440: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
8450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
8460: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
8470: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
8480: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
8490: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
84a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
84b0: 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
84c0: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
84d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
84e0: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
84f0: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
8500: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
8510: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8520: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8530: 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
8540: 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
8550: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
8560: 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46   !sqlite3MallocF
8570: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 72 63 20  ailed() );.  rc 
8580: 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
8590: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  n(db, zName, enc
85a0: 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
85b0: 2c 20 78 44 65 6c 29 3b 0a 20 20 72 65 74 75 72  , xDel);.  retur
85c0: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
85d0: 28 64 62 2c 20 72 63 29 3b 0a 7d 0a 0a 23 69 66  (db, rc);.}..#if
85e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85f0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
8600: 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
8610: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
8620: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
8630: 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
8640: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
8650: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
8660: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
8670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8680: 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
8690: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
86a0: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
86b0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
86c0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
86d0: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
86e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
86f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 20    char *zName8; 
8700: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
8710: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
8720: 29 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  ) );.  zName8 = 
8730: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
8740: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 69 66  zName, -1);.  if
8750: 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
8760: 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
8770: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
8780: 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d   enc, pCtx, xCom
8790: 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
87a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 38 29  liteFree(zName8)
87b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
87c0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
87d0: 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
87e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
87f0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
8800: 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
8810: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
8820: 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
8830: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
8840: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
8850: 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
8860: 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
8870: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8880: 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
8890: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
88a0: 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
88b0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
88c0: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
88d0: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
88e0: 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
88f0: 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
8900: 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
8910: 2a 29 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  *).){.  if( sqli
8920: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28 64  te3SafetyCheck(d
8930: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
8940: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
8950: 20 20 7d 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e    }.  db->xCollN
8960: 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
8970: 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
8980: 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
8990: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
89a0: 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
89b0: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
89c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
89d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
89e0: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
89f0: 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
8a00: 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
8a10: 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
8a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
8a30: 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
8a40: 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
8a50: 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
8a60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
8a70: 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
8a80: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
8a90: 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
8aa0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
8ab0: 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
8ac0: 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
8ad0: 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
8ae0: 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
8af0: 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
8b00: 64 2a 29 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c  d*).){.  if( sql
8b10: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 28  ite3SafetyCheck(
8b20: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
8b30: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
8b40: 0a 20 20 7d 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  .  }.  db->xColl
8b50: 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
8b60: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
8b70: 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
8b80: 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
8b90: 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
8ba0: 64 65 64 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  dedArg;.  return
8bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
8bc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8bd0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
8be0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8bf0: 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a  T_GLOBALRECOVER.
8c00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
8c10: 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
8c20: 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
8c30: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
8c40: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
8c50: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
8c60: 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
8c70: 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
8c80: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
8c90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
8ca0: 61 6c 5f 72 65 63 6f 76 65 72 28 29 7b 0a 20 20  al_recover(){.  
8cb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8cc0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8cd0: 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
8ce0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8cf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8d00: 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
8d10: 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
8d20: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
8d30: 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
8d40: 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
8d50: 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
8d60: 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
8d70: 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
8d80: 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
8d90: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
8da0: 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
8db0: 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
8dc0: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
8dd0: 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e  ***** THIS IS AN
8de0: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50   EXPERIMENTAL AP
8df0: 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54  I AND IS SUBJECT
8e00: 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a   TO CHANGE *****
8e10: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
8e20: 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
8e30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
8e40: 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
8e50: 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  ommit;.}..#ifdef
8e60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
8e70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8e80: 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75 62  g routine is sub
8e90: 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e 73  tituted for cons
8ea0: 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52 52  tant SQLITE_CORR
8eb0: 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67 67  UPT in.** debugg
8ec0: 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68 69  ing builds.  Thi
8ed0: 73 20 70 72 6f 76 69 64 65 73 20 61 20 77 61 79  s provides a way
8ee0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
8ef0: 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a 2a  oint for when.**
8f00: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 66   corruption is f
8f10: 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a  irst detected..*
8f20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  /.int sqlite3Cor
8f30: 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72 65  rupt(void){.  re
8f40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8f50: 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  UPT;.}.#endif...
8f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8f70: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8f80: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
8f90: 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61   disable the sha
8fa0: 72 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63  red pager and sc
8fb0: 68 65 6d 61 20 66 65 61 74 75 72 65 73 20 66 6f  hema features fo
8fc0: 72 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  r the.** current
8fd0: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54   thread..**.** T
8fe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
8ff0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
9000: 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
9010: 20 6e 6f 20 6f 70 65 6e 0a 2a 2a 20 64 61 74 61   no open.** data
9020: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9040: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
9050: 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29  ache(int enable)
9060: 7b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  {.  ThreadData *
9070: 70 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  pTd = sqlite3Thr
9080: 65 61 64 44 61 74 61 28 29 3b 0a 20 20 69 66 28  eadData();.  if(
9090: 20 70 54 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49   pTd ){.    /* I
90a0: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 20  t is only legal 
90b0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
90c0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
90d0: 63 68 65 28 29 20 77 68 65 6e 20 74 68 65 72 65  che() when there
90e0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 63  .    ** are no c
90f0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 62 2d  urrently open b-
9100: 74 72 65 65 73 20 74 68 61 74 20 77 65 72 65 20  trees that were 
9110: 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 61  opened by the ca
9120: 6c 6c 69 6e 67 20 74 68 72 65 61 64 2e 0a 20 20  lling thread..  
9130: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6e 64 69 74    ** This condit
9140: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 61 73 79  ion is only easy
9150: 20 74 6f 20 64 65 74 65 63 74 20 69 66 20 74 68   to detect if th
9160: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  e shared-cache w
9170: 65 72 65 20 0a 20 20 20 20 2a 2a 20 70 72 65 76  ere .    ** prev
9180: 69 6f 75 73 6c 79 20 65 6e 61 62 6c 65 64 20 28  iously enabled (
9190: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 64 69 73  and is being dis
91a0: 61 62 6c 65 64 29 2e 20 0a 20 20 20 20 2a 2f 0a  abled). .    */.
91b0: 20 20 20 20 69 66 28 20 70 54 64 2d 3e 70 42 74      if( pTd->pBt
91c0: 72 65 65 20 26 26 20 21 65 6e 61 62 6c 65 20 29  ree && !enable )
91d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
91e0: 70 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61  pTd->useSharedDa
91f0: 74 61 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ta );.      retu
9200: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
9210: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 54 64  ;.    }..    pTd
9220: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
9230: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 20 20 73 71  = enable;.    sq
9240: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 68 72 65  lite3ReleaseThre
9250: 61 64 44 61 74 61 28 29 3b 0a 20 20 7d 0a 20 20  adData();.  }.  
9260: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
9270: 69 45 78 69 74 28 30 2c 20 53 51 4c 49 54 45 5f  iExit(0, SQLITE_
9280: 4f 4b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  OK);.}.#endif../
9290: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
92a0: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
92b0: 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
92c0: 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
92d0: 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
92e0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
92f0: 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
9300: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  llocated..*/.voi
9310: 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
9320: 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
9330: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
9340: 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 68 72  d = sqlite3OsThr
9350: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 28  eadSpecificData(
9360: 30 29 3b 0a 20 20 69 66 28 20 70 54 64 20 29 7b  0);.  if( pTd ){
9370: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 54 64 2c  .    memset(pTd,
9380: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 54 64 29   0, sizeof(*pTd)
9390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
93a0: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
93b0: 74 61 28 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ta(-1);.  }.}../
93c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
93d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
93e0: 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
93f0: 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
9400: 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
9410: 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
9420: 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
9430: 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
9440: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9450: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
9460: 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c  METADATA.int sql
9470: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
9480: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71  n_metadata(.  sq
9490: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
94a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
94b0: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a  nection handle *
94c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
94d0: 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  zDbName,        
94e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
94f0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   or NULL */.  co
9500: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
9510: 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62  Name,     /* Tab
9520: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  le name */.  con
9530: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
9540: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  Name,    /* Colu
9550: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61  mn name */.  cha
9560: 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61  r const **pzData
9570: 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50  Type,    /* OUTP
9580: 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74  UT: Declared dat
9590: 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  a type */.  char
95a0: 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53   const **pzCollS
95b0: 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55  eq,     /* OUTPU
95c0: 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  T: Collation seq
95d0: 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  uence name */.  
95e0: 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20  int *pNotNull,  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9600: 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e  UTPUT: True if N
9610: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
9620: 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  nt exists */.  i
9630: 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c  nt *pPrimaryKey,
9640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9650: 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
9660: 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20  lumn part of PK 
9670: 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69  */.  int *pAutoi
9680: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
9690: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
96a0: 20 69 66 20 63 6f 6c 75 6d 73 20 69 73 20 61 75   if colums is au
96b0: 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a  to-increment */.
96c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
96d0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
96e0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
96f0: 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
9700: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
9710: 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  Col;..  char con
9720: 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
9730: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
9740: 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
9750: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
9760: 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
9770: 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
9780: 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  toinc = 0;..  /*
9790: 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
97a0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
97b0: 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
97c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
97d0: 74 79 4f 6e 28 64 62 29 20 29 7b 0a 20 20 20 20  tyOn(db) ){.    
97e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
97f0: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  SUSE;.  }.  rc =
9800: 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
9810: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
9820: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
9830: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
9840: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
9850: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
9860: 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
9870: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
9880: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
9890: 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
98a0: 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
98b0: 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
98c0: 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
98d0: 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
98e0: 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
98f0: 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
9900: 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
9910: 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
9920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
9930: 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
9940: 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
9950: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
9960: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
9970: 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
9980: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
9990: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
99a0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
99b0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
99c0: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
99d0: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
99e0: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
99f0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
9a00: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
9a10: 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
9a20: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
9a30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a40: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
9a50: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
9a60: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
9a70: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
9a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9a90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
9aa0: 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
9ab0: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
9ac0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
9ad0: 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
9ae0: 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
9af0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
9b00: 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
9b10: 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
9b20: 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
9b30: 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
9b40: 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
9b50: 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
9b60: 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
9b70: 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
9b80: 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
9b90: 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
9ba0: 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
9bb0: 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
9bc0: 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
9bd0: 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
9be0: 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
9bf0: 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
9c00: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
9c10: 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
9c20: 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
9c30: 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
9c40: 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
9c50: 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
9c60: 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
9c70: 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
9c80: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
9c90: 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
9ca0: 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
9cb0: 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
9cc0: 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
9cd0: 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 28 70 43     notnull = (pC
9ce0: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 3f 31 3a 30 29  ol->notNull?1:0)
9cf0: 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
9d00: 20 20 3d 20 28 70 43 6f 6c 2d 3e 69 73 50 72 69    = (pCol->isPri
9d10: 6d 4b 65 79 3f 31 3a 30 29 3b 0a 20 20 20 20 61  mKey?1:0);.    a
9d20: 75 74 6f 69 6e 63 20 3d 20 28 28 70 54 61 62 2d  utoinc = ((pTab-
9d30: 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
9d40: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 29 3f 31  pTab->autoInc)?1
9d50: 3a 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  :0);.  }else{.  
9d60: 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
9d70: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
9d80: 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
9d90: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
9da0: 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
9db0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
9dc0: 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 69  ..error_out:.  i
9dd0: 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
9de0: 4f 66 66 28 64 62 29 20 29 7b 0a 20 20 20 20 72  Off(db) ){.    r
9df0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
9e00: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  E;.  }..  /* Whe
9e10: 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
9e20: 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
9e30: 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
9e40: 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
9e50: 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
9e60: 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
9e70: 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
9e80: 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
9e90: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
9ea0: 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
9eb0: 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
9ec0: 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
9ed0: 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
9ee0: 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
9ef0: 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
9f00: 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
9f10: 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
9f20: 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
9f30: 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
9f40: 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
9f50: 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
9f60: 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
9f70: 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
9f80: 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
9f90: 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
9fa0: 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
9fb0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9fc0: 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
9fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
9fe0: 74 72 69 6e 67 28 26 7a 45 72 72 4d 73 67 2c 20  tring(&zErrMsg, 
9ff0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
a000: 6f 6c 75 6d 6e 3a 20 22 2c 20 7a 54 61 62 6c 65  olumn: ", zTable
a010: 4e 61 6d 65 2c 20 22 2e 22 2c 20 0a 20 20 20 20  Name, ".", .    
a020: 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c      zColumnName,
a030: 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51   0);.    rc = SQ
a040: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
a050: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
a060: 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
a070: 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
a080: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a090: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75  zErrMsg);.  retu
a0a0: 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
a0b0: 74 28 64 62 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  t(db, rc);.}.#en
a0c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  dif../*.** Set a
a0d0: 6c 6c 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  ll the parameter
a0e0: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  s in the compile
a0f0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  d SQL statement 
a100: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20  to NULL..*/.int 
a110: 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
a120: 6e 64 69 6e 67 73 28 73 71 6c 69 74 65 33 5f 73  ndings(sqlite3_s
a130: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69  tmt *pStmt){.  i
a140: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
a150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f   SQLITE_OK;.  fo
a160: 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
a170: 45 5f 4f 4b 20 26 26 20 69 3c 3d 73 71 6c 69 74  E_OK && i<=sqlit
a180: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
a190: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 20  r_count(pStmt); 
a1a0: 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
a1b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
a1c0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 7d 0a  (pStmt, i);.  }.
a1d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a1e0: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
a1f0: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
a200: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
a210: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
a220: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a230: 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
a240: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a250: 4f 73 53 6c 65 65 70 28 6d 73 29 3b 0a 7d 0a 0a  OsSleep(ms);.}..
a260: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
a270: 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
a280: 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
a290: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
a2a0: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
a2b0: 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
a2c0: 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
a2d0: 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
a2e0: 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
a2f0: 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 72 65  fff : 0xff;.  re
a300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a310: 7d 0a                                            }.