/ Hex Artifact Content
Login

Artifact cf415e0920dc9f66806dd766ad72ba5cda533363:


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 34 34 30 20 32 30 30 38 2f 30 35  ,v 1.440 2008/05
0280: 2f 32 32 20 31 33 3a 35 36 3a 31 37 20 64 61 6e  /22 13:56:17 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 3c 63 74 79 70 65 2e 68 3e 0a 23 69 66 64  e <ctype.h>.#ifd
02d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
02e0: 5f 46 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20  _FTS3.# include 
02f0: 22 66 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a  "fts3.h".#endif.
0300: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69  ./*.** The versi
0310: 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72  on of the librar
0320: 79 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  y.*/.const char 
0330: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
0340: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
0350: 4f 4e 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ON;.const char *
0360: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
0370: 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  on(void){ return
0380: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0390: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
03a0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
03b0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
03c0: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
03d0: 55 4d 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c  UMBER; }.int sql
03e0: 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28  ite3_threadsafe(
03f0: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0400: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b  LITE_THREADSAFE;
0410: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
0420: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0430: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
0440: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
0450: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74  RACE)./*.** If t
0460: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
0470: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73  ction pointer is
0480: 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66   not NULL and if
0490: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  .** SQLITE_ENABL
04a0: 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61  E_IOTRACE is ena
04b0: 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61  bled, then messa
04c0: 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a  ges describing.*
04d0: 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65  * I/O active are
04e0: 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74   written using t
04f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  his function.  T
0500: 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a  hese messages.**
0510: 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f   are intended fo
0520: 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74 69  r debugging acti
0530: 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  vity only..*/.vo
0540: 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72  id (*sqlite3IoTr
0550: 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
0560: 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64  , ...) = 0;.#end
0570: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
0580: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
0590: 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  l variable point
05a0: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68  s to a string wh
05b0: 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ich is the.** na
05c0: 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
05d0: 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72  y, then that dir
05e0: 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75  ectory will be u
05f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
0600: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
0610: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0620: 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70  the "PRAGMA temp
0630: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0640: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0650: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0660: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
0670: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69   0;../*.** Routi
0680: 6e 65 20 6e 65 65 64 65 64 20 74 6f 20 73 75 70  ne needed to sup
0690: 70 6f 72 74 20 74 68 65 20 74 65 73 74 63 61 73  port the testcas
06a0: 65 28 29 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69  e() macro..*/.#i
06b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 56 45  fdef SQLITE_COVE
06c0: 52 41 47 45 5f 54 45 53 54 0a 76 6f 69 64 20 73  RAGE_TEST.void s
06d0: 71 6c 69 74 65 33 43 6f 76 65 72 61 67 65 28 69  qlite3Coverage(i
06e0: 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63 20  nt x){.  static 
06f0: 69 6e 74 20 64 75 6d 6d 79 20 3d 20 30 3b 0a 20  int dummy = 0;. 
0700: 20 64 75 6d 6d 79 20 2b 3d 20 78 3b 0a 7d 0a 23   dummy += x;.}.#
0710: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  endif.../*.** Re
0720: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
0730: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
0740: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
0750: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
0760: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
0770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
0780: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
0790: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
07a0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
07b0: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
07c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
07d0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
07e0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
07f0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
0800: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
0810: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
0820: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
0830: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
0840: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
0850: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
0860: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
0870: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
0880: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
0890: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
08a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
08b0: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
08c0: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
08d0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
08e0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
08f0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
0900: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
0910: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
0920: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
0930: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
0940: 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
0950: 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
0960: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
0970: 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20   if( padFlag.   
0980: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
0990: 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c  (char*)pKey1)+n,
09a0: 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26   nKey1-n).     &
09b0: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
09c0: 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b  ar*)pKey2)+n, nK
09d0: 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20  ey2-n).    ){.  
09e0: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20      /* Leave rc 
09f0: 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a  unchanged at 0 *
0a00: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
0a10: 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
0a20: 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  nKey2;.    }.  }
0a30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
0a40: 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62  ./*.** Another b
0a50: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
0a60: 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41  g sequence: NOCA
0a70: 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SE. .**.** This 
0a80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0a90: 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ce is intended t
0aa0: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63  o be used for "c
0ab0: 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a  ase independant.
0ac0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20  ** comparison". 
0ad0: 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64  SQLite's knowled
0ae0: 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20  ge of upper and 
0af0: 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76  lower case equiv
0b00: 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64  alents.** extend
0b10: 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36  s only to the 26
0b20: 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64   characters used
0b30: 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20   in the English 
0b40: 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  language..**.** 
0b50: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68  At the moment th
0b60: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54  ere is only a UT
0b70: 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  F-8 implementati
0b80: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0b90: 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  t nocaseCollatin
0ba0: 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  gFunc(.  void *N
0bb0: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
0bc0: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
0bd0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
0be0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
0bf0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
0c00: 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49  r = sqlite3StrNI
0c10: 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73  Cmp(.      (cons
0c20: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20  t char *)pKey1, 
0c30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
0c40: 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79  ey2, (nKey1<nKey
0c50: 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b  2)?nKey1:nKey2);
0c60: 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20  .  if( 0==r ){. 
0c70: 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65     r = nKey1-nKe
0c80: 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y2;.  }.  return
0c90: 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   r;.}../*.** Ret
0ca0: 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66  urn the ROWID of
0cb0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
0cc0: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74   insert.*/.sqlit
0cd0: 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  e_int64 sqlite3_
0ce0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
0cf0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  d(sqlite3 *db){.
0d00: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
0d10: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
0d20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
0d30: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
0d40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
0d50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
0d60: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
0d70: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
0d80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0d90: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
0da0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
0db0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
0dc0: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
0dd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
0de0: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
0df0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
0e00: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
0e10: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
0e20: 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  urn db->nTotalCh
0e30: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
0e40: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
0e50: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0e60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0e70: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
0e80: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
0e90: 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69  i;.  int j;..  i
0ea0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
0eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0ec0: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
0ed0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
0ee0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
0ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
0f00: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
0f10: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
0f20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 23 69  (db->mutex);..#i
0f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
0f40: 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76    {.    extern v
0f50: 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65 43 6c  oid sqlite3SseCl
0f60: 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a 29 3b  eanup(sqlite3*);
0f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73 65 43  .    sqlite3SseC
0f80: 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20 7d 0a  leanup(db);.  }.
0f90: 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c 69 74  #endif ..  sqlit
0fa0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
0fb0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20  chema(db, 0);.. 
0fc0: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
0fd0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
0fe0: 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e ResetInternalS
0ff0: 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f  chema() call abo
1000: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
1010: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
1020: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
1030: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
1040: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
1050: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
1060: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
1070: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
1080: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
1090: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
10a0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
10b0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
10c0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
10d0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
10e0: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
10f0: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
1100: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
1110: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
1120: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
1130: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
1140: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
1150: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
1160: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ck(db);..  /* If
1170: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
1180: 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20  utstanding VMs, 
1190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11a0: 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  SY. */.  if( db-
11b0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71  >pVdbe ){.    sq
11c0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
11d0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
11e0: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
11f0: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
1200: 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65  inalised stateme
1210: 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  nts");.    sqlit
1220: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1230: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
1240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1250: 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
1260: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
1270: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
1280: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
1290: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
12a0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
12b0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
12c0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
12d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
12e0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
12f0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
1300: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
1310: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
1320: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
1330: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
1340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1350: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1360: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
1370: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
1380: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
1390: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
13a0: 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f  DbStatic );.  fo
13b0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
13c0: 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  rst(&db->aFunc);
13d0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
13e0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75  Next(i)){.    Fu
13f0: 6e 63 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a 70  ncDef *pFunc, *p
1400: 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 46  Next;.    for(pF
1410: 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  unc = (FuncDef*)
1420: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
1430: 29 3b 20 70 46 75 6e 63 3b 20 70 46 75 6e 63 3d  ); pFunc; pFunc=
1440: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1450: 65 78 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65  ext = pFunc->pNe
1460: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
1470: 33 5f 66 72 65 65 28 70 46 75 6e 63 29 3b 0a 20  3_free(pFunc);. 
1480: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 28     }.  }..  for(
1490: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
14a0: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
14b0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
14c0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
14d0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
14e0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
14f0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
1500: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
1510: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
1520: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
1530: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
1540: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
1550: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
1560: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
1570: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
1580: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
1590: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
15a0: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
15b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
15c0: 66 72 65 65 28 70 43 6f 6c 6c 29 3b 0a 20 20 7d  free(pColl);.  }
15d0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
15e0: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
15f0: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
1600: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1610: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
1620: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
1630: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
1640: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1650: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
1660: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
1670: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
1680: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
1690: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
16a0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
16b0: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
16c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16d0: 65 33 5f 66 72 65 65 28 70 4d 6f 64 29 3b 0a 20  e3_free(pMod);. 
16e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
16f0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
1700: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
1710: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1720: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 73  &db->aFunc);.  s
1730: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1740: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
1750: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
1760: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
1770: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28  trings. */.  if(
1780: 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
1790: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
17a0: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  e(db->pErr);.  }
17b0: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
17c0: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a  xtensions(db);..
17d0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
17e0: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
17f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
1800: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
1810: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
1820: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
1830: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
1840: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
1850: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
1860: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
1870: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
1880: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
1890: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
18a0: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
18b0: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
18c0: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
18d0: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
18e0: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
18f0: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
1900: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
1910: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
1920: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
1930: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1940: 65 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ee(db->aDb[1].pS
1950: 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
1960: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1970: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1980: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1990: 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73  AGIC_CLOSED;.  s
19a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
19b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
19c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
19d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
19f0: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
1a00: 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76  base files..*/.v
1a10: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
1a20: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
1a30: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
1a40: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
1a50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
1a70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
1a80: 6c 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42  lite3FaultBeginB
1a90: 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55  enign(SQLITE_FAU
1aa0: 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f  LTINJECTOR_MALLO
1ab0: 43 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  C);.  for(i=0; i
1ac0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1ad0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
1ae0: 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  i].pBt ){.      
1af0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
1b00: 49 73 49 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  IsInTrans(db->aD
1b10: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
1b20: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
1b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b40: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
1b50: 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  back(db->aDb[i].
1b60: 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  pBt);.      db->
1b70: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d  aDb[i].inTrans =
1b80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1b90: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
1ba0: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
1bb0: 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e  e3FaultEndBenign
1bc0: 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a  (SQLITE_FAULTINJ
1bd0: 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 0a  ECTOR_MALLOC);..
1be0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26    if( db->flags&
1bf0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1c00: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
1c10: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
1c20: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
1c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
1c40: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1c50: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
1c60: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
1c70: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
1c80: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
1c90: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
1ca0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
1cb0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
1cc0: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
1cd0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
1ce0: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
1cf0: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
1d00: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
1d10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1d20: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
1d30: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1d40: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
1d50: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
1d60: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
1d70: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1d80: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
1d90: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
1da0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
1db0: 68 28 20 72 63 20 26 20 30 78 66 66 20 29 7b 0a  h( rc & 0xff ){.
1dc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dd0: 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ROW:.    case SQ
1de0: 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 63  LITE_DONE:.    c
1df0: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
1e00: 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20         z = "not 
1e10: 61 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  an error";      
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1e40: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
1e50: 3a 20 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20  :      z = "SQL 
1e60: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
1e70: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
1e80: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
1e90: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
1ea0: 20 20 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65         z = "acce
1eb0: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
1ec0: 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  nied";          
1ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1ee0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
1ef0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c  :      z = "call
1f00: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
1f10: 75 65 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20  uery abort";    
1f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1f30: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
1f40: 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61         z = "data
1f50: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b  base is locked";
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1f80: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
1f90: 44 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61  D:     z = "data
1fa0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
1fb0: 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  cked";          
1fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1fd0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
1fe0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20  :      z = "out 
1ff0: 6f 66 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20  of memory";     
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2020: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
2030: 4e 4c 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65  NLY:   z = "atte
2040: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
2050: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
2060: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
2070: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
2080: 52 55 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65  RUPT:  z = "inte
2090: 72 72 75 70 74 65 64 22 3b 20 20 20 20 20 20 20  rrupted";       
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
20c0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
20d0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b  :      z = "disk
20e0: 20 49 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20   I/O error";    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2110: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
2120: 50 54 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61  PT:    z = "data
2130: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
2140: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20  is malformed";  
2150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2160: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
2170: 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61         z = "data
2180: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
2190: 66 75 6c 6c 22 3b 20 20 20 20 20 20 20 20 20 20  full";          
21a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
21b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
21c0: 50 45 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62  PEN:   z = "unab
21d0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
21e0: 61 73 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20  ase file";      
21f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2200: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
2210: 3a 20 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c  :      z = "tabl
2220: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
2230: 74 61 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ta";            
2240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2250: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
2260: 41 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61  A:     z = "data
2270: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
2280: 63 68 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20  changed";       
2290: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
22a0: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
22b0: 47 3a 20 20 20 20 20 7a 20 3d 20 22 53 74 72 69  G:     z = "Stri
22c0: 6e 67 20 6f 72 20 42 4c 4f 42 20 65 78 63 65 65  ng or BLOB excee
22d0: 64 65 64 20 73 69 7a 65 20 6c 69 6d 69 74 22 3b  ded size limit";
22e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
22f0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
2300: 52 41 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e 73  RAINT: z = "cons
2310: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 3b 20  traint failed"; 
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2340: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
2350: 54 43 48 3a 20 20 20 7a 20 3d 20 22 64 61 74 61  TCH:   z = "data
2360: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 3b 20  type mismatch"; 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2390: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
23a0: 45 3a 20 20 20 20 20 7a 20 3d 20 22 6c 69 62 72  E:     z = "libr
23b0: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
23c0: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
23d0: 63 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63  ce";break;.    c
23e0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
23f0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 6c 61 72 67  :      z = "larg
2400: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
2410: 73 20 64 69 73 61 62 6c 65 64 22 3b 20 20 20 20  s disabled";    
2420: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2430: 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a  ase SQLITE_AUTH:
2440: 20 20 20 20 20 20 20 7a 20 3d 20 22 61 75 74 68         z = "auth
2450: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
2460: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
2470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2480: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
2490: 54 3a 20 20 20 20 20 7a 20 3d 20 22 61 75 78 69  T:     z = "auxi
24a0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
24b0: 6f 72 6d 61 74 20 65 72 72 6f 72 22 3b 20 20 20  ormat error";   
24c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
24d0: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
24e0: 3a 20 20 20 20 20 20 7a 20 3d 20 22 62 69 6e 64  :      z = "bind
24f0: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
2500: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 3b 20   out of range"; 
2510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2520: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
2530: 42 3a 20 20 20 20 20 7a 20 3d 20 22 66 69 6c 65  B:     z = "file
2540: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
2550: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
2560: 73 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 64  se";break;.    d
2570: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
2580: 20 20 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e         z = "unkn
2590: 6f 77 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20  own error";     
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
25c0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
25d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25e0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
25f0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
2600: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
2610: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
2620: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
2630: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
2640: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
2650: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
2660: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2670: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
2680: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
2690: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
26a0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
26b0: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
26c0: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
26f0: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
2700: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
2710: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2720: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
2730: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
2740: 23 69 66 20 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  #if OS_WIN || (d
2750: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
2760: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
2770: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
2780: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
2790: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
27a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
27b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
27c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
27d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
27e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
27f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
2800: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
2810: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
2820: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
2830: 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61 79 73  Y (sizeof(delays
2840: 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 5b  )/sizeof(delays[
2850: 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  0])).  sqlite3 *
2860: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
2870: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
2880: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
2890: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
28a0: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
28b0: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
28c0: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
28d0: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
28e0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
28f0: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
2900: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
2910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
2920: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
2930: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
2940: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
2950: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
2960: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
2970: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
2980: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
2990: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
29a0: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
29b0: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
29c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
29d0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
29e0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
29f0: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
2a00: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
2a10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
2a20: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
2a30: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
2a40: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
2a50: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
2a60: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
2a70: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
2a80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2a90: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
2aa0: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
2ab0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
2ac0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
2ad0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
2ae0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
2af0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b00: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2b10: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
2b20: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
2b30: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
2b40: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
2b50: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
2b60: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
2b70: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
2b80: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
2b90: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
2ba0: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
2bb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
2bc0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
2bd0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
2be0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
2bf0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 46 75  ( p==0 || p->xFu
2c00: 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  nc==0 || p->nBus
2c10: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
2c20: 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28    rc = p->xFunc(
2c30: 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73  p->pArg, p->nBus
2c40: 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  y);.  if( rc==0 
2c50: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
2c60: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
2c70: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
2c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ca0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
2cb0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
2cc0: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
2cd0: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
2ce0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
2cf0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
2d00: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
2d10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
2d20: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
2d30: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
2d40: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
2d50: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
2d60: 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Arg.){.  sqlite3
2d70: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
2d80: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
2d90: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
2da0: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
2db0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
2dc0: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
2dd0: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
2de0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
2df0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
2e00: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
2e10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2e20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e30: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
2e40: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
2e50: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
2e60: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
2e70: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
2e80: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
2e90: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
2ea0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
2eb0: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
2ec0: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
2ed0: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
2ee0: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
2ef0: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
2f00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f10: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
2f20: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
2f30: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
2f40: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
2f50: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
2f60: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66  id *pArg.){.  if
2f70: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
2f80: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
2f90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2fa0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
2fb0: 3b 0a 20 20 20 20 69 66 28 20 6e 4f 70 73 3e 30  ;.    if( nOps>0
2fc0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 50   ){.      db->xP
2fd0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
2fe0: 65 73 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  ess;.      db->n
2ff0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
3000: 70 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 50  ps;.      db->pP
3010: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
3020: 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
3030: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
3040: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 62 2d  s = 0;.      db-
3050: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
3060: 30 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 50 72  0;.      db->pPr
3070: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
3080: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3090: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
30a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 7d 0a 23  >mutex);.  }.}.#
30b0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
30c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
30d0: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
30e0: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
30f0: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
3100: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
3110: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
3120: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
3130: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
3140: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
3150: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
3160: 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73  nt ms){.  if( ms
3170: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75  >0 ){.    db->bu
3180: 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a  syTimeout = ms;.
3190: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
31a0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
31b0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
31c0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
31d0: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
31e0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
31f0: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
3200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3210: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3220: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
3230: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
3240: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
3250: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
3260: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
3270: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
3280: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
3290: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
32a0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
32b0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
32c0: 75 70 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  upted = 1;.  }.}
32d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
32e0: 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c  nction is exactl
32f0: 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  y the same as sq
3300: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3310: 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a  ction(), except.
3320: 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ** that it is de
3330: 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c  signed to be cal
3340: 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20  led by internal 
3350: 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72  code. The differ
3360: 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20  ence is.** that 
3370: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
3380: 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63  ils in sqlite3_c
3390: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
33a0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
33b0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
33c0: 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69  nd the mallocFai
33d0: 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64  led flag cleared
33e0: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
33f0: 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73  3CreateFunc(.  s
3400: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
3410: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
3420: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
3430: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
3440: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
3450: 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  a,.  void (*xFun
3460: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
3470: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
3480: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
3490: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
34a0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
34b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
34c0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
34d0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
34e0: 65 78 74 2a 29 0a 29 7b 0a 20 20 46 75 6e 63 44  ext*).){.  FuncD
34f0: 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61  ef *p;.  int nNa
3500: 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  me;..  assert( s
3510: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3520: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
3530: 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e    if( zFunctionN
3540: 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ame==0 ||.      
3550: 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  (xFunc && (xFina
3560: 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20  l || xStep)) || 
3570: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
3580: 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53  & (xFinal && !xS
3590: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
35a0: 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e  !xFunc && (!xFin
35b0: 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c  al && xStep)) ||
35c0: 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20  .      (nArg<-1 
35d0: 7c 7c 20 6e 41 72 67 3e 31 32 37 29 20 7c 7c 0a  || nArg>127) ||.
35e0: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
35f0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6e 63  e = strlen(zFunc
3600: 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20  tionName))) ){. 
3610: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
3620: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
3630: 2c 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72  , "bad parameter
3640: 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  s");.    return 
3650: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3660: 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.  .#ifndef SQL
3670: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
3680: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
3690: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
36a0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
36b0: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
36c0: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
36d0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
36e0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
36f0: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
3700: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
3710: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
3720: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
3730: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
3740: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
3750: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
3760: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
3770: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
3780: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
3790: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
37a0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
37b0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
37c0: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
37d0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
37e0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
37f0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
3800: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
3810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
3820: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
3830: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
3840: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
3850: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
3860: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
3870: 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69 66   xFinal);.    if
3880: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3890: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
38a0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
38b0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
38c0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
38d0: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
38e0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
38f0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
3900: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
3910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3920: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
3930: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
3940: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
3950: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
3960: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
3970: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
3980: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
3990: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
39a0: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
39b0: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
39c0: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
39d0: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
39e0: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
39f0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
3a00: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
3a10: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
3a20: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
3a30: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
3a40: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
3a50: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
3a60: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
3a70: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
3a80: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
3a90: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
3aa0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
3ab0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
3ac0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
3ad0: 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  ame, nArg, enc, 
3ae0: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3af0: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20  ->iPrefEnc==enc 
3b00: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
3b10: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
3b20: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
3b30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3b40: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
3b50: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 55  USY, .        "U
3b60: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
3b70: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
3b80: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
3b90: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
3ba0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
3bb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3bc0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
3bd0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
3be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
3bf0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
3c00: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
3c10: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
3c20: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
3c30: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
3c40: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
3c50: 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 31 29  e, nArg, enc, 1)
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
3c70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3c80: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
3c90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3ca0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
3cb0: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d  >flags = 0;.  p-
3cc0: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
3cd0: 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74    p->xStep = xSt
3ce0: 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69  ep;.  p->xFinali
3cf0: 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70  ze = xFinal;.  p
3d00: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55  ->pUserData = pU
3d10: 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41  serData;.  p->nA
3d20: 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74  rg = nArg;.  ret
3d30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3d40: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
3d50: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
3d60: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
3d70: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3d80: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
3d90: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
3da0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
3db0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
3dc0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
3dd0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
3de0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3df0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
3e00: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
3e10: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
3e20: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
3e30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
3e40: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
3e50: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
3e60: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
3e70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3e80: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
3e90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3ea0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
3eb0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
3ec0: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
3ed0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
3ee0: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
3ef0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
3f00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
3f10: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
3f20: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
3f30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
3f40: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69  ITE_OMIT_UTF16.i
3f50: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
3f60: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20  e_function16(.  
3f70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
3f80: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63  onst void *zFunc
3f90: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
3fa0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78  nArg,.  int eTex
3fb0: 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c  tRep,.  void *p,
3fc0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
3fd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3fe0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
3ff0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
4000: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
4010: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
4020: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
4030: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
4040: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
4050: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
4060: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20   char *zFunc8;. 
4070: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4080: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4090: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
40a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
40b0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
40c0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
40d0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
40e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
40f0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
4100: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
4110: 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63  extRep, p, xFunc
4120: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29  , xStep, xFinal)
4130: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4140: 28 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d  (zFunc8);.  rc =
4150: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
4160: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
4170: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
4180: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
4190: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
41a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
41b0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
41c0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
41d0: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
41e0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
41f0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
4200: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
4210: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
4220: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
4230: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
4240: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
4250: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
4260: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
4270: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
4280: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
4290: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
42a0: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
42b0: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
42c0: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
42d0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
42e0: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
42f0: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
4300: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
4310: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
4320: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
4330: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
4340: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
4350: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
4360: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
4370: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
4380: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
4390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
43a0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
43b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
43c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
43d0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
43e0: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
43f0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
4400: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
4410: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
4420: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
4430: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
4440: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
4450: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
4460: 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20  ITE_UTF8, 0)==0 
4470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  ){.    sqlite3Cr
4480: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61  eateFunc(db, zNa
4490: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
44a0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
44c0: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
44d0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20  nction, 0, 0);. 
44e0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
44f0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c  3ApiExit(db, SQL
4500: 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
4510: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
4520: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
4530: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
4540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
4550: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  RACE./*.** Regis
4560: 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63  ter a trace func
4570: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
4580: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
4590: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74  sly registered t
45a0: 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  race.** is retur
45b0: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
45c0: 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69  ULL trace functi
45d0: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
45e0: 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63   tracing is exec
45f0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
4600: 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20  L.** trace is a 
4610: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
4620: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
4630: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61  voked at the sta
4640: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51  rt of each.** SQ
4650: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
4660: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72  void *sqlite3_tr
4670: 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ace(sqlite3 *db,
4680: 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28   void (*xTrace)(
4690: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
46a0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
46b0: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
46c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
46d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
46e0: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54  .  pOld = db->pT
46f0: 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  raceArg;.  db->x
4700: 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a  Trace = xTrace;.
4710: 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
4720: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
4730: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4740: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4750: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a  rn pOld;.}./*.**
4760: 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66   Register a prof
4770: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ile function.  T
4780: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
4790: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
47a0: 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69  stered .** profi
47b0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  le function is r
47c0: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
47d0: 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20   A NULL profile 
47e0: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
47f0: 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67  hat no profiling
4800: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
4810: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f   non-NULL.** pro
4820: 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65  file is a pointe
4830: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
4840: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
4850: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
4860: 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c  n of.** each SQL
4870: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
4880: 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  is run..*/.void 
4890: 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65  *sqlite3_profile
48a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
48b0: 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69  .  void (*xProfi
48c0: 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  le)(void*,const 
48d0: 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e  char*,sqlite_uin
48e0: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
48f0: 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  rg.){.  void *pO
4900: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
4910: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
4920: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
4930: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a  b->pProfileArg;.
4940: 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d    db->xProfile =
4950: 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d   xProfile;.  db-
4960: 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70  >pProfileArg = p
4970: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
4980: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4990: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
49a0: 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
49b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
49c0: 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50  ACE */../*** EXP
49d0: 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a  ERIMENTAL ***.**
49e0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66  .** Register a f
49f0: 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
4a00: 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61  voked when a tra
4a10: 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  nsaction comment
4a20: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
4a30: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
4a40: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
4a50: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
4a60: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
4a70: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
4a80: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
4a90: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
4aa0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4ab0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
4ac0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
4ad0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
4ae0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
4af0: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
4b00: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
4b10: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
4b20: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
4b40: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
4b50: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
4b60: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
4b70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4b80: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
4b90: 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
4ba0: 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
4bb0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
4bc0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
4bd0: 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
4be0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4bf0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4c00: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
4c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
4c20: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
4c30: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
4c40: 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
4c50: 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
4c60: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
4c70: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
4c80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4c90: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
4ca0: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
4cb0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
4cc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
4cd0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
4ce0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
4cf0: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
4d00: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
4d10: 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
4d20: 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
4d30: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
4d40: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
4d50: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
4d60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
4d70: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
4d80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
4d90: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
4da0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
4db0: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
4dc0: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
4dd0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
4de0: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
4df0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
4e00: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
4e10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
4e20: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
4e30: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
4e40: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
4e50: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
4e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
4e70: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
4e80: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
4e90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
4ea0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
4eb0: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
4ec0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
4ed0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
4ee0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
4ef0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
4f00: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
4f10: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
4f20: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4f30: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4f50: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
4f60: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
4f70: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
4f80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4f90: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4fa0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
4fb0: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
4fc0: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
4fd0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
4fe0: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
4ff0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
5000: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
5010: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
5020: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
5030: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5040: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
5050: 63 72 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74  create a connect
5060: 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
5070: 65 20 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65  e BTree.** drive
5080: 72 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  r.  If zFilename
5090: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
50a0: 61 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61  a file, then tha
50b0: 74 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65  t file is.** ope
50c0: 6e 65 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49  ned and used.  I
50d0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  f zFilename is t
50e0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
50f0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a  memory:" then.**
5100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
5110: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
5120: 79 20 28 61 6e 64 20 69 73 20 74 68 75 73 20 66  y (and is thus f
5130: 6f 72 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e  orgotten as soon
5140: 20 61 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65   as.** the conne
5150: 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
5160: 29 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  )  If zFilename 
5170: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  is NULL then the
5180: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
5190: 61 20 22 76 69 72 74 75 61 6c 22 20 64 61 74 61  a "virtual" data
51a0: 62 61 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65  base for transie
51b0: 6e 74 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20  nt use only and 
51c0: 69 73 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a  is deleted as.**
51d0: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e   soon as the con
51e0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  nection is close
51f0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75  d..**.** A virtu
5200: 61 6c 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  al database can 
5210: 62 65 20 65 69 74 68 65 72 20 61 20 64 69 73 6b  be either a disk
5220: 20 66 69 6c 65 20 28 74 68 61 74 20 69 73 20 61   file (that is a
5230: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
5240: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
5250: 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29   file is closed)
5260: 20 6f 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c   or it an be hel
5270: 64 20 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65  d entirely in me
5280: 6d 6f 72 79 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  mory,.** dependi
5290: 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 73  ng on the values
52a0: 20 6f 66 20 74 68 65 20 54 45 4d 50 5f 53 54 4f   of the TEMP_STO
52b0: 52 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RE compile-time 
52c0: 6d 61 63 72 6f 20 61 6e 64 20 74 68 65 0a 2a 2a  macro and the.**
52d0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
52e0: 76 61 72 69 61 62 6c 65 2c 20 61 63 63 6f 72 64  variable, accord
52f0: 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ing to the follo
5300: 77 69 6e 67 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a  wing chart:.**.*
5310: 2a 20 20 20 20 20 20 20 54 45 4d 50 5f 53 54 4f  *       TEMP_STO
5320: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
5330: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
5340: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
5350: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
5360: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20    ----------    
5370: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
5380: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  --.**           
53b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
53c0: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
53d0: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
53e0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
53f0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
5400: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20    file.**       
5410: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
5420: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
5430: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20      memory.**   
5440: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
5450: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
5460: 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20          file.** 
5470: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
5480: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
5490: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a            file.*
54a0: 2a 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20  *           2   
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
54d0: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
54e0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
54f0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5500: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  memory.**       
5510: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
5520: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
5530: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 69 6e      memory.*/.in
5540: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  t sqlite3BtreeFa
5550: 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 73  ctory(.  const s
5560: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
5570: 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
5580: 61 73 65 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  ase when opening
5590: 20 61 75 78 20 6f 74 68 65 72 77 69 73 65 20 30   aux otherwise 0
55a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
55b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
55c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
55d0: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
55e0: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
55f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a  e */.  int omitJ
5600: 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20  ournal,         
5610: 20 2f 2a 20 69 66 20 54 52 55 45 20 74 68 65 6e   /* if TRUE then
5620: 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20   do not journal 
5630: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
5640: 6e 74 20 6e 43 61 63 68 65 2c 20 20 20 20 20 20  nt nCache,      
5650: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
5660: 6d 61 6e 79 20 70 61 67 65 73 20 69 6e 20 74 68  many pages in th
5670: 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a  e page cache */.
5680: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
5690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
56a0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
56b0: 75 67 68 20 74 6f 20 76 66 73 4f 70 65 6e 20 2a  ugh to vfsOpen *
56c0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
56d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ree           /*
56e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
56f0: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
5700: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
5710: 20 20 69 6e 74 20 62 74 46 6c 61 67 73 20 3d 20    int btFlags = 
5720: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a  0;.  int rc;.  .
5730: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5740: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
5750: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5760: 65 72 74 28 20 70 70 42 74 72 65 65 20 21 3d 20  ert( ppBtree != 
5770: 30 29 3b 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f  0);.  if( omitJo
5780: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 62 74 46  urnal ){.    btF
5790: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d  lags |= BTREE_OM
57a0: 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a  IT_JOURNAL;.  }.
57b0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
57c0: 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c  & SQLITE_NoReadl
57d0: 6f 63 6b 20 29 7b 0a 20 20 20 20 62 74 46 6c 61  ock ){.    btFla
57e0: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52  gs |= BTREE_NO_R
57f0: 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69  EADLOCK;.  }.  i
5800: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
5810: 29 7b 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52  ){.#if TEMP_STOR
5820: 45 3d 3d 30 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  E==0.    /* Do n
5830: 6f 74 68 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  othing */.#endif
5840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5850: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 69  OMIT_MEMORYDB.#i
5860: 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  f TEMP_STORE==1.
5870: 20 20 20 20 69 66 28 20 64 62 2d 3e 74 65 6d 70      if( db->temp
5880: 5f 73 74 6f 72 65 3d 3d 32 20 29 20 7a 46 69 6c  _store==2 ) zFil
5890: 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
58a0: 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 54  :";.#endif.#if T
58b0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 20  EMP_STORE==2.   
58c0: 20 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74   if( db->temp_st
58d0: 6f 72 65 21 3d 31 20 29 20 7a 46 69 6c 65 6e 61  ore!=1 ) zFilena
58e0: 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b  me = ":memory:";
58f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 45 4d 50  .#endif.#if TEMP
5900: 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 20 20 7a 46  _STORE==3.    zF
5910: 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
5920: 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  ry:";.#endif.#en
5930: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5940: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 2a 2f 0a 20  IT_MEMORYDB */. 
5950: 20 7d 0a 0a 20 20 69 66 28 20 28 76 66 73 46 6c   }..  if( (vfsFl
5960: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
5970: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
5980: 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c   (zFilename==0 |
5990: 7c 20 2a 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 29  | *zFilename==0)
59a0: 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
59b0: 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
59c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
59d0: 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
59e0: 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
59f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5a00: 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  reeOpen(zFilenam
5a10: 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 64 62  e, (sqlite3 *)db
5a20: 2c 20 70 70 42 74 72 65 65 2c 20 62 74 46 6c 61  , ppBtree, btFla
5a30: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
5a40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5a50: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5a60: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
5a70: 7a 65 28 2a 70 70 42 74 72 65 65 2c 20 6e 43 61  ze(*ppBtree, nCa
5a80: 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  che);.  }.  retu
5a90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5aa0: 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
5ab0: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
5ac0: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
5ad0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
5ae0: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
5af0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
5b00: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
5b10: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
5b20: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
5b30: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
5b40: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
5b50: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
5b60: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
5b70: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
5b80: 63 6b 4f 72 4f 6b 28 64 62 29 20 7c 7c 20 64 62  ckOrOk(db) || db
5b90: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
5ba0: 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20  E_MISUSE ){.    
5bb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
5bc0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
5bd0: 53 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  SE);.  }.  sqlit
5be0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
5bf0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
5c00: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
5c10: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d 20  Failed );.  z = 
5c20: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
5c30: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
5c40: 72 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  rr);.  assert( !
5c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5c60: 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
5c70: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
5c80: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
5c90: 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ode);.  }.  sqli
5ca0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5cb0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
5cc0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
5cd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
5ce0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
5cf0: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
5d00: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
5d10: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
5d20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5d30: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
5d40: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
5d50: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
5d60: 65 33 20 2a 64 62 29 7b 0a 20 20 2f 2a 20 42 65  e3 *db){.  /* Be
5d70: 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 63 68  cause all the ch
5d80: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
5d90: 73 74 72 69 6e 67 20 61 72 65 20 69 6e 20 74 68  string are in th
5da0: 65 20 75 6e 69 63 6f 64 65 0a 20 20 2a 2a 20 72  e unicode.  ** r
5db0: 61 6e 67 65 20 30 78 30 30 2d 30 78 46 46 2c 20  ange 0x00-0xFF, 
5dc0: 69 66 20 77 65 20 70 61 64 20 74 68 65 20 62 69  if we pad the bi
5dd0: 67 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20  g-endian string 
5de0: 77 69 74 68 20 61 20 0a 20 20 2a 2a 20 7a 65 72  with a .  ** zer
5df0: 6f 20 62 79 74 65 2c 20 77 65 20 63 61 6e 20 6f  o byte, we can o
5e00: 62 74 61 69 6e 20 74 68 65 20 6c 69 74 74 6c 65  btain the little
5e10: 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20 77  -endian string w
5e20: 69 74 68 0a 20 20 2a 2a 20 26 62 69 67 5f 65 6e  ith.  ** &big_en
5e30: 64 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20 20  dian[1]..  */.  
5e40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5e50: 72 20 6f 75 74 4f 66 4d 65 6d 42 65 5b 5d 20 3d  r outOfMemBe[] =
5e60: 20 7b 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30   {.    0, 'o', 0
5e70: 2c 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30  , 'u', 0, 't', 0
5e80: 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27  , ' ', .    0, '
5e90: 6f 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27  o', 0, 'f', 0, '
5ea0: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6d 27 2c   ', .    0, 'm',
5eb0: 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 6d 27 2c   0, 'e', 0, 'm',
5ec0: 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 72 27 2c   0, 'o', 0, 'r',
5ed0: 20 30 2c 20 27 79 27 2c 20 30 2c 20 30 2c 20 30   0, 'y', 0, 0, 0
5ee0: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
5ef0: 6f 6e 73 74 20 63 68 61 72 20 6d 69 73 75 73 65  onst char misuse
5f00: 42 65 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c  Be [] = {.    0,
5f10: 20 27 6c 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c   'l', 0, 'i', 0,
5f20: 20 27 62 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c   'b', 0, 'r', 0,
5f30: 20 27 61 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c   'a', 0, 'r', 0,
5f40: 20 27 79 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20   'y', 0, ' ', . 
5f50: 20 20 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 6f     0, 'r', 0, 'o
5f60: 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 74  ', 0, 'u', 0, 't
5f70: 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27 6e  ', 0, 'i', 0, 'n
5f80: 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 20  ', 0, 'e', 0, ' 
5f90: 27 2c 20 0a 20 20 20 20 30 2c 20 27 63 27 2c 20  ', .    0, 'c', 
5fa0: 30 2c 20 27 61 27 2c 20 30 2c 20 27 6c 27 2c 20  0, 'a', 0, 'l', 
5fb0: 30 2c 20 27 6c 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'l', 0, 'e', 
5fc0: 30 2c 20 27 64 27 2c 20 30 2c 20 27 20 27 2c 20  0, 'd', 0, ' ', 
5fd0: 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20  .    0, 'o', 0, 
5fe0: 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20  'u', 0, 't', 0, 
5ff0: 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27  ' ', .    0, 'o'
6000: 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20 27  , 0, 'f', 0, ' '
6010: 2c 20 0a 20 20 20 20 30 2c 20 27 73 27 2c 20 30  , .    0, 's', 0
6020: 2c 20 27 65 27 2c 20 30 2c 20 27 71 27 2c 20 30  , 'e', 0, 'q', 0
6030: 2c 20 27 75 27 2c 20 30 2c 20 27 65 27 2c 20 30  , 'u', 0, 'e', 0
6040: 2c 20 27 6e 27 2c 20 30 2c 20 27 63 27 2c 20 30  , 'n', 0, 'c', 0
6050: 2c 20 27 65 27 2c 20 30 2c 20 30 2c 20 30 0a 20  , 'e', 0, 0, 0. 
6060: 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
6070: 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
6080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
6090: 6f 69 64 20 2a 29 28 26 6f 75 74 4f 66 4d 65 6d  oid *)(&outOfMem
60a0: 42 65 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  Be[SQLITE_UTF16N
60b0: 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54  ATIVE==SQLITE_UT
60c0: 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d  F16LE?1:0]);.  }
60d0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
60e0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
60f0: 4f 6b 28 64 62 29 20 7c 7c 20 64 62 2d 3e 65 72  Ok(db) || db->er
6100: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4d 49  rCode==SQLITE_MI
6110: 53 55 53 45 20 29 7b 0a 20 20 20 20 72 65 74 75  SUSE ){.    retu
6120: 72 6e 20 28 76 6f 69 64 20 2a 29 28 26 6d 69 73  rn (void *)(&mis
6130: 75 73 65 42 65 5b 53 51 4c 49 54 45 5f 55 54 46  useBe[SQLITE_UTF
6140: 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45  16NATIVE==SQLITE
6150: 5f 55 54 46 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a  _UTF16LE?1:0]);.
6160: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
6170: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6180: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
6190: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
61a0: 64 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  d );.  z = sqlit
61b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
61c0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 69 66 28  db->pErr);.  if(
61d0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   z==0 ){.    sql
61e0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
61f0: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71  db->pErr, -1, sq
6200: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
6210: 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20  errCode),.      
6220: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
6230: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6240: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
6250: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
6260: 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  >pErr);.  }.  /*
6270: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
6280: 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
6290: 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
62a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
62b0: 74 31 36 28 29 0a 20 20 2a 2a 20 61 62 6f 76 65  t16().  ** above
62c0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
62d0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
62e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
62f0: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
6300: 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62   ** be cleared b
6310: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
6320: 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c   Do this directl
6330: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  y, instead of vi
6340: 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70  a.  ** sqlite3Ap
6350: 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
6360: 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
6370: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
6380: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 2a  ror message..  *
6390: 2f 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  /.  db->mallocFa
63a0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iled = 0;.  sqli
63b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
63c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
63d0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
63e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
63f0: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
6400: 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
6410: 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
6420: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
6430: 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
6440: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
6450: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
6460: 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
6470: 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
6480: 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
6490: 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
64a0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
64b0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
64c0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
64d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
64e0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
64f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6500: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
6510: 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
6520: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6530: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6540: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
6550: 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
6560: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
6570: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
6580: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
6590: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
65a0: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
65b0: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
65c0: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
65d0: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
65e0: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
65f0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
6600: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
6610: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
6620: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
6630: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
6640: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
6650: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6660: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6670: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
6680: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
6690: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
66a0: 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73  nt enc2;.  .  as
66b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
66c0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
66d0: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
66e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
66f0: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
6700: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
6710: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
6720: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
6730: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
6740: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
6750: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
6760: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6770: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
6780: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
6790: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
67a0: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 20 26  /.  enc2 = enc &
67b0: 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
67c0: 4c 49 47 4e 45 44 3b 0a 20 20 69 66 28 20 65 6e  LIGNED;.  if( en
67d0: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
67e0: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
67f0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
6800: 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 65  E;.  }..  if( (e
6810: 6e 63 32 26 7e 33 29 21 3d 30 20 29 7b 0a 20 20  nc2&~3)!=0 ){.  
6820: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
6830: 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
6840: 20 22 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64 69   "unknown encodi
6850: 6e 67 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ng");.    return
6860: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
6870: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
6880: 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
6890: 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
68a0: 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
68b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
68c0: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
68d0: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
68e0: 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
68f0: 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
6900: 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
6910: 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
6920: 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
6930: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
6940: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
6950: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
6960: 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
6970: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
6980: 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66  zName), 0);.  if
6990: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
69a0: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
69b0: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
69c0: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
69d0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
69e0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
69f0: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64      "Unable to d
6a00: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c  elete/modify col
6a10: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6a20: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
6a30: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
6a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6a50: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
6a60: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
6a70: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6a80: 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
6a90: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6aa0: 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
6ab0: 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
6ac0: 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
6ad0: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
6ae0: 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
6af0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
6b00: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
6b10: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
6b20: 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
6b30: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
6b40: 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
6b50: 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
6b60: 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
6b70: 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
6b80: 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
6b90: 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
6ba0: 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
6bb0: 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
6bc0: 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
6bd0: 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
6be0: 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
6bf0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6c00: 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
6c10: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
6c20: 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 73 74  llSeq, zName, st
6c30: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
6c40: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
6c50: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
6c60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
6c70: 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
6c80: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
6c90: 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
6ca0: 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
6cb0: 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
6cd0: 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
6ce0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6cf0: 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
6d00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6d20: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
6d30: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
6d40: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
6d50: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20   strlen(zName), 
6d60: 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  1);.  if( pColl 
6d70: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 43  ){.    pColl->xC
6d80: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
6d90: 20 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20     pColl->pUser 
6da0: 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f 6c  = pCtx;.    pCol
6db0: 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a  l->xDel = xDel;.
6dc0: 20 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d      pColl->enc =
6dd0: 20 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53   enc2 | (enc & S
6de0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
6df0: 4e 45 44 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NED);.  }.  sqli
6e00: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
6e10: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65  ITE_OK, 0);.  re
6e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
6e40: 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
6e50: 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
6e60: 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
6e70: 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
6e80: 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
6e90: 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
6ea0: 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
6eb0: 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
6ec0: 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
6ed0: 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
6ee0: 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
6ef0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
6f00: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
6f10: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
6f20: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
6f30: 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
6f40: 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
6f50: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
6f60: 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
6f70: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
6f80: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
6f90: 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
6fa0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
6fb0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
6fc0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
6fd0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
6fe0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
6ff0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
7000: 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
7010: 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
7020: 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
7030: 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
7040: 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
7050: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
7060: 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
7070: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
7080: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
7090: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
70a0: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
70b0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
70c0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
70d0: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
70e0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
70f0: 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
7100: 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
7110: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
7120: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
7130: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
7140: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
7150: 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
7160: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
7170: 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
7180: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
7190: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
71a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
71b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
71c0: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
71d0: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
71e0: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
71f0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
7200: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
7210: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
7220: 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
7230: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
7240: 3e 32 35 35 0a 23 20 65 72 72 6f 72 20 53 51 4c  >255.# error SQL
7250: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
7260: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
7270: 77 65 65 6e 20 30 20 61 6e 64 20 32 35 35 0a 23  ween 0 and 255.#
7280: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
7290: 5f 4d 41 58 5f 41 54 54 41 43 48 3c 30 20 7c 7c  _MAX_ATTACH<0 ||
72a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
72b0: 43 48 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51  CH>30.# error SQ
72c0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 20  LITE_MAX_ATTACH 
72d0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
72e0: 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a  0 and 30.#endif.
72f0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
7300: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
7310: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
7320: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
7330: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
7340: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
7350: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
7360: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
7370: 4d 42 45 52 3c 31 0a 23 20 65 72 72 6f 72 20 53  MBER<1.# error S
7380: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
7390: 4c 45 5f 4e 55 4d 42 45 52 20 6d 75 73 74 20 62  LE_NUMBER must b
73a0: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
73b0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
73c0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
73d0: 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
73e0: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
73f0: 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
7400: 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
7410: 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
7420: 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
7430: 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
7440: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
7450: 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
7460: 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
7470: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
7480: 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
7490: 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
74a0: 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
74b0: 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
74c0: 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
74d0: 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
74e0: 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
74f0: 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
7500: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7510: 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
7520: 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
7530: 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
7540: 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20   int oldLimit;. 
7550: 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
7560: 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
7570: 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
7580: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
7590: 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
75a0: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
75b0: 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
75c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  >=0 ){.    if( n
75d0: 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
75e0: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
75f0: 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
7600: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
7610: 49 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  Id];.    }.    d
7620: 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
7630: 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
7640: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
7650: 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  imit;.}../*.** T
7660: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
7670: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
7680: 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
7690: 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
76a0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
76b0: 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
76c0: 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
76d0: 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
76e0: 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
76f0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
7700: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
7710: 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
7720: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
7730: 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
7740: 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
7750: 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
7760: 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
7770: 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
7780: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
7790: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
77a0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f   flags,        /
77b0: 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
77c0: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
77d0: 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
77e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
77f0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
7800: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7810: 20 69 6e 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53   int rc;.  CollS
7820: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a  eq *pColl;..  /*
7830: 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
7840: 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
7850: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  ags parameter */
7860: 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
7870: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
7880: 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
7890: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
78a0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
78b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
78d0: 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
78e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
78f0: 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
7900: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7910: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
7920: 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
7930: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
7940: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
7950: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
7960: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
7970: 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
7980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7990: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
79a0: 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
79b0: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
79c0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
79d0: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
79e0: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
79f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
7a00: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
7a10: 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
7a20: 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
7a30: 74 3b 0a 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  t;.  db->mutex =
7a40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
7a50: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
7a60: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
7a70: 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
7a80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7a90: 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 64 62  free(db);.    db
7aa0: 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   = 0;.    goto o
7ab0: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
7ac0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7ad0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7ae0: 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
7af0: 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 70 72 69   0xff;.  db->pri
7b00: 6f 72 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 0a  orNewRowid = 0;.
7b10: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20    db->nDb = 2;. 
7b20: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
7b30: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
7b40: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
7b50: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 61 73 73  aDbStatic;.  ass
7b60: 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
7b70: 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
7b80: 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
7b90: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
7ba0: 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
7bb0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
7bc0: 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  t));.  db->autoC
7bd0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
7be0: 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
7bf0: 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  1;.  db->nextPag
7c00: 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
7c10: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
7c20: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23  _ShortColNames.#
7c30: 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
7c40: 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
7c70: 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
7c80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7c90: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
7ca0: 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
7cb0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
7cc0: 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
7cd0: 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
7ce0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
7cf0: 3e 61 46 75 6e 63 2c 20 53 51 4c 49 54 45 5f 48  >aFunc, SQLITE_H
7d00: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
7d10: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
7d20: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  t(&db->aCollSeq,
7d30: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
7d40: 49 4e 47 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  ING, 0);.#ifndef
7d50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7d60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
7d70: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
7d80: 3e 61 4d 6f 64 75 6c 65 2c 20 53 51 4c 49 54 45  >aModule, SQLITE
7d90: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
7da0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e  ;.#endif..  db->
7db0: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
7dc0: 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
7dd0: 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73 20 29   if( !db->pVfs )
7de0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7df0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 64 62 2d  E_ERROR;.    db-
7e00: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7e10: 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 20 20  MAGIC_SICK;.    
7e20: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
7e30: 20 72 63 2c 20 22 6e 6f 20 73 75 63 68 20 76 66   rc, "no such vf
7e40: 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
7e50: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
7e60: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  ut;.  }..  /* Ad
7e70: 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
7e80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7e90: 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
7ea0: 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
7eb0: 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
7ec0: 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
7ed0: 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
7ee0: 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
7ef0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
7f00: 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
7f10: 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
7f20: 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
7f30: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
7f40: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
7f50: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
7f60: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
7f70: 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
7f80: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
7f90: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
7fa0: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
7fb0: 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
7fc0: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
7fd0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
7fe0: 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
7ff0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
8000: 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
8010: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
8020: 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
8030: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
8040: 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
8050: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
8060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8070: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
8080: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
8090: 5f 53 49 43 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  _SICK;.    goto 
80a0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
80b0: 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
80c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
80d0: 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
80e0: 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
80f0: 36 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  6, 0);.  assert(
8100: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d   db->pDfltColl!=
8110: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  0 );..  /* Also 
8120: 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73 65  add a UTF-8 case
8130: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c  -insensitive col
8140: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
8150: 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
8160: 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
8170: 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
8180: 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74   0, nocaseCollat
8190: 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20  ingFunc, 0);..  
81a0: 2f 2a 20 53 65 74 20 66 6c 61 67 73 20 6f 6e 20  /* Set flags on 
81b0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  the built-in col
81c0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
81d0: 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43   */.  db->pDfltC
81e0: 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  oll->type = SQLI
81f0: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 3b 0a  TE_COLL_BINARY;.
8200: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
8210: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
8220: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 4e   SQLITE_UTF8, "N
8230: 4f 43 41 53 45 22 2c 20 36 2c 20 30 29 3b 0a 20  OCASE", 6, 0);. 
8240: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
8250: 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20    pColl->type = 
8260: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41  SQLITE_COLL_NOCA
8270: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  SE;.  }..  /* Op
8280: 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
8290: 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
82a0: 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
82b0: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
82c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
82d0: 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c 65 6e  ctory(db, zFilen
82e0: 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44  ame, 0, SQLITE_D
82f0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
8300: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
8320: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
8330: 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20 20 20  EN_MAIN_DB,.    
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
8360: 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 72  0].pBt);.  if( r
8370: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8380: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8390: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
83a0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
83b0: 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
83c0: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
83d0: 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
83e0: 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
83f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
8400: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
8410: 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
8420: 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
8430: 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
8440: 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  , 0);...  /* The
8450: 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
8460: 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
8470: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27  in database is '
8480: 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74  full'; for the t
8490: 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
84a0: 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20  e it is 'NONE'. 
84b0: 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
84c0: 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
84d0: 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
84e0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65  db->aDb[0].zName
84f0: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
8500: 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
8510: 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65  evel = 3;.#ifnde
8520: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
8530: 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31  MPDB.  db->aDb[1
8540: 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
8550: 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
8560: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
8570: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
8580: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
8590: 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
85a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
85b0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
85c0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
85d0: 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
85e0: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
85f0: 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
8600: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
8610: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
8620: 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
8630: 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
8640: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
8650: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
8660: 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
8670: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
8680: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
8690: 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
86a0: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
86b0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
86c0: 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
86d0: 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
86e0: 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
86f0: 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
8700: 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
8710: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
8720: 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
8730: 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 28  () API..  */.  (
8740: 76 6f 69 64 29 73 71 6c 69 74 65 33 41 75 74 6f  void)sqlite3Auto
8750: 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
8760: 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b);.  if( sqlite
8770: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53  3_errcode(db)!=S
8780: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8790: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
87a0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
87b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
87c0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
87d0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
87e0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
87f0: 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
8800: 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
8810: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
8820: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
8830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8840: 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
8850: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8860: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
8870: 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
8880: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
8890: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
88a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
88b0: 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
88c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
88d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
88e0: 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
88f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
8900: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8910: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
8920: 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
8930: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
8940: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
8950: 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
8960: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
8970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8980: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
8990: 69 74 65 33 49 63 75 49 6e 69 74 28 73 71 6c 69  ite3IcuInit(sqli
89a0: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
89b0: 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
89c0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  b);.  }.#endif. 
89d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
89e0: 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
89f0: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
8a00: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
8a10: 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
8a20: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
8a30: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
8a40: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
8a50: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
8a60: 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
8a70: 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
8a80: 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
8a90: 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
8aa0: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
8ab0: 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
8ac0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
8ad0: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
8ae0: 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
8af0: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
8b00: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
8b10: 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
8b20: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
8b30: 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
8b40: 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
8b50: 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
8b80: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
8b90: 65 6e 64 69 66 0a 0a 6f 70 65 6e 64 62 5f 6f 75  endif..opendb_ou
8ba0: 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  t:.  if( db ){. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
8bc0: 75 74 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 73  utex!=0 );.    s
8bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8be0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8bf0: 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
8c00: 4e 4f 4d 45 4d 3d 3d 28 72 63 20 3d 20 73 71 6c  NOMEM==(rc = sql
8c10: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
8c20: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8c30: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
8c40: 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  db = 0;.  }.  *p
8c50: 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75  pDb = db;.  retu
8c60: 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
8c70: 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  t(0, rc);.}../*.
8c80: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
8c90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
8ca0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
8cb0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
8cc0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
8cd0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
8ce0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
8cf0: 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
8d00: 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8d30: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
8d40: 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
8d50: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
8d60: 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
8d70: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
8d80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
8d90: 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
8da0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
8db0: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
8dc0: 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
8dd0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
8de0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
8df0: 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
8e00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
8e10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8e20: 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
8e30: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
8e40: 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
8e50: 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
8e60: 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
8e70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8e80: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
8e90: 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
8ea0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
8eb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
8ec0: 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
8ed0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
8ee0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
8ef0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
8f00: 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
8f10: 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
8f20: 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
8f30: 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
8f40: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8f50: 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
8f60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8f70: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
8f80: 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
8f90: 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
8fa0: 44 62 20 3d 20 30 3b 0a 20 20 70 56 61 6c 20 3d  Db = 0;.  pVal =
8fb0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
8fc0: 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
8fd0: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
8fe0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
8ff0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
9000: 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
9010: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
9020: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
9030: 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
9040: 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
9050: 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
9060: 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
9070: 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
9080: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
9090: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
90a0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
90b0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
90c0: 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
90d0: 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
90e0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
90f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9100: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
9110: 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
9120: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
9130: 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e  ded) ){.      EN
9140: 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
9150: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
9160: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9170: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
9180: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
9190: 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
91a0: 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
91b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
91c0: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
91d0: 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
91e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
91f0: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
9200: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
9210: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
9220: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
9230: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
9240: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9250: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
9260: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
9270: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
9280: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
9290: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
92a0: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
92b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
92c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
92d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
92e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
92f0: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
9300: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
9310: 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
9320: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
9330: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
9340: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
9350: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9360: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9380: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
9390: 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
93a0: 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
93b0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
93c0: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
93d0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
93e0: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
93f0: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
9400: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
9410: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
9420: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
9430: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
9440: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
9450: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
9460: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
9470: 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
9480: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9490: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
94a0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
94b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
94c0: 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
94d0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
94e0: 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20  ame, enc, pCtx, 
94f0: 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
9500: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
9510: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
9520: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9530: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9540: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9550: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9560: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
9570: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
9580: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9590: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
95a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
95b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
95c0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
95d0: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
95e0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
95f0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
9600: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
9610: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
9620: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
9630: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
9640: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
9650: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9660: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
9670: 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  me8;.  sqlite3_m
9680: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9690: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
96a0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
96b0: 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
96c0: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
96d0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b  (db, zName, -1);
96e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
96f0: 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
9700: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
9710: 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43 74 78 2c  ame8, enc, pCtx,
9720: 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
9730: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9740: 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
9750: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
9760: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
9770: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9780: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9790: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
97a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
97b0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
97c0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
97d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
97e0: 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
97f0: 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
9800: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
9810: 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
9820: 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
9830: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
9840: 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
9850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
9860: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
9870: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
9880: 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
9890: 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
98a0: 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
98b0: 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
98c0: 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
98d0: 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
98e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
98f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
9900: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
9910: 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
9920: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
9930: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
9940: 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
9950: 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9970: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9990: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
99a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
99b0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
99c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
99d0: 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
99e0: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
99f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
9a00: 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
9a10: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
9a20: 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
9a30: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
9a40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9a50: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
9a60: 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
9a70: 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
9a80: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
9a90: 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
9aa0: 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
9ab0: 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
9ac0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
9ad0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9ae0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9af0: 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
9b00: 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
9b10: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
9b20: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
9b30: 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
9b40: 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
9b50: 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
9b60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9b70: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
9b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
9b90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9ba0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
9bb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9bc0: 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a  T_GLOBALRECOVER.
9bd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9be0: 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
9bf0: 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
9c00: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
9c10: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
9c20: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
9c30: 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
9c40: 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
9c50: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
9c60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
9c70: 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29  al_recover(void)
9c80: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
9c90: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
9ca0: 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
9cb0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
9cc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9cd0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61  nnection is in a
9ce0: 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64  utocommit.** mod
9cf0: 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
9d00: 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c  if it is and FAL
9d10: 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f  SE if not.  Auto
9d20: 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f  commit mode is o
9d30: 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e  n.** by default.
9d40: 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20    Autocommit is 
9d50: 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45  disabled by a BE
9d60: 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  GIN statement an
9d70: 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62  d reenabled.** b
9d80: 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49  y the next COMMI
9d90: 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  T or ROLLBACK..*
9da0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49  *.******* THIS I
9db0: 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41  S AN EXPERIMENTA
9dc0: 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53 55 42  L API AND IS SUB
9dd0: 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a  JECT TO CHANGE *
9de0: 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  *****.*/.int sql
9df0: 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
9e00: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
9e10: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  {.  return db->a
9e20: 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69  utoCommit;.}..#i
9e30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9e40: 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  G./*.** The foll
9e50: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  owing routine is
9e60: 20 73 75 62 74 69 74 75 74 65 64 20 66 6f 72 20   subtituted for 
9e70: 63 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f  constant SQLITE_
9e80: 43 4f 52 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65  CORRUPT in.** de
9e90: 62 75 67 67 69 6e 67 20 62 75 69 6c 64 73 2e 20  bugging builds. 
9ea0: 20 54 68 69 73 20 70 72 6f 76 69 64 65 73 20 61   This provides a
9eb0: 20 77 61 79 20 74 6f 20 73 65 74 20 61 20 62 72   way to set a br
9ec0: 65 61 6b 70 6f 69 6e 74 20 66 6f 72 20 77 68 65  eakpoint for whe
9ed0: 6e 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  n.** corruption 
9ee0: 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
9ef0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9f00: 33 43 6f 72 72 75 70 74 28 76 6f 69 64 29 7b 0a  3Corrupt(void){.
9f10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9f20: 43 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69  CORRUPT;.}.#endi
9f30: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  f../*.** This is
9f40: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
9f50: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
9f60: 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
9f70: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
9f80: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
9f90: 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
9fa0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
9fb0: 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
9fc0: 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
9fd0: 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
9fe0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
9ff0: 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
a000: 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
a010: 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
a020: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
a030: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
a040: 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
a050: 6f 69 64 29 7b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  oid){.}../*.** R
a060: 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72  eturn meta infor
a070: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73  mation about a s
a080: 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f  pecific column o
a090: 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  f a database tab
a0a0: 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  le..** See comme
a0b0: 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20  nt in sqlite3.h 
a0c0: 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f  (sqlite.h.in) fo
a0d0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69  r details..*/.#i
a0e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a0f0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a100: 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  TA.int sqlite3_t
a110: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
a120: 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20  data(.  sqlite3 
a130: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
a140: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
a150: 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  n handle */.  co
a160: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
a170: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  e,        /* Dat
a180: 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55  abase name or NU
a190: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
a1a0: 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  ar *zTableName, 
a1b0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d      /* Table nam
a1c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
a1d0: 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20  r *zColumnName, 
a1e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
a1f0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
a200: 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20  t **pzDataType, 
a210: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65     /* OUTPUT: De
a220: 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65  clared data type
a230: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
a240: 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20   **pzCollSeq,   
a250: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c    /* OUTPUT: Col
a260: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a270: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  name */.  int *p
a280: 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  NotNull,        
a290: 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
a2a0: 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c   True if NOT NUL
a2b0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69  L constraint exi
a2c0: 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  sts */.  int *pP
a2d0: 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20  rimaryKey,      
a2e0: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
a2f0: 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70  True if column p
a300: 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69  art of PK */.  i
a310: 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20  nt *pAutoinc    
a320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a330: 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
a340: 6c 75 6d 73 20 69 73 20 61 75 74 6f 2d 69 6e 63  lums is auto-inc
a350: 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  rement */.){.  i
a360: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
a370: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61  ErrMsg = 0;.  Ta
a380: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
a390: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
a3a0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a  0;.  int iCol;..
a3b0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
a3c0: 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
a3d0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
a3e0: 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
a3f0: 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
a400: 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
a410: 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
a420: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  = 0;..  /* Ensur
a430: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
a440: 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c  chema has been l
a450: 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  oaded */.  sqlit
a460: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
a470: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f  b->mutex);.  (vo
a480: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
a490: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
a4a0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
a4b0: 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
a4c0: 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
a4d0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Msg);.  sqlite3B
a4e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
a4f0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
a500: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
a510: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
a520: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
a530: 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
a540: 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
a550: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
a560: 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
a570: 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
a580: 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
a590: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
a5a0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
a5b0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
a5c0: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
a5d0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
a5e0: 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
a5f0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
a600: 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
a610: 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69  mnName) ){.    i
a620: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
a630: 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  y;.    if( iCol>
a640: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
a650: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
a660: 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Col];.    }.  }e
a670: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
a680: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
a690: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
a6a0: 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
a6b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
a6c0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
a6d0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
a6e0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
a6f0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
a700: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
a720: 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
a730: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
a740: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
a750: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  r_out;.    }.  }
a760: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
a770: 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
a780: 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
a790: 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
a7a0: 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
a7b0: 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
a7c0: 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
a7d0: 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
a7e0: 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
a7f0: 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
a800: 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
a810: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
a820: 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
a830: 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
a840: 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
a850: 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
a860: 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
a870: 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
a880: 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
a890: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
a8a0: 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
a8b0: 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
a8c0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
a8d0: 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
a8e0: 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
a8f0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
a900: 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
a910: 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
a920: 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
a930: 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
a940: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
a950: 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
a960: 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
a970: 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
a980: 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
a990: 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
a9a0: 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
a9b0: 20 3d 20 28 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c   = (pCol->notNul
a9c0: 6c 3f 31 3a 30 29 3b 0a 20 20 20 20 70 72 69 6d  l?1:0);.    prim
a9d0: 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
a9e0: 3e 69 73 50 72 69 6d 4b 65 79 3f 31 3a 30 29 3b  >isPrimKey?1:0);
a9f0: 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 28  .    autoinc = (
aa00: 28 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43  (pTab->iPKey==iC
aa10: 6f 6c 20 26 26 20 70 54 61 62 2d 3e 61 75 74 6f  ol && pTab->auto
aa20: 49 6e 63 29 3f 31 3a 30 29 3b 0a 20 20 7d 65 6c  Inc)?1:0);.  }el
aa30: 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
aa40: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
aa50: 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
aa60: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
aa70: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
aa80: 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
aa90: 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
aaa0: 74 3a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  t:.  (void)sqlit
aab0: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
aac0: 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
aad0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
aae0: 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
aaf0: 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
ab00: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
ab10: 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
ab20: 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
ab30: 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
ab40: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
ab50: 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
ab60: 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
ab70: 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
ab80: 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
ab90: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
aba0: 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
abb0: 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
abc0: 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
abd0: 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
abe0: 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
abf0: 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
ac00: 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
ac10: 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
ac20: 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
ac30: 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
ac40: 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
ac50: 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
ac60: 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
ac70: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
ac80: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
ac90: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
aca0: 26 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  &zErrMsg, "no su
acb0: 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
acc0: 20 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   ", zTableName, 
acd0: 22 2e 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43  ".", .        zC
ace0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  olumnName, 0);. 
acf0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
ad00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
ad10: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
ad20: 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30   (zErrMsg?"%s":0
ad30: 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  ), zErrMsg);.  s
ad40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
ad50: 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
ad60: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
ad70: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
ad80: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ad90: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ada0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
adb0: 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
adc0: 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
add0: 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
ade0: 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
adf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
ae00: 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
ae10: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ae20: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
ae30: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
ae40: 73 5f 66 69 6e 64 28 30 29 3b 0a 0a 20 20 2f 2a  s_find(0);..  /*
ae50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
ae60: 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
ae70: 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
ae80: 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
ae90: 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
aea0: 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
aeb0: 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
aec0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
aed0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
aee0: 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
aef0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
af00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
af10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
af20: 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
af30: 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
af40: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
af50: 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
af60: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
af70: 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ff){.  sqlite3_m
af80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
af90: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
afa0: 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
afb0: 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
afc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
afd0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
afe0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
aff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b000: 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
b010: 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
b020: 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
b030: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
b040: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
b050: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
b060: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
b070: 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
b080: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
b090: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
b0a0: 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b  RROR;.  int iDb;
b0b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b0c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b0d0: 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65  );.  if( zDbName
b0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  ==0 ){.    iDb =
b0f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
b100: 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c   for(iDb=0; iDb<
b110: 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b  db->nDb; iDb++){
b120: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
b130: 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  p(db->aDb[iDb].z
b140: 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d  Name, zDbName)==
b150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
b160: 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64  .  }.  if( iDb<d
b170: 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74  b->nDb ){.    Bt
b180: 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62  ree *pBtree = db
b190: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
b1a0: 20 20 20 20 69 66 28 20 70 42 74 72 65 65 20 29      if( pBtree )
b1b0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
b1c0: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c  Pager;.      sql
b1d0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20  ite3_file *fd;. 
b1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
b1f0: 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
b200: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
b210: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
b220: 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  (pBtree);.      
b230: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
b240: 30 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  0 );.      fd = 
b250: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
b260: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
b270: 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b  assert( fd!=0 );
b280: 0a 20 20 20 20 20 20 69 66 28 20 66 64 2d 3e 70  .      if( fd->p
b290: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
b2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b2b0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
b2c0: 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
b2d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b2e0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
b2f0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ee);.    }.  }. 
b300: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
b310: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
b320: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
b330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
b340: 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
b350: 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
b360: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
b370: 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
b380: 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
b390: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b3a0: 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
b3b0: 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ST.  va_list ap;
b3c0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
b3d0: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
b3e0: 70 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  p ){.    /*.    
b3f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
b400: 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 43 4f  control(FAULT_CO
b410: 4e 46 49 47 2c 20 66 61 75 6c 74 5f 69 64 2c 20  NFIG, fault_id, 
b420: 6e 44 65 6c 61 79 2c 20 6e 52 65 70 65 61 74 29  nDelay, nRepeat)
b430: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b440: 6f 6e 66 69 67 75 72 65 20 61 20 66 61 75 6c 74  onfigure a fault
b450: 20 69 6e 6a 65 63 74 6f 72 2e 20 20 54 68 65 20   injector.  The 
b460: 73 70 65 63 69 66 69 63 20 66 61 75 6c 74 20 69  specific fault i
b470: 6e 6a 65 63 74 6f 72 20 69 73 0a 20 20 20 20 2a  njector is.    *
b480: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
b490: 74 68 65 20 66 61 75 6c 74 5f 69 64 20 61 72 67  the fault_id arg
b4a0: 75 6d 65 6e 74 2e 20 20 28 65 78 3a 20 53 51 4c  ument.  (ex: SQL
b4b0: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
b4c0: 52 5f 4d 41 4c 4c 4f 43 29 0a 20 20 20 20 2a 2a  R_MALLOC).    **
b4d0: 20 54 68 65 20 66 61 75 6c 74 20 77 69 6c 6c 20   The fault will 
b4e0: 6f 63 63 75 72 20 61 66 74 65 72 20 61 20 64 65  occur after a de
b4f0: 6c 61 79 20 6f 66 20 6e 44 65 6c 61 79 20 63 61  lay of nDelay ca
b500: 6c 6c 73 2e 20 20 54 68 65 20 66 61 75 6c 74 0a  lls.  The fault.
b510: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 72 65 70 65      ** will repe
b520: 61 74 20 6e 52 65 70 65 61 74 20 74 69 6d 65 73  at nRepeat times
b530: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
b540: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
b550: 4c 5f 46 41 55 4c 54 5f 43 4f 4e 46 49 47 3a 20  L_FAULT_CONFIG: 
b560: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 20 3d  {.      int id =
b570: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
b580: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c  ;.      int nDel
b590: 61 79 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ay = va_arg(ap, 
b5a0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
b5b0: 6e 52 65 70 65 61 74 20 3d 20 76 61 5f 61 72 67  nRepeat = va_arg
b5c0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
b5d0: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 43 6f 6e   sqlite3FaultCon
b5e0: 66 69 67 28 69 64 2c 20 6e 44 65 6c 61 79 2c 20  fig(id, nDelay, 
b5f0: 6e 52 65 70 65 61 74 29 3b 0a 20 20 20 20 20 20  nRepeat);.      
b600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
b610: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    /*.    ** sqli
b620: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
b630: 28 46 41 55 4c 54 5f 46 41 49 4c 55 52 45 53 2c  (FAULT_FAILURES,
b640: 20 66 61 75 6c 74 5f 69 64 29 0a 20 20 20 20 2a   fault_id).    *
b650: 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  *.    ** Return 
b660: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 61  the number of fa
b670: 75 6c 74 73 20 28 62 6f 74 68 20 68 61 72 64 20  ults (both hard 
b680: 61 6e 64 20 62 65 6e 69 67 6e 20 66 61 75 6c 74  and benign fault
b690: 73 29 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  s) that have.   
b6a0: 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 73 69 6e   ** occurred sin
b6b0: 63 65 20 74 68 65 20 69 6e 6a 65 63 74 6f 72 20  ce the injector 
b6c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 66 61  identified by fa
b6d0: 75 6c 74 5f 69 64 29 20 77 61 73 20 6c 61 73 74  ult_id) was last
b6e0: 20 63 6f 6e 66 69 67 75 72 65 64 2e 0a 20 20 20   configured..   
b6f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
b700: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
b710: 4c 54 5f 46 41 49 4c 55 52 45 53 3a 20 7b 0a 20  LT_FAILURES: {. 
b720: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 76 61       int id = va
b730: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
b740: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b750: 33 46 61 75 6c 74 46 61 69 6c 75 72 65 73 28 69  3FaultFailures(i
b760: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
b770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
b780: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
b790: 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54  st_control(FAULT
b7a0: 5f 42 45 4e 49 47 4e 5f 46 41 49 4c 55 52 45 53  _BENIGN_FAILURES
b7b0: 2c 20 66 61 75 6c 74 5f 69 64 29 0a 20 20 20 20  , fault_id).    
b7c0: 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
b7d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b7e0: 65 6e 69 67 6e 20 66 61 75 6c 74 73 20 74 68 61  enign faults tha
b7f0: 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
b800: 73 69 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a  since the.    **
b810: 20 69 6e 6a 65 63 74 6f 72 20 69 64 65 6e 74 69   injector identi
b820: 66 69 65 64 20 62 79 20 66 61 75 6c 74 5f 69 64  fied by fault_id
b830: 20 77 61 73 20 6c 61 73 74 20 63 6f 6e 66 69 67   was last config
b840: 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ured..    */.   
b850: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
b860: 54 43 54 52 4c 5f 46 41 55 4c 54 5f 42 45 4e 49  TCTRL_FAULT_BENI
b870: 47 4e 5f 46 41 49 4c 55 52 45 53 3a 20 7b 0a 20  GN_FAILURES: {. 
b880: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 76 61       int id = va
b890: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
b8a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b8b0: 33 46 61 75 6c 74 42 65 6e 69 67 6e 46 61 69 6c  3FaultBenignFail
b8c0: 75 72 65 73 28 69 64 29 3b 0a 20 20 20 20 20 20  ures(id);.      
b8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
b8e0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69    /*.    ** sqli
b8f0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
b900: 28 46 41 55 4c 54 5f 50 45 4e 44 49 4e 47 2c 20  (FAULT_PENDING, 
b910: 66 61 75 6c 74 5f 69 64 29 0a 20 20 20 20 2a 2a  fault_id).    **
b920: 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  .    ** Return t
b930: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 75 63  he number of suc
b940: 63 65 73 73 65 73 20 74 68 61 74 20 77 69 6c 6c  cesses that will
b950: 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
b960: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 73 63  e next.    ** sc
b970: 68 65 64 75 6c 65 64 20 66 61 69 6c 75 72 65 20  heduled failure 
b980: 6f 6e 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 6f  on fault injecto
b990: 72 20 66 61 75 6c 74 5f 69 64 2e 0a 20 20 20 20  r fault_id..    
b9a0: 2a 2a 20 49 66 20 6e 6f 20 66 61 69 6c 75 72 65  ** If no failure
b9b0: 73 20 61 72 65 20 73 63 68 65 64 75 6c 65 64 2c  s are scheduled,
b9c0: 20 72 65 74 75 72 6e 20 2d 31 2e 0a 20 20 20 20   return -1..    
b9d0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
b9e0: 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
b9f0: 54 5f 50 45 4e 44 49 4e 47 3a 20 7b 0a 20 20 20  T_PENDING: {.   
ba00: 20 20 20 69 6e 74 20 69 64 20 3d 20 76 61 5f 61     int id = va_a
ba10: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
ba20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
ba30: 61 75 6c 74 50 65 6e 64 69 6e 67 28 69 64 29 3b  aultPending(id);
ba40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ba50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
ba60: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
ba70: 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
ba80: 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
ba90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
baa0: 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
bab0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
bac0: 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
bad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bae0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
baf0: 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
bb00: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
bb10: 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
bb20: 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
bb30: 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
bb40: 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
bb50: 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
bb60: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
bb70: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
bb80: 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
bb90: 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
bba0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bbb0: 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
bbc0: 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
bbd0: 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
bbe0: 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
bbf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
bc00: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
bc10: 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
bc20: 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
bc30: 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
bc40: 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
bc50: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
bc60: 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
bc70: 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
bc80: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
bc90: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
bca0: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
bcb0: 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
bcc0: 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
bcd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bce0: 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
bcf0: 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
bd00: 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61  ite3PrngResetSta
bd10: 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
bd20: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
bd30: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
bd40: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
bd50: 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
bd60: 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
bd70: 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
bd80: 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
bd90: 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
bda0: 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
bdb0: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
bdc0: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
bdd0: 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
bde0: 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
bdf0: 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
be00: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
be10: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
be20: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
be30: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
be40: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
be50: 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
be60: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
be70: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
be80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
be90: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
bea0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
beb0: 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
bec0: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
bed0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
bee0: 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
bef0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
bf00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
bf10: 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
bf20: 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
bf30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bf40: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
bf50: 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
bf60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
bf70: 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72  LTIN_TEST */.  r
bf80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.