/ Hex Artifact Content
Login

Artifact 7cec512d2c83afea2b83977b384633b9edb1ae1d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 33 39 33 20 32 30 30 37 2f 30 38  ,v 1.393 2007/08
0280: 2f 32 31 20 31 39 3a 33 33 3a 35 36 20 64 72 68  /21 19:33:56 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02c0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  .h>../*.** The v
02d0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ersion of the li
02e0: 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73 74 20 63  brary.*/.const c
02f0: 68 61 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73  har sqlite3_vers
0300: 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56  ion[] = SQLITE_V
0310: 45 52 53 49 4f 4e 3b 0a 63 6f 6e 73 74 20 63 68  ERSION;.const ch
0320: 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76  ar *sqlite3_libv
0330: 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65  ersion(void){ re
0340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72  turn sqlite3_ver
0350: 73 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  sion; }.int sqli
0360: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
0370: 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74  umber(void){ ret
0380: 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  urn SQLITE_VERSI
0390: 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a  ON_NUMBER; }../*
03a0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
03b0: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f  wing function po
03c0: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
03d0: 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49  L and if.** SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
03f0: 45 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  E is enabled, th
0400: 65 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63  en messages desc
0410: 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63  ribing.** I/O ac
0420: 74 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e  tive are written
0430: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0440: 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73  tion.  These mes
0450: 73 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74  sages.** are int
0460: 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67  ended for debugg
0470: 69 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c  ing activity onl
0480: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c  y..*/.void (*sql
0490: 69 74 65 33 5f 69 6f 5f 74 72 61 63 65 29 28 63  ite3_io_trace)(c
04a0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29  onst char*, ...)
04b0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   = 0;../*.** If 
04c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  the following gl
04d0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f  obal variable po
04e0: 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67  ints to a string
04f0: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
0500: 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
0510: 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20  tory, then that 
0520: 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62  directory will b
0530: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
0540: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
0550: 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  es..**.** See al
0560: 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20 74  so the "PRAGMA t
0570: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
0580: 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ory" SQL command
0590: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
05a0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
05b0: 79 20 3d 20 30 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54  y = 0;.../*.** T
05c0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
05d0: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
05e0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e  ction named "BIN
05f0: 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c  ARY" which is al
0600: 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  ways.** availabl
0610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0620: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20   binCollFunc(.  
0630: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
0640: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
0650: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
0660: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
0670: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
0680: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
0690: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
06a0: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
06b0: 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
06c0: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
06d0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
06e0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
06f0: 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
0700: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
0710: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
0720: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
0730: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
0740: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
0750: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
0760: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
0770: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
0780: 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f  ndependant.** co
0790: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
07a0: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
07b0: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
07c0: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
07d0: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
07e0: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
07f0: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
0800: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
0810: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
0820: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
0830: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
0840: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
0860: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
0870: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
0880: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
0890: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
08a0: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
08b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
08c0: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
08d0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
08e0: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
08f0: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
0900: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
0910: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
0920: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 69 66  ey1:nKey2);.  if
0930: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
0940: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
0950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
0960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0970: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
0980: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
0990: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
09a0: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
09b0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
09c0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
09d0: 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  urn db->lastRowi
09e0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
09f0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
0a00: 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
0a10: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
0a20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
0a30: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
0a40: 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  e3_changes(sqlit
0a50: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
0a60: 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d  n db->nChange;.}
0a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0a80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
0a90: 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64  nges since the d
0aa0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
0ab0: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e  as opened..*/.in
0ac0: 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  t sqlite3_total_
0ad0: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
0ae0: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
0af0: 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b  b->nTotalChange;
0b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
0b10: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
0b20: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69  te database.*/.i
0b30: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
0b40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0b50: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
0b60: 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64  int j;..  if( !d
0b70: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
0b80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
0b90: 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
0ba0: 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20  tyCheck(db) ){. 
0bb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0bc0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
0bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
0be0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
0bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
0c00: 45 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  E.  {.    extern
0c10: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65   void sqlite3Sse
0c20: 43 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a  Cleanup(sqlite3*
0c30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73  );.    sqlite3Ss
0c40: 65 43 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20  eCleanup(db);.  
0c50: 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c  }.#endif ..  sql
0c60: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
0c70: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
0c80: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
0c90: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
0ca0: 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61  the ResetInterna
0cb0: 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61  lSchema() call a
0cc0: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
0cd0: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
0ce0: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
0cf0: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
0d00: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
0d10: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
0d20: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
0d30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
0d40: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
0d50: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
0d60: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
0d70: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
0d80: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
0d90: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
0da0: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
0db0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
0dc0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
0dd0: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
0de0: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
0df0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
0e00: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
0e10: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
0e20: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
0e30: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
0e40: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73   outstanding VMs
0e50: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
0e60: 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64  BUSY. */.  if( d
0e70: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
0e80: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
0e90: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
0ea0: 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
0eb0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
0ec0: 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65  nfinalised state
0ed0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 72 65 74  ments");.    ret
0ee0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
0ef0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
0f00: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
0f10: 63 6b 28 64 62 29 20 29 3b 0a 0a 20 20 2f 2a 20  ck(db) );..  /* 
0f20: 46 49 58 20 4d 45 3a 20 64 62 2d 3e 6d 61 67 69  FIX ME: db->magi
0f30: 63 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  c may be set to 
0f40: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
0f50: 53 45 44 20 69 66 20 74 68 65 20 64 61 74 61 62  SED if the datab
0f60: 61 73 65 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  ase.  ** cannot 
0f70: 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 73 6f  be opened for so
0f80: 6d 65 20 72 65 61 73 6f 6e 2e 20 53 6f 20 74 68  me reason. So th
0f90: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
0fa0: 20 74 6f 20 72 75 6e 20 69 6e 0a 20 20 2a 2a 20   to run in.  ** 
0fb0: 74 68 61 74 20 63 61 73 65 2e 20 42 75 74 20 6d  that case. But m
0fc0: 61 79 62 65 20 74 68 65 72 65 20 73 68 6f 75 6c  aybe there shoul
0fd0: 64 20 62 65 20 61 6e 20 65 78 74 72 61 20 6d 61  d be an extra ma
0fe0: 67 69 63 20 76 61 6c 75 65 20 66 6f 72 20 74 68  gic value for th
0ff0: 65 0a 20 20 2a 2a 20 22 66 61 69 6c 65 64 20 74  e.  ** "failed t
1000: 6f 20 6f 70 65 6e 22 20 73 74 61 74 65 2e 0a 20  o open" state.. 
1010: 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 43   **.  ** TODO: C
1020: 6f 76 65 72 61 67 65 20 74 65 73 74 73 20 64 6f  overage tests do
1030: 20 6e 6f 74 20 74 65 73 74 20 74 68 65 20 63 61   not test the ca
1040: 73 65 20 77 68 65 72 65 20 74 68 69 73 20 63 6f  se where this co
1050: 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  ndition is.  ** 
1060: 74 72 75 65 2e 20 49 74 27 73 20 68 61 72 64 20  true. It's hard 
1070: 74 6f 20 73 65 65 20 68 6f 77 20 74 6f 20 63 61  to see how to ca
1080: 75 73 65 20 69 74 20 77 69 74 68 6f 75 74 20 6d  use it without m
1090: 65 73 73 69 6e 67 20 77 69 74 68 20 74 68 72 65  essing with thre
10a0: 61 64 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ads..  */.  if( 
10b0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
10c0: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 20 26  E_MAGIC_CLOSED &
10d0: 26 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  & sqlite3SafetyO
10e0: 6e 28 64 62 29 20 29 7b 0a 20 20 20 20 2f 2a 20  n(db) ){.    /* 
10f0: 70 72 69 6e 74 66 28 22 44 49 44 20 4e 4f 54 20  printf("DID NOT 
1100: 43 4c 4f 53 45 5c 6e 22 29 3b 20 66 66 6c 75 73  CLOSE\n"); fflus
1110: 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
1120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1130: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f  ERROR;.  }..  fo
1140: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
1150: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
1160: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
1170: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
1180: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
1190: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11a0: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
11b0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
11c0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
11d0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
11e0: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
11f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65   }.  sqlite3Rese
1210: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1220: 64 62 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  db, 0);.  assert
1230: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
1240: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1250: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
1260: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69   );.  for(i=sqli
1270: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
1280: 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71  >aFunc); i; i=sq
1290: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
12a0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
12b0: 46 75 6e 63 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  Func, *pNext;.  
12c0: 20 20 66 6f 72 28 70 46 75 6e 63 20 3d 20 28 46    for(pFunc = (F
12d0: 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61  uncDef*)sqliteHa
12e0: 73 68 44 61 74 61 28 69 29 3b 20 70 46 75 6e 63  shData(i); pFunc
12f0: 3b 20 70 46 75 6e 63 3d 70 4e 65 78 74 29 7b 0a  ; pFunc=pNext){.
1300: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 46        pNext = pF
1310: 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  unc->pNext;.    
1320: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1330: 46 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Func);.    }.  }
1340: 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
1350: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
1360: 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73  CollSeq); i; i=s
1370: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
1380: 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
1390: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
13a0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
13b0: 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76  a(i);.    /* Inv
13c0: 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74  oke any destruct
13d0: 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66  ors registered f
13e0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
13f0: 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e  uence user data.
1400: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
1410: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
1420: 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78    if( pColl[j].x
1430: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Del ){.        p
1440: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f  Coll[j].xDel(pCo
1450: 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20  ll[j].pUser);.  
1460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1470: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
1480: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
1490: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
14a0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
14b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
14d0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
14e0: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
14f0: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
1500: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
1510: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
1520: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
1530: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
1540: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
1550: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
1560: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
1570: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
1580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1590: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
15a0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
15b0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
15c0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 48 61  dif..  sqlite3Ha
15d0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
15e0: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  nc);.  sqlite3Er
15f0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
1600: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
1610: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
1620: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
1630: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
1640: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1650: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
1660: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
1670: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
1680: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
1690: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
16a0: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
16b0: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
16c0: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
16d0: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
16e0: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
16f0: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
1700: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
1710: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
1720: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
1730: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
1740: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
1750: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1760: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
1770: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
1780: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
1790: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
17a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
17b0: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
17c0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
17d0: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
17e0: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
17f0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
1800: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
1810: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
1820: 6c 65 61 73 65 28 64 62 2d 3e 70 56 66 73 29 3b  lease(db->pVfs);
1830: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1840: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1850: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1860: 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65  ex_free(db->mute
1870: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  x);.  sqlite3_fr
1880: 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ee(db);.  return
1890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18a0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
18b0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
18c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18d0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
18e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
18f0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
1900: 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
1910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1920: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
1930: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1940: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1950: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
1960: 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66  .pBt ){.      if
1970: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1980: 49 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  InTrans(db->aDb[
1990: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20  i].pBt) ){.     
19a0: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a     inTrans = 1;.
19b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19c0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
19d0: 63 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  ck(db->aDb[i].pB
19e0: 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  t);.      db->aD
19f0: 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30  b[i].inTrans = 0
1a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1a10: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
1a20: 6b 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  k(db);.  if( db-
1a30: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
1a40: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
1a50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
1a60: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
1a70: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
1a80: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
1a90: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
1aa0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1ab0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
1ac0: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
1ad0: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
1ae0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
1af0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
1b00: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
1b10: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
1b20: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
1b30: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
1b40: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
1b50: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
1b60: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
1b70: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  ic string that d
1b80: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
1b90: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
1ba0: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
1bb0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
1bc0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
1bd0: 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrStr(int rc){. 
1be0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1bf0: 20 20 73 77 69 74 63 68 28 20 72 63 20 26 20 30    switch( rc & 0
1c00: 78 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  xff ){.    case 
1c10: 53 51 4c 49 54 45 5f 52 4f 57 3a 0a 20 20 20 20  SQLITE_ROW:.    
1c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
1c30: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1c40: 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a 20  E_OK:         z 
1c50: 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22  = "not an error"
1c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c70: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1c80: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1c90: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 20  E_ERROR:      z 
1ca0: 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  = "SQL logic err
1cb0: 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61  or or missing da
1cc0: 74 61 62 61 73 65 22 3b 20 20 20 62 72 65 61 6b  tabase";   break
1cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1ce0: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 20  E_PERM:       z 
1cf0: 3d 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  = "access permis
1d00: 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20  sion denied";   
1d10: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1d20: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1d30: 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a 20  E_ABORT:      z 
1d40: 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  = "callback requ
1d50: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
1d60: 74 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  t";        break
1d70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1d80: 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 7a 20  E_BUSY:       z 
1d90: 3d 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c  = "database is l
1da0: 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20  ocked";         
1db0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1dc0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1dd0: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 7a 20  E_LOCKED:     z 
1de0: 3d 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  = "database tabl
1df0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20  e is locked";   
1e00: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e10: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1e20: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 20  E_NOMEM:      z 
1e30: 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  = "out of memory
1e40: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
1e50: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1e70: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 20  E_READONLY:   z 
1e80: 3d 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  = "attempt to wr
1e90: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
1ea0: 61 74 61 62 61 73 65 22 3b 20 20 62 72 65 61 6b  atabase";  break
1eb0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1ec0: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 20  E_INTERRUPT:  z 
1ed0: 3d 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 3b  = "interrupted";
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1f00: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1f10: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 20  E_IOERR:      z 
1f20: 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  = "disk I/O erro
1f30: 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r";             
1f40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1f50: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1f60: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 20  E_CORRUPT:    z 
1f70: 3d 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  = "database disk
1f80: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
1f90: 6d 65 64 22 3b 20 20 20 20 20 20 62 72 65 61 6b  med";      break
1fa0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1fb0: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a 20  E_FULL:       z 
1fc0: 3d 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  = "database or d
1fd0: 69 73 6b 20 69 73 20 66 75 6c 6c 22 3b 20 20 20  isk is full";   
1fe0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1ff0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2000: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 20  E_CANTOPEN:   z 
2010: 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  = "unable to ope
2020: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
2030: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
2040: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2050: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 7a 20  E_EMPTY:      z 
2060: 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  = "table contain
2070: 73 20 6e 6f 20 64 61 74 61 22 3b 20 20 20 20 20  s no data";     
2080: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2090: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
20a0: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 20  E_SCHEMA:     z 
20b0: 3d 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  = "database sche
20c0: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 3b  ma has changed";
20d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
20e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
20f0: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a 20  E_TOOBIG:     z 
2100: 3d 20 22 53 74 72 69 6e 67 20 6f 72 20 42 4c 4f  = "String or BLO
2110: 42 20 65 78 63 65 65 64 65 64 20 73 69 7a 65 20  B exceeded size 
2120: 6c 69 6d 69 74 22 3b 20 20 20 20 62 72 65 61 6b  limit";    break
2130: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2140: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 20  E_CONSTRAINT: z 
2150: 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  = "constraint fa
2160: 69 6c 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  iled";          
2170: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2180: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2190: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 7a 20  E_MISMATCH:   z 
21a0: 3d 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  = "datatype mism
21b0: 61 74 63 68 22 3b 20 20 20 20 20 20 20 20 20 20  atch";          
21c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
21e0: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 7a 20  E_MISUSE:     z 
21f0: 3d 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69  = "library routi
2200: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
2210: 20 73 65 71 75 65 6e 63 65 22 3b 62 72 65 61 6b   sequence";break
2220: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2230: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a 20  E_NOLFS:      z 
2240: 3d 20 22 6b 65 72 6e 65 6c 20 6c 61 63 6b 73 20  = "kernel lacks 
2250: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
2260: 72 74 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  rt";       break
2270: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2280: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 7a 20  E_AUTH:       z 
2290: 3d 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  = "authorization
22a0: 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20 20 20   denied";       
22b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
22d0: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a 20  E_FORMAT:     z 
22e0: 3d 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74  = "auxiliary dat
22f0: 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72  abase format err
2300: 6f 72 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  or";       break
2310: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2320: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 7a 20  E_RANGE:      z 
2330: 3d 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d  = "bind or colum
2340: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
2350: 61 6e 67 65 22 3b 20 20 20 20 20 62 72 65 61 6b  ange";     break
2360: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2370: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 7a 20  E_NOTADB:     z 
2380: 3d 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79  = "file is encry
2390: 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
23a0: 20 64 61 74 61 62 61 73 65 22 3b 62 72 65 61 6b   database";break
23b0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20                z 
23d0: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
23e0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
23f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2400: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
2410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2420: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
2430: 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  ts a busy callba
2440: 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61  ck that sleeps a
2450: 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69  nd tries.** agai
2460: 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75  n until a timeou
2470: 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68  t value is reach
2480: 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74  ed.  The timeout
2490: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20   value is.** an 
24a0: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
24b0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70  f milliseconds p
24c0: 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20  assed in as the 
24d0: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
24e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
24f0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
2500: 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69  syCallback(. voi
2510: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
2520: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2530: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2540: 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20   int count      
2550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2560: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62  ber of times tab
2570: 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79  le has been busy
2580: 20 2a 2f 0a 29 7b 0a 23 69 66 20 4f 53 5f 57 49   */.){.#if OS_WI
2590: 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41  N || (defined(HA
25a0: 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
25b0: 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61  VE_USLEEP).  sta
25c0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c  tic const u8 del
25d0: 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31  ays[] =.     { 1
25e0: 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20  , 2, 5, 10, 15, 
25f0: 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c  20, 25, 25,  25,
2600: 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d    50,  50, 100 }
2610: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2620: 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20   u8 totals[] =. 
2630: 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20      { 0, 1, 3,  
2640: 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37  8, 18, 33, 53, 7
2650: 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38  8, 103, 128, 178
2660: 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e  , 228 };.# defin
2670: 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66  e NDELAY (sizeof
2680: 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28  (delays)/sizeof(
2690: 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71  delays[0])).  sq
26a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
26b0: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
26c0: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
26d0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
26e0: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
26f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
2700: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
2710: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
2720: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
2730: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
2740: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
2750: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
2760: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
2770: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
2780: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
2790: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
27a0: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
27b0: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
27c0: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
27d0: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
27e0: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
27f0: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
2800: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
2810: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
2820: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
2830: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
2840: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
2850: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
2860: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
2870: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
2880: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
2890: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
28a0: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
28b0: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
28c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
28d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
28e0: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
28f0: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
2900: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
2910: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
2920: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
2930: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
2940: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2950: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
2960: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
2970: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
2980: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2990: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
29a0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
29b0: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
29c0: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
29d0: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
29e0: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
29f0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
2a00: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
2a10: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
2a20: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
2a30: 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  c;.  if( p==0 ||
2a40: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
2a50: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
2a60: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
2a70: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
2a80: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
2a90: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
2aa0: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
2ab0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
2ac0: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
2ad0: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
2ae0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2af0: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
2b00: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
2b10: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
2b20: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
2b30: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
2b40: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
2b50: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
2b60: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
2b70: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
2b80: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
2b90: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
2ba0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
2bb0: 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
2bc0: 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20  yCheck(db) ){.  
2bd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2be0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
2bf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2c00: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
2c10: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
2c20: 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20  xFunc = xBusy;. 
2c30: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
2c40: 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  .pArg = pArg;.  
2c50: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
2c60: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c  nBusy = 0;.  sql
2c70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2c80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
2c90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ca0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2cb0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
2cc0: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
2cd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2ce0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
2cf0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
2d00: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
2d10: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
2d20: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
2d30: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2d40: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
2d50: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
2d60: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
2d70: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
2d80: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
2d90: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
2da0: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
2db0: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
2dc0: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
2dd0: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
2de0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
2df0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
2e00: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 29  afetyCheck(db) )
2e10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
2e20: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2e30: 74 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f  tex);.    if( nO
2e40: 70 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 64 62  ps>0 ){.      db
2e50: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
2e60: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 64  rogress;.      d
2e70: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
2e80: 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 20 20 64 62  = nOps;.      db
2e90: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
2ea0: 20 70 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65   pArg;.    }else
2eb0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 50 72 6f  {.      db->xPro
2ec0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20  gress = 0;.     
2ed0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
2ee0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 62 2d  s = 0;.      db-
2ef0: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
2f00: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
2f10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2f20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
2f30: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2f40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2f50: 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c  nstalls a defaul
2f60: 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74  t busy handler t
2f70: 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68  hat waits for th
2f80: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e  e.** specified n
2f90: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
2fa0: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74  conds before ret
2fb0: 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74  urning 0..*/.int
2fc0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
2fd0: 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64  meout(sqlite3 *d
2fe0: 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66  b, int ms){.  if
2ff0: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
3000: 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  heck(db) ){.    
3010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
3020: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  SUSE;.  }.  if( 
3030: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ms>0 ){.    db->
3040: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
3050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
3060: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73  sy_handler(db, s
3070: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
3080: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a  Callback, (void*
3090: 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )db);.  }else{. 
30a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
30b0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
30c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
30d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
30e0: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
30f0: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
3100: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
3110: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
3120: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
3130: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
3140: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
3150: 66 28 20 64 62 20 26 26 20 28 64 62 2d 3e 6d 61  f( db && (db->ma
3160: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
3170: 43 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61  C_OPEN || db->ma
3180: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
3190: 43 5f 42 55 53 59 29 20 29 7b 0a 20 20 20 20 64  C_BUSY) ){.    d
31a0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
31b0: 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ted = 1;.  }.}..
31c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
31d0: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
31e0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
31f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
3200: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
3210: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
3220: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
3230: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
3240: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
3250: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
3260: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
3270: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
3280: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
3290: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
32a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
32b0: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
32c0: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
32d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
32e0: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
32f0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
3300: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
3310: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
3320: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
3330: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
3340: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
3350: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3360: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
3370: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
3380: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
3390: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
33a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
33b0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
33c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
33d0: 74 2a 29 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66  t*).){.  FuncDef
33e0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65   *p;.  int nName
33f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
3400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3410: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
3420: 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
3430: 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20  yCheck(db) ){.  
3440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3450: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66  MISUSE;.  }.  if
3460: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
3470: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
3480: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
3490: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
34a0: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
34b0: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
34c0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
34d0: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
34e0: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
34f0: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
3500: 41 72 67 3e 31 32 37 29 20 7c 7c 0a 20 20 20 20  Arg>127) ||.    
3510: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
3520: 73 74 72 6c 65 6e 28 7a 46 75 6e 63 74 69 6f 6e  strlen(zFunction
3530: 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 73  Name))) ){.    s
3540: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
3550: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 62  SQLITE_ERROR, "b
3560: 61 64 20 70 61 72 61 6d 65 74 65 72 73 22 29 3b  ad parameters");
3570: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3580: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
3590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35a0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
35b0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
35c0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
35d0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
35e0: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
35f0: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
3600: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
3610: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
3620: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
3630: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
3640: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
3650: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
3660: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
3670: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
3680: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
3690: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
36a0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
36b0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
36c0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
36d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
36e0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
36f0: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
3700: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
3710: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
3720: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
3730: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
3740: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
3750: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
3760: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
3770: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
3780: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
3790: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
37a0: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
37b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
37e0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
37f0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
3800: 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  6LE,.          p
3810: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
3820: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
3830: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
3840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
3860: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
3870: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
3880: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
3890: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
38a0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
38b0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
38c0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
38d0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
38e0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
38f0: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
3900: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
3910: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
3920: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
3930: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
3940: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
3950: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
3960: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
3970: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
3980: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
3990: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
39a0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
39b0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
39c0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
39d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
39e0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
39f0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
3a00: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a   nArg, enc, 0);.
3a10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50    if( p && p->iP
3a20: 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70  refEnc==enc && p
3a30: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
3a40: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69      if( db->acti
3a50: 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20  veVdbeCnt ){.   
3a60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
3a70: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
3a80: 20 0a 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c   .        "Unabl
3a90: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
3aa0: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
3ab0: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
3ac0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
3ad0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
3ae0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
3b00: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
3b10: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
3b20: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
3b30: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
3b40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
3b50: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
3b60: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
3b70: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
3b80: 41 72 67 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Arg, enc, 1);.  
3b90: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e  if( p ){.    p->
3ba0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  flags = 0;.    p
3bb0: 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b  ->xFunc = xFunc;
3bc0: 0a 20 20 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  .    p->xStep = 
3bd0: 78 53 74 65 70 3b 0a 20 20 20 20 70 2d 3e 78 46  xStep;.    p->xF
3be0: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
3bf0: 3b 0a 20 20 20 20 70 2d 3e 70 55 73 65 72 44 61  ;.    p->pUserDa
3c00: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
3c10: 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41      p->nArg = nA
3c20: 72 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rg;.  }.  return
3c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3c40: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
3c50: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
3c60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3c70: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
3c80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
3ca0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
3cb0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
3cc0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
3cd0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
3ce0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
3cf0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
3d00: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
3d10: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
3d20: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
3d30: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
3d40: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
3d50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
3d60: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
3d70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3d80: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
3d90: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
3da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3db0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
3dc0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
3dd0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
3de0: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
3df0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a  xStep, xFinal);.
3e00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
3e10: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
3e20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3e30: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
3e40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3e60: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
3e70: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3e80: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
3e90: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
3ea0: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
3eb0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
3ec0: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
3ed0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
3ee0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
3ef0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
3f00: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
3f10: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
3f20: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
3f30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
3f40: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
3f50: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
3f60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
3f70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3f80: 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c  r *zFunc8;.  sql
3f90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
3fa0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
3fb0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
3fc0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
3fd0: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
3fe0: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
3ff0: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  tionName, -1);. 
4000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
4010: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
4020: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
4030: 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  ep, p, xFunc, xS
4040: 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20  tep, xFinal);.  
4050: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
4060: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
4070: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
4080: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
4090: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
40a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
40b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
40c0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
40d0: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
40e0: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
40f0: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
4100: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
4110: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
4120: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
4130: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
4140: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
4150: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4160: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
4170: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
4180: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
4190: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
41a0: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
41b0: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
41c0: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
41d0: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
41e0: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
41f0: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
4200: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
4210: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
4220: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
4230: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4240: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
4250: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
4260: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
4270: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
4280: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
4290: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
42a0: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
42b0: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
42c0: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
42d0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
42e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
42f0: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
4300: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  int nName = strl
4310: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74  en(zName);.  int
4320: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
4330: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
4340: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
4350: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
4360: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
4370: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
4380: 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  UTF8, 0)==0 ){. 
4390: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
43a0: 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  Func(db, zName, 
43b0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
43c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
43d0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
43e0: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
43f0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  on, 0, 0);.  }. 
4400: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
4410: 45 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  Exit(db, SQLITE_
4420: 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  OK);.  sqlite3_m
4430: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4440: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4450: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
4460: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4470: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
4480: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
4490: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
44a0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
44b0: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
44c0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
44d0: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
44e0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
44f0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
4500: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
4510: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
4520: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
4530: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
4540: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
4550: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
4560: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
4570: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
4580: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
4590: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
45a0: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
45b0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
45c0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
45d0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
45e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
45f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
4600: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
4610: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
4620: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
4630: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
4640: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
4650: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
4660: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
4670: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
4680: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
4690: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
46a0: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
46b0: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
46c0: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
46d0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
46e0: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
46f0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
4700: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
4710: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
4720: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
4730: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
4740: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4750: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
4760: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
4770: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4780: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
4790: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
47a0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
47b0: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
47c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
47d0: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
47e0: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
47f0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
4800: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
4810: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
4820: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4830: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
4840: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
4850: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
4860: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
4870: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
4880: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
4890: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
48a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
48b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
48c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
48d0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
48e0: 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d  */../*** EXPERIM
48f0: 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ENTAL ***.**.** 
4900: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
4910: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
4920: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
4930: 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a  tion comments..*
4940: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
4950: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4960: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
4970: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
4980: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
4990: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
49a0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
49b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
49e0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
49f0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
4a00: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
4a10: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
4a20: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
4a30: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
4a40: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
4a50: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
4a60: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
4a70: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
4a80: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
4a90: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
4aa0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
4ab0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
4ac0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
4ad0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
4ae0: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
4af0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
4b00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4b10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
4b20: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
4b30: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
4b40: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
4b50: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
4b60: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
4b70: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
4b80: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
4b90: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
4ba0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4bb0: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
4bc0: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
4bd0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
4be0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
4bf0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
4c00: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
4c10: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
4c20: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
4c30: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
4c40: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
4c50: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c70: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
4c80: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
4c90: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
4ca0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4cb0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
4cc0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
4cd0: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
4ce0: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
4cf0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
4d00: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
4d10: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
4d20: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4d30: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4d40: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
4d50: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
4d60: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
4d70: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
4d80: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
4d90: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
4da0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
4db0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4dc0: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
4dd0: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
4de0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
4df0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
4e00: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
4e10: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
4e20: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
4e30: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
4e40: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
4e50: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
4e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4e70: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
4e80: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
4e90: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
4ea0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
4eb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
4ec0: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
4ed0: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
4ee0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
4ef0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
4f00: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
4f10: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
4f20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4f30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4f40: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
4f50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4f60: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
4f70: 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  te a connection 
4f80: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 42 54  to a database BT
4f90: 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20  ree.** driver.  
4fa0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
4fb0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69  the name of a fi
4fc0: 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69  le, then that fi
4fd0: 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20  le is.** opened 
4fe0: 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46  and used.  If zF
4ff0: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d  ilename is the m
5000: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
5010: 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ry:" then.** the
5020: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
5030: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61  red in memory (a
5040: 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f  nd is thus forgo
5050: 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a  tten as soon as.
5060: 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
5070: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49  n is closed.)  I
5080: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
5090: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ULL then the dat
50a0: 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76  abase.** is a "v
50b0: 69 72 74 75 61 6c 22 20 64 61 74 61 62 61 73 65  irtual" database
50c0: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75   for transient u
50d0: 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64  se only and is d
50e0: 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f  eleted as.** soo
50f0: 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  n as the connect
5100: 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  ion is closed..*
5110: 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64  *.** A virtual d
5120: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 65  atabase can be e
5130: 69 74 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c  ither a disk fil
5140: 65 20 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d  e (that is autom
5150: 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65  atically.** dele
5160: 74 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c  ted when the fil
5170: 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20  e is closed) or 
5180: 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e  it an be held en
5190: 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  tirely in memory
51a0: 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  ,.** depending o
51b0: 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  n the values of 
51c0: 74 68 65 20 54 45 4d 50 5f 53 54 4f 52 45 20 63  the TEMP_STORE c
51d0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72  ompile-time macr
51e0: 6f 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d  o and the.** db-
51f0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 76 61 72 69  >temp_store vari
5200: 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20  able, according 
5210: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
5220: 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   chart:.**.**   
5230: 20 20 20 20 54 45 4d 50 5f 53 54 4f 52 45 20 20      TEMP_STORE  
5240: 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
5250: 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
5260: 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
5270: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 2d 2d  base.**       --
5280: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
52c0: 2a 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  *           0   
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
52f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31 20  .**           1 
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
5320: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
5330: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
5340: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
5350: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  memory.**       
5360: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
5370: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
5380: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20      file.**     
5390: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
53a0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
53b0: 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20        file.**   
53c0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
53d0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
53e0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
53f0: 2a 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20  *           2   
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
5420: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
5430: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
5440: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
5450: 6d 65 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71  memory.*/.int sq
5460: 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
5470: 79 28 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  y(.  const sqlit
5480: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
5490: 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * Main database 
54a0: 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78  when opening aux
54b0: 20 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a   otherwise 0 */.
54c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
54d0: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e  ilename,    /* N
54e0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
54f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
5500: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
5510: 0a 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e  .  int omitJourn
5520: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
5530: 69 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20  if TRUE then do 
5540: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  not journal this
5550: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
5560: 43 61 63 68 65 2c 20 20 20 20 20 20 20 20 20 20  Cache,          
5570: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79       /* How many
5580: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
5590: 67 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 42 74  ge cache */.  Bt
55a0: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20  ree **ppBtree   
55b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
55c0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
55d0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
55e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
55f0: 62 74 72 65 65 5f 66 6c 61 67 73 20 3d 20 30 3b  btree_flags = 0;
5600: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20  .  int rc;.  .  
5610: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5620: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
5630: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5640: 74 28 20 70 70 42 74 72 65 65 20 21 3d 20 30 29  t( ppBtree != 0)
5650: 3b 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72  ;.  if( omitJour
5660: 6e 61 6c 20 29 7b 0a 20 20 20 20 62 74 72 65 65  nal ){.    btree
5670: 5f 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f  _flags |= BTREE_
5680: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  OMIT_JOURNAL;.  
5690: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  }.  if( db->flag
56a0: 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  s & SQLITE_NoRea
56b0: 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 62 74 72  dlock ){.    btr
56c0: 65 65 5f 66 6c 61 67 73 20 7c 3d 20 42 54 52 45  ee_flags |= BTRE
56d0: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  E_NO_READLOCK;. 
56e0: 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61   }.  if( zFilena
56f0: 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 20 54 45 4d  me==0 ){.#if TEM
5700: 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 2f  P_STORE==0.    /
5710: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
5720: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
5730: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5740: 59 44 42 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f  YDB.#if TEMP_STO
5750: 52 45 3d 3d 31 0a 20 20 20 20 69 66 28 20 64 62  RE==1.    if( db
5760: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
5770: 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a  ) zFilename = ":
5780: 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66  memory:";.#endif
5790: 0a 23 69 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d  .#if TEMP_STORE=
57a0: 3d 32 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 74  =2.    if( db->t
57b0: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 20 7a  emp_store!=1 ) z
57c0: 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
57d0: 6f 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69  ory:";.#endif.#i
57e0: 66 20 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  f TEMP_STORE==3.
57f0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
5800: 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6e 64  ":memory:";.#end
5810: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
5820: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
5830: 42 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  B */.  }..  rc =
5840: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
5850: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71  n(zFilename, (sq
5860: 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74  lite3 *)db, ppBt
5870: 72 65 65 2c 20 62 74 72 65 65 5f 66 6c 61 67 73  ree, btree_flags
5880: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
5890: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
58a0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
58b0: 79 48 61 6e 64 6c 65 72 28 2a 70 70 42 74 72 65  yHandler(*ppBtre
58c0: 65 2c 20 28 76 6f 69 64 2a 29 26 64 62 2d 3e 62  e, (void*)&db->b
58d0: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20  usyHandler);.   
58e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
58f0: 43 61 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72  CacheSize(*ppBtr
5900: 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d  ee, nCache);.  }
5910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5920: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
5930: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
5940: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
5950: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
5960: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
5970: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
5980: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
5990: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
59a0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
59b0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
59c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
59d0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
59e0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 73 71  NOMEM);.  }.  sq
59f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5a00: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
5a10: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
5a20: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5a30: 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
5a40: 43 68 65 63 6b 28 64 62 29 20 7c 7c 20 64 62 2d  Check(db) || db-
5a50: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
5a60: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 72  _MISUSE ){.    r
5a70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
5a80: 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
5a90: 45 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  E);.  }.  z = (c
5aa0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5ab0: 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
5ac0: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  );.  if( z==0 ){
5ad0: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
5ae0: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
5af0: 64 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  de);.  }.  sqlit
5b00: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
5b10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
5b20: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
5b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
5b40: 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
5b50: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
5b60: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
5b70: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
5b80: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
5b90: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
5ba0: 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
5bb0: 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
5bc0: 33 20 2a 64 62 29 7b 0a 20 20 2f 2a 20 42 65 63  3 *db){.  /* Bec
5bd0: 61 75 73 65 20 61 6c 6c 20 74 68 65 20 63 68 61  ause all the cha
5be0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
5bf0: 74 72 69 6e 67 20 61 72 65 20 69 6e 20 74 68 65  tring are in the
5c00: 20 75 6e 69 63 6f 64 65 0a 20 20 2a 2a 20 72 61   unicode.  ** ra
5c10: 6e 67 65 20 30 78 30 30 2d 30 78 46 46 2c 20 69  nge 0x00-0xFF, i
5c20: 66 20 77 65 20 70 61 64 20 74 68 65 20 62 69 67  f we pad the big
5c30: 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20 77  -endian string w
5c40: 69 74 68 20 61 20 0a 20 20 2a 2a 20 7a 65 72 6f  ith a .  ** zero
5c50: 20 62 79 74 65 2c 20 77 65 20 63 61 6e 20 6f 62   byte, we can ob
5c60: 74 61 69 6e 20 74 68 65 20 6c 69 74 74 6c 65 2d  tain the little-
5c70: 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 20 77 69  endian string wi
5c80: 74 68 0a 20 20 2a 2a 20 26 62 69 67 5f 65 6e 64  th.  ** &big_end
5c90: 69 61 6e 5b 31 5d 2e 0a 20 20 2a 2f 0a 20 20 73  ian[1]..  */.  s
5ca0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5cb0: 20 6f 75 74 4f 66 4d 65 6d 42 65 5b 5d 20 3d 20   outOfMemBe[] = 
5cc0: 7b 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c  {.    0, 'o', 0,
5cd0: 20 27 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c   'u', 0, 't', 0,
5ce0: 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f   ' ', .    0, 'o
5cf0: 27 2c 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20  ', 0, 'f', 0, ' 
5d00: 27 2c 20 0a 20 20 20 20 30 2c 20 27 6d 27 2c 20  ', .    0, 'm', 
5d10: 30 2c 20 27 65 27 2c 20 30 2c 20 27 6d 27 2c 20  0, 'e', 0, 'm', 
5d20: 30 2c 20 27 6f 27 2c 20 30 2c 20 27 72 27 2c 20  0, 'o', 0, 'r', 
5d30: 30 2c 20 27 79 27 2c 20 30 2c 20 30 2c 20 30 0a  0, 'y', 0, 0, 0.
5d40: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
5d50: 6e 73 74 20 63 68 61 72 20 6d 69 73 75 73 65 42  nst char misuseB
5d60: 65 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  e [] = {.    0, 
5d70: 27 6c 27 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20  'l', 0, 'i', 0, 
5d80: 27 62 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20  'b', 0, 'r', 0, 
5d90: 27 61 27 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20  'a', 0, 'r', 0, 
5da0: 27 79 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  'y', 0, ' ', .  
5db0: 20 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 6f 27    0, 'r', 0, 'o'
5dc0: 2c 20 30 2c 20 27 75 27 2c 20 30 2c 20 27 74 27  , 0, 'u', 0, 't'
5dd0: 2c 20 30 2c 20 27 69 27 2c 20 30 2c 20 27 6e 27  , 0, 'i', 0, 'n'
5de0: 2c 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 20 27  , 0, 'e', 0, ' '
5df0: 2c 20 0a 20 20 20 20 30 2c 20 27 63 27 2c 20 30  , .    0, 'c', 0
5e00: 2c 20 27 61 27 2c 20 30 2c 20 27 6c 27 2c 20 30  , 'a', 0, 'l', 0
5e10: 2c 20 27 6c 27 2c 20 30 2c 20 27 65 27 2c 20 30  , 'l', 0, 'e', 0
5e20: 2c 20 27 64 27 2c 20 30 2c 20 27 20 27 2c 20 0a  , 'd', 0, ' ', .
5e30: 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27      0, 'o', 0, '
5e40: 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20 27  u', 0, 't', 0, '
5e50: 20 27 2c 20 0a 20 20 20 20 30 2c 20 27 6f 27 2c   ', .    0, 'o',
5e60: 20 30 2c 20 27 66 27 2c 20 30 2c 20 27 20 27 2c   0, 'f', 0, ' ',
5e70: 20 0a 20 20 20 20 30 2c 20 27 73 27 2c 20 30 2c   .    0, 's', 0,
5e80: 20 27 65 27 2c 20 30 2c 20 27 71 27 2c 20 30 2c   'e', 0, 'q', 0,
5e90: 20 27 75 27 2c 20 30 2c 20 27 65 27 2c 20 30 2c   'u', 0, 'e', 0,
5ea0: 20 27 6e 27 2c 20 30 2c 20 27 63 27 2c 20 30 2c   'n', 0, 'c', 0,
5eb0: 20 27 65 27 2c 20 30 2c 20 30 2c 20 30 0a 20 20   'e', 0, 0, 0.  
5ec0: 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
5ed0: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
5ee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
5ef0: 69 64 20 2a 29 28 26 6f 75 74 4f 66 4d 65 6d 42  id *)(&outOfMemB
5f00: 65 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  e[SQLITE_UTF16NA
5f10: 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46  TIVE==SQLITE_UTF
5f20: 31 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a  16LE?1:0]);.  }.
5f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
5f40: 65 74 79 43 68 65 63 6b 28 64 62 29 20 7c 7c 20  etyCheck(db) || 
5f50: 64 62 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  db->errCode==SQL
5f60: 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20  ITE_MISUSE ){.  
5f70: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
5f80: 29 28 26 6d 69 73 75 73 65 42 65 5b 53 51 4c 49  )(&misuseBe[SQLI
5f90: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d  TE_UTF16NATIVE==
5fa0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f 31  SQLITE_UTF16LE?1
5fb0: 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  :0]);.  }.  sqli
5fc0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
5fd0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
5fe0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
5ff0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 20 3d  cFailed );.  z =
6000: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6010: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
6020: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
6030: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
6040: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
6050: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
6060: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
6070: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6080: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
6090: 54 49 43 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  TIC);.    z = sq
60a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
60b0: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
60c0: 7d 0a 20 20 73 71 6c 69 74 65 33 41 70 69 45 78  }.  sqlite3ApiEx
60d0: 69 74 28 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  it(0, 0);.  sqli
60e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
60f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6100: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
6110: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6120: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
6130: 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
6140: 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
6150: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
6160: 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
6170: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
6180: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
6190: 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
61a0: 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
61b0: 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
61c0: 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
61d0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
61e0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
61f0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
6200: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6210: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6220: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
6230: 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
6240: 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20  tyCheck(db) ){. 
6250: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6260: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72  _MISUSE;.  }.  r
6270: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
6280: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
6290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
62a0: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
62b0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
62c0: 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
62d0: 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
62e0: 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
62f0: 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
6300: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
6310: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
6320: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
6330: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
6340: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
6350: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
6360: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
6370: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
6380: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
6390: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
63a0: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
63b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
63c0: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 69  int enc2;.  .  i
63d0: 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
63e0: 43 68 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20  Check(db) ){.   
63f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6400: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 61 73 73  ISUSE;.  }.  ass
6410: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6420: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
6430: 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
6440: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
6450: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
6460: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
6470: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
6480: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
6490: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
64a0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
64b0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
64c0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
64d0: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
64e0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
64f0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
6500: 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 20 26 20  .  enc2 = enc & 
6510: 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
6520: 49 47 4e 45 44 3b 0a 20 20 69 66 28 20 65 6e 63  IGNED;.  if( enc
6530: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
6540: 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
6550: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6560: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 65 6e  ;.  }..  if( (en
6570: 63 32 26 7e 33 29 21 3d 30 20 29 7b 0a 20 20 20  c2&~3)!=0 ){.   
6580: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
6590: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
65a0: 22 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64 69 6e  "unknown encodin
65b0: 67 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  g");.    return 
65c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
65d0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
65e0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65   this call is re
65f0: 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63  moving or replac
6600: 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
6610: 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20  collation .  ** 
6620: 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c  sequence. If so,
6630: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
6640: 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72  ctive VMs, retur
6650: 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65  n busy. If there
6660: 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  .  ** are no act
6670: 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64  ive VMs, invalid
6680: 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70  ate any pre-comp
6690: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
66a0: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  */.  pColl = 
66b0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
66c0: 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
66d0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
66e0: 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66 28  Name), 0);.  if(
66f0: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
6700: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
6710: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
6720: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
6730: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
6740: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
6750: 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 65     "Unable to de
6760: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
6770: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
6780: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
6790: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
67a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
67b0: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
67c0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
67d0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
67e0: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  b);..    /* If c
67f0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6800: 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
6810: 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
6820: 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
6830: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6840: 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
6850: 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
6860: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
6870: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
6880: 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
6890: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
68a0: 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
68b0: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
68c0: 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
68d0: 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
68e0: 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
68f0: 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
6900: 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
6910: 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
6920: 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
6930: 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
6940: 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
6950: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
6960: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
6970: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
6980: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  lSeq, zName, str
6990: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
69a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
69b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
69c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
69d0: 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b  Seq *p = &aColl[
69e0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
69f0: 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  p->enc==pColl->e
6a00: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
6a10: 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20  if( p->xDel ){. 
6a20: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44             p->xD
6a30: 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20  el(p->pUser);.  
6a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a50: 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b      p->xCmp = 0;
6a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
6a80: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
6a90: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
6aa0: 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
6ab0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 31  strlen(zName), 1
6ac0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  );.  if( pColl )
6ad0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d  {.    pColl->xCm
6ae0: 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20  p = xCompare;.  
6af0: 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d    pColl->pUser =
6b00: 20 70 43 74 78 3b 0a 20 20 20 20 70 43 6f 6c 6c   pCtx;.    pColl
6b10: 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
6b20: 20 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20     pColl->enc = 
6b30: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
6b40: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
6b50: 45 44 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ED);.  }.  sqlit
6b60: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
6b70: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
6b80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6b90: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
6ba0: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
6bb0: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
6bc0: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
6bd0: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
6be0: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
6bf0: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
6c00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c10: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
6c20: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
6c30: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
6c40: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
6c50: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
6c60: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
6c70: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
6c80: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
6c90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
6ca0: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
6cb0: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
6cc0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
6cd0: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
6ce0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
6cf0: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
6d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6d10: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
6d20: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
6d30: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
6d40: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
6d50: 63 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  c;.  CollSeq *pC
6d60: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  oll;..  /* Alloc
6d70: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
6d80: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
6d90: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
6da0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
6db0: 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
6dc0: 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
6dd0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 64   opendb_out;.  d
6de0: 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
6df0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6e00: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
6e10: 52 53 49 56 45 29 3b 0a 20 20 69 66 28 20 64 62  RSIVE);.  if( db
6e20: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
6e30: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
6e40: 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ed = 1;.    goto
6e50: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
6e60: 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d 20 73 71  .  db->pVfs = sq
6e70: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
6e80: 56 66 73 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  Vfs);.  db->errM
6e90: 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
6ea0: 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20  ->priorNewRowid 
6eb0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  = 0;.  db->magic
6ec0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
6ed0: 42 55 53 59 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  BUSY;.  db->nDb 
6ee0: 3d 20 32 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  = 2;.  db->aDb =
6ef0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
6f00: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
6f10: 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 1;.  db->flag
6f20: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
6f30: 74 43 6f 6c 4e 61 6d 65 73 0a 23 69 66 20 53 51  tColNames.#if SQ
6f40: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
6f50: 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
6f70: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
6f80: 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
6f90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
6fa0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
6fc0: 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
6fd0: 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 20 20 20  nsion.#endif.   
6fe0: 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
6ff0: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 46 75 6e  shInit(&db->aFun
7000: 63 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  c, SQLITE_HASH_S
7010: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c  TRING, 0);.  sql
7020: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
7030: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 49  ->aCollSeq, SQLI
7040: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
7050: 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
7060: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7070: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
7080: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
7090: 75 6c 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ule, SQLITE_HASH
70a0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 23 65 6e  _STRING, 0);.#en
70b0: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
70c0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
70d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
70e0: 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
70f0: 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
7100: 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
7110: 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
7120: 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
7130: 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
7140: 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
7150: 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
7160: 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
7170: 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
7180: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
7190: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61  .  */.  if( crea
71a0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
71b0: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
71c0: 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
71d0: 6c 46 75 6e 63 2c 20 30 29 20 7c 7c 0a 20 20 20  lFunc, 0) ||.   
71e0: 20 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69     createCollati
71f0: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
7200: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
7210: 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
7220: 20 30 29 20 7c 7c 0a 20 20 20 20 20 20 63 72 65   0) ||.      cre
7230: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
7240: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
7250: 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
7260: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 20 7c 7c  nCollFunc, 0) ||
7270: 0a 20 20 20 20 20 20 28 64 62 2d 3e 70 44 66 6c  .      (db->pDfl
7280: 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  tColl = sqlite3F
7290: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
72a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e  QLITE_UTF8, "BIN
72b0: 41 52 59 22 2c 20 36 2c 20 30 29 29 3d 3d 30 20  ARY", 6, 0))==0 
72c0: 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
72d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
72e0: 65 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  ed );.    db->ma
72f0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
7300: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 20 20 67  IC_CLOSED;.    g
7310: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
7320: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61    }..  /* Also a
7330: 64 64 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d  dd a UTF-8 case-
7340: 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c  insensitive coll
7350: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
7360: 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
7370: 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45  tion(db, "NOCASE
7380: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
7390: 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  0, nocaseCollati
73a0: 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f  ngFunc, 0);..  /
73b0: 2a 20 53 65 74 20 66 6c 61 67 73 20 6f 6e 20 74  * Set flags on t
73c0: 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  he built-in coll
73d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
73e0: 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f  */.  db->pDfltCo
73f0: 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  ll->type = SQLIT
7400: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 3b 0a 20  E_COLL_BINARY;. 
7410: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7420: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
7430: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 4e 4f  SQLITE_UTF8, "NO
7440: 43 41 53 45 22 2c 20 36 2c 20 30 29 3b 0a 20 20  CASE", 6, 0);.  
7450: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
7460: 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53   pColl->type = S
7470: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53  QLITE_COLL_NOCAS
7480: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  E;.  }..  /* Ope
7490: 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
74a0: 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
74b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
74c0: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
74d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51  zFilename, 0, SQ
74e0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
74f0: 48 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  HE_SIZE,.       
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e      &db->aDb[0].
7520: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pBt);.  if( rc!=
7530: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7540: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
7550: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 64 62  , rc, 0);.    db
7560: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7570: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7580: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
7590: 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44  ut;.  }.  db->aD
75a0: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
75b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
75c0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
75d0: 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
75e0: 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
75f0: 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
7600: 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20   0);...  /* The 
7610: 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
7620: 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
7630: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
7640: 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
7650: 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
7660: 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
7670: 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
7680: 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
7690: 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
76a0: 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
76b0: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
76c0: 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
76d0: 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65 66  vel = 3;.#ifndef
76e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
76f0: 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  PDB.  db->aDb[1]
7700: 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
7710: 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
7720: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
7730: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61  #endif..  db->ma
7740: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
7750: 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
7760: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7770: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
7780: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
7790: 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
77a0: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
77b0: 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
77c0: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
77d0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
77e0: 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
77f0: 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
7800: 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
7810: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
7820: 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
7830: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
7840: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
7850: 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
7860: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
7870: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
7880: 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
7890: 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
78a0: 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
78b0: 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
78c0: 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
78d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
78e0: 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
78f0: 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 28 76  ) API..  */.  (v
7900: 6f 69 64 29 73 71 6c 69 74 65 33 41 75 74 6f 4c  oid)sqlite3AutoL
7910: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
7920: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
7930: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53 51  _errcode(db)!=SQ
7940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
7950: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
7960: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
7970: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
7980: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7990: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
79a0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
79b0: 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
79c0: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
79d0: 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
79e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
79f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7a00: 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
7a10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a20: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
7a30: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
7a40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
7a50: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
7a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7a70: 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
7a80: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
7a90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
7aa0: 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
7ab0: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
7ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7ad0: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
7ae0: 69 74 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c  ite3Fts3Init(sql
7af0: 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
7b00: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
7b10: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
7b20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7b30: 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
7b40: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
7b50: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
7b60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
7b70: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 49 63 75  n int sqlite3Icu
7b80: 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
7b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7ba0: 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
7bb0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
7bc0: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
7bd0: 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
7be0: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
7bf0: 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
7c00: 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
7c10: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
7c20: 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
7c30: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
7c40: 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
7c50: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
7c60: 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
7c70: 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
7c80: 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
7c90: 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
7ca0: 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
7cb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
7cc0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
7cd0: 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
7ce0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
7cf0: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
7d00: 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
7d10: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
7d20: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
7d30: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7d60: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
7d70: 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
7d80: 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
7d90: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
7da0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  (rc = sqlite3_er
7db0: 72 63 6f 64 65 28 64 62 29 29 20 29 7b 0a 20 20  rcode(db)) ){.  
7dc0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
7dd0: 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
7de0: 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
7df0: 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  b;.  return sqli
7e00: 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
7e10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
7e20: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
7e30: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
7e40: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
7e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
7e60: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
7e70: 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
7e80: 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
7e90: 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
7ea0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
7eb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7ec0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
7ed0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
7ee0: 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
7ef0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
7f00: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 69    const void *fi
7f10: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
7f20: 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
7f30: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
7f40: 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
7f50: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
7f60: 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
7f70: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7f90: 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
7fa0: 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
7fb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
7fc0: 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
7fd0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
7fe0: 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
7ff0: 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20  e, ppDb, flags, 
8000: 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
8010: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
8020: 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
8030: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
8040: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
8050: 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
8060: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
8070: 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
8080: 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
8090: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
80a0: 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
80b0: 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
80c0: 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
80d0: 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
80e0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
80f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8100: 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
8110: 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  ert( zFilename )
8120: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62  ;.  assert( ppDb
8130: 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b   );.  *ppDb = 0;
8140: 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
8150: 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
8160: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
8170: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
8180: 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
8190: 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
81a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
81b0: 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
81c0: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
81d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
81e0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
81f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
8200: 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
8210: 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
8240: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
8250: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
8260: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8270: 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 70 44 62  LITE_OK && *ppDb
8280: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
8290: 71 6c 69 74 65 33 5f 65 78 65 63 28 2a 70 70 44  qlite3_exec(*ppD
82a0: 62 2c 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  b, "PRAGMA encod
82b0: 69 6e 67 20 3d 20 27 55 54 46 2d 31 36 27 22 2c  ing = 'UTF-16'",
82c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
82d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
82e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
82f0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 2a 70 70 44  lite3_close(*ppD
8300: 62 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 44  b);.        *ppD
8310: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 0;.      }. 
8320: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8330: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
8340: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
8350: 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
8360: 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
8370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
8380: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
8390: 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
83a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
83b0: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
83c0: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
83d0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
83e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
83f0: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
8400: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8410: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
8420: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
8430: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
8440: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8450: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
8460: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
8470: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8480: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
84a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
84b0: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
84c0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
84d0: 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
84e0: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
84f0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
8500: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
8510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8520: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8530: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8540: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
8550: 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
8560: 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
8570: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
8580: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
8590: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
85a0: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
85b0: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
85c0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
85d0: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
85e0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
85f0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
8600: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
8610: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
8620: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
8630: 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
8640: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8650: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8660: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
8670: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8680: 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
8690: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
86a0: 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20  ame, enc, pCtx, 
86b0: 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
86c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
86d0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
86e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
86f0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8700: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8710: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8720: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
8730: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
8740: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8750: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
8760: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
8770: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8780: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
8790: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
87a0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
87b0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
87c0: 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
87d0: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
87e0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
87f0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
8800: 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
8810: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8820: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
8830: 6d 65 38 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f  me8; .  sqlite3_
8840: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8850: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
8860: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
8870: 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
8880: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
8890: 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  8(db, zName, -1)
88a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
88b0: 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
88c0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
88d0: 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43 74 78  Name8, enc, pCtx
88e0: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
88f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8900: 28 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20  (zName8);.  }.  
8910: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
8920: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
8930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8940: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8950: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
8960: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8970: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
8980: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
8990: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
89a0: 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
89b0: 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
89c0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
89d0: 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
89e0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
89f0: 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
8a00: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
8a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
8a20: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
8a30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8a40: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
8a50: 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
8a60: 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
8a70: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
8a80: 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
8a90: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 69 66 28   char*).){.  if(
8aa0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
8ab0: 65 63 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  eck(db) ){.    r
8ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
8ad0: 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USE;.  }.  sqlit
8ae0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8af0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
8b00: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
8b10: 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
8b20: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
8b30: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
8b40: 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
8b50: 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
8b60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8b70: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8b90: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8ba0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
8bb0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
8bc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8bd0: 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
8be0: 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
8bf0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
8c00: 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
8c10: 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
8c20: 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
8c30: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
8c40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8c50: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
8c60: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
8c70: 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
8c80: 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
8c90: 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
8ca0: 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
8cb0: 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
8cc0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
8cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
8ce0: 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 7b 0a  etyCheck(db) ){.
8cf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8d00: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
8d10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8d20: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8d30: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
8d40: 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
8d50: 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
8d60: 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
8d70: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
8d80: 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
8d90: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
8da0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8db0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
8dc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
8dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8de0: 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
8df0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
8e00: 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 2f 2a 0a  LOBALRECOVER./*.
8e10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8e20: 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
8e30: 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
8e40: 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
8e50: 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
8e60: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
8e70: 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
8e80: 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
8e90: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
8ea0: 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
8eb0: 72 65 63 6f 76 65 72 28 29 7b 0a 20 20 72 65 74  recover(){.  ret
8ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
8ee0: 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
8ef0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
8f00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8f10: 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
8f20: 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
8f30: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
8f40: 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
8f50: 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
8f60: 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
8f70: 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
8f80: 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
8f90: 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
8fa0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
8fb0: 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
8fc0: 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
8fd0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  LLBACK..**.*****
8fe0: 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20 45 58  ** THIS IS AN EX
8ff0: 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41  PERIMENTAL API A
9000: 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f  ND IS SUBJECT TO
9010: 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a   CHANGE ******.*
9020: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  /.int sqlite3_ge
9030: 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c  t_autocommit(sql
9040: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
9050: 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  urn db->autoComm
9060: 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  it;.}..#ifdef SQ
9070: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
9080: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
9090: 6f 75 74 69 6e 65 20 69 73 20 73 75 62 74 69 74  outine is subtit
90a0: 75 74 65 64 20 66 6f 72 20 63 6f 6e 73 74 61 6e  uted for constan
90b0: 74 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  t SQLITE_CORRUPT
90c0: 20 69 6e 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67   in.** debugging
90d0: 20 62 75 69 6c 64 73 2e 20 20 54 68 69 73 20 70   builds.  This p
90e0: 72 6f 76 69 64 65 73 20 61 20 77 61 79 20 74 6f  rovides a way to
90f0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
9100: 74 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 63 6f  t for when.** co
9110: 72 72 75 70 74 69 6f 6e 20 69 73 20 66 69 72 73  rruption is firs
9120: 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
9130: 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
9140: 74 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  t(void){.  retur
9150: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9160: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
9170: 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76  * This is a conv
9180: 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20  enience routine 
9190: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20  that makes sure 
91a0: 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d  that all thread-
91b0: 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61  specific.** data
91c0: 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64   for this thread
91d0: 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f   has been deallo
91e0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  cated..**.** SQL
91f0: 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73  ite no longer us
9200: 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  es thread-specif
9210: 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20  ic data so this 
9220: 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61  routine is now a
9230: 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69  .** no-op.  It i
9240: 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68  s retained for h
9250: 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
9260: 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  ibility..*/.void
9270: 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
9280: 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d  cleanup(void){.}
9290: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
92a0: 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
92b0: 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
92c0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
92d0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
92e0: 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
92f0: 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
9300: 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
9310: 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ls..*/.#ifdef SQ
9320: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9330: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20  MN_METADATA.int 
9340: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
9350: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
9360: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9380: 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
9390: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
93a0: 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
93b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
93c0: 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
93d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
93e0: 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
93f0: 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
9400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
9410: 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
9420: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
9430: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
9440: 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
9450: 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
9460: 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
9470: 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
9480: 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
9490: 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
94a0: 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
94b0: 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
94c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
94d0: 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
94e0: 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
94f0: 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
9500: 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
9510: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
9520: 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
9530: 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
9540: 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
9550: 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
9560: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
9570: 72 75 65 20 69 66 20 63 6f 6c 75 6d 73 20 69 73  rue if colums is
9580: 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
9590: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
95a0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
95b0: 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
95c0: 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
95d0: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
95e0: 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20  t iCol;..  char 
95f0: 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
9600: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
9610: 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
9620: 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
9630: 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
9640: 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
9650: 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20   autoinc = 0;.. 
9660: 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
9670: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
9680: 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
9690: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  /.  if( sqlite3S
96a0: 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b 0a 20  afetyOn(db) ){. 
96b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
96c0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
96d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
96e0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
96f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
9700: 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
9710: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9720: 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
9730: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
9740: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
9750: 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
9760: 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
9770: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
9780: 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
9790: 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
97a0: 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
97b0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
97c0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
97d0: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
97e0: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
97f0: 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
9800: 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
9810: 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  d */.  if( sqlit
9820: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
9830: 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43  nName) ){.    iC
9840: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
9850: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
9860: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  0 ){.      pCol 
9870: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
9880: 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ol];.    }.  }el
9890: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
98a0: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
98b0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
98c0: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
98d0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
98e0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
98f0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
9900: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
9910: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
9920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9930: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
9940: 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
9950: 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
9960: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
9970: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
9980: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
9990: 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
99a0: 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
99b0: 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
99c0: 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
99d0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
99e0: 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
99f0: 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
9a00: 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
9a10: 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
9a20: 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
9a30: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
9a40: 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
9a50: 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
9a60: 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
9a70: 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
9a80: 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
9a90: 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
9aa0: 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
9ab0: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
9ac0: 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
9ad0: 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
9ae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
9af0: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
9b00: 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
9b10: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
9b20: 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
9b30: 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
9b40: 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
9b50: 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
9b60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
9b70: 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
9b80: 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
9b90: 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
9ba0: 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
9bb0: 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
9bc0: 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
9bd0: 3d 20 28 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c  = (pCol->notNull
9be0: 3f 31 3a 30 29 3b 0a 20 20 20 20 70 72 69 6d 61  ?1:0);.    prima
9bf0: 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e  rykey  = (pCol->
9c00: 69 73 50 72 69 6d 4b 65 79 3f 31 3a 30 29 3b 0a  isPrimKey?1:0);.
9c10: 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 28 28      autoinc = ((
9c20: 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
9c30: 6c 20 26 26 20 70 54 61 62 2d 3e 61 75 74 6f 49  l && pTab->autoI
9c40: 6e 63 29 3f 31 3a 30 29 3b 0a 20 20 7d 65 6c 73  nc)?1:0);.  }els
9c50: 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
9c60: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
9c70: 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
9c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
9c90: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
9ca0: 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
9cb0: 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
9cc0: 3a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  :.  if( sqlite3S
9cd0: 61 66 65 74 79 4f 66 66 28 64 62 29 20 29 7b 0a  afetyOff(db) ){.
9ce0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9cf0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f  MISUSE;.  }..  /
9d00: 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75  * Whether the fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63  nction call succ
9d20: 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c  eeded or failed,
9d30: 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
9d40: 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20  parameters.  ** 
9d50: 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69  to whatever thei
9d60: 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70  r local counterp
9d70: 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66  arts contain. If
9d80: 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
9d90: 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68  cur,.  ** this h
9da0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
9db0: 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74   zeroing all out
9dc0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  put parameters..
9dd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74    */.  if( pzDat
9de0: 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54  aType ) *pzDataT
9df0: 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b  ype = zDataType;
9e00: 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71  .  if( pzCollSeq
9e10: 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20   ) *pzCollSeq = 
9e20: 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20  zCollSeq;.  if( 
9e30: 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74  pNotNull ) *pNot
9e40: 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a  Null = notnull;.
9e50: 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65    if( pPrimaryKe
9e60: 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  y ) *pPrimaryKey
9e70: 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20   = primarykey;. 
9e80: 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20   if( pAutoinc ) 
9e90: 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  *pAutoinc = auto
9ea0: 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  inc;..  if( SQLI
9eb0: 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54  TE_OK==rc && !pT
9ec0: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
9ed0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 45 72 72  3SetString(&zErr
9ee0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
9ef0: 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 7a  ble column: ", z
9f00: 54 61 62 6c 65 4e 61 6d 65 2c 20 22 2e 22 2c 20  TableName, ".", 
9f10: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
9f20: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 72 63  Name, 0);.    rc
9f30: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
9f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
9f50: 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
9f60: 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
9f70: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
9f80: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
9f90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
9fa0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
9fb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9fc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9fd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9fe0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
9ff0: 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
a000: 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
a010: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
a020: 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
a030: 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
a040: 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
a050: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
a060: 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
a070: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
a080: 64 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  d(0);..  /* This
a090: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
a0a0: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
a0b0: 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
a0c0: 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
a0d0: 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
a0e0: 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
a0f0: 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
a100: 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
a110: 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
a120: 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
a130: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 6c   sqlite3_vfs_rel
a140: 65 61 73 65 28 70 56 66 73 29 3b 0a 20 20 72 65  ease(pVfs);.  re
a150: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a160: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
a170: 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64  ble the extended
a180: 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a   result codes..*
a190: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  /.int sqlite3_ex
a1a0: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
a1b0: 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  des(sqlite3 *db,
a1c0: 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73   int onoff){.  s
a1d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a1e0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a1f0: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
a200: 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
a210: 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
a220: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a230: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a250: 7d 0a                                            }.